model-action 1.0.24 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +13 -4
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -4
- package/dist/index.js.map +1 -0
- package/dist/modules/Action.d.ts +5 -14
- package/dist/modules/Action.d.ts.map +1 -0
- package/dist/modules/Action.js +2 -10
- package/dist/modules/Action.js.map +1 -0
- package/dist/modules/Animation.d.ts +59 -0
- package/dist/modules/Animation.d.ts.map +1 -0
- package/dist/modules/Animation.js +117 -0
- package/dist/modules/Animation.js.map +1 -0
- package/dist/modules/Building.d.ts +28 -0
- package/dist/modules/Building.d.ts.map +1 -0
- package/dist/modules/Building.js +70 -0
- package/dist/modules/Building.js.map +1 -0
- package/dist/modules/Camera.d.ts +37 -0
- package/dist/modules/Camera.d.ts.map +1 -0
- package/dist/modules/Camera.js +110 -0
- package/dist/modules/Camera.js.map +1 -0
- package/dist/modules/CameraView.d.ts +37 -0
- package/dist/modules/CameraView.d.ts.map +1 -0
- package/dist/modules/CameraView.js +110 -0
- package/dist/modules/CameraView.js.map +1 -0
- package/dist/modules/Effect.d.ts +37 -0
- package/dist/modules/Effect.d.ts.map +1 -0
- package/dist/modules/Effect.js +72 -0
- package/dist/modules/Effect.js.map +1 -0
- package/dist/modules/Environment.d.ts +22 -0
- package/dist/modules/Environment.d.ts.map +1 -0
- package/dist/modules/Environment.js +53 -0
- package/dist/modules/Environment.js.map +1 -0
- package/dist/modules/Focus.d.ts +12 -0
- package/dist/modules/Focus.d.ts.map +1 -0
- package/dist/modules/Focus.js +22 -0
- package/dist/modules/Focus.js.map +1 -0
- package/dist/modules/GameMode.d.ts +17 -0
- package/dist/modules/GameMode.d.ts.map +1 -0
- package/dist/modules/GameMode.js +36 -0
- package/dist/modules/GameMode.js.map +1 -0
- package/dist/modules/Init.d.ts +28 -0
- package/dist/modules/Init.d.ts.map +1 -0
- package/dist/modules/Init.js +81 -0
- package/dist/modules/Init.js.map +1 -0
- package/dist/modules/Path.d.ts +76 -0
- package/dist/modules/Path.d.ts.map +1 -0
- package/dist/modules/Path.js +155 -0
- package/dist/modules/Path.js.map +1 -0
- package/dist/modules/Poi.d.ts +45 -62
- package/dist/modules/Poi.d.ts.map +1 -0
- package/dist/modules/Poi.js +117 -88
- package/dist/modules/Poi.js.map +1 -0
- package/dist/modules/Routing.d.ts +23 -31
- package/dist/modules/Routing.d.ts.map +1 -0
- package/dist/modules/Routing.js +62 -63
- package/dist/modules/Routing.js.map +1 -0
- package/dist/modules/Scene.d.ts +12 -15
- package/dist/modules/Scene.d.ts.map +1 -0
- package/dist/modules/Scene.js +26 -15
- package/dist/modules/Scene.js.map +1 -0
- package/dist/modules/Status.d.ts +59 -0
- package/dist/modules/Status.d.ts.map +1 -0
- package/dist/modules/Status.js +91 -0
- package/dist/modules/Status.js.map +1 -0
- package/dist/modules/Track.d.ts +65 -22
- package/dist/modules/Track.d.ts.map +1 -0
- package/dist/modules/Track.js +128 -20
- package/dist/modules/Track.js.map +1 -0
- package/dist/modules/VideoFusion.d.ts +1 -0
- package/dist/modules/VideoFusion.d.ts.map +1 -0
- package/dist/modules/VideoFusion.js +1 -0
- package/dist/modules/VideoFusion.js.map +1 -0
- package/dist/modules/Window.d.ts +1 -0
- package/dist/modules/Window.d.ts.map +1 -0
- package/dist/modules/Window.js +1 -0
- package/dist/modules/Window.js.map +1 -0
- package/dist/peer-stream.d.ts +123 -0
- package/dist/peer-stream.d.ts.map +1 -0
- package/dist/peer-stream.js +852 -0
- package/dist/peer-stream.js.map +1 -0
- package/package.json +1 -1
- package/src/index.ts +12 -4
- package/src/modules/Action.ts +5 -25
- package/src/modules/Animation.ts +171 -0
- package/src/modules/Building.ts +103 -0
- package/src/modules/CameraView.ts +175 -0
- package/src/modules/Effect.ts +127 -0
- package/src/modules/Environment.ts +81 -0
- package/src/modules/Focus.ts +33 -0
- package/src/modules/GameMode.ts +60 -0
- package/src/modules/Init.ts +104 -0
- package/src/modules/Path.ts +293 -0
- package/src/modules/Poi.ts +194 -117
- package/src/modules/Routing.ts +96 -85
- package/src/modules/Scene.ts +43 -21
- package/src/modules/Status.ts +150 -0
- package/src/peer-stream.js +938 -0
- package/src/modules/Track.ts +0 -64
- package/src/modules/VideoFusion.ts +0 -122
- package/src/modules/Window.ts +0 -40
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 效果控制操作方法
|
|
3
|
+
*/
|
|
4
|
+
import { Action, SendParam } from "./Action";
|
|
5
|
+
|
|
6
|
+
// 效果类型
|
|
7
|
+
export type EffectType =
|
|
8
|
+
| 'Elevator' // 电梯效果
|
|
9
|
+
| 'PowerUsed' // 能耗管理
|
|
10
|
+
| 'P' // 停车场
|
|
11
|
+
| 'ElectronicFence' // 电子围栏
|
|
12
|
+
| 'MeetingRoom' // 会议室盒子
|
|
13
|
+
| 'Pipe' // 管线
|
|
14
|
+
| 'RoomArea' // 房间区域盒子
|
|
15
|
+
| 'EscapeRoute' // 逃生路线
|
|
16
|
+
| 'PeopleRoute' // 人员轨迹
|
|
17
|
+
| 'Area' // 区域效果
|
|
18
|
+
| string; // 允许其他自定义类型
|
|
19
|
+
|
|
20
|
+
// 效果操作类型
|
|
21
|
+
export type EffectActionType = '1' | '0'; // '1' = 显示, '0' = 隐藏
|
|
22
|
+
|
|
23
|
+
// 效果参数
|
|
24
|
+
export interface EffectParam {
|
|
25
|
+
action: EffectActionType;
|
|
26
|
+
type: EffectType;
|
|
27
|
+
place: string; // 效果所在的位置,项目约定
|
|
28
|
+
extraContent?: Record<string, any>; // 补充内容,非必须,项目预定
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// 效果模块类型
|
|
32
|
+
type EffectModuleType = SendParam & {
|
|
33
|
+
cmd: "effect";
|
|
34
|
+
data: EffectParam;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export class EffectAction extends Action {
|
|
38
|
+
/**
|
|
39
|
+
* 显示效果
|
|
40
|
+
* @param type 效果类型,如 "Elevator"、"PowerUsed"、"P" 等
|
|
41
|
+
* @param place 效果所在的位置,项目约定,如 "ZHL"、"A"、"ZHL-1F" 等
|
|
42
|
+
* @param extraContent 补充内容,非必须
|
|
43
|
+
*/
|
|
44
|
+
static show(
|
|
45
|
+
type: EffectType,
|
|
46
|
+
place: string,
|
|
47
|
+
extraContent?: Record<string, any>
|
|
48
|
+
) {
|
|
49
|
+
const data: EffectParam = {
|
|
50
|
+
action: '1',
|
|
51
|
+
type,
|
|
52
|
+
place
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
if (extraContent) {
|
|
56
|
+
data.extraContent = extraContent;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const param: EffectModuleType = {
|
|
60
|
+
cmd: "effect",
|
|
61
|
+
data
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
this.sendParam(param, `显示效果 - type: ${type}, place: ${place}`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* 隐藏效果
|
|
69
|
+
* @param type 效果类型,如 "Elevator"、"PowerUsed"、"P" 等
|
|
70
|
+
* @param place 效果所在的位置,项目约定,如 "ZHL"、"A"、"ZHL-1F" 等
|
|
71
|
+
* @param extraContent 补充内容,非必须
|
|
72
|
+
*/
|
|
73
|
+
static hide(
|
|
74
|
+
type: EffectType,
|
|
75
|
+
place: string,
|
|
76
|
+
extraContent?: Record<string, any>
|
|
77
|
+
) {
|
|
78
|
+
const data: EffectParam = {
|
|
79
|
+
action: '0',
|
|
80
|
+
type,
|
|
81
|
+
place
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
if (extraContent) {
|
|
85
|
+
data.extraContent = extraContent;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const param: EffectModuleType = {
|
|
89
|
+
cmd: "effect",
|
|
90
|
+
data
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
this.sendParam(param, `隐藏效果 - type: ${type}, place: ${place}`);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* 通用效果控制方法
|
|
98
|
+
* @param action 操作类型:'1' = 显示,'0' = 隐藏
|
|
99
|
+
* @param type 效果类型
|
|
100
|
+
* @param place 效果所在的位置
|
|
101
|
+
* @param extraContent 补充内容,非必须
|
|
102
|
+
*/
|
|
103
|
+
static control(
|
|
104
|
+
action: EffectActionType,
|
|
105
|
+
type: EffectType,
|
|
106
|
+
place: string,
|
|
107
|
+
extraContent?: Record<string, any>
|
|
108
|
+
) {
|
|
109
|
+
const data: EffectParam = {
|
|
110
|
+
action,
|
|
111
|
+
type,
|
|
112
|
+
place
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
if (extraContent) {
|
|
116
|
+
data.extraContent = extraContent;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const param: EffectModuleType = {
|
|
120
|
+
cmd: "effect",
|
|
121
|
+
data
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
const actionText = action === '1' ? '显示' : '隐藏';
|
|
125
|
+
this.sendParam(param, `${actionText}效果 - type: ${type}, place: ${place}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 场景环境操作方法
|
|
3
|
+
*/
|
|
4
|
+
import { Action, SendParam } from "./Action";
|
|
5
|
+
|
|
6
|
+
type EnvironmentActionType = 'DayNight' | 'Weather' | 'Time'
|
|
7
|
+
|
|
8
|
+
type EnvironmentType = SendParam & {
|
|
9
|
+
cmd: "environment";
|
|
10
|
+
data: {
|
|
11
|
+
action: EnvironmentActionType;
|
|
12
|
+
type: string;
|
|
13
|
+
[key: string]: any;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class EnvironmentAction extends Action {
|
|
18
|
+
/**
|
|
19
|
+
* 昼夜切换
|
|
20
|
+
* @param type 0 = 白天,1 = 夜晚
|
|
21
|
+
*/
|
|
22
|
+
static dayNight(type: "0" | "1") {
|
|
23
|
+
const data: {
|
|
24
|
+
action: 'DayNight';
|
|
25
|
+
type: string;
|
|
26
|
+
} = {
|
|
27
|
+
action: 'DayNight',
|
|
28
|
+
type
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const param: EnvironmentType = {
|
|
32
|
+
cmd: "environment",
|
|
33
|
+
data
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const dayNightDesc = type === '0' ? '白天' : '夜晚';
|
|
37
|
+
this.sendParam(param, `昼夜切换 - ${dayNightDesc}`)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 天气切换
|
|
42
|
+
* @param type 天气类型:晴、阴、小雨、大雨、小雪、大雪、雾
|
|
43
|
+
*/
|
|
44
|
+
static weather(type: string) {
|
|
45
|
+
const data: {
|
|
46
|
+
action: 'Weather';
|
|
47
|
+
type: string;
|
|
48
|
+
} = {
|
|
49
|
+
action: 'Weather',
|
|
50
|
+
type
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const param: EnvironmentType = {
|
|
54
|
+
cmd: "environment",
|
|
55
|
+
data
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
this.sendParam(param, `天气切换 - ${type}`)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 时间切换
|
|
63
|
+
* @param type 时间格式,如 "12:00"
|
|
64
|
+
*/
|
|
65
|
+
static time(type: string) {
|
|
66
|
+
const data: {
|
|
67
|
+
action: 'Time';
|
|
68
|
+
type: string;
|
|
69
|
+
} = {
|
|
70
|
+
action: 'Time',
|
|
71
|
+
type
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const param: EnvironmentType = {
|
|
75
|
+
cmd: "environment",
|
|
76
|
+
data
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
this.sendParam(param, `时间切换 - ${type}`)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 聚焦操作方法
|
|
3
|
+
*/
|
|
4
|
+
import { Action } from "./Action";
|
|
5
|
+
|
|
6
|
+
type FocusType = {
|
|
7
|
+
cmd: "focus";
|
|
8
|
+
data: {
|
|
9
|
+
id: string;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export class FocusAction extends Action {
|
|
14
|
+
/**
|
|
15
|
+
* 飞到指定ID的物体附近
|
|
16
|
+
* @param id 物体的ID(如POI、模型等)
|
|
17
|
+
*/
|
|
18
|
+
static focus(id: string) {
|
|
19
|
+
const data: {
|
|
20
|
+
id: string;
|
|
21
|
+
} = {
|
|
22
|
+
id
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const param: FocusType = {
|
|
26
|
+
cmd: "focus",
|
|
27
|
+
data
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// 注意:focus 命令不需要 action 字段,直接发送参数
|
|
31
|
+
this.sendParam(param as any, `飞到指定物体附近 - id: ${id}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 游戏模式切换
|
|
3
|
+
*/
|
|
4
|
+
import { Action, SendParam } from "./Action";
|
|
5
|
+
|
|
6
|
+
// 游戏模式类型
|
|
7
|
+
export type GameMode = 'Normal' | 'Edit' | 'Measure';
|
|
8
|
+
|
|
9
|
+
// 模式操作类型
|
|
10
|
+
type GameModeActionType = 'set' | 'get';
|
|
11
|
+
|
|
12
|
+
type GameModeParamType = SendParam & {
|
|
13
|
+
cmd: "gameMode";
|
|
14
|
+
data: {
|
|
15
|
+
action: GameModeActionType;
|
|
16
|
+
mode?: GameMode;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export class GameModeAction extends Action {
|
|
21
|
+
/**
|
|
22
|
+
* 切换游戏模式
|
|
23
|
+
* @param mode 游戏模式:Normal(普通模式) | Edit(编辑模式) | Measure(绘制模式)
|
|
24
|
+
*/
|
|
25
|
+
static setMode(mode: GameMode) {
|
|
26
|
+
const data: {
|
|
27
|
+
action: 'set';
|
|
28
|
+
mode: GameMode;
|
|
29
|
+
} = {
|
|
30
|
+
action: 'set',
|
|
31
|
+
mode
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const param: GameModeParamType = {
|
|
35
|
+
cmd: "gameMode",
|
|
36
|
+
data
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const modeDesc = mode === 'Normal' ? '普通模式' : mode === 'Edit' ? '编辑模式' : '绘制模式';
|
|
40
|
+
this.sendParam(param, `切换游戏模式 - ${modeDesc}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* 获取当前游戏模式
|
|
45
|
+
*/
|
|
46
|
+
static getMode() {
|
|
47
|
+
const data: {
|
|
48
|
+
action: 'get';
|
|
49
|
+
} = {
|
|
50
|
+
action: 'get'
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const param: GameModeParamType = {
|
|
54
|
+
cmd: "gameMode",
|
|
55
|
+
data
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
this.sendParam(param, '获取当前游戏模式');
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 视频初始化操作方法
|
|
3
|
+
*/
|
|
4
|
+
import { Action } from "./Action";
|
|
5
|
+
// 导入 peer-stream.js 以确保自定义元素在使用前被注册
|
|
6
|
+
import "../peer-stream.js";
|
|
7
|
+
|
|
8
|
+
// 初始化配置选项
|
|
9
|
+
export interface InitVideoOptions {
|
|
10
|
+
/** 视频容器元素(DOM元素或ref) */
|
|
11
|
+
container: HTMLElement;
|
|
12
|
+
/** WebSocket连接地址 */
|
|
13
|
+
wsUrl: string;
|
|
14
|
+
/** 消息回调函数 */
|
|
15
|
+
onMessage?: (data: any) => void;
|
|
16
|
+
/** 播放开始回调函数 */
|
|
17
|
+
onPlaying?: () => void;
|
|
18
|
+
/** 排队人数变化回调函数 */
|
|
19
|
+
onQueueChange?: (seq: number) => void;
|
|
20
|
+
/** 视频元数据加载完成回调函数 */
|
|
21
|
+
onLoadedMetadata?: () => void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export class InitAction extends Action {
|
|
25
|
+
/**
|
|
26
|
+
* 初始化视频流
|
|
27
|
+
* @param options 初始化配置选项
|
|
28
|
+
* @returns HTMLVideoElement 返回创建的video元素
|
|
29
|
+
*/
|
|
30
|
+
static initVideo(options: InitVideoOptions): HTMLVideoElement {
|
|
31
|
+
// 创建 peer-stream video 元素
|
|
32
|
+
const ps = document.createElement("video", { is: "peer-stream" }) as any;
|
|
33
|
+
|
|
34
|
+
// 设置样式
|
|
35
|
+
ps.style.width = "100%";
|
|
36
|
+
ps.style.height = "100%";
|
|
37
|
+
ps.style.backgroundRepeat = "no-repeat";
|
|
38
|
+
ps.style.backgroundSize = "cover";
|
|
39
|
+
ps.style.backgroundPosition = "center";
|
|
40
|
+
ps.style.left = "0px";
|
|
41
|
+
ps.style.top = "0px";
|
|
42
|
+
ps.style.position = "absolute";
|
|
43
|
+
|
|
44
|
+
// 设置 WebSocket 连接地址
|
|
45
|
+
ps.id = options.wsUrl;
|
|
46
|
+
|
|
47
|
+
// 将 video 元素添加到容器
|
|
48
|
+
options.container.appendChild(ps);
|
|
49
|
+
|
|
50
|
+
// 注册键盘和鼠标事件
|
|
51
|
+
if (ps.registerKeyboardEvents) {
|
|
52
|
+
ps.registerKeyboardEvents();
|
|
53
|
+
}
|
|
54
|
+
if (ps.registerMouseHoverEvents) {
|
|
55
|
+
ps.registerMouseHoverEvents();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// 监听消息事件
|
|
59
|
+
if (options.onMessage) {
|
|
60
|
+
ps.addEventListener("message", (e: any) => {
|
|
61
|
+
try {
|
|
62
|
+
const data = JSON.parse(e.detail);
|
|
63
|
+
options.onMessage!(data);
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.error("解析消息失败:", error);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// 监听元数据加载完成
|
|
71
|
+
ps.addEventListener("loadedmetadata", () => {
|
|
72
|
+
if (ps) {
|
|
73
|
+
ps.style.objectFit = "fill";
|
|
74
|
+
ps.style.width = "100%";
|
|
75
|
+
ps.style.height = "100%";
|
|
76
|
+
}
|
|
77
|
+
options.onLoadedMetadata?.();
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// 监听排队人数变化
|
|
81
|
+
if (ps.ws && options.onQueueChange) {
|
|
82
|
+
ps.ws.addEventListener('message', (e: MessageEvent) => {
|
|
83
|
+
try {
|
|
84
|
+
const data = JSON.parse(e.data);
|
|
85
|
+
if (data.type === "playerqueue") {
|
|
86
|
+
options.onQueueChange!(data.seq);
|
|
87
|
+
}
|
|
88
|
+
} catch (error) {
|
|
89
|
+
// 忽略解析错误,可能不是 JSON 数据
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// 监听播放开始事件
|
|
95
|
+
if (options.onPlaying) {
|
|
96
|
+
ps.addEventListener("playing", () => {
|
|
97
|
+
options.onPlaying!();
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return ps;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 路径方法
|
|
6
|
+
*/
|
|
7
|
+
import { Action, SendParam } from "./Action";
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
type PathActionType = 'getRoadNet' | 'remove' | 'add' | 'show' | 'hide' | 'updateMovingParam' | 'start' | 'stop' | 'restart' | 'beginEdit' | 'endEdit'
|
|
11
|
+
|
|
12
|
+
// 路径模块类型
|
|
13
|
+
export type PathModuleType = 'Edit' | 'PathTracer'
|
|
14
|
+
|
|
15
|
+
// 角色类型
|
|
16
|
+
export type RolerType = 'Person' | 'Camera' | 'UAV'
|
|
17
|
+
|
|
18
|
+
// 绘制方式
|
|
19
|
+
export type PathDrawBaseType = 'BaseOnRoadNet' | 'BaseOnPathEditInfo'
|
|
20
|
+
|
|
21
|
+
// 路径样式类型
|
|
22
|
+
export type PathStyleType = 'Arrow' | string
|
|
23
|
+
|
|
24
|
+
// 沿路径移动参数
|
|
25
|
+
export interface RolerMoveParam {
|
|
26
|
+
rolerMoveAlongPath?: boolean; // 是否有模型跟随线走,默认false
|
|
27
|
+
rolerType?: RolerType; // 角色类型,默认是 Camera
|
|
28
|
+
viewFollow?: boolean; // 是否视角跟随,默认false
|
|
29
|
+
moveSpeed?: number; // 移动速度
|
|
30
|
+
pauseAtPoint?: boolean; // 到达一个点是否需要停在那里
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// 路径样式
|
|
34
|
+
export interface PathStyle {
|
|
35
|
+
color: string; // 颜色,格式如 "FFFFFFFF"
|
|
36
|
+
styleType: PathStyleType; // 样式风格
|
|
37
|
+
width: number; // 路径宽度
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// 路径点
|
|
41
|
+
export interface PathPoint {
|
|
42
|
+
id: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// 路径编辑参数
|
|
46
|
+
export interface PathEditParam {
|
|
47
|
+
searchRangeAtPathPoint?: number; // 取点后,搜索的范围半径,单位(米)
|
|
48
|
+
searchDeviceType?: string; // 取点后,需要参与搜索的设备类型。为空值或者不传,搜索所有的设备类型
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// 轨迹添加的 data 结构
|
|
52
|
+
interface PathAddData {
|
|
53
|
+
action: 'add';
|
|
54
|
+
pathId: string; // 自定义轨迹ID
|
|
55
|
+
pathDrawBaseType: PathDrawBaseType; // 绘制方式
|
|
56
|
+
roadNetId?: string; // 路网ID,BaseOnRoadNet时需要
|
|
57
|
+
rolerMoveParam?: RolerMoveParam; // 沿路径移动的信息
|
|
58
|
+
pathStyle?: PathStyle; // 路径样式
|
|
59
|
+
points: PathPoint[]; // 路径点数组
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
type PathType = SendParam & {
|
|
63
|
+
cmd: "path";
|
|
64
|
+
data: {
|
|
65
|
+
action: PathActionType;
|
|
66
|
+
[key: string]: any;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export class PathAction extends Action {
|
|
71
|
+
/**
|
|
72
|
+
* 请求三维绘制路径
|
|
73
|
+
* @param pathId 自定义轨迹ID,后面删除的时候用,如果之前有编辑路径,这里就使用编辑路径的时候传入的路径 pathId
|
|
74
|
+
* @param pathDrawBaseType 绘制方式:BaseOnRoadNet 基于路网,使用C++寻路;BaseOnPathEditInfo 基于编辑路径生成的点画路径,不基于路网
|
|
75
|
+
* @param points 路径点数组
|
|
76
|
+
* @param roadNetId 路网的ID,pathDrawBaseType = BaseOnRoadNet的时候,需要传值,如果场景就一个路网,也可以不用传
|
|
77
|
+
* @param rolerMoveParam 沿路径移动的信息
|
|
78
|
+
* @param pathStyle 路径样式
|
|
79
|
+
*/
|
|
80
|
+
static pathAdd(
|
|
81
|
+
pathId: string,
|
|
82
|
+
pathDrawBaseType: PathDrawBaseType,
|
|
83
|
+
points: PathPoint[],
|
|
84
|
+
roadNetId?: string,
|
|
85
|
+
rolerMoveParam?: RolerMoveParam,
|
|
86
|
+
pathStyle?: PathStyle
|
|
87
|
+
) {
|
|
88
|
+
const data: PathAddData = {
|
|
89
|
+
action: "add",
|
|
90
|
+
pathId,
|
|
91
|
+
pathDrawBaseType,
|
|
92
|
+
points,
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// 如果绘制方式是基于路网,且提供了路网ID,则添加
|
|
96
|
+
if (pathDrawBaseType === 'BaseOnRoadNet' && roadNetId) {
|
|
97
|
+
data.roadNetId = roadNetId;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// 如果提供了沿路径移动参数,则添加
|
|
101
|
+
if (rolerMoveParam) {
|
|
102
|
+
data.rolerMoveParam = rolerMoveParam;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// 如果提供了路径样式,则添加
|
|
106
|
+
if (pathStyle) {
|
|
107
|
+
data.pathStyle = pathStyle;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const param: PathType = {
|
|
111
|
+
cmd: "path",
|
|
112
|
+
data
|
|
113
|
+
};
|
|
114
|
+
this.sendParam(param, '请求三维绘制路径')
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* 显隐销毁路径
|
|
119
|
+
* @param action 操作类型:show 显示 | hide 隐藏 | remove 删除
|
|
120
|
+
* @param pathId 自定义轨迹ID,同前面,自定义的ID
|
|
121
|
+
* @param module 显隐、删除哪一部分:Edit 编辑的部分 | PathTracer 根据设备点动态生成的路径部分,如果不传,则整个显隐或者删除
|
|
122
|
+
*/
|
|
123
|
+
static pathShowHideRemove(
|
|
124
|
+
action: 'show' | 'hide' | 'remove',
|
|
125
|
+
pathId: string,
|
|
126
|
+
module?: PathModuleType
|
|
127
|
+
) {
|
|
128
|
+
const data: {
|
|
129
|
+
action: 'show' | 'hide' | 'remove';
|
|
130
|
+
pathId: string;
|
|
131
|
+
module?: PathModuleType;
|
|
132
|
+
} = {
|
|
133
|
+
action,
|
|
134
|
+
pathId
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// 如果提供了模块类型,则添加
|
|
138
|
+
if (module) {
|
|
139
|
+
data.module = module;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const param: PathType = {
|
|
143
|
+
cmd: "path",
|
|
144
|
+
data
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
const actionMap = {
|
|
148
|
+
show: '显示路径',
|
|
149
|
+
hide: '隐藏路径',
|
|
150
|
+
remove: '删除路径'
|
|
151
|
+
};
|
|
152
|
+
this.sendParam(param, actionMap[action])
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* 移动中更新移动参数
|
|
157
|
+
* @param pathId 自定义轨迹ID
|
|
158
|
+
* @param rolerMoveParam 沿路径移动的参数
|
|
159
|
+
*/
|
|
160
|
+
static pathUpdateMovingParam(
|
|
161
|
+
pathId: string,
|
|
162
|
+
rolerMoveParam: RolerMoveParam
|
|
163
|
+
) {
|
|
164
|
+
const data: {
|
|
165
|
+
action: 'updateMovingParam';
|
|
166
|
+
pathId: string;
|
|
167
|
+
rolerMoveParam: RolerMoveParam;
|
|
168
|
+
} = {
|
|
169
|
+
action: 'updateMovingParam',
|
|
170
|
+
pathId,
|
|
171
|
+
rolerMoveParam
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const param: PathType = {
|
|
175
|
+
cmd: "path",
|
|
176
|
+
data
|
|
177
|
+
};
|
|
178
|
+
this.sendParam(param, '更新移动参数')
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* 在生成的路径上面移动 - 开始移动
|
|
183
|
+
* @param action 操作类型:start 开始移动
|
|
184
|
+
* @param pathId 自定义轨迹ID
|
|
185
|
+
* @param rolerMoveParam 沿路径移动的参数
|
|
186
|
+
*/
|
|
187
|
+
static pathMove(action: 'start', pathId: string, rolerMoveParam: RolerMoveParam): void;
|
|
188
|
+
/**
|
|
189
|
+
* 在生成的路径上面移动 - 停止或重启
|
|
190
|
+
* @param action 操作类型:stop 停止移动 | restart 重启移动
|
|
191
|
+
*/
|
|
192
|
+
static pathMove(action: 'stop' | 'restart'): void;
|
|
193
|
+
/**
|
|
194
|
+
* 在生成的路径上面移动
|
|
195
|
+
* @param action 操作类型:start 开始移动 | stop 停止移动 | restart 重启移动
|
|
196
|
+
* @param pathId 自定义轨迹ID(仅 start 时需要)
|
|
197
|
+
* @param rolerMoveParam 沿路径移动的参数(仅 start 时需要)
|
|
198
|
+
*/
|
|
199
|
+
static pathMove(
|
|
200
|
+
action: 'start' | 'stop' | 'restart',
|
|
201
|
+
pathId?: string,
|
|
202
|
+
rolerMoveParam?: RolerMoveParam
|
|
203
|
+
) {
|
|
204
|
+
const data: {
|
|
205
|
+
action: 'start' | 'stop' | 'restart';
|
|
206
|
+
pathId?: string;
|
|
207
|
+
rolerMoveParam?: RolerMoveParam;
|
|
208
|
+
} = {
|
|
209
|
+
action
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
// start 操作需要 pathId 和 rolerMoveParam
|
|
213
|
+
if (action === 'start') {
|
|
214
|
+
if (!pathId || !rolerMoveParam) {
|
|
215
|
+
throw new Error('start 操作需要提供 pathId 和 rolerMoveParam');
|
|
216
|
+
}
|
|
217
|
+
data.pathId = pathId;
|
|
218
|
+
data.rolerMoveParam = rolerMoveParam;
|
|
219
|
+
}
|
|
220
|
+
// stop 和 restart 不需要 pathId 和 rolerMoveParam
|
|
221
|
+
|
|
222
|
+
const param: PathType = {
|
|
223
|
+
cmd: "path",
|
|
224
|
+
data
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
const actionMap = {
|
|
228
|
+
start: '开始移动',
|
|
229
|
+
stop: '停止移动',
|
|
230
|
+
restart: '重启移动'
|
|
231
|
+
};
|
|
232
|
+
this.sendParam(param, actionMap[action])
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* 开启路径编辑
|
|
237
|
+
* @param pathId 自定义轨迹ID,前端配置界面提供数据,为空或者不传,UE自动生成一个
|
|
238
|
+
* @param pathName 路径名称,前端配置界面提供数据,非必须
|
|
239
|
+
* @param pathEditParam 路径编辑参数,前端配置界面提供数据
|
|
240
|
+
*/
|
|
241
|
+
static pathBeginEdit(
|
|
242
|
+
pathId?: string,
|
|
243
|
+
pathName?: string,
|
|
244
|
+
pathEditParam?: PathEditParam
|
|
245
|
+
) {
|
|
246
|
+
const data: {
|
|
247
|
+
action: 'beginEdit';
|
|
248
|
+
pathId?: string;
|
|
249
|
+
pathName?: string;
|
|
250
|
+
pathEditParam?: PathEditParam;
|
|
251
|
+
} = {
|
|
252
|
+
action: 'beginEdit'
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
// 如果提供了 pathId,则添加
|
|
256
|
+
if (pathId) {
|
|
257
|
+
data.pathId = pathId;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// 如果提供了 pathName,则添加
|
|
261
|
+
if (pathName) {
|
|
262
|
+
data.pathName = pathName;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
// 如果提供了 pathEditParam,则添加
|
|
266
|
+
if (pathEditParam) {
|
|
267
|
+
data.pathEditParam = pathEditParam;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
const param: PathType = {
|
|
271
|
+
cmd: "path",
|
|
272
|
+
data
|
|
273
|
+
};
|
|
274
|
+
this.sendParam(param, '开启路径编辑')
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* 停止路径编辑
|
|
279
|
+
*/
|
|
280
|
+
static pathEndEdit() {
|
|
281
|
+
const data: {
|
|
282
|
+
action: 'endEdit';
|
|
283
|
+
} = {
|
|
284
|
+
action: 'endEdit'
|
|
285
|
+
};
|
|
286
|
+
|
|
287
|
+
const param: PathType = {
|
|
288
|
+
cmd: "path",
|
|
289
|
+
data
|
|
290
|
+
};
|
|
291
|
+
this.sendParam(param, '停止路径编辑')
|
|
292
|
+
}
|
|
293
|
+
}
|