2016-10-27 4 views
0

私の図面と実際のカウントからすべてのブロックとダイナミックブロックを取得しようとしています。しかし、私は奇妙な問題を抱えています。ここで、各ブロックのカウントは1以上です。 Duplicatesをカウントしている通常のBlockReferencesのカウントを取得する。しかし、動的ブロックの場合、実際のカウントを得るには var blockCount = anonymousBtr.GetBlockReferenceIds(true、true).Count;通常のブロックのためにしようとして 何イム:イムするvar blockCount = anonymousBtr.GetBlockReferenceIds(true, true).Count; C#Autoブロックとカウント付き動的ブロック

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; 
     } 

と数を取得は、すべてのブロックを取得する方法がある場合にダイナミックブロックのためにしようと何イム

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); 
       } 
      } 
     } 

そこに数え?? Imを諦める前に私は3日間すべてを試しました....たぶん誰かが私を助けることができます。 ありがとう

答えて

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(); 
     } 
    } 
関連する問題