Клонирование слоёв

Автор Тема: Клонирование слоёв  (Прочитано 8833 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • **
  • Сообщений: 62
  • Карма: 4
Клонирование слоёв
« : 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


Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Клонирование слоёв
« Ответ #1 : 14-04-2021, 18:20:49 »
Попробуй поменяй вызов WblockCloneObjects из targetDb.

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

  • ADN Club
  • **
  • Сообщений: 62
  • Карма: 4
Re: Клонирование слоёв
« Ответ #2 : 14-04-2021, 18:25:46 »
Попробуй поменяй вызов WblockCloneObjects из targetDb.
Это уже всё попробовано. Аналогичный результат. + без транзакции, эмуляция транзакции и пр. пляски с бубном.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование слоёв
« Ответ #3 : 14-04-2021, 19:00:09 »
Попробуй поменяй вызов WblockCloneObjects из targetDb.
Это уже всё попробовано. Аналогичный результат. + без транзакции, эмуляция транзакции и пр. пляски с бубном.
Это на любом чертеже?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 62
  • Карма: 4
Re: Клонирование слоёв
« Ответ #4 : 14-04-2021, 19:05:48 »
Это на любом чертеже?
В смысле?

Создал новый документ на основе acad.dwt, наделал в нём слоев, сохранил, закрыл. +ещё документ сделал и в него пытаюсь из первого слои скопировать. Как-то вот так.

Отмечено как Решение bender 14-04-2021, 19:59:54

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Клонирование слоёв
« Ответ #5 : 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
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 62
  • Карма: 4
Re: Клонирование слоёв
« Ответ #6 : 14-04-2021, 19:58:19 »
Блин.... Нет слов. Действительно.

Спасибо.

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

  • ADN Club
  • **
  • Сообщений: 62
  • Карма: 4
Re: Клонирование слоёв
« Ответ #7 : 14-04-2021, 20:02:29 »
И запомни на будущее, что если собираешься использовать ReadDwgFile, то создавать Database нужно с buildDefaultDrawing == false
Да так и делаю. Скопировал откуда-то и смотрю полдня как баран на новые ворота.  :)