Как корректно запустить еще один 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. Устанавливаем видимость:
    1
    (vla-put-Visible svr :vlax-false)
  2. Устанавливаем текущий профиль (ну, если сильно хочется, конечно. Так-то создание нового объекта AutoCAD, насколько я понимаю, выполняется почти по тем же законам, что и запуск приложения "acad.exe"):
    1
    (vla-put-ActiveProfile (vla-get-Profiles (vla-get-Preferences svr)) "AutoCAD")
  3. Добавляем новый документ:
    1
    (setq doc (vla-add (vla-get-Documents svr)))

    Конечно, по идее тут надо проверять доступность шаблона и при необходимости указывать именно его, ну да ладно.

  4. Сохраняем документ
    1
    (vla-saveas doc "c:\\temp.dwg" acNative)
  5. Закрываем документ
    1
    (vla-close doc)

    По идее, можно через vla-close сразу выполнять и сохранение, но как-то мне пока не очень это нравится. Предпочитаю написать дополнительную строку, но зато сохранить так, как мне надо :)

  6. И так далее

Хорошо, допустим, мы создали файл, заполнили его, сохранили. Остались сущие мелочи: освободиться от svr и всех его порождений.

Казалось бы, очевидное решение

1
(vlax-release-object svr)

прокатит "не до конца": указатель на процесс acad.exe будет обнулен, но вот сам процесс acad.exe останется "висеть" в памяти. Разве такое годится?

Поэтому сделаем по-другому:

  1. Сначала "выйдем" из фонового AutoCAD:

    1
    (vla-quit svr)

    Добавлю - перед выходом необходимо поудалять все документы. Возможно, при закрытии AutoCAD будет выдано сообщение типа "А не сохранить ли документ Чертеж1?". Оно надо?

  2. И теперь уже будем "релизить" объект и обнулять для него указатели:
    1
    2
    (vlax-release-object svr)
    (setq svr nil)

Пока все это работает на 2009x32, 2009x64, 2012x32, 2012x64. Интересно, что будет в 2013? ;)



Комментарии

Есть 11 коммент. к “Как корректно запустить еще один AutoCAD”
  1. alexeispirit пишет:

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

    1
    2
    (vla-open svr "D:/acadiso.dwt")
    (vla-saveas doc "c:\\temp.dwg")
  2. alexeispirit пишет:

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

    1
    2
    (vla-open svr "D:/acadiso.dwt")
    (vla-saveas doc "c:\\temp.dwg")
  3. alexeispirit пишет:

    Видимо браузер глючит, код:

    (vla-open svr "D:/acadiso.dwt")
    (vla-saveas doc "c:\\temp.dwg")

  4. TararykovDG пишет:

    Алексей, дорбый день! А почему нельзя сделать так. Вместо создания нового экземпляра 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"))))))

  5. Кулик Алексей aka kpblc пишет:

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

  6. TararykovDG пишет:

    Понятно, спасибо за пояснение

  7. Кулик Алексей aka kpblc пишет:

    > alexeispirit:
    Прошу прощения, сработала спам-защита...
    Так вот:
    > Можно же просто открыть шаблон и точно также пересохранить его без открытия доп. приложения .
    А как это сделать, если по vla-open выполняется активация открытого документа? И, соответственно, выполнение первоначального лиспа просто останавливается? Заставлять пользователей переходить в первый документ? Не, это несерьезно...
    Можно, конечно, было бы подумать насчет того, чтобы использовать vla-wblock, но он в качестве входящего параметра требует сформированный набор объектов. Так что тоже "не катит" :(

  8. alexeispirit пишет:

    > 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")

  9. TararykovDG пишет:

    >alexeispirit
    Действительно, если применить vla-open к objectdbx объекту с указанием не существующего dwg-файла, а шаблона dwt, то все срабатывает как надо, во всяком случае в ACAD2008, спасибо alexeispirit за наводку.

  10. Кулик Алексей aka kpblc пишет:

    alexeispirit, спасибо :) Как-то у меня фантазии не хватило для ObjectDBX выполнить vla-open в таком ключе... Обязательно попробую :)

  11. alexeispirit пишет:

    Кстати, для пустого документа, открывать шаблон не требуется. Как только объект IAxDbDocument зарегистрирован, его уже можно сохранить через vla-saveas. Правда, пока не нашел из какого шаблона в таком случае создается новый документ. Так что с этим возможны неожиданности и лучше открывать шаблон явно через vla-open.

Поделитесь своим мнением


Я не робот.