Копировать объект из внешней ссылки

Автор Тема: Копировать объект из внешней ссылки  (Прочитано 6878 раз)

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

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Мне нужно солиды из блоков во внешних ссылках скопировать в основной чертеж. Есть их ObjectId, можно получить сами солиды. А вот вставить копии в основной чертеж не получается. Если делать Clone(), то его нельзя сохранять в основном чертеже, так как там на каждой грани ссылки на материалы из другой database.
Пытаюсь сделать WblockCloneObjects. Тоже не работает. Выдает eWasErased
Код - C# [Выбрать]
  1. Solid3d source = tr.GetObject(id, OpenMode.ForRead) as Solid3d; // id получен заранее из BTR внешней ссылки. Как ни странно транзакция не ругается на объект из чужой database
  2.       if (source is null || source.IsNull || source.IsErased) return;
  3.       Solid3d laid;
  4.       if (source.Database == db) // db- это database основного чертежа
  5.         laid = source.Clone() as Solid3d;
  6.       else // солид получен из блока-внешней ссылки - простой клон не уберет связи с внешней БД
  7.       {
  8.         IdMapping map = new IdMapping();
  9.         source.Database.WblockCloneObjects(
  10.           new ObjectIdCollection { id },
  11.           SymbolUtilityServices.GetBlockModelSpaceId(db), // в модель основной database
  12.           map, DuplicateRecordCloning.Ignore, false); // получаю eWasErased
  13.         laid = tr.GetObject(map[source.Id].Value, OpenMode.ForWrite, false, true) as Solid3d;
  14.       }
А как же скопировать-то? :(

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

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

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Тоже не получается. там уже своя база данных и свои, другие ObjectId. Как там найти тот же объект? Да и открывать файл придется 100 раз...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Как там найти тот же объект?
По Handle - он должен совпадать.
Да и открывать файл придется 100 раз...
Зачем? Один раз открываешь и копируешь всё что надо.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Ну это полностью перестраивать всю логику работы программы - очень трудоемко.
Значит в самом деле запрещено вызывать WblockCloneObjects для внешних ссылок? Или все-таки имеет смысл потанцевать с бубном? Транзакции закрыть или еще что-то...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Значит в самом деле запрещено вызывать WblockCloneObjects для внешних ссылок? Или все-таки имеет смысл потанцевать с бубном? Транзакции закрыть или еще что-то...
Попробуй так: перед вызовом WblockCloneObjects вызови source.Database.RestoreOriginalXrefSymbols();, а после source.Database.RestoreForwardingXrefSymbols();
Транзакции конечно нужно закрыть.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Вот черт. Прекрасно работает WblockCloneObjects. Просто мой косяк - в другом методе с транзакцией на внешней БД вызвал return раньше чем externalTr.Commit(). По идее должен был бы сам вызваться Abort, но вот нет...
Извините за беспокойство.
Спасибо.