Forge, API и программирование – Русский – только для чтения
Задавайте вопросы и делитесь знаниями по Autodesk Forge и программированию на API программного обеспечения Autodesk
отмена
Отображаются результаты для 
Показать  только  | Вместо этого искать 
Вы имели в виду: 
Ответить
Сообщение 1 из 9
snowyhedg
3949 просмотров, 8 ответов

AutoLISP с нуля

Хочу изучить лисп.

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

Есть ли смысл изучать LISP или можно сразу на AutoLISP переключаться?

 

P.S. Думаю эта тема не только мне будет интересна, поэтому поддерживающие, welcome к обсуждению

8 ОТВЕТ 8
Сообщение 2 из 9
kpblc2000
в ответ: snowyhedg

Может, лучше поставить какую-нибудь не очень сложную и большую задачу, а в ответ - код с построчным комментированием? 🙂

Находите сообщения полезными? Поставьте "НРАВИТСЯ" этим сообщениям! | Do you find the posts helpful? "LIKE" these posts!
На ваш вопрос успешно ответили? Нажмите кнопку "УТВЕРДИТЬ РЕШЕНИЕ" | Have your question been answered successfully? Click "ACCEPT SOLUTION" button.


Алексей Кулик aka kpblc | Aleksei Kulik aka kpblc Facebook | LinkedIn
autolisp.ru
Техническая поддержка программистов Autodesk в СНГ
Библиотека пользовательских lisp-функций | Custom Lisp-function library

Сообщение 3 из 9
ElpanovEvgeniy
в ответ: snowyhedg

Привет, Лена! 🙂

Всегда готов помочь!

 

по поводу задач, для начала стоит взять простые - функционал - односложная операция в акаде.

К вопросу о языке, конечно сразу AutoLISP. С таким учителем как Алексей, тебе нечего бояться...

 

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

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

 

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

 

Хорошего дня.

Сообщение 4 из 9
snowyhedg
в ответ: ElpanovEvgeniy

Женя, спасибо за поддержку!

Я таки взялась за это дело.

Задача на сегодняшний день следующая: замена путей файлов (см. рис)

Лисп-файл я буду подкреплять к корпоративному файлу адаптации, т.е. при запуске AutoCAD у пользователя он будет исполняться, мне необходимо изменить остальные пути из списка. Не все, но большая часть.

 

Леша kpblc уже писал мне для папки support, но мне сложно читать код, я не знаю основных принципов и синтаксиса. Собственно, с этого и хочу начать: что за скобки, зачем, куда вставляются.

Сообщение 5 из 9
snowyhedg
в ответ: kpblc2000

Леша, спасибо за ответ!

Комментарии - это очень здорово, но как я уже ответила Жене, мне сложно читать код в принципе. Воспринимайте меня как студента первого курса...я ничего не знаю, дайте ссылку, где почитать 🙂

 

Я начала читать вики-учебник вот тут: http://ru.wikibooks.org/wiki/%D0%9B%D0%B8%D1%81%D0%BF

А также пробую пройти курс на интиуите, но с первой лекции по скриншотам похоже, что написано на версию 2002-2004-2006...

Сообщение 6 из 9
ElpanovEvgeniy
в ответ: snowyhedg

да уж, посмотрел в нете, похоже стоит самому писать статью, как начать писать на лиспе...

Сообщение 7 из 9
snowyhedg
в ответ: ElpanovEvgeniy

о, это было бы совсем замечательно!

Сообщение 8 из 9
IgorSkljarov8965
в ответ: snowyhedg

Начинать сразу с автолиспа. Понимание программирования не обязательно - придет в процессе гарантировано:-). Нужно неплохо знать автокад. Далее пример текста занятия. Усвоение материала проверено на практике. Текст составлен мною на основе очных практических занятий. Программирование осваивал самостоятельно (с 1991 года примерно), образование инженер-дорожник. 

С уважением, Скляров И.Б.

  Занятие 1

