|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Функция AutoLisp getPathLoadedApplication или как ее написать ?
инженер
Брест
Регистрация: 15.09.2009
Сообщений: 55
|
||
Просмотров: 9593
|
|
||||
ObjectARX - в командной строке набрать: _arx _c
Lisp - в командной строке набрать: _lsp _c п.с. правда это будет перечень подгруженных команд, а не имён библиотечных файлов.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
инженер Регистрация: 15.09.2009
Брест
Сообщений: 55
|
Меня интересует путь откуда загружено приложение.
Нужна функция похожая на (arx) но чтобы возвращала путь и имя приложения причем не только arx а lsp vlx (getPathLoadedApplication)->'("c:\ProgramFile\Autodesk\acapp.arx" "c:\etc\test.vlx ... ) |
|||
![]() |
|
||||
Я знаю как на .net, получить пути для lisp/net. Насчёт получения путей для vba/arx - может и их удастся, но я не пробовал. Если мне не изменяет память, средствами автолиспа получить такие каталоги не удастся (например функция лиспа вроде как не может определить полное имя файла из которого она вызвана). Т.о. чтобы дать лиспу функционал, запрашиваемый топикстартером - нужно писать обёртку, написанную на objectarx/.net (мне видится решение именно таким).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
инженер Регистрация: 15.09.2009
Брест
Сообщений: 55
|
Написал сам на c++ используя класс acDocManager из objectArx неужели нет доступа к этому классу из autoLispa ?
Код прилагаю может кому пригодиться т.к считаю она должна быть библиотечной функцией и почему ее до сих пор нет ? Жаль что autolisp все меньше поддерживают в autodesk. Код:
Последний раз редактировалось Кулик Алексей aka kpblc, 10.06.2011 в 10:33. |
|||
![]() |
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
|
|||
![]() |
|
||||
это только кличка Регистрация: 22.10.2006
Москва
Сообщений: 252
|
Цитата:
Один из вариантов выкладывал hwd на своем сайте. Если нужно просто в коде vlx-файла определить, откуда этот vlx загружен, то при условии, что файл расположен по одному из путей поддержки AutoCAD, путь можно узнать (setq fullpath (findfile "ИмяФайла.vlx")).
__________________
...в шее моей жилы железные, и лоб мой - медный... Последний раз редактировалось Pastor, 10.06.2011 в 19:22. |
|||
![]() |
|
||||
Цитата:
Как поддерживался, так и поддерживается. Ты кажется не понимаешь природу Autolisp, когда функции могут генерироваться на лету, вообще без использования файлов. |
||||
![]() |
|
||||
инженер Регистрация: 15.09.2009
Брест
Сообщений: 55
|
Мне иногда надо загрузить autoLisp и иметь доступ к ресурсам(например файлу конфигурации) .
Если проект не указан в пути доступа в AUTOCAD то поиск при помощи функции findfile не возможен. Бывает что несколько файлов с одинаковым именем расположены по разным директориям и какой файл загружен так же удобно использовать выше написанную функцию на C++ используя ObjectArx. Функция (getloadedlispapp) котороя возвращает то же самое что показано в диалоговом окне и команда appload ->("C:\\Program Files\\Autodesk\\AutoCAD 2012 - English\\Express\\acetutil.fas" 2012 - English\\R18.2\\enu\\support\\acad.mnl" "G:\\AutoLisp\\LIB\\ak_lib0.lsp" "G:\\AutoLisp\\LIB\\ak_max_min.lsp" "G:\\AutoLisp\\LIB\\ak_util.lsp" "G:\\AutoLisp\\EXCEL\\ak_EXCEL.lsp" "G:\\AutoLisp\\ak_tools.mnl" "C:\\Documents and Settings\\Пользователь\\Application Data\\Autodesk\\AutoCAD 2012 - English\\R18.2\\enu\\support\\acetmain.mnl" "G:\\AutoLisp\\AK_STAIR\\AK_STAIR.VLX") etc Например загруженное приложение AK_STAIR.VLX не указано в пути Support File Search и доступ к файлу конфигурации AK_STAIR.ini получить проблематично не имея function (getLoadedLispApp). Возможно кто-то и использует autoLISP в ИИ и генерирует функции которые сами пишут функций, но для этого удобнее использовать Common Lisp используя например defmacro и если вы используете эти библиотеки поделитесь, мне будет интересно. |
|||
![]() |
|
||||
Цитата:
![]() P.S.: Аналогичную функцию я написал 6 лет назад (здесь), но она оказалась невостребованной именно по причине "возможных вариантов", когда однозначно нельзя сказать какой это файл. |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Беда в Вашей функции - в том что она под objectarx - ну есть у меня загруженный лисп - как мне загрузить Вашу функцию? - где она? - надо к ней знать путь, если я его знаю - то значит программа проинсталированна или путь "жестко" прописан - а при таком раскладе мне она не нужна - с этими условиями можно и средствами лиспа получить конфигурацию (по тому-же пути). Если только не доходить до крайности - вписывать Ваш бинарный код (в каком нибудь base64) в лисп (под все версии?), распаковывать в какой-нибудь временный файл и запускать (либо-же брать исходный файл - но лучше на .net т.к. компиляторы встроены в дистрибутив, компилировать его на лету (с использованием библиотек текущей системы) и запускать) - но это получается большой гемор - непонятно из-за чего.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
Нужно изначально писать код так, чтобы не пришлось под каждую лиспину добавлять очередную запись в каталоги поиска.
Для этого в каталогах поиска задаёшь всего один путь, например C:\AutoCAD\Addons\LISP. Теперь каждого пакета лиспов создаёшь в этот каталоге свой подкаталог и кидаешь лиспы в него, а в коде этих лиспов поиск ресурсов задаёшь с учётом имени подкаталога в котором они находится. Т.е. если твой пакет лежит в C:\AutoCAD\Addons\LISP\Sample, то в коде поиск всяких там dcl-файлов, иконок и т.п. нужно прописывать в виде "Sample\\ИмяФайла", а не просто "ИмяФайла", как зачастую пишут некоторые говнокодеры (по другому язык не поворачивается сказать). Имея общий знаменатель в виде C:\AutoCAD\Addons\LISP (или др. путь - на твоё усмотрение) и обозначая поиск ресурсов с учётом родительского каталога, ты сразу же снимаешь с себя проблему необходимости добавлять под каждый каталог с лиспами свой путь в список поиска, зашлаковывая тем самым профиль автокада и снижая скорость его работы). А если ещё и имена функциям будешь давать согласованные (начиная со своего префикса), а не такие как dt, pb, cmd1, www и т.п. - то сможешь ещё избежать и конфликтов имён. Хотя, как показывает практика - гуана с подобным названиями/указаниями ресурсов всё равно будет море в тех лиспах, которые тебе притащат юзеры, понабрав их с двг.ру и кадюзера, ибо каждый из таких кодо-писателей считает себя единственным и неповторимым, и потому не допускает видимо мысли о том, что помимо его лиспа юзер может загрузить и др лиспы и пишет код так, что для того, чтобы его багоподелие работало - юзер должен под него добавить в каталоги поиск очередной путь. Имхо Цитата:
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
инженер Регистрация: 15.09.2009
Брест
Сообщений: 55
|
Не плохо бы иметь библиотеку OpenLibForAutolisp с исходными текстами на C++ C#Net VBNet VBA типа OpenDCL для AutoLispa
Господин Александр Ривилис написал 6 лет функцию скомпилировал, а исходников не выложил. Пришлось тратить время. А время деньги ... Например с подшивками AutoLIsp не дружит и неплохо бы иметь функции доступа к этому объекту ... |
|||
![]() |
|
||||
Цитата:
Автодеск положил на это дело болт (не развивает автолисп), хотя существует слабая надежда, что когда-то снова продолжит, т.к. в опросе есть такой пункт, мол на что по вашему следует сделать упор в развитии - там и лисп присутствовал в качестве пункта выбора... имхо
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
Цитата:
Цитата:
Код:
|
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
В дополнение сказанному hwd - я вижу только одно "разумное" дополнение автолиспа - которое сделать сможет только автодекс - т.к. ни какой встроенный функционал такого не может - сделать интерфейс с Net (наподобие как в свое время добавили возможность работать с com объектами), вот это "реально" будет интересно - а всякие библиотеки примочки реализующие отдельные API это дело бессмысленное и бесконечное. Ну а если они еще и сам лисп "облагородят" (замыкания, макросы, отложенные вычисления, классы (хотя если сделать предыдущие вещи они (классы) будут нужны только для "приходящих" из ООП) и прочие "современные" фишки (хотя разрабатывались они 50-30 лет назад)) - то это вобще будет настоящий праздник (по крайней мере лично для меня).
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
это только кличка Регистрация: 22.10.2006
Москва
Сообщений: 252
|
Цитата:
1. (nc-get-object "путь_к_сборке" "полное_имя_класса") - создает объект указанного класса и возвращает дескриптор (например целочисленный). 2. (nc-invoke-method дескриптор "имя_метода" список_аргументов) 3. (nc-get-property дескриптор "свойство") - возвращает атомарное значение. 4. (nc-set-property дескриптор "свойство" значение) - устанавливает атомарное значение. 5. (nc-release-object дескриптор) - уничтожает объект. Ограничения будут касаться только типов передаваемых и возвращаемых параметров - строки, целые числа, действительные числа и логические T и nil.
__________________
...в шее моей жилы железные, и лоб мой - медный... |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Offtop: Да простит меня автор топика
То Пастор - все верно но есть одно существенное НО - которое перечеркивает всю красоту Вашего предложения (которое действительно вполне возможно написать + "конверторы" типов) - загрузите Вы, например System.Windows.Forms - "нарисуете" что угодно - а как на "кнопочку" действие повесите? лямбду (функцию) передать текущая модель не позволяет - только в виде строки - то есть надо парсинг лиспа СВОЙ писать (ну или тупо отправить его как есть в командную строку), но здесь велика вероятность что автокад просто в "удачный" момент вылетит (т.к. не поддерживает многопоточности), в vl придумали чудо называемое "реакторами" - которые работают ТОЛЬКО сами с собой - ни с какими "внешними" объектами - то есть по сути придеться целиком новый лисп писать - а в чем тогда смысл - проще готовый взять. Без помощи автодеска (своими силами) возможно только запуск функции без аргументов (ну или с фиксированными - что одно и тоже) - чтобы она сама "внешние" данные читала и исходя из них что-то делала - мне "такой хокей не нужен" - я быстрей на C# (никому не в обиду - это мои личные тараканы и предпочтения - язык хороший - с каждым годом все "человечней" становится и дальше от С уходит) буду писать чем на таком "недолиспе".
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
инженер Регистрация: 15.09.2009
Брест
Сообщений: 55
|
Интересное решение предлагает господин из manusoft
Автоматический загрузчик AutoLisp http://www.manusoft.com/resources/ar...ndloadvlx.html LspLoad.arx переименовываем в наш проект .vlx и тогда функция (GetPathOfXXXXX) ГДЕ XXXXX - базовое имя модуля. и вызвав ::GetModuleFileName( _hdllInstance, szPath, MAX_PATH ); Мы получаем что хотели. Все гениальное просто. |
|||
![]() |
|
||||
это только кличка Регистрация: 22.10.2006
Москва
Сообщений: 252
|
Не понимаю всех этих сложностей, если можно просто в файл acaddoc.lsp поместить набор инструкций для загрузки требуемых VLX-файлов.
Файл acaddoc.lsp кладется в некоторую директорию - общий корень для всех подгружаемых приложений. Корневой каталог любого приложения является непосредственным подкаталогом общего корневого каталога. Путь к общему корневому каталогу регистрируется в качестве пути поддержки AutoCAD (один единственный; то, о чем писал hwd в посте №17). Тогда каждая инструкция загрузки vlx-модуля будет выглядеть следующим образом: Код:
Код:
Offtop: Для Дима_. Речь не идет о использовании объектов любых классов из любых сборок. Речь идет об использовании объектов классов, спроектированных для нужд лисп-приложений под AutoCAD и находящихся с соответствующих (самодельных ![]() Эти сборки могут не использовать библиотеки AcMgd.dll и AcDbMgd.dll, т.е. гарантированно быть пригодными для любых современных и будущих версий AutoCAD. А могут и ссылаться на указанные библиотеки, и тем самым, ничем не отличаться от "штатных" .NET приложений для AutoCAD за исключением механизма их загрузки/использования.
__________________
...в шее моей жилы железные, и лоб мой - медный... Последний раз редактировалось Pastor, 19.06.2011 в 13:08. |
|||
![]() |
|
||||
инженер Регистрация: 15.09.2009
Брест
Сообщений: 55
|
Для того чтобы использовать findfile необходимо добавить папку с AutoLisp ом в Support File Search Path
это хорошо когда у вас небольшой один проект где Lisp файлы в одном месте. Но когда количество увеличивается возникают проблемы. Наверное даже есть ограничение на Support File Search Patch Замечал что добавляешь пути к <Support File ... > а в следующий сеанс часть путей пропало. Решение предложенное господином Mansur Mamkin ым очень красивое и изящное : 1. При установки своего приложения Autolisp имея заглушку arx можно создать автоматический загрузчик не вмешиваясь в acaddoc.lsp или acad.lsp причем загружаются не только файлы в текущей директории а все вложенные файлы. 2. имеем доступ к файлам и ресурсам программы не используя findfile тк имеет некоторое неудобство выше указанное. Кстати Мансур Мамкин припоминается написал функция для autoLisp вызов функции из любой DLL с произвольным количеством и произвольными типами данных. Достойная библиотечная функция увеличивающая возможности AutoLIspa. |
|||
![]() |
|
||||
Цитата:
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
Цитата:
Я у своих пользователей убиваю такой шлак, даже не берусь его изучать/править, т.к. проще самому решение написать, чем за кем-то подчищать его хвосты (ещё и не факт, что написанные без ошибок).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Offtop: Боюсь это не только Ваша "проблемма" ИХМО 90% лисптописателей считают "свои" стандарты самыми правильными - и старательно изобретают велосипеды - по моему порядка здесь никогда не будет по причине "мультипрагмидности" (причем каждая в отдельности реализованна серединка-на-половинку) языка и как следствие - огромному диапазону уровней программирования (начиная с командных методов и до...)
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
кто "вы" и какой "фигней"?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
DwgRuLispLib: Функция открытия диалога Open\Save As файла (файлов) | Supermax | Библиотека функций | 20 | 14.03.2018 10:05 |
написать программу-листинг в AutoLisp | students | LISP | 31 | 23.05.2011 23:47 |
Autolisp функция как аргумент другой функции | xsakabsx | LISP | 9 | 17.12.2010 14:15 |
структурированный список | Holon | Программирование | 22 | 11.09.2007 14:09 |
Написать текст (autolisp) | Torero | LISP | 2 | 23.10.2004 23:53 |