Слегка оффтопа, потом конкретика
[<offtopic>]Перефразируя известный стишок, "адды разные нужны, адды разные важны". Исходников по инету масса, некоторые из них достаточно интересны и нужны. Их все надо подгружать в акад, чтобы они работали.[/<offtopic>]
[Не<offtopic>]Для загрузки приложений существует несколько путей.
1. Если приложение (lsp / vlx / fas / arx) одно, его проще всего загружать, используя команду _appload и в окошке - жать на "Портфель" (StartupSuite). Приложения, перечисленные в StartupSuite, загружаются во все профили AutoCAD'a и во все документы, и загружаются они, как правило,
после штатных и перед теми, которые прописаны в остальных методах. Среди несомненных плюсов метода можно отметить, что путь к файлу приложения можно не прописывать в _options -> Files -> Support files path (Настройка -> Файлы -> Пути поддержки). Среди минусов - невозможно использовать относительные пути, только абсолютные. Со всеми вытекающими.
2. Использовать один из штатных "автозагрузчиков" - acad.lsp / acad2000.lsp / acaddoc.lsp / acad2000doc.lsp, прописывая в них команды наподобие
Код
(load (findfile "c:\\mylisps\\adds\\main.lsp")
Метод немногим отличается от п.1
3. Для приложений, которые используют меню, можно в качестве макроса (той команды, что "прописана" на кнопке) использовать нечто наподобие:
Код
^C^C^P(if (not (<ИмяКоманды>)) (load <ПутьДоФайлаОписания>));<ИмяКоманды>
Сам я этот метод принципиально не использую, так что если нужны подробности - то немного позже, просто уточнить тонкости понадобится.
4. Опять же, если используется меню. Если имя файла меню, например, такое - MyFunniesAndPerfectMenu (расширение файла - mnu, mns, или cui - в принципе пофигу), рядом с файлом самого меню можно положить файл MyFunniesAndPerfectMenu.
mnl. Это обычный лисп-файл, в котором можно прописывать все что угодно.[/Не<offtopic>]
[Конкретика]Так вот, лично мой опыт меня убедил, что проще всего использовать именно 4-й путь. То есть создается свое меню, и рядышком кладется файл mnl, в котором прописывается полный загрузчик.
Все исполняемые файлы приложений (дальше просто не буду расшифровывать, на самом деле подразумеваю файлы с расширениями lsp, fas, vlx, arx) я скидываю в один каталог (например, d:\files\cad\adds). С разбивкой по подкаталогам, как мне сейчас интересно и важно. Неиспользуемые / отлаживаемые / криво написанные лиспы кидаются в отдельный каталог, например d:\files\cad\error_adds - чтобы они не лезли в общую картину. Создается собственное меню (штатные без крайней необходимости стараюсь не трогать) - обычный текстовый файлик с расширением .mnu и рядом с ним - .mnl.
Внутри mnl прописываю загрузчик, одним из следующих методов:
- сначала
обязательно функция загрузки - на выбор:
Код
(vl-load-com)
(defun z-files-in-directory (directory pattern nested /)
;|
* функция z-files-in-directory возвращает список файлов находящаяся в заданной
* директории
* Автор : Зуенко Виталий (ZZZ)
* Параметры:
* directory путь к папке например "D:\\Мои документы\\ZEF\\Lisp"
* pattern шаблон например "*.lsp" или список '("*.dwg" "*.dxf")
* nested искать в вложенных папках: t (да) или nil (нет)
* Пример вызова:
(z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" "*.lsp" t)
(z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" '("*.lsp" "*.fas") t)
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=19612AN
|;
(if (not (listp pattern))
(setq pattern (list pattern))
);_ if
(if nested
(apply
'append
(append
(mapcar '(lambda (_pattern)
(mapcar '(lambda (f) (strcat directory "\\" f))
(vl-directory-files directory _pattern 1)
);_ list
);_ lambda
pattern
);_ mapcar
(mapcar
'(lambda (d)
(z-files-in-directory
(strcat directory "\\" d)
pattern
nested
);_ z-files-in-directory
);_ lambda
(vl-remove
"."
(vl-remove ".."
(vl-directory-files directory nil -1)
);_ end of vl-remove
);_ vl-remove
);_ mapcar
);_ append
);_ append
(apply
'append
(mapcar '(lambda (_pattern)
(mapcar '(lambda (f) (strcat directory "\\" f))
(vl-directory-files directory _pattern 1)
);_ list
);_ lambda
pattern
);_ end of mapcar
);_ end of apply
);_ end of if
);_ end of defun
либо
Код
;|
Автор: Евгений Елпанов
http://www.autocad.ru/cgi-bin/f1/board.cgi?t=32891aD
Функция поиска файла или файлов в указанной папке и всех вложенных папках
файл задается именем или маской
Аргументы:
P — начальный путь поиска,
например "C:" или "C:\\Program Files"
F — название файла,
возможно использование подстановочных символов.
например
"*.dwg" — найдет все dwg-файлы
или "acad*.lsp"
Вызывать
(getfile "acad*.lsp" "C:\\Program Files")
Возвращает список файлов с полным путем до них и названием без маски.
'("C:\\Program Files\\AutoCAD 2004\\Express\\acadinfo.lsp"
"C:\\Program Files\\AutoCAD 2004\\Support\\acad2004.lsp"
"C:\\Program Files\\AutoCAD 2004\\Support\\acad2004doc.lsp"
"C:\\Program Files\\AutoCAD 2004\\Support\\acadinfo.lsp"
)
|;
(defun GetFile (f p)
;; By ElpanovEvgeniy
;; (getfile "acad*.lsp" "C:\\Program Files")
(apply (function append)
(cons (if (vl-directory-files p f)
(mapcar (function (lambda (x) (strcat p "\\" x))) (vl-directory-files p f))
);_ if
(mapcar (function (lambda (x) (GetFile f (strcat p "\\" x))))
(vl-remove ".." (vl-remove "." (vl-directory-files p nil -1)))
);_ mapcar
);_ cons
);_ apply
)
Использую вариант z-files-in-directory, скорее всего, в силу привычки
И дальше в том же самом mnl пишу примерно так:
Код
(defun kpblc-loader (/ err_lst err_msg)
(setq *kpblc-path-add-execute* "d:\\files\\cad\\adds")
(mapcar
'(lambda (x / err)
(foreach item (z-files-in-directory
*kpblc-path-add-execute*
(strcat "*." x)
t
);_ end of z-files-in-directory
; Следующая строка носит чисто иллюстративный характер
(princ (strcat "\nЗагружаю файл " (vl-princ-to-string item)))
(if (vl-catch-all-error-p
(setq err (vl-catch-all-apply
'(lambda ()
(if (= x "arx")
(arxload item)
(load item)
);_ end of if
);_ end of lambda
);_ end of vl-catch-all-apply
);_ end of setq
);_ end of vl-catch-all-error-p
(setq err_lst
(cons (cons item (vl-catch-all-error-message err)) err_lst)
);_ end of setq
);_ end of if
);_ end of foreach
);_ end of lambda
'("arx" "lsp" "fas" "vlx")
);_ end of mapcar
(if err_lst
(alert
(strcat "Не могу загрузить файлы:"
(vl-string-right-trim
"\n"
(mapcar 'strcat
(mapcar '(lambda (x) (strcat (car x) " : " (cdr x) "\n"))
(reverse err_lst)
);_ end of mapcar
);_ end of mapcar
);_ end of vl-string-right-trim
);_ end of strcat
);_ end of alert
);_ end of if
);_ end of defun
(kpblc-loader)
Если чего неясно - сообщите, будем разбирать дальше