我不熟悉autolisp并设置了我的第一个宏。我要创建一个矩形,在其上居中标记一些文本,然后将两个实体都转换为一个块(这是为了优化将包装好的项目加载到预告片中)。
我已经成功构建了矩形,但是我卡在了mtext部分。这是我到目前为止所做的:
(defun c:caja ()
;Switch OFF System Variables
(setvar "osmode" 0)
;Switch OFF snap
;(setvar "blipmode" 0)
;Switch OFF Blipmode
*******************************************************
;User Inputs
(setq pt1 (getpoint "\nSelect start point: "));lower left corner
(setq Long (getdist "\nLength m : "))
(setq Ancho (getdist "\nWidth : "))
;(setq Alto (getdist "\nHeight : "))
;(setq Peso (getdist "\nWeight : "))
*******************************************************
(setq pt2 (polar pt1 0 Long )) ;lower right corner
(setq pt3 (polar pt2 (* pi 0.5) Ancho));upper right corner
*******************************************************
(command"rectang" pt1 pt3"")
(command "mtext" "!pt1" "!pt3" "potato")
执行代码的最后一行时,我得到:
无效点。 ;错误:功能已取消。
但是,autocad让我继续使用mtext命令,并要求我“指定第一个角落”。如果我输入!pt1,它将起作用。
我的理解是,在autolisp中,我通常必须在命令提示符下键入的每个答案都必须在引号“”之间写,这样我就不知道自己在做什么错。
答案 0 :(得分:0)
使用感叹号前缀可以使您在任何AutoLISP程序之外的AutoCAD命令行中直接评估全局AutoLISP变量。
但是,当在程序中使用时,此类变量将作为AutoLISP程序评估的一部分进行评估,因此不需要感叹号前缀。
调用RECTANG
命令时,您已经成功实现了这一点:
(command "rectang" pt1 pt3 "")
因此,您可以对MTEXT
命令使用相同的逻辑:
(command "mtext" pt1 pt3 "potato" "")
我还将提出以下建议:
在更改系统变量之前,请先存储它们的当前值,以便您可以将其重置为原始值(例如,用户将丢失其所有“对象捕捉”设置)。
< / li>实现本地错误处理程序,以在发生错误或用户按下 Esc 时自动重置系统变量。有关如何完成此操作的更多信息,请参阅我的教程here。
使用下划线(_
)和句点(.
)前缀命令名称,例如:
(command "_.rectang" ... )
下划线确保在非英语版本的AutoCAD中以英语解释命令。该句点确保使用命令的标准定义,而不是重新定义。
在继续之前使用if
语句测试有效的用户输入。
声明局部变量,以确保变量不会被其他在文档名称空间中定义符号的程序无意中覆盖。有关更多信息,请参见我的教程here。