в котором мы будем учиться приказывать и выражаться

Тема: Программа. Функция. Выражение. Данные. Переменные.

Компьютерная программа – это последовательность команд для компьютера. Назначение программы  - что-то рассчитать (или начертить, или и то, и другое). Условно, программу можно разделить на три части:

  1.     Ввод исходных данных.
  2.     Какие либо расчеты на основе введенных данных.
  3.     Вывод результата.

 

Т.е. в начале программы идут команды, которые обеспечивают ввод (или сбор) исходных данных, затем идет часть команд, которые эти данные обсчитывают, и последние из этой последовательности команд производят вывод результата. Иными словами, показывают человеку, что получилось.

Эти три части могут в одной программе повторяться или идти вперемешку. Но такую программу можно “поделить” на подпрограммы в соответствии означенному принципу.

Итак, программа – это последовательность команд, или, иными словами, “приказов” (в нашем случае, автокаду) сделать что-то. Поскольку компьютер абсолютный педант, то и приказы ему нужно отдавать четко, ясно и однозначно.

Четко” – это значит правильно, без опечаток, писать имена команд (функций) и вообще все слова и цифры, что вы пишете в программе, “ясно” означает, что ставить слова в приказе нужно в определенном порядке, “однозначность” обязывает применять слова, подходящие по смыслу.

Такой вот приказ в автолиспе называется выражением. Но прежде чем прикоснуться к таинству записи выражений, лучше познакомиться с такой штуковиной, как функции автолиспа. Кратко: в автокаде есть команды, в автолиспе есть функции. Разница: команды автокада запрашивают данные у пользователя, функциям требуются в процессе написания программы. Т.е., описывая функцию, программист уже должен знать ответы на ее вопросы! Эти ответы называются аргументами функции, а, попросту говоря, это данные, которые она, функция, обработает.

Хочется добавить особо, что в автолиспе термин “функция” следует трактовать как нечто функционирующее, выполняющее что-то, т.е. некое действие. Меня, к примеру, в начале знакомства с этим языком и одновременно с программированием несколько сбили с толку школьные воспоминания о функциях и графиках. Здесь же, повторюсь, функция – это приказ компьютеру в лице автокада что-то сделать.

Чтобы выпутаться из этих формулировок, вот пример.

Вспомним работу команд в акаде. Для отрисовки линии есть команда “отрезок” (LINE). При вызове она запрашивает первую точку, вторую  и рисует отрезок. Пользователь мог указать любую точку пространства. Отметим это.

Представим теперь, что есть в Лиспе некая функция “рубить”. Как ее использовать мы должны узнать в справочнике по функциям. Лезем, якобы, в справочник. Читаем.

 

«Функция «рубить» выполняет рубление чего-то чем-то. В программе записывается так:

 

(рубить чем что),

 

где

 

рубить                     - имя функции;

чем                 - первый аргумент, на месте которого в программе следует писать название инструмента(топор, зубило). Тип аргумента: строка, регистр букв не имеет значения;

что                - второй аргумент, на месте которого в программе следует писать часть название разрубаемого «тела». Тип: строка, регистр букв не имеет значения.

 

Пример.

 

(рубить "топор" "полено")        - правильно;

 

(рубить "полено" "топор")        - неправильно»

 

Следовательно, при использовании функции «рубить», оказывается, уже в программе нужно указать, чем и что рубить. А откуда берутся «топор» и «полено»?

