Тема: Получение пути lisp в момент запуска

Собственно вопрос-то в этом и есть. Запускается лисп (неважно, каким образом, но, как правило, через _.appload). Жизненно необходимо получить путь, по которому хранится запущенный лисп. Это вообще возможно?

Re: Получение пути lisp в момент запуска

findfile - вернет полный путь

Re: Получение пути lisp в момент запуска

В том-то и дело, что на момент запуска лиспа (findfile "prog.lsp") возвращает nil - файл гарантированно не лежит в путях доступа.

Re: Получение пути lisp в момент запуска

"Запущенного лиспа" как файла нет. Может быть запущена функция, которая может храниться в одном файле вместе с тысячью других. Или вообще "на лету" созданная.
Файлы, загружаемые автоматически надо искать где-то в Startup Suite.
HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\R16.2\ACAD-4001:409\Profiles\Profile_name\Dialogs\Appload
и там перебирать.

Re: Получение пути lisp в момент запуска

> ShaggyDoc
Нет, нашел другой вариант. (dos_search <ИмяЛиспа>) возвращает полный путь (DOSLib 6.1.5). А по указанному пути (который кстати тоже еще надо ухитриться получить: для разных версий все, что после слова AutoCAD, отличается, да еще надо и про ADT не забывать, к примеру) хранится вообще непонятно что. В ключе history вообще пусто (по крайней мере, на моей конкретной машине)

Re: Получение пути lisp в момент запуска

> kpblc
Если честно, то все это гадание на кофейной гуще. Представь себе, что у тебя есть два файла с одним именем a.lsp находящиеся в разных каталогах, которые могут находится, а могут и не находится в путях доступа AutoCAD. Какой и них будет загружен через _.appload ты не знаешь, так как пользователь может выбрать или один файл, или другой.
Если тебе очень нужно, могу написать для тебя функцию, которая возвращает список всех (!!!) загруженных в данный документ (или во все документы) lsp-(fas-,vlx-) файлов (т.е. список полных путей по которым эти файлы действительно загружались). Причем способ загрузки не важен - _.appload, (load ...) и т.д.
Но эта функция будет написана на ObjectARX (2004...2006) - как это сделать другими средствами я не знаю - IMHO в ActiveX такой возможности нет.

Re: Получение пути lisp в момент запуска

> Александр Ривилис
Я не такой "крутой" в программировании, но, извините, ПОЧЕМУ два LISP-файла под одним именем.
Слейете их в один MY_FUNCTION.LSP для вашего проекта и не будет головной боли,
как анекдоте...
Если он интересует, могу рассказать (написать)...

Re: Получение пути lisp в момент запуска

ABoltrushko пишет:

ПОЧЕМУ два LISP-файла под одним именем.

А почему НЕТ? Есть противопоказания? :) Вот если совпадают имена функций в этих файлах, то действительно можно нарваться на неприятности. Но дело не в этом. Вопрос поставлен совершенно конкретно и я не собираюсь обсуждать концепции программирования и методологию построения своей САПР.
В данном случае я описал совершенно АБСТРАКТНЫЙ случай, чтобы показать, что никакие (findfile ...) и (dos_search ...) не могут быть панацеей. А вот эта программа позволяет получить реальные пути доступа к загруженным lsp-файлам:
http://www.maestrogroup.com.ua/support/getlispinfo.zip
Вариант 1: (getlispfilepath) - функция возвращает список всех загруженных lsp-файлов (и fas-, и vlx- и mnl-) в формате ("<имя файла>" "<полный путь к файлу>") для каждого загруженного файла.
Вариант 2: (getlispfilepath <имя файла>) - функция возвращает полный путь к загруженному lsp-файлу или nil, если файл не загружен.
Вопросы есть? :)

Re: Получение пути lisp в момент запуска

