Json的应用实例——cad 二次开发c#

news2025/3/25 22:47:28

以下是一个使用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.coloradmin.cn/o/2319960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费送源码:Java+springboot+MySQL 房屋租赁系统小程序的设计与实现 计算机毕业设计原创定制

目 录 摘要 1 1 绪论 1 1.1选题意义 1 1.2开发现状 1 1.3springboot框架介绍 1 1.4论文结构与章节安排 1 2 房屋租赁系统小程序系统分析 3 2.1 可行性分析 3 2.1.1 技术可行性分析 3 2.1.2 经济可行性分析 3 2.1.3 法律可行性分析 3 2.2 系统功能分析 3 2.2.1 功…

个人学习编程(3-22) leetcode刷题

连续子数组&#xff1a;&#xff08;难&#xff09; 示例 1: 输入: nums [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。 示例 2: 输入: nums [0,1,0] 输出: 2 说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。 需要理解的知识&a…

基于python+django的酒店预定网站-酒店管理系统源码+运行步骤+课程学习

该系统是基于pythondjango开发的酒店预定管理系统。适用场景&#xff1a;大学生、课程作业、毕业设计。学习过程中&#xff0c;如遇问题可在github给作者留言。共同学习技术 演示地址 前台地址&#xff1a; http://hotel.gitapp.cn 后台地址&#xff1a; http://hotel.gitapp…

Spring 6: 3容器-Ioc

3、容器&#xff1a;IoC IoC 是 Inversion of Control 的简写&#xff0c;译为“控制反转”&#xff0c;它不是一门技术&#xff0c;而是一种设计思想&#xff0c;是一个重要的面向对象编程法则&#xff0c;能够指导我们如何设计出松耦合、更优良的程序。 Spring 通过 IoC 容…

【漫话机器学习系列】154.岭回归(Ridge Regression)

岭回归&#xff08;Ridge Regression&#xff09;详解 1. 引言 岭回归&#xff08;Ridge Regression&#xff09;是一种改进的线性回归方法&#xff0c;它通过引入正则化项来解决普通最小二乘法&#xff08;OLS, Ordinary Least Squares&#xff09;可能遇到的多重共线性问题…

wsl2配置xv6全解(包括22.04Jammy)

文章目录 获取xv6源代码Ubuntu20.04 Version安装指令成功测试参考MIT2021年官方文档 24.04 Version安装指令成功测试参考MIT2024年官方文档 Ubuntu 22.04没有官方文档&#xff1f; 配置大体流程1. 卸载原本qemu&#xff08;如果之前安装了&#xff09;2. clone qemu官方源代码&…

并查集——108. 冗余连接

108. 冗余连接 题目描述 有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图),如图: 现在在这棵树上的基础上,添加一条边(依然是n个节点,但有n条边),使这个图变成了有环图,如图: 先请你找出冗余边,删除后…

初识XXL-JOB分布式任务调度

XXL-JOB架构分析 设计思想 将调度行为抽象形成"调度中心"公共平台&#xff0c;而平台自身并不承担业务逻辑&#xff0c;"调度中心"负责发起调度请求。 将任务抽象成分散的JobHandler&#xff0c;交由"执行器"统一管理&#xff0c;"执行器…

【数据结构进阶】位图

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;数据结构 目录 前言 一、位图的概念与结构 二、位图的实现 1. 结构定义 2. 构造函数 3. 三大接口实现 set unset test 总代码 4. 测试 三、 标准库的…

[极客大挑战 2019]BabySQL—3.20BUUCTF练习day4(3)

[极客大挑战 2019]BabySQL-3.20BUUCTF练习day4(3) 做题过程 打开是以下页面&#xff08;前几天有它的第一版和第二版出现&#xff09;输入1’ 回显以下内容&#xff08;还是字符型以单引号闭合&#xff0c;因为有报错信息回显&#xff09; 输入1 order by 4%23回显成这个 被过…

JVM 学习前置知识

