找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: lijiao

[原创]:高效的合并直线程序,敬请使用。

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-6-1 06:29:43 | 显示全部楼层
1 索引用字符方法不错,用实数时发现 assoc 因为浮点运算不能检索正确结果
2 单独测试 构造表部分,约18000个重复实体耗时1.6s

说到表长,还是建议分区域选择,多消几次的累计时间比一次全选可能还要少。28000个重复实体选择时如果打开了亮显,仅响应就要呆一会儿。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-1 14:56:24 | 显示全部楼层
进行了一些优化,速度快了不少。

  1.   [FONT=courier new]
  2. (defun c:hbzhx (/ jinnd ss ss1 ss2 ss3 ss4 sslay p1 p2 xuhao zongshu ssbak step val biaoji)
  3.   (cond
  4.     ((and
  5.        (setq ss (ssget (list (cons 0 "LINE"))))
  6.        (> (sslength ss) 1)
  7.      )
  8.      (setq zongshu (/ 100.0 (sslength ss)))
  9.      (setq xuhao 0
  10.            step        1
  11.            jingd 0.001
  12.      )
  13.      (acet-ui-progress "已经完成" 100)
  14.      (setq ssbak ss)
  15.      (while (> (sslength ss) 0)
  16.        (setq ss1 (ssname ss 0)
  17.              ss         (ssdel ss1 ss)
  18.        )
  19.        (setq biaoji nil)
  20.        (setq xuhao (+ xuhao zongshu))
  21.        (if (= (fix xuhao) step)
  22.          (progn
  23.            (acet-ui-progress -1)
  24.            (setq step (1+ step))
  25.          )
  26.        )
  27.        (setq p1        (vlax-curve-getstartpoint ss1)
  28.              p2        (vlax-curve-getendpoint ss1)
  29.        )
  30.        (setq sslay (vla-get-layer (vlax-ename->vla-object ss1)))
  31.        (setq ss3 (ssget "c" p1 p1 (list (cons 0 "LINE") (cons 8 sslay))))
  32.        (setq ss4 (ssget "c" p2 p2 (list (cons 0 "LINE") (cons 8 sslay))))
  33.        (setq ss3 (ssdel ss1 ss3))
  34.        (setq ss4 (ssdel ss1 ss4))
  35.        (repeat (sslength ss3)
  36.          (setq ss2 (ssname ss3 0)
  37.                ss3 (ssdel ss2 ss3)
  38.          )
  39.          (if (setq val (hbline p1 p2 ss2 jingd))
  40.            (progn
  41.              (if (ssmemb ss2 ss)
  42.                (setq ss (ssdel ss2 ss))
  43.              )
  44.              (if (ssmemb ss2 ss4)
  45.                (setq ss4 (ssdel ss2 ss4))
  46.              )
  47.              (setq xuhao (+ xuhao zongshu))
  48.              (if (= (fix xuhao) step)
  49.                (progn
  50.                  (acet-ui-progress -1)
  51.                  (setq step (1+ step))
  52.                )
  53.              )
  54.              (entdel ss2)
  55.              (setq p1 (car val)
  56.                    p2 (cadddr val)
  57.                    biaoji t)
  58.            )
  59.          )
  60.        )
  61.        (repeat (sslength ss4)
  62.          (setq ss2 (ssname ss4 0)
  63.                ss4 (ssdel ss2 ss4)
  64.          )
  65.          (if (setq val (hbline p1 p2 ss2 jingd))
  66.            (progn
  67.              (if (ssmemb ss2 ss)
  68.                (setq ss (ssdel ss2 ss))
  69.              )
  70.              (setq xuhao (+ xuhao zongshu))
  71.              (if (= (fix xuhao) step)
  72.                (progn
  73.                  (acet-ui-progress -1)
  74.                  (setq step (1+ step))
  75.                )
  76.              )
  77.              (entdel ss2)
  78.              (setq p1 (car val)
  79.                    p2 (cadddr val)
  80.                    biaoji t)
  81.            )
  82.          )
  83.          )
  84.        (if biaoji
  85.          (progn
  86.            (setq ss1 (entget ss1 (list "*"))
  87.                  ss1 (subst (cons 10 p1) (assoc 10 ss1) ss1)
  88.                  ss1 (subst (cons 11 p2) (assoc 11 ss1) ss1)
  89.                  )
  90.            (entmod ss1)
  91.            )
  92.          )
  93.      )
  94.      (acet-ui-progress)
  95.     )
  96.     (t nil)
  97.   )
  98.   (princ)
  99. )
  100. (defun hbline (p1 p2 ent jingd / p3 p4 dis1 dis2 dis3 dis4 dis)
  101.   (setq        p3   (vlax-curve-getstartpoint ent)
  102.         p4   (vlax-curve-getendpoint ent)
  103.         dis  (distance p1 p2)
  104.         dis1 (distance p1 p3)
  105.         dis2 (distance p2 p3)
  106.         dis3 (distance p1 p4)
  107.         dis4 (distance p2 p4)
  108.   )
  109.   (if (and
  110.         (equal (+ dis dis1 dis2)
  111.                (* 2.0 (max dis dis1 dis2))
  112.                jingd
  113.         )
  114.         (equal (+ dis dis3 dis4)
  115.                (* 2.0 (max dis dis3 dis4))
  116.                jingd
  117.         )
  118.       )
  119.     (setq p4 (vl-sort (list p1 p2 p3 p4)
  120.                       '(lambda (e1 e2)
  121.                          (if (equal (car e1) (car e2) 1e-5)
  122.                            (< (cadr e1) (cadr e2))
  123.                            (< (car e1) (car e2))
  124.                          )
  125.                        )
  126.              )
  127.     )
  128.   )
  129. )
  130.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-6-2 01:02:36 | 显示全部楼层
