Загрузка библиотеки LISP команд в AutoCAD
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Загрузка библиотеки LISP команд в AutoCAD

Загрузка библиотеки LISP команд в AutoCAD

Ответ
Поиск в этой теме
Непрочитано 13.04.2023, 21:51 #1
Загрузка библиотеки LISP команд в AutoCAD
Browning Zed
 
Регистрация: 17.01.2014
Сообщений: 97

Всем доброго утра/дня/вечера.

Захотелось прояснить несколько моментов по вопросу, указанному в заглавии темы. Под библиотекой я понимаю некий программный модуль, набор множества лисп-программ, размещенный в нескольких подкатологах, которые могут ссылаться на одни и те же функции. Вопросов не возникает, если загрузить требуется один или два lsp файла – мы используем команду "_APPLOAD», или просто загружаем файл драг-н-дроп способом. Но что, если таких файлов нужно загрузить достаточно большое количество? Отложим в сторону вопрос загрузки библиотеки функций, (которая, как правило, должна загружаться вся полностью при открытии чертежа), и сосредоточимся исключительно на загрузке команд, тех, которые начинаются с "DEFUN C:». Вопрос о том, какой механизм автозагрузки использовать, чтобы записать в него нужные функции для загрузки файлов, здесь тоже не так принципиален – это может быть "Acaddoc.lsp», StartUp Suit или любой другой способ.

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

Способ 1. На старте программы перебираются все каталоги содержащие нужные файлы и загружаются с помощью функции "LOAD».
+ Удобство. Можно в любой момент добавить в каталог новый файл, и при старте все каталоги будут проитерированы, а файлы, расположенные в них загружены.
- При открытии чертежа, увеличивается время до момента, когда можно приступать к работе. Не так существенно если файлов для загрузки небольшое количество. Но если их много, ожидание может оказаться раздражительным.

Способ 2. Добавление в файл автозагрузки списка всех нужных файлов и загрузка их при вызове соответствующей команды функцией "AUTOLOAD».
+ Файлы загружаются только при вызове соответствующих команд, вследствие чего экономится время при запуске чертежа.
- Чтобы добавить к загрузке новый файл, необходимо дополнительно его прописывать в файле автозагрузки.
- При добавлении в автозагрузку функция "AUTOLOAD» может не сработать, если не добавить выражения с использованием "AUTOLOAD» к функции S::STARTUP.

Способ 3. Добавление на кнопку в cuix-файле макроса вроде "^C^C(if (null c:LLine)( Load "LLine")).
+ Самый минимальный по затратам времени при старте чертежа способ загрузки файлов.
- Требует дополнительного микроменеджмента в виде добавления макроса на кнопку.

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

В общем, хотелось бы услышать от уважаемых форумчан, какой у вас имеется опыт для загрузки вашей Lisp-библиотеки, и какой метод вам кажется наиболее подходящим.
Просмотров: 2154
 
Непрочитано 13.04.2023, 22:18
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Вариант 4 - использовать для загрузки mnl
Вариант 5 - все собрать в fas / vlx и грузить его любым способом. При необходимости модификации грузить исходник и потом пересобирать fas / vlx
Вариант 6 - ...

Лично я для себя как для разработчика предпочитаю свой метод: при старте определяется команда, которая пройдет по каталогам исходников, найдет все lsp, загрузит их. Как для пользователя - fas / vlx, также автозагружаемый.
P.S. При загрузке примерно 700...1000 файлов исходников время загрузки составляет 15..20 секунд ориентировочно (если ОС, конечно, не дико загружена).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 13.04.2023, 23:11
#3
Browning Zed


 
Регистрация: 17.01.2014
Сообщений: 97


