news 2026/4/23 15:50:18

【AutoCAD二次开发】一键获取CAD块信息!实用技巧大公开

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【AutoCAD二次开发】一键获取CAD块信息!实用技巧大公开

还在手动查看CAD块属性?这个工具让你一键获取所有块信息!

为什么需要获取块信息?

在CAD设计中,块(Block)是重用图形元素的重要方式。但当你需要:

  • 批量统计图纸中的块

  • 分析块的属性信息

  • 导出块数据做进一步处理

  • 检查动态块的参数设置

传统的手动查看方式效率低下!今天分享一个实用的块信息提取工具。

功能亮点:这个工具能做什么?

选择块获取信息- 交互式选择任意块参照
通过句柄查找- 用唯一标识快速定位块
从文件读取- 直接分析DWG文件中的块
批量获取所有块- 一键获取图纸中所有块信息
动态属性提取- 专门处理动态块的参数
可视化操作- 高亮显示、缩放定位



核心代码解析

1. 选择并获取块信息(最常用)

public async Task<BlockSimpleInfo> SelectAndGetBlockInfoAsync(){ // 创建文档锁定,确保线程安全 using (DocumentLock docLock = doc.LockDocument()) { // 提示用户选择块 var promptOptions = new PromptEntityOptions("\n请选择一个块参照: "); promptOptions.AddAllowedClass(typeof(BlockReference), true); var promptResult = editor.GetEntity(promptOptions); if (promptResult.Status == PromptStatus.OK) { // 获取块参照对象 var blockRef = transaction.GetObject(promptResult.ObjectId, OpenMode.ForRead) as BlockReference; if (blockRef != null) { // 转换为简单信息对象 return ConvertToBlockSimpleInfo(blockRef, transaction); } } }}

注意在选择时必须要用下面代码去文档锁定不然会抛出下面这个异常信息

Autodesk.AutoCAD.Runtime.Exception:“eInvalidInput”

using (DocumentLock docLock = doc.LockDocument())

2. 通过句柄查找块(快速定位)

public async Task<BlockSimpleInfo> GetBlockInfoByHandleAsync(string blockHandle){ // 通过句柄获取对象ID var objectId = GetObjectIdByHandle(blockHandle); if (objectId.IsValid) { var blockRef = transaction.GetObject(objectId, OpenMode.ForRead) as BlockReference; if (blockRef != null) { return ConvertToBlockSimpleInfo(blockRef, transaction); } }}

3. 批量获取所有块信息

public async Task<List<BlockSimpleInfo>> GetAllBlocksInfoAsync(){ var blocks = new List<BlockSimpleInfo>(); // 获取模型空间 var modelSpace = (BlockTableRecord)transaction.GetObject( SymbolUtilityServices.GetBlockModelSpaceId(_currentDocument.Database), OpenMode.ForRead); // 遍历所有实体 foreach (ObjectId objectId in modelSpace) { var entity = transaction.GetObject(objectId, OpenMode.ForRead) as Entity; if (entity is BlockReference blockRef) { var blockInfo = ConvertToBlockSimpleInfo(blockRef, transaction); blocks.Add(blockInfo); } } return blocks;}

信息转换:从块参照到结构数据

private BlockSimpleInfo ConvertToBlockSimpleInfo( BlockReference blockRef, Transaction transaction){ return new BlockSimpleInfo { Id = Guid.NewGuid().ToString(), Name = GetRealBlockName(blockRef, transaction), // 获取真实块名 Handle = blockRef.Handle.ToString(), // 唯一句柄 Layer = blockRef.Layer, // 所在图层 Color = blockRef.Color.ToString(), // 颜色 Position = FormatPosition(blockRef.Position), // 位置坐标 Rotation = ToDegrees(blockRef.Rotation), // 旋转角度 Scale = FormatScale(blockRef.ScaleFactors), // 缩放比例 IsDynamicBlock = blockRef.IsDynamicBlock, // 是否动态块 HasAttributes = blockRef.AttributeCollection.Count > 0 // 是否有属性 };}

这里面BlockSimpleInfo类可以增加别的虎丘参数哦!不局限于实例提供的。


实战演示:创建块信息查看器

步骤1:创建Ribbon按钮

// 在之前Ribbon教程的基础上添加var blockButton = new RibbonButton{ Text = "块信息工具", ShowText = true, Size = RibbonItemSize.Large, CommandHandler = new BlockInfoCommandHandler()};panel.Items.Add(blockButton);

步骤2:创建块信息窗口

<!-- WPF窗口用于显示块信息 --><Window x:Class="BlockInfoViewer" Title="CAD块信息查看器" Height="600" Width="800"> <Grid> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!-- 工具栏 --> <StackPanel Grid.Row="0" Orientation="Horizontal" Margin="10"> <Button Content="选择块" Click="SelectBlock_Click" Width="80"/> <Button Content="获取全部" Click="GetAllBlocks_Click" Width="80"/> <Button Content="高亮显示" Click="HighlightBlock_Click" Width="80"/> <Button Content="缩放定位" Click="ZoomToBlock_Click" Width="80"/> </StackPanel> <!-- 块信息列表 --> <DataGrid Grid.Row="1" x:Name="BlocksGrid" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="名称" Binding="{Binding Name}"/> <DataGridTextColumn Header="图层" Binding="{Binding Layer}"/> <DataGridTextColumn Header="位置" Binding="{Binding Position}"/> <DataGridTextColumn Header="句柄" Binding="{Binding Handle}"/> <DataGridCheckBoxColumn Header="动态块" Binding="{Binding IsDynamicBlock}"/> </DataGrid.Columns> </DataGrid> </Grid></Window>

步骤3:连接CAD与界面

public partial class BlockInfoViewer : Window{ private readonly BlockInfoService _blockService; public BlockInfoViewer() { InitializeComponent(); _blockService = new BlockInfoService(); LoadAllBlocks(); } private async void SelectBlock_Click(object sender, RoutedEventArgs e) { var blockInfo = await _blockService.SelectAndGetBlockInfoAsync(); if (blockInfo != null) { ShowBlockDetails(blockInfo); } } private async void LoadAllBlocks() { var blocks = await _blockService.GetAllBlocksInfoAsync(); BlocksGrid.ItemsSource = blocks; }}



高级功能:动态块属性提取

public async Task<List<BlockDynamicProperty>> GetBlockDynamicPropertiesAsync( string blockHandle){ var properties = new List<BlockDynamicProperty>(); var blockRef = GetBlockByHandle(blockHandle); if (blockRef != null && blockRef.IsDynamicBlock) { // 获取动态块属性集合 var dynamics = blockRef.DynamicBlockReferencePropertyCollection; foreach (DynamicBlockReferenceProperty property in dynamics) { properties.Add(new BlockDynamicProperty { PropertyName = property.PropertyName, Value = property.Value?.ToString() ?? "", Description = property.Description ?? "", ReadOnly = property.ReadOnly, Visible = property.Show, AllowedValues = GetAllowedValues(property) // 获取允许的值 }); } } return properties;}

选择一个块效果图如下哦:



使用技巧

// 在CAD中,选中块后输入LIST命令// 或在程序中:blockRef.Handle.ToString()

技巧2:处理动态块的特殊情况

// 动态块的真实名称在DynamicBlockTableRecord中if (blockRef.IsDynamicBlock){ var btr = transaction.GetObject(blockRef.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord; string realName = btr?.Name ?? blockRef.Name;}

当发现你拿取的块名不对时那说明你拿取了动态块的名称了例如*U3,需要做一下处理才能拿到对应的名称哦!

常见问题解答

Q1:为什么获取不到动态块的原始名称?

原因:动态块使用代理块,需要访问DynamicBlockTableRecord
解决:使用上面提到的GetRealBlockName方法

Q2:如何处理嵌套块?

扩展:可以递归遍历块的BlockTableRecord获取嵌套结构

Q3:如何获取块的几何信息?

扩展:使用blockRef.GeometricExtents获取边界框

总结

通过这个块信息提取工具,你可以:

快速获取- 一键获取图纸中所有块信息
精准查找- 通过句柄或名称定位特定块
深度分析- 解析块的属性和动态参数
可视化操作- 高亮、缩放、导出等实用功能
批量处理- 高效处理大量块数据

有任何CAD二次开发问题,评论区留言讨论! 👇

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 6:32:23

病理IHC抗体的性能验证为何至关重要?

一、何为IHC抗体性能验证及其核心目的&#xff1f;免疫组织化学&#xff08;IHC&#xff09;抗体性能验证&#xff0c;是指通过系统性的实验设计与评估&#xff0c;确认特定抗体试剂在既定实验条件下能否稳定、可靠地检测目标抗原的过程。其核心目的在于确保抗体检测结果的特异…

作者头像 李华
网站建设 2026/4/23 10:43:49

Hsp70抗体在分子伴侣功能研究中能揭示什么?

一、Hsp70蛋白具有怎样的生物学功能与结构特性&#xff1f;Hsp70是一种高度保守的热休克蛋白&#xff0c;广泛存在于从原核生物到真核生物的各类细胞中。该蛋白主要作为分子伴侣参与蛋白质的质量控制&#xff0c;其核心功能包括协助新生肽链的正确折叠、促进错误折叠蛋白的重新…

作者头像 李华
网站建设 2026/4/23 12:20:51

2026 光伏功率预测革命:峰值总差一口气?从太阳几何到 POA 口径——你可能把“辐照定义”搞错了

在新能源大潮下&#xff0c;光伏电站已从分布式接入走向大规模并网&#xff0c;光伏功率预测成为电网调度、市场交易、能源交易结算的核心决策依据。然而一个常见而致命的现象是&#xff1a;预测曲线总体形状看似正常&#xff0c;却在关键峰值处反复偏差巨大——仿佛少了“一口…

作者头像 李华
网站建设 2026/4/23 12:19:27

‌意识上传软件测试:伦理与技术双重挑战

数字永生时代的测试新边疆‌ 意识上传技术&#xff08;Mind Uploading&#xff09;通过将人类意识数字化实现“数字永生”&#xff0c;已从科幻步入现实测试阶段&#xff08;如2025年Neuralink实验&#xff09;。然而&#xff0c;软件系统崩溃——包括数据丢失、黑客攻击或全链…

作者头像 李华
网站建设 2026/4/23 12:23:48

低查重AI教材生成神器!轻松实现AI教材写作,高效又省心

教材编写的繁琐格式问题一直困扰着无数的创作者。我们常常在思考&#xff0c;标题的字体大小、层级该如何安排&#xff1f;参考文献是按照GB/T7714还是各出版机构的独特标准来处理&#xff1f;习题的排版究竟是单栏还是双栏&#xff1f;这些不同的要求让人眼花缭乱&#xff0c;…

作者头像 李华
网站建设 2026/4/23 13:37:53

低查重AI教材编写秘籍大公开!高效完成专业教材生成的实用方法

AI技术助力教材创作新时代 许多教材编写者常常感到遗憾&#xff0c;尽管他们在正文内容上花费了大量心血&#xff0c;但由于缺乏配套资源&#xff0c;最终影响了整体的教学效果。课后练习虽然需要设计分层次的题型&#xff0c;却常常缺乏创新的思路&#xff1b;教学课件希望能…

作者头像 李华