LISP или AutoLISP это традиционный язык программирования для AutoCAD. С его помощью можно создавать свои программы в любой области проектирования. Создание таких программ избавляет пользователя от типовых, рутинных операций и существенно повышают производительность работы в AutoCAD.
В этом уроке мы рассмотрим пример простой программы на языке LISP. Подробно разберем ее программный код. В следующих уроках, двигаясь от простого к сложному, мы будем ее постепенно усложнять и модифицировать. Я надеюсь, что в результате, вы получите знания, которые сделают вашу работу в Автокад более эффективной.
Приставленные примеры предполагают, что у читателя уже есть начальные знания работы в AutoCAD.
Для выполнения примера нам понадобиться только программа AutoCAD. Специальная инсталляция AutoLISP не требуется. Он поставляется с каждой копией AutoCADа.
И первое с чего мы должны начать – это поставить перед собой задачу. И в качестве примера я предлагаю написать программу, которая попросит нас указать базовую точку р1. и после указания, построит куб со сторонами 200.
Программный код мы будем писать в редакторе «Visual Lisp». Чтобы его открыть, в начале нужно запустить AutoCAD.
Далее на ленте выбираем вкладку «Управление» и на панели «Приложение» щелкаем на пункте «Редактор Visual Lisp»
Создаем новый файл: щелкаем на кнопку обведенную красным.
И в открывшимся окне, набираем текст нашей программы или копируем его с сайта
Программный код на языке LISP:
(DEFUN c:mp_kub (/ p1 p2 p3 p4 p5 p6 p7 p8) ; начало функции mp_kub
(setq p1 (getpoint "\nУкажите базовую точку : ")) ; запрос координат базовой точки
(setq p2 (polar p1 0 200)) ; определение координат точки р2
(setq p3 (polar p2 (/ pi 2) 200)) ; определение координат точки р3
(setq p4 (polar p3 pi 200)) ; определение координат точки р4
(setq p5 (polar p1 (/ pi 4) 200)) ; определение координат точки р5
(setq p6 (polar p2 (/ pi 4) 200)) ; определение координат точки р6
(setq p7 (polar p3 (/ pi 4) 200)) ; определение координат точки р7
(setq p8 (polar p4 (/ pi 4) 200)) ; определение координат точки р8
(setq osm (getvar "osmode")) ; запоминаем привязки пользователя
(setvar "osmode" 0) ; отключаем привязки
(command "_line" p1 p2 p3 p4 p1 "") ; рисуем передную грань
(command "_line" p5 p6 p7 p8 p5 "") ; рисуем задную грань
(command "_line" p1 p5 "") ; рисуем линию 1-5
(command "_line" p2 p6 "") ; рисуем линию 2-6
(command "_line" p3 p7 "") ; рисуем линию 3-7
(command "_line" p4 p8 "") ; рисуем линию 4-8
(setvar "osmode" osm) ; возвращает привязки пользователя
) ; окончание функции
Скачать программу Mp_kub.lsp (Размер файла: 449 bytes)
В программном коде после «;» можно оставлять свои комментарии, которые в дальнейшем никак не влияют на выполнение команды.
Давая имя командам и файлам, стараемся присвоить им уникальные имена. Чтобы в дальнейшем избежать пересечения со стандартными командами или с командами созданными другими пользователями. Я назову наш файл и команду «mp_kub» (подразумевая my program Kub)
В конце сохраняем нашу программу в удобном для вас месте. Я сохраняю ее в папке «D:/MyLisp» под именем «mp_kub».
Теперь, чтобы использовать нашу программу в AutoCADе, ее предварительно нужно загрузить. Щелкаем по кнопке выделенной зеленым.
Если программа набрана без ошибок. Ниже в окне «Консоль Visual LISP» появиться надпись о том, что наша программа загружена.
Переходим в AutoCAD, вводим «mp_kub» в командную строку и нажимаем Enter.
Появится подсказка: «Укажите базовую точку :» Щелкните в любой точки рабочего окна AutoCAD и он нарисует куб.
ДОПОЛНИТЕЛЬНЫЕ ПОЯСНЕНИЯ.
Давайте более подробно разберем функции языка LISP, которые мы использовали в программном коде.
(defun c:mp_kub (/ p1 p2 p3 p4 p5 p6 p7 p8) <выражения> )
Создание функции пользователя с именем «mp_kub».
Префикс «с:» означает, что эту функцию можно будет использовать как стандартную команду AutoCAD. Достаточно ввести имя в командную строку AutoCADа.
(/ p1 p2 p3 p4 p5 p6 p7 p8) – временные переменные, которые используются в выражениях.
(setq p1 (getpoint "\nУкажите базовую точку : "))
Функция getpoint – даёт возможность пользователю указать точку при помощи мыши.
Результатом функции будут координаты точки указанные пользователем.
«\nУкажите базовую точку : » — текст приглашения.
Префикс «\n» означает переход на новую командную строку.
Функция присвоения (setq p1 <значение>) позволяет сохранить <значение> в переменной p1.
(setq p2 (polar p1 0 200))
Функция (polar p1 0 200) вычисляет координаты точки отстоящей от точки р1 на расстояние 200 в направлении луча образующим с ось Х угол 0 радиан.
(setq p2 <значение>) — Затем эти координаты присваиваются р2.
(command "_line" p1 p2 p3 p4 p1 "")
Функция command выполняет стандартные функции AutoCADа. В нашем случаи проводит отрезки по точкам с координатами р1, р2, р3, р4, р1.
«_line» — имя стандартной функции AutoCAD.
«» — имитирует нажатие клавиши <Enter>.
Таким образом в этой статье мы узнали:
Как запускать редактор Visual Lisp.
Как создавать программу на языке Lisp.
Как загружать программу и как запускать ее на выполнение.
Чтобы лучше, понять, как работают функции, поэкспериментируйте с ними, поменяйте какие либо значения, посмотрите, как это повлияет на результат.
В дополнение к этому уроку смотрите видео: Пример простой программы на LISP.
В следующем уроке мы будем учится создавать кнопку для запуска своих программ.
Пишите в комментариях: все ли у вас получилось?; трудно ли было выполнить этот урок?; где у вас возникли трудности? Я с удовольствием отвечу на все ваши комментарии.
Если вы хотите получать новости с моего сайта. Оформляйте подписку.
До новых встреч.
«Автор: Михаил Орлов»
Михаил, хотелось увидеть уроки по стандартным командам автокада и как их реализовывать. Например, создание трехмерного тела с помощью команды «вращать» или определение длины отрезка от длины другого отрезка и т.д. А так все супер, спасибо за уроки.
Виталий, на счет урока по стандартным командам автокада. Я подумаю… Что нибуть обязательно сделаю.
Далее я не совсем понял, что имелось в виду: «определение длины отрезка от длины другого отрезка».
Михаил, вот Функция polar вычисляет координаты точки отстоящей от точки р1 в направлении луча
образующим с ось Х угол. А есть подобная команда для оси Z?
Виталий, такой стандартной функции нет. Но есть возможность прочитать значения координат по каждой оси отдельно (функция nth). Затем можно поменять знамение координат по нужной оси (или по нескольким осям). И соединить эти значения в точку с нужными координатами (функция list).
Вообще можно создать свою функцию на подобии polar, но оси Z. Пиши мне на почту: acadprog@gmail.ru. Опиши свою задачу, как можно подробно, я отвечу.
Михаил, здравствуйте! Помогите разобраться.
У меня есть две базовые точки, которые задает пользователь.
1. Надо, что бы ровно между ними появилась третья точка
2. Также над каждой из базовых точек появились ещё точка (Z задается пользователем)
Когда я узнаю все точки, я нарисую два отрезка из которых создам поверхность с помощью команды «П-СОЕД». Как использовать эту команду с помощью лиспа? Надо указать две линии, а как их (линии) задать, если нет команды GETLINE?
Заранее спасибо!
P.S. Не смог отправить письмо
Ответ выслал Вам на почту.
OMG, Михаил, пишите еще!! Я за час работы с Вашим сайтом сделал и узнал больше чем за 2 недели исследования форумов и книг!
Спасибо за простые и понятные уроки Михаил.
Спасибо, все получилось. Даже немного усовершенствовала куб:
И возник вопрос, почему при проверке нет ошибки, хотя я добавила новую переменную P9, а в описании функции я ее не добавила. Попробовав удалить все переменные из описания, тоже ошибки нет, программа работает. Зачем тогда вообще описывать их? Версия AutoCAD 2015
В AutoLISP по умолчанию все создаваемые переменные глобальные, т. е. они будут храниться в памяти программы AutoCAD, после завершения команды mp_kub (пока Вы не закроете Автокад). Чтобы сделать их локальными, их добавляют в описание функции DEFUN. И тогда после завершения команды mp_kub, они не болтаются в памяти AutoCAD.
Здравствуйте! Очень информативный сайт! Многое для себя почерпнул. Не подскажите как записать в переменную два строчных значения?
Разобрался. При помощи сцепления строк. Ещё раз спасибо за позновательные статьи!
Здравствуйте, как сделать обычные линии на Автолиспе осевыми ?
Если в чертеже уже есть осевые линии, то для последней построенной линии:
Спасибо
Спасибо, всё понятно написано
Спасибо огромное за уроки! Очень помогли!
Рад, что нашел Ваш сайт.
Единственное, 30 градусов = pi/6 — а не pi/3 — у Вас эта неточность и в видео, и в статье.
Михаил. Добрый день. Возможно ли Вам заказать приложение для AutoCad?
Да, конечно. Пришлите описание вашей программы на почту acadprog@gmail.com:
При попытке запустить программу вылетает сообщение: «Ошибка: cлишком мало аргументов»
Пришлите Ваш вариант программы на почту: acadprog@gmail.com. Я посмотрю, где ошибка.
Здравствуйте, я полный ноль в программировании, а потому застрял на 1-й минуте урока. Как прописать первую функцию «getpoint»? Вы нажали на горячую клавишу? Если да то на какую? Спасибо.
Просто наберите ее с клавиатуры.
У меня куб почему-то получается плоским (хотя чертеж 3D — то бишь я там могу чертить по 3м осям). Буду рад комментариям
Здесь он и должен быть плоским. 3D может посмотреть здесь:
https://acad-prog.ru/3d-modelirovanie-v-autocad/
https://acad-prog.ru/3d-modelirovanie-bolt-s-rezboj/
Подскажите пожалуйста, для чего в скрипе предусмотрено отключение привязок? (setvar «osmode» 0)
Чтобы, при построения отрезка, программа случайно не привязалось к соседней точки, которая находится не далеко от нужной.
Спасибо.