最初由 eachy 发布
[B]1 索引用字符方法不错,用实数时发现 assoc 因为浮点运算不能检索正确结果
2 单独测试 构造表部分,约18000个重复实体耗时1.6s

说到表长,还是建议分区域选择,多消几次的累计时间比一次全选可能还要少。28000个... [/B]


用assoc时间注定是随实体多少几何级上升
而lijiao的方法是代数级的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-2 07:53:07 | 显示全部楼层
当许多的不平行的直线具有同一个端点时,如直线绕其端点阵列,我的代码会显得很慢,而EACHY版主的代码会很快。
但在实际的使用中,这种情况很少,绝大多数是水平线和垂直线,具有同一端点的就更少。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-6-12 01:22:39 | 显示全部楼层
最初由 lijiao 发布
[B]当许多的不平行的直线具有同一个端点时,如直线绕其端点阵列,我的代码会显得很慢,而EACHY版主的代码会很快。
但在实际的使用中,这种情况很少,绝大多数是水平线和垂直线,具有同一端点的就更少。 [/B]

再次优化,整体性巨大提高。原来要 24s,现在2s
命令: hbln
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8644个

财富等级: 富甲天下

发表于 2004-6-14 10:29:17 | 显示全部楼层
ea兄的东东真是精品,速度确实快,把4000条直线合并为2000条只花了8s。但是以下两种情况是否可以也考虑一下?
1、两直线共线,但没有重合点,或者说一条直线中间断了一段;
2、增加对圆弧的支持。
另:可不可以编译成.fas文件发上来?十分感谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-14 11:43:34 | 显示全部楼层
命令: hbzhx

选择对象: 找到 1 个

选择对象: 找到 1 个,总计 2 个

选择对象:
; 错误: no function definition: ACET-UI-PROGRESS
---------------
各位:我在R2004下怎么出现这种错误啊?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8644个

财富等级: 富甲天下

发表于 2004-6-14 12:04:29 | 显示全部楼层
最初由 lhj743 发布
[B] 错误: no function definition: ACET-UI-PROGRESS
---------------
各位:我在R2004下怎么出现这种错误啊? [/B]


你没安装express for 2004
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-30 20:42:15 | 显示全部楼层
试了lijiao的17贴,在处理重叠圆弧的时候,有丢失的情况?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-7-31 07:50:27 | 显示全部楼层
http://www.p4.xdcad.net/forum/sh ... amp;threadid=220682
中的第11贴已经解决了这些问题,并且更稳定,速度更快。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8644个

财富等级: 富甲天下

