明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖

[Kean专集] Kean专题(7)—Fields

   关闭 [复制链接]
 楼主| 发表于 2009-5-23 10:38:00 | 显示全部楼层
January 15, 2009
More fun with AutoCAD tables and their styles using .NET
In this previous post we saw some code to create a table style and apply it to a new table inside an AutoCAD drawing. While responding to a comment on the post, I realised that the table didn't display properly using my example: the first column heading was being taken as the table title and the rest of the column headings were lost - the headings in the table were actually taken from the first row of data. I suppose that serves me right for having chosen such eye-catching (and distracting) colours. :-)
The following C# code addresses this by adding some information to our array of table contents, and using that for the table title. It also does a little more to customize the display of our table by applying chunky lineweights (and yet more garish colours) to the table's grid-lines.
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.DatabaseServices;
  3. using Autodesk.AutoCAD.EditorInput;
  4. using Autodesk.AutoCAD.Runtime;
  5. using Autodesk.AutoCAD.Colors;
  6. namespace TableAndStyleCreation
  7. {
  8.   public class Commands
  9.   {
  10.     [CommandMethod("CTWS")]
  11.     static public void CreateTableWithStyleAndWhatStyle()
  12.     {
  13.       Document doc =
  14.         Application.DocumentManager.MdiActiveDocument;
  15.       Database db = doc.Database;
  16.       Editor ed = doc.Editor;
  17.       PromptPointResult pr =
  18.         ed.GetPoint("\nEnter table insertion point: ");
  19.       if (pr.Status == PromptStatus.OK)
  20.       {
  21.         Transaction tr =
  22.           doc.TransactionManager.StartTransaction();
  23.         using (tr)
  24.         {
  25.           // First let us create our custom style,
  26.           //  if it doesn't exist
  27.           const string styleName = "Garish Table Style";
  28.           ObjectId tsId = ObjectId.Null;
  29.           DBDictionary sd =
  30.             (DBDictionary)tr.GetObject(
  31.               db.TableStyleDictionaryId,
  32.               OpenMode.ForRead
  33.             );
  34.           // Use the style if it already exists
  35.           if (sd.Contains(styleName))
  36.           {
  37.             tsId = sd.GetAt(styleName);
  38.           }
  39.           else
  40.           {
  41.             // Otherwise we have to create it
  42.             TableStyle ts = new TableStyle();
  43.             // Make the header area red
  44.             ts.SetBackgroundColor(
  45.               Color.FromColorIndex(ColorMethod.ByAci, 1),
  46.               (int)(RowType.TitleRow |
  47.                     RowType.HeaderRow)
  48.             );
  49.             // And the data area yellow
  50.             ts.SetBackgroundColor(
  51.               Color.FromColorIndex(ColorMethod.ByAci, 2),
  52.               (int)RowType.DataRow
  53.             );
  54.             // With magenta text everywhere (yeuch :-)
  55.             ts.SetColor(
  56.               Color.FromColorIndex(ColorMethod.ByAci, 6),
  57.               (int)(RowType.TitleRow |
  58.                     RowType.HeaderRow |
  59.                     RowType.DataRow)
  60.             );
  61.             // And now with cyan outer grid-lines
  62.             ts.SetGridColor(
  63.               Color.FromColorIndex(ColorMethod.ByAci, 4),
  64.               (int)GridLineType.OuterGridLines,
  65.               (int)(RowType.TitleRow |
  66.                     RowType.HeaderRow |
  67.                     RowType.DataRow)
  68.             );
  69.             // And bright green inner grid-lines
  70.             ts.SetGridColor(
  71.               Color.FromColorIndex(ColorMethod.ByAci, 3),
  72.               (int)GridLineType.InnerGridLines,
  73.               (int)(RowType.TitleRow |
  74.                     RowType.HeaderRow |
  75.                     RowType.DataRow)
  76.             );
  77.             // And we'll make the grid-lines nice and chunky
  78.             ts.SetGridLineWeight(
  79.               LineWeight.LineWeight211,
  80.               (int)GridLineType.AllGridLines,
  81.               (int)(RowType.TitleRow |
  82.                     RowType.HeaderRow |
  83.                     RowType.DataRow)
  84.             );
  85.             // Add our table style to the dictionary
  86.             //  and to the transaction
  87.             tsId = ts.PostTableStyleToDatabase(db, styleName);
  88.             tr.AddNewlyCreatedDBObject(ts, true);
  89.           }
  90.           BlockTable bt =
  91.             (BlockTable)tr.GetObject(
  92.               doc.Database.BlockTableId,
  93.               OpenMode.ForRead
  94.             );
  95.           Table tb = new Table();
  96.           tb.NumRows = 6;
  97.           tb.NumColumns = 3;
  98.           tb.SetRowHeight(3);
  99.           tb.SetColumnWidth(15);
  100.           tb.Position = pr.Value;
  101.           // Use our table style
  102.           if (tsId == ObjectId.Null)
  103.             // This should not happen, unless the
  104.             //  above logic changes
  105.             tb.TableStyle = db.Tablestyle;
  106.           else
  107.             tb.TableStyle = tsId;
  108.           // Create a 2-dimensional array
  109.           // of our table contents
  110.           string[,] str = new string[6, 3];
  111.           str[0, 0] = "Material Properties Table";
  112.           str[1, 0] = "Part No.";
  113.           str[1, 1] = "Name";
  114.           str[1, 2] = "Material";
  115.           str[2, 0] = "1876-1";
  116.           str[2, 1] = "Flange";
  117.           str[2, 2] = "Perspex";
  118.           str[3, 0] = "0985-4";
  119.           str[3, 1] = "Bolt";
  120.           str[3, 2] = "Steel";
  121.           str[4, 0] = "3476-K";
  122.           str[4, 1] = "Tile";
  123.           str[4, 2] = "Ceramic";
  124.           str[5, 0] = "8734-3";
  125.           str[5, 1] = "Kean";
  126.           str[5, 2] = "Mostly water";
  127.           // Use a nested loop to add and format each cell
  128.           for (int i = 0; i < 6; i++)
  129.           {
  130.             if (i == 0)
  131.             {
  132.               // This is for the title
  133.               tb.SetTextHeight(0, 0, 1);
  134.               tb.SetTextString(0, 0, str[0, 0]);
  135.               tb.SetAlignment(0, 0, CellAlignment.MiddleCenter);
  136.             }
  137.             else
  138.             {
  139.               // These are the header and data rows
  140.               for (int j = 0; j < 3; j++)
  141.               {
  142.                 tb.SetTextHeight(i, j, 1);
  143.                 tb.SetTextString(i, j, str[i, j]);
  144.                 tb.SetAlignment(i, j, CellAlignment.MiddleCenter);
  145.               }
  146.             }
  147.           }
  148.           tb.GenerateLayout();
  149.           BlockTableRecord btr =
  150.             (BlockTableRecord)tr.GetObject(
  151.               bt[BlockTableRecord.ModelSpace],
  152.               OpenMode.ForWrite
  153.             );
  154.           btr.AppendEntity(tb);
  155.           tr.AddNewlyCreatedDBObject(tb, true);
  156.           tr.Commit();
  157.         }
  158.       }
  159.     }
  160.   }
  161. }

One other minor enhancement: I made use of the TableStyle.PostTableStyleToDatabase() method to add the style to the appropriate location in the Database (we previously edited the TableStyleDictionary directly to achieve this).
Here's what happens when we run the CTWS command (making sure that we have adjusted the display settings to use lineweights):

And here's the updated style in AutoCAD's TableStyle dialog:

That's better. At least in that it does what was expected of it, even if it's not winning any design awards. :-)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-23 13:13 , Processed in 0.144951 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表