Команда поворота 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" ....

Мы ценим любые предложения.


person user3060854    schedule 03.12.2016    source источник
comment
В качестве примечания: entlast вернет последний объект. Это может предотвратить проблемы, если у вас есть несколько объектов в p2.   -  person crashmstr    schedule 03.12.2016
comment
Я давно не работал с AutoLisp, но должен ли вместо "90" быть 90?   -  person crashmstr    schedule 03.12.2016
comment
@ Crashmstr В нескольких учебниках используется "90", ни в одном не используется 90.   -  person user3060854    schedule 03.12.2016
comment
Я нашел несколько примеров и написал ответ, который должен помочь.   -  person crashmstr    schedule 03.12.2016


Ответы (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: поворот нескольких объектов Вокруг их базовой точки

В качестве примечания: обычно мне помогает попробовать команду вручную, чтобы убедиться, что вы отвечаете на все правильные запросы с правильными данными/значениями.

person crashmstr    schedule 03.12.2016

Я бы предложил следующий упрощенный код:

(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, чтобы подавить эхо командной строки.

person Lee Mac    schedule 07.02.2017