Проблема с копированием

Автор Тема: Проблема с копированием  (Прочитано 7869 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Проблема с копированием
« : 19-03-2023, 19:25:10 »
Приветствую формучан. Проблема с копированием всех элементов из закрытого dwg-файла в открытый в autocad по точке, заданной пользователем. Пытался собрать из открытых источников, но получаю ошибку Fatal Error или ePermanentlyErased. Прошу помочь найти хороший исходник/указать, что не так сделал в коде.
Код - C# [Выбрать]
  1. [CommandMethod("ImportDrawing", CommandFlags.Session)]
  2.         public static void ImportDrawing()
  3.         {
  4.             ObjectIdCollection copiedIds = new ObjectIdCollection();
  5.             using (var referenceDB = new Database(false, true))
  6.             {
  7.                 string destFileName = @"C:\test\test1.dwg";
  8.                
  9.                 referenceDB.ReadDwgFile(destFileName, FileShare.Read, false, "");
  10.                 referenceDB.CloseInput(true);
  11.                
  12.  
  13.                 using (Transaction tr = referenceDB.TransactionManager.StartTransaction())
  14.                 {
  15.                    
  16.                     BlockTable bt = tr.GetObject(referenceDB.BlockTableId, OpenMode.ForRead) as BlockTable;
  17.                     BlockTableRecord ms = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
  18.                    
  19.                     foreach (ObjectId id in ms)
  20.                     {
  21.                         copiedIds.Add(id);
  22.                     }
  23.                    
  24.                     tr.Commit();
  25.                 }
  26.             }
  27.            
  28.             Document currentdoc = Application.DocumentManager.MdiActiveDocument;
  29.             Database currentDB = currentdoc.Database;
  30.             Editor editor = currentdoc.Editor;
  31.  
  32.             PromptPointOptions ppo = new PromptPointOptions("\nВыберите точку вставки: ");
  33.             PromptPointResult ppr = editor.GetPoint(ppo);
  34.             if (ppr.Status != PromptStatus.OK)
  35.                 return;
  36.            
  37.             using (DocumentLock acLckDoc = currentdoc.LockDocument())
  38.             {
  39.                 using (Transaction tr2 = currentDB.TransactionManager.StartTransaction())
  40.                 {
  41.                     BlockTable bt2 = tr2.GetObject(currentDB.BlockTableId, OpenMode.ForRead) as BlockTable;
  42.                     BlockTableRecord ms2 = tr2.GetObject(bt2[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  43.                    
  44.                     var idMapping = new IdMapping();
  45.                     currentDB.WblockCloneObjects(copiedIds, currentDB.BlockTableId, idMapping,
  46.                         DuplicateRecordCloning.Replace, false);
  47.                    
  48.                     tr2.Commit();
  49.                 }
  50.             }
  51.         }
  52.  

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Проблема с копированием
« Ответ #1 : 19-03-2023, 19:33:04 »
sided,
Ты уничтожил referenceDB до того, как скопировал из неё.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Проблема с копированием
« Ответ #2 : 19-03-2023, 19:39:59 »
Александр Ривилис,
Могу увидеть, как правильно? Или мне необходимо обернуть весь код в первый и второй using? Тогда у меня происходит ошибка eWrongDatabase, с которой я боролся несколько часов.

Отмечено как Решение sided 19-03-2023, 21:50:56

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Проблема с копированием
« Ответ #3 : 19-03-2023, 19:49:41 »
Или мне необходимо обернуть весь код в первый и второй using?
1. Обернуть только в первый using.
2. Строка не нужна:
Код - C# [Выбрать]
  1.                     BlockTableRecord ms2 = tr2.GetObject(bt2[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
3. Копирование должно выглядеть как-то так:
Код - C# [Выбрать]
  1.                     currentDB.WblockCloneObjects(copiedIds, bt2[BlockTableRecord.ModelSpace], idMapping,
  2.                         DuplicateRecordCloning.Replace, false);
Код не тестировал.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Проблема с копированием
« Ответ #4 : 19-03-2023, 21:51:53 »
Александр Ривилис,
Спасибо, помогло. Только цвет у некоторых линий изменился на белый и не копируются некоторые объекты СПДС (таблица). Можно ли это как-то исправить? Возможно, дело в осутствии 3д визуализации у этих объектов?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Проблема с копированием
« Ответ #5 : 19-03-2023, 22:03:07 »
Только цвет у некоторых линий изменился на белый
Вероятнее всего у каких-то линий цвет по слою, а слой с таким именем имеется в текущем чертеже и у него белый цвет. По поводу объектов СПДС ничего не скажу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Re: Проблема с копированием
« Ответ #6 : 20-03-2023, 11:42:25 »
и не копируются некоторые объекты СПДС (таблица). Можно ли это как-то исправить?
Не копируются или не отображаются в модели?
Возможно слой отключен или требуется регенерация после вставки.

Еще нужно учитывать, что надстройки автокада много чего хранят в Named Object Dictionary. При ручном копировании примитива из чертежа в чертеж, надстройки перехватывают события и копируют стили, данные, настройки отображения в NOD, без которых объект может не отображаться.


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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 0
Re: Проблема с копированием
« Ответ #7 : 24-03-2023, 02:29:56 »
Привалов Дмитрий,
Именно не копируются. Проблема с объектами, не имеющее в себе свойства 3Д-визуализации. RegenAll не помогает.