Select 特定实体类型 AutoLisp
Select Specific Entity Type AutoLisp
选择一个点时,就有一种方法可以过滤OSNAP,只能捕捉特定实体类型而不是其他类型的实体。例如
仅对齐线。
setq startpt (*SNAP FILTER CODE* "LINE" (getpoint "\nChoose Start Line : "))
仅捕捉圆弧。
setq startpt (*SNAP FILTER CODE* "ARC" (getpoint "\nChoose Start Arc: "))
仅捕捉折线。
setq startpt (*SNAP FILTER CODE* "POLYLINE" (getpoint "\nChoose Start Polyline: "))
我希望上面的假口齿不清有助于理解我想问的问题。
提前致谢。
这个问题是可以处理的,但是很复杂。
我可以告诉你的是,你可以使用函数 (grread)
来获取用户输入(鼠标移动或键盘按下)。然后你必须分析返回值,考虑到 osnaps。在这里您可以像这样过滤例如:
(cond
( ( = (vlax-get-property curve 'ObjectName ) "AcDbMLeader" ) ( progn
...
) )
( ( = (vlax-get-property curve 'ObjectName ) "AcDbPolyline" ) ( progn
...
) )
( YOUR NEXT CASES ( progn
...
) )
( t (progn
(princ "\n*Error:NotImplementedYetForThisEntity\n" ) )
) )
)
你必须绘制你自己的 osnap 标记(形状绘制例如 (grvecs)
大小基于系统变量 "VIEWSIZE"
"SCREENSIZE"
。你需要处理极轴跟踪,正交模式,键盘上按下的键。
前段时间试过,不是每一个case都处理,而且我的代码是几百行代码。对不起,但我不能分享所有的代码。
因此,如果您是 AutoLISP 的初学者,您可能会花费数周甚至数月的时间来解决问题。所以考虑你是否可以在这个问题上花这么多时间。也许您遇到的问题可能会以另一种方式处理,而不是过滤 osnaps。
AutoLISP osnap
函数可用于 return 使用提供的对象捕捉修改器捕捉到几何体的点,但是,此函数不会过滤候选几何体。
因此,您也可以提供由 getpoint
编辑的点 return 作为过滤 ssget
选择的点参数,或测试由 return 编辑的实体nentselp
函数。
这是一个可能的解决方案,使用 ssget
:
(defun c:test1 ( / pnt )
(while
(and
(setq pnt (getpoint "\nSelect start point on arc: "))
(not (ssget pnt '((0 . "ARC"))))
)
(princ "\nThe point does not lie on an arc.")
)
(if pnt
(princ (strcat "\nThe user picked (" (apply 'strcat (mapcar 'rtos pnt)) ")."))
(princ "\nThe user did not supply a point.")
)
(princ)
)
这是一个可能的解决方案,使用 nentselp
:
(defun c:test2 ( / ent pnt )
(while
(and (setq pnt (getpoint "\nSelect start point on arc: "))
(not
(and
(setq ent (car (nentselp pnt)))
(= "ARC" (cdr (assoc 0 (entget ent))))
)
)
)
(princ "\nThe point does not lie on an arc.")
)
(if pnt
(princ (strcat "\nThe user picked (" (apply 'strcat (mapcar 'rtos pnt)) ")."))
(princ "\nThe user did not supply a point.")
)
(princ)
)
选择一个点时,就有一种方法可以过滤OSNAP,只能捕捉特定实体类型而不是其他类型的实体。例如
仅对齐线。
setq startpt (*SNAP FILTER CODE* "LINE" (getpoint "\nChoose Start Line : "))
仅捕捉圆弧。
setq startpt (*SNAP FILTER CODE* "ARC" (getpoint "\nChoose Start Arc: "))
仅捕捉折线。
setq startpt (*SNAP FILTER CODE* "POLYLINE" (getpoint "\nChoose Start Polyline: "))
我希望上面的假口齿不清有助于理解我想问的问题。
提前致谢。
这个问题是可以处理的,但是很复杂。
我可以告诉你的是,你可以使用函数 (grread)
来获取用户输入(鼠标移动或键盘按下)。然后你必须分析返回值,考虑到 osnaps。在这里您可以像这样过滤例如:
(cond
( ( = (vlax-get-property curve 'ObjectName ) "AcDbMLeader" ) ( progn
...
) )
( ( = (vlax-get-property curve 'ObjectName ) "AcDbPolyline" ) ( progn
...
) )
( YOUR NEXT CASES ( progn
...
) )
( t (progn
(princ "\n*Error:NotImplementedYetForThisEntity\n" ) )
) )
)
你必须绘制你自己的 osnap 标记(形状绘制例如 (grvecs)
大小基于系统变量 "VIEWSIZE"
"SCREENSIZE"
。你需要处理极轴跟踪,正交模式,键盘上按下的键。
前段时间试过,不是每一个case都处理,而且我的代码是几百行代码。对不起,但我不能分享所有的代码。
因此,如果您是 AutoLISP 的初学者,您可能会花费数周甚至数月的时间来解决问题。所以考虑你是否可以在这个问题上花这么多时间。也许您遇到的问题可能会以另一种方式处理,而不是过滤 osnaps。
AutoLISP osnap
函数可用于 return 使用提供的对象捕捉修改器捕捉到几何体的点,但是,此函数不会过滤候选几何体。
因此,您也可以提供由 getpoint
编辑的点 return 作为过滤 ssget
选择的点参数,或测试由 return 编辑的实体nentselp
函数。
这是一个可能的解决方案,使用 ssget
:
(defun c:test1 ( / pnt )
(while
(and
(setq pnt (getpoint "\nSelect start point on arc: "))
(not (ssget pnt '((0 . "ARC"))))
)
(princ "\nThe point does not lie on an arc.")
)
(if pnt
(princ (strcat "\nThe user picked (" (apply 'strcat (mapcar 'rtos pnt)) ")."))
(princ "\nThe user did not supply a point.")
)
(princ)
)
这是一个可能的解决方案,使用 nentselp
:
(defun c:test2 ( / ent pnt )
(while
(and (setq pnt (getpoint "\nSelect start point on arc: "))
(not
(and
(setq ent (car (nentselp pnt)))
(= "ARC" (cdr (assoc 0 (entget ent))))
)
)
)
(princ "\nThe point does not lie on an arc.")
)
(if pnt
(princ (strcat "\nThe user picked (" (apply 'strcat (mapcar 'rtos pnt)) ")."))
(princ "\nThe user did not supply a point.")
)
(princ)
)