Урок 2. Пример простой программы на LISP.

LISP или AutoLISP это традиционный язык программирования для AutoCAD. С его помощью можно создавать свои программы в любой области проектирования. Создание таких программ избавляет пользователя от типовых, рутинных операций и существенно повышают производительность работы в AutoCAD.

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

Приставленные примеры предполагают, что у читателя уже есть начальные знания работы в AutoCAD.

Для выполнения примера нам понадобиться только программа  AutoCAD. Специальная инсталляция AutoLISP не требуется. Он поставляется с каждой копией AutoCADа.

И первое с чего мы должны начать – это поставить перед собой задачу. И в качестве примера я предлагаю написать программу, которая попросит нас указать базовую точку р1. и после указания, построит куб со сторонами 200.

Пример программы LISP

Программный код мы будем писать в редакторе «Visual Lisp». Чтобы его открыть, в начале нужно запустить AutoCAD.

Далее на ленте выбираем вкладку «Управление» и на панели «Приложение»  щелкаем на пункте «Редактор Visual Lisp»

редактор Visual lisp

Создаем новый файл: щелкаем на кнопку обведенную красным.

Visual lisp

И в открывшимся окне, набираем текст нашей программы или копируем его с сайта

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 Скачать программу Mp_kub.lsp (Размер файла: 449 bytes)

В программном коде после «;» можно оставлять свои комментарии, которые в дальнейшем никак не влияют на выполнение команды.

Давая имя командам и файлам, стараемся присвоить им уникальные имена. Чтобы в дальнейшем избежать пересечения со стандартными командами или с командами созданными другими пользователями. Я назову наш файл и команду «mp_kub» (подразумевая my program Kub)

В конце сохраняем нашу программу в удобном для вас месте. Я сохраняю ее в папке «D:/MyLisp» под именем «mp_kub».

Пример программы LISP

Теперь, чтобы использовать нашу программу в AutoCADе, ее предварительно нужно загрузить. Щелкаем по кнопке выделенной зеленым.

lisp

Если программа набрана без ошибок. Ниже в окне «Консоль Visual LISP» появиться надпись о том, что наша программа загружена.

консоль Visual lisp

Переходим в AutoCAD, вводим «mp_kub» в командную строку и нажимаем Enter.

Пример программы LISP

Появится подсказка: «Укажите базовую точку :» Щелкните в любой точки рабочего окна AutoCAD и он нарисует куб.

Пример программы LISP

 

ДОПОЛНИТЕЛЬНЫЕ ПОЯСНЕНИЯ.

Давайте более подробно разберем функции языка 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))

Пример программы LISP