JVM 学习前置知识 Java 开发环境层次结构解析 下图展示了 Java 开发环境的层级关系及其核心组件&#xff0c;从底层操作系统到上层开发工具&#xff0c;逐步构建完整的开发与运行环境&#xff1a; 1. 操作系统&#xff08;Windows, MacOS, Linux, Solaris&#xff09; 作用&…

数智读书笔记系列021《大数据医疗》:探索医疗行业的智能变革

一、书籍介绍 《大数据医疗》由徐曼、沈江、余海燕合著&#xff0c;由机械工业出版社出版 。徐曼是南开大学商学院副教授&#xff0c;在大数据驱动的智能决策研究领域颇有建树&#xff0c;尤其在大数据驱动的医疗与健康决策方面有着深入研究&#xff0c;曾获天津优秀博士论文、…

解决python配置文件类configparser.ConfigParser,插入、读取数据,自动转为小写的问题

配置类 [Section1] Key_AAA Value[Section2] AnotherKey Value默认情况下&#xff0c;ConfigParser会将ini配置文件中的KEY&#xff0c;转为小写。 重载后配置类&#xff1a; 继承类从configparser.ConfigParser改为configparser.RawConfigParser重载方法optionxform&#…

什么是 BA ?BA怎么样?BA和BI是什么关系?

前几天有朋友在评论区提到了BA这个角色&#xff0c;具体是干什么的&#xff0c;我大概来说一下。 什么是BA BA 英文的全称是Business Analyst&#xff0c;从字面上意思就是商业分析师&#xff0c;做过商业智能BI项目的应该比较了解。实际上以我个人的经验&#xff0c;BA 的角…

Jmeter旧版本如何下载

1.Jmeter最新版本下载位置 https://jmeter.apache.org/download_jmeter.cgi2.Jmeter旧版本下载位置 https://archive.apache.org/dist/jmeter/binaries稳定版本&#xff1a;5.4.1

Python帕累托图(Pareto Chart): 从数据排序到决策优化

帕累托图&#xff08;Pareto Chart&#xff09;是一种基于80/20法则的经典数据可视化工具&#xff0c;广泛应用于质量管理、项目管理、业务分析等领域。本文将从其原理、构成、实现方法到应用场景进行全面解析&#xff0c;并附Python代码示例。 一、帕累托图的定义与起源 帕累…

Python---数据分析(Pandas六:二维数组DataFrame,DataFrame的创建,DataFrame的属性)

一、 二维数组DataFrame DataFrame 是 Pandas 中的一个表格型的数据结构&#xff0c;包含有多列的数据&#xff0c;每列可以是不同的值类型(数值、字符串、布尔型等)&#xff0c;DataFrame 即有行索引也有列索引&#xff0c;可以被看做是由 Series 组成的字典。 二、DataFrame的…

内网安全-横向移动Kerberos 攻击SPN 扫描WinRMWinRSRDP

1.WinRM&WinRS 条件&#xff1a; 双方开启winrm winrs服务 2008版本以上默认开启&#xff0c;win 7默认关闭 检测使用cs内置端口扫描5985开放情况 进行连接 winrs -r:http://192.168.93.30:5985 -u:administrator -p:Whoami2021 whoami 2.内网-spn shell setspn -T …

深入理解 lt; 和 gt;:HTML 实体转义的核心指南!!!

&#x1f6e1;️ 深入理解 < 和 >&#xff1a;HTML 实体转义的核心指南 &#x1f6e1;️ 在编程和文档编写中&#xff0c;< 和 > 符号无处不在&#xff0c;但它们也是引发语法错误、安全漏洞和渲染混乱的头号元凶&#xff01;&#x1f525; 本文将聚焦 <&#…

红数码影视(RED Digital Cinema)存储卡格式化后的恢复方法

红数码影视(RED Digital Cinema)的摄像机可以生成两种RAW级高清视频文件&#xff0c;一种是R3D&#xff0c;一种是MOV。其中MOV属于苹果(apple)公司的QT视频封装结构&#xff0c;使用的视频编码是Apple ProRes;而R3D则是RED公司自创的RAW视频文件&#xff0c;这种文件解码需要使…