Урок 10. AutoLISP. Стандартные команды Автокад.

Если вы хорошо знаете стандартные команды Автокад, то написание программ на языке AutoLISP не составить для вас большого труда. Создание своих программ позволит вам одним нажатием выполнять серию стандартных команд Автокад, сократит время вашей работы, избавит от рутины и оставит больше время для творчества.

В языке AutoLISP есть функция, которая имитирует командную строку. Это функция «command». Давайте проведем аналогию между написанием стандартных команд Автокад в командной строке и написании тех же команд в программе AutoLISP.

Для того, что все наш действия в командной строке имели одинаковые результаты, в самом начале необходимо отключить динамический ввод:

Для этого в низу слева нужно выключить динамический ввод, щелкнув по соответствующей кнопке. См. Рис. 1.

Рис. 1.   Отключение Динамического ввода.

Или выключить его при помощи клавиши <F12> на клавиатуре.

Отрезок.

Для того, чтобы построить отрезки с координатами первой точки (X=300, Y=300)  координатами второй точки (X=700, Y=300) и координатами третий точки (X=700, Y=700).

Нам нужно набрать в командной строке ОТРЕЗОК и нажать <Enter>.

Далее на запрос Первая точка: вводим 300,300 и нажимаем <Enter>.

На запрос Следующая точка: вводим 700,300 и нажимаем <Enter>.

На запрос Следующая точка: вводим 700,700 и нажимаем <Enter>.

На запрос Следующая точка: нажимаем <Enter> чтобы прервать выполнение команды.

В результате получим два отрезка. См. Рис. 2.

Рис. 2.   Построение отрезков.

Чтобы посмотреть полный порядок действий, нажимаем на клавиатуре клавишу <F2>. Откроется  Текстовое окно AutoCAD. См. Рис. 3.

Рис. 3.    Порядок действий.

Если вы работаете в англоязычной версии AutoCAD, то вместо команды ОТРЕЗОК в командной строке нужно было ввести LINE.

Англоязычная версия с нижним подчеркиванием впереди _LINE будет работать в обоих версиях.

Строка в программе на языке AutoLISP рисующая такие же отрезки выглядит так:

(command "_line" '(300 300) '(700 300) '(700 700) "")

См. Рис. 4.

Рис. 4.     AutoLISP.  Построение отрезков.

Выделите всю строку и нажмите на кнопку «Загрузить выделенный фрагмент».

AutoCAD начертит отрезки.

Если точку надо задать не вводом координат, а указать мышкой. Используем команду getpoint.

(getpoint "\nУкажите базовую точку : ")

Чтобы запомнить координаты указанной точки в переменной р1, используем функцию setq.

(setq p1 (getpoint "\nУкажите базовую точку : "))

Координаты следующих точек можно рассчитать относительно первой. Для этого в AutoLISP есть несколько способов.

Приведем один из них:

Координаты второй точки смещены относительно первой на 400 единиц  по координате Х.

Давайте предварительно создадим список с этим смещением при помощи функции list.

(list 400 0) – смещение по оси Х=400; смещение по оси Y=0

Затем сложим нас список с координатами точки р1 при помощи функции mapcar

(mapcar '+ p1 (list 400 0))

Запомним координаты второй точки в переменной р2

(setq p2 (mapcar '+ p1 (list 400 0)))

Аналогичным способом находим координаты третей точки относительно второй и запоминаем ее в переменной р3.

(setq p3 (mapcar '+ p2 (list 0 400)))

Мы могли найти координаты точки р3 относительно р1. Это выглядело бы так:

(setq p3 (mapcar '+ p1 (list 400 400)))

После, того как координаты сохранены в переменных, в строке рисующей отрезки меняем координаты на эти переменные:

(command "_line" p1 p2 p3 "")

Теперь наша программа выглядит так: См. Рис. 5.

Рис. 5.   LISP. Построение отрезков.

Выделите все строки, нажмите на кнопку «Загрузить выделенный фрагмент».

В командной строке появится запрос: «Укажите базовую точку:»

Укажите ее с некоторым смещением от координат старой первой точки. AutoCAD начертит отрезки со смещением. См. Рис. 6.

Рис. 6.    AutoLISP. Построение отрезков.

Я думаю, что с отрезками мы разобрались. Давайте теперь построим окружность.

Окружность.

Для того, чтобы построить окружность с координатами центра (X=700, Y=700) и радиусом окружности (R=200).

Нам нужно набрать в командной строке КРУГ и нажать <Enter>.

Далее на запрос Центр круга: вводим 700,700 и нажимаем <Enter>.

И запрос Радиус круга:  вводим 200 и нажимаем <Enter>.

В результате получим окружность. См. Рис. 7.

Рис. 7.    Построение окружности.

Если вы работаете в англоязычной версии AutoCAD, то вместо команды КРУГ в командной строке нужно было ввести CIRCLE.

Команда _CIRCLE будет работать в обоих версиях.

Строка в программе на языке AutoLISP рисующая ту же окружность выглядит так:

(command "_circle" '(700 700) 200)

Вместо координат можно поставить какую либо из ранее созданных переменных. Например переменную р3 в которой хранятся координаты третьей точки.

См. Рис. 8.

Рис. 8.    AutoLISP. Построение окружности.

Выделите последнюю строчку, нажмите на кнопку «Загрузить выделенный фрагмент». AutoCAD построит окружность с центром в точке р3 и радиусом 200. См. Рис. 9

Рис. 9.     LISP. Построение окружности.

Дуга.

Для того, чтобы построить дугу с координатами первой точки (X=300, Y=300)  координатами второй точки (X=700, Y=300) и координатами третий точки (X=700, Y=700).

Нам нужно набрать в командной строке ДУГА и нажать <Enter>.

Далее на запрос Начальная точка дуги: вводим 300,300 и нажимаем <Enter>.

На запрос Вторая точка дуги: вводим 700,300 и нажимаем <Enter>.

На запрос Конечная точка дуги: вводим 700,700 и нажимаем <Enter>.

В результате получим дугу. См. Рис. 10.

Рис. 10.    Построение дуги.

Если вы работаете в англоязычной версии AutoCAD, то вместо команды ДУГА в командной строке нужно было ввести ARC.

Команда _ARC будет работать в обоих версиях.

Строка в программе на языке AutoLISP рисующая ту же дугу выглядит так:

(command "_arc" '(300 300) '(700 300) '(700 700))

Давайте вместо координат поставим переменные р1, р2, р3 и добавим эту строчку в программу.

В результате получим см. Рис. 11.

Рис. 11.   AutoLISP. Построение дуги.

Выделите последнюю строчку, нажмите на кнопку «Загрузить выделенный фрагмент». AutoCAD построит дугу по точкам р1, р2, р3. См. Рис. 12.

Рис. 12.  LISP. Построение дуги.

Надеюсь, что с построением простых примитивов мы разобрались. Теперь давайте рассмотрим какую нибудь команду редактирования. Например Зеркало.

Команда редактирования. Зеркало.

Давайте оставим только два отрезка и дугу. См. Рис. 13.

Рис. 13.    Два отрезка и дуга.

Затем отзеркалим их относительно вертикального отрезка.

Для этого в командной строке вводим команду Зеркало, нажимаем <Enter>.

На запрос Выберите объекты: указываем мышью все три примитива и нажимаем <Enter>.

На запрос Первая точка оси отражения: указываем верхнюю точку вертикального отрезка.

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

На запрос Удалить исходные объекты? [Да/Нет] <Н>: нажимаем <Enter>.

В результате получаем следующее. См. Рис. 14.

Рис. 14.    Команда редактирования. Зеркало.

Если вы работаете в англоязычной версии AutoCAD, то вместо команды ЗЕРКАЛО в командной строке нужно было ввести MIRROR.

Команда _MIRROR будет работать в обоих версиях.

Для того, чтобы сделать тоже самое в программе на языке AutoLISP нужно после построение примитива сохранять его имя в переменой. Это можно сделать при помощи функции entlast, которая возвращает имя последнего нарисованного примитива.

Строим горизонтальный отрезок:

(command "_line" p1 p2 "")

Сохраняем имя горизонтального отрезка в переменной gLine:

(setq gLine (entlast))

Строим вертикальный отрезок:

(command "_line" p2 p3 "")

Сохраняем имя вертикального отрезка в переменной vLine:

(setq vLine (entlast))

Строим дугу:

(command "_arc" p1 p2 p3 "")

Сохраняем имя дуги в переменной duga:

(setq duga (entlast))

Зеркалим отрезки и дугу относительно линии проходящей через точки р2 и р3:

(command "_mirror" gLine vLine duga "" p2 p3 "")

Все вместе в программе это будет выглядеть так: См. рис. 15.

Рис. 15.   AutoLISP. Команда редактирования. Зеркало.

Выделите все строки, нажмите на кнопку «Загрузить выделенный фрагмент».

В командной строке появится запрос: «Укажите базовую точку:»

Укажите ее выше уже имеющихся примитивов. AutoCAD сначала, начертит новые отрезки и дугу, а затем отзеркалит их. И в конце, построит окружность. См. Рис. 16.

Рис. 16.   LISP. Команда редактирования. Зеркало.

И в заключении давайте построим какую нибудь фигуру вращения в 3d. Например половину конуса.

Фигура вращения. Половина конуса.

Для лучшей наглядности давайте удалим ранее нарисованные примитивы и переведем чертеж ЮЗ изометрию.

Для этого набираем в командной строке _-VIEW и нажать <Enter>.

Далее вводим _swiso и нажимаем <Enter>.

Чертеж будет переведен в ЮЗ изометрию. См. Рис. 17.

Рис. 17.    Переход в ЮЗ изометрию

Второй способ перевести чертеж в ЮЗ изометрию. Это на видовом кубе щелкнуть между Ю и З в место, которое показано на Рис. 18.

Рис. 18. Переход в ЮЗ изометрию

Далее чертим отрезок с координатами первой точки (X=1000, Y=0, Z=0) и координатами второй точки (X=1200, Y=0, Z=700)

Набираем в командной строке ОТРЕЗОК и нажать <Enter>.

Далее на запрос Первая точка: вводим 1000,0,0 и нажимаем <Enter>.

На запрос Следующая точка: вводим 1200,0,700 и нажимаем <Enter>.

На запрос Следующая точка: нажимаем <Enter>, чтобы прервать выполнение команды.

Далее набираем команду ВРАЩАТЬ, нажимаем <Enter>.

Указываем мышкой только, что нарисованный отрезок и нажимаем <Enter>.

На запрос Начальная точка оси вращения: вводим 1200,0,700 и нажимаем <Enter>.

На запрос Конечная точка оси вращения: вводим 1200,0,0 и нажимаем <Enter>.

На запрос Угол вращения: вводим 180 и нажимаем <Enter>.

В результате получаем половину конуса. См. Рис. 19

Рис. 19.   Построение фигуры вращения.

Чтобы увидеть полный порядок действий, нажимаем на клавиатуре клавишу <F2>. Откроется  Текстовое окно AutoCAD. См. Рис. 20.

Рис. 20. Порядок действий.

Для того, чтобы вернутся к двухмерному чертежу с осями X и Y нужно на видовом кубе щелкнуть по надписи Верх. См. Рис. 21.

Рис. 21.  Переход к двухмерному чертежу.

Если вы работаете в англоязычной версии AutoCAD, то вместо команды ВРАЩАТЬ в командной строке нужно было ввести REVOLVE.

Команда _REVOLVE будет работать в обоих версиях.

В программе на языке AutoLISP построение половины конуса выглядит так:

В начале строим отрезок

(command "_line" '(1000 0 0) '(1200 0 700) "")

Затем при помощи функций setq и entlast (возвращает имя последнего нарисованного примитива)  запоминаем его в переменной line1

(setq line1 (entlast))

И в конце строим фигуру вращения

(command "_REVOLVE" line1 "" '(1200 0 700) '(1200 0 0) 180)

Все вместе в программе это выглядит так: См. Рис. 22.

Рис. 22.   AutoLISP. Построение фигуры вращения.

Для того, чтобы преобразовать нашу программу в пользовательскую функцию.

Добавим строку, в которой придумаем имя функции (scom – стандартные команды) и перечислим все временные переменные:

(defun c:scom (/ p1, p2, p3, gline, vline, duga, line1)
      <наша программа>
) ; end_defun

Окончательный вариант программы см. Рис. 23.

Рис. 23.   AutoLISP. Стандартные команды AutoCAD.

Чтобы проверить работу всей программы: удалите все примитивы и вернитесь в двухмерное пространство.

Чтобы загрузить программу, используем кнопку «Загрузить активное окно редактора». Переходим в AutoCAD, в командной строке набираем scom и нажимаем <Enter>.

На запрос: Укажите базовую точку : укажите любую точку в рабочем окне.

Результат выполнения программы должен выглядеть так. См.Рис. 24.

Рис. 24.   AutoLISP. Стандартные команды AutoCAD.

Код программы:

(defun c:scom (/ p1, p2, p3, gline, vline, duga, line1)
    (setq p1 (getpoint "\nУкажите базовую точку : "))  ; запрос координат точки р1
    (setq p2 (mapcar '+ p1 (list 400 0)))                         ; расчет координат точки p2
    (setq p3 (mapcar '+ p2 (list 0 400)))                         ; расчет координат точки p3
    (command "_line" p1 p2 "")      ; построение отрезка
    (setq gLine (entlast))                ; запоминаем имя отрезка
    (command "_line" p2 p3 "")      ; построение отрезка
    (setq vLine (entlast))                ; запоминаем имя отрезка
    (command "_arc" p1 p2 p3 "") ; построение дуги
    (setq duga (entlast))                 ; запоминаем имя дуги
    (command "_mirror" gLine vLine duga "" p2 p3 "") ; зеркалим

    (command "_circle" p3 200)                                 ; построение окружности

    (command "_-view" "_swiso" "")                          ; перевод ЮЗ изометрию
    (command "_line" '(1000 0 0) '(1200 0 700) "")   ; построение отрезка
    (setq line1 (entlast))                                             ; запоминаем имя отрезка
    (command "_REVOLVE" line1 "" '(1200 0 700) '(1200 0 0) 180) ; построение полуконуса
) ; end_defun
 Скачать программу Scom.lsp (Размер файла: 535 bytes) 

Таким образом, мы видим, что написание стандартных команд Автокад в программе AutoLISP практически повторяют написание их в командной строке. И если Вы знаете как пользоваться стандартными командами в AutoCAD, то при наработке определенного навыка, Вы легко сможете писать свои программы, которые в значительной степени могут ускорить процесс выполнения вашей работы.  Поверьте, это не так сложно, как кажется на первый взгляд.

Как добавить нашу программу в список автоматической загрузки и создать для нее кнопку запуска рассмотрено в уроках: Простой запуск LISP программ. Создание кнопки для программы LISP.

Пишите в комментариях:

Трудно ли было выполнить этот урок?

Где у вас возникли трудности?

Была ли для Вас полезной информация, данная в этом уроке?

Если у Вас не получилось  запрограммировать стандартную функцию AutoCAD? Пишите попробуем разобраться вместе.

На какие вопросы программирования, Вы хотели бы, увидит ответы в следующих уроках?

Я с удовольствием отвечу на ваши комментарии.

Если вы хотите получать новости с моего сайта. Оформляйте подписку.

До новых встреч.

 «Автор: Михаил Орлов»

Google

Также на эту тему Вы можете почитать:

Михаил Орлов

View Comments

  • Здравствуйте. Не могли бы вы подсказать, как описать команду для проведения линии под определенным углом, к примеру под углом в 65 градусов?

    • (setq p1 (getpoint "\nУкажите точку : "))
      (setq p2 (polar p1 (*(/ 65. 180) pi) 1000))
      (command "_line" p1 p2 "")

      (*(/ 65. 180) pi) - угол 65 градусов в радианах
      1000 - длина отрезка (линии)

  • Здравствуйте, подскажите пожалуйста.. как в Autolispe запустить программу комодом?

    • Что значит комодом? Вопрос не совсем понятен. Программы в Автокад сначала нужно загрузить. После этого их можно запускать как стандартные команды Автокад (из командной строки, Горячие клавиши, кнопка запуска команды и т.п.). Можно сделать чтобы команда запускалась автоматически сразу после загрузки программы.

  • Здравствуйте! Подскажите, как присвоить новой точке р3 координату Х от введенной мною через getpoint точки р1 и координату Y от р2 ? Спасибо

    • (setq p1 (getpoint "\nУкажите первую точку : "))
      (setq p2 (getpoint "\nУкажите вторую точку : "))
      (setq p3 (list (nth 0 p1) (nth 1 p2) 0))
      • Благодарю! Кое-что начинает получаться )

  • Здравствуйте! Можно ли для функции if сравнивать переменную сразу с двумя числами (т.е. мне надо выполнить функцию только в том случае, когда "а" больше нуля но меньше 90)?

  • Как задать диаметр окружности из ячейки таблицы

    • Из какой таблицы? Из таблицы AutoCAD? Из заранее известной ячейки (известен адрес ячейки)?

  • Как пошагово выполнить программу нм лиспе

    • 1)Выделяйте необходимый кусок кода и нажимайте на кнопку "Загрузить выделены фрагмент". 2) Установите точку останова. Запустите программу она остановиться в точке останова. Далее чтобы идти вниз пошагово нажимаем на кнопку "Шаг с заходом".

  • Не могу найти команду, которая бы, при выполнении ее, помещала текстовую строку из МТЕКСТа в автокаде в переменную ЛИСПа. Заранее спасибо)

    • (setq ent_obj (car(entsel "\nУкажите MText : ")))
      (setq txt (cdr (assoc 1 (entget ent_obj))))

  • Добрый день!
    Можете подсказать, как прописать команду, чтобы после выбора объекта (замкнутой полилинии, окружности, блока) последовало бы предложение указать точку вставки и после её указания в этом месте вставился бы текст с площадью этого объекта в кв.м.?

    • Для полилинии, окружности:

      (vl-load-com)
      (while(not(setq ent (car(entsel "\nУкажите объект: ")))))
      (setq vla_obj (vlax-ename->vla-object ent))
      (setq S_obj (rtos (/(vla-get-Area vla_obj) 1000000) 2 2))
      
      (setq pt (getpoint "\nУкажите точку вставки текста: "))
      (command "_.text" pt 200 0 S_obj)
      

      Для блоков скорее всего нужно писать свой код и он будет зависит от того какой это блок.

      • Для такого чайника, как ваш сайт самое то! ОЧень благодарен.
        В результате у меня в тексте "0" а в консоли "nil". В чем дело может быть?

  • Добрый день!
    Подскажите, пожалуйста, как использовать команду INSERT с учетом системной переменной INSBASE вставляемого файла, если эта переменная не 0,0,0.

    • Возможно у Вас просто установлена Пользовательская Система Координат (ПСК).
      Перевел чертеж в Мировую Систему Координат (МСК).
      Наберите в командной строке ПСК (_UCS) и выберите или введите опцию [мир] (world)
      Возможно INSBASE станет 0,0,0.
      Если нет, тогда измените ее при помощи команды _BASE.

Recent Posts

Программа расчета профиля

Программа "Расчет профиля" создана в помощь инженерам-проектировщикам, работающих с профилями. Автор программы, читатель моего сайта:…

8 лет ago

Как нарисовать прямоугольник в Автокаде.

Любой чертеж может быть разбит на простейшие элементы, примитивы.  В этом уроке мы познакомимся с…

9 лет ago

Как нарисовать дугу в Автокаде.

Как нарисовать дугу в Автокаде? Для этого в программе Автокад существует несколько способов. В этом…

9 лет ago

Как нарисовать круг в Автокаде.

Любой чертеж может быть разбит на простейшие элементы, примитивы.  В этом уроке мы познакомимся с…

9 лет ago

Автоматизация проектирования. Отвод.

В этой статье мы продолжим процесс автоматизации проектирования систем вентиляции. (далее…)

9 лет ago

Автоматизация проектирования.

Одним из эффективных способов автоматизации процесса проектирования в Автокад,  может послужить создание своих программ на…

9 лет ago