2016-08-20 6 views
0

이것은 선택된 블록에서 속성을 가져 와서 dwg 파일에서 해당 테이블을 인쇄하는 코드입니다.기존 테이블에 단일 행 추가

그러나 문제는 내 머리글이 attribute.tag이고 그 내용이 attribute.textstring이고 내 테이블에 머리글이 인쇄되지 않고 처음부터 레코드가 시작된다는 것입니다. 나에게도 같은 해결책을 제안 해주세요.

namespace TableCreation 
    { 
    public class Commands 
    { 
    // Set up some formatting constants 
    // for the table 

    private const double colWidth = 15.0; 
    private const double rowHeight = 3.0; 
    private const double textHeight = 1.0; 

    private const CellAlignment cellAlign = 
     CellAlignment.MiddleCenter; 

    // Helper function to set text height 
    // and alignment of specific cells, 
    // as well as inserting the text 

    static public void SetCellText(Table tb, int row, int col, string value) 
    { 
     tb.SetAlignment(row, col, cellAlign); 
     tb.SetTextHeight(row, col, textHeight); 
     tb.SetTextString(row, col, value); 
    } 

    [CommandMethod("BAT")] 
    static public void BlockAttributeTable() 
    { 
     Document doc = Application.DocumentManager.MdiActiveDocument; 
     Database db = doc.Database; 
     Editor ed = doc.Editor; 

     PromptStringOptions opt = new PromptStringOptions("\nEnter name of block to list: "); 
     PromptResult pr = ed.GetString(opt); 

     if (pr.Status == PromptStatus.OK) 
     { 
      string blockToFind = pr.StringResult.ToUpper(); 

      Transaction tr = doc.TransactionManager.StartTransaction(); 
      using (tr) 
      { 
       // Let's check the block exists 

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

       if (!bt.Has(blockToFind)) 
       { 
        ed.WriteMessage("\nBlock " + blockToFind + " does not exist."); 
       } 
       else 
       { 
        // And go through looking for 
        // attribute definitions 

        StringCollection colNames = new StringCollection(); 

        BlockTableRecord bd = (BlockTableRecord)tr.GetObject(bt[blockToFind], OpenMode.ForRead); 
        foreach (ObjectId adId in bd) 
        { 
         DBObject adObj = tr.GetObject(adId, OpenMode.ForRead); 

         // For each attribute definition we find... 

         AttributeDefinition ad = adObj as AttributeDefinition; 
         if (ad != null) 
         { 
          // ... we add its name to the list 

          colNames.Add(ad.Tag); 
          ed.WriteMessage("\n" + ad.Tag); 
         } 
        } 
        if (colNames.Count == 0) 
        { 
         ed.WriteMessage("\nThe block " + blockToFind + " contains no attribute definitions."); 
        } 
        else 
        { 
         // Ask the user for the insertion point 
         // and then create the table 

         PromptPointResult ppr; 
         PromptPointOptions ppo = new PromptPointOptions(""); 
         ppo.Message = "\n Select the place for print output:"; 
         //get the coordinates from user 
         ppr = ed.GetPoint(ppo); 
         if (ppr.Status != PromptStatus.OK) 
          return; 
         Point3d startPoint = ppr.Value.TransformBy(ed.CurrentUserCoordinateSystem); 
         //Point3d startPoint1 = startPoint.Subtract(); 
         Vector3d disp = new Vector3d(0.0, -2.0 * db.Textsize, 0.0); 
         Vector3d disp2 = new Vector3d(0.0, -2.0 * db.Textsize, 0.0); 

         if (ppr.Status == PromptStatus.OK) 
         { 
          Table tb = new Table(); 
          tb.TableStyle = db.Tablestyle; 
          tb.NumRows = 1; 
          tb.NumColumns = colNames.Count; 
          tb.SetRowHeight(rowHeight); 
          tb.SetColumnWidth(colWidth); 
          tb.Position = startPoint; 

          // Let's add our column headings 

          for (int i = 0; i < 5; i++) 
          { 
           SetCellText(tb, 0, i, colNames[i]); 
           //ed.WriteMessage("\n" + colNames[i]); 
          } 

          // Now let's search for instances of 
          // our block in the modelspace 

          BlockTableRecord ms = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.PaperSpace], OpenMode.ForRead); 

          int rowNum = 1; 
          foreach (ObjectId objId in ms) 
          { 
           DBObject obj = tr.GetObject(objId, OpenMode.ForRead); 
           BlockReference br = obj as BlockReference; 
           if (br != null) 
           { 
            BlockTableRecord btr = (BlockTableRecord)tr.GetObject(br.BlockTableRecord, OpenMode.ForRead); 
            using (btr) 
            { 
             if (btr.Name.ToUpper() == blockToFind) 
             { 
              // We have found one of our blocks, 
              // so add a row for it in the table 

              tb.InsertRows(rowNum, rowHeight, 2); 

              // Assume that the attribute refs 
              // follow the same order as the 
              // attribute defs in the block 

              int attNum = 0; 
              foreach (ObjectId arId in br.AttributeCollection) 
              { 
               DBObject arObj = tr.GetObject(arId, OpenMode.ForRead); 
               AttributeReference ar = arObj as AttributeReference; 
               if (ar != null) 
               { 
                string strCell; 

                strCell = ar.TextString; 

                string strArId = arId.ToString(); 

                strArId = strArId.Trim(new char[] { '(', ')' }); 

                SetCellText(tb, rowNum, attNum, strCell); 
                ed.WriteMessage("\n" + ar.Tag); 
               } 
               attNum++; 
              } 
              rowNum++; 
             } 
            } 
           } 
          } 
          tb.GenerateLayout(); 

          ms.UpgradeOpen(); 
          ms.AppendEntity(tb); 
          tr.AddNewlyCreatedDBObject(tb, true); 
          tr.Commit(); 
         } 
        } 
       } 
      } 
     } 
    } 
} 
} 

