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

11/02/2015

При использовании WblockCloneObjects скопированные в Пространство Модели примитивы исчезают в текущем чертеже

Это известное поведение метода Database.WblockCloneObjects() когда он используется с чертежом, открытым в AutoCAD. Проделайте следующие шаги для того, чтобы обойти это ограничение:
  1. Сделайте целевой чертеж текущим документом
  2. Вызовите метод TransactionManager.QueueForGraphicsFlush() для запроса обновления графики

Пожалуйста не забудьте сделать целевой чертеж текущим до использования TransactionManager.QueueForGraphicsFlush() в противном случае это не даст никакого эффекта. Также не забудьте блокировать/разблокировать документ.

Вот код показывающий эти шаги, который я дал, отвечая на недавний запрос.

Пример 1:

Загрузите чертеж и сохраните его в каталог C:\Temp , запустите команду WBCloneToCurrent, вы увидите вставку динамического блока в текущем чертеже.

Код - C#: [Выделить]
  1.     [CommandMethod("WBCLONEToCurrent")]
  2.     public void WBCLONEToCurrent()
  3.     {
  4.       DocumentCollection dm = Application.DocumentManager;
  5.       Editor ed = dm.MdiActiveDocument.Editor;
  6.       Database destDb = dm.MdiActiveDocument.Database;
  7.       Database sourceDb = new Database(false, true);
  8.       string sourceFileName;
  9.       try {
  10.         /* Загружаем чертеж по ссылке */
  11.         /* Копируем динамический блок во временный каталог*/
  12.         sourceFileName = "C:\\Temp\\DynamicBlock.dwg";
  13.         sourceDb.ReadDwgFile(sourceFileName, System.IO.FileShare.Read, true, "");
  14.         ObjectIdCollection blockIds = new ObjectIdCollection();
  15.         Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = sourceDb.TransactionManager;
  16.         using (Transaction myT = tm.StartTransaction()) {
  17.           /* Метка нашей вставки блока */
  18.           Handle handle = new Handle(0x215);
  19.           ObjectId brefId = ObjectId.Null;
  20.           sourceDb.TryGetObjectId(handle, out brefId);
  21.           blockIds.Add(brefId);
  22.         }
  23.         IdMapping mapping = new IdMapping();
  24.         destDb.WblockCloneObjects(blockIds, destDb.CurrentSpaceId,
  25.         mapping, DuplicateRecordCloning.Replace, false);
  26.       } catch (Autodesk.AutoCAD.Runtime.Exception ex) {
  27.         ed.WriteMessage("\nОшибка при копировании: " + ex.Message);
  28.       }
  29.       sourceDb.Dispose();
  30.     }

Пример 2 :

Откройте DynamicBlock.dwg и пустой чертеж в другой вкладке, сделайте DynamicBlock.dwg текущим и выполните WBClone.

Код - C#: [Выделить]
  1.     /* Чтобы переключать документы, необходим контекст приложения. */
  2.     [CommandMethod("WBCLONE", CommandFlags.Session)]
  3.     public void TestWBCLONE()
  4.     {
  5.       DocumentCollection docs = Application.DocumentManager;
  6.       Document doc = docs.MdiActiveDocument;
  7.       Database db = doc.Database;
  8.       Editor Ed = doc.Editor;
  9.       Document destDoc = null;
  10.       foreach (Document tmpDoc in docs) {
  11.         destDoc = tmpDoc;
  12.       }
  13.       try {
  14.         PromptEntityResult entRes = Ed.GetEntity("Выберите вставку блока: ");
  15.         if (entRes.Status != PromptStatus.OK) {
  16.           return;
  17.         }
  18.         ObjectIdCollection objIds = new ObjectIdCollection();
  19.  
  20.         /* Добавляем id вставки блока */
  21.         objIds.Add(entRes.ObjectId);
  22.  
  23.         /* Этот финт мы делаем для установки целевого документа текущим */
  24.         Database destdb = destDoc.Database;
  25.         docs.MdiActiveDocument = destDoc;
  26.         using (DocumentLock docLock = destDoc.LockDocument()) {
  27.           using (Transaction trans = destdb.TransactionManager.StartTransaction()) {
  28.             /* Пожалуйста не забудьте сделать целевой чертеж текущим
  29.              * до использования TransactionManager.QueueForGraphicsFlush()
  30.              * в противном случае это не даст никакого эффекта.
  31.              * Также не забудьте блокировать/разблокировать документ. */
  32.             trans.TransactionManager.QueueForGraphicsFlush();
  33.             IdMapping iMap = new IdMapping();
  34.             db.WblockCloneObjects(objIds, destdb.CurrentSpaceId, iMap, DuplicateRecordCloning.Ignore, false);
  35.             trans.Commit();
  36.           }
  37.         }
  38.       } catch (System.Exception ex) {
  39.         Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.Message);
  40.       }
  41.     }

Источник: http://adndevblog.typepad.com/autocad/2015/01/using-wblockcloneobjects-copied-modelspace-entities-disappear-in-the-current-drawing.html

 

Обсуждение: http://adn-cis.org/forum/index.php?topic=1850

Опубликовано 11.02.2015
Отредактировано 11.02.2015 в 19:41:47