Логотип сайта поддержки пользователей САПРО сайте поддержки пользователей САПР Translate to:

Reini Urban

comp.cad.autocad AutoLISP ЧаВо
Частозадаваемые Вопросы об автолиспе
Другие документы по теме:
Английская версия (основная)

comp.cad.autocad AutoLISP FAQ


Название: 	comp.cad.autocad AutoLISP FAQ

Название файла:	CAD/autolisp-faq

URL:		http://xarch.tu-graz.ac.at/autocad/news/faq/autolisp.html

Версия:		2.27

Изменения от:	9 сентября 2000

Posted-By:	Reini Urban 

Обновление:	ежемесячно

Права:		см. Приложение [А]

Добро пожаловать на comp.cad.autocad AutoLISP FAQ!

AutoLISP - встроенный язык AutoCAD, общеизвестного CAD-пакета. Этот AutoLISP FAQ зарегистрирован в comp.cad.autocad, alt.cad.autocad и распространяется еженедельно.
Существует еще один AutoCAD FAQ - на http://www.autodesk.com/support/faqs/faqs.htm но он не зарегистрирован в comp.cad.autocad.

В данном FAQ рассматриваются все версии AutoLISP, начиная с версии для AutoCAD R10, кроме этого включает в себя информацию о Visual Lisp, Vital Lisp и ACOMP.

Это не группа новостей посвященная AutoLISP. Пожалуйста на путайте с comp.lang.lisp!

Все исходные тексты данного ЧаВо смотрите в FAQ-CODE.LSP (чтобы узнать где находится см.: [A.1]).

Благодарю всех кто содействовал в составление данного документа. Исправления и пополнения присылайте по адресу rurban@sbox.tu-graz.ac.at, всегда рад.

(В данном документе приняты следующие обозначения для | изменений, как + новое в тексте, а примечания и замечания заключаются в <..>)


Оглавление


Часть 1: Общая
[0] Будущее AutoLISP? Что я должен изучать LISP или VB ?
[0.1] Что нового в AutoCAD 2000?
[0.1] Мы не можем больше создавать ARX ?
[1] Где найти AutoLISP программы в Интернет?
[1.1] Сохраняются ли статьи из comp.cad.autocad где-нибудь?
[1.2] Autodesk's SDK
[2] Лучшие книги для изучения AutoLISP.
[2.1] Интерактивная AutoLISP документация, Winhelp [удалён]
[2.2] Стиль программирования в AutoLISP
[3] Как мне отладить AutoLISP программы?
[3.1] AutoLISP-отладчики
[3.2] Модульный стиль, TRACE
[3.3] функция BREAK, печать отладки
[4] Как защитить мои программы AutoLISP? Безопасность
[4.1] Kelvinate
[4.2] Protect
[4.3] Kelvinate and Protect
[4.4] Convert
[4.5] ACOMP
[4.6] Vital LISP Professional
[4.7] Lisp2C
[4.8] Visual Lisp от Autodesk
[5] AutoLISP - компиляторы
[5.1] ACOMP
[5.2] Vital LISP Professional
[5.3] Visual Lisp от Autodesk
[5.4] Лучшие: Common Lisp и Scheme
[6] AutoLISP редакторы и другие инструментальные средства
[6.1] AutoLISP редакторы
[6.2] Средства проверки соответствия круглых скобок, Анализаторы и Упаковщики.
[6.3] Форматирование исходного текста
[7] Проблемы и ошибки в AutoLISP [Добавлно]
[8] Сортировка в AutoLISP [Добавлно]
[9] Рекурсия
[10] Итерация с использованием MAPCAR, ...
[11] Мой LISP больше не загружается при запуске [Исправлено]
[12] Как сделать чтобы мои программы загружались автоматически (AUTOLOAD)?
[13] Как передать разное количество аргументов одной и той же функции LISP?
[14] Как мне избежать переполнения стека?
[15] (command "ROTATE3D") не работает! Почему?
[16] Программы LISP, работающие с несколькими чертежами.
[17] Как экспортировать функции из Visual Lisp в AutoLISP/AutoCAD?

Часть 2: Примеры, код.
[20] Общие функции
[20.1] Обработка списков
[20.2] Обработка строк
[20.3] Символ - > строка
[20.4] Доступ к примитивам AutoCAD
[21] Примеры Lisp программ:
[21.1] Изменения параметров текста и полилиний, утилиты для работы со слоями и установка даты
[21.2] Диалог вывода на печать из LISP. Использование DDE и ActiveX.
[21.3] (entmod) и (entmake) Слои, без (command "_LAYER"...)
[21.4] Как выбирать множество файлов в LISP? (как в FILES - Unlock)
[21.5] Замена нескольких блоков
[21.6] (vports), VIEWPORT примитив, преобразование пикселей
[21.7] Выбор всех видимых объектов: координаты масштабирования
[21.8] Как записывать XYZ данные выбранных объектов в файл?
[22] Атрибуты блоков
[22.1] Как обращаться к атрибутам блоков?
[22.2] Как модифицировать атрибуты блоков? DATESTAMP.LSP
[22.3] Как сделать UPDATE (обновление) атрибутов блоков?
[22.4] Как сделать ENTMAKE Сложного Блочного Объекта в AutoLISP
[23] Полилинии
[23.1] Как получить доступ к VERTICES (узлам) полилинии?
[23.2] Как объединить несколько линий в полилинию?
[23.3] Изменения толщину нескольких полилиний?
[23.4] Создание полилиний или сплайнов: с использованием (ENTMAKE) или (COMMAND)
[23.5] Как вычислить ДЛИНУ полилиний?
[23.6] Как изменить направление полилинии?
[23.7] Как получить ЦЕНТР полилинии? Новый
[24] Немного тригонометрии для скругленных сегментов
[25] DCL: диалоговые списки (listboxes) с метками табуляции или монотекстовым шрифтом
[26] EED Расширенные Данные Примитива (Extended Entity Data): Получить и Сохранить
[26.1] Выбор объектов по их EED с использованием (ssget "X")
[26.2] Получение EED из объекта
[27] Как прервать команду в LISP?
[27.1] Как сделать неограниченное число пользовательских сообщений?
[28] Как декодировать внутреннюю геометрию ACIS с помощью LISP?

  --

[A] Замечания от авторов
[A.1] Местонахождение ЧаВо (FAQ)
[B] Благодарности
[C] Последние Изменения


[0] Будущее AutoLISP. Должен ли я изучать LISP или VB ?

AutoLISP, определенно, будет поддерживаться в будущих версиях AutoCAD. VB был представлен, чтобы упростить Автоматизацию делопроизводства: ACAD <-> Excel/Access.

Оба языка имеют свои достоинства и недостатки. Рекомендуется ознакомиться с обоими. VB более графический а AutoLISP более логичный.. Объектная концепция VBA, кажется, проще для изучения, но Вы не можете выполнять в нем команды как в AutoLISPе.
Новый VBA (в R14.1 и выше) чрезвычайно быстр. См. также [5.2].

Будущее AutoLISP в работе с Visual Lisp. Для более подробной информации см. URL: http://www.autodesk.com/vlisp, http://www.autodesk.com/develop/devres/visual/faq.htm и [0.1] ниже.


[0.1] Что нового в AutoCAD 2000?

Название :) Нет, имеется намного больше нового, но Вы можете называть его релизом 2000, R15 (хотя 15 - номер версии а не номер релиза), A2000 или аббревеатурой A2K.

Новое ядро Visual Lisp заменило старое, основанное на x-lisp ядро AutoLisp. Какие проблемы Вы должны ожидать c Visual Lisp в R2000? (только плохие новости)

По адресу http://xarch.tu-graz.ac.at/autocad/docs/r2000-news.txt я собрал информацию по этому вопросу. Советую использовать LCA что бы проверить ваши лиспы.

Главные пункты следующие:


[0.2] Мы не можем больше создавать ARX ?

В AutoCAD 2000 вы не можете делать это больше как в ViLL или VLISP 4. Вместо этого вы компилируете в VLX (Визуальное Расширение Лиспа), который имеет в основном те же самые функциональные возможности как старый ARX от Visual Lisp / Vital Lisp, со следующими отличиями: Вы не нуждаетесь в ARX-модулях больше. Это - особенность, не дефект.


[1] Где найти AutoLISP программы в Интернет?

Некоторые большие сайты, посвященные shareware для AutoCAD:

AutoCAD Plugin Store от beyond.com.
http://www.cadplugins.com/ Этот сайт "Официально рекомендованы" AutoDESK.
CADalog - The AutoCAD Shareware Clearinghouse (Mike Clark)
http://www.cadalog.com/
CAD Depot ранее известный как CADSyst (David Whynot)
http://www.cadsyst.com/ недавно купленный TenLinks.
Они специализируются на программном обеспечении для AutoCAD и имеют очень хорошие AutoLISP-коллекции. URL ардеса других AutoLisp коллекций можно найти в различных группах новостей.

Другие порталы [New]:
TenLinks и UpFront EZine - лучшие службы CAD-новостей.
Autodesk создал свой сайт-портал Point A.

Другие места с AutoLISP коллекциями:

xarch AutoCAD Info & Tools (Reini Urban)
http://xarch.tu-graz.ac.at/autocad/ (with search)
CAD Users Webring [new]
CADalyst magazine code (compiled by "Hot Tip Harry" Art Liddle)
http://www.cadonline.com/code/
The CADshack (Jeff Foster)
http://www.cadshack.com/lispfile.htm
Owen Wengerd
http://www.manusoft.com
Terry Dotson
http://www.dotsoft.com/
Vladimir Nesterowsky
http://members.tripod.com/~vnestr/
UCCB AutoCAD and AutoLISP page (Paul Standing)
http://ucad1.uccb.ns.ca/acad/cad.htm
Theo L.A. Groenenberg [fixed]
http://members.xoom.com/acadvice/autolisp.htm
Lisp Factory (Jay Garnett)
http://members.tripod.com/~spotter10/autolisp/
Rakesh Rao - AutoCAD Tech Center
http://www.4d-technologies.com/techcenter

Старые или не работающие ссылки:

CADENCE magazine code (Peter Sheerin) [old, broken]
ftp://ftp.mfi.com/pub/cadence/
AutoCAD Tech Journal code (Peter Sheerin) [old]
http://www.atj.com
Dr.Lisp Utilities (Alexander Medwedew)
http://tribeca.ios.com:80/~compvent/drlutils.html
SimTel - Coast To Coast - Archive [fixed, very old]
http://www.coast.net/SimTel/msdos/autocad.html
PIRS Online (tm)
http://www.insa.com/
Desi Moreno
http://www.invsn.com/desmos/autolisp.htm
Henry Francis
http://www.ez-sys.net/~coopfra/
McNeel's lisp archive
ftp://ftp.mcneel.com/lisp/ На http://www.autodesk.com/support/autocad/ находятся документы Autodesk Product Support отвечающие на технические вопросы. (Их FAQ's)

[1.1] Сохраняются ли статьи из comp.cad.autocad где-нибудь?

Не имеется никакого архива comp.cad.autocad, но существуют некоторые поисковые машины, которые сохраняют статьи из новостей. В частности:

http://www.dejanews.com/ - Крупнейший архив новостей
Непосредственно из http://search.dejanews.com/dnquery.xp?query=~g%20comp.cad.autocad
http://www.altavista.com/
http://www.altavista.digital.com/cgi-bin/query?pg=aq&what=news
http://www.excite.com/
http://www.excite.com/search.gw?collection=news
http://www.phoaks.com/phoaks/comp/cad/autocad/
перечень Web ресурсов
Некоторые особые новости также сохранены на http://xarch.tu-graz.ac.at/autocad/news/contents.html


[1.2] Autodesk's SDK

До AutoCAD R12 SDK было доступно непосредственно от Autodesk. SDK2 поставлялись с международной версией AutoCAD R12 бесплатно. Эти SDK включали в себя много ADS и AutoLISP исходников и библиотек.

С AutoCAD R13 Autodesk обеспечивает специальную сеть разработчиков, сравнимую с Микрософт, - ADN. Новый компакт-диск (CD) c SDK сопоставим со старым SDK, но преимущественно предназначен для ObjectARX разработчиков.
Войдите в контакт с Вашим близжайшим представителем Autodesk для получения.

Некоторые LISPы есть на http://xarch.tu-graz.ac.at/autocad/code/adesk/SDK2/

В США, членство в ADN стоит $ 600.00 ежегодно.


[2] Лучшие книги для изучения AutoLISP.

AutoLISP to Visual LISP [new]
Kevin Standiford, Autodesk Press, ISBN 0-7668-1517
AutoLISP: Programming for Productivity,
William Kramer, Autodesk Press, ISBN 0-8273-5832-6
Essential AutoLISP,
Roy Harkow, Springer-Verlag, ISBN 0-387-94571-7
AutoLISP in Plain English; A Practical Guide for Non-Programmers,
George O. Head, Ventana Press, ISBN: 1566041406
"Maximizing AutoLISP"
Rusty Gesner, Tony and Mark Middlebrook, Tony Tanzillo.
Новая Maximizing AutoLISP R13/R14 будет опубликована рано или поздно. Но книга о R12 book все еще является рекомендуемой покупкой хотя её уже довольно трудно найти.
Подробнее на http://www.group-a.com/~rusty/
"AutoLISP Reference Manual"
by Autodesk Press.
"AutoLISP Reference Manual" от Autodesk Press.
До AutoCAD R12 существовал отдельный AutoLISP-Справочник. Затем AutoLISP стал частью Руководства Настройки для R13. С R14 это руководство скомпилировано как Winhelp.

