11/02/2015
При использовании WblockCloneObjects скопированные в Пространство Модели примитивы исчезают в текущем чертеже
Это известное поведение метода Database.WblockCloneObjects() когда он используется с чертежом, открытым в AutoCAD. Проделайте следующие шаги для того, чтобы обойти это ограничение:- Сделайте целевой чертеж текущим документом
- Вызовите метод TransactionManager.QueueForGraphicsFlush() для запроса обновления графики
Пожалуйста не забудьте сделать целевой чертеж текущим до использования TransactionManager.QueueForGraphicsFlush() в противном случае это не даст никакого эффекта. Также не забудьте блокировать/разблокировать документ.
Вот код показывающий эти шаги, который я дал, отвечая на недавний запрос.
Пример 1:
Загрузите чертеж и сохраните его в каталог C:\Temp , запустите команду WBCloneToCurrent, вы увидите вставку динамического блока в текущем чертеже.
Код - C#: [Выделить]
- [CommandMethod("WBCLONEToCurrent")]
- public void WBCLONEToCurrent()
- {
- DocumentCollection dm = Application.DocumentManager;
- Editor ed = dm.MdiActiveDocument.Editor;
- Database destDb = dm.MdiActiveDocument.Database;
- Database sourceDb = new Database(false, true);
- string sourceFileName;
- try {
- /* Загружаем чертеж по ссылке */
- /* Копируем динамический блок во временный каталог*/
- sourceFileName = "C:\\Temp\\DynamicBlock.dwg";
- sourceDb.ReadDwgFile(sourceFileName, System.IO.FileShare.Read, true, "");
- ObjectIdCollection blockIds = new ObjectIdCollection();
- Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = sourceDb.TransactionManager;
- using (Transaction myT = tm.StartTransaction()) {
- /* Метка нашей вставки блока */
- Handle handle = new Handle(0x215);
- ObjectId brefId = ObjectId.Null;
- sourceDb.TryGetObjectId(handle, out brefId);
- blockIds.Add(brefId);
- }
- IdMapping mapping = new IdMapping();
- destDb.WblockCloneObjects(blockIds, destDb.CurrentSpaceId,
- mapping, DuplicateRecordCloning.Replace, false);
- } catch (Autodesk.AutoCAD.Runtime.Exception ex) {
- ed.WriteMessage("\nОшибка при копировании: " + ex.Message);
- }
- sourceDb.Dispose();
- }
Пример 2 :
Откройте DynamicBlock.dwg и пустой чертеж в другой вкладке, сделайте DynamicBlock.dwg текущим и выполните WBClone.
Код - C#: [Выделить]
- /* Чтобы переключать документы, необходим контекст приложения. */
- [CommandMethod("WBCLONE", CommandFlags.Session)]
- public void TestWBCLONE()
- {
- DocumentCollection docs = Application.DocumentManager;
- Document doc = docs.MdiActiveDocument;
- Database db = doc.Database;
- Editor Ed = doc.Editor;
- Document destDoc = null;
- foreach (Document tmpDoc in docs) {
- destDoc = tmpDoc;
- }
- try {
- PromptEntityResult entRes = Ed.GetEntity("Выберите вставку блока: ");
- if (entRes.Status != PromptStatus.OK) {
- return;
- }
- ObjectIdCollection objIds = new ObjectIdCollection();
- /* Добавляем id вставки блока */
- objIds.Add(entRes.ObjectId);
- /* Этот финт мы делаем для установки целевого документа текущим */
- Database destdb = destDoc.Database;
- docs.MdiActiveDocument = destDoc;
- using (DocumentLock docLock = destDoc.LockDocument()) {
- using (Transaction trans = destdb.TransactionManager.StartTransaction()) {
- /* Пожалуйста не забудьте сделать целевой чертеж текущим
- * до использования TransactionManager.QueueForGraphicsFlush()
- * в противном случае это не даст никакого эффекта.
- * Также не забудьте блокировать/разблокировать документ. */
- trans.TransactionManager.QueueForGraphicsFlush();
- IdMapping iMap = new IdMapping();
- db.WblockCloneObjects(objIds, destdb.CurrentSpaceId, iMap, DuplicateRecordCloning.Ignore, false);
- trans.Commit();
- }
- }
- } catch (System.Exception ex) {
- Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.Message);
- }
- }
Обсуждение: http://adn-cis.org/forum/index.php?topic=1850
Опубликовано 11.02.2015Отредактировано 11.02.2015 в 19:41:47