С MNL работать не пробовал, читал где-то вроде, что это устаревший формат файла интерфейса.
Компилировать в fas / vlx не вариант. Теряется вся прелесть того, что можно в любой момент залезть в код и что-нибудь подкорректировать. Да и коммерческого использования мой программный модуль не предполагает, так что вопрос компиляции не рассматривался изначально, и нотация в коде использовалась соответствующая: не (function (lambda...)), а '(lambda...) - и так по всему коду. Перелопачивать все это - ну нафик.
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Лично я для себя как для разработчика предпочитаю свой метод: при старте определяется команда, которая пройдет по каталогам исходников, найдет все lsp, загрузит их. Как для пользователя - fas / vlx, также автозагружаемый.
P.S. При загрузке примерно 700...1000 файлов исходников время загрузки составляет 15..20 секунд ориентировочно (если ОС, конечно, не дико загружена).
Это как раз то, о чем я упоминаю в способе №1. И да, при таком подходе важно время, на которые откладывается начало работы с чертежом. Имхо, 15 секунд - много как по мне. Я стараюсь не вылазить за рамки 3-5 секунд. Но это уже мои личные заморочки.
Спасибо что поделились опытом, Алексей. Было важно услышать ваше мнение.
Browning Zed вне форума  
 
Непрочитано 13.04.2023, 23:15
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Цитата:
Сообщение от Browning Zed Посмотреть сообщение
что это устаревший формат файла интерфейса.
Чушь! В ACAD чуть ли не самый безотказный вариант загрузки чего угодно. В nanoCAD не работает, если что.
Цитата:
Сообщение от Browning Zed Посмотреть сообщение
Компилировать в fas / vlx не вариант. Теряется вся прелесть того, что можно в любой момент залезть в код и что-нибудь подкорректировать.
Никто не мешает грузить исходник отдельно и менять именно то что надо. Потом - пересборка.
Цитата:
Сообщение от Browning Zed Посмотреть сообщение
Да и коммерческого использования мой программный модуль не предполагает, так что вопрос компиляции не рассматривался изначально, и нотация в коде использовалась соответствующая: не (function (lambda...)), а '(lambda...) - и так по всему коду. Перелопачивать все это - ну нафик.
Скорость работы компилированного и некомпилированного кода может весьма значительно отличаться. Я где-то у себя на сайте в свое время проверял, разница была существенная. И никто не говорит, что апострофы надо менять на function "вотпрямщас и повсюду". Встретилось, поменял, пересобрал - и вуаля.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.04.2023, 06:30
#5
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Ещё один метод:

Давным-давно, когда компьютеры сплошь были на процессоре 80286,
я в автозагрузке прописывал "замещающие функции" вида:

(defun $aaaa1 (inp-1)(load "файл.fas" "")($aaaa1 inp-1))

Расширение, конечно, тогда было не ".fas" (уже не помню, какое),
но тоже компилированный файл.

Чертеж открывался очень быстро. А вот при первом обращении
к функции шла её "подмена" и загружался нормальный "большой"
файл. Таким образом задержка загрузки "размазывалась" по времени
работы над чертежом и была практически незаметна для пользователя.

И ещё псевдографикой рисовал в окне отображения текущих координат
(тогда это было в верхней части экрана) "бегущую строку загрузки".
Ждать открытия файла (а точнее - загрузки функций библиотек)
становилось гораздо веселее. :-)
__________________
Счастливо, Алексей!

Последний раз редактировалось ===AAA===, 14.04.2023 в 06:42.
===AAA=== вне форума  
 
Непрочитано 14.04.2023, 08:44
#6
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от Browning Zed Посмотреть сообщение
Моя библиотека на данный момент использует порядка 10-ти дополнительных Support Paths и какого-то существенного замедления я вроде бы не замечаю
Ну зачем так-то? Библиотека должна быть скомпилирована в один FAS с помощью проекта .PRJ

Проект - это текстовый файл, в который можно добавлять любые исходные LSP.

Вот у меня в основной библиотеке 1513 строк, т.е. входящих в нее LSP. Сами они, для удобства разложены по подкаталогам.

Фрагмент "проекта":