Дело в том, что мы должны составить программу так, что вначале она выяснит, что и чем в данном случае надо, т.е.соберет исходные данные, а потом передаст эти данные уже в функцию «рубить». Собирая каждый раз различные данные, мы порубим в лапшу все что надо.

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

  1.     Выражением будем называть заключенную в круглые скобки запись функции со всеми ее аргументами.
  2.     Выражения автолиспа записываются в круглых скобках, на первом месте пишется функция, затем ее аргументы.
  3.     У функции могут быть обязательные аргументы – это столько и такого типа данные, для обработки которых и создана данная функция. Далее мы увидим, что функция может быть и вовсе без аргументов или могут быть необязательные.
  4.     Данные делятся на какие-то типы (строка, целое число, вещественное число и т.д.)
  5.     Ясно, что точное применение функций, т.е. ее возможности и ограничения, изучается по документации.
  6.     Примерно таким образом функции описываются в каталоге функций автолиспа, т.е. в документации.

 

 

Вернемся к теме. Данные в автолиспе делятся на типы. Для начала рассмотрим целые числа, вещественные числа и строки.

Целые числа – это рациональные числа, т.е. состоящие только из цифр. Например, 1, 2, -3, -12545. Сюда относится и 0.

Вещественные числа состоят из цифр и десятичной точки. Например, 1.0, -1.0, -200.001.

Строки – это последовательность символов в кавычках. Проще говоря, все что мы можем ввести с клавиатуры, взятое в кавычки. Например, "1", "1.0", "йцукен", "123йцукен456", "!№;%".

Если в программе мы передаем данные в функцию в "натуральном" виде, т.е. аргументами будут строковые или числовые данные, то при каждой работе программы функция будет обрабатывать только эти, постоянные, данные. Они называются константами, так как текст программы не меняется. Он пишется как бы навсегда.

Для передачи в функцию различных данных для обработки наряду с константами мы часто будем использовать так называемые переменные. Это ни что иное, как поименованное место в памяти компьютера, т.е. способ хранить нечто в памяти. Этот механизм работает так же, как и файлы, в которых хранятся наши чертежи и всякие другие документы. Т.е. для сохранения данных нужно задать имя и собственно данные. При сохранении других данных под этим именем, первоначальные пропадают однозначно. В отличие от операционной системы, тут вас, однако, никто не одернет с интонациями Б.Гейтса: «А Вы точно уверены, что хотите удалить содержимое этой переменной?»

 

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

(setq имя1 данные1 имя2 данные2 … …)

 

Примечание. Запись выражений будет раскрашена так, как это делается в среде разработки лисп-приложений VisualLisp, про которую речь пойдет позже. А пока – привыкайте.

 

Для описания функции воспользуемся особым приемом, который назовем «способ чтения выражений». Поскольку функция – это действие, то и фразу начинаем с глагола:

- Запомнить под именем имя1 данные1, а под именем имя2 данные2 и т.д.

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

Выражения автолиспа можно вводить прямо в командной строке автокада (естественно в круглых скобках). «Ввести выражение в командной строке» означает напечатать его и нажать Enter. Попробуйте:

 

Command: (setq name1 1)

 

Command: (setq name2 1.0)

 

Command: (setq name3 ку-ку)

 

Command: (setq any 127.333)

 

Заметим, что после каждого нажатия Enter, в командной строке печатается именно то значение, которое мы запоминали в переменную.  Это называется «функция вернула результат вычисления». Результатом вычисления функции setq  является последнее переданное ей значение, которое она запомнила в соответствующую переменную. А, кстати, запомнила ли? Для чтения значения переменной в автокаде нужно в командной строке ввести имя этой переменной, предварив восклицательным знаком. Вот так:

 

Command: !name1

 

Command: !name2

 

Command: !name3

 

Command: !any

 

Автокад нам сразу же напечатает значение переменной, если оно есть. А если нет? Переменную bjaka мы не задавали («запомнить что-то под каким-то именем» так же называется «задание переменной»):

 

Введем !bjaka, автокад вернет nil. Это значит, в такой переменной ничего не храниться. Или, иными словами, такая переменная не задана. Теперь еще один эксперимент. Введите:

 

Command: (setq name1 name2)

 

а затем посмотрим что в name1:

 

Command: !name1

 

Ясно, что в name1 записалось значение переменной name2. Еще попробуем.

Сначала вспомним, что имеем:

 