Помимо этого есть еще много книг о AutoLISP.

Рекомендуемые книги по LISP (не AutoLISP!):

ANSI Common Lisp, (Common Lisp primer)
Paul Graham, Prentice Hall, ISBN 0-13-370875-6
Structure and Interpretation of Computer Programs, (high-level Scheme) [new]
H.Abelson, GJ. Sussman, J. Sussman, MIT Press, ISBN 0-262-01153-0
LISP, 3rd Edition,
Patrick Henry Winston and Berthold Klaus Paul Horn, Addison-Wesley Publishing Company, ISBN 0-201-08319-1
Looking at LISP,
Tony Hasemer, Addison-Wesley Publishing Company, ISBN 0-201-12080-1


[2.1] Интерактивная AutoLISP документация, Winhelp [был удален в предыдущей версии]

Все руководства по R14 преобразованы в формат Winhelp.

Существующие AutoLISP Winhelp файлы можно найти с:

Для DOS существует резидентная программа - LISPHLP.EXE
(активируется Ctrl-RightShift-R, 1988)

LSPDOC: At http://xarch.tu-graz.ac.at/autocad/lsp_tools/#lspdoc - это утилита которая автоматически создает Winhelp для LISP файлов.


[2.2] Стиль программирования в AutoLISP

Большинство примеров, которые напечатаны в журналах или размещены на различных сайтах Web написаны ужасно, делая процесс обучения AutoLISP даже тяжелее для новичков. LISP-код должен легко читаться, во всяком случае из-за его краткости и бесчисленного числа круглых скобок. Текст программ Autodesk всегда понятно написаны иногда даже слишком. :)

Автоматические форматировщики, или так называемый beautifiers (см.[6.3]) автоматически форматируют код согласно стандарту. На R12 CD-ROM в SDK2 ACG.DOC или на http://xarch.tu-graz.ac.at/autocad/docs/acg.txt находится превосходная документация Autodesk относительно кодирования, комментирования и международных стандартов для обеспечения удобства читаемости LISP-кода.

Наиболее важные пункты:


[3] Как мне отладить программы на AutoLISP?

[3.1] AutoLISP-отладчики:

См. [5] AutoLISP компиляторы

[3.2] Модульный стиль и функция TRACE

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

[3.3] Вы можете включить функцию BREAK и отладочный-вывод в свой исходный текст.

Примеры:

