这里写目录标题

  • 1.前言
  • 2.步骤
  • 3.效果展示
  • 4.代码实现
    • 4.1获取普通块名的代码:
    • 4.2 获取动态块名的代码:

1.前言

获取动态块的块名需要使用AcadEntity类或其派生类的BlockName属性。
但是,由于动态块可以设置一个或多个匿名块定义。
因此,程序返回的是匿名块的名称(以“*U”开头),而不是动态块的真实块名。
会返回如: “*U818” 的结果。

因此需要先获取到匿名块的ObjectId,再通过该ObjectId获取匿名块的BlockTableRecord对象,最后使用BlockTableRecord对象的Name属性获取匿名块的真实块名

2.步骤

如果一个动态块使用了匿名块定义,则需要通过以下步骤获取它的真实块名:

  1. 使用SelectionSet类选择动态块实体,并获取其ObjectId。
  2. 使用ObjectId获取AcDbBlockReference对象,并获取其BlockTableRecord属性的ObjectId。
  3. 使用BlockTableRecord的ObjectId获取BlockTableRecord对象。
  4. 使用BlockTableRecord对象的Name属性获取真实块名。

3.效果展示

4.代码实现

4.1获取普通块名的代码:

说明:使用“获取普通块名的代码”只能获取到动态块的匿名。

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;namespace ClassLibrary
{public class Class{[CommandMethod("GetBlockName")]public void GetBlockName(){Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;Editor ed = doc.Editor;// 选择动态块实体PromptSelectionResult selectionResult = ed.GetSelection();if (selectionResult.Status != PromptStatus.OK)return;// 获取动态块的ObjectIdObjectId dynamicBlockId = selectionResult.Value[0].ObjectId;// 获取动态块的AcDbBlockReference对象using (Transaction tr = db.TransactionManager.StartTransaction()){BlockReference dynamicBlock = tr.GetObject(dynamicBlockId, OpenMode.ForRead) as BlockReference;ed.WriteMessage("\n动态块的块名为:" + dynamicBlock.Name);// 例如返回:"*U818"}}}
}

4.2 获取动态块名的代码:

说明:
可以参考以下代码获取匿名块的真实块名。
使用了进行递归查找


using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;// Demo  获取块的名字
namespace ClassLibrary
{public class Class{[CommandMethod("GetDynamicBlockName")]public void GetDynamicBlockName(){Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;Editor ed = doc.Editor;// 选择动态块实体PromptSelectionResult selectionResult = ed.GetSelection();if (selectionResult.Status != PromptStatus.OK)return;// 获取动态块的ObjectIdObjectId dynamicBlockId = selectionResult.Value[0].ObjectId;// 获取动态块的AcDbBlockReference对象using (Transaction tr = db.TransactionManager.StartTransaction()){BlockReference dynamicBlock = tr.GetObject(dynamicBlockId, OpenMode.ForRead) as BlockReference;if (dynamicBlock == null)return;// 获取匿名块的BlockTableRecord对象及名称BlockTableRecord anonymousBlock = null;string anonymousBlockName = "";if (dynamicBlock.IsDynamicBlock){anonymousBlock = dynamicBlock.DynamicBlockTableRecord.GetObject(OpenMode.ForRead) as BlockTableRecord;anonymousBlockName = anonymousBlock.Name;}else{anonymousBlock = dynamicBlock.BlockTableRecord.GetObject(OpenMode.ForRead) as BlockTableRecord;anonymousBlockName = anonymousBlock.Name;}// 递归查找真实块名string realBlockName = GetRealBlockName(anonymousBlock, tr);ed.WriteMessage("\n动态库的块名为:" + realBlockName);tr.Commit();}}// 递归查找真实块名public string GetRealBlockName(BlockTableRecord btr, Transaction tr){if (btr.IsFromExternalReference){// 如果匿名块在外部引用中,则需要打开外部参照数据库return "匿名块在外部引用中,则需要打开外部参照数据库";}else if (!btr.IsAnonymous){// 如果匿名块不是匿名或是具名块,则返回块名称return btr.Name;}else{// 如果匿名块是匿名块,则继续查找其所属的块表记录foreach (ObjectId ownerId in btr.GetBlockReferenceIds(true, false)){BlockReference br = tr.GetObject(ownerId, OpenMode.ForRead) as BlockReference;if (br != null && br.IsDynamicBlock){BlockTableRecord dynamicBtr = br.DynamicBlockTableRecord.GetObject(OpenMode.ForRead) as BlockTableRecord;return GetRealBlockName(dynamicBtr, tr);}}}return "";}}
}

使用C#对CAD二次开发,获取动态块的块名相关推荐

  1. CAD二次开发获取CAD内所有的大字体SHX字体

    using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.Runtime; using Microsoft.Win32; u ...

  2. CAD二次开发获取输入的关键字 ed.GetKeywords

    Document acDoc = Application.DocumentManager.MdiActiveDocument;Database db = acDoc.Database;Editor e ...

  3. [CAD二次开发]获取CAD内3D块参照的欧拉旋转角,Matrix3d矩阵转欧拉角。

    根据选择块参照生成新的欧拉角相同的块参照 [CommandMethod("ttt")]public void rr(){Document doc = Application.Doc ...

  4. CAD二次开发 Drawjig 动态的改变文字的大小及位置

    在这里插入图片描述

  5. 关于objectArx /CAD二次开发中“属性块”操作

    关于objectArx /CAD二次开发中"属性块"操作 属性块就是在图块上附加一些文字属性(Attribute),这些文字可以非常方便地修改.属性块被广泛应用在工程设计和机械设计 ...

  6. 使用C#中的AutoCAD .NET API对CAD二次开发,获取动态块可见性值

    使用C#中的AutoCAD .NET API对CAD二次开发,获取动态块可见性值 0.效果 1.获取选择集,得到ObjectId 2.将ObjectId转换为BlockReference对象并获取其D ...

  7. 使用C#中的AutoCAD .NET API对CAD二次开发,获取块的属性

    使用C#中的AutoCAD .NET API对CAD二次开发,获取块的属性 /// <summary> /// 获得块对象的所有属性 /// </summary> public ...

  8. CAD 二次开发 图层操作(3)取得指定图层下的所有对象id

    对于CAD二次开发的人来说,可能需要对某一图层下的实体(点,线,面域,块,三维实体)进行不同的操作.下面的方法,即可实现获取指定图层名称下的所有实体ID. 输入参数为图层名称: 返回值为:对象主键集合 ...

  9. c# cad二次开发 ribbon界面 给CAD加个菜单栏

    c# cad二次开发 ribbon界面 给CAD加个菜单栏 using System; using System.Collections.Generic; using System.Text; usi ...

  10. CAD二次开发资料汇总

    欢迎加入建筑信息化开发交流群,获取开发资料 群号:711844216 一.背景 对工程出身的朋友来说,CAD就像一位朋友,常伴吾身,为了提高效率,于是小伙伴门开始尝试CAD二次开发,刚入门,资料去哪找 ...

最新文章

  1. 跨境电商自建站后台系统原型rp_没学历做跨境电商好做吗?虾皮shopee开店没有流水怎么办...
  2. Zookeeper01_必看
  3. jQuery前端教程-张晨光-专题视频课程
  4. P1527 [国家集训队]矩阵乘法
  5. YBTOJ洛谷P1407:稳定婚姻(强连通分量)
  6. 19.CSS background
  7. 坏消息!FCC默许美国ISP在未经批准之情况下出售用户数据!
  8. 在Python数据库连接池中如何创建请求连接的方案
  9. 自定义配置节 Section
  10. PE格式第四讲,数据目录表之导入表,以及IAT表
  11. ubuntu安装使用latex和texmaker--PC端
  12. mysql安装配置jdbc_JDBC环境配置
  13. Mysql索引失效OR语句
  14. 定制石墨烯水溶液-齐岳生物
  15. android 图片画圆,在Android中画圆形图片的几种办法
  16. petalinux(3)——创建APP
  17. Server_虚拟机闲谈;
  18. 网狐内核websocket版开源
  19. Excel LAMBDA入门教程之工作表函数体让Excel实现图灵完备
  20. 写作分析——缓和说教内容

热门文章

  1. Java之词义相似度计算(语义识别、词语情感趋势、词林相似度、拼音相似度、概念相似度、字面相似度)
  2. 关于《Apex》的分析
  3. 本人宣布无限期停止在CSDN更新相关文章
  4. 如何读论文?复现代码?
  5. win7如何设置通电自动开机_教你操作win7系统接通电源电脑自动开机的具体步骤...
  6. 这些普洱茶知识你都知道吗?
  7. Oracle HRMS,PeopleSoft HR,SAP HR区别 主流HR软件对比分析
  8. 基于TP3.2的发送邮箱做找回密码
  9. 如何使用 Python 下载 Youtube 音乐和视频
  10. Python字符与ASCII码的相互转换函数