Код:
[Выделить все]
 (VLISP-PROJECT-LIST
  :NAME
  ru-lib-main
  :OWN-LIST
  (

"acad/ru-acad-layouts-status-bar-button"
;;	"acad/ru-acad-status-bar-button"
"acad/ru-acad-ver"

"adc/ru-adc-navigate"



"app/load/other/express/ru-express-is-loaded"
"app/load/other/express/ru-express-load"
"app/load/ru-app-load"
"app/load/ru-app-load-ai"
"app/load/ru-app-load-arx"
"app/load/ru-app-load-main-lib"
"app/make/ru-app-edit-main-prj"
"app/make/ru-app-make-fas-file"
"app/program/ru-app-get-win-info"
"app/program/ru-app-is-win-nt"
"app/program/ru-app-txt-editor"
"app/run/_ru-app-run-srv"
"app/run/ru-app-run"
"app/run/ru-app-run-doc-explorer"
"app/run/ru-app-run-edit-type-text"
"app/run/ru-app-run-edit-menus-ini"
"app/run/ru-app-run-edit-default-ini"
"app/run/ru-app-run-edit-history"
"app/run/ru-app-run-license"

"app/start_stop/ru-app-begin"
"app/start_stop/ru-app-end"
"arc/ru-arc-add"

"batch/block/ru-batch-block-save-all-names-and-decriptions"
"batch/block/ru-batch-normal-block-lib"
"batch/files/ru-batch-file-operations"
"block/archive/ru-block-insert-xref-from-archive"
"block/attrib/ru-block-attrib-by-name"
"block/attrib/ru-block-attrib-list"
"block/attrib/ru-block-change-attributes"
"block/attrib/ru-block-get-attribs"
"block/attrib/ru-block-get-attributes"
"block/attrib/ru-block-get-tag-names"
"block/attrib/ru-block-dlg-attedit"
"block/attrib/ru-block-list-tags-prompts-values"
"block/attrib/ru-block-get-tags-and-prompts"


"block/data/ru-block-ent-by-name"
"block/data/ru-block-get-all-def"
"block/data/ru-block-get-array-cfg"
"block/data/ru-block-obj-by-name"
"block/edit/ru-block-purge"
"block/edit/ru-geom-difscale"

"block/insert/ru-block-file-embed"

"block/insert/align/ru-block-insert-align"
"block/insert/multi/_ru-block-multi-insert-scaled-angle0"
"block/insert/multi/_ru-block-multi-insert-scaled-angleask"
"block/insert/multi/from-file/ru-block-insert-noscale-ptask-angleask"
"block/insert/multi/from-lib/ru-block-insert-from-lib"
"block/insert/multi/from-lib/ru-block-insert-from-lib-mousescaleask"
"block/insert/multi/from-lib/ru-block-insert-from-lib-scale1"
"block/insert/multi/from-lib/ru-block-insert-from-lib-scale1-and-ask"
"block/insert/multi/from-lib/ru-block-unit-mm-insert-from-lib"

...

"dlg/layer/ru-dlg-select-layer"
"dlg/layer/ru-layer-show-info"
"dlg/layer/ru-layer-show-list-names-comments"
"dlg/layer/ru-layer-edit-list-names-comments"
"dlg/layout/ru-dlg-select-layout"
"dlg/layout/ru-dlg-set-layout"
"dlg/list/double/ru-dlg-double-list"
"dlg/list/double/ru-dlg-dual-list"
"dlg/list/double/ru-dlg-dual-list-select-by-comment"
"dlg/list/single/ru-dlg-show-check-list"
"dlg/list/single/ru-dlg-single-list"
"dlg/msg/debug/ru-msg-debug"
"dlg/msg/debug/ru-msg-dummy"
"dlg/msg/debug/ru-msg-print"
"dlg/msg/info/ru-msg-gauge"
"dlg/msg/info/ru-msg-term"
"dlg/msg/info/splash/_ru-dlg-splash-srv"
"dlg/msg/info/splash/ru-msg-wait"
"dlg/msg/info/splash/ru-splash-hide"
"dlg/msg/info/splash/ru-splash-set-text"
"dlg/msg/info/splash/ru-splash-show"
"dlg/msg/low-level/_ru-msg-srv"
"dlg/msg/low-level/ru-msg-box-ex"
;;"dlg/msg/low-level/ru-msg-dos-msgboxex"
"dlg/msg/low-level/ru-msg-messagebox"
"dlg/msg/low-level/ru-msg-srv-show"
"dlg/msg/low-level/ru-msg-vla-box"
"dlg/msg/ru-msg-alert"
"dlg/msg/ru-msg-info"
"dlg/msg/ru-msg-stop"
"dlg/user/ru-dlg-user-edit"
"dlg/user/ru-dlg-user-login"


"dlg/view/ru-dlg-view-txt-file"
"draw/entity/command/ru-text-command"
"draw/entity/command/ru-hatch-draw"
"draw/entity/command/ru-hatch-draw-pattern"
"draw/entity/entmake/ru-mtext-make"
"draw/entity/entmake/ru-pline-entmake"
"draw/entity/entmake/ru-text-entmake"
"draw/entity/obj/hatch/ru-hatch-add-obj"
"draw/entity/obj/hatch/ru-hatch-draw-samples"
"draw/entity/obj/line/ru-line-add"
"draw/entity/obj/line/ru-line-add-multi"
"draw/entity/obj/ru-block-insert-obj"
"draw/entity/obj/ru-circle-add"
"draw/entity/obj/ru-pline-add"
"draw/entity/obj/ru-text-add"
...


"xml/ru-xml-eval"
"xml/ru-xml-get-att-list"
"xml/ru-xml-get-sdata"
"xml/ru-xml-select-macro"
"xml/ru-xml-help-img"

"xrecord/ru-xrecord-add"
"xrecord/ru-xrecord-delete"
"xrecord/ru-xrecord-get"
"xrecord/ru-xrecord-rebuild"
"xref/ru-xref-attach"
"xref/ru-xref-bind"
"xref/ru-xref-detach"
"xref/ru-xref-list-with-path"
"xref/ru-xref-path-by-short-name"
"xref/ru-xref-short-layer-name"
  )
  :FAS-DIRECTORY
  "c:/ruCAD/Install/LocalAppData/ru/CAD-2008/Libs/App/common"
  :TMP-DIRECTORY
  "c:/ruCAD/_build_tmp"
  :PROJECT-KEYS
  (:BUILD (:standard) :MERGED t :SAFE-MODE t :MSGLEVEL 2)
  :CONTEXT-ID
  :autolisp
) ;_ end of VLISP-PROJECT-LIST

