CAD修改擴展屬性(XData)


提供一個界面,編輯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");
            }
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM