Функция AutoLisp getPathLoadedApplication или как ее написать ? - Страница 2
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Функция AutoLisp getPathLoadedApplication или как ее написать ?

Функция AutoLisp getPathLoadedApplication или как ее написать ?

Ответ
Поиск в этой теме
Старый 08.06.2011, 13:15
Функция AutoLisp getPathLoadedApplication или как ее написать ?
alex-63
 
инженер
 
Брест
Регистрация: 15.09.2009
Сообщений: 55

Господа, программирующие на AutoLispe подскажите функцию возвращающую, загруженные приложения (arx dbx lsp vlx fas etc)
аналог команды _appload где можно было бы узнать с какой директории загрузилось приложение. Меня интересует vlx приложение.

alex-63
Просмотров: 9589
 
Непрочитано 16.06.2011, 20:41
#21
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


В дополнение сказанному hwd - я вижу только одно "разумное" дополнение автолиспа - которое сделать сможет только автодекс - т.к. ни какой встроенный функционал такого не может - сделать интерфейс с Net (наподобие как в свое время добавили возможность работать с com объектами), вот это "реально" будет интересно - а всякие библиотеки примочки реализующие отдельные API это дело бессмысленное и бесконечное. Ну а если они еще и сам лисп "облагородят" (замыкания, макросы, отложенные вычисления, классы (хотя если сделать предыдущие вещи они (классы) будут нужны только для "приходящих" из ООП) и прочие "современные" фишки (хотя разрабатывались они 50-30 лет назад)) - то это вобще будет настоящий праздник (по крайней мере лично для меня).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 17.06.2011, 17:59
#22
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Цитата:
...я вижу только одно "разумное" дополнение автолиспа - которое сделать сможет только автодекс - т.к. ни какой встроенный функционал такого не может - сделать интерфейс с Net (наподобие как в свое время добавили возможность работать с com объектами),..
Совершенно реально написать .NET приложение к AutoCAD (назовем его NetCoupler.dll), экспортирующее в документ следующие лисп-функции:
1. (nc-get-object "путь_к_сборке" "полное_имя_класса") - создает объект указанного класса и возвращает дескриптор (например целочисленный).
2. (nc-invoke-method дескриптор "имя_метода" список_аргументов)
3. (nc-get-property дескриптор "свойство") - возвращает атомарное значение.
4. (nc-set-property дескриптор "свойство" значение) - устанавливает атомарное значение.
5. (nc-release-object дескриптор) - уничтожает объект.
Ограничения будут касаться только типов передаваемых и возвращаемых параметров - строки, целые числа, действительные числа и логические T и nil.
__________________
...в шее моей жилы железные, и лоб мой - медный...
Pastor вне форума  
 
Непрочитано 18.06.2011, 00:24
#23
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Offtop: Да простит меня автор топика
То Пастор - все верно но есть одно существенное НО - которое перечеркивает всю красоту Вашего предложения (которое действительно вполне возможно написать + "конверторы" типов) - загрузите Вы, например System.Windows.Forms - "нарисуете" что угодно - а как на "кнопочку" действие повесите? лямбду (функцию) передать текущая модель не позволяет - только в виде строки - то есть надо парсинг лиспа СВОЙ писать (ну или тупо отправить его как есть в командную строку), но здесь велика вероятность что автокад просто в "удачный" момент вылетит (т.к. не поддерживает многопоточности), в vl придумали чудо называемое "реакторами" - которые работают ТОЛЬКО сами с собой - ни с какими "внешними" объектами - то есть по сути придеться целиком новый лисп писать - а в чем тогда смысл - проще готовый взять. Без помощи автодеска (своими силами) возможно только запуск функции без аргументов (ну или с фиксированными - что одно и тоже) - чтобы она сама "внешние" данные читала и исходя из них что-то делала - мне "такой хокей не нужен" - я быстрей на C# (никому не в обиду - это мои личные тараканы и предпочтения - язык хороший - с каждым годом все "человечней" становится и дальше от С уходит) буду писать чем на таком "недолиспе".
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 19.06.2011, 01:48
#24
alex-63

инженер
 
Регистрация: 15.09.2009
Брест
Сообщений: 55


Интересное решение предлагает господин из manusoft
Автоматический загрузчик AutoLisp
http://www.manusoft.com/resources/ar...ndloadvlx.html
LspLoad.arx переименовываем в наш проект .vlx
и тогда функция
(GetPathOfXXXXX) ГДЕ XXXXX - базовое имя модуля.

и вызвав ::GetModuleFileName( _hdllInstance, szPath, MAX_PATH );
Мы получаем что хотели.
Все гениальное просто.
alex-63 вне форума  
 
Непрочитано 19.06.2011, 10:51
#25
Pastor

это только кличка
 
Регистрация: 22.10.2006
Москва
Сообщений: 252