Command: !name1

 

Command: !name3

 

Command: !any

 

 

Теперь:

 

Command: (setq name1 name3 name3 any)

 

и посмотрим опять:

 

Command: !name1

 

Command: !name3

 

Command: !any

 

Любому толковому курсанту нашего курса сразу ясно, что в name1 запомнилось значение name3, а потом в name3 запомнилось то, что было в переменной any. И это правильно. Автолисп вычисляет, как и мы, слева направо, сверху вниз.

  

Выводы:

 

  1. Автолисп умеет запоминть данные в так называемых переменных.
  2. Для создания переменных применяется функция setq.
  3. Ни какого предварительного действия не требуется. В других языках переменные необходимо предварительно объявлять, описывать их тип (целое, вещественное число, строка и т.д.). У нас все просто – setq ее и все. Какой тип данных передали в нее, такой и хранится. Имя может быть совершенно не связано с хранящимся значением, поскольку программист может быть бестолковым, а автолисп таких условий не ставит.
  4. Имена нужно давать осмысленные, чтобы можно было догадаться хотя бы о типе содержимого. Этой рекомендации можно избегать ну в очень маленьких программках.
  5. При передаче нового значения в переменную то, что в ней уже есть – бесследно исчезает.

Задание 1.

    • Прочитать в руководстве соответствующий материал про выражения автолиспа, переменные, типы данных.
    • Прочитать описание функции setq.
    • Решить задачу: у вас есть две переменные: a1 и a2. В первой хранится число 13.0, а во второй строка «ляля». Вопрос: как поменять значения переменных местами, из одной в другую? Решение проверить на практике.
Теги (2)
Сообщение 9 из 9
IgorSkljarov8965
в ответ: snowyhedg

Начинать сразу с автолиспа. Понимание программирования не обязательно - придет в процессе гарантировано:-). Нужно неплохо знать автокад. Далее пример текста занятия. Усвоение материала проверено на практике. Текст составлен мною на основе очных практических занятий. Программирование осваивал самостоятельно (с 1991 года примерно), образование инженер-дорожник. 

С уважением, Скляров И.Б.

 

  Занятие 1

в котором мы будем учиться приказывать и выражаться

Тема: Программа. Функция. Выражение. Данные. Переменные.

Компьютерная программа – это последовательность команд для компьютера. Назначение программы  - что-то рассчитать (или начертить, или и то, и другое). Условно, программу можно разделить на три части:

  1.     Ввод исходных данных.
  2.     Какие либо расчеты на основе введенных данных.
  3.     Вывод результата.

 

Т.е. в начале программы идут команды, которые обеспечивают ввод (или сбор) исходных данных, затем идет часть команд, которые эти данные обсчитывают, и последние из этой последовательности команд производят вывод результата. Иными словами, показывают человеку, что получилось.

Эти три части могут в одной программе повторяться или идти вперемешку. Но такую программу можно “поделить” на подпрограммы в соответствии означенному принципу.

Итак, программа – это последовательность команд, или, иными словами, “приказов” (в нашем случае, автокаду) сделать что-то. Поскольку компьютер абсолютный педант, то и приказы ему нужно отдавать четко, ясно и однозначно.

Четко” – это значит правильно, без опечаток, писать имена команд (функций) и вообще все слова и цифры, что вы пишете в программе, “ясно” означает, что ставить слова в приказе нужно в определенном порядке, “однозначность” обязывает применять слова, подходящие по смыслу.

Такой вот приказ в автолиспе называется выражением. Но прежде чем прикоснуться к таинству записи выражений, лучше познакомиться с такой штуковиной, как функции автолиспа. Кратко: в автокаде есть команды, в автолиспе есть функции. Разница: команды автокада запрашивают данные у пользователя, функциям требуются в процессе написания программы. Т.е., описывая функцию, программист уже должен знать ответы на ее вопросы! Эти ответы называются аргументами функции, а, попросту говоря, это данные, которые она, функция, обработает.

