2026/3/31 0:17:26
网站建设
项目流程
做黑界头像网站,重庆市工程建设信息网2021,张家港手机网站建设,建设工程教育网校官网还在手动查看CAD块属性#xff1f;这个工具让你一键获取所有块信息#xff01;为什么需要获取块信息#xff1f;在CAD设计中#xff0c;块#xff08;Block#xff09;是重用图形元素的重要方式。但当你需要#xff1a;批量统计图纸中的块分析块的属性信息导出块数据做进…还在手动查看CAD块属性这个工具让你一键获取所有块信息为什么需要获取块信息在CAD设计中块Block是重用图形元素的重要方式。但当你需要批量统计图纸中的块分析块的属性信息导出块数据做进一步处理检查动态块的参数设置传统的手动查看方式效率低下今天分享一个实用的块信息提取工具。功能亮点这个工具能做什么✅选择块获取信息- 交互式选择任意块参照✅通过句柄查找- 用唯一标识快速定位块✅从文件读取- 直接分析DWG文件中的块✅批量获取所有块- 一键获取图纸中所有块信息✅动态属性提取- 专门处理动态块的参数✅可视化操作- 高亮显示、缩放定位核心代码解析1. 选择并获取块信息最常用public async TaskBlockSimpleInfo 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 TaskBlockSimpleInfo 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 TaskListBlockSimpleInfo GetAllBlocksInfoAsync(){ var blocks new ListBlockSimpleInfo(); // 获取模型空间 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:ClassBlockInfoViewer TitleCAD块信息查看器 Height600 Width800 Grid Grid.RowDefinitions RowDefinition HeightAuto/ RowDefinition Height*/ /Grid.RowDefinitions !-- 工具栏 -- StackPanel Grid.Row0 OrientationHorizontal Margin10 Button Content选择块 ClickSelectBlock_Click Width80/ Button Content获取全部 ClickGetAllBlocks_Click Width80/ Button Content高亮显示 ClickHighlightBlock_Click Width80/ Button Content缩放定位 ClickZoomToBlock_Click Width80/ /StackPanel !-- 块信息列表 -- DataGrid Grid.Row1 x:NameBlocksGrid AutoGenerateColumnsFalse 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 TaskListBlockDynamicProperty GetBlockDynamicPropertiesAsync( string blockHandle){ var properties new ListBlockDynamicProperty(); 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二次开发问题评论区留言讨论