找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1003|回复: 1

[每日一码] 根据polyline生成顶点坐标表格的程序,含源代码

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2017-6-1 13:25:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
  1. using System;
  2. using Autodesk.AutoCAD.ApplicationServices;
  3. using Autodesk.AutoCAD.Runtime;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.EditorInput;
  6. using Autodesk.AutoCAD.Colors;
  7. using Autodesk.AutoCAD.Windows;
  8. using Autodesk.AutoCAD.Geometry;
  9. namespace MyTools
  10. {
  11.     /// <summary>
  12.     /// TestClass的说明。
  13.     /// </summary>
  14.     public class TestClass
  15.     {
  16.         public TestClass()
  17.         {
  18.         }
  19.         public void CreateTable(Point3dCollection p3dC, string scale,Point3d p3d,int t)
  20.         {
  21.             int numRows = p3dC.Count + 1;
  22.             string strT;
  23.             if (t == 3)
  24.             {
  25.                 strT = "#0.000";
  26.             }
  27.             else
  28.             {
  29.                 strT = "#0.00";
  30.             }
  31.             Database db = HostApplicationServices.WorkingDatabase;
  32.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  33.             Transaction trans = db.TransactionManager.StartTransaction();
  34.             BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
  35.             BlockTableRecord btr = (BlockTableRecord)trans.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  36.             double dScale = double.Parse(scale);
  37.             double rowHeight;
  38.             double columnWidth1;
  39.             double columnWidth2;
  40.             double textHeight1;
  41.             double textHeight2;
  42.             double columnWidth3;
  43.             try
  44.             {
  45.                 textHeight1 = 1.25 * (dScale / 500);//表头的字体高度
  46.                 textHeight2 = 0.9 * (dScale / 500);//坐标点的数字字体高度
  47.                 rowHeight = 2 * (dScale / 500);//行高
  48.                 columnWidth1 = 4 * (dScale / 500);//1列的列宽
  49.                 columnWidth2 = 11 * (dScale / 500);//2至3列的列宽
  50.                 columnWidth3 = 6 * (dScale / 500);//4列的列宽
  51.                 Table myTable = new Table();
  52.                 myTable.Position = p3d;
  53.                 myTable.NumRows = numRows;
  54.                 myTable.NumColumns = 4;
  55.                 myTable.SetColumnWidth(0,columnWidth1);
  56.                 myTable.SetColumnWidth(1,columnWidth2);
  57.                 myTable.SetColumnWidth(2,columnWidth2);
  58.                 myTable.SetColumnWidth(3,columnWidth3);
  59.                 myTable.SetRowHeight(rowHeight);
  60.                 ed.WriteMessage(rowHeight.ToString());
  61.                 //设置表头
  62.                 myTable.SetTextHeight(0, 0, textHeight1);
  63.                 myTable.SetTextString(0, 0, "序号");
  64.                 myTable.SetTextHeight(0, 1, textHeight1);
  65.                 myTable.SetTextString(0, 1, "X坐标");
  66.                 myTable.SetTextHeight(0, 2, textHeight1);
  67.                 myTable.SetTextString(0, 2, "Y坐标");
  68.                 myTable.SetTextHeight(0, 3, textHeight1);
  69.                 myTable.SetTextString(0, 3, "圆弧标记");
  70.                 //将坐标数值输入到表格中
  71.                 for (int i = 0; i < p3dC.Count; i++)
  72.                 {
  73.                     int n = i + 1;
  74.                     myTable.SetTextHeight(n, 0, textHeight2);
  75.                     myTable.SetTextString(n, 0, n.ToString());
  76.                     myTable.SetTextHeight(n, 1, textHeight2);
  77.                     myTable.SetTextString(n, 1, p3dC.X.ToString(strT));
  78.                     myTable.SetTextHeight(n, 2, textHeight2);
  79.                     myTable.SetTextString(n, 2, p3dC.Y.ToString(strT));
  80.                     myTable.SetTextHeight(n, 3, textHeight2);
  81.                     myTable.SetTextString(n, 3, p3dC.Z.ToString());
  82.                 }
  83.                 btr.AppendEntity(myTable);
  84.                 trans.AddNewlyCreatedDBObject(myTable, true);
  85.                 trans.Commit();
  86.             }
  87.             catch (System.Exception ex)
  88.             {
  89.                 Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("输入的比例尺有误,请重新输入"+ ex.Message.ToString());
  90.             }
  91.             finally
  92.             {
  93.                 trans.Dispose();
  94.             }
  95.         }
  96.         static private Point3dCollection GetPLPoint(ObjectId PLid)//并非真正的3d集合,Z如果是1的话表示此点是圆弧的中点
  97.         {
  98.             Point3dCollection p3dCollection = new Point3dCollection();
  99.             Transaction trans = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction();
  100.             using (trans)
  101.             {
  102.                 DBObject obj = trans.GetObject(PLid, OpenMode.ForRead);
  103.                 if (obj.GetType().Name == "Polyline"/*此语句可获得所获取对象obj的类型,如Polyline,Arc,Circle等。*/)
  104.                 {
  105.                     Polyline PL = obj as Polyline;
  106.                     int vn = PL.NumberOfVertices;
  107.                     for (int i = 0; i < vn; i++)
  108.                     {
  109.                         double vBulge = PL.GetBulgeAt(i);
  110.                         if (vBulge != 0)
  111.                         {
  112.                             p3dCollection.Add(PL.GetPoint3dAt(i));
  113.                             double len0 = PL.GetDistAtPoint(PL.GetPoint3dAt(i));
  114.                             double len1 = PL.GetDistAtPoint(PL.GetPoint3dAt(i + 1));
  115.                             double midlen = (len0 + len1) / 2;
  116.                             Point3d midP3d = PL.GetPointAtDist(midlen);
  117.                             Point3d m = new Point3d(midP3d.X, midP3d.Y, 1);
  118.                             p3dCollection.Add(m);
  119.                         }
  120.                         else
  121.                         {
  122.                             p3dCollection.Add(PL.GetPoint3dAt(i));
  123.                         }
  124.                     }
  125.                 }
  126.                 trans.Commit();
  127.                 trans.Dispose();
  128.                 return p3dCollection;
  129.             }
  130.         }
  131.         [CommandMethod("zbb")]
  132.         public void CreateVertexTable()
  133.         {
  134.             Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
  135.             PromptEntityResult per = ed.GetEntity("\n请选择多段线");
  136.             Point3dCollection p3dCo = GetPLPoint(per.ObjectId);
  137.             if (per.Status != PromptStatus.OK)
  138.             {
  139.                 ed.WriteMessage("\n选择选段错误");
  140.             }
  141.             for (int i = 0; i < p3dCo.Count; i++)
  142.             {
  143.                 Point3d point3dd = p3dCo;
  144.                 ed.WriteMessage("\n" + point3dd.ToString());
  145.             }
  146.             Point3d p3d;
  147.             PromptPointOptions prPointOptions = new PromptPointOptions("\n请选择表格插入点:");
  148.             PromptPointResult prPointRes = ed.GetPoint(prPointOptions);
  149.             if (prPointRes.Status == PromptStatus.OK)
  150.             {
  151.                 p3d = prPointRes.Value;
  152.             }

  153.             PromptStringOptions pso = new PromptStringOptions("\n请输入比例尺:");
  154.             PromptResult prScale = ed.GetString(pso);
  155.             string strScale = prScale.StringResult.ToString();
  156.             if (prScale.Status != PromptStatus.OK)
  157.             {
  158.                 ed.WriteMessage("\n输入比例尺错误");
  159.             }

  160.             PromptKeywordOptions opt = new PromptKeywordOptions("\n选择小数位数[三位(3)]<两位(2)>");
  161.             opt.Keywords.Add("3");
  162.             opt.Keywords.Add("2");
  163.             PromptResult result = ed.GetKeywords(opt);
  164.             if (result.Status == PromptStatus.OK)
  165.             {
  166.                 switch (result.StringResult)
  167.                 {
  168.                     case "3":
  169.                         CreateTable(p3dCo, strScale, p3d, 3);
  170.                         break;
  171.                     case "2":
  172.                         CreateTable(p3dCo, strScale, p3d, 2);
  173.                         break;
  174.                 }
  175.             }
  176.         }
  177.     }
  178. }


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 2471个

财富等级: 金玉满堂

发表于 2017-8-9 17:13:27 | 显示全部楼层
谢谢!!!!!!!!!!!!!!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-17 20:37 , Processed in 0.164647 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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