要使用ActiveX AddHatch方法完成此任务,需要一个形成闭合边界的边界对象,以便可以附加图案填充对象的外循环(使用AppendOuterLoop方法)。
要使用单个点获得这样的对象,需要一个函数来测试点是否位于对象内部。
这是一个经典问题(PIP),可以通过多种方式实现,最常见的是光线投射或通过计算物体的缠绕数。
最简单的方法是在内部使用Express Tools的函数acet geom point,尽管这确实会依赖于用户系统上Express Tools的可用性。
使用检测点是否位于多边形内的功能,可以检查图形中的每个闭合多边形,并收集指定点位于其中的多边形。从这个集合中,我们可以检索最接近该点的多边形,并对其进行相应的图案填充。
例如,考虑以下代码:
- (defun c:test ( / PointInside ss pt i e l hObj ) (vl-load-com)
- (defun PointInside ( pt ptlst )
- (acet-geom-point-inside pt ptlst
- ( (lambda ( m / d ) (foreach x ptlst (if (< m (setq d (distance pt x))) (setq m d))) m)
- 0.0
- )
- )
- )
- (if
- (and
- (setq ss (ssget "_X" '((0 . "LWPOLYLINE") (70 . 1))))
- (setq pt (getpoint "\nPick Internal Point: "))
- )
- (progn
- (setq i -1 pt (trans pt 1 0))
-
- (while (setq e (ssname ss (setq i (1+ i))))
- (if
- (PointInside pt
- (mapcar
- (function
- (lambda ( p ) (trans (cdr p) e 0))
- )
- (vl-remove-if-not (function (lambda ( p ) (= 10 (car p)))) (entget e))
- )
- )
- (setq l (cons e l))
- )
- )
- (if
- (setq e
- (car
- (vl-sort l
- (function
- (lambda ( a b )
- (<
- (distance pt (vlax-curve-getClosestPointto a pt))
- (distance pt (vlax-curve-getClosestPointto b pt))
- )
- )
- )
- )
- )
- )
- (progn
- (setq hObj
- (vla-AddHatch
- (vlax-get-property
- (vla-get-ActiveDocument (vlax-get-acad-object))
- (if (= 1 (getvar 'CVPORT))
- 'Paperspace
- 'Modelspace
- )
- )
- acHatchPatternTypePredefined "ANSI31" :vlax-true AcHatchObject
- )
- )
- (vlax-invoke hObj 'AppendOuterLoop (list (vlax-ename->vla-object e)))
- (vla-Evaluate hObj)
- )
- )
- )
- )
- (princ)
- )
李 |