CAD-страница НП | Статьи | English | Download

AutoLISP на примерах: начинаем

(из книги "AutoCAD®: секреты, которые должен знать каждый пользователь")

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

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

1. В командной строке AutoCAD введите следующее: (defun C:OO()(setvar "osmode" 4143))<Enter>
2. Удалите все установки объектной привязки на вкладке Object Snap (Объектная привязка) диалогового окна Drafting Settings (Режимы рисования).
3. Введите в командной строке OO<Enter>.

Поздравляю, вы только что написали программу AutoLISP. Чтобы увидеть, как она работает, проверьте еще раз установки для объектной привязки. Мы снова вернемся к этой программе после того, как я расскажу немного теории. После прочтения данной главы вы будете придумывать и создавать всевозможные новые функции AutoLISP.

Общие сведения

AutoLISP  ≈ мощный инструмент, при помощи которого вы можете за считанные минуты писать новые пользовательские команды для AutoCAD. Несмотря на то, что с AutoCAD часто используются другие языки программирования (самые известные из них Visual Basic for Applications (VBA) и C++), AutoLISP особенно полезен для пользователей AutoCAD, так как он основывается на собственных командах AutoCAD. Возможно, это не самый совершенный из языков программирования, но какая разница, если им легко пользоваться? Я знаком с признанным специалистом ≈ программистом на VBA, но и он пользуется языком AutoLISP для некоторых программ, относящихся к AutoCAD.

Язык программирования AutoLISP впервые появился в AutoCAD R2.18. Его раннее появление ≈ одна из причин, по которым AutoCAD стал сегодня самой распространенной CAD-программой. Существование языка программирования дало сообразительным пользователям возможность существенно улучшить AutoCAD путем добавления новых функций. Часто эти функции в последующих релизах становились командами, но даже если такого не происходило, AutoCAD становился более удобным, чем конкурирующие приложения. Несмотря на появление, впоследствии, других языков программирования, AutoLISP по-прежнему остается главным средством для создания пользовательских функций AutoCAD.

AutoLISP относится к языку LISP (List Processing), появившемуся в конце 1950-х годов. LISP часто упоминается как второй из старейших языков программирования, все еще использующихся. Самым старым из существующих считается Fortran. Помимо использования в AutoCAD, LISP также широко применяется в программировании искусственного интеллекта.

Visual LISP (VLISP или VLIDE) появился в AutoCAD 2000 в качестве основного средства программирования AutoLISP. В нем присутствует развитая среда программирования с инструментами поиска ошибок и компилятором, а также с набором новых функций, включая известные как реакторы. Несмотря на то, что я представляю некоторые возможности редактора Visual LISP в этой книге, я не могу осветить его достаточно полно. Если вы столкнетесь со скрытой ошибкой в AutoLISP, вы сможете узнать о специальных возможностях редактирования в Visual LISP и большом наборе его функций в справочной системе AutoCAD или при помощи вашей любимой поисковой системы ссылок.

    Вы можете получить доступ к документации об AutoLISP, Visual LISP и формате Drawing Exchange File (DXF), если в меню AutoCAD выберете Help | Additional Resources | Developer Help (Справка | Дополнительные ресурсы | Документация для разработчиков).

Команды AutoCAD

