找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4047|回复: 28

[求助] [求助]:打断选择范围内的直线函数有BUGS请高手看!

[复制链接]
发表于 2005-12-15 18:03:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
这是我一个小型程序一个命令,但是有点问题。
主要是brLineIntersection函数效率底,并且ssget选取模式有问题,
正常情况下应该返回2,因为我画图中很少有三线共点。
这个问题郁闷死我 ,我都搞了三天。
清高手解决!!!


  1. ;这个函数主要为了打断所有直线的交点
  2. ;问题主要表现在交点打断命令非常没有效率。


  3.    (VL-LOAD-COM)

  4.    (setq AcadObject(vlax-get-acad-object))      
  5.    (setq AcadDocument(vla-get-ActiveDocument Acadobject))
  6.    (setq mSpace(vla-get-ModelSpace Acaddocument))        ;获得模型空间指针


  7. ( defun c:Ol( / lineObjNames )  ;主函数

  8.     (setq lineObjNames (ssget  '((0 . "LINE"))))        ;获取模型空间所有的直线
  9.     (brLineIntersection(FindIntersections lineObjNames))
  10.    
  11. )


  12. ;找出所有的交点

  13. (defun FindIntersections( lineObjNames /  vlaCol tmp i n point pointCol)

  14.     (setq s (getvar "DATE"))             ;分析消耗时间
  15.     (setq seconds1 (* 86400.0 (- s (fix s))))
  16.    
  17.     (setq n (sslength lineObjNames ))                       
  18.     (setq i -1)
  19.         
  20.     (setq pointCol (list ))                           ;定义点集
  21.     (setq vlaCol (list ))                             ;定义对象集
  22.    
  23.     ( repeat n

  24.         (setq tmp (ssname lineObjNames (setq i (1+ i))))       ;把ENAME批量转换成VLA对象
  25.         (setq tmp (vlax-ename->vla-object tmp))
  26.         (setq vlaCol ( cons tmp vlaCol))
  27.     )

  28.     (setq this (nth 0 vlaCol ))
  29.      
  30.     ( while (/= nil this )  ;找出所有得点
  31.        
  32.         (setq i 1)

  33.         ( repeat (- (vl-list-length vlaCol) 1)               
  34.        
  35.                 (setq next (nth i vlaCol))
  36.                                         
  37.                 (setq point(vla-IntersectWith this next acExtendNone))
  38.                              
  39.                 (setq tmp (vl-catch-all-apply                    ;捕捉activX返回的错误。
  40.                                 'vlax-safearray->list
  41.                                 (list (vlax-variant-value point))
  42.                              )
  43.                       )

  44.                 (if (= nil (vl-catch-all-error-p tmp))           ;正确的点存入点集
  45.                                                            
  46.                             (setq pointCol (cons point pointCol))
  47.        
  48.                   )

  49.                 (setq i (1+ i))
  50.            )
  51.       
  52.          (setq vlaCol (vl-catch-all-apply                    ;捕捉activX返回的错误。
  53.                                 'vl-remove
  54.                                 (list this vlaCol)
  55.                              )
  56.                       )
  57.       
  58.       (if (= vlaCol nil)
  59.           (setq this nil)      
  60.           (setq this (nth 0 vlaCol )))                  

  61.    )

  62.    (setq s (getvar "DATE"))             ;分析消耗时间
  63.    (setq seconds2 (* 86400.0 (- s (fix s))))
  64.    (princ (- seconds2 seconds1))
  65.    (princ "\n")
  66.    (princ (length  pointCol))             ;返回交点的个数。
  67.    pointCol
  68.   
  69. )

  70.    

  71. ;打断所有交点
  72. ( defun brLineIntersection(pointCol / i j point x y cornerUpLeft cornerDownRight
  73.                                    intersectionCol LineObj tmp)

  74.     (setq s (getvar "DATE"))             ;分析消耗时间
  75.     (setq seconds1 (* 86400.0 (- s (fix s))))


  76.   (setq i 0)

  77.     (repeat (vl-list-length pointCol)

  78.             (setq point ( nth i pointCol))

  79.         (setq x (car point))
  80.         (setq y (cadr point))

  81.         (setq cornerUpLeft   (list (- x 0.01) (+ y 0.01)))       ;计算范围
  82.         (setq cornerDownRight(list (+ x 0.01) (- y 0.01)))

  83.         (setq intersectionCol (ssget "C" cornerUpLeft cornerDownRight))    ;关键在这里,问题是如果对象在屏幕过密
  84.                                                                            ;intersectionCol返回数量特大,我不知道为什么
  85.                                                                            ;但是对象间距还是超过范围很多倍!
  86.                                                                            ;还有很多类似的问题,明明一样,就他妈不行!!
  87.         (setq j 0)
  88.                                                                           
  89.         (repeat (sslength intersectionCol)       ;打断所有直线
  90.             
  91.             (setq LineObj (ssname intersectionCol j))                  
  92.                 (BrLine LineObj point)                  ;断点
  93.             (setq j (1+ j))
  94.          )

  95.         (setq i (1+ i))

  96.      )

  97.    (setq s (getvar "DATE"))
  98.    (setq seconds2 (* 86400.0 (- s (fix s))))
  99.    (princ "\n")
  100.    (princ (- seconds2 seconds1))
  101.   
  102. )





  103. ;增强型直线打断函数。

  104. (defun BrLine(LineObj point / a StartPoint EndPoint)

  105.     (setq LineObj (vlax-ename->vla-object LineObj))

  106.     (setq StartPoint (vla-get-StartPoint LineObj))
  107.     (setq EndPoint   (vla-get-EndPoint   LineObj))
  108.     (vla-delete LineObj)
  109.       
  110.     (setq point (vlax-3d-point point))
  111.     (setq a(vla-addLine mSpace StartPoint point))
  112.     (vla-update a)
  113.     (setq a(vla-addLine mSpace EndPoint   point))
  114.     (vla-update a)
  115.   )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 8157个

财富等级: 富甲天下

发表于 2005-12-15 22:06:33 | 显示全部楼层
(setq lineObjNames (ssget '((0 . "LINE")))) ;获取模型空间所有的直线

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

使用道具 举报

 楼主| 发表于 2005-12-16 17:25:14 | 显示全部楼层
我这个程序是手动选择 ,不是全部选择,再说问题不是在那里呀!!
主要是打断后,图元名变了,得在交点附近选取,图元。
还有就是精度问题。
请高手解释
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-12-17 00:03:54 | 显示全部楼层
打断实体后会新生成实体:
-------直线起点的是老实体.

为了不必要的麻烦应该把 每一线和所有线的交点 都求出来 ,在分别打断.
打断时,从后面起(交点要排序)
如果从前面起,就要对新实体打断了,排序是不可避免的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-17 10:25:08 | 显示全部楼层
我在FindIntersections函数中已经求出全部的交点了,并且我自信没有问题。
问题确实是在打断时会生成新的图元,关键是我利用交点附近来选取图元,因为图元变了,所以每个交点都要选择图元。
并且我自信 算法应该不是问题,问题是选取时SSGET函数好像不听使唤。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8157个

财富等级: 富甲天下

发表于 2005-12-17 11:56:11 | 显示全部楼层
每一直线打断后
连同新产生的新图元
拨入冻结的临时图层
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-12-17 12:22:39 | 显示全部楼层
既然用了 ssget "C" 当然要先关闭捕捉
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-17 12:56:51 | 显示全部楼层
算法有问题,换换脑子。
1,建议换一种打断直线的算法
2,“(setq intersectionCol (ssget "C" cornerUpLeft cornerDownRight)) ;关键在这里,问题是如果对象在屏幕过密”
用这种方法找图元,吃力不讨好。(“ssget触角”是lisp编程的好技巧,但面临的风险,就是你现在遇到的问题,我也遇到过,我一直怀疑是acad分辨率的问题影响ssget的选择集合,能解决的就是绕到走)

解决 思路:第一步,所有线的交点集(p1 p2 p3..pn)(已经有了)
           第二步,i ) 判断一条直线上有几个交点p1,p2..pn.
                                    ( 子程序 一点是否在一直线上)
                   ii) 并且把有交点的直线做成集合 A
             (                     ( line-1_name p1 p2..)
                                      ( line-2_name p2 p4 ....)
                                      (...)
                                     (line-n_name p1 p4 ..pn)          )
     
                         第三步,做个子程序B,对一条直线上有p1 p2 ..pn个点,保留这条直线的特征,
                复制重画连接n点--> (n + 1)  段 (这样就避开了找新图元的麻烦)
             最后一步 ,把子程序B 循环作用于 集合 A中的每一条直线
这样“断点”成功!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-18 16:11:21 | 显示全部楼层
楼上的你是这里回答最好的,真正高手!!!,我一般给人解决问题,终于有人给我解决问题了!!!感谢!!!
看来只要我把FindIntersections函数稍微改动一下就可以了,
首先 ,求出this直线的起点和末点。建立一个list,把起点先存进,然后我的把这this和
其他直线交点也存进去,最后把末点存进去。

然后编写 ,函数对这个list排序,因为this和其他直线交点不许按顺序来,如果不排序新直线会重叠的。(这也会牺牲很多的效率的!!)

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-12-18 18:11:44 | 显示全部楼层
最初由 gewanjia 发布
[B]楼上的你是这里回答最好的,真正高手!!!,我一般给人解决问题,终于有人给我解决问题了!!!感谢!!!
看来只要我把FindIntersections函数稍微改动一下就可以了,
首先 ,求出this直线的起点和末点。建立一个... [/B]

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

使用道具 举报

发表于 2005-12-18 21:26:45 | 显示全部楼层
取得曲线与曲线选集的交点集后别忘了排序
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-12-19 05:16:31 | 显示全部楼层
Line 的交点就没必要用“牛刀”-Intersectwith 了,用 vlax-curve-xxx  和 inters 就可以,可以参考函数库的直线交点函数。

增强断开用 entmake 效率是非常高的,Vla 函数是不错,但要根据程序的需要来确定,既要程序的简洁,最重要的是程序的效率。除在非Vla函数不能解决问题,或者用Lisp要很罗嗦时才建议使用 vla ,Lisp 能搞定时还是 纯 Autolisp 。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-19 11:19:06 | 显示全部楼层
不过,我觉得如果这个程序能够把*line 和曲线断点也考虑进去就更完美了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-19 12:30:58 | 显示全部楼层
如果纯粹是line或arc,circle,就可以用数学方法+entmake做(直线可以用inters),如果要适应各种曲线,那就用intersectwith+break。效率相差多少,没有比较过,望有人能搞一下
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-19 14:11:07 | 显示全部楼层
看了前面几位大虾的言论,使小弟受益非浅。
我始终觉得 activeX方法执行速度比纯AUTOLISP要快,所以我才在找交点函数,几乎用ACTIVEX
方法,但是斑竹说了 ;我还是愿意尝试一下的:
下面是改过的函数速度有点慢!!我一向是效率狂人的!!
打断20000交点用158s,我的机器配置为:Ce850 内存128  winXP  AutoCAD2006.
;
;
;在函数中有计算消耗时间的代码::
;如果大家需要把ARC加入 我也可以尝试,但小弟学习AUTOLISP才1.5个月。

  1. ( defun c:OL( / lineObjNames AcadObject AcadDocument)   ;主函数
  2.   
  3.    (VL-LOAD-COM)

  4.    (setq AcadObject(vlax-get-acad-object))      
  5.    (setq AcadDocument(vla-get-ActiveDocument Acadobject))
  6.    (setq mSpace(vla-get-ModelSpace Acaddocument))        ;获得模型空间指针


  7.    (setq lineObjNames (ssget  '((0 . "LINE"))))        ;获取模型空间所有的直线  
  8.    (LinePointOrder(FindIntersections lineObjNames))
  9.    (princ)
  10. )


  11. ;找出所有直线上的交点

  12. (defun FindIntersections( lineObjNames /  vlaCol lineCol linePointCol tmp i j n point
  13.                                           this next StartPoint EndPoint)

  14.    (setq s (getvar "DATE"))
  15.    (setq seconds1 (* 86400.0 (- s (fix s))))
  16.                              
  17.    (setq i -1)
  18.         
  19.    (setq lineCol (list ))                            ;定义直线集
  20.    (setq vlaCol (list ))                             ;定义直线对象集
  21.    (setq n (sslength lineObjNames ))  
  22.       
  23.    ( repeat n

  24.         (setq tmp (ssname lineObjNames (setq i (1+ i))))       ;把ENAME批量转换成VLA对象
  25.         (setq tmp (vlax-ename->vla-object tmp))
  26.         (setq vlaCol ( cons tmp vlaCol))
  27.    )

  28.    (setq j 0)
  29.   
  30.    ( repeat n    ;找出直线上所有的交点,但不包括开始点和结束点
  31.        

  32.         (setq this (nth j vlaCol ))
  33.      
  34.         (setq linePointCol(list))                  ;定义在直线上的点集

  35.            (setq StartPoint  (vla-get-StartPoint this))           ;开始点
  36.            (setq EndPoint    (vla-get-EndPoint   this))           ;结束点
  37.      
  38.         (setq linePointCol(cons EndPoint linePointCol))      ;加入结束点

  39.         (setq i 0)   
  40.         ( repeat (- n 1)               
  41.        
  42.                 (if (= i j) (setq i (1+ i)))               ;如果是本身跳过
  43.                 (setq next (nth i vlaCol))
  44.                                         
  45.                 (setq point(vla-IntersectWith this next acExtendNone))
  46.                              
  47.                 (setq tmp (vl-catch-all-apply               ;捕捉activX返回的错误。
  48.                                 'vlax-safearray->list
  49.                                 (list (vlax-variant-value point))
  50.                              )
  51.                       )

  52.                 (if (= nil (vl-catch-all-error-p tmp))      ;正确的点存入点集
  53.                                                            
  54.                         (if (JudgeAnastomosis this point)               
  55.                                   (setq linePointCol (cons point linePointCol))                                            
  56.                           )       
  57.                   )

  58.                 (setq i (1+ i))
  59.            )
  60.    
  61.       (setq linePointCol(cons StartPoint linePointCol))     ;加入开始点              
  62.       (setq lineCol (cons linePointCol lineCol))
  63.       (setq j (1+ j))               
  64.       (setq this (nth j vlaCol ))                   ;提取下一个点  

  65.    )

  66.    ( setq i 0)
  67.    (repeat n                           ;删原有直线。
  68.      (setq tmp (nth i vlaCol ))
  69.      (vla-delete tmp)
  70.      (setq i (1+ i))
  71.    )

  72.    lineCol
  73.   
  74. )
  75.    


  76. ;这个函数主要处理首尾相接的那种直线,因为vla-IntersectWith认为那种形式也算相交。
  77. ;在大多数情况,不需要那种类型的。

  78. (defun JudgeAnastomosis(LineObj point / StartPoint EndPoint result)

  79.    (setq StartPoint (vla-get-StartPoint LineObj))
  80.    (setq EndPoint   (vla-get-EndPoint   LineObj))
  81.   
  82.    (setq point     (vlax-safearray->list(vlax-variant-value point     )))  
  83.    (setq StartPoint(vlax-safearray->list(vlax-variant-value StartPoint)))
  84.    (setq EndPoint  (vlax-safearray->list(vlax-variant-value EndPoint  )))
  85.         
  86.    ( if (or (equal StartPoint point 0.01 )
  87.             (equal EndPoint   point 0.01))
  88.           
  89.       (setq result nil)
  90.       (setq result T)
  91.      )

  92.   result
  93. )

  94. ;给直线上交点排序,要不会重叠的,效率太底,希望高手有好方法。
  95. ;说明我的算法,1、判断直线是否垂直,如果垂直由Y来排序;如果不垂直用X来排序。
  96. ;              2、确定StartPoint中X或Y值是否为最大值,来确定排序是选取最大还是最小。
  97. ;              3、选出一个生成一个直线。
  98. ;
  99. ;真是狂晕,真是太慢了

  100. ( defun LinePointOrder( lineCol / num line n i j tmp tmpLine StartPoint EndPoint
  101.                                    on this L)

  102.   (setq num 0)

  103.   (repeat (vl-list-length lineCol)            ;根据直线多少来确定次数
  104.   
  105.     (setq line (nth num lineCol ))                   ;应该递增
  106.    
  107.     (setq tmpLine (list))
  108.     (setq j 1)
  109.     (setq n (vl-list-length line))             ;根据直线上的点确定次数
  110.    
  111.     (repeat n

  112.       (setq tmp (nth (- n j) line))
  113.       (setq tmp(vlax-safearray->list(vlax-variant-value tmp)))
  114.       (setq tmpLine (cons tmp tmpLine))
  115.       (setq j (1+ j))
  116.     )
  117.     (setq line tmpLine)
  118.               
  119.     (setq  StartPoint(nth  0     line))
  120.     (setq  EndPoint  (nth (1- n) line))
  121.     (setq  ls  (vlax-3d-point StartPoint))          ;保存直线最开始点

  122.     (if (equal (car StartPoint) (car EndPoint) 0.0005)   ;判断直线是否为90度

  123.        (progn
  124.                                                         ;利用Y值来确定,线段交点顺序。          
  125.           (setq tmp(nth 1 line))
  126.          
  127.           (setq on(> (cadr StartPoint) (cadr tmp)))    ;判断StartPoint是否为最大值
  128.                              
  129.           (repeat  (1- n)            
  130.                              
  131.             (setq this (nth 1 line))
  132.             (setq tmp this)         
  133.             (setq j 1)                       ;总是取第2个元素开始比较            
  134.                
  135.             (while tmp                       ;求出下一个线段结束点。               
  136.                  
  137.               (if on
  138.                 (progn                                                         
  139.                    (if (< (cadr this) (cadr tmp))                  ;求大的
  140.                      (setq this tmp)
  141.                    )
  142.                  )
  143.                 (progn                                                         
  144.                   (if (> (cadr this) (cadr tmp))                  ;求小的
  145.                     (setq this tmp)
  146.                     )
  147.                   )
  148.                 )
  149.               (setq j (1+ j))
  150.               (setq tmp (nth j line))
  151.             )
  152.                 (setq line (vl-remove this line))           
  153.                 (setq this(vlax-3d-point this))             ;转化为变体。
  154.                 (setq L(vla-addLine mSpace ls this))        ;把破碎的直线重新连接起来               
  155.                 (setq ls this)                       ;将下一个线段的开始点保存起来。
  156.                 
  157.           )
  158.         )
  159.       

  160.         (progn
  161.                                                         ;利用X值来确定,线段交点顺序。          
  162.           (setq tmp(nth 1 line))
  163.          
  164.           (setq on(> (car StartPoint) (car tmp)))    ;判断StartPoint是否为最大值
  165.                              
  166.           (repeat  (1- n)           
  167.                              
  168.             (setq this (nth 1 line))
  169.             (setq tmp this)         
  170.             (setq j 1)                       ;总是取第2个元素开始比较            
  171.                
  172.             (while tmp                       ;求出下一个线段结束点。               
  173.                  
  174.               (if on
  175.                 (progn                                                         
  176.                    (if (< (car this) (car tmp))                  ;求大的
  177.                      (setq this tmp)
  178.                    )
  179.                  )
  180.                 (progn                                                         
  181.                   (if (> (car this) (car tmp))                  ;求小的
  182.                     (setq this tmp)
  183.                     )
  184.                   )
  185.                 )
  186.               (setq j (1+ j))
  187.               (setq tmp (nth j line))
  188.             )
  189.                 (setq line (vl-remove this line))           
  190.                 (setq this(vlax-3d-point this))             ;转化为变体。
  191.                 (setq L(vla-addLine mSpace ls this))        ;把破碎的直线重新连接起来               
  192.                 (setq ls this)                       ;将下一个线段的开始点保存起来。
  193.                 
  194.           )
  195.         )
  196.       )
  197.    
  198.     (setq num (1+ num))

  199.   )
  200.                       
  201.    (setq s (getvar "DATE"))
  202.    (setq seconds2 (* 86400.0 (- s (fix s))))         ;计算消耗时间
  203.    (princ "\n打断消耗时间:")(princ (- seconds2 seconds1))(princ "秒")
  204. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-29 01:10 , Processed in 0.307975 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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