多个截面独立求差集
本帖最后由 gaics 于 2014-6-15 21:55 编辑这个标题不知道有没有歧义就是将如下图中的几个多段线构成的截面生成面域,并分别求差集。
实在找不到现成的程序就自己写了一个,请大家指正。看见Gu_xl版说用面域求并集来判断两个面域的关系,道理明白但是不知后面该怎么处理,所以就用最小包围框来判断了。
现在有个问题,如果选择的目标对象包括“圆、椭圆、多段线、面域”,但是圆和椭圆的组码不包含(70 . 1),如何排除不闭合的多段线?
(defun c:tt()
(command "undo" "be")
(setq ss(ssget'((0 . "LWPOLYLINE,REGION")(70 . 1))))
(makereg ss)
(command "undo" "e")
(princ)
)
(defun makereg(ss / i sslst ent minpt maxpt ii a b subss ssb)
(setq i 0)
(setq sslst'())
(repeat(sslength ss)
(setq ent(ssname ss i))
(if (/= (mydxf ent 0) "REGION")
(progn
(command "region" ent "")
(setq ent(entlast))
)
)
(setq obj(vlax-ename->vla-object ent))
(vla-getboundingbox obj 'minpt 'maxpt)
(setq minpt (vlax-safearray->list minpt)
maxpt (vlax-safearray->list maxpt))
(setq sslst(cons (list (list(car minpt) (cadr minpt))
(list(car maxpt) (cadr maxpt))
ent)
sslst))
(setq i(+ i 1))
)
(setq i 0)
(setq subss(ssadd))
(repeat(length sslst)
(setq a(nth i sslst))
(setq ii 0)
(setq ssb(ssadd))
(while(and(< ii (length sslst))(entget(caddr a)))
(setq b(nth ii sslst))
(if(and(entget(caddr b))
(< (car(car a)) (car(car b)))
(< (cadr(car a)) (cadr(car b)))
(> (car(cadr a)) (car(cadr b)))
(> (cadr(cadr a)) (cadr(cadr b))))
(setq ssb (ssadd(caddr b)ssb))
)
(setq ii(+ ii 1))
)
(if(and(/= ssb nil)(entget(caddr a)))
(progn(command "subtract" (caddr a) "" ssb "")
(setq subss(ssadd(caddr a)subss))
)
(if(entget(caddr a))(setq subss(ssadd(caddr a)subss)))
)
(setq i(+ i 1))
)
subss
)
(defun mydxf (ent i)
(if (= (type ent) 'ename)
(setq ent (entget ent))
)
(cdr (assoc i ent))
)
没人帮俺看看吗?这个程序好像有问题 (setq ss(ssget '((-4 . "<or") (-4 . "<AND") (0 . "LWPOLYLINE,REGION") (70 . 1) (-4 . "AND>") (0 . "CIRCLE,ELLIPSE") (-4 . "or>")))) reyun 发表于 2014-7-10 12:14 static/image/common/back.gif
(setq ss(ssget '((-4 . ""))))
非常感谢!!
页:
[1]