Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Александр Пекшев aka Modis от 27-04-2017, 21:22:12

Название: Вставить существующий чертеж в текущий
Отправлено: Александр Пекшев aka Modis от 27-04-2017, 21:22:12
Всем привет. Стоит задача - вставить существующий (не открытый) чертеж в текущий. По сути нужно скопировать в текущий чертеж все объекты из чертежа-источника (из пространства модели) и вставить в указанную точку. КонтролЦэ-КонтролВэ, только программно))
Единственное, на мой взгляд, разумное решение - вставить как блок (джигу можно как-раз использовать) и потом расчленить его (и удалить описание блока из БД). Но что-то я совсем впал в ступор и ничего у меня не выходит. Мне кажется, что решаться это должно просто.
Пока без кодов. Прошу хоть словами навести на верную мысль
Название: Re: Вставить существующий чертеж в текущий
Отправлено: Дмитрий Загорулькин от 28-04-2017, 18:03:00
Единственное, на мой взгляд, разумное решение - вставить как блок (джигу можно как-раз использовать)
Смотря сколько чертеж весит. Если это окажется топосъемка под 100 Мб, то пользователи могут не обрадоваться такому джигу :)
А так, мне кажется, через вставку как блок - вполне неплохое решение. Можно даже сделать опцию: расчленять блок после вставки или нет.
Название: Re: Вставить существующий чертеж в текущий
Отправлено: Александр Пекшев aka Modis от 29-04-2017, 17:04:15
Итак, как я и говорил в топике - Мне кажется, что решаться это должно просто - так оно и есть - решение простое. Но без проблем не обходится.
В методах Database уже есть метод для вставки чертежа как блока (http://help.autodesk.com/view/OARX/2018/ENU/?guid=OREFNET-__OVERLOADED_Insert_Autodesk_AutoCAD_DatabaseServices_Database). Из трех вариантов я рассматриваю два. Первый из которых работает нормально:
Код - C# [Выбрать]
  1. public ObjectId Insert(
  2.     string blockName,
  3.     Database dataBase,
  4.     [MarshalAs(UnmanagedType.U1)] bool preserveSourceDatabase
  5. );
Указанный блок вставляется в текущий файл, но у него нет имени. В рамках моего проекта этот вариант не подходит, поэтому я решил использовать второй вариант:
Код - C# [Выбрать]
  1. public ObjectId Insert(
  2.     string sourceBlockName,
  3.     string destinationBlockName,
  4.     Database dataBase,
  5.     [MarshalAs(UnmanagedType.U1)] bool preserveSourceDatabase
  6. );
Читаю справку:
Цитировать
This function creates a new block table record in the database executing this function. This new block table record is given the name pointed to by destinationBlockName. Then, each entity in the block table record whose name is sourceBlockName and which resides in the database pointed to by dataBase is copied into the new block table record.
И понимаю, что со специфическим английским у меня туговато  :D
В общем, если в параметр destinationBlockName я передаю имя файла (без расширения), то получаю ошибку eKeyNotFound. Мне кажется, что я не совсем правильно понимаю как этот метод должен использоваться
Название: Re: Вставить существующий чертеж в текущий
Отправлено: Александр Пекшев aka Modis от 29-04-2017, 17:11:02
Вопрос с именем блока снимается, т.к. можно просто это имя ему задать "вручную" =)
Но хотелось бы получить разъяснения по работе последнего метода
Название: Re: Вставить существующий чертеж в текущий
Отправлено: Александр Ривилис от 30-04-2017, 12:36:36
В общем, если в параметр destinationBlockName я передаю имя файла (без расширения), то получаю ошибку eKeyNotFound. Мне кажется, что я не совсем правильно понимаю как этот метод должен использоваться
Но хотелось бы получить разъяснения по работе последнего метода
Ты бы пример показал как пытаешься использовать его.
Вообще же не понимаю почему тебя не устроил метод Database.WblockCloneObjects
Название: Re: Вставить существующий чертеж в текущий
Отправлено: Александр Пекшев aka Modis от 02-05-2017, 08:46:00
Ты бы пример показал как пытаешься использовать его.
Примера уже нет =) Ну если очень надо, то могу состряпать отдельно проектик
Вообще же не понимаю почему тебя не устроил метод Database.WblockCloneObjects
Эммм... Целый метод с открытием БД, итерациями, транзакциями, созданием блока против одной строки кода? )))
Название: Re: Вставить существующий чертеж в текущий
Отправлено: Александр Ривилис от 02-05-2017, 12:31:54
Эммм... Целый метод с открытием БД, итерациями, транзакциями, созданием блока против одной строки кода? )))
Ты спросил как скопировать объекты из одного чертежа в другой. Я тебе указал метод, который для этого используется. Зачем создавать блок (по первоначальной постановке задачи) я не понял.
Название: Re: Вставить существующий чертеж в текущий
Отправлено: Александр Пекшев aka Modis от 02-05-2017, 12:45:45
Зачем создавать блок (по первоначальной постановке задачи) я не понял
Прошу прощения, что не уточнил. Подумал, что это не важная информация - в моем конкретном примере используется два варианта (на выбор пользователя) вставки чертежа - простая вставка и вставка в видео блока. Поэтому вариант с использованием метода Insert() для моего случая подходит лучше всего
Название: Re: Вставить существующий чертеж в текущий
Отправлено: Петренко Дмитрий от 17-06-2017, 13:03:59
Метод Database.WblockCloneObjects довольно подробно разбирался на форуме и вполне нормально работает за исключением случая когда попадаются объекты созданные в AutoCAD Mechanical.
Сам еще не пробовал, но я так понимаю метод Insert также не перенесет в чистый AutoCAD блок, в котором есть объекты AutoCAD Mechanical.
Название: Re: Вставить существующий чертеж в текущий
Отправлено: Александр Ривилис от 17-06-2017, 13:06:21
Сам еще не пробовал, но я так понимаю метод Insert также не перенесет в чистый AutoCAD блок, в котором есть объекты AutoCAD Mechanical.
Это не сложно проверить даже без программирования.
Название: Re: Вставить существующий чертеж в текущий
Отправлено: Петренко Дмитрий от 18-06-2017, 08:36:09
Проверил (с помощью программирования), метод Insert действительно удобней, в отличие от WblockCloneObjects он переносит Proxy объекты и не нужны дополнительные манипуляции для переноса размеров.