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

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()
    {
        
    }
}

相关文章:

  • 从零开始学可靠消息投递:分布式事务的“最终一致性”方案
  • 独立组网和非独立组网
  • 文章防洗稿隐蔽混淆软件
  • 102.在Vue3中使用OpenLayers实现定位动画(平移-弹性平移-飞行)
  • 梦回杭州...
  • 【一起学Rust | Tauri2.0框架】基于 Rust 与 Tauri 2.0 框架实现全局状态管理
  • 打造更高效的移动远控方案,贝锐向日葵Android主控SDK更新
  • Mac - Cursor 配置 + GPT 4.0/4.5/o1/o3/Deepseek Api 使用
  • 数据结构——第六章:图
  • 力扣算法Hot100——128. 最长连续序列
  • C# WPF编程-TabControl
  • 【Linux网络】手动部署并测试内网穿透
  • AWS AI中几个重要的工具介绍
  • CA 机构如何防止中间人攻击
  • leecode463.岛屿的周长
  • Java利用POI+JFreeChart 实现excel导出数据和图标(折线统计图)
  • Kafka Snappy 压缩异常分析与解决方案
  • C++编译汇编八股总结
  • redis的典型应用 --缓存
  • Spring Boot 与 MyBatis Plus 整合 KWDB 实现 JDBC 数据访问
  • “大型翻车现场”科技满满,黄骅打造现代化港口和沿海新城典范
  • 王征、解宁元、牛恺任西安市副市长
  • 首次采用“顶置主星+侧挂从星”布局,长二丁“1箭12星”发射成功
  • 秦洪看盘|预期改善,或迎来新的增量资金
  • 80后莆田市文旅局长马骏登台与杨宗纬合唱,“演唱会秒变旅游推介会”
  • 来伊份:已下架涉事批次蜜枣粽产品,消费者可获额外补偿,取得实物后进一步分析