使用entmod修改线实体

时间:2020-04-30 08:16:41

标签: lisp autocad autolisp

(defun C:incercare (/ )
 (setq linie (entget (entlast))
       startp (assoc 10 linie) ; line start point
       lineen (subst (list 10 5.0 5.0 0.0) startp linie))

(entmod linie)
  )

我正在尝试修改最后绘制的线条的起点。调用了incercare函数之后,什么都没发生

2 个答案:

答案 0 :(得分:2)

更改:

(entmod linie)

(entmod lineen)

答案 1 :(得分:2)

如用户CAD开发人员所述,您正在调用分配给entmod变量的原始 DXF数据列表上的linie,而不是修改的 subst函数返回并分配给lineen变量的em>列表。

但是,请注意,您的代码可能会被压缩,因为不必将每个步骤分配给一个单独的变量,例如:

(defun c:incercare ( / linie )
    (setq linie (entget (entlast)))
    (entmod (subst '(10 5.0 5.0 0.0) (assoc 10 linie) linie))
)

这里需要注意的几点:

  • 请注意,我已将符号linie声明为defun表达式内的局部变量,因此该变量的范围仅限于c:incercare函数,并且没有不会保持全球性。

  • 我已使用单引号或撇号将新坐标引用为文字列表,这是可能的,因为该列表仅包含文字数据(恒定数值),而没有变量数据-我将在更多内容中讨论这种差异在我的The Apostrophe and the Quote Function教程中有详细介绍。

您当前的功能是假设最后添加到图形数据库中的实体是LINE实体(或至少是其几何形状由DXF组10定义的实体)。因此,您可能需要包含条件表达式以测试是否存在这种情况并相应地分支,例如:

(defun c:incercare ( / ent enx )
    (if
        (and
            (setq ent (entlast))
            (setq enx (entget ent))
            (= "LINE" (cdr (assoc 0 enx)))
        )
        (entmod (subst '(10 5.0 5.0 0.0) (assoc 10 enx) enx))
        (princ "\nThe last entity was not a line.")
    )
    (princ)
)