多行文字。 Autolisp returns "Invalid point" 但在命令 windows 中输入点有效
Mtext. Autolisp returns "Invalid point" but typing the point in the command windows works
我不熟悉 autolisp 并设置我的第一个宏。我想创建一个矩形,在其中央标记一些文本,然后将两个实体转换为一个块(这是为了优化将包装好的物品加载到预告片中)。
我已经成功构建了矩形,但我卡在了多行文字部分。这是我到目前为止所做的:
(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 命令并要求我 "specify first corner"。如果我在那里输入 !pt1 就可以了。
我的理解是,在 autolisp 中,我必须在引号“”之间写下我通常会在命令提示符中键入的每个答案,这样我就不知道自己做错了什么。
使用感叹号前缀可以让您在任何 AutoLISP 程序之外直接在 AutoCAD command-line 上计算全局 AutoLISP 变量。
但是,当在程序中使用时,此类变量将作为 AutoLISP 程序计算的一部分进行计算,因此不需要感叹号前缀。
您在调用RECTANG
命令时已经成功实现:
(command "rectang" pt1 pt3 "")
因此,您可以对 MTEXT
命令使用相同的逻辑:
(command "mtext" pt1 pt3 "potato" "")
我还会提出以下建议:
在更改系统变量之前存储它们的当前值,以便您可以将它们重置为原始值(例如,否则用户将丢失所有对象捕捉设置)。
实现本地错误处理程序以在发生错误或用户按下 Esc 时自动重置系统变量。有关如何完成此操作的更多信息,请参阅我的教程 here。
使用下划线 (_
) 和句点 (.
) 作为命令名称的前缀,例如:
(command "_.rectang" ... )
下划线确保命令在 non-English 版本的 AutoCAD 中以英语解释。句点确保使用命令的标准定义,而不是重新定义。
在继续之前使用 if
语句测试有效的用户输入。
声明您的局部变量以确保您的变量不会被在文档命名空间中定义符号的其他程序无意中覆盖。有关这方面的更多信息,请参阅我的教程 here。
我不熟悉 autolisp 并设置我的第一个宏。我想创建一个矩形,在其中央标记一些文本,然后将两个实体转换为一个块(这是为了优化将包装好的物品加载到预告片中)。
我已经成功构建了矩形,但我卡在了多行文字部分。这是我到目前为止所做的:
(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 命令并要求我 "specify first corner"。如果我在那里输入 !pt1 就可以了。
我的理解是,在 autolisp 中,我必须在引号“”之间写下我通常会在命令提示符中键入的每个答案,这样我就不知道自己做错了什么。
使用感叹号前缀可以让您在任何 AutoLISP 程序之外直接在 AutoCAD command-line 上计算全局 AutoLISP 变量。
但是,当在程序中使用时,此类变量将作为 AutoLISP 程序计算的一部分进行计算,因此不需要感叹号前缀。
您在调用RECTANG
命令时已经成功实现:
(command "rectang" pt1 pt3 "")
因此,您可以对 MTEXT
命令使用相同的逻辑:
(command "mtext" pt1 pt3 "potato" "")
我还会提出以下建议:
在更改系统变量之前存储它们的当前值,以便您可以将它们重置为原始值(例如,否则用户将丢失所有对象捕捉设置)。
实现本地错误处理程序以在发生错误或用户按下 Esc 时自动重置系统变量。有关如何完成此操作的更多信息,请参阅我的教程 here。
使用下划线 (
_
) 和句点 (.
) 作为命令名称的前缀,例如:(command "_.rectang" ... )
下划线确保命令在 non-English 版本的 AutoCAD 中以英语解释。句点确保使用命令的标准定义,而不是重新定义。
在继续之前使用
if
语句测试有效的用户输入。声明您的局部变量以确保您的变量不会被在文档命名空间中定义符号的其他程序无意中覆盖。有关这方面的更多信息,请参阅我的教程 here。