当前位置: 代码迷 >> 综合 >> C#objectarx Cad二次开发绘制直线进行扯旗
  详细解决方案

C#objectarx Cad二次开发绘制直线进行扯旗

热度:9   发布时间:2023-12-17 03:58:20.0

扯旗样式如下,看起来像一个DataTable(本次就使用DATa Table来创建扯旗),前提条件得先获得自己画得那条线


(1)初次尝试:使用DataSystem.Data.DataTable创建Cad得DataTable,创建成功后需要调整单元格宽不然文字会垂直显示,表得位置固定,一直都是左上角,不是我想要得效果,边框线我设置不可见,但是还是可以看得见,单击单元格会出现Cad内部错误直接导致Cad崩溃。

 (2)我就感觉这个可能不得行,我就自己写了一个方法去用System.Data.DataTable创建标注。

  /// <summary>/// /// </summary>/// <param name="tagDt">扯旗DataTable</param>/// <param name="baseline">扯旗绘制的线</param>/// <param name="isTagCName">是否标注列名</param>public static void CreatePullTag(System.Data.DataTable tagDt, MyBaseline baseline, bool isTagCName = true){try{Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.CurrentDocument;Database db = HostApplicationServices.WorkingDatabase;//获取当前的操作数据库using (DocumentLock docLock = doc.LockDocument())//文档锁住using (var tr = Application.DocumentManager.MdiActiveDocument.TransactionManager.StartTransaction()){//图层表LayerTable lt = (LayerTable)tr.GetObject(doc.Database.LayerTableId, OpenMode.ForRead);//块表BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);//块记录BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);MyBasePoint endP;//判断终点X是否小于终点X(判断表格是否颠倒)if (baseline.StartPoint.X < baseline.EndPoint.X){endP = baseline.EndPoint;//终点位置                   }else{//获取表格插入的长度double widthTable = PipeLineNXJOperation.GetInsertPullFlagTableLen(tagDt,isTagCName);//设置表格起点endP = new MyBasePoint(){X = baseline.EndPoint.X - widthTable,Y = baseline.EndPoint.Y,Z = baseline.EndPoint.Z};//设置添加列为FalseisTagCName = false;}//判断是否存在扯旗图层if (!lt.Has("扯旗")){var lyColor = Color.FromColor(System.Windows.Media.Color.FromRgb(255, 255, 255));lt.AddLayer("扯旗", lyColor, tr);CadProjectInfo.LayersName.Add("扯旗");}//垂直线高double height = 1;//水平宽double width = 1;//是否添加列if (isTagCName is true){System.Data.DataRow dr = tagDt.NewRow();List<string> cNames = new List<string>();foreach (System.Data.DataColumn dc in tagDt.Columns){cNames.Add(dc.ColumnName);}dr.ItemArray = cNames.ToArray();//将列数据添加至第一行tagDt.Rows.InsertAt(dr, 0);}//按列添加for (int i = 0; i < tagDt.Columns.Count; i++){height = 1;double max = 0;//遍历所有的行for (int j = tagDt.Rows.Count - 1; j >= 0; j--){DBText text = new DBText();text.TextString = tagDt.Rows[j][i].ToString();//设置DaTable的值//注记位置text.Position = new Point3d(endP.X + width, endP.Y + height, endP.Z);//设置字高text.Height = 1;//设置宽度银子text.WidthFactor = 1;//判断是不是该列最大长度字符串max = max > text.TextString.Length ? max : text.TextString.Length;//设置扯旗图层text.Layer = "扯旗";//插入实体btr.AppendEntity(text);//插入实体tr.AddNewlyCreatedDBObject(text, true);//高+0.5height += text.Height + 0.5;}//宽+ max * 1.5width += max*1.5;}//垂线Line verticalLine = new Line(new Point3d(endP.X, endP.Y, endP.Z), new Point3d(endP.X, endP.Y + height, endP.Z));//设置扯旗图层verticalLine.Layer = "扯旗";//插入实体btr.AppendEntity(verticalLine);//插入实体tr.AddNewlyCreatedDBObject(verticalLine, true);//水平线Line horizontalLine = new Line(new Point3d(endP.X, endP.Y, endP.Z), new Point3d(endP.X + width, endP.Y, endP.Z));//设置扯旗图层horizontalLine.Layer = "扯旗";//插入实体btr.AppendEntity(horizontalLine);//插入实体tr.AddNewlyCreatedDBObject(horizontalLine, true);tr.Commit();}}catch (Exception ex){throw;}}/// <summary>/// 返回表格长度/// </summary>/// <param name="data">DataTable</param>/// <param name="isTagCName">是否标注列</param>public static double GetInsertPullFlagTableLen(System.Data.DataTable data, bool isTagCName){try{double width = 1;System.Data.DataRow dr = data.NewRow();//判断是否添加列名if (isTagCName is true){List<string> cNames = new List<string>();foreach (System.Data.DataColumn dc in data.Columns){cNames.Add(dc.ColumnName);}dr.ItemArray = cNames.ToArray();data.Rows.InsertAt(dr, 0);}for (int i = 0; i < data.Columns.Count; i++){double max = 0;//遍历所有的行for (int j = data.Rows.Count - 1; j >= 0; j--){string text = data.Rows[j][i].ToString();//设置DaTable的值max = max > text.Length ? max : text.Length;}width += max*1.5;}return width;}catch (Exception ex){throw ex;}}

通过这段代码就可以实现DataTable插入

 

步骤:

(1)绘制一条线段

(2)拿到与之相交得实体(方法不一)

  (3)获取相交实体得属性(用户通过配置扯旗标注,这样每个实体标注内容一样,就可以做DataTable了)

(4)将DataTable插入注记如上图所示

          

 

  相关解决方案