如何获取Forge Viewer中fitToView()所需的目标元素dbId?
在Forge Viewer中定位2D图纸的特定文本(如房间名称)
2D图纸中的文本元素通常分为**纯文本对象(Text Entity)和块属性(Block Attribute)**两类,要实现精准定位,需针对不同类型调整dbId的获取逻辑,以下是具体方案:
1. 用search()方法精准匹配目标文本
之前search()未生效可能是未指定搜索对象类型,导致匹配到非文本元素。需明确限定搜索范围为Text和BlockAttribute,再筛选目标内容:
viewer.search('房间A', (dbIds) => { if (dbIds.length === 0) return; // 批量获取属性,验证是否为目标文本元素 viewer.getBulkProperties(dbIds, ['EntityType', 'Text', 'AttributeValue'], (propsList) => { const targetDbIds = propsList.filter(item => // 匹配纯文本或块属性值 item.EntityType === 'Text' || (item.AttributeValue && item.AttributeValue === '房间A') ).map(item => item.dbId); if (targetDbIds.length > 0) { viewer.fitToView(targetDbIds); // 可选:高亮定位元素 viewer.select(targetDbIds); } } ); }, (err) => console.error('搜索失败:', err), // 指定仅搜索文本和块属性类型 ['Text', 'BlockAttribute'] );
2. 遍历所有文本元素筛选目标
若search()无法满足需求,可直接遍历所有文本类元素,逐个匹配内容:
// 获取模型数据扩展 const dataExt = viewer.getExtension('Autodesk.Viewing.Data'); // 查询所有文本和块属性对象 dataExt.queryObjects({ type: ['Text', 'BlockAttribute'] }, (result) => { viewer.getBulkProperties(result.dbIds, ['Text', 'AttributeValue'], (propsList) => { const targetDbId = propsList.find(item => item.Text === '房间A' || item.AttributeValue === '房间A' )?.dbId; if (targetDbId) { // 强制适配视图,确保定位生效 viewer.navigation.fitView([targetDbId]); } } ); } );
3. 排查fitToView不生效的常见原因
- 元素不可见:调用
viewer.isVisible(dbId)检查,若元素被图层隐藏,需先通过viewer.showLayer(layerId)显示对应图层。 - 模型未完全加载:需等待模型几何加载完成后再执行定位,监听
GEOMETRY_LOADED_EVENT事件:viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, () => { // 这里执行搜索和定位逻辑 }); - 嵌套块元素:若文本嵌套在块(Block)内,需先识别块对象,再遍历块内属性:
viewer.getProperties(dbId, (props) => { if (props.isBlock) { // 遍历块内的属性元素 dataExt.queryObjects({ parentId: dbId, type: 'BlockAttribute' }, (blockAttrs) => { // 后续筛选逻辑同上 }); } });
内容的提问来源于stack exchange,提问作者YusukeNomura
相关产品推荐
相关产品推荐