Не понимаю всех этих сложностей, если можно просто в файл acaddoc.lsp поместить набор инструкций для загрузки требуемых VLX-файлов.
Файл acaddoc.lsp кладется в некоторую директорию - общий корень для всех подгружаемых приложений. Корневой каталог любого приложения является непосредственным подкаталогом общего корневого каталога. Путь к общему корневому каталогу регистрируется в качестве пути поддержки AutoCAD (один единственный; то, о чем писал hwd в посте №17).
Тогда каждая инструкция загрузки vlx-модуля будет выглядеть следующим образом:
Код:
[Выделить все]
;;; Файл acaddoc.lsp
;;; Инструкции загрузки файлов приложений:
(load (strcat (vl-filename-directory (findfile "acaddoc.lsp")) "\\" "Корневой_каталог_приложения\\путь\\имя_файла.vlx")))
Тогда из кода vlx-файла узнать его собственное местоположение можно так:
Код:
[Выделить все]
(setq loadedfrom (findfile "Корневой_каталог_приложения\\путь\\имя_файла.vlx"))
Данный подход требует определенной дисциплины. А именно, не грузить что попало откуда попало, а организовать все подгружаемые приложения в систему каталогов: общий корневой каталог во главе и корневые каталоги приложений на следующем (нижележащем) уровне. Кстати файлы не обязательно должны быть vlx. Можно и lsp, и fas.

Offtop:
Для Дима_.
Речь не идет о использовании объектов любых классов из любых сборок.
Речь идет об использовании объектов классов, спроектированных для нужд лисп-приложений под AutoCAD и находящихся с соответствующих (самодельных ) сборках. Например, это может быть класс, реализующий нечто напоминающее AJAX и доставляющее с удаленных серверов lisp-код в виде текста (взгляд на AutoCAD, как на специализированный браузер, умеющий интерпретировать LISP-"разметку", имеет право на жизнь. Ему [автокаду] только надо помочь делать http-запросы GET и POST...) Или класс, реализующий некое модальное диалоговое окно (похожее на XML-меню от ShaggyDoc).
Эти сборки могут не использовать библиотеки AcMgd.dll и AcDbMgd.dll, т.е. гарантированно быть пригодными для любых современных и будущих версий AutoCAD. А могут и ссылаться на указанные библиотеки, и тем самым, ничем не отличаться от "штатных" .NET приложений для AutoCAD за исключением механизма их загрузки/использования.
__________________
...в шее моей жилы железные, и лоб мой - медный...

Последний раз редактировалось Pastor, 19.06.2011 в 13:08.
Pastor вне форума  
 
Автор темы   Непрочитано 20.06.2011, 10:24
#26
alex-63

инженер
 
Регистрация: 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.
alex-63 вне форума  
 
Непрочитано 20.06.2011, 10:34
#27
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от alex-63 Посмотреть сообщение
Для того чтобы использовать findfile необходимо добавить папку с AutoLisp ом в Support File Search Path
это хорошо когда у вас небольшой один проект где Lisp файлы в одном месте.

Но когда количество увеличивается возникают проблемы. Наверное даже есть ограничение на Support File Search Patch
Замечал что добавляешь пути к <Support File ... > а в следующий сеанс часть путей пропало.
Я так понял - ты "на своей волне" и не читаешь то, что тебе пишут... Если ты нас всё-таки "почитываешь" - ещё раз вдумчиво прочти #17...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 20.06.2011, 16:35
#28
alex-63

инженер
 
Регистрация: 15.09.2009
Брест
Сообщений: 55


И при установке прикладывать Вашу инструкции кому и куда устанавливать программу.
alex-63 вне форума  
 
Непрочитано 20.06.2011, 16:54
#29
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от alex-63 Посмотреть сообщение
И при установке прикладывать Вашу инструкции кому и куда устанавливать программу.
Это не поможет. Программа изначально должна быть написана с учётом этих требований. Т.о. либо проблемные лиспы в ведро, либо садиться править их дабы они соответствовал обозначенным требованиям. Нет волшебной таблетки, которая существующий го*нокод во мгновение превратит в нормальный - это сразу нужно было писать грамотно, а не откладывать рефакторинг на потом....

Я у своих пользователей убиваю такой шлак, даже не берусь его изучать/править, т.к. проще самому решение написать, чем за кем-то подчищать его хвосты (ещё и не факт, что написанные без ошибок).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 20.06.2011, 17:38
#30
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от hwd Посмотреть сообщение
Я у своих пользователей убиваю такой шлак, даже не берусь его изучать/править, т.к. проще самому решение написать, чем за кем-то подчищать его хвосты (ещё и не факт, что написанные без ошибок).
Offtop: Боюсь это не только Ваша "проблемма" ИХМО 90% лисптописателей считают "свои" стандарты самыми правильными - и старательно изобретают велосипеды - по моему порядка здесь никогда не будет по причине "мультипрагмидности" (причем каждая в отдельности реализованна серединка-на-половинку) языка и как следствие - огромному диапазону уровней программирования (начиная с командных методов и до...)
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 20.06.2011, 19:38
#31
Vov.Ka


 
Регистрация: 21.07.2008
Луцьк
Сообщений: 179


какого уровня и объема вы (все) пишете приложения, что бы реально заморачиваться такой фигней?
Vov.Ka вне форума  
 
Непрочитано 20.06.2011, 20:00
#32
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Vov.Ka Посмотреть сообщение
какого уровня и объема вы (все) пишете приложения, что бы реально заморачиваться такой фигней?
кто "вы" и какой "фигней"?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Функция AutoLisp getPathLoadedApplication или как ее написать ?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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