1

我想用 AutoLisp 创建一个简单的“旋转”命令,所以这是我写的代码:

(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" ...线有问题。

任何建议,将不胜感激。

4

2 回答 2

2

从我在网上看到的,你有两个问题。

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:围绕其基点旋转多个对象

作为旁注,它通常可以帮助我手动尝试该命令,以确保您使用正确的数据/值响应所有正确的提示。

于 2016-12-03T17:10:53.973 回答
1

我建议使用以下简化代码:

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

这考虑了提示时的空用户输入,对第二个点提示使用橡皮筋,在向命令提供点参数时允许活动对象捕捉模式(通过使用“_non”),并且还允许非- AutoCAD 的英文版本(通过使用下划线),以及可能重新定义的命令(通过使用“.”命令前缀)。

这可以通过暂时将 CMDECHO 系统变量设置为 0 以抑制命令行回显来进一步改进。

于 2017-02-07T23:52:46.493 回答