Lisp 使用entmod修改线图元

Lisp 使用entmod修改线图元,lisp,autocad,autolisp,Lisp,Autocad,Autolisp,我正在尝试修改最后绘制的行的起点。调用incercare函数后,不会发生任何更改: (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) ) 到 更改: (defun C:incercar

我正在尝试修改最后绘制的行的起点。调用incercare函数后,不会发生任何更改:

(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)
  )

更改:

(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)
  )


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

但是,请注意,您的代码可以进行大量压缩,因为每个步骤都不需要分配给单独的变量,例如:

(entmod lineen)
这里需要注意的几点:

请注意,我已将符号linie声明为defun表达式中的局部变量,因此此变量的作用域仅限于c:incercare函数,并且不保持全局

我使用单引号或撇号将新坐标引用为文字列表-这是可能的,因为列表只包含文字数据常量数值,而不包含变量数据-我将在关于的教程中更详细地讨论这一差异

当前函数假定添加到图形数据库的最后一个图元是直线图元,或者至少是其几何图形由DXF组10定义的图元。因此,您可能希望包含一个条件表达式来测试是否是这种情况,并相应地进行分支,例如:

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

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

但是,请注意,您的代码可以进行大量压缩,因为每个步骤都不需要分配给单独的变量,例如:

(entmod lineen)
这里需要注意的几点:

请注意,我已将符号linie声明为defun表达式中的局部变量,因此此变量的作用域仅限于c:incercare函数,并且不保持全局

我使用单引号或撇号将新坐标引用为文字列表-这是可能的,因为列表只包含文字数据常量数值,而不包含变量数据-我将在关于的教程中更详细地讨论这一差异

当前函数假定添加到图形数据库的最后一个图元是直线图元,或者至少是其几何图形由DXF组10定义的图元。因此,您可能希望包含一个条件表达式来测试是否是这种情况,并相应地进行分支,例如:

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