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

Json的应用实例——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()
    {
        
    }
}


http://www.kler.cn/a/595761.html

相关文章:

  • 最近比突出的DeepSeek与ChatGPT的详细比较分析
  • 【k8s】利用Kubernetes卷快照实现高效的备份和恢复
  • C++具名转型的功能和用途
  • 基于SpringBoot的“校园招聘网站”的设计与实现(源码+数据库+文档+PPT)
  • 使用spring-ai-ollama访问本地化部署DeepSeek
  • 企业信息化的“双螺旋”——IT治理和数据治理
  • MySQL0基础学习记录-下载与安装
  • 光影香江聚四海,蓝陵科技扬帆数字内容新蓝海
  • 充分了解深度学习
  • Jsonpath使用
  • 游戏MOD伴随盗号风险,仿冒网站借“风灵月影”窃密【火绒企业版V2.0】
  • 【linux】防止SSD掉盘导致无法 reboot 软重启
  • Mysql表的简单操作
  • 嵌入式开发之STM32学习笔记day07
  • 基于RAGFlow本地部署DeepSeek-R1大模型与知识库:从配置到应用的全流程解析
  • UR5e机器人位姿
  • fpga系列 HDL:tips 状态机状态转换时BitOut会存在未知状态的输出的解决
  • JAVA泛型擦除原理
  • Three.js中的加载器与资源管理:构建丰富3D场景的关键
  • 清晰易懂的Maven安装教程(含自定义依赖包位置)