- 积分
- 66466
- 明经币
- 个
- 注册时间
- 2010-5-9
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 自贡黄明儒 于 2012-1-12 16:13 编辑
;;;作局部放大或者裁剪,都需要判断对象是否在封闭曲线内,今天正儿八经看了vla-intersectwith
;;;下的用法,发现两任何对象都可求交点,见笑了.
;;;判断一个对象是否在封闭曲线内(在曲线内返回T)
(defun C:In-or-out (/ OBJ1 OBJ2 P1 P2 UTIL)
(vl-load-com)
;;1 以下对象是指除Pviewport和PolygonMesh外的任何对象
;;对象交点列表 or nil
(defun All-intersectwith (obj1 obj2 / INT IPLIST)
(setq int (vla-IntersectWith obj1 obj2 acExtendNoNe))
(setq iplist (vl-catch-all-apply 'vlax-safearray->list (list (vlax-variant-value int))))
(if (vl-catch-all-error-p iplist)
nil
(list->3pair iplist)
)
) ;defun
;;2 点在曲线内外,caoyin
;; T------->在曲线内
(defun LT:PT-INCURVE (PT CURVE / GetInters OBJ MINPT MAXPT E PS LST X Y)
(defun GetInters (OBJ1 OBJ2 / PS LST)
(setq PS (vla-intersectwith OBJ1 OBJ2 0)
PS (vl-catch-all-apply 'vlax-safearray->list (list (vlax-variant-value PS)))
)
(if (and PS (not (vl-catch-all-error-p PS)))
(while (setq LST (cons (list (car PS) (cadr PS)) LST)
PS (cdddr PS)
)
)
)
LST
)
(if (equal (vlax-curve-getClosestPointTo CURVE PT) PT 1E-6)
0
(progn (setq OBJ (vlax-ename->vla-object CURVE))
(vla-getboundingbox OBJ 'MINPT 'MAXPT)
(mapcar '(lambda (X) (set X (vlax-safearray->list (eval X)))) '(MINPT MAXPT))
(entmake
(list '(0 . "LINE") (list 10 (car MINPT) (cadr PT)) (list 11 (car MAXPT) (cadr PT)) '(60 . 1))
)
(setq E (entlast)
LST1 (GetInters OBJ (vlax-ename->vla-object E))
)
(entdel E)
(if LST1
(setq LST1 (vl-remove-if '(lambda (X / PP A)
(setq PP (vlax-curve-getParamAtPoint CURVE X)
A (angle '(0 0) (vlax-curve-getFirstDeriv CURVE PP))
)
(or (equal A 0 1E-6) (equal A PI 1E-6) (equal A (* PI 2) 1E-6) (equal (fix PP) PP 1E-6))
)
LST1
)
)
)
(entmake
(list '(0 . "LINE") (list 10 (car PT) (cadr MAXPT)) (list 11 (car PT) (cadr MINPT)) '(60 . 0))
)
(setq E (entlast)
LST2 (GetInters OBJ (vlax-ename->vla-object E))
)
(entdel E)
(if LST2
(setq LST2 (vl-remove-if '(lambda (X / PP A)
(setq X (vlax-curve-getClosestPointTo CURVE X)
PP (vlax-curve-getParamAtPoint CURVE X)
A (angle (vlax-curve-getFirstDeriv CURVE PP) '(0 0))
)
(or (equal A (/ PI 2) 1E-6) (equal A (* PI 1.5) 1E-6) (equal (fix PP) PP 1E-6))
)
LST2
)
)
)
(and LST1
LST2
(progn (setq X (vl-sort-i (mapcar 'car (cons PT LST1)) '<)
Y (length (member 0 X))
)
(and (zerop (rem Y 2)) (= (rem (- (length X) Y) 2) 1))
)
(progn (setq X (vl-sort-i (mapcar 'cadr (cons PT LST2)) '<)
Y (length (member 0 X))
)
(and (zerop (rem Y 2)) (= (rem (- (length X) Y) 2) 1))
)
)
)
)
)
;;4 主程序
(setq util (vla-get-utility (vla-get-activedocument (vlax-get-acad-object))))
(vla-getentity util 'obj1 'ip "\n选择封闭曲线: ")
(vla-getentity util 'obj2 'ip "\n选择对象: ")
;;如果两对象没有交点,要么在封闭曲线内,要么在封闭曲线外,故取对象中点判断是否在
;;封闭曲线内外即可
(if (All-intersectwith obj1 obj2)
nil
(progn (vla-getboundingbox obj2 'p1 'p2)
(setq p1 (vlax-safearray->list p1))
(setq p2 (vlax-safearray->list p2))
(LT:PT-INCURVE p1 (vlax-vla-object->ename obj1))
)
)
)
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
|