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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как получить список открытых в текущем сеансе файлов и перейти в один из них?

Как получить список открытых в текущем сеансе файлов и перейти в один из них?

Ответ
Поиск в этой теме
Непрочитано 18.09.2018, 15:09 #1
Как получить список открытых в текущем сеансе файлов и перейти в один из них?
===AAA===
 
г. Норильск
Регистрация: 15.08.2005
Сообщений: 452

Всем добрый день.

Есть сеанс Автокада, в котором открыто несколько файлов. Пусть это будут:

Файл-1.dwg
Файл-2.dwg
Файл-44.dwg
Файл-ABC.dwg

И мы находимся (т.е. он "текущий") в одном из них. Скажем, в Файл-44.dwg.

Нужно - на LISP'е - получить список этих файлов в виде

("Файл-1.dwg" "Файл-2.dwg" "Файл-44.dwg" "Файл-ABC.dwg")

и сделать так, чтобы текущим стал любой выбранный из этого списка.
Видимо, начать нужно с чего-то навроде

(setq spisok (vla-get-documents (vlax-get-acad-object)))

а вот дальше что?
__________________
Счастливо, Алексей!
Просмотров: 5130
 
Непрочитано 18.09.2018, 16:56
#2
Кулик Алексей aka kpblc
Moderator

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


Надеюсь, ты понимаешь, что после активации другого файла выполнение лиспа прервется?
Код без проверок:
Код:
[Выделить все]
 (defun activate-doc (doc-name / doc_lst doc) ;|
*    Активация документа по имени
*    Параметры вызова:
   doc-name   имя документа
|;
  (vlax-for item (vla-get-documents (vlax-get-acad-object))
    (setq doc_lst (cons (strcase (vl-filename-base (vla-get-name item))) item))
    ) ;_ end of vlax-for
  (if (setq doc (cdr (assoc (strcase doc-name doc_lst))))
    (vl-catch-all-apply (function (lambda () (vla-put-activedocument (vlax-get-acad-object) doc))))
    ) ;_ end of if
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 18.09.2018, 17:48
#3
Setvar


 
Регистрация: 10.02.2007
Москва
Сообщений: 611


В AutoCAD'е в пункте "Окно" падающего меню есть список открытых файлов. Ткнул в нужный и он выйдет на передний план. И не нужно никаких программ, и замечание Алексея теряет актуальность. Это в случае обычной работы. Если же это нужно для упражнений, то тогда лучше бы сделать диалоговое окно со списком загруженных файлов и сделать кнопку меню, чтобы она была доступна из любого загруженного файла. Овчинка выделки не стоит, IMHO. Трудно предположить, что у автора темы одновременно открыто файлов больше, чем доступно в упомянутом пункте падающего меню.
Setvar вне форума  
 
Непрочитано 18.09.2018, 17:58
#4
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


пора задуматься о переходе на dotNET
trir вне форума  
 
Непрочитано 18.09.2018, 18:13
#5
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,009


Цитата:
Сообщение от Setvar Посмотреть сообщение
В AutoCAD'е в пункте "Окно" падающего меню есть список открытых файлов. Ткнул в нужный и он выйдет на передний план.
а не пакетную ли обработку пытается ТС реализовать? В шапке ветки нет упоминания в явном виде, что файлы должны выбираться визуально как то в диалоге..
Сергей812 вне форума  
 
Автор темы   Непрочитано 18.09.2018, 20:56
#6
===AAA===


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


Да пакетную, пакетную...

:-)

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

Потому и написал, что надобно сие на ЛИСПе.

Экспериментирую малость.
__________________
Счастливо, Алексей!
===AAA=== на форуме  
 
Непрочитано 18.09.2018, 21:03
#7
trir


 
Регистрация: 18.12.2010
Сообщений: 5,047


на lisp'е не получится, а на dotNET - легко
trir вне форума  
 
Непрочитано 18.09.2018, 21:27
#8
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от trir Посмотреть сообщение
на lisp'е не получится
Получится, но не так, как хочет ТС. ObjectDBX пока еще никуда не делся
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.09.2018, 13:01
#9
Vov.Ka


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


https://www.theswamp.org/index.php?topic=53912.0
Vov.Ka вне форума  
 
Автор темы   Непрочитано 20.09.2018, 10:22
#10
===AAA===


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


Всем привет!

День провёл без интернета, у нас такое случается.

Спасибо за код (его, правда, пришлось чуток подправить),
делает ровно то, что и хотелось.

И ещё вот с этим небольшое уточнение:

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Надеюсь, ты понимаешь, что после активации другого файла выполнение лиспа прервется?
Код, как я понял, прерывается только в том случае, если в нем есть какие-то запросы, типа:
(getint "Сколько вешать в граммах?")

Если диалогов нет, код чешет себе дальше...
__________________
Счастливо, Алексей!
===AAA=== на форуме  
 
Непрочитано 20.09.2018, 10:37
#11
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,009


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Код, как я понял, прерывается только в том случае, если в нем есть какие-то запросы, типа:
(getint "Сколько вешать в граммах?")
почему вы решили, что код прерывается? Приостанавливается выполнение кода в ожидание реакции пользователя.

А вообще выполнение команды может идти либо в контексте документа, либо в контексте приложения. Последнее означает, что код работает в отдельном потоке вне какого либо документа. Но при этом накладывается ряд ограничений на использование функций того же ввода, например.
Сергей812 вне форума  
 
Непрочитано 20.09.2018, 10:43
#12
Кулик Алексей aka kpblc
Moderator

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


Лисп работает только в контексте документа. Это не .NET / arx
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.09.2018, 10:52
#13
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,009


А в .NET задается простым указанием флага Session в заголовке кода команды.
Сергей812 вне форума  
 
