Forge tool handleButtonDown and handleButtonUp functions not getting called

扶醉桌前 提交于 2021-02-10 19:53:57

问题


I was looking at the sample code for the tutorial at https://forge.autodesk.com/blog/custom-window-selection-forge-viewer-part-iii which is located at https://github.com/Autodesk-Forge/forge-rcdb.nodejs/blob/master/src/client/viewer.components/Viewer.Extensions.Dynamic/Viewing.Extension.SelectionWindow/Viewing.Extension.SelectionWindow.Tool.js as well as the documentation at https://developer.autodesk.com/en/docs/viewer/v2/reference/javascript/toolinterface/ --- Most of these functions are getting called properly in my tool such as handleSingleClick, handleMouseMove, handleKeyDown, and so on, but two of them are not getting hit -- handleButtonDown and handleButtonUp. I was using viewer version 3.3.x but I have updated to use 4.0.x thinking that that might help to resolve the problem, but the same issue occurs in both versions. Thanks for any help.


回答1:


The following code block from theAutodesk.Viewing.ToolController#__invokeStack(), _toolStack stands for activated tools in the ToolController, the method stands for callback functions started with handle, i.e. handleSingleClick, handleMouseMove, handleKeyDown, handleButtonDown, handleButtonUp, etc.

for( var n = _toolStack.length;  --n >= 0;  )
{
    var tool = _toolStack[n];

    if( tool[method] && tool[method](arg1, arg2) )
    {
        return true;
    }
}

Based on my experience, if there is a handle function such as handleButtonDown or handleButtonUp executed before your custom tools' and returned true, then your handles will never be called.


Fortunately, Forge Viewer (v3.2) starts invoking a priority mechanism for custom tools registered in ToolController. ToolController will use the priority number to sort the tools in it, and the priority number of each tool is 0 by default. You can override the priority to make your tools be hit before other tools like this way, to add a function getPriority() to return a number greater than 0:

this.getPriority = function() {
   return 100;
};



回答2:


I found out that when using ES6 and the class syntax, extending your tool from Autodesk.Viewing.ToolInterface will prevent the overrides to work properly, probably because it is not implemented using prototype in the viewer source code.

You can simply create a class and implement the methods that are of interest for your tool:

// KO: not working! 
class MyTool extends Autodesk.Viewing.ToolInterface {

     getName () {
         return 'MyTool'
     } 

     getNames () {

         return ['MyTool']
     }   

     handleButtonDown (event, button) {

         return false
     }
}

// OK 
class MyTool {

     getName () {
         return 'MyTool'
     } 

     getNames () {

         return ['MyTool']
     }    

     handleButtonDown (event, button) {

         return false
     }
}


来源:https://stackoverflow.com/questions/49456992/forge-tool-handlebuttondown-and-handlebuttonup-functions-not-getting-called

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!