Хочется добавить особо, что в автолиспе термин “функция” следует трактовать как нечто функционирующее, выполняющее что-то, т.е. некое действие. Меня, к примеру, в начале знакомства с этим языком и одновременно с программированием несколько сбили с толку школьные воспоминания о функциях и графиках. Здесь же, повторюсь, функция – это приказ компьютеру в лице автокада что-то сделать.

Чтобы выпутаться из этих формулировок, вот пример.

Вспомним работу команд в акаде. Для отрисовки линии есть команда “отрезок” (LINE). При вызове она запрашивает первую точку, вторую  и рисует отрезок. Пользователь мог указать любую точку пространства. Отметим это.

Представим теперь, что есть в Лиспе некая функция “рубить”. Как ее использовать мы должны узнать в справочнике по функциям. Лезем, якобы, в справочник. Читаем.

 

«Функция «рубить» выполняет рубление чего-то чем-то. В программе записывается так:

 

(рубить чем что),

 

где

 

рубить                     - имя функции;

чем                 - первый аргумент, на месте которого в программе следует писать название инструмента(топор, зубило). Тип аргумента: строка, регистр букв не имеет значения;

что                - второй аргумент, на месте которого в программе следует писать часть название разрубаемого «тела». Тип: строка, регистр букв не имеет значения.

 

Пример.

 

(рубить "топор" "полено")        - правильно;

 

(рубить "полено" "топор")        - неправильно»

 

Следовательно, при использовании функции «рубить», оказывается, уже в программе нужно указать, чем и что рубить. А откуда берутся «топор» и «полено»?

Дело в том, что мы должны составить программу так, что вначале она выяснит, что и чем в данном случае надо, т.е.соберет исходные данные, а потом передаст эти данные уже в функцию «рубить». Собирая каждый раз различные данные, мы порубим в лапшу все что надо.

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

  1.     Выражением будем называть заключенную в круглые скобки запись функции со всеми ее аргументами.
  2.     Выражения автолиспа записываются в круглых скобках, на первом месте пишется функция, затем ее аргументы.
  3.     У функции могут быть обязательные аргументы – это столько и такого типа данные, для обработки которых и создана данная функция. Далее мы увидим, что функция может быть и вовсе без аргументов или могут быть необязательные.
  4.     Данные делятся на какие-то типы (строка, целое число, вещественное число и т.д.)
  5.     Ясно, что точное применение функций, т.е. ее возможности и ограничения, изучается по документации.
  6.     Примерно таким образом функции описываются в каталоге функций автолиспа, т.е. в документации.

 

 

Вернемся к теме. Данные в автолиспе делятся на типы. Для начала рассмотрим целые числа, вещественные числа и строки.

Целые числа – это рациональные числа, т.е. состоящие только из цифр. Например, 1, 2, -3, -12545. Сюда относится и 0.

Вещественные числа состоят из цифр и десятичной точки. Например, 1.0, -1.0, -200.001.

Строки – это последовательность символов в кавычках. Проще говоря, все что мы можем ввести с клавиатуры, взятое в кавычки. Например, "1", "1.0", "йцукен", "123йцукен456", "!№;%".

Если в программе мы передаем данные в функцию в "натуральном" виде, т.е. аргументами будут строковые или числовые данные, то при каждой работе программы функция будет обрабатывать только эти, постоянные, данные. Они называются константами, так как текст программы не меняется. Он пишется как бы навсегда.

Для передачи в функцию различных данных для обработки наряду с константами мы часто будем использовать так называемые переменные. Это ни что иное, как поименованное место в памяти компьютера, т.е. способ хранить нечто в памяти. Этот механизм работает так же, как и файлы, в которых хранятся наши чертежи и всякие другие документы. Т.е. для сохранения данных нужно задать имя и собственно данные. При сохранении других данных под этим именем, первоначальные пропадают однозначно. В отличие от операционной системы, тут вас, однако, никто не одернет с интонациями Б.Гейтса: «А Вы точно уверены, что хотите удалить содержимое этой переменной?»

 

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

