明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3788|回复: 8

[已解答] 请教各位大神一个问题,SSGET选择集执行顺序的问题!

[复制链接]
发表于 2014-1-2 21:11 | 显示全部楼层 |阅读模式

如上图,用“ssget”框选上图所有的图形,不知道有没有什么办法让程序首先处理最外面红色的多段线,然后在处理里面的多段线啊????

本帖子中包含更多资源

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

x
发表于 2014-1-3 08:06 | 显示全部楼层
ssget没有办法,只有用程序解决。
发表于 2014-1-3 09:00 | 显示全部楼层
找规律用选择集排序,或者选择的时候手动选先后。

本论坛有许多选择集排序的例子。
发表于 2014-1-3 09:54 | 显示全部楼层
本帖最后由 llsheng_73 于 2014-1-3 09:58 编辑

如果只是象上边的图那样可以把选择集按面积从大到小排序后进行处理
也可以根据后边的具体处理办法考虑要不要在第一次SSGET框选时过滤到里边的白线(如果它们的图层或者颜色与红线可以区分的话很容易过滤),这样先过滤了的话就不用排序了,处理每一根红线时再用红线的坐标进行ssget“wp”去选择里边的白线来进行处理
当然究竟怎么弄要根据后续的处理方式来决定
发表于 2014-1-3 10:00 | 显示全部楼层
llsheng_73 发表于 2014-1-3 09:54
如果只是象上边的图那样可以把选择集按面积从大到小排序后进行处理

楼主的意图是计算红色线,再处理红色线内的白色线,完成后继续处理红色线,处理红色线的白色线。。。。所以,简单的面积计算排序不合适,理论上说还得判断多边形位置关系。
发表于 2014-1-3 10:40 | 显示全部楼层
本帖最后由 llsheng_73 于 2014-1-3 10:41 编辑

(defun SstoEs(ss / a en lst)
  (if ss(progn(setq a -1)
         (while(setq en(ssname ss(setq a(1+ a))))
           (setq lst(cons en lst)))))
  lst)
(defun Plinexy(e / p a b n ob q et d d1 en et) ;;多线段节点坐标(滤掉了多余点,未处理假闭合)
   (setq a(entget e)ob(vlax-ename->vla-object e)et(cdr(assoc 0 a))n 0 p nil d nil)
   (cond((="LWPOLYLINE"et)
         (repeat(length a)(setq b (nth n a) n (+ n 1))
           (if (= 10 (car b))(progn
                               (setq q(list (cadr b) (caddr b))d1(vlax-curve-getDistAtPoint ob q))
                               (if p (if (not(member d1 d)) (setq p (append p (list q))d (append d (list d1))))
                                 (setq p (list q))))
             )))
        ((="POLYLINE"et)
         (SETQ EN (ENTGET (SETQ E (ENTNEXT E))))
         (WHILE (/= (CDR (ASSOC 0 EN)) "SEQEND")
           (SETQ q (CDR (ASSOC 10 EN))d1(vlax-curve-getDistAtPoint ob q)q(reverse(cdr(reverse q))))
           (if p(if (not(member d1 d)) (setq p (append p (list q))d (append d (list d1))))
             (setq p (list q)))
           (SETQ EN (ENTGET (SETQ E (ENTNEXT E)))))
         (setq p(reverse p))
         ))
   P)

