2016-10-27 649 views
0

我试图从我的绘图和实际计数获取所有块和动态块。但即时通讯有一个奇怪的问题,其中每个块的计数比预期多1。即时计数重复的正常BlockReferences的计数。但是对于动态块即时获取实际的计数 var blockCount = anonymousBtr.GetBlockReferenceIds(true,true).Count; 什么即时试图为正常块段: C#AutoCAD获取块和动态块计数

public static void GetShelfBlock() { 
      var acDoc = Application.DocumentManager.MdiActiveDocument; 
      var acDb = acDoc.Database; 
      var dataCollection = new List<DataModel>(); 

      using (var tr = acDb.TransactionManager.StartTransaction()) { 

       try { 
        var entClass = RXObject.GetClass(typeof(Entity)); 
        var modelSpaceId = SymbolUtilityServices.GetBlockModelSpaceId(acDb); 
        var modelSpace = (BlockTableRecord)tr.GetObject(modelSpaceId, OpenMode.ForRead); 

        foreach (var id in modelSpace) { 
         if (!id.ObjectClass.IsDerivedFrom(entClass)) { 
          continue; 
         } 

         var ent = (Entity)tr.GetObject(id, OpenMode.ForRead); 
         if (!ent.GetType().ToString().Contains(typeof(BlockReference).Name)) { 
       continue; 
         } 

         var reference = ent as BlockReference; 
         if (reference == null) { 
          continue; 
         } 

         var blockReference = reference; 
         if (CheckPattern(blockReference.Name)) { 
          dataCollection.Add(PrepareShelfObject(blockReference)); 
         } 
        } 
        tr.Commit(); 
        tr.Dispose(); 

        dataCollection.AddRange(GetDynamicBlocks(SearchPatterns)); 
        if (dataCollection.Count > 0) { 
         Serialize(dataCollection, DataType.Regale); 
        } 
       } 
       catch (Exception ex) { 
        acDoc.Editor.WriteMessage(ex.Message); 
       } 
      } 
     } 

什么即时试图为那里即时得到使用var blockCount计数动态块= anonymousBtr.GetBlockReferenceIds(true, true).Count;

public static List<DataModel> GetDynamicBlocks() { 
      var db = Application.DocumentManager.MdiActiveDocument.Database; 
      var dynamicBlockList = new List<DataModel>(); 
      var tempList = new List<object>(); 
      using (var trans = db.TransactionManager.StartTransaction()) { 
       var bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead); 

       foreach (var btrId in bt) { 

        var btr = (BlockTableRecord)trans.GetObject(btrId, OpenMode.ForRead); 
        if (!btr.IsDynamicBlock) { 
         continue; 
        } 

        var anonymousIds = btr.GetAnonymousBlockIds(); 
        var dynBlockRefs = new ObjectIdCollection(); 

        foreach (ObjectId anonymousBtrId in anonymousIds) { 
         var anonymousBtr = (BlockTableRecord)trans.GetObject(anonymousBtrId, OpenMode.ForRead); 
         var blockRefIds = anonymousBtr.GetBlockReferenceIds(true, true); 
         foreach (ObjectId id in blockRefIds) { 
          dynBlockRefs.Add(id); 
         } 
        } 

        if (searchPattern.Any(btr.Name.StartsWith)) { 
         dynamicBlockList.Add(PrepareDynObject(btr)); 
        } 
       } 
       trans.Commit(); 
       trans.Dispose(); 
      } 
      return dynamicBlockList; 
     } 

有没有办法让所有的块并有计数?在放弃之前,我现在试了三天......也许有人可以帮助我。 谢谢

回答

2

这是一种使用Linq的方法。

public void ListBlocks() 
    { 
     var doc = Application.DocumentManager.MdiActiveDocument; 
     var db = doc.Database; 
     var ed = doc.Editor; 

     using (var tr = db.TransactionManager.StartOpenCloseTransaction()) 
     { 
      var modelSpace = (BlockTableRecord)tr.GetObject(
       SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead); 

      var brclass = RXObject.GetClass(typeof(BlockReference)); 

      var blocks = modelSpace 
       .Cast<ObjectId>() 
       .Where(id => id.ObjectClass == brclass) 
       .Select(id => (BlockReference)tr.GetObject(id, OpenMode.ForRead)) 
       .GroupBy(br => ((BlockTableRecord)tr.GetObject(
        br.DynamicBlockTableRecord, OpenMode.ForRead)).Name); 

      foreach (var group in blocks) 
      { 
       ed.WriteMessage($"\n{group.Key}: {group.Count()}"); 
      } 
      tr.Commit(); 
     } 
    }