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

ADN Club => AutoCAD .NET API => Тема начата: avc от 20-08-2020, 14:56:12

Название: Копировать объект из внешней ссылки
Отправлено: avc от 20-08-2020, 14:56:12
Мне нужно солиды из блоков во внешних ссылках скопировать в основной чертеж. Есть их 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.       }
А как же скопировать-то? :(
Название: Re: Копировать объект из внешней ссылки
Отправлено: Александр Ривилис от 20-08-2020, 15:04:25
А как же скопировать-то?
Открывать отдельно Database (через Database.ReadDwgFile) и оттуда копировать с помощью WblockCloneObjects
Название: Re: Копировать объект из внешней ссылки
Отправлено: avc от 20-08-2020, 15:07:52
Тоже не получается. там уже своя база данных и свои, другие ObjectId. Как там найти тот же объект? Да и открывать файл придется 100 раз...
Название: Re: Копировать объект из внешней ссылки
Отправлено: Александр Ривилис от 20-08-2020, 15:10:45
Как там найти тот же объект?
По Handle - он должен совпадать.
Да и открывать файл придется 100 раз...
Зачем? Один раз открываешь и копируешь всё что надо.
Название: Re: Копировать объект из внешней ссылки
Отправлено: avc от 20-08-2020, 15:12:58
Ну это полностью перестраивать всю логику работы программы - очень трудоемко.
Значит в самом деле запрещено вызывать WblockCloneObjects для внешних ссылок? Или все-таки имеет смысл потанцевать с бубном? Транзакции закрыть или еще что-то...
Название: Re: Копировать объект из внешней ссылки
Отправлено: Александр Ривилис от 20-08-2020, 15:17:18
Значит в самом деле запрещено вызывать WblockCloneObjects для внешних ссылок? Или все-таки имеет смысл потанцевать с бубном? Транзакции закрыть или еще что-то...
Попробуй так: перед вызовом WblockCloneObjects вызови source.Database.RestoreOriginalXrefSymbols();, а после source.Database.RestoreForwardingXrefSymbols();
Транзакции конечно нужно закрыть.
Название: Re: Копировать объект из внешней ссылки
Отправлено: avc от 20-08-2020, 15:26:35
Вот черт. Прекрасно работает WblockCloneObjects. Просто мой косяк - в другом методе с транзакцией на внешней БД вызвал return раньше чем externalTr.Commit(). По идее должен был бы сам вызваться Abort, но вот нет...
Извините за беспокойство.
Спасибо.