提供一個界面,編輯XData並保存。其實這個功能是很多人想要有的,網上的資源卻很少,今天我就在此貢獻出源碼,給新開發人員一點幫助。
主要功能:使用方法,輸入命令,選中一個實體,然后會出“編輯XData”對話框,在DataGridView中顯示XData,並支持對第三列Value值的非RegAppName進行修改。
說明:把第二列Code設置為不可修改,畢竟DXFCode是固定的。對於多個RegAppName也可支持修改
不足:對修改結果不進行邏輯校驗,當出現DXFCode類型的整型時,操作人員加入字符型Value值,可能導致程序出錯。
代碼是在64位WIN10系統、VS2012、AutoCADMap3D2016版本環境,用C#編寫的語言。
需要的朋友可以直接拿到自己的環境編譯,畢竟CAD的dll不兼容不同版本,畢竟我自己電腦上就有三個CAD了。
需要另外咨詢的請給我留言,本人剛開始用博客園,沒看到留言莫怪。或者發送emali到leibinhua2008@163.com咨詢。
主程序代碼如下:
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"); } } } }