带孤岛判断的批量偏移
本帖最后由 q3_2006 于 2013-10-28 14:56 编辑孤岛部分整体外偏。。
请用我的DWG图测试,谢谢!
T的个数即为图元所在层数
这个什么意思?
另外,你上图的红线是偏移后的? 怎么有的红线外偏,有的白色线又在外面? newer 发表于 2013-10-28 13:05
这个什么意思?
另外,你上图的红线是偏移后的? 怎么有的红线外偏,有的白色线又在外面?
就是要这样呀。。带孤岛判断 。。。 本帖最后由 q3_2006 于 2013-10-28 13:23 编辑
孤岛判断是难点。。。看填充的图好理解,也就是所有孤岛的位置同时向岛外偏移X。。。。我的理解:如果最外层为第一层,凡是奇数层就外偏,偶数层就内偏。。。 下面代码模拟了你的要求,距离没判断合法,不要超过里面的多段线不能接受的范围。
**** Hidden Message *****
上面的程序,填充没有边界也行。
newer 发表于 2013-10-28 13:43
下面代码模拟了你的要求,距离没判断合法,不要超过里面的多段线不能接受的范围。
猪脑子 。。。刚被水哥点通。。{:soso_e110:} newer 发表于 2013-10-28 13:47
上面的程序,填充没有边界也行。
(defun c:tt (/ OffsetCurve curveInCurve GroupToOne d ss el lst)
(defun OffsetCurve (e d / lastent)
(setq lastent (entlast))
(vl-catch-all-apply
'(lambda () (vla-offset (vlax-ename->vla-object e) d))
) ;_防止间隙过小
(if(not (equal (entlast) lastent))
(xdrx_setpropertyvalue (entlast) "Color" 4)
)
)
;;(< Area1 Area2)
(defun CurveInCurve (e1 e2 / lst)
(and (setq lst (xdrx_curve_intersect e2 e1))
(= (length (car lst)) (length lst) 1)
(equal(abs (apply 'xdrx_points_area (caar lst)))
(apply 'xdrx_points_area (xdrx_getsamplept e1))
1.
)
)
)
;;批量处理时分组
(defun GroupToOne (lst / ll tf)
(while lst
(if ll
(if (not (car (vl-remove 't
(mapcar '(lambda (a)
(vl-position (car lst) a)
)
ll
)
)
)
)
(progn
(mapcar '(lambda (x)
(if (curveincurve (car lst) (last x))
(setq ll (subst (cons (car lst) x) x ll)
tf t
)
)
)
ll
)
(if(not tf)
(setq ll (cons (list (car lst)) ll))
)
)
(setq ll (cons (list (car lst)) ll))
)
(setq ll (list (list (car lst))))
)
(setq lst(cdr lst)
tfnil
)
)
ll
)
(if (and (or (setq
d (getdist (strcat "\nSpace dist<"
(rtos (getvar "offsetdist") 2 3)
">: "
)
)
)
(and (or (null d) (minusp (getvar "offsetdist")))
(setq d 1.5)
)
(setq d (getvar "offsetdist"))
)
(setvar "offsetdist" d)
(setq ss (ssget '((-4 . "<or")
(0 . "circle")
(0 . "*polyline")
(-4 . "&=")
(70 . 1)
(-4 . "or>")
)
)
)
)
(progn
(XD::Begin)
(xdrx_document_ucsoff)
;;(xdrx_curve_removedup ss) ;_消重
(setq el (xdrx_pickset->ents ss))
(mapcar '(lambda (e)
(if (= (xdrx_getpropertyvalue e "IsA") "AcDbPolyline")
(progn
(xdrx_polyline_compress e) ;_消除重点
(and (minusp (apply 'xdrx_points_area
(xdrx_entity_getstretchpoint e)
)
)
(xdrx_curve_reverse e) ;_统一逆时针
)
)
)
)
el
)
(setq el(vl-sort el
'(lambda (e1 e2)
(> (car (xdrx_getarea e1))
(car (xdrx_getarea e2))
)
)
) ;_按面积大小排序
lst(GroupToOne el)
)
;;(xdrx_undostart)
(mapcar
'(lambda (x / b c tf l ll)
(cond
((= (length x) 1)
(OffsetCurve (car x) d)
)
((= (length x) 2)
(OffsetCurve (car x) (- d))
(OffsetCurve (cadr x) d)
)
(t
(OffsetCurve (last x) d)
(while x
(setq c(car x)
b(cdr x)
)
(while b
(if (curveincurve c (car b))
(setq l (cons c l))
)
(setq b (cdr b))
)
(setq x (cdr x)
ll (cons l ll)
l nil
)
) ;_组内是面积由小到大
(mapcar '(lambda (a)
(if (zerop (rem (1- (length a)) 2))
(OffsetCurve (last a) (- d))
(OffsetCurve (last a) d)
)
)
(vl-remove nil ll)
)
) ;_ t分组后由内向外
) ;_end cond
) ;_ end lambda
lst
) ;_mapcar
;;(xdrx_undoend)
(xdrx_document_ucson)
(XD::End)
)
)
(princ)
)这是E大的。。处理得很好。。。 newer 发表于 2013-10-28 13:43
下面代码模拟了你的要求,距离没判断合法,不要超过里面的多段线不能接受的范围。
处理好几层的孤岛,还是要分组的。。。 要考虑多层嵌套情况,仅一层很简单的
还有可能里面有circle q3_2006 发表于 2013-10-28 16:31
这是E大的。。处理得很好。。。
是不是还可以优化? st788796 发表于 2013-10-28 17:20
是不是还可以优化?
是还可以优化。。
st788796 发表于 2013-10-28 17:20
是不是还可以优化?
多层嵌套。。。好晕呀。。一层填充轻松搞定! 本帖最后由 st788796 于 2013-10-28 17:55 编辑
q3_2006 发表于 2013-10-28 17:45
多层嵌套。。。好晕呀。。一层填充轻松搞定!
一层的就不用写那么复杂了
分好组,组内最大外偏,里面都是内偏
要少N多判断,效率高很多了
感觉E大的在分组时还可以优化