;;; Отладочные функции (defun break (s) (if *BREAK* (progn (princ "BREAK>> (stop with <Enter>)\nBREAK>> ")(princ s) (while (/= (setq s (getstring "\nBREAK>> ")) "") (print (eval (read s))))))) ;исправлена v1.3! (defun dbg-print (s) ;принимает и атомы и списки (if *DEBUG* (if (listp s) (MAPCAR 'print s) (print s)))) (defun C:DEBUG () (setq *DEBUG* (not *DEBUG*))) ;переключатель вкл./выкл. (defun C:BREAK () (setq *BREAK* (not *BREAK*))) (defun CONT () (setq *BREAK* nil)) ;продолжать не прерываясь ;;;Пример (setq *BREAK* T *DEBUG* T) (defun C:TEST () (foreach x '("1" "1.0" "1e-3") (break "in foreach") ; останавливает если *BREAK* вкл., Вы можете ; задать значение x и будет выводиться его значение ; пока не введете Enter (setq x (atof x)) ; это код обработки x (dbg-print x) ; вывод нового значения x ; если *DEBUG* - вкл. ) ) Command: TEST BREAK>> (stop with <Enter>) BREAK>> in foreach BREAK>> x 1.0 BREAK>> (CONT) ; отключить функцию break nil BREAK>> <Enter> 1.0 1.0 0.001 Вы можете также выключить отладочный-вывод BREAK>> (setq *DEBUG* nil) чтобы проскочить большие циклы.


[4] Как мне защитить свои AutoLISP программы?

"Вы действительно нужно защитить их? Если Вы хотите распространить код среди своих друзей, то почему бы просто не отдать им код? Ваш исходный текст в любом случае защищен авторским правом. Работая с другими Вы получаета возможность получения новых идей и писать более совершенные программы.
Многие из моих утилит были улучшены моими друзьями, а я улучшил многие их утилиты." (Dennis)

[4.1] Kelvinate
С помощью KELV.EXE (можно найти на R12 CD-ROM или на AutoLISP сайтах [1]) 'де-кельвировать' лиспы можно любым форматировщиком кода. Но имена (переменные) будут в изменненном виде и будут утеряны примечания.
[4.2] Protect
С помощью PROTECT.EXE (можно найти на R12 CD-ROM или на AutoLISP сайтах [1])
Хочу обратить внимание, на то что существуют и сниматели защиты (unprotect).
[4.3] Kelvinate and Protect
Сначала kelvinate делает код нечитаемым, и только после этого защищает его.
[4.4] Convert
Shareware Lisp Шифровщик/Дешифровщик от Maciej Lukasiewicz
Больше не нужно использовать Decryptor v2.0. С помощью Convert зашифрованные "Protected Lisps" не могу быть расшифрованы с помощью других программ, хотя сам Convert может это сделать.
[4.5] ACOMP
AutoLISP компилятор ACOMP.EXE, найти можно с R12 international release или на AutoLISP сайтах. Распространяется бесплатно. Более подробную документацию о ACOMP см. на http://xarch.tu-graz.ac.at/autocad/bi4/
Также см. [5.1] AutoLISP компиляторы
[4.6] Vital LISP Professional
http://www.basissoftware.com/vill.htm
Читай "ViLL". Уже не продается. См. [5.2] AutoLISP компиляторы
[4.7] Lisp2C
Из LISP в C конвертер, для R12/R13 Dos/Win (Watcom, Metaware, MSVC Libs)
Вам нужен компилятор C.
http://www.basic.si
[4.8] Visual Lisp от Autodesk
Читай "vlisp". Будущее автолиспа. См. [5.3]

FAS Безопасность:
Недавно в группах новостей было широкое обсуждение по поводу FAS безопастности. Определенно FAS может быть декомпилирован в читаемый исходный код, но эти средства до сих пор не доступны в сети. Есть слухи, что MNC-файлы также могут быть декомпилированы, но до сих пор так же информация об этом не доступна в сети. Откомпилорованный код в FAS/VLX ( с опцией Optimized/Internal) подобен работе Kelvinator. Имена переменных, строчные и цифровые значения являются более незащищенными чем сам алгоритм.

Вывод:
Серьезное шифрование теперь обеспечивается Autodesk, чтобы помочь профессиональным AutoLISP-разработчикам. Kelvinate [4.1] делает LISP файлы нечитаемыми и быстрее загружаемыми. Protected [4.2] - легко расшифровывается. Другие не расшифровываются. Если LISPы зашифрованы Convert -e$GUARD, то могут быть расшифрованы только с её же помощью.


[5] AutoLISP компиляторы

Рассматриваться будут три AutoLISP компилятора. Может вскоре появяться более совершенные. Некоторые Lisp и Scheme-платформы уже поддерживают ActiveX или или только простой FFI
[5.1] ACOMP
ACOMP поддерживался вплоть до R12 только для международных версий. Распространяется бесплатно. Бесплатен, но не работает ни с R13, ни с R12/Win. Он создает *.BI4 файлы и нуждается специальный ACADL.EXP поставляемый как ACADLC.EXP. См. http://xarch.tu-graz.ac.at/autocad/bi4/ Предупреждения компилятора более явные на локальных переменных чем у ViLL/VLisp.

[5.2] Vital LISP Professional
от Basis Software Inc. USA. Просто - лучший. Бесплатные, для лицензированных пользователей, runtime модули для R12/R13/R14 DOS/Windows/NT
Basis Software больше не поддерживает Vital Lisp. Последняя версия - 3.2. Версия для R14 (ViLL 3.x) включает в себя ActiveX (как VB) и поддерживает 'реакторы'. См. также [6.1] и [4.6]

[5.3] Visual Lisp от Autodesk
vlisp, является пеемником Vital Lisp, в основном то же что и vill 3.2. Были изменены только интерфейс пользователя (GUI), некоторые имена функций и файлы справки: vill- => vlisp-, vlx- => vl- префиксы. Некоторые vlax- функции имеют больше дефисов.
Начиная с версии 2000 Visual Lisp заменил в AutoCAD старую среду AutoLisp. См [0.1]
VLX являются FAS файлами с дополнительными DCL ресурсами, используемыми R14/R15. R15 FAS/VLX - файлы не совместимы с предыдущей версиями (FAS2->FAS4) посколько добавлены языковые особенности (раздельное пространство имен).
[5.4] Самые лучшие: Common Lisp и Scheme Родной ARX существует для Corman Common Lisp (простая консоль).
COM поддерживается Allegro Common Lisp 5, Lisp Works для Windows и в будущем GambitC. Через FFI (" Иностранный Функциональный Интерфейс ") почти каждый, LISP или Scheme может быть связан с AutoCAD. Некоторые работы выполнены с помощью Corman Lisp и ACL5. В настоящее время один коммерческий продукт использует ACL5 ("Design++" от Design Power). См. http://xarch.tu-graz.ac.at/autocad/bi4/ для большей информации.
Вывод:
AutoLISP компиляторы нуждаются в модулях поддержки выполнения(runtime). Для пользователей AutoCAD 2000, использующих VLISP эти runtime включены в систему. Вы не можете создавать автономные программы, хотя ViLL/vlisp (<= R14 )генерирует автономный ARX. Искомый текст шифруется.


[6] AutoLISP редакторы и прочие утилиты

[6.1] AutoLISP редакторы

Visual Lisp от Autodesk
См.[5.3]. Лучшее из рекомендуемых средств. Включено в AutoCAD 2000.
Emac для NT
Огромный и очень трудный для изучения редактор, но он написан и настроен на elisp, который очень подобен Autolisp. Это отец всех редакторов. Бесплатный, для всех платформ. Имеет две разновидности, XEmacs или GNU ntemacs. Режим AutoLisp: http://xarch.tu-graz.ac.at/autocad/lsp_tools/ntemacs.html
Vital LISP
Не доступен в настоящее время. См. [5.2] AutoLISP компиляторы
LispPad
AutoLISP Editor от Tony Tanzillo. http://ourworld.compuserve.com/homepages/tonyt/LispPad.htm
LispLink 2000
Коммерческий AutoLISP Editor с подсветкой синтаксиса, проверкой скобок, менеджером проектов, предварительным просмотром диалогов, поддержкой функций Visual Lisp, и FAS-совместимостью. См. http://www.caelink.com/
CodeMagic [new]
Бесплатный текстовый редактор с подсветкой функций Autolisp. Старые программы:
Visual Lisp от WSSW
Старый небольшой Windows Lisp Editor. Версия 1.0 абсолютно бесплатная. Не путать с Visual Lisp от Autodesk. См. [1]
WCEDIT 2.02
ADS редактор для DOS R12, может оценить lisp код из редактора, распространяется бесплатно.
See [1]
CODEKEY
старый коммерческий DOS IDE, внутрений форматировщик кода, шифровка, расшифровка, kelvinator, <доступность?>
ALLY 3.0 и CADET
Shareware Lisp Анализатор(Analyzer) и Редактор (Editor).
См. [6.2]
pred
бесплатно распространяемый, маленький DOS редактор который осуществляет выделение скобок.
На ftp://xarch.tu-graz.ac.at/pub/autocad/lsp_tools/pred.zip Аналогичный этому - редактор ADE.

Также широко используются различные, настраиваемые, редакторы для ппрограммистов, такие как MultiEdit Pro 7, WinEdit, E! или PFE.
Как правило они не поддерживают ни Lisp синтаксис, ни форматирование кода, но поддерживают multi-файловый поиск/замену и имеют настраиваемое выделение синтаксиса.
Существуют и другие не такие хорошие редакторы (ADE), но я не имею их описания.

[6.2] Средства проверки соответствия круглых скобок, Анализаторы и Упаковщики.

Средства проверки соответствия круглых скобок можно больше не использовать. Редакторы должны уметь это делать.Анализаторы генерируют функциональную перекрестную ссылку, запрос и обратное дерево вызывающих программ. Упаковщики используются для генерации библиотек из различных исходных файлов, копируя все необходимые функции. В настоящее время нет просмотровщиков кода, которые могут интнрнализировать строки команд, но в ACAD 2000 появился lisp-анализатор (LCA). Компилятор VLISP [5.3] анализирует и проверяет скобки. (Ctrl-Alt-C)

Reini's AutoLISP Packager
http://xarch.tu-graz.ac.at/autocad/lsp_tools/#Packager Обзор пересекающихся функций, обратное дерево запросов, создает библиотеку исходных файлов. ("Packager" или "Function Shaker")

PEI's Findvars
Подобен Packager, описанный выше, но не только функции, дополнительно обнаруживает символы, которые должны быть локализованы. http://www.perceptual-eng.com Я лично использую это и мой Packager.

RapidLisp v1.0c
бесплатный lisp-анализатор для R14. http://www.cps.de/cad/rapidlisp/

AVC - AutoLISP Variable Collector
Бесплатный. Находит все переменные, декларированные в функции http://users.actcom.co.il/sysoft/vc.htm

LCA - Autodesk's AutoLISP Compatibility Analyzer [new]
На Migration CD. Определяет проблемы совместимости с AutoCAD 2000, найденные в указанных AutoLISP (LSP) или Menu LISP (MNL) файлах.

ALLY30.ZIP
Shareware LISP анализатор. Проверяет синтаксис и выводит статистику (в соответствии со структурой функций), на [1]

lck21b.zip
LCK LISP Checker 2.1b (графический)

paran.zip
Простой

PARNCH.ZIP
Простой

Существуют AutoLISP программы которые подсчитывают скобки.

[6.3] Форматировщики кода

Внешние:
FMT202S.ZIP
Lisp, DCL и FRM форматировщик исходного текста
LB.EXE
Autodesk's форматировщики кода (source code beautifier).
Найти можно в SDK2 или см. [1]. Имеет проблемы с длинными строками, и новым-стилем в строчных комментариях.
PPRINT.LSP
Найти можно в SDK2 или см. [1].
Внутренние:
Visual Lisp, Vital LISP, Emacs и Codekey, насколько я знаю, содержат внутренние форматировщики кода.


[7] Проблемы и ошибки в AutoLISP/A>

Для пользователей AutoCAD 2000 и неопытных пользователей VLISP см. [0.1] Не имеется почти никаких известных серьезных ошибок в AutoLISP. Интерпретатор Autolisp непосредственно (ACADL.EXE/.EXP) работает несомненно хорошо. Некоторые ограничения основаны на принципах работы AutoCAD и Proteus(DCL). Некоторые программы LISP-поддержки (например DDMODIFY.LSP) часто дефектны. По вопросам о Visual Lisp см. README.txt содержащий перечень всех известных ошибок и ограничений. Сбои при использовании реакторов являются ошибками автокада.

Два неофициальных списка ошибок доступно здесь:

http://www.cadonline.com/exclusive/bugs/bugwatchlist.htm (большой)
http://www.dotsoft.com/buglist.htm (более короткий)

+LDATA by Tom Berger (VLISP для R14 и A2000)
Коротко: Не используйте LDATA вообще. Это может уничтожить DXF и DWG в A2000.

При предачи AutoLISP-ом в Visual LISP или обратно, списка аргументов содержащий ТОЧЕЧНЫЕ ПАРЫ, могут быть утеряны крайние члены.
См. Visual Lisp README (недокументированный Vital Lisp)

СПИСКИ С ОДНИМ АТОМОМ (SINGLE ATOM LISTS) возвращаются некорректно из ВНЕШНИХ ПРИЛОЖЕНИЙ (EXTERNAL APPS)
Visual LISP не понимает различие между СПИСОКОМ с одним атомом (элементом) и просто с атомом, возвращаемом из внешнего ObjectARX или ADS приложения.

ENTGET используемый с LWPOLYLINE, HATCH (только r14)
Координата Z (caddr (getval 10 ele)) - является случайным числом и часто вызывает ошибку с плавающей точкой, т.к. может быть как слишком малым, так и слишком большим числом..
См. также часть 2, п.[23.1]

ENTMAKE VERTEX от Terry Dotson (только r14)
Ошибка может случиться во время процесса использования (entmake), при создании полилинии, Вы должны назначить слой каждому из УЗЛОВ (VERTEX) (по инструкциям Autodesk), но оказывается что необходимо садать слой и для SEQEND. Отсутствие этого заставит SEQEND остановиться в текущем слое, который может быть позже заморожен. Попытка переместить этот фрагмент геометрии вызовет EREGEN ошибку и сбой самого R14 (только для этой версии).

ACAD_STRLSORT: Странный порядок сортировки в Windows.
Сортировка символов в Windows не соответствует ASCII правилам! Зависит текущей кодовой странице (getvar "SYSCODEPAGE") котроая не является одинаковой для разных языков.

Windows: (acad_strlsort '("-1" "+1")) -> ("-1" "+1"), DOS: (acad_strlsort '("-1" "+1")) -> ("+1" "-1") Both: (mapcar 'ascii ("-" "+")) -> (45 43) Более подробно см. http://xarch.tu-graz.ac.at/autocad/docs/strlsort-bug.html

AI_PROPCHK
(ai_propchk) переименовался в (C:AI_PROP) в R13c3 обновлении.
"Функция AutoLISP ai_propchk заменена на c:ai_prop так чтобы она работала как и другие комманды. Это позволяет нажатием ENTER возобновлять действие комманды DDMODIFY если сначала она была вызвана из панельки инстр.(toolbar)."

Дефектные обратные вызовы в R13 DCL-коде приводят к краху AutoCAD
Имеется ошибка в R13/R14, где AutoCAD терпит крах с Фатальной Ошибкой если ошибка происходит в AutoLISP коде в течение обратного вызова из полоса прокрутки (слайдера) в диалоговом окне. Например, если Вы попробуете вычислить нулевую функцию во время обратного вызова, AutoCAD терпит крах немедленно. Технически, это не ошибка AutoLISP интерпретатора, но все равно считается AutoLISP-ошибкой.

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

Что еще? См. неофициальный перечень ошибок AutoCAD поддерживаемый Steve Johnson для большинства дефектных программ AutoLISP, http://www.awa.com/nct/software/13bug04.html (esp: 33, 124, 126, 127, 139, 153, 158, 165, 176, 182, 192, 193, 238, 240, 254, 272, 295)

Защищенные лисп файлы
В предварительной версии pre-c4 R13 защищенные LISP файлы небыли защищены в памяти. По нашему мнению, с этой проблемой должны быть ознакомлены все, т.к. разработчики полагают что их "защищенный код" не защищен от посторонних глаз. Эта FAQ тема вызвала большой переполох на AutoCAD Форуме CompuServe.

Ограниченное число открытых наборов (selection sets)
Они сохраняются во временных файлах. Избавьтесь от ненужных наборов установив их переменные в nil и выполните (gc), сборщик мусора, который затем фактически закрывает эти файлы.
Максимальное число зависит от операционной системы, то есть в DOS число файлов - FILES= определяется в CONFIG.SYS.
R13 увеличил число.

Числа: диапазон, точность
Целые числа в АвтоЛИСПе работают как long ( 32-разрядные, со знаком), но от AutoLISP AutoCAD принимает только 16-разрядный short в диапазоне -32766 .. + 32767, т.к. AutoCAD работает только сним (short).

Числа с плавающей точкой являются double (64-разрадные IEEE). Все внуртренние AutoLISP и AutoCAD численные вычисления осуществляются в double формате, который является достаточно точным. По крайнее мере первые 14 разрядов десятичного числа точны.

Однако, во время выполнений геометрических сравнений часто случаются несоответствия, например при сравнениях: (equal pt1 pt2 1e-6) ; 0.000001 ошибка погрешности вычисления вместо (equal pt1 pt2), особенно это справедливо к действиям над углами.
См. http://www.autodesk.com/support/techdocs/td30/td301207.htm
Также стало известно в последнее время, что с некоторыми загруженными контроллерами автоматизации, числовой точностью и региональными символами появлялся нежелательный побочный эффект. Решение и объяснение этой проблемы пока не найдено.

ACOMP правила для (EQ)
К откомпилированной [5.1] ACOMPом программе нужно быть особенно внимательным, т.к. правила для (EQ) в BI4 более строгие чем в AutoLISP. В AutoLISP (eq "1" "1") принимает значение T, а в компилированном acomp коде принимает значение nil

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

AND и OR AND и OR не должны возвратить значение NIL вместо T. См. http://xarch.tu-graz.ac.at/autocad/docs/and-bug.html

MAX и MIN должен обрабатывать строки, т.к. < and > принимает и обрабатывает строки.

См. выше ACAD_STRLSORT (сортитровка строк)

Об ошибках переполнения стека см.[14]


[8] Сортировка в AutoLISP

Обзор алгоритмов сортировки см. на http://xarch.tu-graz.ac.at/autocad/lisp/#sort

В LISP обычно используют сортировку с объединением (использован в (str-sort) в примере TABLES.LSP от AutoDesk) потому что это естественный метод для связи списков. Обычно (например в C) вы используете сортировку методом кучи (heap) (для любых данных) или qsort (для случайных данных) и сортировку методом вставки для маленьких списков (<7) или подсписков внутри алгоритма.

Имеется LISP-коды для сортировки методами оболочки (shell), пузырьков (bubble), вставки (insertion), и быстрая сортировка (quick). Они доступны для любых данных, списков и индексов списков. В LISP Вы можете передавать предикатную функцию, чтобы jceotcndkznm сортировre, которая вычисляется как run-time (здесь называется 'метод' "method"). Именно поэтому Вам нудна только одна функция сортировки для различных типов данных (то есть чисел, точек, строк, ...)

(sort data method) ;метод: less-than-predicate ;числа по умолчанию: '< Некоторые примеры см. на http://xarch.tu-graz.ac.at/autocad/lisp/sort/ur_sort.lsp: сортировка 100 элементов: bubble sort: 13.639008 сек/ 30.08% insertion sort: 13.368042 сек/ 29.48% (быстрый для сортиров. списков) shell sort: 13.478973 сек/ 29.73% (плохая реализация) merge sort: 2.232971 сек/ 4.92% quick sort: 2.433960 сек/ 5.37% vlx-sort: 0.099976 сек/ 0.22% (Vital LISP встроенный) acad_strlsort: 0.089996 сек/ 0.20% (AutoLISP встроенный, для строк)


[9] Рекурсия

Это - не часто задаваемый вопрос, а очень интересный момент в LISP, потому что LISP, непосредственно определен рекурсивным, и это - часто самый простой способ ясно сформулировать проблемы.

Существуют несколько прекрасных документов относительно рекурсий на http://xarch.tu-graz.ac.at/autocad/lisp , и особенно http://xarch.tu-graz.ac.at/autocad/lisp/recursive.html Учебник от Dennis Shinn.

Там это объясняется более подробно:

(defun fact (n) (cond ((zerop n) 1) (T (* n (fact (1- n))))))

Примечания: Обратите внимание: имеется также самоизменяющийся пример этой функции, см. http://xarch.tu-graz.ac.at/autocad/lisp/self-mod.lsp


[10] Итерации с помощью MAPCAR, ...

То же самое что с рекурсией, это не часто задаваемый вопрос, но это необходимо знать.
Итерационные операторы в AutoLISP: WHILE, REPEAT, FOREACH и MAPCAR. Мы используем их широко в этом FAQ, потому что они позволяют сократить код.

Имеется пример короткого кода с LAMBDA, QUOTE, MAPCAR... от Vladimir Nesterowsky:

>> "There are 14 paths and 12 pigs. >> How can there be 24 ducks?" >> Имеется ли lisp-команда, которая позволит мне выбирать >> строки текста, и распознают число(а) в каждой строке, >> чтобы, скажем, увеличить каждое номер в два раза? >> Оставляя структуру предложения неповрежденной? Это - один способ. (Я уверен, что имеются много других способов) (defun mult2 (strng) ; (c) by Vladimir Nesterowsky (strlgather (mapcar '(lambda (s / n) (if (zerop (setq n (atof s))) s (rtos (* n 2)))) (strlparse strng " ")) ; parse by spaces " ")) ; gather back with spaces

пояснения на http://members.tripod.com/~vnestr/mapcar.txt

;;; перемещение строк и столбцов в матрице (defun transpose (l) ; (c) by Doug Wilson (apply 'mapcar (cons 'list l)))

пояснения на http://xarch.tu-graz.ac.at/autocad/lisp/transpose.002.html


[11] Мой LISP больше не загружается при запуске

LISP файлы могут быть загружены при запуске, используя LOAD в ACAD.LSP. Некоторые LISP-файлы, работающие с меню, чтобы работать, должны быть загружены из соответствующего <меню>. MNL-файла. <меню>.MNL- файл, загружаемый по умолчанию - ACAD.MNL

LISP функции вызываемые при запуске должны быть определены в функции S::STARTUP в файле ACAD.LSP. Эта функция вызывается при запуске после инициализации автоматически. Иначе вы получите ошибку: "Command list interruption (6.2)".

Если имя файла указано без расширения, функция LOAD добавляет .LSP по умолчанию. Если нет указания полного пути к файлу, используется обычный путь к библиотекам AutoCAD, то есть:
  1. ) Текущий каталог
  2. ) Каталог, содержащий файл текущего чертежа
  3. ) Каталоги, определенные в переменной среды AUTOCAD (устанавливается в пункте меню Preferences, пути к каталогу SUPPORT)
  4. ) Каталог acad.exe
Если ваша программа не загружается больше автоматически, проверьте ваш путь к библиотекам AutoCAD.

ACADLC (от ACOMP) и внутренние версии AutoCAD R12 не загружают автоматически файл ACAD.LSP. Следовательно Вы должны добавить (load "ACAD" -1) в ваш ACAD.MNL.

Пример ACAD.LSP:

;;;ACAD.LSP ;;; Fred the Beaver, 12/12/94 (load "init" -1) ;загружает некие инструментальные средства (defun S::STARTUP () (load "new-end" -1) ; переопределение команды END )

-1 параметр предохраняет LOAD от прерывания процесса запуска, если происходит любой отказ функции LOAD (возможные ошибки в AutoLISPе). Если отказ во время загрузки происходит, -1 возвращается, но вычисление кода не останавливается. -1 может быть в также в любом выражении.

Типовой пример, осуществления расширения S::STARTUP в вашей программе (с компилированным кодом Vital Lisp это не будет работать: это не должно компилироваться)

(defun MY::STARTUP () ;Ваш код автозапуска ;.. (princ) ) (setq S::STARTUP (if (and S::STARTUP (listp S::STARTUP)) ;если уже определен в ACAD.LSP ;то в общий список автозапуска (append S::STARTUP (cdr MY::STARTUP)) ;добавляется Ваш код, иначе MY:STARTUP)) ;выполняется только Ваш код

или другой пример:

(if (and S::STARTUP (listp S::STARTUP)) (setq S::STARTUP (append S::STARTUP (list func '(princ)))) (setq S::STARTUP (list nil func '(princ))))

См. также [12] Как сделать чтобы мои программы загружались автоматически?


[12] Как сделать чтобы мои программы загружались автоматически?

Как сделать чтобы мои программы загружались автоматически?
Вы можете или загружать ваши программы при запуске (см. [11] Мой LISP больше не загружается при запуске) что создает потребность в большем количестве времени и памяти во время запуска, или Вы может определять их через механизм автозагрузки.
ARX (версии R14) программы используют новую схему автозагрузки, называемую загрузкой по потребности, которая использует несколько регистрируемых установок (в системном реестре) и не использует ACADR14.LSP.

В конце файла ACADR12.LSP для R12, или для R13 - ACADR13.LSP, можно увидеть как AutoCAD производит автозагрузку своих программ.

;;;===== AutoLoad LISP Applications ===== ... (autoload "dline" '("dline" "dl")) ...

Эти строки определяют список команд DLINE и DL из файла DLINE.LSP, которые будут загружены при первом обращении к ним. Ранее функция определялась просто как:

(defun C:DL () (load "DLINE")(C:DL))

Фактически это определение должно быть более сложным из-за обработки ошибок: Ctrl-C, неверный файл или путь.

После первого обращения функция перезаписывается поверх предыдущего определения.

Преимущества автозагрузки:
Запуск AutoCAD происходит быстрее, т.к. не надо загружать все lisp-файлы. Вам нужно сделать лишь объявить как показано выше. Что осуществляется с помощью функции (autoload).

Вы нуждаетесь в меньшем количестве памяти.

Недостатки:
При ошибках в Вашей программе Вы попадаете в замкнутый цикл, который можно остановить лишь после переполнения стека или нажав Ctrl-C
Примечания: используя acomp-компилированный код, остановка с помощью Ctrl-C невозможно, поэтому где-нибудь вставьте обращение на некомпилируемый (princ).

В autoload Вы должны определить и сохранять все имена команд из вашей программы. Изменения имени lisp-файла или имени команды вызовет вышеупомянутую ошибку.

Где помещать Ваши определения (autoload)?
Не в ACADR14.LSP. Мы рекомендуем помещать свои определения в отдельный файл, не в ACAD.LSP, т.к. этот файл будет часто изменяется разными приложениями а файл ACAD.LSP должен оставаться небольшим.

То есть, поместите свои определения в AUTOLOAD.LSP или INIT.LSP (их создаете Вы сами), и сделайте ссылку на него из ACAD.LSP См. [11] Мой LISP больше не загружается при запуске

Это должно быть упомянуто: пользователи *не* должны изменять ACADR13.LSP (или ACADR12.LSP, хотя это не было 'официально' до r13). С этих версий - ACAD.LSP не перезаписывается во время модернизации версии, что гарантирует сохранность. Кроме того (как получилось с исправлением (patch) R13c4a), если файл ACADR13.LSP был изменен, то процесс установки исправления не будет осуществлен.


[13] Как передать разное количество аргументов одной и той же функции LISP?

Напрямую, AutoLISP не может это сделать.

Вы можете передать необходимые аргументы списком, как например:

;;; печатает любое количество аргументов (любого типа) передаваемых функции (defun my-princ (x) ;; упрощенная версия, полную версию см. в SDK2: PRINTF.LLB (if (listp x) (mapcar 'princ x) (princ x)))

Или Вы должны определить функцию с помощью ADS или ARX и экспортировать ее в AutoLISP. Then you are free to write:

(ads-print "Hello " "World " 1 2 3) или даже (ads-printf "Hello %s %i %i" "World" 2 3)

Посмотрите ADS примеры от Reini Urban's и Vladimir Nesterovsky's - http://xarch.tu-graz.ac.at/autocad/ads/ - для бесплатного распространения.

Официально было объявлено о рассмотрении AutoDesk включения &optional как расширение языка AutoLISP, но это не было включено в состав версии R14.


[14] Как мне избежать переполнения стека?

В старом AutoLISP размер стека жестко фиксирован. Он не может быть расширен, но этот размер достаточен для большинства целей. В Visual Lisp IDE переполнение стека моделируется в 984 рекурсиях, в командной строке AutoCAD2000 или загруженных вне IDE программах не имеется никакой обработки переполнения больше. Это опасно при ваших ошибках рекурсии (см [9]). Большинство ошибок, связанных с переполнением стека, происходят из-за ошибок в ваших программах, предотвращая сбой системы в бесконечный цикл, или при использовании рекурсивныех функций при обработке больших списков. Следовательно Вы ограничены обработкой коротких списков рекурсивными функциями и старыми версиями.

Вы не сможете уменьшать используемый размер стека используя меньше локальных параметров в вашей рекурсивной функции! Старайтесь не использовать APPLY, EVAL или MAPCAR, для вызва вашей функции рекурсивно, т.к. они поедают стек. Использование остаточной рекурсии также не помогает. Вы будете должны преобразовать вашу рекурсивную функцию в итерационную. (Имеется математическая теорема, которая говорит, что каждая рекурсивная функция может быть преобразована в итерационную, а обратно-рекурсивную даже автоматически.) Итерационные версии могут использовать стеко-подобные функции как (push) и (pop), но эти версии хранят стек в куче(heap) (пространстве узлов (node) Autolisp), величина которого ограничена только размером Вашей виртуальной памяти.

Вы можете протестировать переполнение стека этой простой функцией:

;;; формирование списка из n чисел (zero based) (defun intlst (l n) (cond ((zerop n) l) (T (intlst (cons (1- n) l) (1- n))))) И попытайтесь: (setq n 100)(while (intlst nil (setq n (+ 10 n)))(print n)) В AutoLISP версии R12/DOS вы достигаете пределов стека с результатом (intlst nil 138), в A13/Win - (intlst nil 240), в acomp bi4's - (intlst nil 1240), в Vital LISP IDE - (intlst nil 984). При использовании R10c10, первой версии лисп для расширенного dos, Вы могли расширить размер стека используя системную переменную LISPSTACK. А при работе с Acomp для R10 имел переменную COMPSTACK. С современными версиями это уже невозможно. При использовании Vital LISP или Visual LISP RTS или AutoCAD 2000 размер стека неограничен.

Преобразование в итерационную форму приводит к ожидаемым результатам:

(defun intlst (n / l) (repeat n (setq l (cons (setq n (1- n)) l)))) ;это выглядит ужасно, но работает Единственная возможность физически увеличить размер стека, это ипользовать vlisp, ViLL или acomp интерпретатор ACADLC. См. [5].


[15] (command "ROTATE3D") не работает! Почему?

Некоторые команды не являются внутренними командами AutoCAD, а являются простыми AutoLISP-программами, начинающиеся с C:, включая те что определены в ADS.

Список всех этих команд можно найти в файле ACADR13.LSP в разделе AUTOLOAD. (см. также"[12]")
Все подобные команды должны вызываться, следующим образом (C:ROTATE3D) вместо (command "ROTATE3D").

Кроме вышесказанного, ADS функции способны получать дополнителные параметры. Для более подробной информации см. руководство пользователя.
Т.е. (c:rotate3d ss p1 p2 angle) также допустим, как и (rotate3d ...)


[16] LISP-программы, работающие с несколькими чертежами.

"У меня проблема в написании lisp программы, которая должна открывать чертеж и продолжать выполняться. Но, как только открывается новый чертеж, lisp-файл удаляется из памяти AutoCAD, и необходимо заново загружать его."
При загрузке чертежа LISP-память очищается. Но, существует несколько способов заставить работать lisp-программы с несколькими чертежами:
  1. Используя скрипт. MYSCRIPT.SCR. (load "mylisp") _QSAVE _OPEN !nextdwg (load "mylisp") _QSAVE _OPEN !nextdwg ...
  2. Внешние программы других разработчиков, такие как RunLisp или DDSCRIPT automate step 1.
  3. Версия R14 имеет новую возможность, называемую 'Persistent LISP'.
    Устанавливаемую в Preferences-Compatibility-Persistent Lisp
  4. Vital LISP имеет встроенную переменную действующую как Persistent Lisp:
    (setq *VILL-NEW-FULL-INIT* nil) ; хранит символы между сеансами
  5. аналогично у Visual LISP: (setq *VLISP-NEW-FULL-INIT* nil)


[17] Как экспортировать функции из Visual Lisp в AutoLISP/AutoCAD?

Функции C: автоматически экспортируются в AutoLISP. Функции vlisp/vill-lisp должны экспортироватся либо с помощью (vl-acad-defun 'myx-funcname), либо используя специальный компилятор pragma, либо должны быть определены в файлах LSP или GLD (файлы глобальных определений). Для таких функций лучше добавлять специальный префикс. .GLD: (AUTOEXPORT-to-ACAD-PREFIX ;| префиксы к названию функций автоматически экспортируемой в AutoCAD: (strings) |; "myx-*" ) или, один за другим .LSP: (pragma '((export-to-acad myx-func1 myx-func2))) Примечания: Используя vlisp или vill, при получении и возврате аргументов функций являющимися списками атомов или списками точечных пар могут произойти известные ошибки. См. [7].

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

Символы (переменные) значения которых изменяются в Visual Lisp, и используются AutoLISP-ом или AutoCAD-ом (например, меню), сначала должны быть отмечены для компилятора (который должен быть внешним): (pragma '((not-localize myx:symbol)))
а их значения экспортируются:
(vlisp-export-symbol 'myx:symbol)
всякий раз, когда значение переменной изменяется в Visual Lisp-е а управление возвращается AutoCADу, чтобы получить последнее ее значение в AutoLISPе или в AutoCADе: !myx:symbol

В AutoCAD 2000 это гораздо проще, но и здесь у вас может появится необходимость экспортировать ваши функции с защищенным пространством имен с помощью функции VL-DOC-SET. См. так же: http://www.autodesk.com/support/techdocs/td17/td175363.htm


Часть 2: примеры, код.


[20] Общие сервисные функции

Больше общих AutoLISP функций можно найти в Стандартной AutoLISP Библиотеки, см. http://xarch.tu-graz.ac.at/autocad/stdlib/ Еще немного можно найти на различных AutoLISP сайтах [1] и в SDK от Autodesk [1.2]

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

Вы, можете быть уверены что эти функции общеизвестны, как например знаменитые, dxf функция, которая определена как (defun dxf (grp ele) (cdr (assoc grp ele))) и особый аналог (getval) работающий с ename и entget списками.

[20.1] Работа со списками

См. http://xarch.tu-graz.ac.at/autocad/stdlib/STDLIST.LSP

Полезные утилиты для работы со списками:

;;; CONSP - не пустой список (a not empty list) (defun consp (x) (and x (listp x))) ;;; POSITION - возвращает индекс первого найденного значения, ;;; начиная с 0, или nil если не найден ;;; (position 'x '(a b c)) -> nil, (position 'b '(a b c d)) -> 1 (defun position (x lst / ret) (if (not (zerop (setq ret (length (member x lst))))) (- (length lst) ret))) ;;; REMOVE - Удаляет элемент из списка (допустимы двойные элементы) ;;; (remove 0 '(0 1 2 3 0)) -> (1 2 3) (defun remove (ele lst) ; (c) by Serge Volkov (apply 'append (subst nil (list ele) (mapcar 'list lst)))) ;;; REMOVE-IF - Удаление с условием, из плоского списка ;;; fun требует исключительно 1 аргумент ;;; (remove-if 'zerop '(0 1 2 3 0)) -> (1 2 3) ;;; (remove-if 'numberp '(0 (0 1) "")) -> ((0 1) "") (defun remove-if (fun from) (cond ((atom from) from) ;nil или символ (return that) ((apply fun (list (car from))) (remove-if fun (cdr from))) (t (cons (car from) (remove-if fun (cdr from)))) ) ) | ;;; REMOVE-IF-NOT - keeps all elements to which the predicate applies | ;;; say: "keep if", it need not be defined recursively, also like this. | ;;; [fixed, thanks to Serge Pashkov, in FAQ-CODE.LSP it was okay] (defun remove-if-not (pred lst) ; by Vladimir Nesterowsky (apply 'append (mapcar '(lambda (e) (if (apply pred (list e)) (list e))) lst))) ;;; ADJOIN - добавляет элемент ele в список если его там нет ;;; хитрость: принимает quoted списки ;;; (setq l '(1 2 3) (adjoin 0 'l) ;;; -> !l (0 1 2 3) (defun adjoin (ele lst / tmp) (if (= (type lst) 'SYM) (setq tmp lst lst (eval tmp))) (setq lst (cond ((member ele lst) lst) (t (cons ele lst)))) (if tmp (set tmp lst) lst) ) ;;; ROT1 - перемещает первый элемент списка в его конец, упрощенная версия ;;; (rotate by one) (defun rot1 (lst) (append (cdr lst) (list (car lst)))) ;;; BUTLAST - обрезает список удаляя последний элемент (defun butlast (lst) (reverse (cdr (reverse lst))))

[20.2] Обработка строк

См. http://xarch.tu-graz.ac.at/autocad/stdlib/STDSTR.LSP

Здесь приводятся несколько полезных функций для обработки строк:

Некоторые можно найти на http://xarch.tu-graz.ac.at/autocad/code/vnestr/strtok.lsp или в Вашем AI_UTILS.LSP. Он Вам нужен особенно для DCL функций.

[20.3] символ -> строку

Функция обратная (read) -(symbol-name). Не спрашивайте почему, но то что приводиться ниже является лишь общим решением: ;;; SYMBOL-NAME возвращает имя переменной как строку ;;; преобразует любое правильное лисп выражение в строку ;;; (symbol-name a) -> "a", (symbol-name '(0 1 2 a)) -> "(0 1 2 A)" (defun symbol-name (sym / f str tmp) (setq tmp "$sym.tmp") ;имя файла temp., должно быть удалено (setq f (open tmp "w"))(princ sym f) (close f) (setq f (open tmp "r") str (read-line f) f (close f)) str ) Для отдельных символов существует отличный трюк рассказанный Christoph Candido, см. http://xarch.tu-graz.ac.at/autocad/news/symbol-string.txt
Vill/vlisp внедрил быстрый vl-symbol-name. См. http://xarch.tu-graz.ac.at/autocad/stdlib/STDINIT.LSP

[20.4] Доступ к примитивам AutoCAD [SSAPPLY переименована в SSMAP]

См. также: http://xarch.tu-graz.ac.at/autocad/stdlib/STDENT.LSP

;;; возвращает первое значение группы примитива. ;;; подобно знаменитой функции (dxf), но принимающая любые ;;; представления примитива (ename, entget list, entsel list) ;;; ПРИМЕЧАНИЕ: Не годиться для получения ;;; группы 10 из LWPOLYLINE ! (defun GETVAL (grp ele) ;"dxf значение" любого примитива - ele... (cond ((= (type ele) 'ENAME) ;ENAME (cdr (assoc grp (entget ele)))) ((not ele) nil) ;пустое значение ((not (listp ele)) nil) ;не действительный ele ((= (type (car ele)) 'ENAME) ;entsel-список (cdr (assoc grp (entget (car ele))))) (T (cdr (assoc grp ele))))) ;entget-список ;;; Пример: (gettyp pline) => "POLYLINE" (defun GETTYP (ele) ;возвращает тип (getval 0 ele)) ;;; проверяет ENAME ;;; конвертирует примитив в тип ENAME (чтобы код был короче) (defun ENTITY (ele) ;конвертирует в имя примитива (cond ;работает со следующими типами: ((= (type ele) 'ENAME) ele) ; ENAME ((not (listp ele)) nil) ; ошибка: не список ((= (type (car ele)) 'ENAME) (car ele)) ; entsel-список ((cdr (assoc -1 ele))) ; entget-список или nil ) ) ;теперь стало проще: (defun getval (grp ele) (cdr (assoc grp (entget (entity ele))))) ;;; Пример: (istypep ele "TEXT") ;;; является ли элемент - "SOLID"? (defun istypep (ele typ) ;проверяет тип (= (gettyp ele) typ)) ;;; Пример: (istypep ele '("TEXT" "ATTDEF")) ;;; является ли элемент - "TEXT" или "ATTDEF"? (defun ISTYPEP (ele typ) ;улучшено, чтобы принимал списки (cond ((listp typ) (member (gettyp ele) typ)) ;исправлено ((stringp typ) (= (gettyp ele) typ)) ;преобразование typ в верхний (T nil))) ; регистр, использовать wcmatch ; было бы хорошо, но медленно ;;; Пример: (getpt (entsel)) => ( 0.1 10.0 24) (defun GETPT (ele) ;возвращает точку вставки любого элемена (getval 10 ele)) ;группа 10 ;;; Пример: (getflag pline) => 1 если закрыто (closed) (defun GETFLAG (ele) (getval 70 ele)) ;то же с флогом примитива ;;; Значение бита val в флажке установленного элемента? ;;; Пример: (flagsetp 1 pline) => T если закрыто (closed) ;;; Пример: (flagsetp 16 vertex) => T если контрольная точка сплайна (defun FLAGSETP (val ele) (bitsetp val (getflag ele))) ;;; Пример: (bitsetp 4 12) => T ;Значение бита 4 (=2.Bit) установлено в 12 (=4+8) (defun BITSETP (val flag) (= (logand val flag) val)) ;;; преобразует выборку в список. медленный, но легкий алгоритм. ;;; Примечания: рекомендуется использовать с ai_ssget, ;;; т.к. некоторые примитивы могут находиться ;;; в заблокированных (locked) слоях ;;; Пример: (sslist (ai_ssget (ssget))) => список выбранных ;;; не заблокированных примитивов ;;; или (mapcar 'entupd (sslist (ssget "X" '((8 . "TEMP"))))) ;;; - регенерирует все примитивы слоя TEMP (defun SSLIST (ss / n lst) (if (= 'PICKSET (type ss)) (repeat (setq n (sslength ss)) (setq n (1- n) lst (cons (ssname ss n) lst))))) ;;; выполняет функцию применяя ее ко всем примитивам ent ;;; ent из выборки ss, в обратном порядке ;;; Быстрая, но алгоритм не прост для понимания. см. [22.2] ;;; Пример: (ssapply 'entupd (ssget)) ; регенерирует только некоторые примитивы (defun SSMAP (fun ss / n) (if (= 'PICKSET (type ss)) (repeat (setq n (sslength ss)) (apply fun (list (ssname ss (setq n (1- n))))))))


[21] Примеры лисп программ:

[21.1] Изменения параметров текста и полилиний, утилиты для работы со слоями и установка даты

Для изменений атрибутов текста, используйте CHTEXT.LSP из директория SAMPLE.

Для изменений атрибутов полилиний, блокировки слоев по выбранному примитиву, и для решения прочих подобных задач ищите беслатные утилиты на сайтах AutoLISP библиотек. Также, см. [1], и немного на [22], [23], и [24].

Для автоматической распечатки даты на чертеж, проверьте поддерживает ли Ваш графопостроитель (plotter) HPGL/2. Если ДА, то используя HPGL/2 драйвер измените конфигурацию datestamp в HPCONFIG.

DATESTAMP.LSP: Сам изменяет атрибут заголовка чертежа, как в [22.2]. Профессиональная программа изменения даты см. на: http://ourworld.compuserve.com/homepages/tonyt/plotstmp.htm

[21.2] Диалог вывода на печать из лиспа. Используется DDE или ActiveX

Вызов диалога вывода на печать (PLOT dialogbox) возможен только на Windows платформе, например с помощью LISPPLOT от Mike Dickason http://www.cadalog.com/cadalog/files/lispd-l/lspplw.zip , или ftp://ftp.mcwi.com/pub/mcwi/lisp/winplt.lsp
Другое решение, заключается в том чтобы, написать скрипт и поместить его в конец лиспа, но при этом не появляется окно диалога.

Xiang Zhu: Под Windows Вы можете использовать "ddelisp", подобно:

;;; [исправлено для всех версий] (defun DDECMD (str / tmp acadver ddestr) (if (not (boundp 'initiate)) (cond ((= 14 (setq acadver (atoi (getvar "ACADVER")))) (setq ddestr "AutoCAD.R14.DDE") (arxload "ddelisp")) ((= 13 acadver) (setq ddestr "autocad.r13.dde") (xload "ddelisp")) ((= 12 acadver) (setq ddestr "autocad.dde") (xload "ddelisp")) (T (princ "DDE not supported")(exit)))) (if (not (zerop (setq tmp (initiate ddestr "system")))) (progn (execute tmp (strcat "[" str "]")) (terminate tmp) str))) Для версии R12, используя "autocad.dde" как имя сервера, Внутри своего лисп-приложения вы можете использовать (ddecmd "_plot "). Функция DDECMD возвращает значение nil если что-то не правильно, или переданную Вами строку, если ошибок нет. Но, строка будет идентичной той, что Вы можете напечатать в командной строке, т.е. в коммандной строке необходимо ввести пробел (Space) либо ввод (Enter), а к строке нужно добавить "^13".

Кроме того, вышеописаная функция очень полезна в следующей ситуации: Если в лиспе, Вам нужно вызвать прозрачную команду автокада, как например LAYER (слой), то в порядке вещей будет использовать (command "_layer"). После этого, сам лисп перестает быть прозрачным, но используя вышеупомянутую функцию удается решить эту проблему.

Запомните! Acad работает с командами DDE только через командную строку, т.е. окна открываться не будут.

Работая с vlisp/ViLL Вам доступны ActiveX методы:

;;; синтаксис vlisp: (setq vlax:ActiveDocument (vla-get-ActiveDocument (vlax-get-Acad-Object))) (setq plt (vla-get-plot vlax:ActiveDocument)) ;=> печатуемый объект (vla-PlotWindow plt pt1 pt2) ; определяет окно (pts in WCS) (vla-PlotPreview plt 1) ; 0 для фрагмента, 1 - целиком (vla-PlotToDevice plt "Default System Printer") ; если он существует В версии R14 представлена функция initdia, которая применима к большинству, но не ко всем диалогам:
(initdia)(command "_PLOT")

В AutoCAd 2000 вместо DDE используется OLE (VLA-методы).

[21.3] (entmod) и (entmake) Слоев, не используя (command "_LAYER"...)

Работа со слоем используя ENTMOD
Я, задался целью, в лисп программе изменить свойства слоя, при этом не применяя функции COMMAND.

Под r13, использовал следующий лисп:

(setq tbl_lst (entget (tblobjname "LAYER" "ANY_LAYER")) clr_grp (assoc 62 tbl_lst) ) (entmod (subst (cons 62 (- (cdr clr_grp))) clr_grp tbl_lst)) Так Вы можете блокировать/разблокировать любой слой, "ANY_LAYER", даже если это текущий слой.

AutoCAD не узнает что ввод в таблицу был изменен, пока Вы не нажмете Layer Control на панели инструментов или на чем-нибудь подобном. Кроме того, Вы можете использовать 'DDLMODES чтобы посмотреть свойства Вкл./Выкл. любого, "ANY_LAYER", измененного слоя.
Если тем же способом заморозить слой, то Вы будете видеть находящиеся там примитивы, хотя и не сможете их выбрать. Это продолжится до тех пор, пока Вы не активизируете какую-либо команду для работы со слоями, и только тогда автокад удалит их с экрана.

Работа со слоем используя ENTMAKE
Вам нужно получить шаблон используя entget, при этом используя, как аргумент, имя из таблицы объектов. Это имя можно получить с помощью функции TBLOBJNAME: (entget (tblobjname "LAYER" "ANY_LAYER_NAME")) ;;; Эта программа создает слой с заданным вами именем: (defun c:mlay () ; от Reinaldo Togores <rtogores@mundivia.es> (setq laynam (getstring "\nНазвание слоя: ")) (entmake (list '(0 . "LAYER") '(5 . "28") '(100 . "AcDbSymbolTableRecord") '(100 . "AcDbLayerTableRecord") (cons 2 laynam) '(70 . 64) '(62 . 7) '(6 . "CONTINUOUS") ) ) )
[21.4] Как выбрать несколько файлов в лиспе? (как в FILES - Unlock)

[21.5] Замена нескольких блоков

Ищите в лисп-коллекциях:
Cadalyst: http://www.cadonline.com/search.phtml
=> 97code.htm , вопрос об имени пользователя решается бесплатно и автоматически.
xarch: http://xarch.tu-graz.ac.at/autocad/code и ищи запрашивая "BLOCK;REPLACE"
=> http://xarch.tu-graz.ac.at/autocad/code/cadalyst/94-02/replace.lsp
а также см. Cadalog:
http://www.cadalog.com/find.htm Ключевые слова "Block Replace"
=> http://www.cadalog.com/cadalog/files/lispr-z/replace.zip (это наилучший сайт)

[21.6] (vports), VIEWPORT примитив, преобразование пикселей
Примитив VIEWPORT:
Ответ на вопрос, "Использовал (entget), чтобы из VIEWPORT получить нижний-левый угол (DXF группа 10) и верхний-правый угол (DXF группа 11). Но, получаемые значения предсавлены в координатах "paper" пространства. Меня интересует какая часть, "настоящего" чертежа (координаты "model" пространства), показывается в текущем видовом окне.", смотри на http://xarch.tu-graz.ac.at/autocad/news/vports.lsp

Несколько трюков можно посмотреть на http://www.ez-sys.net/~coopfra/lisp.htm#view.

Как изменить видовой экран используя AutoLISP?
Используй (setvar "CVPORT" vport-id) см. http://xarch.tu-graz.ac.at/autocad/news/change_vports.html

Ниже, приведены функции позволяющие преобразовывать пиксель<->единицы чертежа:

;;; Преобразование пикселей в единицы чертежа (defun PIX2UNITS (pix) (* pix (/ (getvar "VIEWSIZE") (cadr (getvar "SCREENSIZE"))))) ;;; Преобразование единицы чертежа в пикселей (defun UNITS2PIX (units) (* units (/ (cadr (getvar "SCREENSIZE"))(getvar "VIEWSIZE")))) Обратите внимание на ошибки "Pixel Off by One" автокада, описаные Vibrant, см.: http://xarch.tu-graz.ac.at/autocad/news/pixel-off-by-one-error.txt

[21.7] Выбор всех видимых объектов: координаты масштабирования
Не делайте этого используя (ssget). Получиться выборка из объектов видимых только в текущем видовом экране, т.к. все интерфейсные функции (entsel,ssget,osnap) работают с пикселями, и лишь (ssget "X") выберет все видимые объекты, включая те что находятся за пределами видового экрана. ;;; возвращает список координат углов текущего видового экрана ;;; в WCS системе координат (defun zoompts ( / ctr h screen ratio size size_2) (setq ctr (xy-of (getvar "VIEWCTR")) ;3D -> 2D h (getvar "VIEWSIZE") ;real screen (getvar "SCREENSIZE") ;2D: Pixel x,y ratio (/ (float (car screen)) ;aspect ratio (cadr screen)) size (list (* h ratio) h) ; screensize in coords size_2 (mapcar '/ size '(2.0 2.0))) (list (mapcar '- ctr size_2) (mapcar '+ ctr size_2))) (defun xy-of (pt) (list (car pt)(cadr pt))) ;assure 2D coords Примечания: Точки возвращенные с предприятия - в WCS но это - OK поскольку "CP" "WP" и "P" выборы ssget ожидают точки WCS ("W" и "C" требует, что точки UCS - почему различие, которое Я не знаю) Точки возвращаемые примитивом представлены в WCS системе координат, и это хорошо, т.к. опции "CP", "WP" и "P" требуют точки в WCS (опции "W" и "C" требуют точки в UCS координатах - разницу не понимаю). ;;; один из спопобов определения функции (defun ssall-visible (/ l) (ssget "C" (car (setq l (maptrans0-1 (zoompts)))) (cadr l))) ;;; еще один (defun ssall-visible-1 () ;объединяет "C" и (p1 p2) в один список (apply 'ssget (append '("C") (maptrans0-1 (zoompts))))) ;;; преобразует несколько точек из WCS в UCS, ;;; легко с одним аргументом [исправлен] (defun maptrans0-1 (pts)(mapcar '(lambda (pt)(trans pt 0 1)) pts))
[21.8] Как записать XYZ значения, выбранных объектов, в файл?

;;; CDF - строки ограниченные запятыми (defun cdf-point (pt) (strcat (car pt) ", " (cadr pt) ", " (caddr pt))) ;;; SDF - ограниченные прбелами, ;;; легко обратно считывается AutoCAD (defun sdf-point (pt) (strcat (car pt) " " (cadr pt) " " (caddr pt))) ;;; Преобразует SDF фомат обратно в точку (defun str->point (s) (eval (read (strcat "(" s ")")))) ;;; Записывает в XYZ файл все выбранные ;;; объекты (SDF см. ниже) (defun C:XYZ (/ ss fname f) (if (and (setq ss (ssget)) (setq fname (getfiled "Запись XYZ в файл" (strcat (getvar "DWGNAME") ".XYZ") "XYZ" 7)) (setq f (open fname "w"))) (foreach ele (sslist ss) ; -> [20.4] (foreach pt (getpts ele) ; -> [23.1] (write-line (cdf-point pt) f) ) ) ) (if f (close f)) ) ;;; => <fname>.xyz ;;; 0.45, 12.3, -34.0 Для преобразования в ASC файл (SDF-формат) нужно заменить все XYZ на ASC, и cdf-точку(cdf-point) на sdf-точку(sdf-point).

Другой способ: создавай PLINES используя ascii x,y файл, лучше всего преобразовать файл в некий скрипт похожий на:

PLINE 300.2,10 350.4,10.4


[22] Атрибуты блоков

[22.1] Как получать доступ к атрибутам блоков?
Проверьте все примитивы после INSERT пока не будет обнаружен нужный Вам атрибут. Также см. http://www.autodesk.com/support/techdocs/td30/td300518.htm -> "Retrieving Complex Entities and Sub-entities with AutoLISP" ;;; возвращает список entget атрибута s (STRING) в элементе ele (ENAME) ;;; или nil - если не находит его (defun ATTELE (ele attname / rslt) (if (and (istypep ele "INSERT") (= (getval 66 ele) 1)) (progn (setq ele (entnext (entity ele))) (while (and ele (istypep ele "ATTRIB")) (if (= (strcase (getval 2 ele)) (strcase attname)) (setq rslt (entget ele) ele nil) ;прерывает цикл (setq ele (entnext ele)) ) ) ) ) rslt ) ;;Пример: (attele (entsel) "TEST") ; возвращает список entget ; атрибута "TEST" если он есть в блоке BTW: Более сложные функции, GET и EDLGETENT, для получения группы кодов DXF примитивов представлены Vladimir Nesterowsky. ;;;Пример вызова: ;;; возращает список из значений групп 2, 1 и -1 (defun get-attribs-look-up (block-ename) (get '(2 1 -1) (cdr (edlgetent block-ename)))) (defun all-verticies-and-bulges (pline-ename) (get '(10 42) (cdr (edlgetent pline-ename)))) см. http://members.tripod.com/~vnestr/

[22.2] Как изменить (MODIFY) атрибуты блока? DATESTAMP
Используйте entmod, и список entget будет извлечен из (attele). ;;; изменяет значение атрибута на новое, группа 1 (defun ATTCHG (ele attname new / b) (if (setq b (attele ele attname)) (entmod (subst (cons 1 new) (getval 1 b) b)))) ;;; Изменяет все DATESTAMP атрибуты ;;; во всех вставках блока PLOT* (defun C:DATESTAMP () (ssapply ;исправл. 13.Сент 97 ;args the other way 'round '(lambda (ele) (attchg ele "DATESTAMP" (today)) (entupd ele) ) (ssget "X" '((0 . "INSERT")(2 . "PLOT*"))) )) ;;;возвращает текущую дату, ;;;может быть DIESEL или преобразованная строка (defun TODAY (/ s) (setq s (rtos (getvar "CDATE") 2)) ;получает дату по Юлианскому календарю (strcat (substr s 5 2) "-" (substr s 7 2)"-"(substr s 3 2)))
[22.3] Как подкорректировать (UPDATE) атрибуты блока?
В директории ..\SUPPORT\ должен быть файл ATTREDEF.LSP, служащий чтобы корректировать своиства атрибутов вставленных блоков (положение, слой,...).

К сложным примитивам Вы должны применить entupd, чтобы произошло обновление экрана (она принуждает к выполнению REGEN). ;;; Пример: (setq s (getstring "Изменить атрибут на: ")) (attchg (attele (setq b (entsel "из блока: ")) s))) (entupd (car b)) ; указывается блок, а не атрибут ;;; дополнительные функции позволяющие получить ;;; основные примитивы из атрибута или блока (defun MAIN-ENTITY (ele) (setq b (entity b)) ;force ENAME (while (istypep b '("ATTRIB" "ATTDEF" "VERTEX")) (setq b (entnext b))) ; повторяется пока ; не закончаться примитивы (if (istypep b '("SEQEND" "ENDBLK")) (getval -2 b) ;сложный примитив -> заголовок b ;обычный примитив ) )

[22.4] Как создать блок со сложными примитивами в AutoLISP с использованим ENTMAKE>
см. http://www.autodesk.com/support/techdocs/td30/td301515.htm

Это пример многократного использования (entmake) для создания заголовка блока (block header), примитивы (entities), закрыть блок (closes the block) и наконец для его вставки (INSERT) в чертеж. Для анонимных блоков запомните что только (setq bn (entmake '((0 . "ENDBLK")))) возвращают имя блока для (entmake (list '(0 . "INSERT")'(70 . 1)(cons 2 bn) ...))


[23] Полилинии

В версии R14, LWPOLYLINE сохраняет все вершины в одном примитиве как множество 10 групп!
[23.1] Как получить вершины (VERTICES) полилинии?
Вершина (VERTEX) полилинии, является дочерним примитивом POLYLINE (также, как атрибут (ATTRIBUTE) - дочерний примитив элемента всавки (INSERT element) или ATTDEF блока (BLOCK)). Следовательно, можно использовать те же функции что и в [22.1]-[22.3]. ;;; возвращает только некоторые ассоциативные(assoc) ;;; значения в список (для LWPOLYLINE) (defun group-only (grp lst) (mapcar 'cdr (remove-if-not '(lambda(pair)(= grp (car pair))) lst))) ;;; возвращает список вершин полилинии ;;; или любого другого элемента (defun GETPTS (ele / pts) (setq ele (entity ele)) ;force type ENAME (cond ((istypep ele "POLYLINE") (while (istypep (setq ele (entnext ele)) "VERTEX") ;; опускает точки сглаживания(fit) и ;; сплайновые (spline) точки (консервативный стиль) (if (not (or (flagsetp 1 ele) (flagsetp 8 ele))) ;устранена ошибка! (setq pts (cons (trans (getpt ele) ele 0) pts))) (reverse pts))) ;; Особый случай: нужно упорядочить вершины, ;; assoc обнаруживает только первую. ;; Исправляет ошибку LWPOLYLINE версии R14: ;; сохраненяется как 2d точка, (entget) ;; возвращает невероятные значения z. ((istypep ele "LWPOLYLINE") (mapcar '(lambda(pt)(trans (list (car pt)(cadr pt) 0.0) ele 0)) (group-only 10 (entget ele)))) ;; включить сюда можно и другие типы, например ((istypep ele '("TEXT" "CIRCLE")) (list (getpt ele))) ;; или так: (serge's стиль). Код LWPOLYLINE. (T (apply 'append (mapcar '(lambda (n / p) (if (setq p (getval n ele)) (list p))) '(10 11 12 13))) ) ;; или так: (консервативный стиль) ;;(T (foreach n '(10 11 12 13) ;; (if (setq p (getval n ele)) (setq pts (cons p pts)))) ;; pts ;;) ) ) Решения от Vladimir Nesteroswky для различных вершин: См. [22.1] (defun vertices-and-bulges( pline-ename ) (mapcar 'cdr (remove-if-not '(lambda(ele) (bitsetp 9 x)) (get '(70 10 42) (cdr (edlgetent pline-ename)) => список (10 42) пары полилинии ;;;можно записать иначе: (defun flag9p (ele) (flagsetp 9 ele))) ;true если fit или spline точка (mapcar '(lambda (ele) (remove-if-not 'flag9p (cdr (edlgetent pline-entname)))) См. также [23.5], для различных структур граней (сегментов) полилиний.

[23.2] Как объединить (JOIN) несколько линий в полилинию? [исправлено]
Просто попытайтесь выбранные элементы между собой, но будьте осторожны, уже присоединенные примитивы не могут быть повторно присоединены (entget), т.к. после первого присоединения исходный примитив удаляется. ;;; Этот пример преобразует все выбранные ;;; элементы в полилинию и объединяет ;;; всё возможное. (defun C:JOINPOLY (/ ele ss) (foreach ele (sslist (setq ss (ssget))) ;улучшен. вариант образования списка (if (entget ele) ;проверяет присоединен ли элемент (cond ;(если да то присваивает nil) ((istypep ele '("ARC" "LINE")) ;; Вы должны проверить координату Z линий и UCS (command "_PEDIT" ele "_y" "_j" ss "" "") ;преобразование и ;присоединение(JOIN) ) ((and (istypep ele '("POLYLINE" "LWPOLYLINE")) ;исправлено (not (flagsetp 1 ele)) ;не замкнутая (< (rem (getflag ele) 128) 8)) ;игнорируются сетки (meshes) ;и прочее подобное (command "_PEDIT" ele "_j" ss "" "") ;для краткости опускается ;проверка ucs ) ) ) ) )
[23.3] Изменение толщины (WIDTH) нескольких полилиний
С помощью вышеописанной вспомогательной функции получаем короткий код: (defun C:POLYWID (/ wid ele) (initget 5) (setq wid (getdist "Новая толщина полилинии: ")) ;не отрицательное значение (foreach ele (sslist (ssget '((0 . "*POLYLINE")))) ;только полилинии (PLINES) (command "_PEDIT" ele "_W" wid "")))
[23.4] Создание полилинии (polyline) или сплайна (spline) используя (ENTMAKE) или (COMMAND)
  1. Вы можете написать скрипт к лисп-программе и работать с ним. Это простой путь. Но тогда Вы не защищены от ошибок ввода/ввывода во время записи/считывания скрипта. Если Вы пишите коммерческую программу, то должны учесть возможные ошибки.
  2. Другой путь, заключается в создании списка примитивов и использовании ENTMAKE. Преймущества: работает быстро, в WCS, не зависит от текущих привязок(osnaps).
    см. http://www.autodesk.com/support/techdocs/td30/td300510.htm
  3. Третье решение основано на использовании command и mapcar. Работает с полилиниями, сплайнами и линиями. Недостатки: UCS, и привязки (osnaps) ;;; Чертит полилинию (POLYLINE) из списка точек ;;; (тоже самое с сплайнами (SPLINE), и линиями (LINE)), ;;; в текущих координатах UCS, с текущими активными ;;; привязками (OSNAP settings) (defun DRAW-PLINE (pts) (command "_PLINE") (mapcar 'command pts) (command "")) (defun DRAW-SPLINE (pts) (command "_SPLINE") (mapcar 'command pts) ; the pts must be the fitpoints then (command "" "" ""))

[23.5] Как вычислить длину (LENGTH) полилиний? [новые функции]
Существуют два решения:
  1. очевидный, использовать команду ПЛОЩАДЬ (AREA), хотя и довольно "шумная" (выводит результат), зато работает даже со сплайнами. ;;; приплюсовывается длина (LENGTH) всех выбранных ;;; объектов, ШУМНО (во время работы функции ;;; выводится лишняя информация на экран), вы ;;; можете сделать то же самое для ПОЛЩАДИ(AREA): ;;; просто замените последнюю строчку на (getvar "AREA") (defun C:LEN-OF () (command "_AREA" "_A" "_E") ;добавляет объект (работает в R12,R13) (ssapply 'command (ssget)) ;передает все элементы в AutoCAD (command "" "") ;два возврата (getvar "PERIMETER")) ;а вот и длина
  2. Использование некоторых математиких выражений, только для несложных объектов. Этот вариант хорош для определения некоторых полезных функций, и является введением к следующему разделу [24], немного тригонометрии для скругленных сегментов.

    ;;; вычисление длины полилинии (defun POLY-LENGTH (poly / seg) (apply '+ ; сумма длин всех единичных сегментов (mapcar '(lambda (seg) ;длина сегмента (if (zerop (car seg)) (distance (cadr seg) (caddr seg)) ;линейный сегмент или (abs (arclen seg seg)))) ;скругленный: см. ниже в [24] (pline-segs poly)))) ;;; возвращает все коды групп коды сложного элемента ;;; (вершины, атрибуты) как список, подобный (edlgetent) (defun CPLX-LIST (grp ele / lst) (if (= 1 (getval 66 ele)) (progn (setq ele (entnext (entity ele))) (while (and ele (not (istypep ele "SEQEND"))) (setq lst (cons (getval grp ele) lst) ele (entnext ele))) (reverse lst)))) ;;; PLINE-SEGS - Создает список сегментов для полилинии pname ;;; как список '(bulge p1 p2). Первая строка имеет bulge 0.0 ;;; Вычисление точек в ECS pname. Принимает LWPOLYLINE (defun pline-segs (pname / pts segs) (setq segs (mapcar 'list (if (istypep pname "LWPOLYLINE") (group-only 42 (entget pname)) (cplx-list 42 pname)) (setq pts (getpts pname)) (rot1 pts))) ; ->[20.1] (if (flagsetp 1 pname) segs ;замкнутая плиния (butlast segs))) ;открыта: без последнего сегмента, ->[20.1] ;;; Пример: (оптимизирован для краткости) ;;; суммируется длина всех полилиний, ТИХО ;;; Чтобы принять и другие примитивы, добавьте в pline-segs (defun C:POLYLEN () (apply '+ (ssapply 'poly-length (ssget '((0 . "*POLYLINE"))))))
Для определения суммы площадей можно использовать "шумную" команду AREA или используют формулу heron-а для определения площадей полигонов (только для простых закрытых полигонов).

[23.6] Как изменить направление полилинии?
Программа Sergei Komarov, REVPOLY.LSP, учитывает выпуклости и ширину.
http://xarch.tu-graz.ac.at/autocad/news/lisp_pro/revpoly.lsp
Короткая stdlib-версия такова: ;;; игнорируем любую информацию о ширине (defun POLY-REVERSE (segs) (reverse (mapcar '(lambda (seg) (std-make-seg (std-seg-p2 seg)(std-seg-p1 seg) (- (std-seg-bulge-num seg)))) segs))) (defun C:POLYREV (/ ele) (std-require "ENTMAKE") (if (setq ele (car (entsel "\nRevert Poly: "))) (std-entmake-pline (std-entget ele) (poly-reverse (std-pline-segs ele)))))

[23.7] Как получить центр полилинии?
Центр тяжести SOLID-a может быть получен с помощью MASSPROP. Вы можете записать это файл, что бы потом проанализировать. Центр тяжести полилиний отличный на средний вектор. Геометрическая середина некоторых точек определяется просто: (setq n (float (length pts))) (list (/ (apply '+ (mapcar 'car pts)) n) (/ (apply '+ (mapcar 'cadr pts)) n)) Найти настоящий центр тяжести более сложно. В stdlib это выполняет STD-CENTROID-2D: http://xarch.tu-graz.ac.at/autocad/stdlib/STDPOINT.LSP В stdlib.arx или на www.manusoft.com также лучшая MASSPROP lisp-функция для солидов. Затем Вы делаете (command _REGION" ele)...(massprop entlast)...(command "_UNDO" 1)


[24] Геометрия Круга/Дуги (Circle/Arc): преобразование ВЫПУКЛОСТИ(BULGE), немного тригонометрии

Что такое ВЫПУКЛОСТЬ в полилинии?

Выпуклость равняется тенгенсу одной четверти внутреннего угла изогнутого сегмента. При значении выпуклости равной 0.0 сегмент - прямая (отрезок). Имея начальную и конечную точку, легко вычисляется и все остальные параметры изогнутого сегмента. Негативная выпуклость - вращение по часовой стрелке ("Математический негатив").


  arclength = radius*angle		

  bulge = +-tan(ang)/4            (CCW: +, CW -)

  angle = atan(4*bulge)

  bulge = +-(2*altitude) / chord  (CCW: +, CW -)



 где,

	arclength	- длина дуги

	radius 		- радиус

	angle, ang	- внутренний угол изогнутого сегмента

	bulge		- выпуклость

	altitude	- высота дуги

	chord		- хорда



См. также http://www.autodesk.com/support/techdocs/fax700/fax797.htm - примеры программ, или книгу "Maximizing AutoLISP" [2]

(исправлена ошибка, не верная формула! Спасибо Sergei Komarov)

;;; SEG2CIR - преобразует выпуклый сегмент ;;; (bulge pt1 pt2) полилинии в окружность (ctr rad). ;;; Известны начальная и конечная точки, ;;; следовательно можно определить и ;;; углы (angle ctr pt1)(angle ctr pt2). ;;; На неизогнутом сегменте возвращает nil ! (defun SEG2CIR (seg / bulge p1 p2 cot x y rad dummy) (if (zerop (car seg)) nil (setq bulge (car seg) p1 (cadr seg) p2 (caddr seg) cot (* 0.5 (- (/ 1.0 bf) bf)) x (/ (- (+ (car p1) (car p2)) (* (- (cadr p2) (cadr p1)) cot)) 2.0) y (/ (+ (+ (cadr p1) (cadr p2)) (* (- (car p2) (car p1)) cot)) 2.0) rad (distance (list (car p1) (cadr p1)) (list x y)) dummy (list (list x y) rad) ; return this, I hate progn's ) ) ) ;;; ARC2SEG - обратное преобразование: ;;; вычисляет сегмент дуги (bulge p1 p2) ;;; по задаваемому кругу (ctr rad), ;;; начальному-углу, конечному-углу (defun ARC2SEG (cir ang1 ang2 / p1 p2) (setq p1 (polar (car cir) ang1 (cadr cir)) p2 (polar (car cir) ang2 (cadr cir))) (list (arc2bul p1 p2 cir) p1 p2) ) | ;;; ARC2BUL - вычисляет выпуклость дуги | ;;; по задаваемым точкам дуги и окружностью | ;;; (ctr rad) [исправлено Serge Pashkov] (defun arc2bul (p1 p2 cir / ang) (setq ang (- (angle (car cir) p2) (angle (car cir) p1))) (if (minusp ang) (setq ang (+ (* 2.0 pi) ang))) (tan (/ ang 4.0))) ;;; BUL2ANG - возвращает угол дуги (выпуклость) (defun bul2ang (seg / ctr) (- (angle (setq ctr (car (seg2cir seg))) (cadr seg)) (angle ctr (caddr seg)))) ;;; ARC2ANG ;;; вычисляет угла дуги по ;;; задаваемым длине хорды и радиусу (defun arc2ang (chord rad) (* 2.0 (atan (/ chord 2.0 (sqrt (- (expt rad 2) (expt (/ chord 2.0) 2) ) ) ) ) ) ) ;;; ARCLEN - длина дуги = радиус *угол (в радианах) ;;; Примечания: +-, Для определения расстояния ;;; используйте (abs (arclen seg)) (defun arclen (seg) (* (cadr (seg2cir seg)) ; радиус 4.0 (atan (car seg)))) ; angle = 4*atan(bulge) (setq *INFINITY* 1.7e308) ; наибольшее знач. double (defun tan (z / cosz) ; [fixed] (if (zerop (setq cosz (cos z))) *INFINITY* (/ (sin z) cosz))) (defun dtr (ang)(* pi (/ ang 180.0))) ; градусы в радианы (defun rtd (ang)(/ (* ang 180.0) pi)) ; радианы в градусы


[25] DCL: диалоговые списки (listboxes) с метками табуляции или монотекстовым шрифтом

Под Windows довольно проблематично форматировать текст, т.к. в основном используются шрифты с нефиксированной шириной символов.

Попробуйте форматировать текст в list_box используя атрибут табуляции.
Например:

tabs = "0 20 40"; и (set_tile "listbox" "Слой:\t0\twhite") или попробуйте другой алгоритм, использующий шрифт с фиксированной шириной символов: : list_box { label = "Чертеж"; key = "dwglist"; width = 50; fixed_width_font = true; // <- установлен флажок фикс. шир. шрифта } Также неплохо ознакомиться с программой detab, http://xarch.tu-graz.ac.at/autocad/news/detab.lsp что бы конвертировать табуляции в пробелы


[26] EED Расширенные Данные Примитива: Выбрать, Получить и Сохранить

(EED Extended Entity Data: Select, Get and Store)
[26.1] Выбор объектов с EED используя (ssget "X") ;;; определяет Ваш загловок appname (имя прикладной прогр.) ;;; и разделитель (egapp name - 4 симв. в соответствии с AAIG) ;;; AAIG - Autodesk Application Interoperation Guidelines (setq appname "HUBU-") ;;; defines * for all sub types (setq allappnames (strcat appname "*")) ;;; например: HUBU-LIST1, HUBU-LIST2 ;;; так получаем список eed одного элемента (defun geteed-lst (ele) (cdadr (assoc -3 (entget ele (list allappnames))))) ;;; получаем все элементы appnames typ ;;; (допускаются шаблоны (wildcards)) (defun ssget-app (typ) (ssget "X" (list (list -3 (list typ)))) ;;; получаем только Вами выбранные элементы (defun ssget-hubu (typ) (ssget "X" (list (list -3 (list (strcat appname typ))))) (ssget-hubu "*") ; получаем все Ваши элементы
[26.2] Получить EED из объекта

Ищет любые XDATA: (entget (car (entsel)) '("*"))

Эти функции возвращают все найденные XDATA по regapp name или значениям XDATA.

;;; GETXDATA - получает все ;;; списки XDATA, из одного элемента ;;; Пример с XDATA: ;;; (-3 ("HUBU-1" (1000 ."ASSHATCH")(1002 ."{") ;;; (1070 . 1)(1002 ."}"))) ;;; =>(("HUBU-1" (1000 ."ASSHATCH")(1002 ."{")(1070 . 1)(1002 ."}"))) (defun getxdata (e apnlst) (cdr (assoc -3 (entget e apnlst)))) ;;; GETXDATA-ALL - все списки без regapp name ;;; => ((1000 ."ASSHATCH")(1002 ."{")(1070 . 1)(1002 ."}")) (defun getxdata-all (e apnlst) (apply 'append (mapcar 'cdr (getxdata e apnlst)))) В данном случае, опущено regapp name, т.к. оно используется лишь для более быстрого доступа ssget. Другие приложения (apps) разделяются другими группами (1000 . name), как это используется Autodesk.

Для сохранения XDATA в определенном элементе, см. XDATA.LSP или XED.LSP.

Чтобы ознакомиться с другими трюками, для работы с EED, как например преобразование "{" "}" ADS resbuf стиль в Lisp-списки и обратно, см.http://xarch.tu-graz.ac.at/autocad/news/eed_retrieval.txt


[27] Как мне послать Ctrl-C команде?

Или: "Как мне прервать команду из AutoLISP?"

(command) без параметров работает как нажатие в командной строке клавиш Ctrl-C в R12 или Esc в R13. Но, это решение непригодно для диалоговых окон (dialog box) или скриптов (SCRIPTS). (command nil) - это то же самое что (command).

(command) прерывает только командные функции. Например, если Вы используете комаду "DIM" под AutoLISP, Вы должны прервать ее с помощью (command) после того как задали необходимые Вам размеры.

Это решение непригодно для прервания циков лиспа. Для этого используются другие функции - (exit) или (quit), они так же прерывают и работу самой лисп программы.

Пример:

(while T ; do ; бесконечный цикл (princ "\nEnter a=") (setq a (getint)) (if (zerop a)(exit)); Прерывает Lisp и возвращается ; в режим командной строки ) В этом примере (command) не работает. (exit) работает точно как Ctrl-C. Но, выдает сообщение "error: quit / exit abort" и выполняет все вложенные функции. Для того чтобы обеспечить "тихое" прерывание Вы должны включить это сообщение в функцию обработки ошибок.
Например: (setq olderr *error* *error* my_error) (defun my_error (s) (if (not (member s ; msgs of the english version: '("Function cancelled" "console break" "quit / exit abort"))) (princ (strcat "\nError: " s)) ) (setq *error* olderr) )

Для использовании в скриптах просто определите функцию (cancel) в автолиспе:

(defun cancel() (command) (command "resume") ) и включите в SCRIPT.SCR: .. [script commands] (cancel) [more script commands] ..


[27.1] Как как сделать неограниченное число пользовательских сообщений?

[new] Позволить пользователю заканчивают любую выбранную команду, без необходимости писать код для каждого возможного варианта выбора, только повторять (command PAUSE) до тех пор, пока команда не завершит работу. (command "_ARC") (while (= 1 (logand (getvar "CMDACTIVE") 1)) (command PAUSE))


[28] Как декодировать внутренюю геомериию ACIS используя Lisp?

Все ACIS объекты (3DSOLID) описаны Spatial ("SAT Format Description"). Тем не менее, внутреннее описание используемое (entget) оставалось зашифрованным, на алгоритм шифровки был взломан. (XOR 95)

Пример кода на: http://xarch.tu-graz.ac.at/autocad/stdlib/samples/ACIS-REGION.LSP [new]



[A] Замечания от авторов

This AutoLISP FAQ is (c) 1996,97 by Reini Urban. All rights reserved.
Коды представленных примеров, если не указан другой автор, (c) 1991-97 by Reini Urban и могут быть использованы бесплатно, но не в коммерческих целях.
Основные функции, если не указан другой автор, (c) 1991-97 by Reini Urban и могут быть использованы бесплатно.

Разрешается свободное распространение полного текста данного ЧаВо, при условии что указываются авторские права. Продажа и включение в состав коммерческих документов (например: включать в коммерческие CD-ROMы, флоппи-диски, книги, и любые другие формы) запрещается, без предварительного согласия владельца авторских прав.

В случае, если Вы увидите оффлайновую публикацию данного документа (например, CD-ROM, любые печатные формы, и т.д.), то копия должна быть отослана Reini Urban, X-RAY, Rechbauerstr. 38, 8010 Graz, Austria

Этот документ, как и содержащиеся в нем примеры, представлены ТАК КАК ЕСТЬ (AS IS), и никакие претензии или жалобы не принимаются.


[A.1] Где найти этот ЧаВо (FAQ)
Главная страница HTML версии:
http://xarch.tu-graz.ac.at/autocad/news/faq/autolisp.html
Версии в ascii (и всегда самые последние версии) см. на
http://xarch.tu-graz.ac.at/autocad/news/faq/autolisp.1
http://xarch.tu-graz.ac.at/autocad/news/faq/autolisp.2
Версия справки windows (Winhelp) - *.hlp (архивирована zip и включает в себя faq-code.lsp), см.
ftp://xarch.tu-graz.ac.at/pub/autocad/news/faq/autolisp.zip
Версия usenet архива см. на
ftp://rtfm.mit.edu/pub/usenet-by-hierarchy/comp/cad/autocad/comp.cad.autocad_AutoLISP_FAQ или на http://www.faqs.org/faqs/CAD/autolisp-faq/part1/
Лисп исходники для данного ЧаВо см. на
ftp://xarch.tu-graz.ac.at/pub/autocad/news/faq/FAQ-CODE.LSP
A french translation of the FAQ was made by Roger Rosec
http://www.newz.net/acadplus/page5101.htm
A japanese translation of the FAQ was made by MASAMI Chikahiro
http://www.page.sannet.ne.jp/chestnutsburr/autolisp-j.html
A russian translation by Igor Orellana and Victor Tkachenko at
http://joker.mega.ru/acad/alfaq_ru.htm
A spanish translation is in progress. Contact Eduardo Magdalena
FAQ по теме от AutoDesk:
AutoCAD Techsupport
Search AutoCAD+FAQ
Support Assistant 2000
AutoDesk news groups
news://discussion.autodesk.com/autodesk.autocad.customization на Deja или новый интерфейс WebX на новом дискуссионном сервере Autodesk.


[B] Благодарности

This FAQ is based on great efforts of the comp.cad.autocad community, in particular (amongst others):

Adi Buturovic <af.buturovic@berwanger.com>
Christoph Candido <h8540418@edv1.boku.ac.at>
Mike Clark http://www.cadalog.com/ <webmaster@cadalog.com>
Miles Constable <miles@triumf.ca>
Cara Denko <cara.denko@autodesk.com>
T.J. DiTullio <tditullio@goldner.com>
Jeff Foster http://www.cadshack.com
Rusty Gesner http://www.group-a.com/~rusty
William Kiernan <WKiernan@concentric.net>
Paul Kohut <paulk2@seanet.com>
Sergei M. Komarov <komarov@mailcom.lviv.ua>
Joseph M. Liston <smoker@fs.cei.net>
Lu <learly@ix.netcom.com>
Masami Chikahiro http://www.page.sannet.ne.jp/chestnutsburr/ Georg Mischler http://www.schorsch.com/
Desi Moreno http://www.invsn.com/desmos
Vladimir Nesterovsky http://members.tripod.com/~vnestr/
Roger Rosec http://www.newz.net/acadplus/
Serge Pashkov <xrs@aha.ru>
Dennis Shinn http://www.halcyon.com/jeeper/
Tony Tanzillo http://ourworld.compuserve.com/homepages/tonyt/
Eugene Tenenbaum <et119@columbia.edu>
Reinaldo Togores http://personales.mundivia.es/personales/rtogores/
Reini Urban http://xarch.tu-graz.ac.at/home/rurban/
Serge Volkov http://www.basissoftware.com/vill.htm
Morten Warankov <mortenw@abacus.no>
Owen Wengerd http://www.manusoft.com
Alan Williams <alan@awol.demon.co.uk>
Doug Wilson <dougw@amgen.com>
Ian A. White <waiwhite@zip.com.au>
David Whynot http://www.cadsyst.com
Darren Young http://www.mcwi.com
Xiang Zhu <xzhu@whale.st.usm.edu>

And thanks to all the others which are not listed here for posting code and answers. This is just my personal list of acknowledgements.


[C] Последние Изменения

v2.27 23.Sep 2000
added [23.7] "How to get the CENTER of a polyline?"
15.Sep 2000
changed stack-overflow [14] to better reflect VL/VLIDE, A2000 new book [2]
1.Sep 2000
vl-sort warning with duplicate entries [8]
18.Aug 2000
changed Codemagic [6.1] from Freeware to Shareware, thanks to Nir Sullam
1.Aug 2000
changed adesk faq locations to search url
v2.266.Jun 2000
added LDATA bug [7], fixed DEFUN-Q [11], removed most colored [new/changed] notes
v2.25 17.May 2000
added [27.1], added C:POLYREV [23.6], texinfo versions
25.Apr 2000
added Point A [1.1], shortened the DDE example in [21.2]
24.Apr 2000
Vladimir fixed www.deja.com to deja.com/usenet [1.1]
v2.24 20.Apr 2000
renamed cadsyst.com to caddepot.com [1], added cadplugins.com [1], added rapidlisp [6.2], (added emacs folding)
30.Mar 2000
renamed adesknews.autodesk.com to discussion.autodesk.com
9.Mar 2000
added CodeMagic editor at [6.1], thanks to Nir Sullam
29.Feb 2000
Masami Chikahiro fixed numeric ranges [7]: -32766 => -32768
23.Feb 2000
Phil Kenewell updated LispLink 2000 [6.1].
17.Feb 2000
Added the dotsoft biglist url [7]. Mike Tuersley fixed [11] for MNL files.
v2.23 14.Feb 2000
Chris Ehly fixed all broken links.
v2.22 13.Jan 2000
additions to numerical precision. adesk techdocs links are broken again. compiled S::STARTUP hooks
v2.216.Dec 99
adesk faq link, removed peoples urls/emails, minor fixes.
7.Oct 99
wording in [0.1], german translation, link in [28]
v2.2 13.Jul 99
added topics [0.1] What changed with AutoCAD 2000?, [0.2] Why cannot I create ARX anymore?, [5.4] Better ones: Common Lisp and Scheme. additions to [6.2] Analyzers, Packagers..., [5.3] R15 VLISP info, [4] FAS Security, [21.4], [20.4]: renamed SSAPPLY to SSMAP
13.Apr 99
fixed a link [1]
v2.1 3.Jan 99
fixed and added some links: [22.4], [A.1], [B], [27], [1], [2], [20], [22.1]
21.Dec 98
found a russian translation, bob jones' and masami chikahiro's links are broken
12.Jul 98
changed posting frequency to monthly. Some minor fixes concerning the now available Visual Lisp and other cosmetics. cadsyst url
6.Jun 98
changed Eugene's email (and back at 18.Jul)
13.May 98
added R14 plotdialog [21.2]
11.May 98
bugfixes by Serge Pashkov <xrs@aha.ru> in [24] arc2bul, [20.1] remove-if-not (but correct in faq-code.lsp), [21.7] doc of maptrans0-1, [24] tan, [21.2] DDECMD and some vlisp beta1 fixes in faq-code.lsp
v2.0 7.May 98
lots of Visual Lisp based changes: [0],[4],[5],[6.1],[7]
[17] new, [2] new books, [21.2] ActiveX sample, [A.1]better official R14 FAQ
27.Feb 98
[0] Visual Lisp available.
24.Feb 98
[6.1] lspedit.exe, [0] Visual Lisp news and [7] entmake vertex
v1.12 12.Feb 98
Eugene Tenenbaum <et119@columbia.edu> send me huge list of corrections, mostly improving the english language. This time only up to [11].
15.Jan 98
[7] HATCH added to entget problem,
[0] more specific now, [22.4] url change [A.1] Japanese translation
12.Jan.98
[2] The R13 lisp manual is in the cust. manual not only on the cd. sorry
8.Jan.98
Vladimir Nesterowsky's new web url
24.Nov.97
fixed some typos
v1.11 15.Nov.97
changed header.
Autodesk AutoCAD FAQ URL's. see [A.1]
LispLink editor. see [6.1]
Zoomer rumors: [0]
23.Oct.97
Roger Rosec provided a french translation of the entire FAQ. see [A.1]
13.Sep 97
Alan Williams detected a stupid error in DATESTAMP in [22.2] but in FAQ-CODE.LSP it was okay.
28.Aug 97
added the (entget) LWPLOYLINE bug to [7],
changed my mail address to rurban@xarch.tu-graz.ac.at to be prepared for the after-student area. :)
v1.10 22.Jul 97
some LWPOLYLINE fixes, R14 Lisp debugger Vital LISP 3.0 shipped, Convert 3.3 update [4.4], fixed cronjob for bi-weekly posting: every 2nd Monday, 11.30 MET
20.Jul 97
Vital LISP 3.0 shipped
12.Jul 97
Convert 3.3 update [4.4], fixed cronjob for bi-weekly posting: every 2nd Monday, 18.00 MET
2.July 97
fixed URL in [10],
30.June 97
fixed (istypep) in [20.4], changed title of [16], light changes in (getpts) in [23.1]
v1.9 26.June 97
[5.2] confirmed Vill3 release date, added DDE sample from Xiang Zhu to [21.2], provided detab.lsp [25]
17.June 97
bugfix in [20.4]: short (getval), [12] R14 ARX autoloading, [23.5] (pline-segs) is now R14-save but still not compatible, new [23.6] revpoly.lsp, [A.1], [5.2] Vill 3 will have reactor support.
9.June 97
new symbol-string trick by Christoph Candido [20.3]
21.May 97
some minor corrections.
v1.8 15.May 97
added [0] Future of AutoLISP?
changed VERTECES to VERTICES, fixed mail address of af.buturovic@berwanger.com,
added SSAPPLY: [20.4], [23.5],
started to R14'ify some code for LWPOLYLINE's [23], not finished yet, (pline-segs) is missing
9.May 97
[2.1] R14 Winhelps, [5.2]: new basis url, Vill Lite [6.1]
added [16]: Lisp over mult. dwg's
added some short comments to [6.1](ntemacs), [14], [21.8]
21.April 97
added [[28] ACIS decryption
v1.7 9.April 97
added [[21.8] C:XYZ,
added [[15] (command "ROTATE3D") does not work! Why?
HTML version chapter numbers match the posted version,
added [27]: (command) as ctrl-c, Sergei Komarov improved [27], Adi Buturovic improved [27] for scripts.
v1.6 13.Feb 97
moved the intro to the very beginning for the curious.
another lisp plot lisp [21.2], a third lisp debugger [3.1], [A.1]: the gd.tuwien uunet mirror is faster than the official ones, fixed cadence FAQ url, applied digest format partially, html will be created automatically soon, wrong (old) chapter numbering from the v1.5 version, [7] 64 in flag 70 in symbol tables,
v1.5 5.Feb 97
added get and edlgetent samples by Vladimir, removed the sort code instead,
changed [11] title and added string funcnamean
bugfix in getpts [23.1], basic funcs should be free [A],
added DATESTAMP to [22.2], added a "s" to [A] title,
added [20] DCL, [21] EED, [21.1-21.7] samples,
Serguei Komarov found a bug in seg2cir,arclen,arc2bul [24],
added arc2ang and (corrected) arclen,
bugfixes in sslist, getval, all predicates with "p" postfix now,
prepared a FAQ-CODE.LSP, Convert supercedes Decrypt [4.4], added scripts and (command) to [23.4], AREA to [23.5],
v1.4 24.Jan 97
important news with Decrypt [4.4],
moved [11] "bugs" to [7] "problems",
added [11] "How do I (sym, list)" instead,
added the "Approved" header for news.answers processing,
added [22]-[24]: some examples for subentities and bulge stuff,
Serge found a bug/feature in acad_strlsort [7],
added number accuracy and ss limitation to [7],
added break code and samples to [3.3],
added a short lisp style guide at [2.2], instead of [6.4]
v1.3 17.Jan 97
added [16] stack overflow (thanks Serge), [4.7] Lisp2C,
updated [8] fastest sort (sample, benches),
received the news.anwsers approval
v1.2 11.Jan 97
added Phoaks to news archive
fixed (break) in [3.3] (Thanks Tony),
added a sorting example to [8], improved (my-princ) in [15]
changed posting frequency from weekly to bi-weekly
v1.1 4.Jan 97
R13 bugs, S::STARTUP code by Owen Wengerd,
homepages instead of e-mail adresses where appropriate, (people get enough junk mail these days)
more links, and some bugfixes
v1.0 22.Dec 96
First version, posted on 28.Dec 96
as a discussion basis

--

Reini Urban

Примечания:
Этот документ является русским переводом "AutoLISP FAQ by Reini Urban"
http://xarch.tu-graz.ac.at/autocad/news/faq/autolisp.html

трактовка: Igor Orellana, Victor Tkachenko



Copyright © Сайт поддержки пользователей САПР by Victor Tkachenko