;;[功能] 判断多段线自交
;;[功能] 判断多段线自交;;自贡黄明儒 2014.11.24(HH_LWPOLYLINEInters (car(entsel)))
(defun HH_LWPOLYLINEInters (e / E0 I P PTS)
(setq pts (Entity:Box e))
(setq p (mapcar '- (car pts) '(2 2)))
(setq pts (list p (cadr pts)))
(setq p (mapcar '+ (car pts) '(1 1)))
(setvar "nomutt" 1)
(setq e0 (entlast))
(APPLY 'Make-Rectange pts)
(APPLY 'command (list "BOUNDARY" p))
(while (not (equal (getvar "cmdnames") "")) (apply 'command (list "")))
(setvar "nomutt" 0)
(cond ((entnext e0)
(setq i 0)
(while (setq e (entnext e0)) (setq i (1+ i)) (entdel e))
(> i 1)
)
)
)
;;[功能] 实体包围盒2角点
(defun Entity:Box (obj / bp up)
(cond ((equal (type obj) 'ENAME) (setq obj (vlax-ename->vla-object obj))))
(vla-getboundingbox obj 'bp 'up)
(list (safearray-value bp) (safearray-value up))
)
;;164.30 [功能] 构造矩形 by highflybird
(defun Make-Rectange (pt1 pt2)
(entmake
(list
'(0 . "LWPOLYLINE") ;轻多段线
'(100 . "AcDbEntity")
'(100 . "AcDbPolyline")
'(90 . 4) ;四个顶点
'(70 . 1) ;闭合
;;(cons 38 (caddr pt1)) ;高程
(cons 10 (list (car pt1) (cadr pt1))) ;左下角
(cons 10 (list (car pt2) (cadr pt1))) ;右下角
(cons 10 (list (car pt2) (cadr pt2))) ;右上角
(cons 10 (list (car pt1) (cadr pt2))) ;左上角
(cons 210 '(0 0 1)) ;法线方向
)
)
)
这个理论应用得也很独特 shafa/~~~~~~~~~~~~~~~~~ 黄工高产啊,收藏了 提供一种方法:
将多段线offset一个很小的数值d,然后再将偏移后的多段线偏移 -d,偏移回去后的多段线的长度若和原多段线长度一致,则多段线是非自交的,否则为自交多段线! g板的方法要测试才清楚。
自相交以为着有封闭区域,偏移时会自动分为几块偏移。
因此只要偏移回来的长度不一致,则可肯定自相交。
一致则很大几率不相交。 这个偏移有点高深
页:
[1]