답변

0

이 첫 번째 행에 '제목'로우 (병합 된 셀) 인 현재 테이블 스타일 (db.Tablestyle)에 기인한다. 이 첫 번째 행을 사용하여 블록 이름을 표시하고 두 번째 행을 헤더에 사용하고 세 번째 행의 값 채우기를 시작할 수 있습니다.

// Set up some formatting constants 
    // for the table 

    private const double colWidth = 15.0; 
    private const double rowHeight = 3.0; 
    private const double textHeight = 1.0; 
    private const CellAlignment cellAlign = CellAlignment.MiddleCenter; 

    // Helper function to set text height 
    // and alignment of specific cells, 
    // as well as inserting the text 

    static public void SetCellText(Table tb, int row, int col, string value) 
    { 
     tb.Cells[row, col].Alignment = cellAlign; 
     tb.Cells[row, col].TextHeight = textHeight; 
     tb.Cells[row, col].Value = value; 
    } 

    [CommandMethod("BAT")] 
    static public void BlockAttributeTable() 
    { 
     Document doc = AcAp.DocumentManager.MdiActiveDocument; 
     Database db = doc.Database; 
     Editor ed = doc.Editor; 

     PromptStringOptions opt = new PromptStringOptions("\nEnter name of block to list: "); 
     PromptResult pr = ed.GetString(opt); 

     if (pr.Status == PromptStatus.OK) 
     { 
      string blockToFind = pr.StringResult.ToUpper(); 

      Transaction tr = doc.TransactionManager.StartTransaction(); 
      using (tr) 
      { 
       // Let's check the block exists 

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

       if (!bt.Has(blockToFind)) 
       { 
        ed.WriteMessage("\nBlock " + blockToFind + " does not exist."); 
       } 
       else 
       { 
        // And go through looking for 
        // attribute definitions 

        StringCollection colNames = new StringCollection(); 

        BlockTableRecord bd = (BlockTableRecord)tr.GetObject(bt[blockToFind], OpenMode.ForRead); 
        foreach (ObjectId adId in bd) 
        { 
         DBObject adObj = tr.GetObject(adId, OpenMode.ForRead); 

         // For each attribute definition we find... 

         AttributeDefinition ad = adObj as AttributeDefinition; 
         if (ad != null) 
         { 
          // ... we add its name to the list 

          colNames.Add(ad.Tag); 
          ed.WriteMessage("\n" + ad.Tag); 
         } 
        } 
        if (colNames.Count == 0) 
        { 
         ed.WriteMessage("\nThe block " + blockToFind + " contains no attribute definitions."); 
        } 
        else 
        { 
         // Ask the user for the insertion point 
         // and then create the table 

         PromptPointResult ppr; 
         PromptPointOptions ppo = new PromptPointOptions(""); 
         ppo.Message = "\n Select the place for print output:"; 
         //get the coordinates from user 
         ppr = ed.GetPoint(ppo); 
         if (ppr.Status != PromptStatus.OK) 
          return; 
         Point3d startPoint = ppr.Value.TransformBy(ed.CurrentUserCoordinateSystem); 
         //Point3d startPoint1 = startPoint.Subtract(); 
         Vector3d disp = new Vector3d(0.0, -2.0 * db.Textsize, 0.0); 
         Vector3d disp2 = new Vector3d(0.0, -2.0 * db.Textsize, 0.0); 

         if (ppr.Status == PromptStatus.OK) 
         { 
          Table tb = new Table(); 
          tb.TableStyle = db.Tablestyle; 
          tb.SetSize(2, colNames.Count); 
          tb.SetRowHeight(rowHeight); 
          tb.SetColumnWidth(colWidth); 
          tb.Position = startPoint; 

          // Let's add the table title 
          tb.Cells[0, 0].Value = bd.Name; 

          // Let's add our column headings 

          for (int i = 0; i < colNames.Count; i++) 
          { 
           SetCellText(tb, 1, i, colNames[i]); 
           //ed.WriteMessage("\n" + colNames[i]); 
          } 

          // Now let's search for instances of 
          // our block in the modelspace 

          ObjectId msId = SymbolUtilityServices.GetBlockModelSpaceId(db); 
          BlockTableRecord ms = (BlockTableRecord)tr.GetObject(msId, OpenMode.ForWrite); 

          int rowNum = 2; 
          foreach (ObjectId brId in bd.GetBlockReferenceIds(true, true)) 
          { 
           BlockReference br = (BlockReference)tr.GetObject(brId, OpenMode.ForRead); 
           if (br.OwnerId == msId) 
           { 
            // We have found one of our blocks, 
            // so add a row for it in the table 

            tb.InsertRows(rowNum, rowHeight, 1); 

            // Assume that the attribute refs 
            // follow the same order as the 
            // attribute defs in the block 

            int attNum = 0; 
            foreach (ObjectId arId in br.AttributeCollection) 
            { 
             DBObject arObj = tr.GetObject(arId, OpenMode.ForRead); 
             AttributeReference ar = arObj as AttributeReference; 
             if (ar != null) 
             { 
              string strCell = ar.TextString; 

              string strArId = arId.ToString().Trim('(', ')'); 

              SetCellText(tb, rowNum, attNum, strCell); 
              ed.WriteMessage("\n" + ar.Tag); 
             } 
             attNum++; 
            } 
            rowNum++; 
           } 
          } 
          tb.GenerateLayout(); 

          ms.AppendEntity(tb); 
          tr.AddNewlyCreatedDBObject(tb, true); 
          tr.Commit(); 
         } 
        } 
       } 
      } 
     } 
    } 
+0

매번 블록 이름을 입력하고 싶지 않습니다. 하나의 블록을 선택하고 그 이름에 따라 도면의 동일한 블록에 대한 출력을 인쇄하고 싶습니다. – jackson