本帖最后由 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))
- )
|