Вставить существующий чертеж в текущий

Автор Тема: Вставить существующий чертеж в текущий  (Прочитано 8054 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет. Стоит задача - вставить существующий (не открытый) чертеж в текущий. По сути нужно скопировать в текущий чертеж все объекты из чертежа-источника (из пространства модели) и вставить в указанную точку. КонтролЦэ-КонтролВэ, только программно))
Единственное, на мой взгляд, разумное решение - вставить как блок (джигу можно как-раз использовать) и потом расчленить его (и удалить описание блока из БД). Но что-то я совсем впал в ступор и ничего у меня не выходит. Мне кажется, что решаться это должно просто.
Пока без кодов. Прошу хоть словами навести на верную мысль

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Единственное, на мой взгляд, разумное решение - вставить как блок (джигу можно как-раз использовать)
Смотря сколько чертеж весит. Если это окажется топосъемка под 100 Мб, то пользователи могут не обрадоваться такому джигу :)
А так, мне кажется, через вставку как блок - вполне неплохое решение. Можно даже сделать опцию: расчленять блок после вставки или нет.

Отмечено как Решение Александр Пекшев aka Modis 02-05-2017, 12:45:59

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Итак, как я и говорил в топике - Мне кажется, что решаться это должно просто - так оно и есть - решение простое. Но без проблем не обходится.
В методах 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. Мне кажется, что я не совсем правильно понимаю как этот метод должен использоваться

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Вопрос с именем блока снимается, т.к. можно просто это имя ему задать "вручную" =)
Но хотелось бы получить разъяснения по работе последнего метода

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В общем, если в параметр destinationBlockName я передаю имя файла (без расширения), то получаю ошибку eKeyNotFound. Мне кажется, что я не совсем правильно понимаю как этот метод должен использоваться
Но хотелось бы получить разъяснения по работе последнего метода
Ты бы пример показал как пытаешься использовать его.
Вообще же не понимаю почему тебя не устроил метод Database.WblockCloneObjects
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Ты бы пример показал как пытаешься использовать его.
Примера уже нет =) Ну если очень надо, то могу состряпать отдельно проектик
Вообще же не понимаю почему тебя не устроил метод Database.WblockCloneObjects
Эммм... Целый метод с открытием БД, итерациями, транзакциями, созданием блока против одной строки кода? )))

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Эммм... Целый метод с открытием БД, итерациями, транзакциями, созданием блока против одной строки кода? )))
Ты спросил как скопировать объекты из одного чертежа в другой. Я тебе указал метод, который для этого используется. Зачем создавать блок (по первоначальной постановке задачи) я не понял.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Зачем создавать блок (по первоначальной постановке задачи) я не понял
Прошу прощения, что не уточнил. Подумал, что это не важная информация - в моем конкретном примере используется два варианта (на выбор пользователя) вставки чертежа - простая вставка и вставка в видео блока. Поэтому вариант с использованием метода Insert() для моего случая подходит лучше всего

Оффлайн Петренко Дмитрий

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
  • cad-pro.ru
    • Полезные приемы работы в AutoCAD
Метод Database.WblockCloneObjects довольно подробно разбирался на форуме и вполне нормально работает за исключением случая когда попадаются объекты созданные в AutoCAD Mechanical.
Сам еще не пробовал, но я так понимаю метод Insert также не перенесет в чистый AutoCAD блок, в котором есть объекты AutoCAD Mechanical.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Сам еще не пробовал, но я так понимаю метод Insert также не перенесет в чистый AutoCAD блок, в котором есть объекты AutoCAD Mechanical.
Это не сложно проверить даже без программирования.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Петренко Дмитрий

  • ADN OPEN
  • Сообщений: 11
  • Карма: 0
  • cad-pro.ru
    • Полезные приемы работы в AutoCAD
Проверил (с помощью программирования), метод Insert действительно удобней, в отличие от WblockCloneObjects он переносит Proxy объекты и не нужны дополнительные манипуляции для переноса размеров.