以编程方式选择对象而不触发 SELECTION_CHANGED_EVENT

问题描述 投票:0回答:1

是否有某种方法可以从内部选择事件侦听器回调中调用

viewer.select([...])
而不触发
Autodesk.Viewing.SELECTION_CHANGED_EVENT

以下代码当前会导致无限循环,因为

viewer.select(...)
会触发
Autodesk.Viewing.SELECTION_CHANGED_EVENT
SetTimeout(...)
调用只是为了防止调用堆栈溢出。

viewer.addEventListener(Autodesk.Viewing.SELECTION_CHANGED_EVENT, () => {
    setTimeout(
        () =>
            viewer.select(
                [
                    ...new Set([
                        ...itemsThatShouldRemainSelected,
                        ...viewer.getSelection(),
                    ]),
                ],
                undefined,
                -1,
            ),
        100,
    );
    console.log('SELECTION_CHANGED_EVENT');
});
autodesk-forge autodesk-viewer
1个回答
0
投票

我也有这样的案例。

  • 我们想要预定义的选择集。例如选择所有门,选择前门...

  • 我们希望用户能够从这些集合中进行选择,并通过

    viewer.select()
    功能让它们在表格中突出显示,同时仍然允许通过查看器本身进行选择

  • 每次突出显示查看器中的新对象时,我们都希望获取存储在外部数据库中的一些附加信息

  • 棘手部分:由于我们的应用程序的工作方式,当从选择集进行操作时,我们必须首先查找匹配的viewerIds/dbIds,然后再将它们添加到通过

    viewer.select()
    突出显示的选定查看器项目中。同时,通过查看器直接选择的项目需要使用viewerIds/dbIds来查找相关数据(相反的操作)。这是通过
    SELECTION_CHANGED_EVENT
    处理程序处理的。

  • 问题是调用

    viewer.select()
    函数总是会触发
    SELECTION_CHANGE_EVENT
    。因此,我们最终不得不执行更多额外的逻辑来确定触发事件的来源。最好是有一种方法可以调用
    viewer.select()
    ,同时防止
    SELECTION_CHANGE_EVENT
    。这样的事情可能吗?

亲切的问候

© www.soinside.com 2019 - 2024. All rights reserved.