CAD 修改扩展属性 (XData)
最编程
2024-03-10 08:05:17
...
提供一个界面,编辑XData并保存。其实这个功能是很多人想要有的,网上的资源却很少,今天我就在此贡献出源码,给新开发人员一点帮助。
代码是在64位WIN10系统、VS2012、AutoCADMap3D2016版本环境,用C#编写的语言。
主程序代码如下:
1 [CommandMethod("EXData", CommandFlags.Modal)] 2 public void EditXData() 3 { 4 ///本功能对实体的xdata进行编辑 5 /// 开发者:问号兄 6 /// 开发时间:2019.08.06 7 Database db =HostApplicationServices.WorkingDatabase; 8 // 1.选中实体 9 PromptEntityOptions peo = new PromptEntityOptions("\n选取实体"); 10 PromptEntityResult per = AcadEditor.GetEntity(peo); 11 if (per.Status != PromptStatus.OK) return; 12 ObjectId entId = per.ObjectId; 13 // 2.读取xdata 14 System.Data.DataTable dtXData=new System.Data.DataTable(); 15 dtXData.Columns.Add("Number"); 16 dtXData.Columns.Add("Code"); 17 dtXData.Columns.Add("Value"); 18 using (Transaction trans = db.TransactionManager.StartTransaction()) 19 { 20 DBObject dbObj = trans.GetObject(entId, OpenMode.ForWrite); 21 //应该遍历注册名 22 RegAppTable appTbl = trans.GetObject(db.RegAppTableId, OpenMode.ForRead) as RegAppTable; 23 DBObject obj = trans.GetObject(entId, OpenMode.ForRead, false) as DBObject; 24 foreach (var appTblRecId in appTbl) 25 { 26 RegAppTableRecord R = 27 trans.GetObject(appTblRecId, OpenMode.ForRead) as RegAppTableRecord; 28 TypedValueList tvl = entId.GetXData(R.Name); 29 if (tvl == null) continue; 30 for (int i = 0; i < tvl.Count(); i++) 31 { 32 DataRow dr = dtXData.NewRow(); 33 dr[0] = i; 34 dr[1] = tvl[i].TypeCode.ToString(); 35 dr[2] = tvl[i].Value.ToString(); 36 dtXData.Rows.Add(dr); 37 } 38 } 39 trans.Commit(); 40 } 41 // 3.弹框显示所有属性 42 FrmEditXData EditXDataForm = new FrmEditXData(); 43 EditXDataForm.dtResult = dtXData; 44 DialogResult EditXDataDialog = EditXDataForm.ShowDialog(); 45 // 4.编辑完成后点保存或退出 46 if (EditXDataDialog == DialogResult.OK) 47 { 48 //重写xdata,下面的循环考虑到有多个regappname 49 dtXData = EditXDataForm.dtResult; 50 for (int i = 0; i < dtXData.Rows.Count; i++) 51 { 52 if (dtXData.Rows[i][1].ToString() == "1001") 53 { 54 TypedValueList xdataTVList = new TypedValueList(); 55 string regAppName = dtXData.Rows[i][2].ToString(); 56 for (int j = i+1; j < dtXData.Rows.Count; j++) 57 { 58 if (dtXData.Rows[j][1].ToString() != "1001") 59 { 60 xdataTVList.Add(Convert.ToInt32(dtXData.Rows[j][1].ToString()), dtXData.Rows[j][2]); 61 } 62 else 63 { 64 i = j - 1; 65 break; 66 } 67 } 68 using (Transaction tr = 69 HostApplicationServices.WorkingDatabase.TransactionManager.StartTransaction()) 70 { 71 entId.AddXData(regAppName, xdataTVList); 72 tr.Commit(); 73 tr.Dispose(); 74 } 75 } 76 } 77 } 78 }
Form中需要插入一个DataGridView,并设置ReadOnly=false,并插入一个button用以执行保存按钮命令。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace PipeSystem { public partial class FrmEditXData : Form { public FrmEditXData() { InitializeComponent(); } public DataTable dtResult { get; set; } private void FrmEditXData_Load(object sender, EventArgs e) { //加载读取到的数据 dgvXData.DataSource = dtResult; dgvXData.Columns[0].ReadOnly = true; dgvXData.Columns[1].ReadOnly = true; for (int i = 0; i < dgvXData.Rows.Count; i++) { if (dgvXData.Rows[i].Cells[1].Value.ToString()=="1001") { dgvXData.Rows[i].Cells[2].ReadOnly = true; } } } private void btnSave_Click(object sender, EventArgs e) { try { DataTable dt = new DataTable(); for (int i = 0; i < dgvXData.Rows.Count; i++) { DataRow dr = dt.NewRow(); dr[0] = dgvXData.Rows[i].Cells[0].Value; dr[1] = dgvXData.Rows[i].Cells[1].Value; dr[2] = dgvXData.Rows[i].Cells[2].Value; dt.Rows.Add(dr); } dtResult = dt; } catch (Exception ex) { Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.Message); } finally { Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\n"); } } } }
需要的朋友可以直接拿到自己的环境编译,毕竟CAD的dll不兼容不同版本,毕竟我自己电脑上就有三个CAD了。
需要另外咨询的请给我留言,本人刚开始用博客园,没看到留言莫怪。或者发送emali到leibinhua2008@163.com咨询。
原文地址:https://www.cnblogs.com/ray-blog/p/11320056.html
推荐阅读