Копирование COGOPOINT из внешних ссылок.

Автор Тема: Копирование COGOPOINT из внешних ссылок.  (Прочитано 12773 раз)

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

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

  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
Поменял код следующим образом
Код - C# [Выбрать]
  1.  public void Action()
  2.                 {
  3.                         var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.                         var db = doc.Database;
  5.  
  6.                         using (var trans = db.TransactionManager.StartTransaction())
  7.                         {
  8.                                 var bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
  9.                                 var btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);
  10.                                
  11.                                 foreach (var objId in btr)
  12.                                 {
  13.                                         using (var ent = (Entity)trans.GetObject(objId, OpenMode.ForRead))
  14.                                         {
  15.                                                 try
  16.                                                 {
  17.                                                         var bref = ent as BlockReference;
  18.                                                         if (bref != null)
  19.                                                         {
  20.                                                                 //Является ли блок внешней ссылкой?
  21.                                                                 var isExternal = btr.Cast<ObjectId>().All(a => a != bref.BlockTableRecord);
  22.  
  23.                                                                 if (!isExternal)
  24.                                                                         return;
  25.  
  26.                                                                 // Получаем BlockTableRecord внешней ссылки
  27.                                                                 var btrBref = (BlockTableRecord)trans.GetObject(bref.BlockTableRecord, OpenMode.ForRead);
  28.                                                                 var xDB = btrBref.GetXrefDatabase(false);
  29.  
  30.                                                                 // открываем транзакцию внешней был для получения объектов
  31.                                                                 using (var transRef = xDB.TransactionManager.StartTransaction())
  32.                                                                 {
  33.                                                                         // Внешняя база блока
  34.                                                                         var btBref = transRef.GetObject(xDB.BlockTableId, OpenMode.ForRead) as BlockTable;
  35.                                                                         var s = transRef.GetObject( btBref[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
  36.  
  37.                                                                         // Создаем и заполняем коллекцию id'шников
  38.                                                                         var idColl = new ObjectIdCollection();
  39.                                                                         foreach (var objid in s)
  40.                                                                         {
  41.                                                                                 idColl.Add(objid);
  42.                                                                         }
  43.  
  44.                                                                         var iMap = new IdMapping();
  45.                                                                         xDB.WblockCloneObjects(idColl, db.CurrentSpaceId, iMap, DuplicateRecordCloning.Ignore, false);
  46.                                                                 }
  47.  
  48.                                                                 bref.Visible = false;
  49.                                                         }
  50.                                                 }
  51.                                                 catch (Exception e)
  52.                                                 {
  53.                                                 }
  54.                                         }
  55.                                 }
  56.  
  57.                                 trans.Commit();
  58.                         }
  59.                 }
  60.  

В итоге во время попытки выполнить WblockCloneObjects "выкидывается" экспепшн.




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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Это связано с тем, что базы из Xref. Тут есть два варианта решения:
1. После
Код - C# [Выбрать]
  1. var xDB = btrBref.GetXrefDatabase(false);
вставляешь
Код - C# [Выбрать]
  1. xDB.RestoreOriginalXrefSymbols();
и перед
Код - C# [Выбрать]
  1. bref.Visible = false;
вставляешь
Код - C# [Выбрать]
  1. xDB.RestoreForwardingXrefSymbols();
Должно работать, но возможно медленно.
2.  Для btrBref получаешь её PathName
Создаёшь новую Database:
Код - C# [Выбрать]
  1. Database xDb = new Database(false,true);
и в неё читаешь (Database.ReadDwgFile) файл по этому пути.
Дальше работаешь с ней так, как ты работал с xDb в своём коде. Не забудь только выполнить для неё xDb.Dispose();
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
Спасибо, пробую.

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

  • ADN OPEN
  • Сообщений: 19
  • Карма: 0
Для первого случая ситуация следующая.
Добавил в код Ваши рекомендации.
Код - C# [Выбрать]
  1. public void Action()
  2.                 {
  3.                         var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.                         var db = doc.Database;
  5.  
  6.                         using (var trans = db.TransactionManager.StartTransaction())
  7.                         {
  8.                                 var bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
  9.                                 var btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);
  10.                                
  11.                                 foreach (var objId in btr)
  12.                                 {
  13.                                         using (var ent = (Entity)trans.GetObject(objId, OpenMode.ForRead))
  14.                                         {
  15.                                                 try
  16.                                                 {
  17.                                                         var bref = ent as BlockReference;
  18.                                                         if (bref != null)
  19.                                                         {
  20.                                                                
  21.                                                                 // Получаем BlockTableRecord внешней ссылки
  22.                                                                 var btrBref = (BlockTableRecord)trans.GetObject(bref.BlockTableRecord, OpenMode.ForRead);
  23.  
  24.                                                                 if (!btrBref.IsFromExternalReference)
  25.                                                                 {
  26.                                                                         return;
  27.                                                                 }
  28.  
  29.                                                                 var xDB = btrBref.GetXrefDatabase(false);
  30.                                                                 xDB.RestoreOriginalXrefSymbols();
  31.  
  32.                                                                 // открываем транзакцию внешней базы для получения объектов
  33.                                                                 using (var transRef = xDB.TransactionManager.StartTransaction())
  34.                                                                 {
  35.                                                                         // Внешняя база блока
  36.                                                                         var xBT = transRef.GetObject(xDB.BlockTableId, OpenMode.ForRead) as BlockTable;
  37.                                                                         var xBTR = transRef.GetObject(xBT[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
  38.  
  39.                                                                         // Создаем и заполняем коллекцию id'шников
  40.                                                                         var idColl = new ObjectIdCollection();
  41.                                                                         foreach (var objid in xBTR)
  42.                                                                         {
  43.                                                                                 idColl.Add(objid);
  44.                                                                         }
  45.  
  46.                                                                         var iMap = new IdMapping();
  47.                                                                         xDB.WblockCloneObjects(idColl, db.CurrentSpaceId, iMap, DuplicateRecordCloning.Ignore, false);
  48.                                                                 }
  49.  
  50.                                                                 xDB.RestoreForwardingXrefSymbols();
  51.                                                                 bref.Visible = false;
  52.                                                         }
  53.                                                 }
  54.                                                 catch (Exception e)
  55.                                                 {
  56.                                                 }
  57.                                         }
  58.                                 }
  59.  
  60.                                 trans.Commit();
  61.                         }
  62.                 }
  63.  

При запуске код работает без ошибок. Но объекты вообще не копируются.



Во втором случае код выглядит следующим образом.

Код - C# [Выбрать]
  1. public void Action()
  2.                 {
  3.                         var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
  4.                         var db = doc.Database;
  5.  
  6.                         using (var trans = db.TransactionManager.StartTransaction())
  7.                         {
  8.                                 var bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);
  9.                                 var btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  10.                                
  11.                                 foreach (var objId in btr)
  12.                                 {
  13.                                         using (var ent = (Entity)trans.GetObject(objId, OpenMode.ForWrite))
  14.                                         {
  15.                                                 try
  16.                                                 {
  17.                                                         var bref = ent as BlockReference;
  18.                                                         if (bref != null)
  19.                                                         {
  20.                                                                
  21.                                                                 // Получаем BlockTableRecord внешней ссылки
  22.                                                                 var btrBref = (BlockTableRecord)trans.GetObject(bref.BlockTableRecord, OpenMode.ForWrite);
  23.  
  24.                                                                 if (!btrBref.IsFromExternalReference)
  25.                                                                 {
  26.                                                                         return;
  27.                                                                 }
  28.  
  29.                                                                 using (var xDB = new Database(false, true))
  30.                                                                 {
  31.                                                                         xDB.ReadDwgFile(btrBref.PathName, FileShare.ReadWrite, false, null);
  32.  
  33.                                                                         // открываем транзакцию внешней базы для получения объектов
  34.                                                                         using (var transRef = xDB.TransactionManager.StartTransaction())
  35.                                                                         {
  36.                                                                                 // Внешняя база блока
  37.                                                                                 var xBT = transRef.GetObject(xDB.BlockTableId, OpenMode.ForRead) as BlockTable;
  38.                                                                                 var xBTR = transRef.GetObject(xBT[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
  39.  
  40.                                                                                 // Создаем и заполняем коллекцию id'шников
  41.                                                                                 var idColl = new ObjectIdCollection();
  42.                                                                                 foreach (var objid in xBTR)
  43.                                                                                 {
  44.                                                                                         idColl.Add(objid);
  45.                                                                                 }
  46.  
  47.                                                                                 var iMap = new IdMapping();
  48.                                                                                 xDB.WblockCloneObjects(idColl, db.CurrentSpaceId, iMap, DuplicateRecordCloning.Ignore, false);
  49.                                                                         }
  50.                                                                 }
  51.  
  52.                                                                 bref.Visible = false;
  53.                                                         }
  54.                                                 }
  55.                                                 catch (Exception e)
  56.                                                 {
  57.                                                 }
  58.                                         }
  59.                                 }
  60.  
  61.                                 trans.Commit();
  62.                         }
  63.                 }
  64.  
Пришлось открыть объекты на запись, так как вылетал эксепшн прир сокрытии блока.
Копирование объектов происходит, но без COGOPOINT'ов. Думаю, что может создание нового COGOPOINT на основе старого.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Ты в обоих случаях не выполнил условие, что WblockCloneObjects должно вызваться вне транзакции. И кроме того во внутренних транзакциях я не увидел вызова Commit(). Впрочем, наверное Дмитрий Загорулькин был прав, говоря что так копировать нельзя и что нужно создавать объекты средствами Civil 3D.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение