Если вы хорошо знаете стандартные команды Автокад, то написание программ на языке AutoLISP не составить для вас большого труда. Создание своих программ позволит вам одним нажатием выполнять серию стандартных команд Автокад, сократит время вашей работы, избавит от рутины и оставит больше время для творчества.
В языке AutoLISP есть функция, которая имитирует командную строку. Это функция «command». Давайте проведем аналогию между написанием стандартных команд Автокад в командной строке и написании тех же команд в программе AutoLISP.
Для того, что все наш действия в командной строке имели одинаковые результаты, в самом начале необходимо отключить динамический ввод:
Для этого в низу слева нужно выключить динамический ввод, щелкнув по соответствующей кнопке. См. Рис. 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.
Чтобы посмотреть полный порядок действий, нажимаем на клавиатуре клавишу <F2>. Откроется Текстовое окно AutoCAD. См. Рис. 3.
Если вы работаете в англоязычной версии AutoCAD, то вместо команды ОТРЕЗОК в командной строке нужно было ввести LINE.
Англоязычная версия с нижним подчеркиванием впереди _LINE будет работать в обоих версиях.
Строка в программе на языке AutoLISP рисующая такие же отрезки выглядит так:
(command "_line" '(300 300) '(700 300) '(700 700) "")
См. Рис. 4.
Выделите всю строку и нажмите на кнопку «Загрузить выделенный фрагмент».
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.
Выделите все строки, нажмите на кнопку «Загрузить выделенный фрагмент».
В командной строке появится запрос: «Укажите базовую точку:»
Укажите ее с некоторым смещением от координат старой первой точки. AutoCAD начертит отрезки со смещением. См. Рис. 6.
Я думаю, что с отрезками мы разобрались. Давайте теперь построим окружность.
Окружность.
Для того, чтобы построить окружность с координатами центра (X=700, Y=700) и радиусом окружности (R=200).
Нам нужно набрать в командной строке КРУГ и нажать <Enter>.
Далее на запрос Центр круга: вводим 700,700 и нажимаем <Enter>.
И запрос Радиус круга: вводим 200 и нажимаем <Enter>.
В результате получим окружность. См. Рис. 7.
Если вы работаете в англоязычной версии AutoCAD, то вместо команды КРУГ в командной строке нужно было ввести CIRCLE.
Команда _CIRCLE будет работать в обоих версиях.
Строка в программе на языке AutoLISP рисующая ту же окружность выглядит так:
(command "_circle" '(700 700) 200)
Вместо координат можно поставить какую либо из ранее созданных переменных. Например переменную р3 в которой хранятся координаты третьей точки.
См. Рис. 8.
Выделите последнюю строчку, нажмите на кнопку «Загрузить выделенный фрагмент». AutoCAD построит окружность с центром в точке р3 и радиусом 200. См. Рис. 9
Дуга.
Для того, чтобы построить дугу с координатами первой точки (X=300, Y=300) координатами второй точки (X=700, Y=300) и координатами третий точки (X=700, Y=700).
Нам нужно набрать в командной строке ДУГА и нажать <Enter>.
Далее на запрос Начальная точка дуги: вводим 300,300 и нажимаем <Enter>.
На запрос Вторая точка дуги: вводим 700,300 и нажимаем <Enter>.
На запрос Конечная точка дуги: вводим 700,700 и нажимаем <Enter>.
В результате получим дугу. См. Рис. 10.
Если вы работаете в англоязычной версии AutoCAD, то вместо команды ДУГА в командной строке нужно было ввести ARC.
Команда _ARC будет работать в обоих версиях.
Строка в программе на языке AutoLISP рисующая ту же дугу выглядит так:
(command "_arc" '(300 300) '(700 300) '(700 700))
Давайте вместо координат поставим переменные р1, р2, р3 и добавим эту строчку в программу.
В результате получим см. Рис. 11.
Выделите последнюю строчку, нажмите на кнопку «Загрузить выделенный фрагмент». AutoCAD построит дугу по точкам р1, р2, р3. См. Рис. 12.
Надеюсь, что с построением простых примитивов мы разобрались. Теперь давайте рассмотрим какую нибудь команду редактирования. Например Зеркало.
Команда редактирования. Зеркало.
Давайте оставим только два отрезка и дугу. См. Рис. 13.
Затем отзеркалим их относительно вертикального отрезка.
Для этого в командной строке вводим команду Зеркало, нажимаем <Enter>.
На запрос Выберите объекты: указываем мышью все три примитива и нажимаем <Enter>.
На запрос Первая точка оси отражения: указываем верхнюю точку вертикального отрезка.
На запрос Вторая точка оси отражения: указываем нижнюю точку вертикального отрезка.
На запрос Удалить исходные объекты? [Да/Нет] <Н>: нажимаем <Enter>.
В результате получаем следующее. См. Рис. 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.
Выделите все строки, нажмите на кнопку «Загрузить выделенный фрагмент».
В командной строке появится запрос: «Укажите базовую точку:»
Укажите ее выше уже имеющихся примитивов. AutoCAD сначала, начертит новые отрезки и дугу, а затем отзеркалит их. И в конце, построит окружность. См. Рис. 16.
И в заключении давайте построим какую нибудь фигуру вращения в 3d. Например половину конуса.
Фигура вращения. Половина конуса.
Для лучшей наглядности давайте удалим ранее нарисованные примитивы и переведем чертеж ЮЗ изометрию.
Для этого набираем в командной строке _-VIEW и нажать <Enter>.
Далее вводим _swiso и нажимаем <Enter>.
Чертеж будет переведен в ЮЗ изометрию. См. Рис. 17.
Второй способ перевести чертеж в ЮЗ изометрию. Это на видовом кубе щелкнуть между Ю и З в место, которое показано на Рис. 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
Чтобы увидеть полный порядок действий, нажимаем на клавиатуре клавишу <F2>. Откроется Текстовое окно AutoCAD. См. Рис. 20.
Для того, чтобы вернутся к двухмерному чертежу с осями X и Y нужно на видовом кубе щелкнуть по надписи Верх. См. Рис. 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.
Для того, чтобы преобразовать нашу программу в пользовательскую функцию.
Добавим строку, в которой придумаем имя функции (scom – стандартные команды) и перечислим все временные переменные:
(defun c:scom (/ p1, p2, p3, gline, vline, duga, line1)
<наша программа>
) ; end_defun
Окончательный вариант программы см. Рис. 23.
Чтобы проверить работу всей программы: удалите все примитивы и вернитесь в двухмерное пространство.
Чтобы загрузить программу, используем кнопку «Загрузить активное окно редактора». Переходим в AutoCAD, в командной строке набираем scom и нажимаем <Enter>.
На запрос: Укажите базовую точку : укажите любую точку в рабочем окне.
Результат выполнения программы должен выглядеть так. См.Рис. 24.
Код программы:
(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? Пишите попробуем разобраться вместе.
На какие вопросы программирования, Вы хотели бы, увидит ответы в следующих уроках?
Я с удовольствием отвечу на ваши комментарии.
Если вы хотите получать новости с моего сайта. Оформляйте подписку.
До новых встреч.
«Автор: Михаил Орлов»
Здравствуйте. Не могли бы вы подсказать, как описать команду для проведения линии под определенным углом, к примеру под углом в 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 ? Спасибо
Благодарю! Кое-что начинает получаться )
Здравствуйте! Можно ли для функции if сравнивать переменную сразу с двумя числами (т.е. мне надо выполнить функцию только в том случае, когда «а» больше нуля но меньше 90)?
разобрался
if (> 90 a 0)
Как задать диаметр окружности из ячейки таблицы
Из какой таблицы? Из таблицы AutoCAD? Из заранее известной ячейки (известен адрес ячейки)?
Как пошагово выполнить программу нм лиспе
1)Выделяйте необходимый кусок кода и нажимайте на кнопку «Загрузить выделены фрагмент». 2) Установите точку останова. Запустите программу она остановиться в точке останова. Далее чтобы идти вниз пошагово нажимаем на кнопку «Шаг с заходом».
Не могу найти команду, которая бы, при выполнении ее, помещала текстовую строку из МТЕКСТа в автокаде в переменную ЛИСПа. Заранее спасибо)
(setq ent_obj (car(entsel "\nУкажите MText : ")))
(setq txt (cdr (assoc 1 (entget ent_obj))))
Добрый день!
Можете подсказать, как прописать команду, чтобы после выбора объекта (замкнутой полилинии, окружности, блока) последовало бы предложение указать точку вставки и после её указания в этом месте вставился бы текст с площадью этого объекта в кв.м.?
Для полилинии, окружности:
Для блоков скорее всего нужно писать свой код и он будет зависит от того какой это блок.
Для такого чайника, как ваш сайт самое то! ОЧень благодарен.
В результате у меня в тексте «0» а в консоли «nil». В чем дело может быть?
Добрый день!
Подскажите, пожалуйста, как использовать команду INSERT с учетом системной переменной INSBASE вставляемого файла, если эта переменная не 0,0,0.
Возможно у Вас просто установлена Пользовательская Система Координат (ПСК).
Перевел чертеж в Мировую Систему Координат (МСК).
Наберите в командной строке ПСК (_UCS) и выберите или введите опцию [мир] (world)
Возможно INSBASE станет 0,0,0.
Если нет, тогда измените ее при помощи команды _BASE.
Спасибо большое, очень помогло.
Михаил, скажите пожалуйста, есть ли на AutoLISP команда для создания усеченного конуса, и если есть,то как построить таковой? Существует ли метод или алгоритм для расчета объема призмы на AutoLISP?
Для построения конуса:
10 — радиус нижнего основания
5 — радиус верхнего основания
7 — высота усеченного конуса
Определение объема любого 3Д-объекта:
Огромное спасибо!Вы настоящий мастер в этом деле!
Здравствуйте, можно ли реализовать программу, которая строила бы прямоугольники по координатам одним за одним? (есть таблица с координатами точек X,Y, в ручную вбивать слишком долго для такого количества)
Да, конечно.
поможете мне с этим пожалуйста?
В какой виде изначально сделана таблица? Пришлите мне таблицу на почту: acadprog@gmail.com
над решение такой же задачи работаю.
Я должен ввести значения с клавиатуры для каждого столбца таблицы (указать ширину столбцов последовательно, потом высоту строк. Автокад строит сетку=таблицу
Михаил, а что такое glisp?
Что такое glisp? Я не знаю.
Как копировать объект так, чтоб каждый следующий был меньше предыдущего, ну и задавать это уменьшение
Написать LISP-программу, которая:
1) Попросит выбрать исходный объект
2) Отмасштабирует его
3) Запросит точку вставки для объекта с новым масштабом.
Есть полилиния и пересекающая её окружность. Как в команде _trim программно указать какую сторону полилинии удалять?
Предварительно определяем координаты крайних точек полилинии р1 и р2
p1 — одна из крайних точек полилинии.
К примеру мне необходимо произвести какие-либо действия с объектами, но для этого надо их сначала выделить. Выделять планируется вручную. Как реализовать подобный манёвр?
Функция (ssget) просит выделить объектs и создает набор из указанных объектов. Сохраняем набор в переменную:
и далее делаем с этим набором все что захотим.
Добрый день. А можно ли подвязать выполнение команды к смене вида через видовой куб? (Хотелось бы после смены вида через видовой куб автоматически устанавливать ПСК по виду).
Не совсем понял вопрос. Из LISP программы можно управлять видом и ПСК.
Добрый день, подскажите как возможно в AutoLISP построить график экспоненциальной функции в системе координат?
Здравствуйте Михаил ! Я новичок в создании модулей для AutoCAD и столкнулся с такой проблемой, мне нужно ввести с клавиатуры радиус цилиндра r1 и длину p1 после чего команда AddCylinder должна его построить. Я сделал данные точки вводимыми :
(setq r1 (getpoint «\nУкажите радиус цилиндра : «))
(setq p1 (getpoint «\nУкажите длину цилиндра : «))
После чего в командной строке я задал нужные мне размеры, автокад выдаёт: ошибка: неверный тип аргумента: numberp: (52.1327 54.8704 0.0).
Ломаю голову, не могу понять что не так. Не судите строго, если задаю глупый вопрос. Заранее огромное спасибо за ответ !
Подскажите я задаю программу (defun Pr_3 ( )
(setq a (getreal «\ Введите число a: «) )
(setq b (getreal «\ Введите число b: «))
(setq c (+ a b)) и еще потом вывести значение с на экран? Заранее спасибо
(princ с) — выведет значение «с» в командной строке
(alert c) — выведет значение «с» в диалоговом окне.
необходимо вывести текст в плоскости хуz «Сумма чисел а и b равна с»
Здравствуйте, Михаил!
Не получается написать код. Требуется нарисовать отрезок возле 3d полилинии, копировать этот отрезок с полилинией, потом повернуть полилинию относительно отрезка на — 90.
(setq p1 (getpoint))
(setq p2 (getpoint))
(command «_line» p1 p2 «»)
(command «_copy»)
(command «_rotate3d»)
После копирования, 3d поворот запускается не корректно. Помоги пожалуйста, разобраться с этой проблемой.
Вращение вокруг оси OY:
(setq p1 (getpoint "\nУкажите точку 1: "))
(setq X1 (nth 0 p1))
(setq Y1 (nth 1 p1))
(setq Z1 (nth 2 p1))
(setq Y2 (+ Y1 100))
(setq p2 (getpoint p1 "\nУкажите точку 2: "))
(command "_3dpoly" p1 p2 "")
(setq obj (entlast))
(command "_copy" obj "" "_none" p1 "_none" p1)
(setq vla_obj (vlax-ename->vla-object obj))
(vla-Rotate3D vla_obj (vlax-3D-point (list X1 Y1 Z1)) (vlax-3D-point (list X1 Y2 Z1)) (/ Pi 2))
Про вращение можете почитать здесь: https://acad-prog.ru/3d-modelirovanie-v-autocad/
Вторая часть статьи: «Поворот 3Д объекта»
Здравствуйте , подскажите пожалуйста как в AvtoLisp соединить несколько линий ?
Здравствуйте! Вроде бы внимательно просмотрел Ваши уроки. Получается задать координаты точки (пусть даже центра круга) можно только через оператор list?
Да. Или верхнем апострофом ‘(0 0 0). Или указаниеv точки (setq bp (getpoint «\nУкажите точку: «))
Добрый день! Подскажите пожалуйста как вставить результат расчета в программе написанной на autolisp в чертеж в виде многострочного текста. Интересуют атрибуты команды ; (command «_.MText» ???? ???? ….)
(setq p1 (getpoint "\nУкажите точку: "))
(setq p2 (mapcar '+ (list 400 300 0) p1))
(setq Result (itoa (+ 4 3)))
(command "_.MText" p1 p2 Result "")
(setq p1 (mapcar '+ (list 0 200 0) p1))
(setq p2 (mapcar '+ (list 400 300 0) p1))
(setq Result2 (rtos (+ 4 7.7)))
(command "_.MText" p1 p2 Result2 "")
Здравствуйте ) Подскажите пожалуйста, такая проблема. Рисую прямоугольник по точкам, командой _line. В отладке вижу координаты точек, все нормально. Но при уменьшении масштаба до определенной величины (когда все мелко) вертикальные стороны рисуются точками и выводится сообщение о том, что создана линия нулевой длины. Соответственно вертикальные стороны вырождаются в точки и прямоугольник вырождается в линию. Вертикальные стороны не равны тем значениям, которые указаны в координатах. При увеличении масштаба все строится нормально. В чем может быть дело ? Голову себе уже сломал.
Немного поправлюсь. Не при изменении масштаба, а при изменении размеров экрана колесом мыши. Померил линейкой сторону прямоугольника при которой еще программа отрисовывает прямоугольник 40х25. Так вот, при уменьшении экрана так, что высота 25 мм равна 7 мм (померил линейкой по экрану) еще фигура строится. Если крутануть колесо и уменьшить экран на одну позицию, уже не строится. Текст программы простейший:
(DEFUN c:excToACad (/)
(setq a 40)
(setq b 60)
(setq p1 (getpoint «\nУкажите базовую точку:»))
(setq k1 (mapcar ‘+ p1 (list a 0)))
(setq k2 (mapcar ‘- k1 (list 0 b)))
(setq k3 (mapcar ‘- k2 (list a 0)))
;;;(command «_line» p1 k1 k2 k3 p1 «»)
(command «_line» p1 k1 «»)
(command «_line» k1 k2 «»)
(command «_line» k2 k3 «»)
(command «_line» k3 p1 «»)
)
Добавьте временное отключение привязки:
(command "_line" "_none" p1 "_none" k1 "")
(command "_line" "_none" k1 "_none" k2 "")
(command "_line" "_none" k2 "_none" k3 "")
(command "_line" "_none" k3 "_none" p1 "")
В момент построения привязки должны быть отключены. Например так:
(command "_line" "none" p1 "none" p2 "")