Функция (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.

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

Пишите в комментариях: все ли у вас получилось?; трудно ли было выполнить этот урок?; где у вас возникли трудности? Я с удовольствием отвечу на все ваши комментарии.

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

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

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

Google

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

29 комментарии на “Урок 2. Пример простой программы на LISP.

  1. Виталий 29.04.2014 09:42

    Михаил, хотелось увидеть уроки по стандартным командам автокада и как их реализовывать. Например, создание трехмерного тела с помощью команды «вращать» или определение длины отрезка от длины другого отрезка и т.д. А так все супер, спасибо за уроки.

    • Михаил 29.04.2014 20:11

      Виталий, на счет урока по стандартным командам автокада. Я подумаю… Что нибуть обязательно сделаю.
      Далее я не совсем понял, что имелось в виду: «определение длины отрезка от длины другого отрезка».

  2. Виталий 05.05.2014 07:49

    Михаил, вот Функция polar вычисляет координаты точки отстоящей от точки р1 в направлении луча
    образующим с ось Х угол. А есть подобная команда для оси Z?

    • admin 05.05.2014 10:49

      Виталий, такой стандартной функции нет. Но есть возможность прочитать значения координат по каждой оси отдельно (функция nth). Затем можно поменять знамение координат по нужной оси (или по нескольким осям). И соединить эти значения в точку с нужными координатами (функция list).

    • admin 05.05.2014 10:50

      Вообще можно создать свою функцию на подобии polar, но оси Z. Пиши мне на почту: acadprog@gmail.ru. Опиши свою задачу, как можно подробно, я отвечу.

  3. Виталий 05.05.2014 16:11

    Михаил, здравствуйте! Помогите разобраться.
    У меня есть две базовые точки, которые задает пользователь.
    1. Надо, что бы ровно между ними появилась третья точка
    2. Также над каждой из базовых точек появились ещё точка (Z задается пользователем)
    Когда я узнаю все точки, я нарисую два отрезка из которых создам поверхность с помощью команды «П-СОЕД». Как использовать эту команду с помощью лиспа? Надо указать две линии, а как их (линии) задать, если нет команды GETLINE?
    Заранее спасибо!
    P.S. Не смог отправить письмо

    • admin 06.05.2014 07:30

      Ответ выслал Вам на почту.

  4. Благодарный 21.07.2014 17:47

    OMG, Михаил, пишите еще!! Я за час работы с Вашим сайтом сделал и узнал больше чем за 2 недели исследования форумов и книг!

  5. Антон 24.11.2014 20:10

    Спасибо за простые и понятные уроки Михаил.

  6. Анна 06.02.2015 07:26

    Спасибо, все получилось. Даже немного усовершенствовала куб:

    (DEFUN c:mp_kub	(/ p1 p2 p3 p4 p5 p6 p7 p8) ;
      (setq p1 (getpoint "\nУкажите базовую точку : "))
      (setq p9 (getint "\nУкажите сторону куба:"))
      (setq p2 (polar p1 0 p9))
      (setq p3 (polar p2 (/ pi 2) p9))
      (setq p4 (polar p1 (/ pi 2) p9))
    
      (setq p5 (polar p1 (/ pi 4) p9))
      (setq p6 (polar p2 (/ pi 4) p9))
      (setq p7 (polar p3 (/ pi 4) p9))
      (setq p8 (polar p4 (/ pi 4) p9))
      (command "_line" p1 p2 p3 p4 p1 "")
      (command "_line" p5 p6 p7 p8 p5 "")
      (command "_line" p1 p5 "")
      (command "_line" p2 p6 "")
      (command "_line" p3 p7 "")
      (command "_line" p4 p8 "")
    )

    И возник вопрос, почему при проверке нет ошибки, хотя я добавила новую переменную P9, а в описании функции я ее не добавила. Попробовав удалить все переменные из описания, тоже ошибки нет, программа работает. Зачем тогда вообще описывать их? Версия AutoCAD 2015

    • Михаил Орлов 06.02.2015 07:58

      В AutoLISP по умолчанию все создаваемые переменные глобальные, т. е. они будут храниться в памяти программы AutoCAD, после завершения команды mp_kub (пока Вы не закроете Автокад). Чтобы сделать их локальными, их добавляют в описание функции DEFUN. И тогда после завершения команды mp_kub, они не болтаются в памяти AutoCAD.

  7. Иван 10.03.2016 09:18

    Здравствуйте! Очень информативный сайт! Многое для себя почерпнул. Не подскажите как записать в переменную два строчных значения?

    • Иван 10.03.2016 10:21

      Разобрался. При помощи сцепления строк. Ещё раз спасибо за позновательные статьи!

  8. Эзиз 08.05.2016 20:34

    Здравствуйте, как сделать обычные линии на Автолиспе осевыми ?

    • Михаил Орлов 09.05.2016 13:30

      Если в чертеже уже есть осевые линии, то для последней построенной линии:

      (vl-load-com)
      (setq vla_line (vlax-ename->vla-object (entlast)))
      (vla-put-Linetype vla_line "осевая")
  9. Лёха 01.11.2016 08:23

    Спасибо, всё понятно написано

  10. Михаил 09.02.2017 07:32

    Спасибо огромное за уроки! Очень помогли!
    Рад, что нашел Ваш сайт.

    Единственное, 30 градусов = pi/6 — а не pi/3 — у Вас эта неточность и в видео, и в статье.

  11. Николай 31.03.2017 03:59

    Михаил. Добрый день. Возможно ли Вам заказать приложение для AutoCad?

    • Михаил Орлов 31.03.2017 13:54

      Да, конечно. Пришлите описание вашей программы на почту acadprog@gmail.com:

      1) Исходные данные
      2) Что делает пользователь
      3) Что должно получиться в результате
  12. Игорь 13.02.2018 12:41

    При попытке запустить программу вылетает сообщение: «Ошибка: cлишком мало аргументов»

    • Михаил Орлов 14.04.2018 15:12

      Пришлите Ваш вариант программы на почту: acadprog@gmail.com. Я посмотрю, где ошибка.

  13. Виталий 12.03.2018 17:24

    Здравствуйте, я полный ноль в программировании, а потому застрял на 1-й минуте урока. Как прописать первую функцию «getpoint»? Вы нажали на горячую клавишу? Если да то на какую? Спасибо.

    • Михаил Орлов 14.04.2018 14:46

      Просто наберите ее с клавиатуры.

  14. MARK 07.08.2019 08:08

    У меня куб почему-то получается плоским (хотя чертеж 3D — то бишь я там могу чертить по 3м осям). Буду рад комментариям

  15. Алексей 29.11.2019 05:45

    Подскажите пожалуйста, для чего в скрипе предусмотрено отключение привязок? (setvar «osmode» 0)

    • Михаил Орлов 11.03.2020 09:06

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

Оставить комментарий

Ваш mail не будет опубликован.

Вы можете использовать HTML теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>