Как корректно запустить еще один AutoCAD
Понадобилось тут мне решить одну веселую задачку: создать новый файл, вставить в него внешними ссылками и блоками другие файлы, добавить еще кой-какой графики, сохранить файл и... И, в общем-то все.
Тут же возник вопрос: а как начать-то? Как создать новый файл, не активируя его? Частично этот вопрос я поднимал в статье Работа с неактивным документом, но там был вопрос именно с чтением уже существующего файла.
Создать файл через ObjectDBX лично мне не удалось. Как я пытался обмануть ObjectDBX, история коротенькая и грустная:
Сначала получаем указатель на объект ObjectDBX:
1 | (setq svr (vla-getinterfaceobject (vlax-get-acad-object) (strcat "ObjectDBX.AxDbDocument." (itoa (atoi (getvar "acadver")))))) |
И потом смотрим его свойства и методы. Для AutoCAD 2009 x64 получаем нечто наподобие
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | _1_$ (vlax-dump-Object svr t) ; IAxDbDocument: IAxDbDocument Interface ; Property values: ; Application (RO) = Ошибка ; Blocks (RO) = # ; Database (RO) = # ; Dictionaries (RO) = # ; DimStyles (RO) = # ; ElevationModelSpace = 0.0 ; ElevationPaperSpace = 0.0 ; FileDependencies (RO) = # ; Groups (RO) = # ; Layers (RO) = # ; Layouts (RO) = # ; Limits = (0.0 0.0 12.0 9.0) ; Linetypes (RO) = # ; Materials (RO) = # ; ModelSpace (RO) = # ; Name = "" ; PaperSpace (RO) = # ; PlotConfigurations (RO) = # ; Preferences (RO) = # ; RegisteredApplications (RO) = # ; SectionManager (RO) = Ошибка ; SummaryInfo (RO) = # ; TextStyles (RO) = # ; UserCoordinateSystems (RO) = # ; Viewports (RO) = # ; Views (RO) = # ; Methods supported: ; CopyObjects (3) ; DxfIn (2) ; DxfOut (3) ; HandleToObject (1) ; ObjectIdToObject (1) ; ObjectIdToObject32 (1) ; Open (2) ; Save () ; SaveAs (2) |
Скажу честно - никаких вариантов типа "добавить документ", "создать документ" и т.п. не увидел. Документ можно открыть, но нам-то надо создавать абсолютно новый!
Попробуем сделать по-другому: создадим новый экземпляр AutoCAD:
1 | (setq svr (vlax-create-object (strcat "AutoCAD.Application." (itoa (atoi (getvar "acadver")))))) |
Конечно, создание нового экземпляра AutoCAD сопряжено с дополнительными накладками - и время уходит значительно больше, и памяти... Но зато мы можем играться с этим "фоновым" AutoCAD'ом как хотим:
- Устанавливаем видимость:
1(vla-put-Visible svr :vlax-false)
- Устанавливаем текущий профиль (ну, если сильно хочется, конечно. Так-то создание нового объекта AutoCAD, насколько я понимаю, выполняется почти по тем же законам, что и запуск приложения "acad.exe"):
1(vla-put-ActiveProfile (vla-get-Profiles (vla-get-Preferences svr)) "AutoCAD")
- Добавляем новый документ:
1(setq doc (vla-add (vla-get-Documents svr)))
Конечно, по идее тут надо проверять доступность шаблона и при необходимости указывать именно его, ну да ладно.
- Сохраняем документ
1(vla-saveas doc "c:\\temp.dwg" acNative)
- Закрываем документ
1(vla-close doc)
По идее, можно через vla-close сразу выполнять и сохранение, но как-то мне пока не очень это нравится. Предпочитаю написать дополнительную строку, но зато сохранить так, как мне надо
- И так далее
Хорошо, допустим, мы создали файл, заполнили его, сохранили. Остались сущие мелочи: освободиться от svr и всех его порождений.
Казалось бы, очевидное решение
1 | (vlax-release-object svr) |
прокатит "не до конца": указатель на процесс acad.exe будет обнулен, но вот сам процесс acad.exe останется "висеть" в памяти. Разве такое годится?
Поэтому сделаем по-другому:
- Сначала "выйдем" из фонового AutoCAD:
1(vla-quit svr)
Добавлю - перед выходом необходимо поудалять все документы. Возможно, при закрытии AutoCAD будет выдано сообщение типа "А не сохранить ли документ Чертеж1?". Оно надо?
- И теперь уже будем "релизить" объект и обнулять для него указатели:
1
2(vlax-release-object svr)
(setq svr nil)
Пока все это работает на 2009x32, 2009x64, 2012x32, 2012x64. Интересно, что будет в 2013?
Может я чего недопонимаю, но ведь создание нового документа, это по сути открытие шаблона.
Можно же просто открыть шаблон и точно также пересохранить его без открытия доп. приложения .
2
(vla-saveas doc "c:\\temp.dwg")
Может я недопонял задачу, но ведь создание нового документа - это по сути открытие шаблона.
Можно же просто открыть шаблон и точно также пересохранить его без открытия доп. приложения .
2
(vla-saveas doc "c:\\temp.dwg")
Видимо браузер глючит, код:
(vla-open svr "D:/acadiso.dwt")
(vla-saveas doc "c:\\temp.dwg")
Алексей, дорбый день! А почему нельзя сделать так. Вместо создания нового экземпляра AutoCAD с, как Ты сказал, сопутсвующими накладками, для текущей сесии сразу добавить новый документ
(setq doc (vla-add (vla-get-documents (vlax-get-acad-object)))) ну и потом
(vla-saveas doc "c:\\temp.dwg" acNative)
(vla-close doc)
и так далее...
P. S. У меня ACAD2008x32 вроде как работает. Сначала появляется новый документ, все там регенирируется, загружаются утилиты и т. д., но потом активным становится документ из которого была запущена команда, ну и все это конечно гороздо быстрее чем (setq svr (vlax-create-object (strcat "AutoCAD.Application." (itoa (atoi (getvar "acadver"))))))
Может оказаться, что документ активировался и остался активным. Я такое ловил, по-моему, на 2005 или 2006 версиях. Возможно, что сейчас уже программно созданный документ гарантированно переходит "на второй план", я не проверял очень уж подробно.
Конечно, это тоже отличный вариант, но его надо в конкретных условиях эксплуатации проверять, я думаю.
Понятно, спасибо за пояснение
> alexeispirit:
Прошу прощения, сработала спам-защита...
Так вот:
> Можно же просто открыть шаблон и точно также пересохранить его без открытия доп. приложения .
А как это сделать, если по vla-open выполняется активация открытого документа? И, соответственно, выполнение первоначального лиспа просто останавливается? Заставлять пользователей переходить в первый документ? Не, это несерьезно...
Можно, конечно, было бы подумать насчет того, чтобы использовать vla-wblock, но он в качестве входящего параметра требует сформированный набор объектов. Так что тоже "не катит"
> kpblc
Имеется в виду не vla-open в activedocument, а в зарегистрированном objectdbx объекте. в таком случае останова не произойдет. Что-то вроде этого:
(setq svr (vla-getinterfaceobject (vlax-get-acad-object) (strcat "ObjectDBX.AxDbDocument." (itoa (atoi (getvar "acadver"))))))
(vla-open svr "D:/test.dwt")
(alert "I'm still here")
>alexeispirit
Действительно, если применить vla-open к objectdbx объекту с указанием не существующего dwg-файла, а шаблона dwt, то все срабатывает как надо, во всяком случае в ACAD2008, спасибо alexeispirit за наводку.
alexeispirit, спасибо Как-то у меня фантазии не хватило для ObjectDBX выполнить vla-open в таком ключе... Обязательно попробую
Кстати, для пустого документа, открывать шаблон не требуется. Как только объект IAxDbDocument зарегистрирован, его уже можно сохранить через vla-saveas. Правда, пока не нашел из какого шаблона в таком случае создается новый документ. Так что с этим возможны неожиданности и лучше открывать шаблон явно через vla-open.