(setq ss(sstoes(ssget'((0 . "*lyline")(-4 . "<OR")(70 . 1)(70 . 129)(-4 . "OR>"))))m(length ss)n 0;;;其实这里可以加上过滤去掉白线
      ss(vl-sort ss'(lambda(x y)(>(vla-get-area(vlax-ename->vla-object x))(vla-get-area(vlax-ename->vla-object y))))))
(while(< n m)
  (setq e(nth n m)n(1+ n)
        s1(sstoes(ssget"wp"(plinexy e)'((0 . "*lyline")(-4 . "<OR")(70 . 1)(70 . 129)(-4 . "OR>")))))
  ;;添加对红线的处理;;
  (foreach e1 s1
    (setq ss(vl-remove e1 ss)m(1- m))
    ;;添加对白线的处理;;
    )
  )

评分

参与人数 1明经币 +1 收起 理由
edata + 1 很给力!

查看全部评分

发表于 2014-1-3 11:44 | 显示全部楼层
我来个慢的。
  1. ;;;******************************************************************************
  2. ;;; No.51 判断点是否在多边形内(狂刀程序)
  3. ;;;xPt是要判断的点坐标(x y z ), Points是多边形顶点列表((x1 y1 z1) (x2 y2 z2)...)
  4. ;;;******************************************************************************
  5. ;;; 测试 (ISPTINPM '(2 1) '((0 0)(10 0)(10 10)))
  6. (defun ISPTINPM (XPT POINTS)
  7. (equal
  8. pi
  9. (abs
  10. (apply
  11. '+
  12. (mapcar
  13. '(lambda (X Y)
  14. (rem (- (angle XPT X) (angle XPT Y)) pi)
  15. )
  16. (reverse (cdr (reverse (cons (last POINTS) POINTS)))
  17. )
  18. POINTS
  19. )
  20. )
  21. )
  22. 1e-6
  23. ) ;end_equal
  24. )
  25. ;;返回多段线顶点表
  26. (defun vertexs (ename / plist pp n)        
  27.   (setq obj (vlax-ename->vla-object ename))
  28.   (setq plist (vlax-safearray->list
  29.   (vlax-variant-value
  30.     (vla-get-coordinates obj))))
  31.   (setq n 0)
  32.   (repeat (/ (length plist) 2)
  33.     (setq pp (append pp (list (list (nth n plist)(nth (1+ n) plist)))))
  34.     (setq n (+ n 2))
  35.   )
  36.   pp
  37. )
  38. (defun combination (lst m);组合函数
  39.   (cond        ((zerop m) '(()))
  40.         ((null lst) '())
  41.         (T
  42.          (append (mapcar '(lambda (y) (cons (car lst) y))
  43.                          (combination (cdr lst) (- m 1))
  44.                  )
  45.                  (combination (cdr lst) m)
  46.          )
  47.         )
  48.   )
  49. )
  50. ;主程序
  51. (defun c:tt(/ COM_LST EN ENLST1 ENLST2 ENT1 ENT2 EN_LST SS SS_LST
  52.             CENPTS CENT1 CENT2 NEW_LST OVERLST SK_NUM1 SS2
  53.             EN2 SS_NEW S_LST2 X
  54.             )
  55.   (vl-load-com)
  56.   (if (setq ss(ssget'((0 . "lwpolyline"))))
  57.     (progn
  58.       (setq ss_lst '());转选择集为表
  59.       (while (setq en(ssname ss 0))
  60.         (setq ss_lst(cons en ss_lst))
  61.         (setq ss(ssdel en ss))
  62.         )
  63.       (setq ss_lst(reverse ss_lst))
  64.       (if(> (length ss_lst) 1)
  65.         (setq com_lst(combination ss_lst 2)));组合表
  66.       (if com_lst
  67.         (progn
  68.           (setq new_lst '());判断外框
  69.           (while(setq en_lst(car com_lst))
  70.           (setq ent1(car en_lst)
  71.                 ent2(cadr en_lst)
  72.                 )
  73.           (setq enlst1(vertexs ent1)
  74.                 enlst2(vertexs ent2)
  75.                 )
  76.           (cond
  77.             ((ISPTINPM (car enlst1) enlst2);只取一点判断
  78.              ;(princ "\nA")
  79.              ;(vla-put-color (vlax-ename->vla-object ent2) 6)
  80.              (setq new_lst(cons ent2 new_lst))
  81.              )
  82.             ((ISPTINPM (car enlst2) enlst1)
  83.              ;(princ "\nB")
  84.              ;(vla-put-color(vlax-ename->vla-object ent1) 6)
  85.              (setq new_lst(cons ent1 new_lst))
  86.              )
  87.             ;(T (princ"\nC"))
  88.             )
  89.             (setq com_lst(cdr com_lst))
  90.             )
  91.           )
  92.         )      
  93.       (if (and new_lst (> (length new_lst) 0 ))
  94.         (progn
  95.           (setq ss_new(ssadd))
  96.           (mapcar'(lambda (x) (setq ss_new(ssadd x ss_new))) new_lst)
  97.           (setq s_lst2 '());转选择集为表
  98.       (while (setq en2(ssname ss_new 0))
  99.         (setq s_lst2(cons en2 s_lst2))
  100.         (setq ss_new(ssdel en2 ss_new))
  101.         )
  102.           (setq new_lst (reverse s_lst2))
  103.           (setq sk_num1 1 overlst '());处理外框并选择内部图元
  104.           (while (setq cent1(car new_lst))
  105.             (setq overlst(cons (list  sk_num1 (setq cenpts(vertexs cent1))) overlst))
  106.             (vl-cmdf "_.zoom" "o" cent1 "");缩放视口 &&有的版本可能不行
  107.             (if (setq ss2(ssget "_wp" cenpts '((0 . "lwpolyline"))))
  108.               (progn
  109.                 (while (setq cent2(ssname ss2 0))
  110.                   (setq overlst(cons (list  sk_num1 (vertexs cent2)) overlst))
  111.                   (setq ss2 (ssdel cent2 ss2))
  112.                   )
  113.                 )
  114.               )
  115.             (vl-cmdf "_.zoom" "p");恢复视口
  116.             (setq new_lst(cdr new_lst)
  117.                   sk_num1 (1+ sk_num1))
  118.             )
  119.           (setq overlst(reverse overlst))
  120.           )
  121.         )
  122.       (princ overlst)
  123.       ;(princ new_lst)
  124.       )
  125.     )
  126.   (princ)
  127.   )
  128. ;;;(defun c:tt() ;狂刀的点在多边形内判断测试 对有弧线的pl线无效 点在线上可能不准确
  129. ;;;  (setq p1(getpoint))
  130. ;;;  (setq en(car(entsel)))
  131. ;;;  (setq lst (vertexs en))
  132. ;;;  (ISPTINPM p1 lst)
  133. ;;;  )

  134. ;;;
  135. ;;;((1 ((920.438 421.839) (1029.87 421.839) (1070.91 371.163) (1070.91 296.573)
  136. ;;;(1014.48 296.573) (985.415 346.679) (935.257 373.441) (911.888 402.48))) (1
  137. ;;;((1042.22 365.269) (1050.64 359.104) (1054.29 316.506) (1040.82 309.22)
  138. ;;;(1029.04 317.347) (1029.04 349.015))) (1 ((955.18 402.184) (981.172 386.605)
  139. ;;;(1010.76 362.637) (1027.16 385.806) (1010.36 409.774) (1002.77 409.774)
  140. ;;;(979.972 409.774))) (2 ((1114.27 534.255) (1223.7 534.255) (1264.74 483.579)
  141. ;;;(1264.74 408.989) (1208.31 408.989) (1179.25 459.095) (1129.09 485.857)
  142. ;;;(1105.72 514.896))) (2 ((1236.06 477.685) (1244.47 471.52) (1248.12 428.923)
  143. ;;;(1234.65 421.636) (1222.87 429.763) (1222.87 461.431))) (2 ((1149.01 514.6)
  144. ;;;(1175.0 499.021) (1204.59 475.053) (1220.99 498.222) (1204.19 522.19) (1196.6
  145. ;;;522.19) (1173.8 522.19))))
 楼主| 发表于 2014-1-3 18:57 | 显示全部楼层
llsheng_73 发表于 2014-1-3 10:40
(defun SstoEs(ss / a en lst)
  (if ss(progn(setq a -1)
         (while(setq en(ssname ss(setq a(1+ ...

谢谢大大解答!受益匪浅!
 楼主| 发表于 2014-1-3 18:58 | 显示全部楼层
edata 发表于 2014-1-3 11:44
我来个慢的。

谢谢大神解答,谢谢了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-20 01:13 , Processed in 0.222348 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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