当前位置: 首页 > news >正文

Json在扩展属性xdata中的应用实例——cad 二次开发c#

以下是一个使用AutoCAD C#.NET API实现你需求的示例代码,代码实现了提示用户选择一个实体,将一些字符串变量及其对应的值组成JSON格式数据存储到实体的扩展数据(XData)中,并在弹出窗口中显示该实体的所有扩展数据信息。

效果如下:

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

public class AcadXDataSample
{
    [Autodesk.AutoCAD.Runtime.CommandMethod("xx")]
    
    public void Josn设置XDATA()
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        Editor ed = doc.Editor;

        // 提示用户选择一个实体
        PromptEntityOptions promptEntityOptions = new PromptEntityOptions("\n请选择一个实体: ");
        PromptEntityResult promptEntityResult = ed.GetEntity(promptEntityOptions);
        if (promptEntityResult.Status != PromptStatus.OK)
        {
            return;
        }
        // 定义数据键值对
        Dictionary<string, string> dataDict = new Dictionary<string, string>
        {
            { "权利人", "XX公司" },
            { "性质", "集体" },
            { "面积", "100㎡" },
            { "联系电话", "66-6666" }
        };

        string jsonData = JsonConvert.SerializeObject(dataDict);
        string regAppName = "[土地登记卡]";

        // 注册应用程序名称(保持不变)
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            RegAppTable regAppTable = trans.GetObject(db.RegAppTableId, OpenMode.ForRead) as RegAppTable;
            if (!regAppTable.Has(regAppName))
            {
                regAppTable.UpgradeOpen();
                RegAppTableRecord regAppRecord = new RegAppTableRecord();
                regAppRecord.Name = regAppName;
                regAppTable.Add(regAppRecord);
                trans.AddNewlyCreatedDBObject(regAppRecord, true);
            }
            trans.Commit();
        }

        // 写入XData
        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            try
            {
                Entity entity = trans.GetObject(promptEntityResult.ObjectId, OpenMode.ForWrite) as Entity;
                if (entity != null && !entity.IsErased && entity.IsWriteEnabled)
                {
                    ResultBuffer rb = new ResultBuffer(
                        new TypedValue((int)DxfCode.ExtendedDataRegAppName, regAppName), // 组码1001
                        new TypedValue((int)DxfCode.ExtendedDataAsciiString, jsonData)   // 组码1000
                    );
                    entity.XData = rb;
                    trans.Commit();
                    ed.WriteMessage("\n扩展数据已成功写入实体。");
                }
                else
                {
                    MessageBox.Show("实体不可写或已被删除。");
                    trans.Abort();
                }
            }
            catch (Exception ex)
            {
                trans.Abort();
                MessageBox.Show($"存储扩展数据时出错: {ex.Message}");
            }
        }

        

        
    }
    [CommandMethod("xxx")]
    public void 显示XDATA()
    {
        Document doc = Application.DocumentManager.MdiActiveDocument;
        Database db = doc.Database;
        Editor ed = doc.Editor;

        PromptEntityOptions promptEntityOptions = new PromptEntityOptions("\n请选择一个实体: ");
        PromptEntityResult promptEntityResult = ed.GetEntity(promptEntityOptions);
        if (promptEntityResult.Status != PromptStatus.OK) return;

        using (Transaction trans = db.TransactionManager.StartTransaction())
        {
            try
            {
                Entity entity = trans.GetObject(promptEntityResult.ObjectId, OpenMode.ForRead) as Entity;
                if (entity != null && entity.XData != null)
                {
                    StringBuilder sb = new StringBuilder();
                    //sb.AppendLine("实体的扩展数据信息:");

                    foreach (TypedValue tv in entity.XData)
                    {
                        // 处理(组码不是1000)的扩展数据
                        if (tv.TypeCode != (int)DxfCode.ExtendedDataAsciiString)
                        {
                            sb.AppendLine($"{tv.Value}\n");
                            //sb.AppendLine($"类型码: {tv.TypeCode}, 原始值: {tv.Value}");
                        }
                            // 仅针对 ASCII 字符串(组码1000)尝试解析JSON
                        if (tv.TypeCode == (int)DxfCode.ExtendedDataAsciiString)
                        {
                            //sb.AppendLine($"类型码: {tv.TypeCode}");
                            string stringValue = tv.Value.ToString();

                            // 尝试解析JSON
                            bool isJson = false;
                            try
                            {
                                var dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(stringValue);
                                if (dict != null && dict.Count > 0)
                                {
                                    isJson = true;
                                    //sb.AppendLine("解析为JSON:");
                                    foreach (var item in dict)
                                    {
                                        sb.AppendLine($"{item.Key}:{item.Value}");
                                    }
                                }
                            }
                            catch { /* 忽略解析错误 */ }

                            // 非JSON的纯文本直接显示
                            if (!isJson)
                            {
                                sb.AppendLine("文本内容:");
                                sb.AppendLine($"  {stringValue}");
                            }
                        }
                    }

                    // 显示结果
                    string result = sb.ToString();
                    MessageBox.Show(result, "实体扩展数据信息");
                    ed.WriteMessage("\n" + result);
                }
                trans.Commit();
            }
            catch (Exception ex)
            {
                trans.Abort();
                string errorMsg = $"读取扩展数据时出错: {ex.Message}";
                MessageBox.Show(errorMsg);
                ed.WriteMessage("\n" + errorMsg);
            }
        }
    }
    [CommandMethod("scxx")]
    public void 删除XDATA()
    {
       
    }
    [CommandMethod("scsy")]
    public void 删除所有XDATA()
    {
        
    }
}

 

 

 

 

相关文章:

  • python每日十题(9)
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(11)
  • AI小白的第七天:必要的数学知识(概率)
  • Netty实现SCPI协议通信
  • 淘宝API关键词接口详解(实战案例)
  • CMS迁移中SEO优化整合步骤详解
  • Maven 多模块项目(如微服务架构)中,父 POM(最外层) 和 子模块 POM(具体业务模块)的区别和联系
  • linux_权限
  • 开启健康养生,拥抱活力生活
  • LabVIEW远程控制通讯接口
  • 设计一个基于机器学习的光伏发电功率预测模型,以Python和Scikit - learn库为例
  • C++|面试准备二(常考)
  • MySQL海量表增加字段
  • 抽象代数:群论
  • MySQL 慢查询日志开启与问题排查指南
  • aws S3利用lambda edge实现图片缩放、质量转换等常规图片处理功能
  • qiankun微前端主应用给子应用传组件
  • C++17和C++20引入的新特性
  • 【CC2530 教程 一】lAR Embedded Workbench创建CC2530基础工程
  • 数据结构--二叉排序树
  • 多品牌网站建设/做网站建设公司
  • 一个网站需要几个人/百度站长平台账号购买
  • wordpress网站数据迁移/seo文章是什么意思
  • 铜仁 网站开发/关键词调词平台
  • 多语言网站难做么/重庆网站
  • 关于微网站策划ppt怎么做/最好用的搜索引擎