2015-06-09 1 views
2

У меня есть 3 разных BlockTableRecord, которые я хочу обновить. Я загружаю внешние .dxf-файлы, которые содержат сущности для каждого определения блока. Теперь, когда я удаляю старые объекты и загружаю их в новые, он отлично работает, но как только я начинаю обновлять второй (третий и т. Д.), Он снова использует сущности первого BlockTableRecord. Это происходит даже после сохранения и перезагрузки всего чертежа.Сущности ошибочны при импорте нескольких файлов DXF

GetPositionBlock() получает BlockTableRecord Я хочу обновить на основе его XData. Ошибка не в этом методе, так как он получает нужный блок для обновления.

public void Update(string fileName) 
{ 
    using (_doc.LockDocument()) 
    { 
     using Transaction transaction = _dataBase.TransactionManager.StartTransaction()) 
     { 
      BlockTableRecord blockTableRecord = GetPositionBlock(); 
      // ...delete old entities 
      BlockTableRecord externalblock = GetExternalBlock(fileName); 
      ObjectIdCollection objs = new ObjectIdCollection(); 
      foreach (ObjectId objId in externalBlock) 
      { 
       objs.Add(objId); 
      } 
      blockTableRecord.AssumeOwnershipPf(objs); 
      transaction.Commit(); 
     } 
    } 
} 

private BlockTableRecord GetExternalBlock(string fileName) 
{ 
    DBObjectCollection dbObjColleciton = new DBObjectCollection(); 
    using (Transaction transaction = _doc.TransactionManager.StartTransaction()) 
    { 
     using (Database sourceDb = new Database(false, true)) 
     { 
      sourceDb.DxfIn(fileName, null); 
      ObjectId blockId = _dataBase.Insert(Guid.NewGuid().ToString(), sourceDb, false) 
      BlockTableRecord blockTableRecord = (BlockTableRecord)transaction.GetObject(blockId, OpenMode.ForRead); 
      transaction.Commit(); 
      return blockTableRecord; 
     } 
    } 
} 

Я проверил каждое значение. Он никогда не использует один и тот же указатель, имя или что-то в этом роде. Похоже, что проблема лежит где-то в blockId или в _dataBase.Insert(...). Кажется, что некоторое значение перезаписывается или устанавливается при первом использовании, и после этого ничего не сбрасывается. Любые идеи, что может вызвать эту проблему? Любые подсказки или помощь очень ценятся.

+0

А как насчет этого DxfIn? Почему не метод sourceDb.DxfIn (...)? –

+0

Упс, моя ошибка. На самом деле это sourceDb.DxfIn (...). –

ответ

1

Я думаю, ваша проблема здесь:

ObjectId blockId = _dataBase.Insert(Guid.NewGuid().ToString(), sourceDb, false) 

объект _Database не база данных, в при использовании метода GetExternalBlock. Лично я бы использовал метод WblockCloneObjects, чтобы получить блок из внешнего чертежа. мой код:

public bool GetExternBlok(string filePath, string blockName) 
    { 
     bool functionReturnValue = true; 
     Document doc = Application.DocumentManager.MdiActiveDocument; 

     using (DocumentLock myLock = doc.LockDocument()) 
     { 
      using (Database OpenDb = new Database(false, false)) 
      { 
       OpenDb.ReadDwgFile(filePath, System.IO.FileShare.Read, true, ""); 
       //readwrite 
       ObjectIdCollection sourceidsCollection = new ObjectIdCollection(); 
       ObjectId sourceBlockId = ObjectId.Null; 

       using (Transaction tr = OpenDb.TransactionManager.StartTransaction()) 
       { 

        BlockTable bt = (BlockTable)tr.GetObject(OpenDb.BlockTableId, OpenMode.ForRead); 

        if (bt.Has(blockName)) 
        { 
         sourceidsCollection.Add(bt[blockName]); 
         sourceBlockId = bt[blockName]; 
        } 

        if (sourceidsCollection.Count != 0) 
        { 
         Database destdb = doc.Database; 
         IdMapping iMap = new IdMapping(); 
         OpenDb.WblockCloneObjects(sourceidsCollection, destdb.BlockTableId, iMap, DuplicateRecordCloning.Replace, false); 

         using (Transaction t = destdb.TransactionManager.StartTransaction()) 
         { 
          ObjectId targetBlockId = ObjectId.Null; 
          BlockTable b = (BlockTable)t.GetObject(destdb.BlockTableId, OpenMode.ForRead); 

          if (b.Has(blockName)) 
          { 
           targetBlockId = b[blockName]; 
          } 

          t.Commit(); 

         } 
        } 
        else 
        { 
         functionReturnValue = false; 
        } 

        tr.Commit(); 

       } 
      } 
     } 
     return functionReturnValue; 
    } 
+0

Спасибо @Alain. Я проследил вопрос, и оказалось, что было неправильное значение для blcoks, когда .dxf был экспортирован. Я принимаю ваш ответ, поскольку ваш подход кажется немного более продвинутым, чем мой, и он приводит меня к правильному решению. –