Поскольку некоторые команды и многие инструменты Express Tools написаны на языке AutoLISP, большинство из нас постоянно пользуются LISP-программами, не догадываясь об этом. В директории C:\Program Files\AutoCAD 2007\Express содержатся 70 программ на AutoLISP, включая следующие программы, настолько полезные, что вы можете считать их собственными командами AutoCAD:

  • aliasedit.lsp
  • aspace.lsp
  • attout.lsp
  • breakl.lsp
  • bscale.lsp
  • burst.lsp
  • dimassoc.lsp
  • flatten.lsp
  • layoutmerge.lsp
  • lman.lsp
  • overkill.lsp
  • saveall.lsp
  • tcase.lsp
  • textmask.lsp
  • txtexp.lsp

    Поиск программ на AutoLISP

    Вы можете найти другие программы на языке AutoLISP на многочисленных Интернет-сайтах, в книгах, журналах, а также в компьютерах ваших друзей и коллег. В качестве замечательного начала можете посетить сайт международной группы пользователей Autodesk User Group International по адресу www.AUGI.com. Другие сайты появляются и исчезают, поэтому я не буду их здесь перечислять. В результате поиска в интернет вы найдете миллионы программ на сотнях тысяч сайтов. Многие из этих программ бесплатны, AutoLISP-программисты щедро делятся результатами своей работы. (Не забывайте об этом, когда сами научитесь писать полезные программы.) Проверяйте информацию об авторских правах для каждой программы, и вы обязательно найдете требования автора. Не забывайте, программы на AutoLISP являются интеллектуальной собственностью их авторов.

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

    Написание программ AutoLISP

    Я назвал эту главу "AutoLISP на примерах", потому что для того, чтобы показать ключевые свойства программирования, я оперирую примерами кодов. Эта глава не предназначена для опытных программистов, она написана для пользователей AutoCAD. Когда я впервые решил попробовать AutoLISP, ссылка, к которой я обратился, начиналась с рассуждений об атомах, списках, лямбда-выражениях, функциях CONS и MAPCAR, с примерами длиной в одну строку, которые для меня ничего не значили. У меня была определенная цель ≈ написать команду, которая бы автоматически помещала один чертеж в другой. Я не смог решить задачу до тех пор, пока не рассмотрел существующие программы и не понял, как они работают. Вспоминая о собственном опыте, я собираюсь привести вам примеры программ и объяснить, как они работают. Все что от вас требуется ≈ ввести их без ошибок, попробовать и прочитать пояснения. Это так просто.

    Моя первая программа AutoLISP

      Впервые я преподавал основы работы в AutoCAD в 1989 году. Я с самого начала знал, что мне придется оценивать работы студентов в электронном виде, чтобы проверить точность геометрии, поэтому каждую неделю я загружал все чертежи. Командами DIST (ДИСТ) и ID (КООРД) я проверял размеры и местоположение элементов, увеличивал области, в которых наиболее вероятны ошибки, и всеми другими способами старался обнаружить неточности и внести нужные исправления. Но, имея 60 студентов, каждый из которых делает по чертежу в неделю, я тратил на проверку чертежей все свое время. Тогда я предпринял мозговой штурм, вы, наверное, тоже о нем подумали, когда начали читать это примечание. Почему бы не поместить мой чертеж поверх работы студента, в отдельный слой, с типом линий и цветом, которым студенты не пользуются? Таким образом, я бы смог избавиться от ряда шагов.
      Этот способ помог, но недостаточно. Я решил автоматизировать процесс, что означало, что мне необходимо срочно изучить AutoLISP. Мне показалось несложным создать новую команду при помощи функции DEFUN и выполнять команды AutoCAD из программы AutoLISP. Но моя программа не работала. После часов безуспешных попыток я открыл все программы AutoLISP, которые смог найти, в надежде, что какая-либо из них имеет дело с файлами чертежей. И я обнаружил интересную деталь: если в программе имеется ссылка на имя файла, в пути файла имя файла и папки разделяются двойной обратной наклонной чертой. Неужели из-за этого я не мог вставить чертеж? Неужели все так просто?
      Сразу скажу: да. Я был поражен! Проверка чертежей для трех классов начинающих перестала быть проблемой после того, как я добавил еще функций в программу проверки. Студенты вовремя получали свои работы, а у меня оставалось больше свободного времени, которое я мог потратить на повышение качества обучения. Для меня AutoLISP ≈ это, прежде всего, возможность заниматься более интересной работой.

    Структура программы

    Я хочу, чтобы вы начали писать программы, но при этом избежали некоторых распространенных ошибок. Для этого вы должны иметь представление о структуре программ AutoLISP. В программировании структура программы не менее важна, чем грамматика языка.

  • Каждая программа содержит одну или несколько функций AutoLISP, таких как DEFUN, GETPOINT, + и .
  • Имя каждой функции предваряется открывающей скобкой.
  • Каждой открывающей скобке должна соответствовать закрывающая скобка.
  • Пробелы и кавычки используются для разделения компонентов внутри скобок.
  • Если необходимы аргументы, они указываются после имени функции.

    Рассмотрим в качестве примера вычислительную функцию. Поскольку функция деления в AutoLISP обозначается наклонной чертой, синтаксис для деления одного числа на другое выглядит следующим образом: (/ 4.0 2).

    За открывающей скобкой следует функция /, за ней, по крайней мере, один пробел, за которым, в свою очередь, два аргумента, разделенных пробелами ≈ числитель 4.0 и делитель 2, за ними следует закрывающая скобка. Эта функция может быть переведена как "разделить 4.0 на 2". Другие функции, такие как (* 4.0 2), (+ 4.0 2) и (- 4.0 2) имеют аналогичный формат. Эта структура отличается от той, к которой вы привыкли, изучая математику. Не пытайтесь использовать (2 + 2), такая функция не будет работать, так как первый элемент в скобках ≈ целое число, а не функция.

    Ввод программ в AutoCAD

    Вы можете придумать любую программу, но до тех пор, пока вы не введете ее в AutoCAD, ваша программа будет бесполезной. К сожалению, нет способа напрямую загрузить ваши мысли в AutoCAD, поэтому придется воспользоваться клавиатурой. Есть несколько способов заставить AutoCAD выполнить программу на языке AutoLISP:

  • Ввести программу в командной строке.
  • Загрузить текстовый файл, содержащий код AutoLISP.
  • Использовать функцию загрузки в редакторе Visual LISP.

    Ввод в командной строке обычно применяется только для тестирования коротких строк кода. Тем не менее я часто пишу таким способом очень короткие программы, особенно когда хочу сделать что-то специфическое для определенного чертежа и не вижу смысла сохранять программу. Недавно я таким способом создавал полилинии в виде окружностей. Не думаю, что мне еще раз придется заниматься тем же, поэтому я просто ввел программу в командной строке. Когда я закончил сеанс работы в AutoCAD, программа также завершила работу.

    Заглавные или строчные?

      В AutoLISP регистр имеет значение только в нескольких случаях.
    • Когда вы помещаете управляющий символ, такой как символ, обозначающий начало строки, в кавычках, например, в подсказке он должен быть строчным: "\nSelect point: ".
    • Когда в процедуре открытия файла вы указываете, что хотите сделать (читать, написать или дополнить), вы должны также пользоваться строчными символами, например: (open "C:\\file.dwg" "r").
      Другими словами, вы сами решаете, использовать заглавные или строчные символы. Главное, будьте последовательны, чтобы впоследствии не запутаться самому.

    Давайте в первую очередь рассмотрим процедуру ввода в командной строке.

    Ввод в командной строке

    Вернемся к программе, рассмотренной во вступлении к этой главе. Чтобы ввести эту программу на AutoLISP в командной строке, вы проделали следующее:

  • Набрали в командной строке (defun C: OO()(setvar "osmode" 4143))<Enter>. Если вы не допустили ошибок, в командной строке появилась подсказка C:OO.
  • Чтобы поверить программу, вы очистили существующие настройки объектной привязки.
  • Чтобы применить новую, созданную вами команду, вы набрали ОО в командной строке. В ответ вы должны были получить 4143.
  • Когда вы снова проверили настройки объектной привязки, вы должны были увидеть следующие установки для объектной привязки: End (КОН), Mid (СЕР), Cen (ЦЕН), Nod (УЗЕ), Int (ТВС), Ext (ПРО).
  • Вы только что описали новую команду AutoCAD под именем OO. Когда вы ее вводите, значение системной переменной OSMODE, которая управляет объектной привязкой, меняется на 4143. Это мое стандартное значение для этой переменной. Мне нравится эта команда, потому что я часто изменяю установки привязки для нескольких операций с каким-либо объектом. Когда я хочу вернуть свои обычные настройки, намного быстрее ввести OO, чем открывать диалоговое окно Drafting Settings (Режимы рисования).

      Системные переменные в AutoCAD (иногда их именуют setvars) управляют многими аспектами программы. Значения всех системных переменных AutoCAD (а их в AutoCAD 2007 около 550) можно увидеть при помощи функции GETVAR в AutoLISP. Значения многих переменных также можно изменить функцией SETVAR. К таким системным переменным, например, относится OSMODE. Чем лучше вы знакомы с системными переменными, тем эффективнее сможете пользоваться AutoLISP. Вы можете увидеть все переменные, если введете в командной строке _setvar<Enter>?<Enter>*<Enter> или обратитесь к справочной системе AutoCAD, чтобы получить список переменных в алфавитном порядке.

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


    CAD-страница НП | Статьи | English | Download