马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 Lispboy 于 2013-7-28 02:29 编辑
 - ;|
- 获得两个嵌套多边形中间的海洋部分(海-》陆地)
- 参数:
- e1---内部多边形
- e2---外部多边形
- 返回值:
- 表(两块陆地)
- |;
- (defun XD::Geom:pathIsLand (e1 e2 / e3 e4 e5 e6 el p1 p2 pts1 pts2 ss ss3 x)
- (xdrx_document_ucson)
- (if (and
- (/= e1 e2)
- (setq pts1 (xdrx_entity_getStretchPoint e1)
- pts2 (xdrx_entity_getStretchPoint e2)
- )
- (>= (length pts1) 3)
- (>= (length pts2) 3)
- (XD::Pnts:IsInPolyWithPnts pts1 pts2)
- )
- (progn
- (setq p1 (car (XD::PNTS:MinX->MinY pts1 1e-5))
- p2 (car (XD::PNTS:MinX->MinY pts2 1e-5))
- pts1 (XD::PntS:UnClockWise pts1 p1 1e-5)
- pts2 (XD::PntS:UnClockWise pts2 p2 1e-5)
- )
- (if (vl-some '(lambda (x)
- (XD::Pnt:IsOn x pts2)
- ) pts1
- )
- (progn
- (setq ss3 (xdrx_curve_subtract e2 e1 0.0))
- (setq el (XD::SS:Ents ss3))
- (if (> (length el) 2)
- (progn
- (entdel (car el))
- (entdel (last el))
- (list (cadr el) (caddr el))
- )
- el
- )
- )
- (progn
- (setq ss (ssadd))
- (ssadd e1 ss)
- (ssadd e2 ss)
- (xdrx_line_make (trans (car pts1) 1 0) (trans (car pts2) 1 0))
- (ssadd (setq e3 (entlast))
- ss
- )
- (xdrx_line_make (trans (caddr pts1) 1 0) (trans (caddr pts2) 1 0))
- (ssadd (setq e4 (entlast))
- ss
- )
- (xdrx_geom_bpoly (xdrx_midp (last pts1) (last pts2)) ss)
- (setq e5 (entlast))
- (xdrx_geom_bpoly (xdrx_midp (cadr pts1) (cadr pts2)) ss)
- (setq e6 (entlast))
- (entdel e3)
- (entdel e4)
- (list e5 e6)
- )
- )
- )
- )
- )
测试代码:
 - (defun c:t5()
- (if (and (setq e1 (car (entsel)))
- (setq e2 (car (entsel)))
- )
- (progn
- (XD::Begin)
- (xdrx_document_setPrec 3.0 1)
- (setq el (XD::Geom:PathIsland e1 e2))
- (setq i 1)
- (foreach n el
- (setq pts (xdrx_entity_getstretchpoint n))
- (apply 'xdrx_grdraw (append (list i 3) pts))
- (setq i (1+ i))
- )
- (XD::End)
- )
- )
- (princ)
- )
|