2016-10-27 5 views
0

Im пытается получить все блоки и динамические блоки из моего чертежа и фактического количества. Но у меня есть странная проблема, когда граф каждого блока на 1 больше, чем ожидалось. Чтобы получить счетчик нормальных BlockReferences, считающих Duplicates. Но для динамических блоков im получается фактический счет с 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); 
       } 
      } 
     } 

, что им пытаются для динамических блоков, где им получать счетчик с варом 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; 
     } 

Есть ли способ, чтобы получить все блоки и там граф ??? Я перед тем, как сдаться, я пробовал все в течение 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(); 
     } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^