> Александр Ривилис
http://www.maestrogroup.com.ua/support/getlispinfo.zip
Это ARX... Ни описания, ни смысла программы...
Вы быстрее нарветесь на... "Вот если совпадают имена функций в этих файлах, то действительно можно нарваться на неприятности".
Смысла НЕ ВИЖУ в загружаемых Lisp-файлах с одинаковым именем.
ВЫ меня пока не убедили...

Re: Получение пути lisp в момент запуска

> ABoltrushko
Реальная ситуация - в разных папках лежащих вна путях доступа есть файлы с одинаковыми названиями - я, когда пишу программы не переименовываю файлы, а сохраняю в новых папках с текущей датой...
Любой поиск по диску найдет кучу одноименных файлов в путях доступа, но загруженн из них будет только один!
Вопрос к вам - как определить из лиспа - какая из версий файла загруженна?
Александр Ривилис (2005-11-23 22:02:14)
Предложил свое универсальное решение, а вы?
PS. Кстати, у меня нет таких проблемм - работаю в голом акаде, а если надо - загружаю нужную программу, а потом (setq nil...

(изменено: Александр Ривилис, 3 марта 2012г. 09:36:27)

Re: Получение пути lisp в момент запуска

ABoltrushko пишет:

Это ARX... Ни описания, ни смысла программы...

Описание единственной функции, которую этот arx-файл экспортирует, в предыдущем моем посте. И это не для Вас, а для kpblc. Он поймет что это и зачем. smile

ВЫ меня пока не убедили...

А я и не собирался никого и ни в чем убеждать.

Re: Получение пути lisp в момент запуска

Понаписали тут....
Есть методы принцыпы обзывания файлов, функций...
Придумайте свой. И тогда уже точно не будет двух файлов a.lsp
У меня в группе работает программист. Юзает билдер и под акад не программит. Ему около 45 лет. Он сидит один в комнате...И никто не хочет с ним сидеть...Его просто отсадили от всех..Вы спросите почему? А потому что он неопрятный...на мониторе батон с килькой..стол завален..накурено беломором...
К чему это я...а к тому что и стиль написания его программ такой же..в них никто кроме него не разберется..как в исходниках так и в буилде...Интерфейс от балды...логики никакой...
Эх...море работы...:) Почему не уволить? Госструктура...и т.п....
Уважайте себя.

Re: Получение пути lisp в момент запуска

ShaggyDoc пишет:

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

Вот поэтому я и не сторонник пихать кучу функций в один файл и не сторонник автозагрузки всех файлов из пользовательской папки. Поэтому я и предлагаю всегда структурно один и тот же макрос для запуска программ:

^C^C^P(if (not C:ФУНКЦИЯ) (load "lisp_файл")) ФУНКЦИЯ

Пусть у меня будет в своей папке 200 файлов, зато я всегда знаю, что откуда загружается и как запускается. И именно поэтому все заумные варианты автозагрузки, предложенные здесь:
https://www.caduser.ru/forum/topic19699.html
не вызывают у меня энтузиазма. Слишком много "Авто"...

Re: Получение пути lisp в момент запуска

Я понимаю, что такой способ запуска программ неудобен для "клавишников" - но это их проблемы, типа обсуждаемой здесь, IMHO.

Re: Получение пути lisp в момент запуска

Совсем в сторону ушли. У kpblc был вопрос, на который только LISP не может дать ответ. Это легко решается на ObjectARX, что и продемонстрировал Александр Ривилис. Блестяще.
Я не знаю, зачем kpblc понадобилось определять имя файла. Наверное надо. Гораздо интереснее было бы определить, из какого файла загружена функция с известным именем.  Наверное это невозможно.
Само по себе имя файла еще дает мало информации. В одном файле может быть много именованных функций (а может и ни одной не быть). Может в файле быть и одна функция или "команда", но ее имя не обязательно должно совпадать с именем файла. Это зависит от того, как организована система работы. Но ее может вообще не быть (все свое и чужое барахло кидаем в Support).
Каждый волен организовывать работу, как нравится. Желательно при этом учитывать и опыт. Например, вроде бы очевидное

^C^C^P(if (not C:ФУНКЦИЯ) (load "lisp_файл")) ФУНКЦИЯ

