Autodesk Forge自定义扩展控制面板无法连接Revit模型求助
从你提供的代码片段和功能描述来看,控制面板失效大概率是模型加载时机、上下文引用、方法缺失或逻辑错误导致的,以下是具体问题点和修复方案:
1. 模型加载时机错误
构造函数中直接获取this.viewer.model.getData().instanceTree,但扩展加载时模型可能还未完成加载,此时viewer.model可能为null,instanceTree也未初始化,会直接抛出错误。
修复方案:
移除构造函数中对instanceTree的赋值,在load方法中监听模型加载事件,待模型就绪后再获取instanceTree:
constructor(viewer, options) { super(viewer, options); this.viewer = viewer; this.tree = null; // 先初始化为null this.defaultState = null; // 绑定方法保持不变 this.customize = this.customize.bind(this); this.createUI = this.createUI.bind(this); this.setTransformation = this.setTransformation.bind(this); this.getFragmentWorldMatrixByNodeId = this.getFragmentWorldMatrixByNodeId.bind(this); this.assignTransformations = this.assignTransformations.bind(this); this.findNodeIdbyName = this.findNodeIdbyName.bind(this); } load() { console.log('RobotExtension is loaded!'); this.createUI(); // 监听模型加载完成事件 this.viewer.addEventListener(Autodesk.Viewing.MODEL_LOADED_EVENT, () => { this.tree = this.viewer.model.getData().instanceTree; this.setTransformation(); // 模型就绪后再执行变换逻辑 }); return true; }
2. 全局viewer引用错误
代码中viewer.impl.scene.add(Pivot_BaseRod15);使用了全局viewer变量,而非类实例中的this.viewer,如果全局环境中没有该变量,会抛出viewer is not defined错误。
修复方案:
将所有全局viewer替换为this.viewer:
this.viewer.impl.scene.add(Pivot_BaseRod15);
3. 节点ID重复赋值
你将ID_BaseRod和ID_LowerArmBody都设为4806,这会导致两个变量指向同一个节点,逻辑上完全错误,后续变换会出现异常。
修复方案:
修正为正确的节点ID,比如:
let ID_BaseRod = 4806; let ID_LowerArmBody = 4807; // 替换为实际的LowerArmBody节点ID
4. getFragmentWorldMatrixByNodeId方法缺失
代码中调用了this.getFragmentWorldMatrixByNodeId但未提供实现,若该方法逻辑错误(比如未正确获取矩阵、返回值格式不对),会导致matrix[0]无法读取的错误。
参考实现:
如果你的方法是获取节点的世界矩阵,可以参考以下实现:
getFragmentWorldMatrixByNodeId(nodeId) { const fragIds = []; this.tree.enumNodeFragments(nodeId, (fragId) => fragIds.push(fragId)); const matrices = fragIds.map(fragId => { const frag = this.viewer.model.getFragmentList().getFragmentProxy(fragId); frag.updateAnimTransform(); const matrix = new THREE.Matrix4(); frag.getWorldMatrix(matrix); return matrix; }); return { matrix: matrices }; }
5. 未等待几何体加载完成
即使模型加载完成,几何体可能还未完全解析,此时获取片段矩阵也会出错,建议监听Autodesk.Viewing.GEOMETRY_LOADED_EVENT确保几何体就绪:
调整监听事件:
this.viewer.addEventListener(Autodesk.Viewing.GEOMETRY_LOADED_EVENT, () => { this.tree = this.viewer.model.getData().instanceTree; this.setTransformation(); });
先排查以上几点,若仍有报错,建议提供浏览器控制台的具体错误信息和完整的getFragmentWorldMatrixByNodeId实现,以便进一步定位问题。
内容的提问来源于stack exchange,提问作者Mojgan Rezakhani

