使用AutoLisp

时间:2016-12-03 16:52:18

标签: autocad autolisp

我想用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" ...行存在问题。

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分: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: Rotate Multiple Objects Around Their Base Point

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

答案 1 :(得分: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可以进一步改善这一点,以抑制命令行回显。