Название: comp.cad.autocad AutoLISP FAQ
Название файла: CAD/autolisp-faq
URL: http://xarch.tu-graz.ac.at/autocad/news/faq/autolisp.html
Версия: 2.1
Изменения от: 20 Янв. 1999
Posted-By: Reini Urban <rurban@xarch.tu-graz.ac.at>
Обновление: ежемесячно
Права: см. Приложение [А]
Добро пожаловать на 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 ?
- [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
- [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] Как изменить направление полилинии?
- [24] Немного тригонометрии для скругленных сегментов
- [25] DCL: диалоговые списки (listboxes) с метками табуляции или монотекстовым шрифтом
- [26] EED Расширенные Данные Примитива (Extended Entity Data): Получить и Сохранить
- [26.1] Выбор объектов по их EED с использованием (ssget "X")
- [26.2] Получение EED из объекта
- [27] Как прервать команду в LISP?
- [28] Как декодировать внутреннюю геометрию ACIS с помощью LISP?
--
- [A] Замечания от авторов
- [A.1] Местонахождение ЧаВо (FAQ)
- [B] Благодарности
- [C] Последние Изменения
AutoLISP, определенно, будет поддерживаться в будущих версиях AutoCAD.
VB был представлен, чтобы упростить Автоматизацию делопроизводства: ACAD <-> Excel/Access.
Оба языка имеют свои достоинства и недостатки. Рекомендуется ознакомиться с обоими.
VB более графический а AutoLISP более логичный..
Объектная концепция VBA, кажется, проще для изучения, но Вы не можете выполнять в нем команды как в AutoLISPе.
Новый VBA (в R14.1) чрезвычайно быстр. См. также [5.2].
Будущее AutoLISP в работе с Visual Lisp.
Для более подробной информации см. [5.3]
Некоторые большие сайты, посвященные shareware для AutoCAD:
- CADalog - The AutoCAD Shareware Clearinghouse (Mike Clark)
- http://www.cadalog.com/
- Rolling Stock Software (David Whynot)
- http://www.cadsyst.com/
Они специализируются на программном обеспечении для AutoCAD и имеют очень хорошие AutoLISP-коллекции. URL ардеса других AutoLisp коллекций можно найти в различных группах новостей.
Другие места с AutoLISP коллекциями:
- xarch AutoCAD Info & Tools (Reini Urban)
- http://xarch.tu-graz.ac.at/autocad/
(with search)
-
CADalyst magazine code (compiled by "Hot Tip Harry" Art Liddle) [fixed]
- http://www.cadonline.com/cadfile.htm
-
CADENCE magazine code (Peter Sheerin) [old, fixed]
- ftp://ftp.mfi.com/pub/cadence/
-
AutoCAD Tech Journal code (Peter Sheerin) (old)
- http://www.atj.com
-
The CADshack (Jeff Foster)
- http://www.cadshack.com/lispfile.htm
-
SimTel - Coast To Coast - Archive (mostly old stuff)
- http://www.coast.net/SimTel/msdos/autocad.html
http://www.coast.net/SimTel/win3/cad.html
-
Bob Jones (broken link)
- http://www.io.com/~bcjones/files.html
-
PIRS Online (tm) [starting a new service at 15.Jan 99]
- http://www.insa.com/
-
Henry Francis
- http://www.ez-sys.net/~coopfra/
-
Owen Wengerd
- http://www.manusoft.com
-
Desi Moreno
- http://www.invsn.com/desmos/autolisp.htm
-
Dr.Lisp Utilities (Alexander Medwedew)
- http://tribeca.ios.com:80/~compvent/drlutils.html
-
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
-
McNeel's lisp archive
- ftp://ftp.mcneel.com/lisp/
-
Lisp Factory
(Jay Garnett) [new]
- http://members.tripod.com/~spotter10/autolisp/
На http://www.autodesk.com/support/autocad/ находятся документы Autodesk Product Support отвечающие на технические вопросы. (Их FAQ's)
Не имеется никакого архива 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
До 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 стоит $ 495.00 ежегодно.
- 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
Все руководства по R14 преобразованы в формат Winhelp.
Существующие AutoLISP Winhelp файлы можно найти с:
- R14 (целый набор)
- Visual Lisp от Autodesk preview, см. [5.3]
- старым Visual Lisp редактором (1.0 - бесплатный), см. [1]
- Vital LISP, ('справка' (help) поставляемая и с демо версиеи), см. [6.1]
Для DOS существует резидентная программа - LISPHLP.EXE
(активируется Ctrl-RightShift-R, 1988)
LSPDOC: At http://xarch.tu-graz.ac.at/autocad/lsp_tools/#lspdoc - это утилита которая автоматически создает Winhelp для LISP файлов.
Большинство примеров, которые напечатаны в журналах или размещены на различных сайтах 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-кода.
Наиболее важные пункты:
- Комментируйте ваш код.
используя ";;; " в 1 строке, ";; " внутри кода ";" для конечных комментариев (в строке 39)
- Следуйте за стандартами выравнивания что дает автоматическим форматировщикам лучше записать структурный код, чтобы он стал более читаемым.
- Особенно это важно для SETQ, DEFUN, IF, COND, PROGN
- Старайтесь избегать глобальных переменных. Если Вы используете их (для эффективности), то пометьте их, поместите их между звездочками, например: *GLOBAL*
- Не забудь объявить переменные (после "/" в списке параметров DEFUN). Для отладки их можно не помещать (временно).
Всегда располпгаете первым символ подчеркивания в любой строке (команде и опции) которые передаются в COMMAND и OSNAP. Имеются много коммерческих программ, которые не работают в международных версиях. (command "_PEDIT" ss "_J") лучше чем (command "PEDIT" ss "J")
- Защита имен: с тех пор как AutoLISP не обеспечивает никакой защиты пространства имен, легко перезаписать системные функции. Используйте уникальные короткие префиксы по крайней мере, когда Вы публикуете или отдаете ваш код.
Я использую UR- для функций и UR: для переменных. ADGE и Autodesk требует даже 4 префиксных символа. Так Ваши имена будут защищены от перезаписывания другими функциями.
- Всегда используйте символ подчеркивания с строками (commands and
options) передаваемым COMMAND и OSNAP. Итак много коммерческих программ не работающих в международных версиях. (command "_PEDIT" ss "_J") лучшее чем
(command "PEDIT" ss "J")
- Не используй слишком много SETQ: LISP был первоначально языком функций, без любых переменных. Имеются достаточно конструкций которые работают эффективно со списками без потребности немедленного сохранения значений в переменных. (См. пример кода [21]...)
Но для удобочитаемости и целей отладки Вы должны всегда устанавливать переменные.
- В старом LISP было правило: Любая хорошая функция не дольше быть больше 6 строк.(LISP - второй самый старый компьютерный язык, он изобретен Джоном McCarthy в MIT в 1958)
- Предпочтительно используй CONS вместо APPEND: три CONS, и один REVERSE лучше чем APPEND. Для приемов с конкатенированием (опущением nil) смотрите esp. Serge's тексты: например удаление в [20.1] или сравнение стиля в [23.1])
- Используйте английские символы и комментарии
- Не используйте T, MIN, MAX или LAST как переменные! Это функции системы!
- ACOMP для R10, распространяется бесплатно. Вы можете его использовать и для более поздних версий но возможности будут ограничены R10 версией, например не поддерживается WCMATCH функция.
- Vital LISP Professional поддерживают IDE (это лучший!).
- Ld, AutoLISP Debugger для R14, R13c4 и R12/Dos от Cz (новый и бесплатный)
- at http://www.cadstudio.cz/ftp.htm
См. [5] AutoLISP компиляторы
Лучшая поддержка, которую Вы можете иметь для отладки - это запись вашего кода в хорошо разработанном, модульном стиле, выделяя различные задачи в отдельные функции и затем свободно использовать вложенные вызовы функций. Это позволит Вам использовать функцию TRACE что необходимо, чтобы обнаружить любые ошибки.
Примеры:
;;; Отладочные функции
(defun break (s)
(if *BREAK*
(progn
(princ "BREAK>> (stop with )\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 )
BREAK>> in foreach
BREAK>> x
1.0
BREAK>> (CONT) ; отключить функцию break
nil
BREAK>>
1.0
1.0
0.001
Вы можете также выключить отладочный-вывод
BREAK>> (setq *DEBUG* nil)
чтобы проскочить большие циклы.
"Вы действительно нужно защитить их?
Если Вы хотите распространить код среди своих друзей, то почему бы просто не отдать им код? Ваш исходный текст в любом случае защищен авторским правом.
Работая с другими Вы получаета возможность получения новых идей и писать более совершенные программы.
Многие из моих утилит были улучшены моими друзьями, а я улучшил многие их утилиты." (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 3.5
- 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 Безопасность:
Недавно в группах новостей было широкое обсуждение , начатое Tony Tanzillo, по поводу FAS безопастности.
FAS оказлся более защищенным чем ARX, т.к. сначала кодируется а потом компилируется. C и Java декомпиляторы существуют а LISP-ых пока нет. Имена переменных, строчные и цифровые значения являются более незащищенными чем сам алгоритм. Откомпилорованный код в FAS с опцией Optimized/Internal не сохраняет имена переменных.
Вывод:
Серьезное шифрование теперь обеспечивается Autodesk, чтобы помочь профессиональным AutoLISP-разработчикам. Kelvinate [4.1] делает LISP файлы нечитаемыми и быстрее загружаемыми. Protected [4.2] - легко расшифровывается. Другие не расшифровываются. Если LISPы зашифрованы Convert -e$GUARD, то могут быть расшифрованы только с её же помощью.
Рассматриваться будут три AutoLISP компилятора. Может вскоре появяться более совершенные (Allegro CL и Lispworks для Windows с поддержкой ActiveX)
-
[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
См. http://www.basissoftware.com/vill.htm
Некоторые дилеры все еще имею на складе.
Последняя версия - 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- функции имеют больше дефисов.
Basis навсегда прекратила разработку Vital Lisp, так что теперь Visual Lisp является их преемником и будущим AutoLISP.
Стоимость - около $100. Ограниченная временем (time-delimited) демонстрационная версия доступна на http://www.autodesk.com/products/acadr14/compapps/vlisp.htm
Скачать прямо сейчас можно на http://www.autodesk.com/products/acadr14/compapps/vlisp.htm
VLX являются FAS файлами с дополнительными DCL ресурсами, используемыми R15 или пользователями с уже загруженными runtime модулями.
Вывод:
AutoLISP компиляторы нуждаются в модулях поддержки выполнения(runtime).
Вы не можете создавать автономные программы, хотя ViLL/vlisp генерирует автономный ARX. Искомый текст шифруется. Будущие AutoCAD релизы будут поставляться с системными исплняемыми модулями (vlisp runtime system), чтобы распространялись только FAS файлы или VLX проекты.
- Visual Lisp от Autodesk
- См.[5.3].
Лучшее из рекомендуемых средств.
- Vital LISP
- Упрощенная Версия (Lite Edition) (только редактор) стоит около $50, Стандартная Версия (+ отладчик) - $350 и Профессиональная Версия (+ компилятор, расширения) - $675.
Обладая Стандартной Версии Вы имеете превосходный инструмент.
См. [5.2] AutoLISP компиляторы
- LispPad
- AutoLISP Editor от Tony Tanzillo.
http://ourworld.compuserve.com/homepages/tonyt/LispPad.htm
- LispLink
AutoLISP Editor.
См. http://www.flash.net/~caelink/ll14_desc.html
- Visual Lisp от WSSW
- Старый небольшой Windows Lisp Editor. Версия 1.0 абсолютно бесплатная.
См. [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.
- Emacs для NT
- Громозский и тяжелый в обучении использования редактор, зато написан и расширяемый в lisp.
Бесплатен, для всех платформ.
Смотри на
http://xarch.tu-graz.ac.at/autocad/lsp_tools/ntemacs.html
- Также широко используются различные, настраиваемые, редакторы для ппрограммистов, такие как MultiEdit Pro 7, WinEdit, E! или PFE.
- Как правило они не поддерживают ни Lisp синтаксис, ни форматирование кода, но поддерживают multi-файловый поиск/замену и имеют настраиваемое выделение синтаксиса.
- Существуют и другие не такие хорошие редакторы (ADE), но я не имею их описания.
Средства проверки соответствия круглых скобок можно больше не использовать.
Редакторы должны уметь это делать.
- ALLY30.ZIP
- Shareware LISP анализатор. Проверяет синтаксис и выводит статистику
(в соответствии со структурой функций), на [1]
- lck21b.zip
- LCK LISP Checker 2.1b (графический)
- paran.zip
- Простой
- PARNCH.ZIP
- Простой
Существуют AutoLISP программы которые подсчитывают скобки.
Внешние:
- FMT202S.ZIP
- Lisp, DCL и FRM форматировщик исходного текста
- LB.EXE
- Autodesk's форматировщики кода (source code beautifier).
Найти можно в SDK2 или см. [1]. Имеет проблемы с длинными строками, и новым-стилем в строчных комментариях.
- PPRINT.LSP
- Найти можно в SDK2 или см. [1].
Внутренние:
Visual Lisp, Vital LISP, Emacs и Codekey, насколько я знаю, содержат внутренние форматировщики кода.
Не имеется почти никаких известных серьезных ошибок в AutoLISP. Интерпретатор Autolisp непосредственно (ACADL.EXE/.EXP) работает несомненно хорошо.
Некоторые ограничения основаны на принципах работы AutoCAD и Proteus(DCL). Некоторые программы LISP-поддержки (например DDMODIFY.LSP) часто дефектны.
По вопросам о Visual Lisp см. README.txt содержащий перечень всех известных ошибок и ограничений. Сбои при использовании реакторов являются ошибками автокада.
- + При предачи 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)."
См. http://www.autodesk.com/support/techdocs/td11/td111682.htm
- Дефектные обратные вызовы в 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]
Обзор алгоритмов сортировки см. на
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 встроенный, для строк)
Это - не часто задаваемый вопрос, а очень интересный момент в 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
То же самое что с рекурсией, это не часто задаваемый вопрос, но это необходимо знать.
Итерационные операторы в 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
LISP файлы могут быть загружены при запуске, используя LOAD в ACAD.LSP.
Некоторые LISP-файлы, работающие с меню, чтобы работать, должны быть загружены из соответствующего <меню>. MNL-файла. <меню>.MNL- файл, загружаемый по умолчанию - ACAD.MNL
LISP функции вызываемые при запуске должны быть определены в функции S::STARTUP в файле ACAD.LSP. Эта функция вызывается при запуске после инициализации автоматически. Иначе вы получите ошибку:
"Command list interruption (6.2)".
Если имя файла указано без расширения, функция LOAD добавляет .LSP по умолчанию. Если нет указания полного пути к файлу, используется обычный путь к библиотекам AutoCAD, то есть:
- ) Текущий каталог
- ) Каталог, содержащий файл текущего чертежа
- ) Каталоги, определенные в переменной среды AUTOCAD (устанавливается в пункте меню Preferences, пути к каталогу SUPPORT)
- ) Каталог 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] Как сделать чтобы мои программы загружались автоматически?
[обновления для R14]
Как сделать чтобы мои программы загружались автоматически?
Вы можете или загружать ваши программы при запуске
(см. [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))
Фактически это определение было более сложным из-за ошибки обработки
После первого обращения функция перезаписывается поверх предыдущего определения.
- Преимущества автозагрузки:
- Запуск AutoCAD происходит быстрее, т.к. не надо загружать все lisp-файлы.
Вам нужно сделать лишь объявить как показано выше. Что осуществляется с помощью функции
(autoload) .
Вы нуждаетесь в меньшем количестве памяти.
- Недостатки:
- При ошибках в Вашей программе Вы попадаете в замкнутый цикл, который можно остановить лишь после переполнения стека или нажав Ctrl-C
Примечания: используя acomp-компилированный код, остановка с помощью Ctrl-C невозможно, поэтому где-нибудь вставьте обращение на некомпилируемый (princ).
В autoload Вы должны определить и сохранять все имена команд из вашей программы. Изменения имени lisp-файла или имени команды вызовет вышеупомянутую ошибку.
- Где помещать Ваши определения
(autoload) ?
-
Не в ACADR13.LSP. Мы рекомендуем помещать свои определения в отдельный файл, не в ACAD.LSP, т.к. этот файл будет часто изменяется разными приложениями а файл ACAD.LSP должен оставаться небольшим.
То есть, прместите свои определения в AUTOLOAD.LSP или INIT.LSP (их создаете Вы сами), и сделайте ссылку на него из ACAD.LSP
См. [11] Мой LISP больше не загружается при запуске
Это должно быть упомянуто: пользователи *неt* должны изменять ACADR13.LSP (или ACADR12.LSP, хотя это не было 'официально' до r13). С этих версий - ACAD.LSP не перезаписывается во время модернизации версии, что гарантирует сохранность.
Кроме того (как получилось с исправлением (patch) R13c4a), если файл ACADR13.LSP был изменен, то процесс установки исправления не будет осуществлен.
Напрямую, 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 regarding &optional о включении как расширение языка AutoLISP, но не включены в состав версии R14.
В AutoLISP размер стека жестко фиксирован. Он не может быть расширен, но этот размер достаточен для большинства целей.
Большинство ошибок, связанных с переполнением стека, происходят из-за ошибок в ваших программах. Для предовращения сбоев системы избегайте использование бесконечных циклов, и не используйте рекурсивные функции при обработки больших списков. В стандартном AutoLISPе при использовании рекурсивных функций Вы ограничены ~200-ми элементами.
Вы не сможете уменьшать используемый размер стека используя меньше локальных параметров в вашей рекурсивной функции! Старайтесь не использовать APPLY, EVAL или MAPCAR, для вызва вашей функции рекурсивно, т.к. они поедают стек. Using tail recursion doesn't help either.
Вы будете должны преобразовать вашу рекурсивную функцию в итерационную. (Имеется математическая теорема, которая говорит, что каждая рекурсивная функция может быть преобразована в итерационную, а обратно-рекурсивную даже автоматически.) Итерационные версии могут использовать стеко-подобные функции как (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).
При использовании Vital LISP или Visual LISP RTS размер стека неограничен.
При использовании R10c10, первой версии лисп для расширенного dos, Вы могли расширить размер стека используя системную переменную LISPSTACK. А при работе с Acomp для R10 имел переменную COMPSTACK. С современными версиями это уже невозможно.
Преобразование в итерационную форму приводит к ожидаемым результатам:
(defun intlst (n / l)
(repeat n
(setq l (cons (setq n (1- n)) l)))) ;это выглядит ужасно, но работает
Единственная возможность физически увеличить размер стека, это ипользовать
vlisp, ViLL или acomp интерпретатор ACADLC. См. [5].
Некоторые команды не являются внутренними командами AutoCAD, а являются простыми AutoLISP-программами, начинающиеся с C:, включая те что кодированы в ADS.
Список всех этих команд можно найти в файле ACADR13.LSP в разделе AUTOLOAD. (см. также"[12]")
Все подобные команды должны вызываться, следующим образом (C:ROTATE3D) вместо (command "ROTATE3D").
Кроме вышесказанного, ADS функции способны получать дополнителные параметры. Для более подробной информации см. руководство пользователя.
Т.е. (c:rotate3d ss p1 p2 angle) также допустим, как и (rotate3d ...)
"У меня проблема в написании lisp программы, которая должна открывать чертеж и продолжать выполняться. Но, как только открывается новый чертеж, lisp-файл удаляется из памяти AutoCAD, и необходимо заново загружать его."
При загрузке чертежа LISP-память очищается. Но, существует несколько способов заставить работать lisp-программы с несколькими чертежами:
- Используя скрипт.
MYSCRIPT.SCR.
(load "mylisp")
_QSAVE _OPEN !nextdwg
(load "mylisp")
_QSAVE _OPEN !nextdwg
...
(setq *VILL-NEW-FULL-INIT* nil); хранит символы между сеансами
- Внешние программы других разработчиков, такие как RunLisp или DDSCRIPT automate
step 1.
- Версия R14 имеет новую возможность, называемую 'Persistent LISP'.
Устанавливаемую в Preferences-Compatibility-Persistent Lisp
- Vital LISP имеет встроенную переменную действующую как Persistent Lisp:
(setq *VILL-NEW-FULL-INIT* nil) ;keep symbols between sessions
- аналогично у Visual LISP: (setq *VLISP-NEW-FULL-INIT* nil)
C: функции автоматичекси экспортируются в AutoLISP.
Функции vlisp/vill-lisp должны экспортироватся либо с помощью (vl-acad-defun 'myx-funcname), либо используя специальный компилятор pragma, либо должны быть определены в файлах LSP или GLD (глобальные определения (declarations)). Для таких функций лучше добавлять специальный префикс.
.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.
См. http://www.autodesk.com/support/techdocs/td17/td175363.htm
Часть 2: примеры, код.
Больше общих 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 списками.
См.
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))))
См.
http://xarch.tu-graz.ac.at/autocad/stdlib/STDSTR.LSP
Здесь приводятся несколько полезных функций для обработки строк:
- предикатные функции:
- (stringp expr)
- - предикат для строк , является ли expr строкой?
(defun stringp (s) (= (type s) 'STR))
- (string-not-emptyp str)
- - является ли переменная str пустой строкой?
(defun string-not-emptyp (s) (and (stringp s) (/= s "")))
- функии подгонки строк:
- (str-trim string)
- - строка без пробелов вообще, без пробелов справа, без пробелов слева, определены в AI_UTILS.LSP , а также:
- (str-left-trim string), (str-right-trim string),
- (str-left-trim-bag string bag), (str-right-trim-bag string bag)
- - удаляет все буквы из строки заданные в переменной bag (= STR)
- доступ к строкам:
- (strpos string substr)
- - ищет строку в строке, и возвращает индекс (начиная с 1)
- функции синтаксического анализа и функции собирательные (list<->string):
- (strtok str tokens)
- - строка -> список разделенный знаком 'точка с запятой'
- (strlcat lst delim)
- - concat список -> строку разделеную delim
-
- (string->list str)
- - строка -> список символов (букв,...)
- (list->string str)
- - список символов -> строку
- Некоторые можно найти на http://xarch.tu-graz.ac.at/autocad/code/vnestr/strtok.lsp
или в Вашем AI_UTILS.LSP. Он Вам нужен, особенно для DCL функций.
Функция обратная (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
См.
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 SSAPPLY (fun ss / n)
(if (= 'PICKSET (type ss))
(repeat (setq n (sslength ss))
(apply fun (list (ssname ss (setq n (1- n))))))))
-
[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 вызов диалога печати проще чем в DDE:
(initdia)(command "_PLOT")
-
[21.3] (entmod) и (entmake) Слоев, не используя (command "_LAYER"...)
- Работа со слоем используя ENTMOD
- Я, задался целью, в лисп программе изменить свойства слоя, при этом не применяя командных функций (command function).
Под 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", даже если это текущий слой (current layer).
AutoCAD не узнает что ввод в таблицу был изменен, пока Вы не нажмете Layer Control на панели инструментов или на чем-нибудь подобном.
Кроме того, Вы можете использовать 'DDLMODES чтобы посмотреть свойства Вкл./Выкл. любого, "ANY_LAYER", измененного слоя.
Если тем же способом заморозить слой, то Вы будете видеть находящиеся там примитивы, хотя и не сможете их выбрать. Это продолжится до тех пор, пока Вы не активизируете какую-либо команду для работы со слоями, и только тогда автокад удалит их с экрана.
- Работа со слоем используя ENTMAKE
-
Вам нужно получить шаблон используя entget, при этом используя, как аргумент, имя из таблицы объектов. Это имя можно получить с помощью функции TBLOBJNAME:
(entget (tblobjname "LAYER" "ANY_LAYER_NAME"))
;;; Эта программа создает слой с заданным вами именем:
(defun c:mlay () ; от Reinaldo Togores
(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)
- На http://xarch.tu-graz.ac.at/autocad/progs/MGETFILD.ZIP,
находится программа использующая DCL для выбора нескольких файлов.
Также, Вам нужна DOSLIB от McNeel для доступа к специальным функциям DOS для работы с каталогами(directory). http://www.mcneel.com/mcneel/doslib.html
-
[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))
)
;;; => .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.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>
-
Это пример многократного использования (entmake) для создания
заголовка блока (block header), примитивы (entities), закрыть блок (closes the block) и наконец для его вставки (INSERT) в чертеж.
см. http://www.autodesk.com/support/techdocs/td30/td301515.htm
Осторожнее с анонимными блоками которые при
(setq bn (entmake '((0 . "ENDBLK")))) возвращают имя блока
(entmake (list '(0 . "INSERT")'(70 . 1)(cons 2 bn) ...))
В версии R14, LWPOLYLINE сохраняет все вершины в одном примитиве с несколькими группами 10!
-
[23.1] Как получить вершины (VERTICES) полилинии? [исправлено для R14]
- Вершина (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)
-
- Вы можете написать скрипт к лисп-программе и работать с ним. Это простой путь. Но тогда Вы не защищены от ошибок ввода/ввывода во время записи/считывания скрипта. Если Вы пишите коммерческую программу, то должны учесть возможные ошибки.
- Другой путь, заключается в создании списка примитивов и использовании ENTMAKE.
Преймущества: работает быстро, в WCS, не зависит от текущих привязок(osnaps).
см. http://www.autodesk.com/support/techdocs/td30/td300510.htm
- Третье решение основано на использовании 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) полилиний? [новые функции]
-
Существуют два решения:
- очевидный, использовать команду ПЛОЩАДЬ (AREA), хотя и довольно "шумная"
(выводит результат), зато работает даже со сплайнами.
;;; приплюсовывается длина (LENGTH) всех выбранных
;;; объектов, ШУМНО (во время работы функции
;;; выводится лишняя информация на экран), вы
;;; можете сделать то же самое для ПОЛЩАДИ(AREA):
;;; просто замените последнюю строчку на (getvar "AREA")
(defun C:LEN-OF ()
(command "_AREA" "_A" "_E") ;добавляет объект (работает в R12,R13)
(ssapply 'command (ssget)) ;передает все элементы в AutoCAD
(command "" "") ;два возврата
(getvar "PERIMETER")) ;а вот и длина
- Использование некоторых математиких выражений, только для несложных объектов. Этот вариант хорош для определения некоторых полезных функций, и является введением к следующему разделу [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
Что такое ВЫПУКЛОСТЬ в полилинии?
Выпуклость равняется тенгенсу одной четверти внутреннего угла изогнутого сегмента. При значении выпуклости равной 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)) ; радианы в градусы
Под 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
(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
Или: "Как мне прервать команду из 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]
..
Все ACIS объекты (3DSOLID) описаны Spatial.
Тем не менее, внутреннее описание используемое (entget) оставалось зашифрованным, на алгоритм шифровки был восстановлен (hacked). (XOR 95)
Примеры см.:
http://xarch.tu-graz.ac.at/autocad/news/acis_decrypt
и http://xarch.tu-graz.ac.at/autocad/news/acis_decode.lsp
Если Вы работаете над материалами которые могут быть включены в этот ЧаВо (FAQ), или хотите улучшить приведенный здесь ответ то присылайте Ваши письма (на ангийском языке) на e-mail Reini Urban <rurban@sbox.tu-graz.ac.at>, но не ожидайте ответа.
На Русском: <joker@mega.ru>
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
- Также см. cca индекс, для того чтобы ознакомиться с принятой аббревиатурой
- http://xarch.tu-graz.ac.at/autocad/news/faq/glossary.html
- Submissions for a new AutoCAD FAQ are stored at
- http://xarch.tu-graz.ac.at/autocad/news/faq/new-acad
- 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 at
- http://joker.mega.ru/acad/alfaq_ru.htm
- A spanish translation is in progress. Contact Eduardo Magdalena
- AutoDesk's R14 FAQ
- http://www.autodesk.com/support/techdocs/td10/td105129.htm
- AutoDesk news groups
- news:autodesk.autocad.customization,
news:autodesk.autocad.r14general or the web interface at Dejanews
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.
- 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, 12.Jul 98
Примечания:
|