# 如何开发一个工具

Tool是引擎提供的工具基类,这个类提供了丰富的输入事件函数以及工具状态函数,所有的自定义工具都需要继承自这个类。

# 创建一个自定义工具

🌏 必须重载的方法

名称 类型 描述
active public 激活工具
deactivate public 冻结工具

🌏 可选择重载的方法

名称 类型 描述
onPointerDown public 鼠标按下输入事件
onPointerUp public 鼠标抬起输入事件
onPointerMove public 鼠标移动输入事件
onPointerCancel public 指针取消事件
onClick public 鼠标点击输入事件
onDblClick public 鼠标双击输入事件
onWheel public 滚轮输入事件
onKeyDown public 键盘输入按下事件
onKeyUp public 键盘输入抬起事件

下面的代码展示了如何扩展一个工具并使用。首先,我们定义一个“测量”工具类:

import {

    Engine,
    Tool

} from '@tx3d/core';

/**
 * 测量工具
 */
class MeasureTool extends Tool {

    //#region Fields

    // 单点延迟触发
    private _clickTimeId: NodeJS.Timeout;

    // 结果回调
    private onCompleted: any;

    constructor( engine: Engine ) {

        super( engine );

        // 单击延迟触发
		this._clickTimeId = null;

    }

    //#endregion

    //#region  public functions

    /**
     * 激活工具
     *
     * @param {MeasureToolParameters} parameters
     */
    active( parameters: MeasureToolParameters = {} ): void {

        // 激活工具,初始化工具逻辑

    }

    /**
     * 停用工具
     */
    deactivate(): void {
        
        // 释放工具中引用资源等...

    }

    /**
     * 响应‘click’事件
     *
     * @param {PointerEvent} event
     */
    onClick( event: MouseEvent ): void {

		// 取消上次延时未执行的方法
		clearTimeout( this._clickTimeId );

        // 延时执行
		this._clickTimeId = setTimeout( () => {

           // 鼠标单击事件触发后的逻辑, 在此处写,延时执行是因为规避three.js中难以区分双击和单击事件

		}, 250 );

    }

    /**
     * 响应dblclick事件
     *
     * @param {MouseEvent} event
     */
    onDblClick( event: MouseEvent ): void {

        // 鼠标双击输入事件

		// 取消上次延时未执行的方法
		clearTimeout( this._clickTimeId );

    }

    /**
     * 响应‘pointerup’事件
     *
     * @param {PointerEvent} event
     */
    onPointerUp( event: PointerEvent ): void {

        // 鼠标输入抬起事件

    }

    /**
     * 响应‘pointermove’事件
     *
     * @param {PointerEvent} event
     */
    onPointerMove( event: PointerEvent ): void {

       // 鼠标移动时逻辑

    }

    /**
     * 响应‘keydown’事件
     *
     * @param {KeyboardEvent} event
     */
    onKeyDown( event: KeyboardEvent ): void {

        // 键盘输入按下事件

    }

    /**
     * 响应‘keyup’事件
     *
     * @param {KeyboardEvent} event
     */
    onKeyUp( event: KeyboardEvent ): void {

        // 键盘输入抬起事件

    }

    //#endregion

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
Last Updated: 8/23/2022, 4:57:06 PM