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

ADN Club => AutoCAD .NET API => Тема начата: bender от 14-04-2021, 18:11:42

Название: Клонирование слоёв
Отправлено: bender от 14-04-2021, 18:11:42
Есть вот такой код, который клонирует все слои в активный документ из какого-то файла.

Код - C# [Выбрать]
  1. [CommandMethod("ImportLaers")]
  2.         static public void ImportLaers()
  3.         {
  4.             string sourceFile = "D:\\Temp\\Styles.dwg";
  5.  
  6.             Document doc = Application.DocumentManager.MdiActiveDocument;
  7.             Database targetDb = doc.Database;
  8.  
  9.             using (Database sourceDb = new Database())
  10.             {
  11.                 sourceDb.ReadDwgFile(sourceFile, FileOpenMode.OpenForReadAndAllShare, false, null);
  12.                 sourceDb.CloseInput(true);
  13.  
  14.                 ObjectId sourceTableId = sourceDb.LayerTableId;
  15.                 ObjectId targetTableId = targetDb.LayerTableId;
  16.  
  17.                 using (IdMapping idMap = new IdMapping())
  18.                 {
  19.                     ObjectIdCollection idCol;
  20.  
  21.                     using (Transaction tr = sourceDb.TransactionManager.StartTransaction())
  22.                     {
  23.                         using (LayerTable sourceTable = (LayerTable)tr.GetObject(sourceTableId, OpenMode.ForRead, false, true))
  24.                         {
  25.                             idCol = new ObjectIdCollection(sourceTable.Cast<ObjectId>().
  26.                                                            Where(id => id.IsValid && !id.IsErased && !id.IsEffectivelyErased).
  27.                                                            Select(id => id).ToArray());
  28.  
  29.                             //sourceDb.WblockCloneObjects(idCol, targetTableId, idMap, DuplicateRecordCloning.Ignore, false);
  30.                         }
  31.  
  32.                         tr.Commit();
  33.                     }
  34.  
  35.                     sourceDb.WblockCloneObjects(idCol, targetTableId, idMap, DuplicateRecordCloning.Ignore, false);
  36.                 }
  37.             }
  38.         }

При выполнении выдается ошибка ePermanentlyErased. Аналогичный код нормально работает для других символьных таблиц (текстовые и размерные стили, типы линии etc) В чём засада-то? Для слоёв нужно ещё какие-то "телодвижения"?

Да. AutoCAD 2018 и 2021

Название: Re: Клонирование слоёв
Отправлено: Вильдар от 14-04-2021, 18:20:49
Попробуй поменяй вызов WblockCloneObjects из targetDb.
Название: Re: Клонирование слоёв
Отправлено: bender от 14-04-2021, 18:25:46
Попробуй поменяй вызов WblockCloneObjects из targetDb.
Это уже всё попробовано. Аналогичный результат. + без транзакции, эмуляция транзакции и пр. пляски с бубном.
Название: Re: Клонирование слоёв
Отправлено: Александр Ривилис от 14-04-2021, 19:00:09
Попробуй поменяй вызов WblockCloneObjects из targetDb.
Это уже всё попробовано. Аналогичный результат. + без транзакции, эмуляция транзакции и пр. пляски с бубном.
Это на любом чертеже?
Название: Re: Клонирование слоёв
Отправлено: bender от 14-04-2021, 19:05:48
Это на любом чертеже?
В смысле?

Создал новый документ на основе acad.dwt, наделал в нём слоев, сохранил, закрыл. +ещё документ сделал и в него пытаюсь из первого слои скопировать. Как-то вот так.
Название: Re: Клонирование слоёв
Отправлено: Александр Ривилис от 14-04-2021, 19:54:19
bender,
Замени
Код - C# [Выбрать]
  1. using (Database sourceDb = new Database())
на
Код - C# [Выбрать]
  1. using (Database sourceDb = new Database(false, false))
И запомни на будущее, что если собираешься использовать ReadDwgFile, то создавать Database нужно с buildDefaultDrawing == false
Название: Re: Клонирование слоёв
Отправлено: bender от 14-04-2021, 19:58:19
Блин.... Нет слов. Действительно.

Спасибо.
Название: Re: Клонирование слоёв
Отправлено: bender от 14-04-2021, 20:02:29
И запомни на будущее, что если собираешься использовать ReadDwgFile, то создавать Database нужно с buildDefaultDrawing == false
Да так и делаю. Скопировал откуда-то и смотрю полдня как баран на новые ворота.  :)