【问题标题】:Select Specific Entity Type AutoLisp选择特定实体类型 AutoLisp
【发布时间】:2018-03-28 08:38:37
【问题描述】:

选择点时,有没有方法可以仅筛选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: "))

我希望上面的假 lisp 有助于理解我要问的问题。

提前致谢。

【问题讨论】:

    标签: lisp autocad autocad-plugin autolisp


    【解决方案1】:

    AutoLISP osnap 函数可用于返回使用提供的对象捕捉修改器捕捉到几何体的点,但是,此函数不会过滤候选几何体。

    因此,您也可以提供getpoint 返回的点作为过滤后的ssget 选择的点参数,或者测试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)
    )
    

    【讨论】:

      【解决方案2】:

      这个问题是可以处理的,但是很复杂。 我能说的是,您可以使用函数(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 标记(根据系统变量 "VIEWSIZE" "SCREENSIZE" 绘制的形状,例如 (grvecs) 大小。您需要处理极坐标跟踪、正交模式、键盘上的按键。 前段时间尝试过,没有处理好每一种情况,我的代码是几百行代码。抱歉,我不能分享所有代码。

      因此,如果您是 AutoLISP 的初学者,您可能会花费数周甚至数月的时间来解决问题。所以考虑一下你是否可以在这个问题上花这么多时间。也许您遇到的问题可能会以过滤osnaps之外的其他方式处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-20
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        • 2016-06-15
        • 2021-09-11
        • 2021-11-15
        相关资源
        最近更新 更多