tooo 发表于 2019-1-25 09:03:44

本帖最后由 tooo 于 2019-1-25 09:04 编辑

e2002 发表于 2019-1-24 19:34
关键是 排序规则和排序算法。因为最近刚写了BatchLayouts程序,就这个问题和 qf 讨论过。
按左右,上下 ...
感谢版主回复。
找了一下秋版源码,图框排序应该是这一段:

;;对图框排序
(defun OrderFrames (bdlist / vscoor)
    (defun vscoor (n)      ; 屏幕视觉坐标,允许误差啦~大致相同就相同了。
      (fix (/ n (/ (getvar "viewsize") 100.0)))
    )
    ;; main orderframes
    (if(= (getvalue 'PlotOrder) "LeftToRightRadio")
      (setq bdlist (vl-sort bdlist
          '(lambda (f1 f2 / rt x1 y1 x2 y2 vs)
          ; x1, y1对应于第一组的图框中心点的坐标
             (setq y1 (vscoor (cadar f1)))
             (setq y2 (vscoor (cadar f2)))
             (setq x1 (vscoor (caar f1)))
             (setq x2 (vscoor (caar f2)))
             (setq rt (> y1 y2))
          ;优先Y坐标比较,大的话在前
             (if (and (null rt) (= y1 y2))
          ;Y坐标相同时,比较X坐标,小的话在前
         (setq rt (< x1 x2))
             )
             rt
         )
       )
      )
    )
    (if(= (getvalue 'PlotOrder) "TopToBottomRadio")
      (setq bdlist (vl-sort bdlist
          '(lambda (f1 f2 / rt)
             (setq y1 (vscoor (cadar f1)))
             (setq y2 (vscoor (cadar f2)))
             (setq x1 (vscoor (caar f1)))
             (setq x2 (vscoor (caar f2)))
             (setq rt (< x1 x2))
          ;优先X坐标比较,小的话在前
             (if (and (null rt) (= x1 x2))
          ;当X坐标相同时,比较Y坐标,大的话在前
         (setq rt (> y1 y2))
             )
             rt
         )
       )
      )
    )
    (if(= (getvalue 'ReverseOrder) "1")
      (setq bdlist (reverse bdlist))
    )
    bdlist
)

如何对bdlist执行两次vl-sort呢?是在前两个 if 语句后完整重复同样代码一次,还是在各个 if 语句后各自重复,又或是其它,求指教。

右手边 发表于 2019-1-26 14:13:44

佩服,终于等到更新,很实用,非常感谢

hanyun917 发表于 2019-1-26 15:13:47

能自动对应纸张大小就完美了!

e2002 发表于 2019-1-26 19:31:21

本帖最后由 e2002 于 2019-1-26 19:33 编辑

tooo 发表于 2019-1-25 09:03
感谢版主回复。
找了一下秋版源码,图框排序应该是这一段:






;; 边界列表的2次排序函数
(defun _lkpt_Layout_CreateByTitleBlocks_Sort ( / i1 sym1 i2 sym2 l_sort u v lReturn)
    (cond
      ( (= sSort "1") (setq i1 1 sym1 '> i2 0 sym2 '<) );;左到右,上到下
      ( (= sSort "2") (setq i1 1 sym1 '< i2 0 sym2 '<) );;左到右,下到上
      ( (= sSort "3") (setq i1 1 sym1 '> i2 0 sym2 '>) );;右到左,上到下
      ( (= sSort "4") (setq i1 1 sym1 '< i2 0 sym2 '>) );;右到左,下到上
      ( (= sSort "5") (setq i1 0 sym1 '< i2 1 sym2 '>) );;上到下,左到右
      ( (= sSort "6") (setq i1 0 sym1 '> i2 1 sym2 '>) );;上到下,右到左
      ( (= sSort "7") (setq i1 0 sym1 '< i2 1 sym2 '<) );;下到上,左到右
      ( (= sSort "8") (setq i1 0 sym1 '> i2 1 sym2 '<) );;下到上,右到左
    )
;; 第一次排序
    (setq l_sort (vl-sort lBoundarys '(lambda (u v) ((vl-symbol-value sym1) (nth i1 (car u)) (nth i1 (car v))))))
;; 第二次排序,考虑 rFuzzy
    (setq l_sort (vl-sort l_sort '(lambda (u v) (if (< (abs (- (nth i1 (car u)) (nth i1 (car v)))) rFuzzy)
                                                ((vl-symbol-value sym2) (nth i2 (car u)) (nth i2 (car v)))
                                                nil
                                                )
                                  )
               )
    )
    (setq lReturn l_sort)
);end defun _lkpt_Layout_CreateByTitleBlocks_Sort



zh0n9wen 发表于 2019-1-27 13:58:44

下载最新版(修改日期2019.01.27),图块自匹配勾选后,无法预览,也无法打印,是什么原因呐?

右手边 发表于 2019-1-27 14:28:33

大神 一直在使用您的程序 收益良多    非常感谢又更新了    这次更新的图块自匹配功能碰到一个问题,图块设置好后,无法打出PDF,点击确定了就直接退出了,CAD平面显示第一张图满布状态。

右手边 发表于 2019-1-27 14:31:32

zh0n9wen 发表于 2019-1-27 13:58
下载最新版(修改日期2019.01.27),图块自匹配勾选后,无法预览,也无法打印,是什么原因呐?

遇到相同问题了

gududefan 发表于 2019-1-28 08:59:17

右手边 发表于 2019-1-27 14:28
大神 一直在使用您的程序 收益良多    非常感谢又更新了      这次更新的图块自匹配功能碰到一个问题 ...

跟我情况一样,静待楼主解决问题

fs7jpw 发表于 2019-1-28 10:58:30

楼主,麻烦看一下,一开始设置的时候是好的额,不知道怎么回事,用了两次后就出现这个对话框了。

右手边 发表于 2019-1-28 17:18:43

fs7jpw 发表于 2019-1-28 10:58
楼主,麻烦看一下,一开始设置的时候是好的额,不知道怎么回事,用了两次后就出现这个对话框了。

估计是你预设的种类太多了对话框放不下了你减少种类试试
页: 45 46 47 48 49 50 51 52 53 54 [55] 56 57 58 59 60 61 62 63 64
查看完整版本: 在秋枫发布的源码基础上修改的批量打印程序v3.6.1(2025-03-23更新)