作为block reference插入父实体的子实体是否可以被选中并获取数据?
实现方案
块引用(Block Reference)本质是对块定义(Block Definition)的实例化引用,你直观看到的子实体是块定义内的原始元素,父实体(块引用实例)的平移、旋转变换会以矩阵形式叠加到所有内部子元素的空间属性上,选中子实体的核心是处理嵌套的空间坐标映射,具体实现分以下步骤:
1. 开启子实体选择支持
根据你所用的开发平台不同,需要调整选择逻辑,支持穿透块引用选中内部子元素:
- AutoCAD/ZWCAD二次开发场景:设置选择集允许子选择,开启嵌套实体过滤,以.NET API为例:
PromptSelectionOptions selectOpts = new PromptSelectionOptions(); selectOpts.AllowSubSelection = true; selectOpts.AllowDuplicates = false; // 过滤规则限定仅选中嵌套在块内的实体 SelectionFilter filter = new SelectionFilter(new TypedValue[] { new TypedValue((int)DxfCode.Nested, true) }); PromptSelectionResult selectRes = Application.DocumentManager.MdiActiveDocument.Editor.GetSelection(selectOpts, filter);
- 自研引擎/Three.js web 3D场景:修改射线检测(Raycast)逻辑,遇到块引用类型实体时,先将射线乘以块引用的世界逆矩阵,再和块定义内的子实体做相交检测,返回命中的子实体同时携带所属块引用的上下文。示例代码如下:
// 获取父块引用的世界逆矩阵,把射线映射到块定义的局部坐标系 const parentInverseMatrix = parentBlock.matrixWorld.clone().invert(); raycaster.ray.applyMatrix4(parentInverseMatrix); // 和块定义内的子实体做相交检测 const intersectResult = raycaster.intersectObjects(blockDefChildren, false);
2. 提取选中子实体的有效数据
默认拿到的子实体数据是块定义内的原始局部属性,需要结合父块的变换矩阵处理后才能得到和场景显示一致的实际数据:
- 空间类属性(顶点坐标、位置、法向、包围盒等):乘以父块引用的世界变换矩阵,得到全局坐标系下的实际数值
- 非空间类属性(颜色、图层、材质、自定义属性等):如果没有在块引用层做覆写,直接取块定义内子实体的原始属性即可
- 多层嵌套块场景:递归收集每一层父块的变换矩阵,相乘得到复合变换矩阵后再应用到子实体属性上
3. 框选场景适配
如果需要支持框选而非单点选择,需要先将框选的视口范围逆映射到块定义的局部坐标系,再在局部坐标系内做范围相交判断,返回命中的子实体即可。
内容的提问来源于stack exchange,提问作者GrantFeng
相关产品推荐
相关产品推荐