;;; EOF
Проект удобно редактировать вручную, добавлять или закомментировать лишнее.


Цитата:
Сообщение от Browning Zed Посмотреть сообщение
Добавление на кнопку в cuix-файле макроса вроде "^C^C(if (null c:LLine)( Load "LLine")).
Ну, если предполагаете редактировать исходники, то не надо (if (null c:LLine)( Load "LLine")), просто ( Load "LLine"). Пусть каждый раз загружается, это же мгновенно и всегда самая последняя версия.

При этом убогую LOAD надо бы заменить на загрузку с проверкой сначала FAS, потом LSP.

И, конечно, надо компилировать и использовать fas, безо всяких детских суеверий.
ShaggyDoc вне форума  
 
Непрочитано 14.04.2023, 09:01
#7
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Есть проблема при формировании prj: существует недокументированное ограничение на объем файла prj в 64 кб. То есть программно сформировать его и скомпилировать можно, но вот открывать не стоит - лишнее VLIDE просто обрезает.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.04.2023, 09:47
#8
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Есть проблема при формировании prj: существует недокументированное ограничение на объем файла prj в 64 кб. То есть программно сформировать его и скомпилировать можно, но вот открывать не стоит - лишнее VLIDE просто обрезает.
У меня в PRJ записано 1500 строк. Файл 55 кб.

Понадобилась еще библиотека для 3D - сделал еще проект, в котором 416 функций и размер файла 16 кб.

Но конечных файлов-"команд" около 300 и они очень маленькие. Потому что в них на 90% используются библиотечные отработанные функции.

