C# Cad2016二次开发获取XData信息(二)

该代码段是一个AutoCAD的命令方法(由[CommandMethod]特性标记),用于从选择的实体中获取XData信息。

一、主要步骤如下:

1、获取当前活动的文档并赋值给变量'doc'。

2、获取文档的数据库并赋值给变量'db'。

3、获取文档的编辑器并赋值给变量'ed'。

  //1获取当前激活的文档(活动文档)并将其赋给doc变量。
        Document doc = Application.DocumentManager.MdiActiveDocument; 
        //2 将doc文档的数据库(Database)赋给db变量。
        Database db = doc.Database;
        //3 将doc文档的编辑器(Editor)赋给ed变量。
        Editor ed = doc.Editor;

4、使用PromptEntityOptions类创建实体选择的选项,提示用户选择实体。

5、使用编辑器的GetEntity方法,将选项传递给该方法,并将结果赋给变量'per'

         //4 使用PromptEntityOptions类创建实体选择的选项,提示用户选择实体
        PromptEntityOptions peo = new PromptEntityOptions("\n请选择实体");
        //5 使用编辑器的GetEntity方法,将选项传递给该方法,并将结果赋给变量'per'
        PromptEntityResult per = ed.GetEn
C#中进行AutoCAD二次开发获取打开的地形图的图幅号,需要结合AutoCAD .NET API来实现。AutoCAD提供了丰富的类库和接口,允许开发者通过编程方式访问和操作图形数据。 ### 获取地形图图幅号的基本思路 1. **连接到当前AutoCAD文档** 使用`Application.DocumentManager.MdiActiveDocument`获取当前活动文档,并通过`Database`对象访问图形数据库。 2. **读取图形中的属性或自定义数据** 图幅号通常存储在图形中的某个特定位置,例如块属性(Block Attribute)、扩展数据(XData)或者自定义对象中。可以通过遍历模型空间或图纸空间中的实体来查找相关信息。 3. **解析图幅号信息** 如果图幅号是作为块属性存在,则可以使用`AttributeReference`类来提取;如果是嵌入在图形中的文本内容,则可以通过遍历`DBText`或`MText`对象并匹配关键字来识别。 ### 示例代码:获取模型空间中所有文本对象的内容 以下示例演示如何遍历模型空间中的文本对象,并尝试识别图幅号: ```csharp using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Runtime; public class TerrainMapCommands { [CommandMethod("GetSheetNumber")] public void GetSheetNumber() { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead); foreach (ObjectId objId in btr) { Entity ent = tr.GetObject(objId, OpenMode.ForRead) as Entity; if (ent is DBText textEnt) { string textValue = textEnt.TextString; // 假设图幅号格式为“H48G056072”等类似字符串 if (System.Text.RegularExpressions.Regex.IsMatch(textValue, @"^[A-Z]\d{2}[A-Z]\d{3}\d{3}$")) { ed.WriteMessage($"\n找到图幅号: {textValue}"); } } else if (ent is MText mTextEnt) { string mTextValue = mTextEnt.Contents; if (System.Text.RegularExpressions.Regex.IsMatch(mTextValue, @"^[A-Z]\d{2}[A-Z]\d{3}\d{3}$")) { ed.WriteMessage($"\n找到图幅号: {mTextValue}"); } } } tr.Commit(); } } } ``` ### 示例代码:读取块属性中的图幅号 如果图幅号存储在带有特定标签的块属性中,例如“SHEET_NUMBER”,则可以如下处理: ```csharp if (ent is BlockReference blockRef) { foreach (ObjectId attId in blockRef.AttributeCollection) { AttributeReference attRef = tr.GetObject(attId, OpenMode.ForRead) as AttributeReference; if (attRef.Tag == "SHEET_NUMBER") { ed.WriteMessage($"\n图幅号: {attRef.TextString}"); } } } ``` ### 注意事项 - 上述代码假设图幅号具有固定的命名规则(如正则表达式匹配),实际应用中需根据具体项目规范调整。 - 开发环境应配置AutoCAD .NET API SDK,并确保引用正确的DLL文件(如`acdbmgd.dll`, `acmgd.dll`)。 - 二次开发插件应通过命令注册后加载至AutoCAD中运行。 ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值