我想用ADDHATCH
要使用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)
)
李
页:
1
[2]