Непрочитано 20.09.2018, 10:58
#14
Кулик Алексей aka kpblc
Moderator

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


Но здесь ни разу не NET
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 20.09.2018, 11:02
#15
===AAA===


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


Проблема ввода (ежели таковая возникает), кстати говоря,
вполне решается библиотекой DOSLib. Типа:

(setq a (dos_getint "Хочу знать" "Сколько вешать в граммах?"))

И всё, код стоит, ждёт ввода.


Можно даже на это время организовать "переброску фокуса"
между окнами. Скажем, на "вопрошающее" (имя-то файла
знаем) и обратно.
__________________
Счастливо, Алексей!

Последний раз редактировалось ===AAA===, 20.09.2018 в 11:09.
===AAA=== на форуме  
 
Непрочитано 20.09.2018, 11:17
#16
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,009


Цитата:
Сообщение от ===AAA=== Посмотреть сообщение
Проблема ввода (ежели таковая возникает), кстати говоря,
вполне решается библиотекой DOSLib. Типа:
Цитата:
Written as an AutoCAD ObjectARX application, DOSLib extends the AutoLISP programming language by providing the following functionality:
т.е. это внешний костыль, зависящий от версии (фактическая независимость лиспа от версии является одни из основных доводов "противников" Net/ObjectARX)
Сергей812 вне форума  
 
Автор темы   Непрочитано 20.09.2018, 11:54
#17
===AAA===


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


Да - "внешний костыль". Самому сие не очень нравится. Ну уж - как есть.
Если нужно что-то слепить"быстро и на коленке" - сгодится.
Для любителей чистого искусства - вряд ли.
__________________
Счастливо, Алексей!
===AAA=== на форуме  
 
Непрочитано 20.09.2018, 11:54
#18
Кулик Алексей aka kpblc
Moderator

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


Если ты гарантируешь загрузку DosLib, да еще и учитываешь все варианты, версии и разрядности - то пожалуйста
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 20.09.2018, 12:07
#19
===AAA===


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


Да, в стартовом модуле стоит (getvar "acadver") с разбором
полученных данных и подгрузкой нужной версии DOSLib.
Есть конечно, риск, что когда-нибудь фирма-разработчик
заявит, что ей надоело поддерживать этот продукт...

----- добавлено через ~3 ч. -----
Что-то как-то не получается :-(

Сбой начинается после открытия/закрытия первого же файла из списка.
Вот как это выглядит (упрощённо, просто суть проблемы).

Есть текущая папка, в ней куча *.dwg файлов.

Получаем список lstrab ("Файл1" "Файл2" "Файл3"), при этом сами мы
находимся (текущий открытый) в файле "Файл4".

Тут же в этой же папке (для пробы!) делаем файл acad.lsp
в который записываем строчку:

(eval (vl-bb-ref 'DreamSendCommand))

и файл 123.lsp

со строчками
;================================
(princ "\n \nВыполнение кода 123 !")
(setq a1 18 a2 58)
(print (+ a1 a2))
(command "_.qsave")
(command "_.close")
(princ)
;================================

Вроде бы проще некуда.

Запускаем программу, доходим до участка:
;================================
(vl-bb-set 'DreamSendCommand '(load "123.lsp"))

(foreach p1 lstrab

(vla-open (vla-get-Documents (vlax-get-acad-object)) p1)

)

И вот здесь непонятка. Если в файле 123.lsp закомментарить строчки

; (command "_.qsave")
; (command "_.close")

то откроются ещё три документа и в каждом выполнится код

(setq a1 18 a2 58)
(print (+ a1 a2))

но если эти строчки есть, то первый файл из списка нормально
открывается/закрывается, а уже на втором файле внутри foreach
получаю ошибку типа:

#<VLA-OBJECT IAcadDocuments 00000276627d7b90> Ошибка Automation. Ошибка при раскодировании данных

И так уже и эдак пробовал. Чего ему надо-то?
__________________
Счастливо, Алексей!
===AAA=== на форуме  
 
Автор темы   Непрочитано 03.10.2019, 09:39
#20
===AAA===


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


Всем привет!

Вернусь к первой части "Темы", чтобы не создавать новую.

Оно вот сейчас понадобилось именно так.

Как получить список открытых в текущем сеансе файлов?

Цитата:
Есть сеанс Автокада, в котором открыто несколько файлов. Пусть это будут:

Файл-1.dwg
Файл-2.dwg
Файл-44.dwg
Файл-ABC.dwg

И мы находимся (т.е. он "текущий") в одном из них. Скажем, в Файл-44.dwg.

Нужно - на LISP'е - получить список этих файлов в виде

("Файл-1.dwg" "Файл-2.dwg" "Файл-44.dwg" "Файл-ABC.dwg")
С одним только уточнением - нужен список не просто имен файлов,
а путей и имен, т.е. что-то вроде:

("D:\Папка1\Файл-1.dwg" "D:\Папка2\Файл-2.dwg" "D:\Папка2\Файл-44.dwg" "D:\Папка с пробелом 33\Файл-ABC.dwg")
__________________
Счастливо, Алексей!
===AAA=== на форуме  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как получить список открытых в текущем сеансе файлов и перейти в один из них?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как разбить один файл dwg с множеством блоков на множество файлов dwg с одним блоком? petia AutoCAD 8 26.06.2018 12:19
Получить список доступных принтеров с помощью словарей zenija2007 LISP 2 02.06.2016 15:50
LISP. Список файлов в каталоге и подкаталогах WhiteShark Готовые программы 4 29.03.2015 21:51
Ограничение на кол-во открываемых за один раз файлов в AutoCad Sharnir AutoCAD 5 09.03.2015 09:50
Как получить Список файлов в директории (поддиректорий) VBA sf Программирование 2 17.12.2010 12:06