使用 AutoLisp 的 AutoCad 旋转命令
AutoCad rotate command with AutoLisp
我想用 AutoLisp 创建一个简单的 "rotate" 命令,所以这是我写的代码:
(defun C:myfunc()
(setq p1 (getpoint "\nPick first POINT on the screen:\n"))
(setq p2 (getpoint "\nPick second POINT on the screen:\n"))
(command "line" p1 p2 "")
(setq ss1 (ssget p2))
(command "rotate" ss1 p2 "90" "")
(princ )
)
我插入两个点 p1 和 p2 并创建一条连接它们的线。之后,我创建了 ss1 对象,即 p1-p2 行。最后,我尝试将线从基点 p2 旋转 90 度。
我在 AutoCad 中插入代码,但它没有创建旋转线,而是要求手动插入基点和角度,所以我猜 command "rotate" ...
线有问题.
如有任何建议,我们将不胜感激。
根据我在网上看到的,你有两个问题。
ROTATE
不取选择集而是取实体名
在旋转点之前缺少一个额外的 ""
。
(defun C:myfunc()
(setq p1 (getpoint "\nPick first POINT on the screen:\n"))
(setq p2 (getpoint "\nPick second POINT on the screen:\n"))
(command "line" p1 p2 "")
(setq ss1 (ssget p2))
(command "rotate" (entlast) "" p2 "90")
(princ )
)
参考:AutoLISP: Rotate Multiple Objects Around Their Base Point
附带说明一下,手动尝试命令通常可以帮助我确保您使用正确的 data/values.
响应所有正确的提示
我建议使用以下简化代码:
(defun c:myfunc ( / p1 p2 )
(if
(and
(setq p1 (getpoint "\nPick first POINT on the screen:"))
(setq p2 (getpoint "\nPick second POINT on the screen:" p1))
)
(command "_.line" "_non" p1 "_non" p2 "" "_.rotate" (entlast) "" "_non" p2 90)
)
(princ)
)
这考虑了提示中的空用户输入,使用 rubber-band 作为第二个点提示,在向命令提供点参数时允许激活对象捕捉模式(通过使用“_non” ),并且还允许 non-English 版本的 AutoCAD(通过使用下划线),以及可能重新定义的命令(通过使用“.”命令前缀)。
这可以通过暂时将 CMDECHO 系统变量设置为 0 来抑制 command-line 回显来进一步改进。
我想用 AutoLisp 创建一个简单的 "rotate" 命令,所以这是我写的代码:
(defun C:myfunc()
(setq p1 (getpoint "\nPick first POINT on the screen:\n"))
(setq p2 (getpoint "\nPick second POINT on the screen:\n"))
(command "line" p1 p2 "")
(setq ss1 (ssget p2))
(command "rotate" ss1 p2 "90" "")
(princ )
)
我插入两个点 p1 和 p2 并创建一条连接它们的线。之后,我创建了 ss1 对象,即 p1-p2 行。最后,我尝试将线从基点 p2 旋转 90 度。
我在 AutoCad 中插入代码,但它没有创建旋转线,而是要求手动插入基点和角度,所以我猜 command "rotate" ...
线有问题.
如有任何建议,我们将不胜感激。
根据我在网上看到的,你有两个问题。
ROTATE
不取选择集而是取实体名
在旋转点之前缺少一个额外的 ""
。
(defun C:myfunc()
(setq p1 (getpoint "\nPick first POINT on the screen:\n"))
(setq p2 (getpoint "\nPick second POINT on the screen:\n"))
(command "line" p1 p2 "")
(setq ss1 (ssget p2))
(command "rotate" (entlast) "" p2 "90")
(princ )
)
参考:AutoLISP: Rotate Multiple Objects Around Their Base Point
附带说明一下,手动尝试命令通常可以帮助我确保您使用正确的 data/values.
响应所有正确的提示我建议使用以下简化代码:
(defun c:myfunc ( / p1 p2 )
(if
(and
(setq p1 (getpoint "\nPick first POINT on the screen:"))
(setq p2 (getpoint "\nPick second POINT on the screen:" p1))
)
(command "_.line" "_non" p1 "_non" p2 "" "_.rotate" (entlast) "" "_non" p2 90)
)
(princ)
)
这考虑了提示中的空用户输入,使用 rubber-band 作为第二个点提示,在向命令提供点参数时允许激活对象捕捉模式(通过使用“_non” ),并且还允许 non-English 版本的 AutoCAD(通过使用下划线),以及可能重新定义的命令(通过使用“.”命令前缀)。
这可以通过暂时将 CMDECHO 系统变量设置为 0 来抑制 command-line 回显来进一步改进。