简体   繁体   English

在现有表格中添加单行

[英]Add single row in a existing table

This is my code which take attributes in the selected block and aprint its table in the dwg file. 这是我的代码,该代码在所选块中具有属性,并将其表打印在dwg文件中。

But the problem is that my heading is attribute.tag and its content is attribute.textstring and in my table the heading is not printed instead the record start from the beginning. 但是问题是我的标题是attribute.tag,其内容是attribute.textstring ,在我的表中没有打印标题,而是从头开始记录。 Please suggest me the solution for the same. 请为我建议相同的解决方案。

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

This is due to the current table style (db.Tablestyle) in which the first row is a 'title' row (merged cells). 这是由于当前表样式(db.Tablestyle)的原因,其中第一行是“标题”行(合并的单元格)。 You can use this first row to display the block name, use the second row for the headers and start filling the values in the third one. 您可以使用第一行显示块名称,使用第二行作为标题,然后开始在第三行中填充值。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM