找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1863|回复: 2

[研讨] 【炫翔】交点打断后,封闭区域转多段线图元表

[复制链接]

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2013-11-7 10:12:54 | 显示全部楼层 |阅读模式

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

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

×
交点打断后,封闭区域转多段线图元表
随手练习源码,写的较啰嗦目前只限于直线,纯VLISP LISP版本,
欢迎大家各抒己见



  1. (defun C:XX( / a b en lst ss ss1 sss xx-ms)
  2. (setq ss (ssget '((0 . "line"))))
  3. (xx-co ss)
  4. (setq sss (ssget "p"))
  5. (setq ss1 (xx-l-break-ss ss));打断后的选择集
  6. (setq en (entlast))
  7. (setq xx-ms(vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))));模型空间集合
  8. (xx-addregion xx-ms(xx-ss-EnLst ss1)t);转为面域
  9. (setq lst (xx-lst-EnLastLst en));面域的图元表
  10. ;面积从大到小排序
  11. (setq lst (vl-sort lst '(lambda (a b)
  12.         (> (Vla-get-area(vlax-ename->vla-object a)) (Vla-get-area(vlax-ename->vla-object b)))
  13.                          ))
  14. )                                      
  15. (entdel (car lst)) ; 删除最外围的面域
  16. (setq lst (cdr lst)); 将面域转成多段线
  17.   (setq en (entlast))
  18.   (foreach a lst(xx-region2PL a))
  19.   (setq lst (xx-lst-EnLastLst en));多段线的图元表
  20. )




  21. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

  22. (defun xx-region2PL(s1 / en ss)
  23.   (setq en (entlast))
  24.   (vl-cmdf "_.EXPLODE" (list s1 (getvar "viewctr")))
  25.   (setq ss (ssadd))
  26.   (while (setq en (entnext en))
  27.     (ssadd  en ss)
  28.     )
  29.   (vl-cmdf "_.Pedit" "_m" ss "" "_j" "" "")
  30. )



  31. (defun xx-lst-EnLastLst (s1 / lst)
  32.    (while (setq s1 (entnext s1));获取图形中的下一个对象(图元)名
  33.     (if (not (member (cdr(assoc 0 (entget s1))) '("attrib" "vertex" "seqend")))
  34.         (setq lst (cons s1 lst))
  35.      )
  36.    )
  37.    (reverse lst)   
  38. )

  39. (defun xx-ss-EnLst(ss /  i el)
  40.   (setq i (sslength ss))
  41.   (while (setq e (ssname ss (setq i (1- i))))
  42.     (setq el (cons e el))
  43.   )
  44.   el
  45. )


  46. (defun xx-addregion (space el tf / regions)
  47.   (if (not
  48.         (vl-catch-all-error-p
  49.           (setq regions (vl-catch-all-apply
  50.                           'vla-addregion
  51.                           (list space
  52.                                 (vlax-make-variant
  53.                                   (vlax-safearray-fill
  54.                                     (vlax-make-safearray
  55.                                       vlax-vbobject
  56.                                       (cons 0 (1- (length el)))
  57.                                     )
  58.                                     (mapcar 'vlax-ename->vla-object el)
  59.                                   )
  60.                                 )
  61.                           )
  62.                         )
  63.           )
  64.         )
  65.       )
  66.     (progn
  67.       (safearray-value (variant-value regions))
  68.       (if tf
  69.         (mapcar 'entdel el)
  70.       )
  71.     )
  72.   )
  73. )

  74. (defun xx-l-break-ss (ss / elist en obj objlst objname ss ssinter intersort)
  75.   ;求交点集函数-nth
  76. (defun ssinter (el / outlst i n obj1 list1 el1 j obj2 ipts pts)
  77.   (setq outlst(mapcar 'list el)
  78.         i -1
  79.         n 0
  80.   )
  81.   (while el
  82.     (setq obj1 (car el)
  83.           list1 (nth (setq i (1+ i))outlst)
  84.           el (cdr el)
  85.           el1 el
  86.           j i
  87.     )
  88.     (while el1
  89.       (setq obj2 (car el1)
  90.             el1 (cdr el1)
  91.             j (1+ j)
  92.       )
  93.       (if (and
  94.             (setq ipts (vla-intersectwith obj1 obj2 0))
  95.             (setq ipts (vlax-variant-value ipts))
  96.             (> (vlax-safearray-get-u-bound ipts 1) 0)
  97.           )
  98.         (progn
  99.           (setq ipts (vlax-safearray->list ipts)
  100.                 pts '()
  101.           )
  102.           (while (> (length ipts) 0)
  103.             (setq pts (cons (list (car ipts) (cadr ipts) (caddr ipts)) pts)
  104.                   ipts (cdddr ipts)
  105.             )
  106.           )
  107.           (setq list1 (append list1 pts)
  108.                 n (+ n (length pts))
  109.           )
  110.           (setq outlst(subst(append(nth j outlst)pts)(nth j outlst)outlst))
  111.         )
  112.       )
  113.     )
  114.     (if (and(cdr list1)(not (vlax-curve-isClosed obj1)))
  115.       (setq list1(append list1(list(vlax-curve-getEndPoint obj1))(list(vlax-curve-getStartPoint obj1))))
  116.     )
  117.     (setq outlst (subst list1(nth i outlst)outlst))
  118.   )
  119.   outlst
  120. )


  121. ;点集排序及删除重复点函数
  122. (defun intersort (el / outlst obj1 pts plst)
  123.   (setq outlst '())
  124.   (foreach item el
  125.     (setq obj1 (car item)
  126.           pts (cdr item)
  127.           plst '()
  128.     )
  129.     (if pts
  130.       (progn
  131.         (setq pts(vl-sort pts(function(lambda (p1 p2)
  132.                    (<(vlax-curve-getParamAtPoint obj1 p1)(vlax-curve-getParamAtPoint obj1 p2))))
  133.                   )
  134.         )
  135.         (foreach p pts
  136.           (if plst
  137.             (if (not (equal p (car plst) 0.00001))
  138.               (setq plst (cons p plst))
  139.             )
  140.             (setq plst (cons p plst))
  141.           )
  142.         )
  143.         (if (vlax-curve-isClosed obj1)
  144.           (setq plst (cons (last plst) plst))
  145.         )
  146.         (setq plst (cons (vlax-vla-object->ename obj1) plst)
  147.               outlst (cons plst outlst)
  148.         )

  149.       )
  150.     )
  151.   )
  152.   outlst
  153. )

  154. (vl-load-com)
  155. (setq en (entlast))
  156. (if ss
  157.      (vlax-for obj (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))
  158.       (setq elist (cons obj elist))
  159.     )
  160. )
  161. (foreach e (intersort (ssinter elist))
  162.     (setq obj (car e)
  163.           objlst (entget obj)
  164.           objlst (vl-remove (assoc -1 objlst) objlst)
  165.           objlst (vl-remove (assoc 330 objlst) objlst)
  166.           objlst (vl-remove (assoc 5 objlst) objlst)
  167.           objname (cdr (assoc 0 objlst))
  168.     )
  169.     (repeat (- (length e) 2)
  170.       (setq e (cdr e))
  171.       (setq objlst (subst(cons 10 (car e))(assoc 10 objlst) objlst))
  172.       (setq objlst (subst(cons 11 (cadr e))(assoc 11 objlst) objlst ))
  173.       (entmakex objlst)
  174.     )
  175.     (entdel obj)
  176.   )
  177.   (xx-ss-enlastss en)
  178. )

  179. (defun xx-ss-EnLastSs (s1 / ss)
  180.   (if (not s1)
  181.     (progn
  182.       (setq s1 (entnext))
  183.       (if s1
  184.         (setq ss (ssadd s1));将s1添加到ss选择集
  185.         (setq ss (ssadd));添加到ss选择集
  186.        )
  187.     )
  188.      (setq ss (ssadd));添加到ss选择集
  189.    )
  190.     (while (setq s1 (entnext s1));获取图形中的下一个对象(图元)名
  191.      (if (not (member (cdr(assoc 0 (entget s1))) '("attrib" "vertex" "seqend")))
  192.       (ssadd s1 ss);将s1加入选择集
  193.      )
  194.     )
  195.   (if (= 0 (sslength ss)) nil ss)  
  196. )





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

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-11-7 10:24:35 | 显示全部楼层
有点啰嗦了
  1. (defun Region->Curve (ss tf / i el s)
  2.   (setq i (sslength ss) s (ssadd))
  3.   (if tf
  4.     (vl-cmdf ".copy" ss "" '(0. 0. 0.) "@")
  5.   )
  6.   (while (setq e (ssname ss (setq i (1- i))))
  7.     (setq el (cons e el))
  8.   )
  9.   (foreach x el
  10.     (vl-cmdf ".explode" (list x (getvar "viewctr")) "")
  11.     (vl-cmdf ".pedit" "m" "P" "" "y" "j" 0.0001 "")
  12.     (ssadd (entlast) s)
  13.   )
  14.   s
  15. )

评分

参与人数 1D豆 +5 收起 理由
炫翔 + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 8个

财富等级: 恭喜发财

发表于 2016-8-9 23:46:35 | 显示全部楼层

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 03:20 , Processed in 0.270209 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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