代码之家  ›  专栏  ›  技术社区  ›  Bigbob556677

选择特定图元类型AutoLisp

  •  0
  • Bigbob556677  · 技术社区  · 8 年前

    当选择一个点时,有没有一种方法可以过滤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: "))
    

    我希望上面的假口齿不清有助于理解我想问的问题。

    提前谢谢。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Lee Mac    8 年前

    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
  •  0
  •   CAD Developer    8 年前

    处理这个问题是可能的,但它非常复杂。 (grread) 获取用户输入(移动鼠标或按下键盘)。然后,考虑到OSNAP,您必须分析返回值。在这里,您可以这样过滤:

    (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" . 您需要处理极轴跟踪、正交模式和键盘上的按键。 我前一段时间试过这么做,并不是每一个案例都能处理,我的代码是数百行代码。对不起,我无法共享所有代码。

    因此,如果您是AutoLISP的初学者,可能需要花费数周甚至数月的时间来解决这个问题。因此,考虑一下你是否可以在这个问题上花这么多时间。也许你们遇到的问题可以用另一种方式来处理,而不是过滤OSNAP。

    推荐文章