(setq имя1 данные1 имя2 данные2 … …)

 

Примечание. Запись выражений будет раскрашена так, как это делается в среде разработки лисп-приложений VisualLisp, про которую речь пойдет позже. А пока – привыкайте.

 

Для описания функции воспользуемся особым приемом, который назовем «способ чтения выражений». Поскольку функция – это действие, то и фразу начинаем с глагола:

- Запомнить под именем имя1 данные1, а под именем имя2 данные2 и т.д.

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

Выражения автолиспа можно вводить прямо в командной строке автокада (естественно в круглых скобках). «Ввести выражение в командной строке» означает напечатать его и нажать Enter. Попробуйте:

 

Command: (setq name1 1)

 

Command: (setq name2 1.0)

 

Command: (setq name3 ку-ку)

 

Command: (setq any 127.333)

 

Заметим, что после каждого нажатия Enter, в командной строке печатается именно то значение, которое мы запоминали в переменную.  Это называется «функция вернула результат вычисления». Результатом вычисления функции setq  является последнее переданное ей значение, которое она запомнила в соответствующую переменную. А, кстати, запомнила ли? Для чтения значения переменной в автокаде нужно в командной строке ввести имя этой переменной, предварив восклицательным знаком. Вот так:

 

Command: !name1

 

Command: !name2

 

Command: !name3

 

Command: !any

 

Автокад нам сразу же напечатает значение переменной, если оно есть. А если нет? Переменную bjaka мы не задавали («запомнить что-то под каким-то именем» так же называется «задание переменной»):

 

Введем !bjaka, автокад вернет nil. Это значит, в такой переменной ничего не храниться. Или, иными словами, такая переменная не задана. Теперь еще один эксперимент. Введите:

 

Command: (setq name1 name2)

 

а затем посмотрим что в name1:

 

Command: !name1

 

Ясно, что в name1 записалось значение переменной name2. Еще попробуем.

Сначала вспомним, что имеем:

 

Command: !name1

 

Command: !name3

 

Command: !any

 

 

Теперь:

 

Command: (setq name1 name3 name3 any)

 

и посмотрим опять:

 

Command: !name1

 

Command: !name3

 

Command: !any

 

Любому толковому курсанту нашего курса сразу ясно, что в name1 запомнилось значение name3, а потом в name3 запомнилось то, что было в переменной any. И это правильно. Автолисп вычисляет, как и мы, слева направо, сверху вниз.

  

Выводы:

 

  1. Автолисп умеет запоминть данные в так называемых переменных.
  2. Для создания переменных применяется функция setq.
  3. Ни какого предварительного действия не требуется. В других языках переменные необходимо предварительно объявлять, описывать их тип (целое, вещественное число, строка и т.д.). У нас все просто – setq ее и все. Какой тип данных передали в нее, такой и хранится. Имя может быть совершенно не связано с хранящимся значением, поскольку программист может быть бестолковым, а автолисп таких условий не ставит.
  4. Имена нужно давать осмысленные, чтобы можно было догадаться хотя бы о типе содержимого. Этой рекомендации можно избегать ну в очень маленьких программках.
  5. При передаче нового значения в переменную то, что в ней уже есть – бесследно исчезает.

Задание 1.

    • Прочитать в руководстве соответствующий материал про выражения автолиспа, переменные, типы данных.
    • Прочитать описание функции setq.
    • Решить задачу: у вас есть две переменные: a1 и a2. В первой хранится число 13.0, а во второй строка «ляля». Вопрос: как поменять значения переменных местами, из одной в другую? Решение проверить на практике.

Не нашли то, что искали? Задайте вопросы в сообществе или поделитесь своими знаниями.

Новая тема  

Autodesk Design & Make Report