发表于 2004-8-2 08:57:14 | 显示全部楼层
可是我在那里写的东西和提的问题就没人理睬吗?:(
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-6-16 13:21:47 | 显示全部楼层
斑竹的程序在直线不是连续重叠时有时会遗漏合并一些直线,下面是我对程序的改进,能将所有重叠的直线都合并!

  1. (defun Sort-List-up (Lst)
  2.     (setq m (length Lst)
  3.           n 0
  4.           Lst1 '())
  5.     (repeat m
  6.         (setq Lst1 (cons (car (nth n Lst)) Lst1)
  7.               n (1+ n)
  8.               )
  9.         );repeat
  10.     (setq Lst1 (reverse Lst1))
  11.     (setq Lst1 (vl-sort-i Lst1 '<))
  12.     (setq Lst2 '()
  13.           n 0)
  14.     (repeat m
  15.         (setq Lst2 (cons (nth (nth n Lst1) Lst) Lst2)
  16.               n (1+ n)
  17.               )
  18.         );repeat
  19.     (setq Lst2 (reverse Lst2))
  20.              
  21.        
  22.     )
  23. (defun I:GetInp
  24. (PromptStr                 ; user prompt string
  25.   InpList                   ; list of allowed input strings
  26.   Default                   ; default option, nil if none
  27.   /
  28.   InitStr                   ; string for initget options
  29.   kWordStr                  ; string for user's input prompt
  30.   Inp                       ; user's input
  31. ) ;_ closes variable declare
  32. (setq
  33.   kWordStr
  34.   (substr
  35.    (apply
  36.     'strcat                 ; make full string
  37.     (mapcar                 ; add preceeding / to each string
  38.      '(lambda (str) (strcat "/" str))

  39.      InpList
  40.     ) ;_ closes mapcar
  41.    ) ;_ closes apply
  42.    2                        ; remove leading /
  43.   ) ;_ closes substr
  44.   InitStr                   ; make string w/spaces, not /
  45. ;;; 以下用于 Visual LISP AutoCAD
  46.   (vl-string-translate "/" " " kWordStr)
  47. ;;; 结束选项


  48. ;;; 以下用于非 Visual LISP AutoCAD
  49. ;;;  (substr
  50. ;;;   (apply
  51. ;;;    'strcat
  52. ;;;    (mapcar
  53. ;;;    '(lambda (str) (strcat " " str))
  54. ;;;     InpList
  55. ;;;    ) ;_ closes mapcar
  56. ;;;   ) ;_ closes apply
  57. ;;;   2
  58. ;;;  ) ;_ closes substr
  59. ;;; 结束选项


  60.   PromptStr
  61.   (strcat
  62.    (if PromptStr
  63.     (strcat PromptStr " [")
  64.     "["
  65.    ) ;_ closes if
  66.    kWordStr
  67.    "]"                      ; start default indication
  68.    (if Default
  69.     (strcat
  70.      " <"
  71.      (car (member Default InpList)) ; display default
  72.      ">: "
  73.     ) ;_ closes strcat
  74.     ": "
  75.    ) ;_ closes if
  76.   ) ;_ closes strcat
  77. ) ;_ closes setq
  78. (initget
  79.   (if Default 0 1)          ; if default allow an
  80.   InitStr
  81. ) ;_ closes initget
  82.                             ; get input, if null, use default
  83. (setq Inp (if (setq Inp (getkword PromptStr))
  84.             Inp
  85.             Default
  86.            ) ;_ closes if
  87. ) ;_ closes setq
  88. )
  89. (defun vl-sort-enList (EnList / enl enl1 p1 p2 x1 x rtnList)
  90.   (foreach enl EnList
  91.     (progn
  92.       (setq ang (car enl)
  93.             enl (cdr enl)
  94.             )
  95.       (setq enl1
  96.              (mapcar '(LAMBDA (x)
  97.                         (setq p1 (vlax-curve-getstartpoint x)
  98.                               p2 (vlax-curve-getendpoint x)
  99.                         )
  100.                         (if (EQUAL ang (/ pi 2) CorJD)
  101.                           (setq x1 (min (cadr p1) (cadr p2)))
  102.                           (setq x1 (min (car p1) (car p2)))
  103.                         )
  104.                         (list x1 x)
  105.                       );LAMBDA
  106.                      enl
  107.              );mapcar
  108.       );setq
  109.       (setq enl1 (SORT-LIST-UP enl1))
  110.       (setq enl1 (mapcar 'cadr enl1)
  111.             enl1 (cons ang enl1))
  112.       (if rtnList
  113.         (setq rtnList (cons enl1 rtnList))
  114.         (setq rtnList (list enl1))
  115.         );if
  116.              
  117.       );progn
  118.     );foreach
  119.   rtnList                       
  120.   );defun
  121. (defun isOn (pt e)
  122.   (equal (vlax-curve-getclosestpointto e pt)
  123.      pt
  124.      CorJD
  125.   )
  126. )
  127. (defun hbline (ln1 ln2 / tf p0 p00 p1 p2 p3 p4)
  128.   (setq    p1   (vlax-curve-getstartpoint ln1)
  129.     p2   (vlax-curve-getendpoint ln1)
  130.     p3   (vlax-curve-getstartpoint ln2)
  131.     p4   (vlax-curve-getendpoint ln2)
  132.     elst (entget ln1)
  133.   )
  134.   (if (or (ison p3 ln1)
  135.       (ison p4 ln1)
  136.       (ison p1 ln2)
  137.       (ison p2 ln2)
  138.       )
  139.     (progn
  140.       (setq pl (vl-sort    (list p1 p2 p3 p4)
  141.             '(lambda (e1 e2)
  142.                (if (equal (car e1) (car e2) CorJD)
  143.                  (< (cadr e1) (cadr e2))
  144.                  (< (car e1) (car e2))
  145.                )
  146.              )
  147.            )
  148.       )
  149.       (setq elst (subst (cons 10 (car pl)) (assoc 10 elst) elst)
  150.         elst (subst (cons 11 (last pl)) (assoc 11 elst) elst)
  151.       )
  152.       (entmod elst)
  153.       (entdel ln2)
  154.       (setq delcount (1+ delcount))
  155.     )
  156.   )
  157.   (princ)
  158. )
  159. (defun hbzhx (/ a ang e e1 el ep oldlst sp ssl delcount)
  160.   (setq delcount 0)
  161.       (command ".undo" "g")
  162.       (setq ssl (sslength ss))
  163.       (while (> ssl 0)
  164.     (setq e      (ssname ss (setq ssl (1- ssl)))
  165.           sp  (vlax-curve-getstartpoint e)
  166.           ep  (vlax-curve-getendpoint e)
  167.           ang (angle sp ep)
  168.           
  169.     )
  170.     (if (>= ang pi)
  171.       (setq ang (read (rtos (- ang pi) 2 AngJD)))
  172.       (setq ang (read (rtos ang 2 AngJD)))
  173.     )
  174.     (if (not el)
  175.       (setq el (list (list ang e)))
  176.       (if (setq oldlst (assoc ang el))
  177.         (setq el (subst (append oldlst (list e))
  178.                 oldlst
  179.                 el
  180.              )
  181.         )
  182.         (setq el (append el (list (list ang e))))
  183.       )
  184.     )
  185.       ) ;while
  186.   (setq el (vl-sort-enList el))
  187.       ;;将直线按角度划分
  188.       (foreach i (mapcar 'cdr el)
  189.     (if (> (length i) 1)
  190.       (progn
  191.         (while i
  192.           (setq e1 (car i))
  193.           (setq i (cdr i))
  194.           (mapcar '(lambda (a)
  195.              ;(if (and (not (vlax-erased-p e1))
  196.                 ;  (not (vlax-erased-p a))
  197.                 ; )
  198.                (hbline e1 a)
  199.             ; )
  200.                )
  201.               i
  202.           )
  203.           (setq i (VL-REMOVE-IF 'vlax-erased-p i))
  204.         )
  205.       )
  206.     )
  207.       )
  208.       (command ".undo" "e")
  209.   delcount
  210. )
  211. ;;;ssel 为选择集,Condition 为过滤条件,返回两个选择集表,'(s1 s2)
  212. ;;;s1 为ssel 去除过滤条件后剩下元素的选择集,s2 按过滤条件选择的结果
  213. (defun filter (ssel Condition / s1 s2 m n en enl)
  214.   (setq n (sslength ssel)
  215.         m 0
  216.         s1 (ssadd)
  217.         s2 (ssadd))
  218.   (while (> (setq m (sslength ssel)) 0)
  219.     (setq en (ssname ssel (1- m))
  220.           enl (entget en))
  221.     (if (VL-POSITION Condition enl)
  222.       (progn
  223.         (ssadd en s2)
  224.         (ssdel en ssel)
  225.         )
  226.       (progn
  227.         (ssadd en s1)
  228.         (ssdel en ssel)
  229.         )
  230.       )
  231.     );while
  232.   (ssunion (list ssel s1))
  233.   (list s1 s2)
  234.   )
  235. (defun c:zxhb (/ ByFloor Sel AngJD CorJD LaList delcount t1 t2 t3 t4 t5 t6 t7 t8)
  236.   (setierr)
  237.   (setq Alldelcount 0)
  238.   (setq ByFloor (I:GetInp "\n按层合并直线Floor或按不层合并直线All"
  239.                          '("Floor" "All") "Floor"))
  240.   (initget "  " 5)
  241.   (setq AngJD (getint "\n直线角度的精度<5>:"))
  242.   ;(princ "\n选择对象:")
  243.   (setq Sel (ssget '((0 . "line"))))
  244.   (if (= AngJD "") (setq AngJD 5))
  245.   (setq t1 (getvar "Cdate"))
  246.   (setq CorJD (expt 10.0  (* -1 AngJD)))
  247.   (setq k (sslength Sel)
  248.         ki 0)
  249.   (repeat k
  250.     (setq en (ssname Sel ki))
  251.     (setq La (vlax-get-property (vlax-ename->vla-object en) 'layer))
  252.     (if (not LaList)
  253.       (setq LaList (list La))
  254.         (if (not (VL-POSITION La LaList))
  255.           (setq LaList (cons La LaList))
  256.           );if
  257.       );if
  258.     (setq ki (1+ ki))
  259.     );repeat k
  260.   (setq k (length LaList)
  261.         ki 0)
  262.   (if (= "Floor" ByFloor)
  263.   (repeat k
  264.     (setq ss (cadr (FILTER sel (cons 8 (nth ki LaList)))))
  265.     (setq Alldelcount (+ Alldelcount (hbzhx)))
  266.     (setq ki (1+ ki))
  267.     )
  268.     (setq ss sel
  269.           Alldelcount (+ Alldelcount (hbzhx)))
  270.     )
  271.   (princ (strcat "\n滤除直线共计" (itoa Alldelcount) "条!"))
  272.       (setq t2 (getvar "Cdate"))
  273.     (setq t3 t1)
  274.     (setq t4 (fix (* 100 t3))
  275.           t5 (- (fix (* 10000 t3)) (* t4 100))
  276.           t6 (-  (* 1000000 t3) (* t5 100) (* t4 10000))
  277.           t7 (+ (* t4 3600) (* t5 60) t6)
  278.           )
  279.      (setq t3 t2)
  280.     (setq t4 (fix (* 100 t3))
  281.           t5 (- (fix (* 10000 t3)) (* t4 100))
  282.           t6 (-  (* 1000000 t3) (* t5 100) (* t4 10000))
  283.           t8 (+ (* t4 3600) (* t5 60) t6)
  284.           )
  285.    
  286.    
  287.     (princ "\n用时")
  288.     (princ (- t8 t7))
  289.     (princ "秒")
  290.   (reerr)

  291.   (princ)
  292.   )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-6-16 17:25:52 | 显示全部楼层
命令:
HBZHX
选择对象: 指定对角点: 找到 2 个

选择对象:

Error: no function definition: ACET-UI-PROGRESS.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-6-17 09:45:47 | 显示全部楼层
看看商业软件《探索者2.7》的处理程序。当然如果没有安装TSSD的话,有许多函数未提供定义,实际上程序不会运行。俺贴出来主要是让大家看看在算法上有什么异同。俺也没进行测试,因为俺不会象lijiao那样遇到很多的重线。速度一般用也没有什么问题。
[php]
(@lsp "myfan")
(defun rduplin (la   prinf     /    mm         mma  mx   2pi        la1  stl  st1
                st2  ss          si   smx  e         n    n1   n2        nr1  a0          a1
                a2   p1          p2   l    l1         ll   ll1  ll2        ll3  lle  len
                len1 nr          tf   rdang         rdline
               )
  (defun rdline        (l2 / e ln1 ll1 ll2 ll3 ll4 lle len len1)
    (setq ll (car l2)
          p1 (car ll)
          p2 (cadr ll)
          a1 (angle p1 p2)
          p3 (polar p1 (+ _pi2 a1) mx)
          nr (+ nr (length l2))
    ) ;_ 结束setq
    (foreach ll        l2
      (setq e        (last ll)
            ll1        (cons (list (&Beg (car ll) p1 p3) e) ll1)
            ll1        (cons (list (&Beg (cadr ll) p1 p3) e) ll1)
            lle        (cons e lle)
      ) ;_ 结束setq
    ) ;_ 结束foreach
    (setq ll1 (@ran3 ll1)
          ln1 (+ mx (caar ll1))
    ) ;_ 结束setq
    (foreach ll        ll1
      (setq ln (car ll)
            e  (cadr ll)
      ) ;_ 结束setq
      (if ll2
        (progn (setq ll3 (member e ll2)
                     ll2 (if ll3
                           (append (cdr ll3) (cdr (member e (reverse ll2))))
                           (cons e ll2)
                         ) ;_ 结束if
               ) ;_ 结束setq
               (if (not ll2)
                 (setq ll4 (cons (cons (polar p1 a1 ln) p2) ll4)
                       ln1 ln
                 ) ;_ 结束setq
               ) ;_ 结束if
        ) ;_ 结束progn
        (progn (if (equal ln1 ln mm)
                 (setq ll4 (cdr ll4))
                 (setq p2 (polar p1 a1 ln))
               ) ;_ 结束if
               (setq ll2 (cdr ll))
        ) ;_ 结束progn
      ) ;_ 结束if
    ) ;_ 结束foreach
    (if        (> (setq len  (length ll4)
                 len1 (length lle)
           ) ;_ 结束setq
           len
        ) ;_ 结束>
      (progn (repeat (- len1 len)
               (setq e         (car lle)
                     lle (cdr lle)
               ) ;_ 结束setq
               (entdel e)
             ) ;_ 结束repeat
             (foreach ll ll4
               (setq e         (car lle)
                     lle (cdr lle)
                     e         (entget e)
                     e         (subst (cons 10 (car ll)) (assoc 10 e) e)
                     e         (subst (cons 11 (cdr ll)) (assoc 11 e) e)
               ) ;_ 结束setq
               (entmod e)
             ) ;_ 结束foreach
      ) ;_ 结束progn
    ) ;_ 结束if
    (setq nr (- nr len))
    (if        (> (- nr n2) 40)
      (progn (setq n2 nr) (prinf (strcat st2 (itoa nr))))
    ) ;_ 结束if
  ) ;_ 结束defun
  (defun rdang (l0 / e1 a1 p1 p2 p3 ln l1 l2 ll ll1)
    (setq ll (car l0)
          p1 (car ll)
          p2 (cadr ll)
          l1 (list (list 0. ll))
    ) ;_ 结束setq
    (foreach ll        (cdr l0)
      (setq ln (&Beg (car ll) p1 p2)
            l2 l1
      ) ;_ 结束setq
      (while (and (setq ll1 (car l2)) (not (equal ln (car ll1) mm)))
        (setq l2 (cdr l2))
      ) ;_ 结束while
      (setq l1 (if ll1
                 (subst (append ll1 (list ll)) ll1 l1)
                 (cons (list ln ll) l1)
               ) ;_ 结束if
      ) ;_ 结束setq
    ) ;_ 结束foreach
    (foreach l2        l1
      (setq l2 (cdr l2))
      (if (cdr l2)
        (rdline l2)
      ) ;_ 结束if
    ) ;_ 结束foreach
  ) ;_ 结束defun
  (setq        mx  1e9
        mm  (* 0.01 (cadr (&Plcen t)))
        mma 1e-4
        2pi (* pi 2)
  ) ;_ 结束setq
  (setq        stl (strcat "'" la "'层")
        la  (cons 8 la)
        ss  (ssget "x" (list '(0 . "line") la))
  ) ;_ 结束setq
  (if ss
    (progn (setq st1 (strcat "\r已搜索到" stl "直线 ")
                 smx (sslength ss)
                 st2 (strcat "\r已消去" stl "直线 ")
                 n   0
                 n1  0
                 n2  0
           ) ;_ 结束setq
           (prinf "\n")
           (while (< n smx)
             (setq e  (ssname ss n)
                   n  (1+ n)
                   p1 (&Gpts e 10)
                   p2 (&Gpts 11)
             ) ;_ 结束setq
             (if (equal p1 p2 mm)
               (progn (entdel e) (setq n1 (1+ n1)))
               (setq ll1 (list (list p1 p2 e))
                     a1         (angle p1 p2)
                     a1         (cond ((or (equal a1 pi mma) (equal a1 2pi mma)) 0)
                               ((< a1 pi) a1)
                               ((- a1 pi))
                         ) ;_ 结束cond
                     a1         (rtos a1 2 4)
                     la1 (list a1
                               (&Gpts 8)
                               (&Gpts 62)
                               (&Gpts 6)
                               (&Gpts 48)
                               (&Gpts 330)
                         ) ;_ 结束list
                     ll         (assoc la1 l1)
                     l1         (if ll
                           (subst (append ll ll1) ll l1)
                           (cons (cons la1 ll1) l1)
                         ) ;_ 结束if
               ) ;_ 结束setq
             ) ;_ 结束if
             (if (= 127 (logand 127 n))
               (prinf (strcat st1 (itoa n)))
             ) ;_ 结束if
           ) ;_ 结束while
           (prinf (strcat st1
                          (itoa n)
                          (if (zerop n1)
                            ""
                            (strcat ".  已消去超短线 " (itoa n1))
                          ) ;_ 结束if
                          "\n"
                  ) ;_ 结束strcat
           ) ;_ 结束prinf
           (setq nr 0)
           (foreach ll l1
             (setq ll (cdr ll))
             (if (cdr ll)
               (rdang ll)
             ) ;_ 结束if
           ) ;_ 结束foreach
           (prinf (strcat st2 (itoa nr) "  还剩 " (itoa (- n n1 nr))))
    ) ;_ 结束progn
  ) ;_ 结束if
  (setq        n   0
        n1  0
        nr  0
        l1  nil
        st1 (strcat "\r已搜索到" stl "圆弧 ")
        st2 (strcat "\r已消去" stl "圆弧 ")
  ) ;_ 结束setq
  (prinf "\n")
  (setq ss (ssget "x" (list '(0 . "circle") la)))
  (if ss
    (progn (setq smx (sslength ss))
           (while (< n smx)
             (setq e  (ssname ss n)
                   n  (1+ n)
                   ll (list (list (&Gpts e 40) (&Gpts 10) (&Gpts 8)))
             ) ;_ 结束setq
             (if (member ll l1)
               (progn (setq nr (1+ nr)) (entdel e))
               (setq l1 (cons ll l1))
             ) ;_ 结束if
           ) ;_ 结束while
    ) ;_ 结束progn
  ) ;_ 结束if
  (setq ss (ssget "x" (list '(0 . "arc") la)))
  (if ss
    (progn
      (setq smx        (sslength ss)
            si        0
      ) ;_ 结束setq
      (while (< si smx)
        (setq e         (ssname ss si)
              si (1+ si)
              n         (1+ n)
              a1 (&Gpts e 50)
              a2 (&Gpts 51)
        ) ;_ 结束setq
        (if (equal a1 a2 mma)
          (progn (entdel e) (setq n1 (1+ n1)))
          (progn
            (setq ll  (list (&Gpts 40)
                            (&Gpts 10)
                            (&Gpts 8)
                            (&Gpts 62)
                            (&Gpts 6)
                            (&Gpts 48)
                            (&Gpts 330)
                      ) ;_ 结束list
                  ll1 (list (list a1 a2 e))
                  n2  0
            ) ;_ 结束setq
            (if        l1
              (while
                (and (setq l (nth n2 l1)) (not (equal ll (car l) mm)))
                 (setq n2 (1+ n2))
              ) ;_ 结束while
              (setq l nil)
            ) ;_ 结束if
            (if        l
              (if (cdr l)
                (setq l1 (subst (append l ll1) l l1))
                (progn (setq nr (1+ nr)) (entdel e))
              ) ;_ 结束if
              (setq l1 (cons (cons ll ll1) l1))
            ) ;_ 结束if
          ) ;_ 结束progn
        ) ;_ 结束if
        (if (= 127 (logand 127 n))
          (prinf (strcat st1 (itoa n)))
        ) ;_ 结束if
      ) ;_ 结束while
      (prinf (strcat st1
                     (itoa n)
                     (if (zerop n1)
                       ""
                       (strcat ".  已消去超短弧 " (itoa n1))
                     ) ;_ 结束if
                     "\n"
             ) ;_ 结束strcat
      ) ;_ 结束prinf
      (setq n2 0)
      (foreach l l1
        (setq p1 (car l)
              l         (cdr l)
        ) ;_ 结束setq
        (if (cdr l)
          (progn (setq ll  nil
                       lle nil
                       nr  (+ nr (length l))
                       tf  nil
                 ) ;_ 结束setq
                 (foreach x l
                   (setq a1  (car x)
                         a2  (cadr x)
                         e   (last x)
                         lle (cons e lle)
                   ) ;_ 结束setq
                   (if (< a2 a1)
                     (setq ll (cons (cons a1 e) (cons (cons 2pi e) ll))
                           a1 0
                           tf T
                     ) ;_ 结束setq
                   ) ;_ 结束if
                   (setq ll (cons (cons a1 e) (cons (cons a2 e) ll)))
                 ) ;_ 结束foreach
                 (setq ll  (@ran3 ll)
                       ll3 nil
                       a1  -1
                 ) ;_ 结束setq
                 (foreach x ll
                   (setq a2 (car x)
                         e  (cdr x)
                   ) ;_ 结束setq
                   (if ll2
                     (progn (setq l   (member e ll2)
                                  ll2 (if l
                                        (append        (cdr l)
                                                (cdr (member e (reverse ll2)))
                                        ) ;_ 结束append
                                        (cons e ll2)
                                      ) ;_ 结束if
                            ) ;_ 结束setq
                            (if        (not ll2)
                              (setq ll3        (cons (cons a0 a2) ll3)
                                    a1        a2
                              ) ;_ 结束setq
                            ) ;_ 结束if
                     ) ;_ 结束progn
                     (progn (if        (equal a1 a2 mma)
                              (setq ll3 (cdr ll3))
                              (setq a0 a2
                                    a1 a2
                              ) ;_ 结束setq
                            ) ;_ 结束if
                            (setq ll2 (list e))
                     ) ;_ 结束progn
                   ) ;_ 结束if
                 ) ;_ 结束foreach
                 (setq len  (length ll3)
                       len1 (length lle)
                 ) ;_ 结束setq
                 (if tf
                   (if (= 1 len)
                     (progn (foreach e lle (entdel e))
                            (entmake (list '(0 . "circle")
                                           (cons 8 (last p1))
                                           (cons 10 (cadr p1))
                                           (cons 40 (car p1))
                                     ) ;_ 结束list
                            ) ;_ 结束entmake
                            (setq len1 len)
                     ) ;_ 结束progn
                     (setq len (1- len)
                           l   (car ll3)
                           ll3 (reverse (cdr ll3))
                           ll3 (cons (cons (car l) (cdar ll3)) (cdr ll3))
                     ) ;_ 结束setq
                   ) ;_ 结束if
                 ) ;_ 结束if
                 (if (> len1 len)
                   (progn (repeat (- len1 len)
                            (setq e   (car lle)
                                  lle (cdr lle)
                            ) ;_ 结束setq
                            (entdel e)
                          ) ;_ 结束repeat
                          (foreach ll ll3
                            (setq e   (car lle)
                                  lle (cdr lle)
                                  e   (entget e)
                                  e   (subst (cons 50 (car ll)) (assoc 50 e) e)
                                  e   (subst (cons 51 (cdr ll)) (assoc 51 e) e)
                            ) ;_ 结束setq
                            (entmod e)
                          ) ;_ 结束foreach
                   ) ;_ 结束progn
                 ) ;_ 结束if
                 (setq nr (- nr len))
                 (if (> (- nr n2) 40)
                   (progn (setq n2 nr) (prinf (strcat st2 (itoa nr))))
                 ) ;_ 结束if
          ) ;_ 结束progn
        ) ;_ 结束if
      ) ;_ 结束foreach
    ) ;_ 结束progn
  ) ;_ 结束if
  (if (> n 0)
    (prinf (strcat st2 (itoa nr) "  还剩 " (itoa (- n nr n1))))
  ) ;_ 结束if
  (redraw)
) ;_ 结束defun
(setfunhelp "c:XCHCHX" "tssd.hlp" "XCHCHX")
(defun c:XCHCHX        (/ e)
  (if (and (>= (&Swap) 0)
           (setq
             e (&Ints "\n选取要进行重线清理图层上的任何一个实体<退出>: ")
           ) ;_ 结束setq
      ) ;_ 结束and
    (rduplin (&Gpts 8) princ)
  ) ;_ 结束if
  (&Gscl)
) ;_ 结束defun
(setfunhelp "c:XCHZHX" "tssd.hlp" "XCHZHX")
(defun c:XCHZHX        ()
  (if (>= (&Swap) 0)
    (rduplin (&End "轴线") princ)
  ) ;_ 结束if
  (&Gscl)
) ;_ 结束defun
(setfunhelp "c:XCHLX" "tssd.hlp" "XCHLX")
(defun c:XCHLX ()
  (if (>= (&Swap) 0)
    (progn (rduplin (&End "主梁") princ)
           (rduplin (&End "次梁") princ)
    ) ;_ 结束progn
  ) ;_ 结束if
  (&Gscl)
) ;_ 结束defun
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-6-17 17:12:21 | 显示全部楼层
最初由 liuyj 发布
[B]

你没安装express for 2004 [/B]

我使用是也出错
express for 2004是什么软件啊
我的是CAD2002
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-28 07:00 , Processed in 0.250977 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表