为什么这段代码运行的时候点击部件会出现错误?

我运行这段代码的时候,点击部件就会出现
Uncaught TypeError: Cannot read properties of undefined (reading 'position')at VertexEnumerator.js:87:28
这样的错误

const options = {
    env: "AutodeskProduction",
    api: "derivativeV2",
    getAccessToken: (callback) => {
        fetch("http://localhost:8080/api/auth/token")
            .then((response) => response.json())
            .then((json) => {
                const auth = json.access_token;
                callback(auth, 3600);
            });
    },
    language: 'en'

};
Autodesk.Viewing.Initializer(options, () => {
    const urn = "dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6ZmRzaGZqc19mZHNrZmxzal8xMjM0NTY2Ni8lRTQlQkElOTQlRTglQkQlQjQlRTYlOTYlOUMlRTclQkElQkYlRTYlQTglQTElRTUlOUUlOEIlMjB2My5mM2Q";
    let htmlDiv = document.getElementById("MyViewerDiv");
    viewer = new Autodesk.Viewing.GuiViewer3D(htmlDiv);
    viewer.start();
    loadModel(urn);

});
let loadModel = (urn) => {
    return new Promise((resolve, reject) => {
        function onDocumentLoadSuccess(doc) {
            const node = doc.getRoot().getDefaultGeometry();
            viewer.loadDocumentNode(doc, node).then(() => {
                viewer.addEventListener(
                    Autodesk.Viewing.GEOMETRY_LOADED_EVENT,
                    setupModelInteraction
                );
            });
            resolve();
        }
        Autodesk.Viewing.Document.load("urn:" + urn, onDocumentLoadSuccess, reject);
    });
};
const getModelNodeIds = (names, tree) => {
    const nodeIds = {};
    names.forEach(name => {
        nodeIds[`${name}NodeId`] = findNodeIdbyName(name, tree);
    });
    return nodeIds;
};

const setupModelInteraction = () => {
    const partNames = ["T1", "X1", "Z1", "Z2"];
    let tree = viewer.model.getData().instanceTree;
    let nodeIds = getModelNodeIds(partNames, tree);
    console.log(nodeIds)
    setUpPiovt(nodeIds, tree)
}
const setUpPiovt = (nodeIds, tree) => {
    baseRodPivot(nodeIds.T1NodeId, tree)
}


const baseRodPivot = (ID_BaseRod, tree) => {
    let Pivot_BaseRod = new THREE.Mesh(new THREE.BoxGeometry(5, 5, 5), new THREE.MeshBasicMaterial({ color: 0xff0000 }));
    let Position_BaseRod = getFragmentWorldMatrixByNodeId(ID_BaseRod, tree).matrix[0].getPosition().clone();
    Pivot_BaseRod.position.x = Position_BaseRod.x;
    Pivot_BaseRod.position.y = Position_BaseRod.y;
    Pivot_BaseRod.position.z = Position_BaseRod.z;
    viewer.impl.scene.add(Pivot_BaseRod);
}
阅读 1k
avatarAI BotBETA

从你提供的代码和错误信息来看,错误发生在 VertexEnumerator.js 文件的第 87 行,错误信息是 "Cannot read properties of undefined (reading 'position')"。这通常意味着在这一行代码中,你试图访问一个未定义的对象的属性。

错误发生在 getFragmentWorldMatrixByNodeId 函数调用的结果中。看起来你试图从返回的 getFragmentWorldMatrixByNodeId 对象中获取位置信息(getPosition()),但是这个对象可能并未定义,或者没有 getPosition() 方法。

问题可能在于 getFragmentWorldMatrixByNodeId 函数没有正确地返回一个包含 getPosition 方法的对象。你需要检查这个函数的实现以确保它返回的对象具有你期望的属性和方法。

不过,由于你没有提供 getFragmentWorldMatrixByNodeId 函数的代码,我无法给出具体的修复建议。我建议你检查一下这个函数的实现,特别是它如何处理可能导致未定义的情况的输入。例如,如果这个函数依赖于某些必须存在的全局对象或者状态,而这些对象或者状态不存在,那么它可能会返回未定义的结果。

另外,对于这段代码中的异步操作(例如 fetch 请求和 Autodesk.Viewing.Document.load 方法),你需要确保它们都完成了再尝试访问其返回的结果。否则,你可能会试图访问一个还未定义的结果。在你的代码中,这个问题可能发生在 onDocumentLoadSuccess 函数中尝试访问 doc 对象的时候,或者在 loadModel 函数中尝试访问 viewer.loadDocumentNode 的结果的时候。你可以通过在这些函数中添加 .then() 来确保异步操作完成后再执行后续代码。

2 个回答

1.Position_BaseRod 不存在时,赋值必然失败.
2.Position_BaseRod 存在, 但没有position属性 先给position赋值

Pivot_BaseRod.position = {};
Pivot_BaseRod.position.x = Position_BaseRod.x;
Pivot_BaseRod.position.y = Position_BaseRod.y;
Pivot_BaseRod.position.z = Position_BaseRod.z;

经过调试后,我把 viewer.impl.scene.add(Pivot_BaseRod);这句代码删掉,就没有出现这个错误了,具体原因我也不清楚

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题