312735894 发表于 2014-1-2 21:11:32

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


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

自贡黄明儒 发表于 2014-1-3 08:06:29

ssget没有办法,只有用程序解决。

fl202 发表于 2014-1-3 09:00:39

找规律用选择集排序,或者选择的时候手动选先后。

本论坛有许多选择集排序的例子。

llsheng_73 发表于 2014-1-3 09:54:23

本帖最后由 llsheng_73 于 2014-1-3 09:58 编辑

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

edata 发表于 2014-1-3 10:00:22

llsheng_73 发表于 2014-1-3 09:54 static/image/common/back.gif
如果只是象上边的图那样可以把选择集按面积从大到小排序后进行处理

楼主的意图是计算红色线,再处理红色线内的白色线,完成后继续处理红色线,处理红色线的白色线。。。。所以,简单的面积计算排序不合适,理论上说还得判断多边形位置关系。

llsheng_73 发表于 2014-1-3 10:40:00

本帖最后由 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))
    ;;添加对白线的处理;;
    )
)

edata 发表于 2014-1-3 11:44:31

我来个慢的。;;;******************************************************************************
;;; No.51 判断点是否在多边形内(狂刀程序)
;;;xPt是要判断的点坐标(x y z ), Points是多边形顶点列表((x1 y1 z1) (x2 y2 z2)...)
;;;******************************************************************************
;;; 测试 (ISPTINPM '(2 1) '((0 0)(10 0)(10 10)))
(defun ISPTINPM (XPT POINTS)
(equal
pi
(abs
(apply
'+
(mapcar
'(lambda (X Y)
(rem (- (angle XPT X) (angle XPT Y)) pi)
)
(reverse (cdr (reverse (cons (last POINTS) POINTS)))
)
POINTS
)
)
)
1e-6
) ;end_equal
)
;;返回多段线顶点表
(defun vertexs (ename / plist pp n)      
(setq obj (vlax-ename->vla-object ename))
(setq plist (vlax-safearray->list
(vlax-variant-value
    (vla-get-coordinates obj))))
(setq n 0)
(repeat (/ (length plist) 2)
    (setq pp (append pp (list (list (nth n plist)(nth (1+ n) plist)))))
    (setq n (+ n 2))
)
pp
)
(defun combination (lst m);组合函数
(cond      ((zerop m) '(()))
      ((null lst) '())
      (T
         (append (mapcar '(lambda (y) (cons (car lst) y))
                         (combination (cdr lst) (- m 1))
               )
               (combination (cdr lst) m)
         )
      )
)
)
;主程序
(defun c:tt(/ COM_LST EN ENLST1 ENLST2 ENT1 ENT2 EN_LST SS SS_LST
          CENPTS CENT1 CENT2 NEW_LST OVERLST SK_NUM1 SS2
          EN2 SS_NEW S_LST2 X
          )
(vl-load-com)
(if (setq ss(ssget'((0 . "lwpolyline"))))
    (progn
      (setq ss_lst '());转选择集为表
      (while (setq en(ssname ss 0))
        (setq ss_lst(cons en ss_lst))
        (setq ss(ssdel en ss))
        )
      (setq ss_lst(reverse ss_lst))
      (if(> (length ss_lst) 1)
        (setq com_lst(combination ss_lst 2)));组合表
      (if com_lst
        (progn
          (setq new_lst '());判断外框
          (while(setq en_lst(car com_lst))
          (setq ent1(car en_lst)
                ent2(cadr en_lst)
                )
          (setq enlst1(vertexs ent1)
                enlst2(vertexs ent2)
                )
          (cond
          ((ISPTINPM (car enlst1) enlst2);只取一点判断
             ;(princ "\nA")
             ;(vla-put-color (vlax-ename->vla-object ent2) 6)
             (setq new_lst(cons ent2 new_lst))
             )
          ((ISPTINPM (car enlst2) enlst1)
             ;(princ "\nB")
             ;(vla-put-color(vlax-ename->vla-object ent1) 6)
             (setq new_lst(cons ent1 new_lst))
             )
          ;(T (princ"\nC"))
          )
          (setq com_lst(cdr com_lst))
          )
          )
        )      
      (if (and new_lst (> (length new_lst) 0 ))
        (progn
          (setq ss_new(ssadd))
          (mapcar'(lambda (x) (setq ss_new(ssadd x ss_new))) new_lst)
          (setq s_lst2 '());转选择集为表
      (while (setq en2(ssname ss_new 0))
        (setq s_lst2(cons en2 s_lst2))
        (setq ss_new(ssdel en2 ss_new))
        )
          (setq new_lst (reverse s_lst2))
          (setq sk_num1 1 overlst '());处理外框并选择内部图元
          (while (setq cent1(car new_lst))
          (setq overlst(cons (listsk_num1 (setq cenpts(vertexs cent1))) overlst))
          (vl-cmdf "_.zoom" "o" cent1 "");缩放视口 &&有的版本可能不行
          (if (setq ss2(ssget "_wp" cenpts '((0 . "lwpolyline"))))
              (progn
                (while (setq cent2(ssname ss2 0))
                  (setq overlst(cons (listsk_num1 (vertexs cent2)) overlst))
                  (setq ss2 (ssdel cent2 ss2))
                  )
                )
              )
          (vl-cmdf "_.zoom" "p");恢复视口
          (setq new_lst(cdr new_lst)
                  sk_num1 (1+ sk_num1))
          )
          (setq overlst(reverse overlst))
          )
        )
      (princ overlst)
      ;(princ new_lst)
      )
    )
(princ)
)
;;;(defun c:tt() ;狂刀的点在多边形内判断测试 对有弧线的pl线无效 点在线上可能不准确
;;;(setq p1(getpoint))
;;;(setq en(car(entsel)))
;;;(setq lst (vertexs en))
;;;(ISPTINPM p1 lst)
;;;)

;;;
;;;((1 ((920.438 421.839) (1029.87 421.839) (1070.91 371.163) (1070.91 296.573)
;;;(1014.48 296.573) (985.415 346.679) (935.257 373.441) (911.888 402.48))) (1
;;;((1042.22 365.269) (1050.64 359.104) (1054.29 316.506) (1040.82 309.22)
;;;(1029.04 317.347) (1029.04 349.015))) (1 ((955.18 402.184) (981.172 386.605)
;;;(1010.76 362.637) (1027.16 385.806) (1010.36 409.774) (1002.77 409.774)
;;;(979.972 409.774))) (2 ((1114.27 534.255) (1223.7 534.255) (1264.74 483.579)
;;;(1264.74 408.989) (1208.31 408.989) (1179.25 459.095) (1129.09 485.857)
;;;(1105.72 514.896))) (2 ((1236.06 477.685) (1244.47 471.52) (1248.12 428.923)
;;;(1234.65 421.636) (1222.87 429.763) (1222.87 461.431))) (2 ((1149.01 514.6)
;;;(1175.0 499.021) (1204.59 475.053) (1220.99 498.222) (1204.19 522.19) (1196.6
;;;522.19) (1173.8 522.19))))

312735894 发表于 2014-1-3 18:57:48

llsheng_73 发表于 2014-1-3 10:40 static/image/common/back.gif
(defun SstoEs(ss / a en lst)
(if ss(progn(setq a -1)
         (while(setq en(ssname ss(setq a(1+ ...

谢谢大大解答!受益匪浅!

312735894 发表于 2014-1-3 18:58:28

edata 发表于 2014-1-3 11:44 static/image/common/back.gif
我来个慢的。

谢谢大神解答,谢谢了!
页: [1]
查看完整版本: 请教各位大神一个问题,SSGET选择集执行顺序的问题!