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");
            }
        }
    }
}

 

转载于:https://www.cnblogs.com/ray-blog/p/11320056.html

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值