Но таких извращенцев немного.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 14.04.2023, 10:00
#9
Browning Zed


 
Регистрация: 17.01.2014
Сообщений: 97


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Ну зачем так-то? Библиотека должна быть скомпилирована в один FAS с помощью проекта .PRJ

Проект - это текстовый файл, в который можно добавлять любые исходные LSP.
Прошу прошения за дремучесть. Что вы имеете в виду под "проектом .PRJ"?
UPD. Все, разобрался.

Последний раз редактировалось Browning Zed, 14.04.2023 в 10:20.
Browning Zed вне форума  
 
Непрочитано 14.04.2023, 12:37
#10
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Еще советы по организации загрузок.

1. Все функции-"команды" я оформляю с постоянным именем START
Код:
[Выделить все]
 (defun start (/ first_line second_line)
  (while
    (setq first_line (ru-get-segm-line "Точка на первой линии"))
     (if
       (setq second_line (ru-get-segm-line "Точка на второй линии"))
        (princ (strcat "\nУгол между указанными линиями: "
                       (ru-conv-angle-to-str
                         (ru-geom-acute-angle
                           (angle (car first_line) (cadr first_line))
                           (angle (car second_line) (cadr second_line))
                         ) ;_ end of ru-geom-acute-angle
                         1
                         4
                         " градусов "
                       ) ;_ end of ru-conv-angle-to-str
               ) ;_ end of strcat

        ) ;_ end of princ
     ) ;_ end of if
  ) ;_ end of if
  (princ)
) ;_ end of defun
(START)
Здесь функция загружается и сразу выполняется. В памяти всегда только одна функция START
Внутри используются библиотечные функции с префиксом ru-

2. "Команд" очень много. Давать им осмысленные имена наподобие ru_calc_angle бессмысленно - все равно не запомнить точно и придется всегда выбирать из меню.

Но человек хорошо запоминает числа. Поэтому командам в MNL-файле присвоены "цифровые имена", например

Код:
[Выделить все]
 (defun C:0304 ()
  (ru-app-load "common/ru_calc_angle")
  (princ)
)
Человек помнит часто применяющиеся цифровые имена и может просто набрать на клавиатуре, причем цифры набрать легче. А если забыл, то тогда уж полезет в меню и там увидит имя.

3. Для этого в CUI прописаны MenuMacro

Код:
[Выделить все]
			<MenuMacro UID="RU_CALC_ANGLE">
				<Macro type="Any">
					<Revision MajorVersion="16" MinorVersion="2" UserVersion="1"/>
					<ModifiedRev MajorVersion="16" MinorVersion="2" UserVersion="1"/>
					<Name xlate="true" UID="XLS_0225">Угол	0304</Name>
					<Command>^C^C^P0304</Command>
					<HelpString xlate="true" UID="XLS_1795">0304: Вычисление угла между линиями</HelpString>
					<SmallImage Name="RU_CALC_ANGLE_16.BMP"/>
					<LargeImage Name="RU_CALC_ANGLE_16.BMP"/>
				</Macro>
			</MenuMacro>
Это дает наибольшую гибкость в работе.
ShaggyDoc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Загрузка библиотеки LISP команд в AutoCAD



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LISP. Плагин создания кабельных линий и генерации КЖ раздела КИПиА. Протестировано на AutoCAD 2015...2022 и офис 2013...2019. NanoCAD 23 petro_f Готовые программы 244 26.09.2024 10:25
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
LISP. Плагин сборки в чертёж отмеченных областей из других файлов чертежей, с разбивкой объектов MagiCAD и SPDS. Протестировано в AutoCAD 2015, 2018 MagiCAD2016 в AutoCAD 2015 petro_f Готовые программы 20 28.07.2020 14:21
LISP. Перестал работать нумератор в autocad 2017. Помогите найти ошибку. pobat LISP 2 19.07.2017 10:27
Autocad 2012 - неправильно отображаются иконки команд --Artem-- AutoCAD 1 06.04.2017 09:00