обязательно требует, чтобы "lisp-файл" находился на путях поиска. А это совсем не хорошо. Для начала сойдет, для серьезной работы - нет.
"Свои" файлы мы всегда знаем (если есть хоть какой-то порядок в доме), и незачем их искать. А вот чужие могут представлять интерес, особенно что же у них внутри. Там ведь может быть функция намеренно сделанная одноименной с нашей. Чувствуете, какие перспективы у такого поиска?

Re: Получение пути lisp в момент запуска

> ShaggyDoc
Нет, уж, дудки. Если "lisp-файл" находится на путях доступа, это всегда хорошо для пользователя. У вас своя "серьезная" работа, а у пользователя или проектировщика, смею думать, совсем другая "серьезная" работа и ломать голову по поводу местонахождения файлов или имен функций ему совсем ни к чему. Вопрос, который здесь задан - не вопрос пользователя, конечно, а, скорее, разработчика, но многих пользователей, начинающих осваивать программирование для своих целей, просто собьет с толку, потому что смысл не понятен. Конечно, можно им посоветовать - не понимаешь, так и не суйся, куда не надо...

Re: Получение пути lisp в момент запуска

Спасибо всем откликнувшимся.
Да, задача действительно, во-первых, до конца не описана, а во-вторых, не является универсальной, т.е. нужна лично мне для конкретной ситуации. Прошу прощения, что невольно заставил всех мучаться и догадываться "что же этой заразе требуется" :).

> Александр Ривилис
Дело в том, что у меня нет 2 файлов с одинаковыми именами. В принципе. Имя файла = имени функции, которая в нем описана, и без вариантов. Это закон, который я для себя принял и придерживаюсь примерно как закона тяготения. Мои пользователи самостоятельно грузить лиспы вряд ли будут, им это "ехало-болело", а для меня критично.

> Александр Ривилис
Пока нет, только-только скачал, еще не смотрел. Попросту не успел. Все равно огромадное спасибо. Надеюсь, я могу если что обращаться в почту?

> ShaggyDoc
Мне это надо для самопрописывания программы в момент первого запуска. 30 с гаком пользователей, и для каждого руками прописывать пути поддержки, элементы реестра, да еще и заданные жестко - не, я пас. Если завтра по указанию сверху будет переименован сервак, на котором лежат лиспы и прочая лабудень общего доступа, и что? Предприятие если встанет на сутки, меня съедят. А жить иногда хочется непрожеванным :) Такими задачами занимаюсь я один, так что правила установленные однажды выдерживаются постоянно.

Re: Получение пути lisp в момент запуска

> Александр Ривилис
Обалдеть можно! Как у Вас так получается? Класс! Я от восторга чуть кофе не пролил!

Re: Получение пути lisp в момент запуска

> kpblc
Есть секция APPID, есть "расширенные данные",(не знаю, можно ли их задействовать в APPID), есть "словари", в них точно можно отсебятину впихивать. Все это сохраняется в DWG. При "первом запуске" прописываете пути, связь функции с файлом, ключи реестра, и ещё пожелания пользователю... Это можно и без ARX...

Re: Получение пути lisp в момент запуска

> kpblc
Надеюсь, я могу если что обращаться в почту? - Конечно.

> kpblc
Как правильно написал уважаемый ShaggyDoc, на ObjectARX такую функцию сделать очень просто. Вместе с отладкой мне на это понадобилось 10 минут. Судя по всему и команда _APPLOAD использует тот-же алгоритм для отображание списка загруженных lisp-файлов.

Re: Получение пути lisp в момент запуска

Если пошло использование ObjectARX, то логичнее, как мне кажется, было бы возложить обсуждаемую задачу именно на него. Насколько я понимаю ARX - приложения прекрасно знает откуда загружено и кроме того, функции загруженные из ARX в лисп воспринимаются как protected symbol и при соответсвующей настройке среды даже не поддаются перегрузке, об опасности которой уже говорилось.