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

ADN Club => AutoCAD .NET API => Тема начата: sided от 19-03-2023, 19:25:10

Название: Проблема с копированием
Отправлено: sided от 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.  
Название: Re: Проблема с копированием
Отправлено: Александр Ривилис от 19-03-2023, 19:33:04
sided,
Ты уничтожил referenceDB до того, как скопировал из неё.
Название: Re: Проблема с копированием
Отправлено: sided от 19-03-2023, 19:39:59
Александр Ривилис,
Могу увидеть, как правильно? Или мне необходимо обернуть весь код в первый и второй using? Тогда у меня происходит ошибка eWrongDatabase, с которой я боролся несколько часов.
Название: Re: Проблема с копированием
Отправлено: Александр Ривилис от 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);
Код не тестировал.
Название: Re: Проблема с копированием
Отправлено: sided от 19-03-2023, 21:51:53
Александр Ривилис,
Спасибо, помогло. Только цвет у некоторых линий изменился на белый и не копируются некоторые объекты СПДС (таблица). Можно ли это как-то исправить? Возможно, дело в осутствии 3д визуализации у этих объектов?
Название: Re: Проблема с копированием
Отправлено: Александр Ривилис от 19-03-2023, 22:03:07
Только цвет у некоторых линий изменился на белый
Вероятнее всего у каких-то линий цвет по слою, а слой с таким именем имеется в текущем чертеже и у него белый цвет. По поводу объектов СПДС ничего не скажу.
Название: Re: Проблема с копированием
Отправлено: Привалов Дмитрий от 20-03-2023, 11:42:25
и не копируются некоторые объекты СПДС (таблица). Можно ли это как-то исправить?
Не копируются или не отображаются в модели?
Возможно слой отключен или требуется регенерация после вставки.

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

Название: Re: Проблема с копированием
Отправлено: sided от 24-03-2023, 02:29:56
Привалов Дмитрий,
Именно не копируются. Проблема с объектами, не имеющее в себе свойства 3Д-визуализации. RegenAll не помогает.