2016-06-24 3 views
1

이것은 사용자 선택에 따라 dwg에서 블록을 선택하고 mtext를 사용하여 dwg 파일의 블록 세부 정보를 인쇄하지만 mtext는 작동하지 않습니다. 어떤 것. 그것은 저에게 예외를줍니다.사용자 선택에 따라 블록의 정보를 표시하는 코드

[CommandMethod("LAT")] 
    public void ListAttributes() 
    { 
     Document acDoc = Application.DocumentManager.MdiActiveDocument; 
     Editor ed = 
      Application.DocumentManager.MdiActiveDocument.Editor; 
     Database db = 
      HostApplicationServices.WorkingDatabase; 
     Transaction tr = 
      db.TransactionManager.StartTransaction(); 

     // Start the transaction 
     try 
     { 
      // Build a filter list so that only 
      // block references are selected 
      TypedValue[] filList = new TypedValue[1] { 
     new TypedValue((int)DxfCode.Start, "INSERT") 
    }; 
      SelectionFilter filter = 
       new SelectionFilter(filList); 
      PromptSelectionOptions opts = 
       new PromptSelectionOptions(); 
      opts.MessageForAdding = "Select block references: "; 
      PromptSelectionResult res = 
       ed.GetSelection(opts, filter); 

      // Do nothing if selection is unsuccessful 
      if (res.Status != PromptStatus.OK) 
       return; 

      SelectionSet selSet = res.Value; 
      ObjectId[] idArray = selSet.GetObjectIds(); 
      foreach (ObjectId blkId in idArray) 
      { 
       BlockReference blkRef = 
        (BlockReference)tr.GetObject(blkId, 
        OpenMode.ForRead); 
       BlockTableRecord btr = 
        (BlockTableRecord)tr.GetObject(
        blkRef.BlockTableRecord, 
        OpenMode.ForWrite 
       ); 
       ed.WriteMessage(
        "\nBlock: " + btr.Name 
       ); 
       //btr.Dispose(); 

       AttributeCollection attCol = 
        blkRef.AttributeCollection; 
       foreach (ObjectId attId in attCol) 
       { 
        MText mtext = new MText(); 
        mtext.SetDatabaseDefaults(); 
        mtext.Height = 2; 

        AttributeReference attRef = 
         (AttributeReference)tr.GetObject(attId, 
         OpenMode.ForRead); 

        string str = 
         ////("\n Attribute Tag: " 
         //// + attRef.Tag 
         //// + "\n Attribute String: " 
         ("\n" + attRef.TextString); 
        mtext.Contents = ("hELLO"); 
        acDoc.Editor.WriteMessage("\n" + str); 
        btr.AppendEntity(mtext); 
        tr.AddNewlyCreatedDBObject(mtext, true); 
       } 
      } 
      tr.Commit(); 
     } 
     catch (Autodesk.AutoCAD.Runtime.Exception ex) 
     { 
      ed.WriteMessage(("Exception: " + ex.Message)); 
     } 
     finally 
     { 
      tr.Dispose(); 
     } 
    } 
} 

}

+0

코드는 어디에 있습니까? 자세한 내용을 추가해야합니다. 최대 투표 수만해도 원래 게시물에 세부 사항이 없습니까? – par

+0

코드는 이전 버전이었습니다. 나는 'ObjectARX'태그를 제안한다. –

답변

3

당신은 모델 공간을 통해 반복하고 모든 해치를 찾을 수있다. 는 다음을 수행 할 수있는 방법 중 하나입니다

[CommandMethod("FindAllHatches")] 
public static void FindAllHatches() 
{ 
    Document acDoc = Application.DocumentManager.MdiActiveDocument; 

    acDoc.Editor.WriteMessage("\nSearching for Hatches"); 

    var db = acDoc.Database; 
    using (Transaction transaction = db.TransactionManager.StartTransaction()) 
    { 
     ObjectId idModelSpace = SymbolUtilityServices.GetBlockModelSpaceId(db); 

     BlockTableRecord modelSpace = 
      transaction.GetObject(idModelSpace, OpenMode.ForRead) as 
      BlockTableRecord; 

     var sbReportText = new StringBuilder(); //usging System.Text 
     double fTotalArea = 0.0; 
     int nTotalHatches = 0; 

     foreach (var objId in modelSpace) 
     { 
      var entity = transaction.GetObject(objId, OpenMode.ForRead); 
      Hatch hatch = entity as Hatch; 
      if (hatch == null) 
       continue; //not hatch 

      nTotalHatches++; 
      fTotalArea += hatch.Area; 

      acDoc.Editor.WriteMessage("\nFound Hatch Area={0}", hatch.Area); 
      sbReportText.AppendFormat("Hatch Area={0}\n", hatch.Area); 
     } 

     if (nTotalHatches == 0) 
      return; //no hatches found 

     modelSpace.UpgradeOpen(); 

     MText acMText = new MText(); 
     acMText.SetDatabaseDefaults(); 

     sbReportText.AppendFormat("Count = {0}, Total Area = {1}", 
      nTotalHatches, fTotalArea); 
     acMText.Contents = sbReportText.ToString(); 

     modelSpace.AppendEntity(acMText); 
     transaction.AddNewlyCreatedDBObject(acMText, true); 

     transaction.Commit(); 
    } 
} 

귀하의 acBlkTblRec 내 예에서 modelSpace이다.

+0

thanx Dmitriy 단 한가지 내가 그 그림을 드로잉 시트에 표시하고 싶습니다. 즉 dwg 파일에 어떻게 출력합니까? – Ajay

+0

메신저를 사용할 때 내부 오류가 발생하여 갑자기 내 autocad가 colse plz 도움말이됩니다. – Ajay

+0

새로운 엔티티를 첨부하려면'BlockTableRecord'가'Write'에 대해 열려 있는지 확인하십시오 –

관련 문제