使用 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 回显来进一步改进。