@fleet-frontend/mower-maps 0.0.9-beta.5 → 0.0.9-beta.7
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/config/constants.d.ts +2 -25
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/styles.d.ts +1 -1
- package/dist/config/styles.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.esm.js +386 -230
- package/dist/index.js +386 -230
- package/dist/processor/MapDataProcessor.d.ts +1 -1
- package/dist/processor/MapDataProcessor.d.ts.map +1 -1
- package/dist/processor/PathDataProcessor.d.ts +2 -21
- package/dist/processor/PathDataProcessor.d.ts.map +1 -1
- package/dist/processor/builder/AntennaDataBuilder.d.ts +2 -1
- package/dist/processor/builder/AntennaDataBuilder.d.ts.map +1 -1
- package/dist/processor/builder/BoundaryDataBuilder.d.ts +1 -1
- package/dist/processor/builder/BoundaryDataBuilder.d.ts.map +1 -1
- package/dist/processor/builder/ChannelDataBuilder.d.ts +1 -1
- package/dist/processor/builder/ChannelDataBuilder.d.ts.map +1 -1
- package/dist/processor/builder/ChargingPileDataBuilder.d.ts +1 -1
- package/dist/processor/builder/ChargingPileDataBuilder.d.ts.map +1 -1
- package/dist/processor/builder/ObstacleDataBuilder.d.ts +2 -1
- package/dist/processor/builder/ObstacleDataBuilder.d.ts.map +1 -1
- package/dist/processor/builder/PathDataBuilder.d.ts +1 -1
- package/dist/processor/builder/PathDataBuilder.d.ts.map +1 -1
- package/dist/processor/builder/PointDataBuilder.d.ts +2 -1
- package/dist/processor/builder/PointDataBuilder.d.ts.map +1 -1
- package/dist/processor/builder/SvgElementDataBuilder.d.ts +1 -1
- package/dist/processor/builder/SvgElementDataBuilder.d.ts.map +1 -1
- package/dist/processor/builder/VisionOffDataBuilder.d.ts +2 -1
- package/dist/processor/builder/VisionOffDataBuilder.d.ts.map +1 -1
- package/dist/processor/index.d.ts +2 -1
- package/dist/processor/index.d.ts.map +1 -1
- package/dist/render/BoundaryLabelsManager.d.ts +1 -1
- package/dist/render/BoundaryLabelsManager.d.ts.map +1 -1
- package/dist/render/MowerMapOverlay.d.ts +2 -2
- package/dist/render/MowerMapOverlay.d.ts.map +1 -1
- package/dist/render/MowerMapRenderer.d.ts.map +1 -1
- package/dist/render/MowerPositionManager.d.ts.map +1 -1
- package/dist/render/SvgMapView.d.ts.map +1 -1
- package/dist/render/layers/BoundaryBorderLayer.d.ts +2 -2
- package/dist/render/layers/BoundaryBorderLayer.d.ts.map +1 -1
- package/dist/render/layers/ChannelLayer.d.ts.map +1 -1
- package/dist/render/layers/DrawLayer.d.ts +1 -1
- package/dist/render/layers/DrawLayer.d.ts.map +1 -1
- package/dist/render/layers/PathLayer.d.ts.map +1 -1
- package/dist/render/layers/SvgElementLayer.d.ts.map +1 -1
- package/dist/render/layers/types.d.ts +1 -38
- package/dist/render/layers/types.d.ts.map +1 -1
- package/dist/store/processMowingState.d.ts +1 -5
- package/dist/store/processMowingState.d.ts.map +1 -1
- package/dist/store/useSubBoundaryBorderStore.d.ts +9 -5
- package/dist/store/useSubBoundaryBorderStore.d.ts.map +1 -1
- package/dist/types/constants.d.ts +38 -0
- package/dist/types/constants.d.ts.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/layers.d.ts +50 -0
- package/dist/types/layers.d.ts.map +1 -0
- package/dist/types/processor.d.ts +26 -0
- package/dist/types/processor.d.ts.map +1 -0
- package/dist/types/realTime.d.ts +8 -1
- package/dist/types/realTime.d.ts.map +1 -1
- package/dist/types/renderer.d.ts +3 -3
- package/dist/types/renderer.d.ts.map +1 -1
- package/dist/types/store.d.ts +22 -0
- package/dist/types/store.d.ts.map +1 -0
- package/dist/types/utils.d.ts +102 -0
- package/dist/types/utils.d.ts.map +1 -0
- package/dist/utils/boundaryUtils.d.ts +1 -29
- package/dist/utils/boundaryUtils.d.ts.map +1 -1
- package/dist/utils/common.d.ts +1 -5
- package/dist/utils/common.d.ts.map +1 -1
- package/dist/utils/coordinates.d.ts +1 -7
- package/dist/utils/coordinates.d.ts.map +1 -1
- package/dist/utils/handleRealTime.d.ts +2 -7
- package/dist/utils/handleRealTime.d.ts.map +1 -1
- package/dist/utils/mapBounds.d.ts +1 -10
- package/dist/utils/mapBounds.d.ts.map +1 -1
- package/dist/utils/math.d.ts +2 -9
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/mower.d.ts +4 -4
- package/dist/utils/mower.d.ts.map +1 -1
- package/dist/utils/pathSegments.d.ts +1 -23
- package/dist/utils/pathSegments.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.esm.js
CHANGED
|
@@ -1,6 +1,135 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import React, { forwardRef, useState, useRef, useMemo, useCallback, useEffect, useImperativeHandle } from 'react';
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* 常量和枚举类型定义
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* 机器人状态枚举
|
|
9
|
+
*/
|
|
10
|
+
var RobotStatus;
|
|
11
|
+
(function (RobotStatus) {
|
|
12
|
+
RobotStatus[RobotStatus["PARKED"] = 1] = "PARKED";
|
|
13
|
+
RobotStatus[RobotStatus["CHARGING"] = 2] = "CHARGING";
|
|
14
|
+
RobotStatus[RobotStatus["STANDBY"] = 3] = "STANDBY";
|
|
15
|
+
RobotStatus[RobotStatus["MOWING"] = 4] = "MOWING";
|
|
16
|
+
RobotStatus[RobotStatus["WORKING"] = 5] = "WORKING";
|
|
17
|
+
RobotStatus[RobotStatus["MAPPING"] = 6] = "MAPPING";
|
|
18
|
+
RobotStatus[RobotStatus["ERROR"] = 7] = "ERROR";
|
|
19
|
+
RobotStatus[RobotStatus["UPGRADING"] = 8] = "UPGRADING";
|
|
20
|
+
RobotStatus[RobotStatus["DISCONNECTED"] = 9] = "DISCONNECTED";
|
|
21
|
+
RobotStatus[RobotStatus["UNKNOWN"] = -1] = "UNKNOWN";
|
|
22
|
+
RobotStatus[RobotStatus["TASK_DELAY"] = 10] = "TASK_DELAY";
|
|
23
|
+
})(RobotStatus || (RobotStatus = {}));
|
|
24
|
+
/**
|
|
25
|
+
* RTK状态枚举
|
|
26
|
+
*/
|
|
27
|
+
var RTK_STATE;
|
|
28
|
+
(function (RTK_STATE) {
|
|
29
|
+
RTK_STATE[RTK_STATE["LOW_RTK"] = 1] = "LOW_RTK";
|
|
30
|
+
RTK_STATE[RTK_STATE["MIDDLE_RTK"] = 2] = "MIDDLE_RTK";
|
|
31
|
+
RTK_STATE[RTK_STATE["HIGH_RTK"] = 3] = "HIGH_RTK";
|
|
32
|
+
RTK_STATE[RTK_STATE["NO_POSTURE"] = 10] = "NO_POSTURE";
|
|
33
|
+
RTK_STATE[RTK_STATE["OUT_OF_RANGE"] = 11] = "OUT_OF_RANGE";
|
|
34
|
+
RTK_STATE[RTK_STATE["OFF_LINE"] = 19] = "OFF_LINE";
|
|
35
|
+
})(RTK_STATE || (RTK_STATE = {}));
|
|
36
|
+
/**
|
|
37
|
+
* 实时数据类型枚举
|
|
38
|
+
*/
|
|
39
|
+
var REAL_TIME_DATA_TYPE;
|
|
40
|
+
(function (REAL_TIME_DATA_TYPE) {
|
|
41
|
+
REAL_TIME_DATA_TYPE[REAL_TIME_DATA_TYPE["LOCATION"] = 1] = "LOCATION";
|
|
42
|
+
REAL_TIME_DATA_TYPE[REAL_TIME_DATA_TYPE["PROCESS"] = 2] = "PROCESS";
|
|
43
|
+
})(REAL_TIME_DATA_TYPE || (REAL_TIME_DATA_TYPE = {}));
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 地图渲染相关常量配置
|
|
47
|
+
*/
|
|
48
|
+
/**
|
|
49
|
+
* 缩放因子 - 将米转换为像素
|
|
50
|
+
* 与Python代码中的SVG比例一致
|
|
51
|
+
*/
|
|
52
|
+
const SCALE_FACTOR = 50; // 50像素/米
|
|
53
|
+
/**
|
|
54
|
+
* 默认线宽设置
|
|
55
|
+
*/
|
|
56
|
+
const DEFAULT_LINE_WIDTHS = {
|
|
57
|
+
OBSTACLE: 2,
|
|
58
|
+
CHARGING_PILE: 2,
|
|
59
|
+
CHANNEL: 2,
|
|
60
|
+
PATH: 20,
|
|
61
|
+
VISION_OFF_AREA: 2,
|
|
62
|
+
TIME_LIMIT_OBSTACLE: 1,
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* 默认透明度设置
|
|
66
|
+
*/
|
|
67
|
+
const DEFAULT_OPACITIES = {
|
|
68
|
+
FULL: 1.0,
|
|
69
|
+
HIGH: 0.7,
|
|
70
|
+
LOW: 0.4};
|
|
71
|
+
/**
|
|
72
|
+
* 默认半径设置
|
|
73
|
+
*/
|
|
74
|
+
const DEFAULT_RADII = {
|
|
75
|
+
CHARGING_PILE: 12};
|
|
76
|
+
/**
|
|
77
|
+
* 图层等级
|
|
78
|
+
*/
|
|
79
|
+
const LAYER_LEVELS = {
|
|
80
|
+
BOUNDARY: 2,
|
|
81
|
+
BOUNDARY_BORDER: 4};
|
|
82
|
+
/**
|
|
83
|
+
* 图层默认id
|
|
84
|
+
*/
|
|
85
|
+
const LAYER_DEFAULT_TYPE = {
|
|
86
|
+
CHANNEL: 'channel',
|
|
87
|
+
BOUNDARY: 'boundary',
|
|
88
|
+
PATH: 'path',
|
|
89
|
+
BOUNDARY_BORDER: 'boundary_border',
|
|
90
|
+
OBSTACLE: 'obstacle',
|
|
91
|
+
CHARGING_PILE: 'charging_pile',
|
|
92
|
+
POINT: 'point',
|
|
93
|
+
SVG: 'svg',
|
|
94
|
+
VISION_OFF_AREA: 'vision_off_area',
|
|
95
|
+
ANTENNA: 'antenna',
|
|
96
|
+
};
|
|
97
|
+
const ISOLATED_BOUNDARY_SVG = `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
98
|
+
<g opacity="0.6">
|
|
99
|
+
<rect width="24" height="24" rx="12" fill="#1E1E1F" fill-opacity="0.5"/>
|
|
100
|
+
<path d="M8.20573 12.4961C6.739 11.1707 4.85775 11.2284 3.60938 11.1707C6.17744 13.0156 6.05584 15.7887 5.67404 16.9446H14.327C13.837 13.1673 15.5321 10.1289 16.4408 9.08187C15.0342 9.46118 13.5794 10.8303 13.0278 11.4674C12.8102 8.94572 13.992 5.97489 14.61 4.80469C12.5235 5.92214 11.0501 8.26056 10.4938 9.56261C9.22803 7.5947 6.83894 7.17806 5.883 6.9432C8.20573 10.2373 8.00039 11.1707 8.20573 12.4961Z" fill="white"/>
|
|
101
|
+
<mask id="path-3-outside-1_9822_43516" maskUnits="userSpaceOnUse" x="13.2344" y="7.20545" width="12.0208" height="12.0208" fill="black">
|
|
102
|
+
<rect fill="white" x="13.2344" y="7.20545" width="12.0208" height="12.0208"/>
|
|
103
|
+
<path d="M20.6852 11.1208C19.9042 10.3398 18.6378 10.3398 17.8568 11.1208L17.2733 11.7043C16.6707 12.3069 16.5358 13.1973 16.8631 13.9319L17.5916 13.2034C17.5657 12.9181 17.6619 12.6236 17.8803 12.4052L18.5674 11.7181C18.9579 11.3276 19.5911 11.3276 19.9816 11.7181L20.4056 12.1421C20.7959 12.5326 20.796 13.1658 20.4056 13.5563L19.7185 14.2434C19.5128 14.449 19.2393 14.5457 18.9699 14.5348L18.2235 15.2812C18.9538 15.596 19.8325 15.4565 20.429 14.86L21.0125 14.2765C21.7935 13.4955 21.7936 12.2291 21.0125 11.4481L20.6852 11.1208Z"/>
|
|
104
|
+
</mask>
|
|
105
|
+
<path d="M20.6852 11.1208C19.9042 10.3398 18.6378 10.3398 17.8568 11.1208L17.2733 11.7043C16.6707 12.3069 16.5358 13.1973 16.8631 13.9319L17.5916 13.2034C17.5657 12.9181 17.6619 12.6236 17.8803 12.4052L18.5674 11.7181C18.9579 11.3276 19.5911 11.3276 19.9816 11.7181L20.4056 12.1421C20.7959 12.5326 20.796 13.1658 20.4056 13.5563L19.7185 14.2434C19.5128 14.449 19.2393 14.5457 18.9699 14.5348L18.2235 15.2812C18.9538 15.596 19.8325 15.4565 20.429 14.86L21.0125 14.2765C21.7935 13.4955 21.7936 12.2291 21.0125 11.4481L20.6852 11.1208Z" fill="white"/>
|
|
106
|
+
<path d="M20.6852 11.1208L21.7458 10.0601L21.7459 10.0601L20.6852 11.1208ZM17.8568 11.1208L16.7961 10.0601L16.7962 10.0601L17.8568 11.1208ZM17.2733 11.7043L16.2126 10.6437L16.2126 10.6436L17.2733 11.7043ZM16.8631 13.9319L17.9238 14.9926L16.381 16.5354L15.493 14.5425L16.8631 13.9319ZM17.5916 13.2034L19.0855 13.0678L19.149 13.7674L18.6523 14.2641L17.5916 13.2034ZM20.4056 12.1421L21.4662 11.0814L21.4665 11.0817L20.4056 12.1421ZM18.9699 14.5348L17.9093 13.4741L18.3741 13.0093L19.0309 13.036L18.9699 14.5348ZM18.2235 15.2812L17.6298 16.6587L15.5997 15.7837L17.1628 14.2206L18.2235 15.2812ZM20.429 14.86L21.4897 15.9207L21.4897 15.9207L20.429 14.86ZM21.0125 14.2765L22.0732 15.3371L22.0732 15.3372L21.0125 14.2765ZM20.6852 11.1208L19.6246 12.1815C19.4294 11.9862 19.1127 11.9863 18.9174 12.1815L17.8568 11.1208L16.7962 10.0601C18.163 8.69337 20.379 8.6934 21.7458 10.0601L20.6852 11.1208ZM17.8568 11.1208L18.9175 12.1814L18.334 12.7649L17.2733 11.7043L16.2126 10.6436L16.7961 10.0601L17.8568 11.1208ZM17.2733 11.7043L18.334 12.7649C18.1877 12.9112 18.1488 13.1318 18.2333 13.3214L16.8631 13.9319L15.493 14.5425C14.9228 13.2629 15.1537 11.7026 16.2126 10.6437L17.2733 11.7043ZM16.8631 13.9319L15.8025 12.8713L16.531 12.1428L17.5916 13.2034L18.6523 14.2641L17.9238 14.9926L16.8631 13.9319ZM17.5916 13.2034L16.0978 13.339C16.0334 12.6302 16.2727 11.8914 16.8196 11.3445L17.8803 12.4052L18.9409 13.4658C19.051 13.3558 19.098 13.206 19.0855 13.0678L17.5916 13.2034ZM17.8803 12.4052L16.8196 11.3445L17.5067 10.6574L18.5674 11.7181L19.628 12.7788L18.9409 13.4658L17.8803 12.4052ZM18.5674 11.7181L17.5067 10.6574C18.483 9.68112 20.0659 9.68112 21.0422 10.6574L19.9816 11.7181L18.9209 12.7788C19.1162 12.974 19.4328 12.974 19.628 12.7788L18.5674 11.7181ZM19.9816 11.7181L21.0422 10.6574L21.4662 11.0814L20.4056 12.1421L19.3449 13.2027L18.9209 12.7788L19.9816 11.7181ZM20.4056 12.1421L21.4665 11.0817C22.4419 12.0577 22.4428 13.6404 21.4662 14.617L20.4056 13.5563L19.3449 12.4956C19.1493 12.6913 19.1498 13.0076 19.3446 13.2024L20.4056 12.1421ZM20.4056 13.5563L21.4662 14.617L20.7791 15.304L19.7185 14.2434L18.6578 13.1827L19.3449 12.4956L20.4056 13.5563ZM19.7185 14.2434L20.7791 15.304C20.2628 15.8204 19.5762 16.0607 18.909 16.0335L18.9699 14.5348L19.0309 13.036C18.9025 13.0308 18.7629 13.0777 18.6578 13.1827L19.7185 14.2434ZM18.9699 14.5348L20.0306 15.5954L19.2841 16.3419L18.2235 15.2812L17.1628 14.2206L17.9093 13.4741L18.9699 14.5348ZM18.2235 15.2812L18.8172 13.9037C19.0042 13.9843 19.2223 13.9455 19.3684 13.7993L20.429 14.86L21.4897 15.9207C20.4427 16.9676 18.9034 17.2077 17.6298 16.6587L18.2235 15.2812ZM20.429 14.86L19.3684 13.7994L19.9519 13.2159L21.0125 14.2765L22.0732 15.3372L21.4897 15.9207L20.429 14.86ZM21.0125 14.2765L19.9518 13.2159C20.1471 13.0206 20.1471 12.704 19.9519 12.5088L21.0125 11.4481L22.0732 10.3874C23.4401 11.7543 23.4399 13.9703 22.0732 15.3371L21.0125 14.2765ZM21.0125 11.4481L19.9519 12.5088L19.6246 12.1814L20.6852 11.1208L21.7459 10.0601L22.0732 10.3874L21.0125 11.4481Z" fill="#8E8E8F" mask="url(#path-3-outside-1_9822_43516)"/>
|
|
107
|
+
<mask id="path-5-outside-2_9822_43516" maskUnits="userSpaceOnUse" x="9.22265" y="10.388" width="12.7279" height="12.7279" fill="black">
|
|
108
|
+
<rect fill="white" x="9.22265" y="10.388" width="12.7279" height="12.7279"/>
|
|
109
|
+
<path d="M16.1708 14.5077C15.4353 14.1778 14.5422 14.3133 13.9383 14.9172L13.3548 15.5007C12.574 16.2818 12.5738 17.5481 13.3548 18.3291L13.6821 18.6564C14.4631 19.4374 15.7295 19.4373 16.5105 18.6564L17.094 18.0729C17.6895 17.4775 17.8299 16.6003 17.5173 15.8708L16.7743 16.6138C16.7828 16.8803 16.6863 17.1494 16.4829 17.3527L15.7952 18.0405C15.4046 18.4309 14.7714 18.431 14.3809 18.0405L13.957 17.6165C13.5667 17.226 13.5666 16.5927 13.957 16.2023L14.6447 15.5145C14.8654 15.2939 15.1639 15.1979 15.452 15.2266L16.1708 14.5077Z"/>
|
|
110
|
+
</mask>
|
|
111
|
+
<path d="M16.1708 14.5077C15.4353 14.1778 14.5422 14.3133 13.9383 14.9172L13.3548 15.5007C12.574 16.2818 12.5738 17.5481 13.3548 18.3291L13.6821 18.6564C14.4631 19.4374 15.7295 19.4373 16.5105 18.6564L17.094 18.0729C17.6895 17.4775 17.8299 16.6003 17.5173 15.8708L16.7743 16.6138C16.7828 16.8803 16.6863 17.1494 16.4829 17.3527L15.7952 18.0405C15.4046 18.4309 14.7714 18.431 14.3809 18.0405L13.957 17.6165C13.5667 17.226 13.5666 16.5927 13.957 16.2023L14.6447 15.5145C14.8654 15.2939 15.1639 15.1979 15.452 15.2266L16.1708 14.5077Z" fill="white"/>
|
|
112
|
+
<path d="M16.1708 14.5077L16.7847 13.1391L18.7701 14.0297L17.2315 15.5684L16.1708 14.5077ZM13.3548 15.5007L12.294 14.4402L12.2941 14.44L13.3548 15.5007ZM16.5105 18.6564L17.5712 19.7171L17.5711 19.7172L16.5105 18.6564ZM17.5173 15.8708L16.4567 14.8102L18.0236 13.2433L18.8962 15.2802L17.5173 15.8708ZM16.7743 16.6138L15.2751 16.6613L15.2545 16.0123L15.7137 15.5532L16.7743 16.6138ZM15.7952 18.0405L16.8558 19.1011L16.8556 19.1013L15.7952 18.0405ZM13.957 17.6165L12.8963 18.6772L12.8959 18.6767L13.957 17.6165ZM13.957 16.2023L12.8961 15.1418L12.8963 15.1416L13.957 16.2023ZM15.452 15.2266L16.5126 16.2872L16.0102 16.7896L15.3032 16.7192L15.452 15.2266ZM16.1708 14.5077L15.5569 15.8763C15.3688 15.792 15.1469 15.8299 14.999 15.9779L13.9383 14.9172L12.8776 13.8565C13.9375 12.7967 15.5018 12.5636 16.7847 13.1391L16.1708 14.5077ZM13.9383 14.9172L14.999 15.9779L14.4155 16.5614L13.3548 15.5007L12.2941 14.44L12.8776 13.8565L13.9383 14.9172ZM13.3548 15.5007L14.4156 16.5612C14.2202 16.7567 14.2204 17.0734 14.4155 17.2685L13.3548 18.3291L12.2941 19.3898C10.9272 18.0229 10.9277 15.8069 12.294 14.4402L13.3548 15.5007ZM13.3548 18.3291L14.4155 17.2685L14.7428 17.5958L13.6821 18.6564L12.6215 19.7171L12.2941 19.3898L13.3548 18.3291ZM13.6821 18.6564L14.7428 17.5958C14.9378 17.7908 15.2546 17.791 15.45 17.5956L16.5105 18.6564L17.5711 19.7172C16.2044 21.0836 13.9884 21.084 12.6215 19.7171L13.6821 18.6564ZM16.5105 18.6564L15.4499 17.5958L16.0334 17.0123L17.094 18.0729L18.1547 19.1336L17.5712 19.7171L16.5105 18.6564ZM17.094 18.0729L16.0334 17.0123C16.1795 16.8662 16.2185 16.6481 16.1385 16.4615L17.5173 15.8708L18.8962 15.2802C19.4413 16.5526 19.1996 18.0887 18.1547 19.1336L17.094 18.0729ZM17.5173 15.8708L18.578 16.9315L17.835 17.6745L16.7743 16.6138L15.7137 15.5532L16.4567 14.8102L17.5173 15.8708ZM16.7743 16.6138L18.2736 16.5664C18.2945 17.226 18.0544 17.9026 17.5436 18.4134L16.4829 17.3527L15.4223 16.2921C15.3182 16.3961 15.2711 16.5346 15.2751 16.6613L16.7743 16.6138ZM16.4829 17.3527L17.5436 18.4134L16.8558 19.1011L15.7952 18.0405L14.7345 16.9798L15.4223 16.2921L16.4829 17.3527ZM15.7952 18.0405L16.8556 19.1013C15.8795 20.0771 14.2967 20.0776 13.3203 19.1011L14.3809 18.0405L15.4416 16.9798C15.2461 16.7844 14.9297 16.7847 14.7347 16.9797L15.7952 18.0405ZM14.3809 18.0405L13.3203 19.1011L12.8963 18.6772L13.957 17.6165L15.0176 16.5558L15.4416 16.9798L14.3809 18.0405ZM13.957 17.6165L12.8959 18.6767C11.9207 17.7008 11.92 16.1182 12.8961 15.1418L13.957 16.2023L15.0178 17.2628C15.2133 17.0672 15.2128 16.7512 15.018 16.5563L13.957 17.6165ZM13.957 16.2023L12.8963 15.1416L13.5841 14.4539L14.6447 15.5145L15.7054 16.5752L15.0176 17.2629L13.957 16.2023ZM14.6447 15.5145L13.5841 14.4539C14.1364 13.9015 14.8848 13.6626 15.6007 13.734L15.452 15.2266L15.3032 16.7192C15.443 16.7331 15.5943 16.6862 15.7054 16.5752L14.6447 15.5145ZM15.452 15.2266L14.3913 14.1659L15.1101 13.4471L16.1708 14.5077L17.2315 15.5684L16.5126 16.2872L15.452 15.2266Z" fill="#8E8E8F" mask="url(#path-5-outside-2_9822_43516)"/>
|
|
113
|
+
<path d="M20.6852 11.1208C19.9042 10.3398 18.6378 10.3398 17.8568 11.1208L17.2733 11.7043C16.6707 12.3069 16.5358 13.1973 16.8631 13.9319L17.5916 13.2034C17.5657 12.9181 17.6619 12.6236 17.8803 12.4052L18.5674 11.7181C18.9579 11.3276 19.5911 11.3276 19.9816 11.7181L20.4056 12.1421C20.7959 12.5326 20.796 13.1658 20.4056 13.5563L19.7185 14.2434C19.5128 14.449 19.2393 14.5457 18.9699 14.5348L18.2235 15.2812C18.9538 15.596 19.8325 15.4565 20.429 14.86L21.0125 14.2765C21.7935 13.4955 21.7936 12.2291 21.0125 11.4481L20.6852 11.1208Z" fill="white"/>
|
|
114
|
+
<rect width="2.59942" height="2.97264" rx="1" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 21.1133 12.8486)" fill="#8E8E8F"/>
|
|
115
|
+
<rect width="1.91578" height="4.24403" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 19.6992 13.8066)" fill="#8E8E8F"/>
|
|
116
|
+
<rect width="2.59942" height="2.97264" rx="1" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 17.3125 16.6455)" fill="#8E8E8F"/>
|
|
117
|
+
</g>
|
|
118
|
+
</svg>`;
|
|
119
|
+
/**
|
|
120
|
+
* 遍历割草任务,下述四个字段可以在路径中唯一确定遍历的位置(当前区域、当前块、当前行、在当前行上的路程)
|
|
121
|
+
*/
|
|
122
|
+
const ACTION_BLOCK_COVER = 5;
|
|
123
|
+
/**
|
|
124
|
+
* 遍历割草块转移任务(在同一区域中的一个块转移到下一个块),下述四个字段可以在路径中唯一确定转移的位置(当前区域、前置块、当前转移路径线序号、在当前线上的路程)
|
|
125
|
+
*/
|
|
126
|
+
const ACTION_BLOCK_TRANSFER = 6;
|
|
127
|
+
/**
|
|
128
|
+
* 边界割草任务(割草任务内部的巡边任务)
|
|
129
|
+
*/
|
|
130
|
+
const ACTION_BOUNDARY_TASK = 8;
|
|
131
|
+
const SVG_MAP_VIEW_ID = 'fleet-maps-svg-map-view';
|
|
132
|
+
|
|
4
133
|
/**
|
|
5
134
|
* SVG基础MapView
|
|
6
135
|
* 使用真正的矢量SVG渲染替代Canvas位图渲染
|
|
@@ -56,6 +185,7 @@ class SvgMapView {
|
|
|
56
185
|
this.svg.setAttribute('shape-rendering', 'geometricPrecision');
|
|
57
186
|
this.svg.setAttribute('text-rendering', 'geometricPrecision');
|
|
58
187
|
this.svg.setAttribute('image-rendering', 'optimizeQuality');
|
|
188
|
+
this.svg.setAttribute('id', SVG_MAP_VIEW_ID);
|
|
59
189
|
}
|
|
60
190
|
/**
|
|
61
191
|
* 创建SVG组元素
|
|
@@ -118,7 +248,7 @@ class SvgMapView {
|
|
|
118
248
|
* 设置自适应视图变换 - 让SVG刚好包裹住图形
|
|
119
249
|
*/
|
|
120
250
|
fitToView(bounds) {
|
|
121
|
-
const padding =
|
|
251
|
+
const padding = 20; // 添加一些边距以避免内容贴边
|
|
122
252
|
const boundWidth = bounds.maxX - bounds.minX;
|
|
123
253
|
const boundHeight = bounds.maxY - bounds.minY;
|
|
124
254
|
// 防止宽高为0的情况
|
|
@@ -141,9 +271,10 @@ class SvgMapView {
|
|
|
141
271
|
this.viewBox = {
|
|
142
272
|
x: bounds.minX - padding,
|
|
143
273
|
y: bounds.minY - padding,
|
|
144
|
-
width: boundWidth + padding,
|
|
145
|
-
height: boundHeight + padding,
|
|
274
|
+
width: boundWidth + padding * 2,
|
|
275
|
+
height: boundHeight + padding * 2,
|
|
146
276
|
};
|
|
277
|
+
console.log('viewbox->', this.viewBox);
|
|
147
278
|
// 根据宽高比选择合适的preserveAspectRatio设置
|
|
148
279
|
if (Math.abs(contentAspectRatio - containerAspectRatio) < 0.01) {
|
|
149
280
|
// 宽高比接近,使用slice填满容器
|
|
@@ -266,7 +397,7 @@ class SvgMapView {
|
|
|
266
397
|
// const layerType = layerIdParts.slice(1, -1).join('-'); // 处理类型名中可能包含连字符的情况
|
|
267
398
|
// const layerLevel = parseInt(layerIdParts[layerIdParts.length - 1]);
|
|
268
399
|
// // 查找对应的图层对象
|
|
269
|
-
// const targetLayer = this.layers.find(layer =>
|
|
400
|
+
// const targetLayer = this.layers.find(layer =>
|
|
270
401
|
// layer.getType() === layerType && layer.getLevel() === layerLevel
|
|
271
402
|
// );
|
|
272
403
|
// if (targetLayer && targetLayer.isVisible()) {
|
|
@@ -649,8 +780,6 @@ const create = (createState) => createState ? createImpl(createState) : createIm
|
|
|
649
780
|
|
|
650
781
|
const useSubBoundaryBorderStore = create((set, get) => ({
|
|
651
782
|
subBoundaryBorder: {},
|
|
652
|
-
// 覆盖所有数据
|
|
653
|
-
setSubBoundaryBorder: (subBoundaryBorder) => set({ subBoundaryBorder }),
|
|
654
783
|
// 追加单个数据
|
|
655
784
|
addSubBoundaryBorder: (key, element) => set((state) => ({
|
|
656
785
|
subBoundaryBorder: {
|
|
@@ -658,134 +787,28 @@ const useSubBoundaryBorderStore = create((set, get) => ({
|
|
|
658
787
|
[key]: element,
|
|
659
788
|
},
|
|
660
789
|
})),
|
|
661
|
-
// 追加多个数据
|
|
662
|
-
addMultipleSubBoundaryBorders: (borders) => set((state) => ({
|
|
663
|
-
subBoundaryBorder: {
|
|
664
|
-
...state.subBoundaryBorder,
|
|
665
|
-
...borders,
|
|
666
|
-
},
|
|
667
|
-
})),
|
|
668
790
|
// 清空所有数据
|
|
669
791
|
clearSubBoundaryBorder: () => set({ subBoundaryBorder: {} }),
|
|
792
|
+
// 障碍物
|
|
793
|
+
obstacles: {},
|
|
794
|
+
addObstacles: (key, element) => set((state) => ({
|
|
795
|
+
obstacles: {
|
|
796
|
+
...state.obstacles,
|
|
797
|
+
[key]: element,
|
|
798
|
+
},
|
|
799
|
+
})),
|
|
800
|
+
clearObstacles: () => set({ obstacles: {} }),
|
|
801
|
+
// svg数据
|
|
802
|
+
svgElements: {},
|
|
803
|
+
addSvgElements: (key, element) => set((state) => ({
|
|
804
|
+
svgElements: {
|
|
805
|
+
...state.svgElements,
|
|
806
|
+
[key]: element,
|
|
807
|
+
},
|
|
808
|
+
})),
|
|
809
|
+
clearSvgElements: () => set({ svgElements: {} }),
|
|
670
810
|
}));
|
|
671
811
|
|
|
672
|
-
/**
|
|
673
|
-
* 地图渲染相关常量配置
|
|
674
|
-
*/
|
|
675
|
-
/**
|
|
676
|
-
* 缩放因子 - 将米转换为像素
|
|
677
|
-
* 与Python代码中的SVG比例一致
|
|
678
|
-
*/
|
|
679
|
-
const SCALE_FACTOR = 50; // 50像素/米
|
|
680
|
-
/**
|
|
681
|
-
* 默认线宽设置
|
|
682
|
-
*/
|
|
683
|
-
const DEFAULT_LINE_WIDTHS = {
|
|
684
|
-
OBSTACLE: 2,
|
|
685
|
-
CHARGING_PILE: 2,
|
|
686
|
-
CHANNEL: 2,
|
|
687
|
-
PATH: 20,
|
|
688
|
-
VISION_OFF_AREA: 2,
|
|
689
|
-
TIME_LIMIT_OBSTACLE: 1,
|
|
690
|
-
};
|
|
691
|
-
/**
|
|
692
|
-
* 默认透明度设置
|
|
693
|
-
*/
|
|
694
|
-
const DEFAULT_OPACITIES = {
|
|
695
|
-
FULL: 1.0,
|
|
696
|
-
HIGH: 0.7,
|
|
697
|
-
LOW: 0.4};
|
|
698
|
-
/**
|
|
699
|
-
* 默认半径设置
|
|
700
|
-
*/
|
|
701
|
-
const DEFAULT_RADII = {
|
|
702
|
-
CHARGING_PILE: 12};
|
|
703
|
-
/**
|
|
704
|
-
* 图层等级
|
|
705
|
-
*/
|
|
706
|
-
const LAYER_LEVELS = {
|
|
707
|
-
BOUNDARY: 2,
|
|
708
|
-
BOUNDARY_BORDER: 4};
|
|
709
|
-
/**
|
|
710
|
-
* 图层默认id
|
|
711
|
-
*/
|
|
712
|
-
const LAYER_DEFAULT_TYPE = {
|
|
713
|
-
CHANNEL: 'channel',
|
|
714
|
-
BOUNDARY: 'boundary',
|
|
715
|
-
PATH: 'path',
|
|
716
|
-
BOUNDARY_BORDER: 'boundary_border',
|
|
717
|
-
OBSTACLE: 'obstacle',
|
|
718
|
-
CHARGING_PILE: 'charging_pile',
|
|
719
|
-
POINT: 'point',
|
|
720
|
-
SVG: 'svg',
|
|
721
|
-
VISION_OFF_AREA: 'vision_off_area',
|
|
722
|
-
ANTENNA: 'antenna',
|
|
723
|
-
};
|
|
724
|
-
var RobotStatus;
|
|
725
|
-
(function (RobotStatus) {
|
|
726
|
-
RobotStatus[RobotStatus["PARKED"] = 1] = "PARKED";
|
|
727
|
-
RobotStatus[RobotStatus["CHARGING"] = 2] = "CHARGING";
|
|
728
|
-
RobotStatus[RobotStatus["STANDBY"] = 3] = "STANDBY";
|
|
729
|
-
RobotStatus[RobotStatus["MOWING"] = 4] = "MOWING";
|
|
730
|
-
RobotStatus[RobotStatus["WORKING"] = 5] = "WORKING";
|
|
731
|
-
RobotStatus[RobotStatus["MAPPING"] = 6] = "MAPPING";
|
|
732
|
-
RobotStatus[RobotStatus["ERROR"] = 7] = "ERROR";
|
|
733
|
-
RobotStatus[RobotStatus["UPGRADING"] = 8] = "UPGRADING";
|
|
734
|
-
RobotStatus[RobotStatus["DISCONNECTED"] = 9] = "DISCONNECTED";
|
|
735
|
-
RobotStatus[RobotStatus["UNKNOWN"] = -1] = "UNKNOWN";
|
|
736
|
-
RobotStatus[RobotStatus["TASK_DELAY"] = 10] = "TASK_DELAY";
|
|
737
|
-
// WAITING = 'Waiting',
|
|
738
|
-
})(RobotStatus || (RobotStatus = {}));
|
|
739
|
-
// RTK状态
|
|
740
|
-
var RTK_STATE;
|
|
741
|
-
(function (RTK_STATE) {
|
|
742
|
-
RTK_STATE[RTK_STATE["LOW_RTK"] = 1] = "LOW_RTK";
|
|
743
|
-
RTK_STATE[RTK_STATE["MIDDLE_RTK"] = 2] = "MIDDLE_RTK";
|
|
744
|
-
RTK_STATE[RTK_STATE["HIGH_RTK"] = 3] = "HIGH_RTK";
|
|
745
|
-
RTK_STATE[RTK_STATE["NO_POSTURE"] = 10] = "NO_POSTURE";
|
|
746
|
-
RTK_STATE[RTK_STATE["OUT_OF_RANGE"] = 11] = "OUT_OF_RANGE";
|
|
747
|
-
RTK_STATE[RTK_STATE["OFF_LINE"] = 19] = "OFF_LINE";
|
|
748
|
-
})(RTK_STATE || (RTK_STATE = {}));
|
|
749
|
-
var REAL_TIME_DATA_TYPE;
|
|
750
|
-
(function (REAL_TIME_DATA_TYPE) {
|
|
751
|
-
REAL_TIME_DATA_TYPE[REAL_TIME_DATA_TYPE["LOCATION"] = 1] = "LOCATION";
|
|
752
|
-
REAL_TIME_DATA_TYPE[REAL_TIME_DATA_TYPE["PROCESS"] = 2] = "PROCESS";
|
|
753
|
-
})(REAL_TIME_DATA_TYPE || (REAL_TIME_DATA_TYPE = {}));
|
|
754
|
-
const ISOLATED_BOUNDARY_SVG = `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
755
|
-
<g opacity="0.6">
|
|
756
|
-
<rect width="24" height="24" rx="12" fill="#1E1E1F" fill-opacity="0.5"/>
|
|
757
|
-
<path d="M8.20573 12.4961C6.739 11.1707 4.85775 11.2284 3.60938 11.1707C6.17744 13.0156 6.05584 15.7887 5.67404 16.9446H14.327C13.837 13.1673 15.5321 10.1289 16.4408 9.08187C15.0342 9.46118 13.5794 10.8303 13.0278 11.4674C12.8102 8.94572 13.992 5.97489 14.61 4.80469C12.5235 5.92214 11.0501 8.26056 10.4938 9.56261C9.22803 7.5947 6.83894 7.17806 5.883 6.9432C8.20573 10.2373 8.00039 11.1707 8.20573 12.4961Z" fill="white"/>
|
|
758
|
-
<mask id="path-3-outside-1_9822_43516" maskUnits="userSpaceOnUse" x="13.2344" y="7.20545" width="12.0208" height="12.0208" fill="black">
|
|
759
|
-
<rect fill="white" x="13.2344" y="7.20545" width="12.0208" height="12.0208"/>
|
|
760
|
-
<path d="M20.6852 11.1208C19.9042 10.3398 18.6378 10.3398 17.8568 11.1208L17.2733 11.7043C16.6707 12.3069 16.5358 13.1973 16.8631 13.9319L17.5916 13.2034C17.5657 12.9181 17.6619 12.6236 17.8803 12.4052L18.5674 11.7181C18.9579 11.3276 19.5911 11.3276 19.9816 11.7181L20.4056 12.1421C20.7959 12.5326 20.796 13.1658 20.4056 13.5563L19.7185 14.2434C19.5128 14.449 19.2393 14.5457 18.9699 14.5348L18.2235 15.2812C18.9538 15.596 19.8325 15.4565 20.429 14.86L21.0125 14.2765C21.7935 13.4955 21.7936 12.2291 21.0125 11.4481L20.6852 11.1208Z"/>
|
|
761
|
-
</mask>
|
|
762
|
-
<path d="M20.6852 11.1208C19.9042 10.3398 18.6378 10.3398 17.8568 11.1208L17.2733 11.7043C16.6707 12.3069 16.5358 13.1973 16.8631 13.9319L17.5916 13.2034C17.5657 12.9181 17.6619 12.6236 17.8803 12.4052L18.5674 11.7181C18.9579 11.3276 19.5911 11.3276 19.9816 11.7181L20.4056 12.1421C20.7959 12.5326 20.796 13.1658 20.4056 13.5563L19.7185 14.2434C19.5128 14.449 19.2393 14.5457 18.9699 14.5348L18.2235 15.2812C18.9538 15.596 19.8325 15.4565 20.429 14.86L21.0125 14.2765C21.7935 13.4955 21.7936 12.2291 21.0125 11.4481L20.6852 11.1208Z" fill="white"/>
|
|
763
|
-
<path d="M20.6852 11.1208L21.7458 10.0601L21.7459 10.0601L20.6852 11.1208ZM17.8568 11.1208L16.7961 10.0601L16.7962 10.0601L17.8568 11.1208ZM17.2733 11.7043L16.2126 10.6437L16.2126 10.6436L17.2733 11.7043ZM16.8631 13.9319L17.9238 14.9926L16.381 16.5354L15.493 14.5425L16.8631 13.9319ZM17.5916 13.2034L19.0855 13.0678L19.149 13.7674L18.6523 14.2641L17.5916 13.2034ZM20.4056 12.1421L21.4662 11.0814L21.4665 11.0817L20.4056 12.1421ZM18.9699 14.5348L17.9093 13.4741L18.3741 13.0093L19.0309 13.036L18.9699 14.5348ZM18.2235 15.2812L17.6298 16.6587L15.5997 15.7837L17.1628 14.2206L18.2235 15.2812ZM20.429 14.86L21.4897 15.9207L21.4897 15.9207L20.429 14.86ZM21.0125 14.2765L22.0732 15.3371L22.0732 15.3372L21.0125 14.2765ZM20.6852 11.1208L19.6246 12.1815C19.4294 11.9862 19.1127 11.9863 18.9174 12.1815L17.8568 11.1208L16.7962 10.0601C18.163 8.69337 20.379 8.6934 21.7458 10.0601L20.6852 11.1208ZM17.8568 11.1208L18.9175 12.1814L18.334 12.7649L17.2733 11.7043L16.2126 10.6436L16.7961 10.0601L17.8568 11.1208ZM17.2733 11.7043L18.334 12.7649C18.1877 12.9112 18.1488 13.1318 18.2333 13.3214L16.8631 13.9319L15.493 14.5425C14.9228 13.2629 15.1537 11.7026 16.2126 10.6437L17.2733 11.7043ZM16.8631 13.9319L15.8025 12.8713L16.531 12.1428L17.5916 13.2034L18.6523 14.2641L17.9238 14.9926L16.8631 13.9319ZM17.5916 13.2034L16.0978 13.339C16.0334 12.6302 16.2727 11.8914 16.8196 11.3445L17.8803 12.4052L18.9409 13.4658C19.051 13.3558 19.098 13.206 19.0855 13.0678L17.5916 13.2034ZM17.8803 12.4052L16.8196 11.3445L17.5067 10.6574L18.5674 11.7181L19.628 12.7788L18.9409 13.4658L17.8803 12.4052ZM18.5674 11.7181L17.5067 10.6574C18.483 9.68112 20.0659 9.68112 21.0422 10.6574L19.9816 11.7181L18.9209 12.7788C19.1162 12.974 19.4328 12.974 19.628 12.7788L18.5674 11.7181ZM19.9816 11.7181L21.0422 10.6574L21.4662 11.0814L20.4056 12.1421L19.3449 13.2027L18.9209 12.7788L19.9816 11.7181ZM20.4056 12.1421L21.4665 11.0817C22.4419 12.0577 22.4428 13.6404 21.4662 14.617L20.4056 13.5563L19.3449 12.4956C19.1493 12.6913 19.1498 13.0076 19.3446 13.2024L20.4056 12.1421ZM20.4056 13.5563L21.4662 14.617L20.7791 15.304L19.7185 14.2434L18.6578 13.1827L19.3449 12.4956L20.4056 13.5563ZM19.7185 14.2434L20.7791 15.304C20.2628 15.8204 19.5762 16.0607 18.909 16.0335L18.9699 14.5348L19.0309 13.036C18.9025 13.0308 18.7629 13.0777 18.6578 13.1827L19.7185 14.2434ZM18.9699 14.5348L20.0306 15.5954L19.2841 16.3419L18.2235 15.2812L17.1628 14.2206L17.9093 13.4741L18.9699 14.5348ZM18.2235 15.2812L18.8172 13.9037C19.0042 13.9843 19.2223 13.9455 19.3684 13.7993L20.429 14.86L21.4897 15.9207C20.4427 16.9676 18.9034 17.2077 17.6298 16.6587L18.2235 15.2812ZM20.429 14.86L19.3684 13.7994L19.9519 13.2159L21.0125 14.2765L22.0732 15.3372L21.4897 15.9207L20.429 14.86ZM21.0125 14.2765L19.9518 13.2159C20.1471 13.0206 20.1471 12.704 19.9519 12.5088L21.0125 11.4481L22.0732 10.3874C23.4401 11.7543 23.4399 13.9703 22.0732 15.3371L21.0125 14.2765ZM21.0125 11.4481L19.9519 12.5088L19.6246 12.1814L20.6852 11.1208L21.7459 10.0601L22.0732 10.3874L21.0125 11.4481Z" fill="#8E8E8F" mask="url(#path-3-outside-1_9822_43516)"/>
|
|
764
|
-
<mask id="path-5-outside-2_9822_43516" maskUnits="userSpaceOnUse" x="9.22265" y="10.388" width="12.7279" height="12.7279" fill="black">
|
|
765
|
-
<rect fill="white" x="9.22265" y="10.388" width="12.7279" height="12.7279"/>
|
|
766
|
-
<path d="M16.1708 14.5077C15.4353 14.1778 14.5422 14.3133 13.9383 14.9172L13.3548 15.5007C12.574 16.2818 12.5738 17.5481 13.3548 18.3291L13.6821 18.6564C14.4631 19.4374 15.7295 19.4373 16.5105 18.6564L17.094 18.0729C17.6895 17.4775 17.8299 16.6003 17.5173 15.8708L16.7743 16.6138C16.7828 16.8803 16.6863 17.1494 16.4829 17.3527L15.7952 18.0405C15.4046 18.4309 14.7714 18.431 14.3809 18.0405L13.957 17.6165C13.5667 17.226 13.5666 16.5927 13.957 16.2023L14.6447 15.5145C14.8654 15.2939 15.1639 15.1979 15.452 15.2266L16.1708 14.5077Z"/>
|
|
767
|
-
</mask>
|
|
768
|
-
<path d="M16.1708 14.5077C15.4353 14.1778 14.5422 14.3133 13.9383 14.9172L13.3548 15.5007C12.574 16.2818 12.5738 17.5481 13.3548 18.3291L13.6821 18.6564C14.4631 19.4374 15.7295 19.4373 16.5105 18.6564L17.094 18.0729C17.6895 17.4775 17.8299 16.6003 17.5173 15.8708L16.7743 16.6138C16.7828 16.8803 16.6863 17.1494 16.4829 17.3527L15.7952 18.0405C15.4046 18.4309 14.7714 18.431 14.3809 18.0405L13.957 17.6165C13.5667 17.226 13.5666 16.5927 13.957 16.2023L14.6447 15.5145C14.8654 15.2939 15.1639 15.1979 15.452 15.2266L16.1708 14.5077Z" fill="white"/>
|
|
769
|
-
<path d="M16.1708 14.5077L16.7847 13.1391L18.7701 14.0297L17.2315 15.5684L16.1708 14.5077ZM13.3548 15.5007L12.294 14.4402L12.2941 14.44L13.3548 15.5007ZM16.5105 18.6564L17.5712 19.7171L17.5711 19.7172L16.5105 18.6564ZM17.5173 15.8708L16.4567 14.8102L18.0236 13.2433L18.8962 15.2802L17.5173 15.8708ZM16.7743 16.6138L15.2751 16.6613L15.2545 16.0123L15.7137 15.5532L16.7743 16.6138ZM15.7952 18.0405L16.8558 19.1011L16.8556 19.1013L15.7952 18.0405ZM13.957 17.6165L12.8963 18.6772L12.8959 18.6767L13.957 17.6165ZM13.957 16.2023L12.8961 15.1418L12.8963 15.1416L13.957 16.2023ZM15.452 15.2266L16.5126 16.2872L16.0102 16.7896L15.3032 16.7192L15.452 15.2266ZM16.1708 14.5077L15.5569 15.8763C15.3688 15.792 15.1469 15.8299 14.999 15.9779L13.9383 14.9172L12.8776 13.8565C13.9375 12.7967 15.5018 12.5636 16.7847 13.1391L16.1708 14.5077ZM13.9383 14.9172L14.999 15.9779L14.4155 16.5614L13.3548 15.5007L12.2941 14.44L12.8776 13.8565L13.9383 14.9172ZM13.3548 15.5007L14.4156 16.5612C14.2202 16.7567 14.2204 17.0734 14.4155 17.2685L13.3548 18.3291L12.2941 19.3898C10.9272 18.0229 10.9277 15.8069 12.294 14.4402L13.3548 15.5007ZM13.3548 18.3291L14.4155 17.2685L14.7428 17.5958L13.6821 18.6564L12.6215 19.7171L12.2941 19.3898L13.3548 18.3291ZM13.6821 18.6564L14.7428 17.5958C14.9378 17.7908 15.2546 17.791 15.45 17.5956L16.5105 18.6564L17.5711 19.7172C16.2044 21.0836 13.9884 21.084 12.6215 19.7171L13.6821 18.6564ZM16.5105 18.6564L15.4499 17.5958L16.0334 17.0123L17.094 18.0729L18.1547 19.1336L17.5712 19.7171L16.5105 18.6564ZM17.094 18.0729L16.0334 17.0123C16.1795 16.8662 16.2185 16.6481 16.1385 16.4615L17.5173 15.8708L18.8962 15.2802C19.4413 16.5526 19.1996 18.0887 18.1547 19.1336L17.094 18.0729ZM17.5173 15.8708L18.578 16.9315L17.835 17.6745L16.7743 16.6138L15.7137 15.5532L16.4567 14.8102L17.5173 15.8708ZM16.7743 16.6138L18.2736 16.5664C18.2945 17.226 18.0544 17.9026 17.5436 18.4134L16.4829 17.3527L15.4223 16.2921C15.3182 16.3961 15.2711 16.5346 15.2751 16.6613L16.7743 16.6138ZM16.4829 17.3527L17.5436 18.4134L16.8558 19.1011L15.7952 18.0405L14.7345 16.9798L15.4223 16.2921L16.4829 17.3527ZM15.7952 18.0405L16.8556 19.1013C15.8795 20.0771 14.2967 20.0776 13.3203 19.1011L14.3809 18.0405L15.4416 16.9798C15.2461 16.7844 14.9297 16.7847 14.7347 16.9797L15.7952 18.0405ZM14.3809 18.0405L13.3203 19.1011L12.8963 18.6772L13.957 17.6165L15.0176 16.5558L15.4416 16.9798L14.3809 18.0405ZM13.957 17.6165L12.8959 18.6767C11.9207 17.7008 11.92 16.1182 12.8961 15.1418L13.957 16.2023L15.0178 17.2628C15.2133 17.0672 15.2128 16.7512 15.018 16.5563L13.957 17.6165ZM13.957 16.2023L12.8963 15.1416L13.5841 14.4539L14.6447 15.5145L15.7054 16.5752L15.0176 17.2629L13.957 16.2023ZM14.6447 15.5145L13.5841 14.4539C14.1364 13.9015 14.8848 13.6626 15.6007 13.734L15.452 15.2266L15.3032 16.7192C15.443 16.7331 15.5943 16.6862 15.7054 16.5752L14.6447 15.5145ZM15.452 15.2266L14.3913 14.1659L15.1101 13.4471L16.1708 14.5077L17.2315 15.5684L16.5126 16.2872L15.452 15.2266Z" fill="#8E8E8F" mask="url(#path-5-outside-2_9822_43516)"/>
|
|
770
|
-
<path d="M20.6852 11.1208C19.9042 10.3398 18.6378 10.3398 17.8568 11.1208L17.2733 11.7043C16.6707 12.3069 16.5358 13.1973 16.8631 13.9319L17.5916 13.2034C17.5657 12.9181 17.6619 12.6236 17.8803 12.4052L18.5674 11.7181C18.9579 11.3276 19.5911 11.3276 19.9816 11.7181L20.4056 12.1421C20.7959 12.5326 20.796 13.1658 20.4056 13.5563L19.7185 14.2434C19.5128 14.449 19.2393 14.5457 18.9699 14.5348L18.2235 15.2812C18.9538 15.596 19.8325 15.4565 20.429 14.86L21.0125 14.2765C21.7935 13.4955 21.7936 12.2291 21.0125 11.4481L20.6852 11.1208Z" fill="white"/>
|
|
771
|
-
<rect width="2.59942" height="2.97264" rx="1" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 21.1133 12.8486)" fill="#8E8E8F"/>
|
|
772
|
-
<rect width="1.91578" height="4.24403" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 19.6992 13.8066)" fill="#8E8E8F"/>
|
|
773
|
-
<rect width="2.59942" height="2.97264" rx="1" transform="matrix(-0.707107 -0.707107 -0.707107 0.707107 17.3125 16.6455)" fill="#8E8E8F"/>
|
|
774
|
-
</g>
|
|
775
|
-
</svg>`;
|
|
776
|
-
/**
|
|
777
|
-
* 遍历割草任务,下述四个字段可以在路径中唯一确定遍历的位置(当前区域、当前块、当前行、在当前行上的路程)
|
|
778
|
-
*/
|
|
779
|
-
const ACTION_BLOCK_COVER = 5;
|
|
780
|
-
/**
|
|
781
|
-
* 遍历割草块转移任务(在同一区域中的一个块转移到下一个块),下述四个字段可以在路径中唯一确定转移的位置(当前区域、前置块、当前转移路径线序号、在当前线上的路程)
|
|
782
|
-
*/
|
|
783
|
-
const ACTION_BLOCK_TRANSFER = 6;
|
|
784
|
-
/**
|
|
785
|
-
* 边界割草任务(割草任务内部的巡边任务)
|
|
786
|
-
*/
|
|
787
|
-
const ACTION_BOUNDARY_TASK = 8;
|
|
788
|
-
|
|
789
812
|
/**
|
|
790
813
|
* 路径图层
|
|
791
814
|
* 专门处理路径元素的渲染
|
|
@@ -836,51 +859,90 @@ class ChannelLayer extends BaseLayer {
|
|
|
836
859
|
}
|
|
837
860
|
// �� 修改:计算包含所有分区和通道的边界框
|
|
838
861
|
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
839
|
-
// 1.
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
862
|
+
// 1. 先计算所有分区的边界,如果能拿到边界的svg的大小,就使用这个如果拿不到,就根据分区去计算
|
|
863
|
+
const svg = document.getElementById(SVG_MAP_VIEW_ID);
|
|
864
|
+
if (svg && svg instanceof SVGSVGElement && svg.viewBox) {
|
|
865
|
+
const viewBox = svg.viewBox.baseVal;
|
|
866
|
+
minX = viewBox.x;
|
|
867
|
+
minY = viewBox.y;
|
|
868
|
+
maxX = viewBox.x + viewBox.width;
|
|
869
|
+
maxY = viewBox.y + viewBox.height;
|
|
870
|
+
}
|
|
871
|
+
else {
|
|
872
|
+
for (const partitionId in subBoundaryBorder) {
|
|
873
|
+
const boundaryData = subBoundaryBorder[partitionId];
|
|
874
|
+
if (boundaryData && boundaryData.coordinates && boundaryData.coordinates.length > 0) {
|
|
875
|
+
for (const coord of boundaryData.coordinates) {
|
|
876
|
+
minX = Math.min(minX, coord[0]);
|
|
877
|
+
minY = Math.min(minY, coord[1]);
|
|
878
|
+
maxX = Math.max(maxX, coord[0]);
|
|
879
|
+
maxY = Math.max(maxY, coord[1]);
|
|
880
|
+
}
|
|
848
881
|
}
|
|
849
882
|
}
|
|
850
883
|
}
|
|
851
884
|
// 2. 再计算所有通道的边界
|
|
852
885
|
for (const element of this.elements) {
|
|
853
|
-
const tunnelConnection = element.originalData?.connection;
|
|
854
|
-
if (tunnelConnection && Array.isArray(tunnelConnection)) {
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
886
|
+
// const tunnelConnection = element.originalData?.connection;
|
|
887
|
+
// if (tunnelConnection && Array.isArray(tunnelConnection)) {
|
|
888
|
+
// const clipPathId = `channel-exclude-${
|
|
889
|
+
// element.originalData?.id || Math.random().toString(36).substr(2, 9)
|
|
890
|
+
// }`;
|
|
891
|
+
// // 检查是否已存在该 clipPath
|
|
892
|
+
// const existingClipPath = defs.querySelector(`#${clipPathId}`);
|
|
893
|
+
// if (existingClipPath) continue;
|
|
894
|
+
// // 创建 clipPath
|
|
895
|
+
// const clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');
|
|
896
|
+
// clipPath.setAttribute('id', clipPathId);
|
|
897
|
+
// clipPath.setAttribute('clipPathUnits', 'userSpaceOnUse');
|
|
898
|
+
// // === 合成一个 path ===
|
|
899
|
+
// let d = `M ${minX} ${minY} L ${maxX} ${minY} L ${maxX} ${maxY} L ${minX} ${maxY} Z`;
|
|
900
|
+
// for (const partitionId of tunnelConnection) {
|
|
901
|
+
// const boundaryData = subBoundaryBorder[partitionId];
|
|
902
|
+
// if (boundaryData && boundaryData.coordinates.length >= 3) {
|
|
903
|
+
// d += ` M ${boundaryData.coordinates[0][0]} ${boundaryData.coordinates[0][1]}`;
|
|
904
|
+
// for (let i = 1; i < boundaryData.coordinates.length; i++) {
|
|
905
|
+
// d += ` L ${boundaryData.coordinates[i][0]} ${boundaryData.coordinates[i][1]}`;
|
|
906
|
+
// }
|
|
907
|
+
// d += ' Z';
|
|
908
|
+
// }
|
|
909
|
+
// }
|
|
910
|
+
// const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
|
|
911
|
+
// path.setAttribute('d', d);
|
|
912
|
+
// path.setAttribute('clip-rule', 'evenodd'); // 关键
|
|
913
|
+
// clipPath.appendChild(path);
|
|
914
|
+
// defs.appendChild(clipPath);
|
|
915
|
+
// clipPathIdsMap[element.originalData?.id.toString()] = clipPathId;
|
|
916
|
+
// } else {
|
|
917
|
+
const clipPathId = `channel-exclude-all-${element.originalData?.id || Math.random().toString(36).substr(2, 9)}`;
|
|
918
|
+
// 检查是否已存在该 clipPath
|
|
919
|
+
const existingClipPath = defs.querySelector(`#${clipPathId}`);
|
|
920
|
+
if (existingClipPath)
|
|
921
|
+
continue;
|
|
922
|
+
// 创建 clipPath
|
|
923
|
+
const clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');
|
|
924
|
+
clipPath.setAttribute('id', clipPathId);
|
|
925
|
+
clipPath.setAttribute('clipPathUnits', 'userSpaceOnUse');
|
|
926
|
+
// === 合成一个 path ===
|
|
927
|
+
let d = `M ${minX} ${minY} L ${maxX} ${minY} L ${maxX} ${maxY} L ${minX} ${maxY} Z`;
|
|
928
|
+
for (const partitionId in subBoundaryBorder) {
|
|
929
|
+
const boundaryData = subBoundaryBorder[partitionId];
|
|
930
|
+
if (boundaryData && boundaryData.coordinates.length >= 3) {
|
|
931
|
+
d += ` M ${boundaryData.coordinates[0][0]} ${boundaryData.coordinates[0][1]}`;
|
|
932
|
+
for (let i = 1; i < boundaryData.coordinates.length; i++) {
|
|
933
|
+
d += ` L ${boundaryData.coordinates[i][0]} ${boundaryData.coordinates[i][1]}`;
|
|
874
934
|
}
|
|
935
|
+
d += ' Z';
|
|
875
936
|
}
|
|
876
|
-
const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
|
|
877
|
-
path.setAttribute('d', d);
|
|
878
|
-
path.setAttribute('clip-rule', 'evenodd'); // 关键
|
|
879
|
-
clipPath.appendChild(path);
|
|
880
|
-
defs.appendChild(clipPath);
|
|
881
|
-
clipPathIdsMap[element.originalData?.id.toString()] = clipPathId;
|
|
882
937
|
}
|
|
938
|
+
const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
|
|
939
|
+
path.setAttribute('d', d);
|
|
940
|
+
path.setAttribute('clip-rule', 'evenodd'); // 关键
|
|
941
|
+
clipPath.appendChild(path);
|
|
942
|
+
defs.appendChild(clipPath);
|
|
943
|
+
clipPathIdsMap[element.originalData?.id.toString()] = clipPathId;
|
|
883
944
|
}
|
|
945
|
+
// }
|
|
884
946
|
return clipPathIdsMap;
|
|
885
947
|
}
|
|
886
948
|
/**
|
|
@@ -951,7 +1013,7 @@ class PathLayer extends BaseLayer {
|
|
|
951
1013
|
* 创建所有分区并集的 clipPath
|
|
952
1014
|
*/
|
|
953
1015
|
createUnionClipPath(svgGroup) {
|
|
954
|
-
const { subBoundaryBorder } = useSubBoundaryBorderStore.getState();
|
|
1016
|
+
const { subBoundaryBorder, obstacles, svgElements } = useSubBoundaryBorderStore.getState();
|
|
955
1017
|
// 确保 defs 元素存在
|
|
956
1018
|
let defs = svgGroup.querySelector('defs');
|
|
957
1019
|
if (!defs) {
|
|
@@ -965,7 +1027,7 @@ class PathLayer extends BaseLayer {
|
|
|
965
1027
|
defs.removeChild(existing);
|
|
966
1028
|
// 合成所有分区的 path
|
|
967
1029
|
let d = '';
|
|
968
|
-
//
|
|
1030
|
+
// 1. 外圈(主边界,顺时针)
|
|
969
1031
|
Object.values(subBoundaryBorder).forEach((item) => {
|
|
970
1032
|
const bCoords = item.coordinates;
|
|
971
1033
|
if (bCoords.length >= 3) {
|
|
@@ -976,6 +1038,27 @@ class PathLayer extends BaseLayer {
|
|
|
976
1038
|
d += ' Z ';
|
|
977
1039
|
}
|
|
978
1040
|
});
|
|
1041
|
+
// 2. 内圈(禁区,逆时针)
|
|
1042
|
+
Object.values(obstacles).forEach((item) => {
|
|
1043
|
+
const bCoords = item.coordinates;
|
|
1044
|
+
if (bCoords.length >= 3) {
|
|
1045
|
+
d += `M ${bCoords[bCoords.length - 1][0]} ${bCoords[bCoords.length - 1][1]}`;
|
|
1046
|
+
for (let i = bCoords.length - 2; i >= 0; i--) {
|
|
1047
|
+
d += ` L ${bCoords[i][0]} ${bCoords[i][1]}`;
|
|
1048
|
+
}
|
|
1049
|
+
d += ' Z ';
|
|
1050
|
+
}
|
|
1051
|
+
});
|
|
1052
|
+
console.error('svgElements----', svgElements);
|
|
1053
|
+
// 3. svgElements(直接拼接path字符串,建议逆时针)
|
|
1054
|
+
if (Array.isArray(svgElements)) {
|
|
1055
|
+
svgElements.forEach((svgPath) => {
|
|
1056
|
+
const svgPathString = svgPath?.metadata?.svg;
|
|
1057
|
+
if (svgPathString && typeof svgPathString === 'string' && svgPathString.trim()) {
|
|
1058
|
+
d += svgPathString + ' ';
|
|
1059
|
+
}
|
|
1060
|
+
});
|
|
1061
|
+
}
|
|
979
1062
|
const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
|
|
980
1063
|
path.setAttribute('d', d);
|
|
981
1064
|
const clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');
|
|
@@ -1148,7 +1231,7 @@ class ObstacleLayer extends BaseLayer {
|
|
|
1148
1231
|
}
|
|
1149
1232
|
}
|
|
1150
1233
|
|
|
1151
|
-
var chargingPileImage = "data:image/png;base64,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";
|
|
1234
|
+
var chargingPileImage = "data:image/png;base64,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";
|
|
1152
1235
|
|
|
1153
1236
|
/**
|
|
1154
1237
|
* 充电桩图层
|
|
@@ -1338,7 +1421,7 @@ class SvgElementLayer extends BaseLayer {
|
|
|
1338
1421
|
// 在transformGroup上应用变换:平移到中心,旋转,缩放,然后居中SVG
|
|
1339
1422
|
const transform = [
|
|
1340
1423
|
`translate(${center[0]}, ${center[1]})`,
|
|
1341
|
-
`rotate(${(direction * 180) / Math.PI})`,
|
|
1424
|
+
`rotate(${-(direction * 180) / Math.PI})`,
|
|
1342
1425
|
`scale(${userScale})`,
|
|
1343
1426
|
`translate(${-originalWidth / 2}, ${-originalHeight / 2})`,
|
|
1344
1427
|
].join(' ');
|
|
@@ -1540,15 +1623,6 @@ function convertCoordinate(x, y) {
|
|
|
1540
1623
|
};
|
|
1541
1624
|
}
|
|
1542
1625
|
|
|
1543
|
-
/**
|
|
1544
|
-
* 路径段类型
|
|
1545
|
-
*/
|
|
1546
|
-
var PathSegmentType;
|
|
1547
|
-
(function (PathSegmentType) {
|
|
1548
|
-
PathSegmentType["EDGE"] = "edge";
|
|
1549
|
-
PathSegmentType["MOWING"] = "mowing";
|
|
1550
|
-
PathSegmentType["TRANS"] = "trans";
|
|
1551
|
-
})(PathSegmentType || (PathSegmentType = {}));
|
|
1552
1626
|
/**
|
|
1553
1627
|
* 按Python逻辑创建路径段:根据连续的两点之间的关系确定线段类型
|
|
1554
1628
|
*/
|
|
@@ -1877,6 +1951,14 @@ function generateBoundaryData(mapData, pathData) {
|
|
|
1877
1951
|
return boundaryData;
|
|
1878
1952
|
}
|
|
1879
1953
|
|
|
1954
|
+
var RealTimeDataType;
|
|
1955
|
+
(function (RealTimeDataType) {
|
|
1956
|
+
RealTimeDataType[RealTimeDataType["LOCATION"] = 1] = "LOCATION";
|
|
1957
|
+
RealTimeDataType[RealTimeDataType["PROCESS"] = 2] = "PROCESS";
|
|
1958
|
+
RealTimeDataType[RealTimeDataType["PARTITION"] = 3] = "PARTITION";
|
|
1959
|
+
RealTimeDataType[RealTimeDataType["STATUS"] = 4] = "STATUS";
|
|
1960
|
+
})(RealTimeDataType || (RealTimeDataType = {}));
|
|
1961
|
+
|
|
1880
1962
|
/**
|
|
1881
1963
|
* 射线法判断点是否在多边形内部
|
|
1882
1964
|
* @param x 点的x坐标
|
|
@@ -2046,7 +2128,7 @@ const getProcessMowingDataFromRealTimeData = ({ realTimeData, isMowing, pathData
|
|
|
2046
2128
|
let newMowingStatus = isMowing;
|
|
2047
2129
|
let newPathData = pathData || {};
|
|
2048
2130
|
// 找到返回的第一个实时进度的点
|
|
2049
|
-
const firstProcessData = realTimeData.find((item) => item.type ===
|
|
2131
|
+
const firstProcessData = realTimeData.find((item) => item.type === RealTimeDataType.PROCESS);
|
|
2050
2132
|
if (firstProcessData) {
|
|
2051
2133
|
// console.log('firstProcessData==', firstProcessData);
|
|
2052
2134
|
const { action, subAction, currentMowBoundary, currentMowProgress } = firstProcessData;
|
|
@@ -4594,6 +4676,36 @@ var merge = createAssigner(function(object, source, srcIndex) {
|
|
|
4594
4676
|
*/
|
|
4595
4677
|
var round = createRound('round');
|
|
4596
4678
|
|
|
4679
|
+
/**
|
|
4680
|
+
* 工具模块类型定义
|
|
4681
|
+
*/
|
|
4682
|
+
/**
|
|
4683
|
+
* 路径段类型枚举
|
|
4684
|
+
*/
|
|
4685
|
+
var PathSegmentType;
|
|
4686
|
+
(function (PathSegmentType) {
|
|
4687
|
+
PathSegmentType["EDGE"] = "edge";
|
|
4688
|
+
PathSegmentType["MOWING"] = "mowing";
|
|
4689
|
+
PathSegmentType["TRANS"] = "trans";
|
|
4690
|
+
})(PathSegmentType || (PathSegmentType = {}));
|
|
4691
|
+
/**
|
|
4692
|
+
* 单位类型枚举
|
|
4693
|
+
*/
|
|
4694
|
+
var UnitsType;
|
|
4695
|
+
(function (UnitsType) {
|
|
4696
|
+
UnitsType["Metric"] = "metric";
|
|
4697
|
+
UnitsType["Imperial"] = "imperial";
|
|
4698
|
+
})(UnitsType || (UnitsType = {}));
|
|
4699
|
+
/**
|
|
4700
|
+
* 面积单位类型枚举
|
|
4701
|
+
*/
|
|
4702
|
+
var UnitsAreaType;
|
|
4703
|
+
(function (UnitsAreaType) {
|
|
4704
|
+
UnitsAreaType["SQUARE_METER"] = "m\u00B2";
|
|
4705
|
+
UnitsAreaType["SQUARE_FOOT"] = "ft\u00B2";
|
|
4706
|
+
UnitsAreaType["ACRE"] = "ac";
|
|
4707
|
+
})(UnitsAreaType || (UnitsAreaType = {}));
|
|
4708
|
+
|
|
4597
4709
|
/**
|
|
4598
4710
|
* 默认航向相对于canvas的偏移角度: 航向默认是东
|
|
4599
4711
|
*/
|
|
@@ -4667,17 +4779,6 @@ function formatNumberWithMetricPrefix(value, round = true, decimals = 2) {
|
|
|
4667
4779
|
return `${mathFn(value / 1000000000, decimals)}B`;
|
|
4668
4780
|
}
|
|
4669
4781
|
}
|
|
4670
|
-
var UnitsType;
|
|
4671
|
-
(function (UnitsType) {
|
|
4672
|
-
UnitsType["Metric"] = "metric";
|
|
4673
|
-
UnitsType["Imperial"] = "imperial";
|
|
4674
|
-
})(UnitsType || (UnitsType = {}));
|
|
4675
|
-
var UnitsAreaType;
|
|
4676
|
-
(function (UnitsAreaType) {
|
|
4677
|
-
UnitsAreaType["SQUARE_METER"] = "m\u00B2";
|
|
4678
|
-
UnitsAreaType["SQUARE_FOOT"] = "ft\u00B2";
|
|
4679
|
-
UnitsAreaType["ACRE"] = "ac";
|
|
4680
|
-
})(UnitsAreaType || (UnitsAreaType = {}));
|
|
4681
4782
|
/**
|
|
4682
4783
|
* 转换割草面积的方法
|
|
4683
4784
|
* @param area 面积数值(单位:m²)
|
|
@@ -4873,7 +4974,12 @@ class BoundaryBorderLayer extends BaseLayer {
|
|
|
4873
4974
|
* 设置当前割草任务的边界
|
|
4874
4975
|
*/
|
|
4875
4976
|
setMowingBoundarys(mowingBoundarys) {
|
|
4876
|
-
|
|
4977
|
+
if (!mowingBoundarys) {
|
|
4978
|
+
this.mowingBoundarys = this.elements?.map(item => item?.originalData?.id);
|
|
4979
|
+
}
|
|
4980
|
+
else {
|
|
4981
|
+
this.mowingBoundarys = mowingBoundarys;
|
|
4982
|
+
}
|
|
4877
4983
|
}
|
|
4878
4984
|
/**
|
|
4879
4985
|
* SVG渲染方法
|
|
@@ -5301,6 +5407,14 @@ class BoundaryDataBuilder {
|
|
|
5301
5407
|
* 创建边界元素数据
|
|
5302
5408
|
*/
|
|
5303
5409
|
static create(type, coordinates, style) {
|
|
5410
|
+
const len = coordinates?.length || 0;
|
|
5411
|
+
const firstPoint = coordinates?.[0];
|
|
5412
|
+
const lastPoint = coordinates?.[len - 1];
|
|
5413
|
+
const isClosed = firstPoint?.[0] === lastPoint?.[0] && firstPoint?.[1] === lastPoint?.[1];
|
|
5414
|
+
// 如果地图没有闭合,则手动新增闭合点,避免border最后一部分没有闭合的情况
|
|
5415
|
+
if (!isClosed) {
|
|
5416
|
+
coordinates.push([firstPoint?.[0], firstPoint?.[1], lastPoint?.[2]]);
|
|
5417
|
+
}
|
|
5304
5418
|
return {
|
|
5305
5419
|
type,
|
|
5306
5420
|
coordinates,
|
|
@@ -5703,8 +5817,13 @@ class MapDataProcessor {
|
|
|
5703
5817
|
// 为ObstacleData创建兼容的MapElement接口
|
|
5704
5818
|
const mapElement = element;
|
|
5705
5819
|
const obstacleElement = ObstacleDataBuilder.fromMapElement(mapElement, this.mapConfig.obstacle);
|
|
5706
|
-
if (obstacleElement)
|
|
5820
|
+
if (obstacleElement) {
|
|
5707
5821
|
result.push(obstacleElement);
|
|
5822
|
+
const { addObstacles } = useSubBoundaryBorderStore.getState();
|
|
5823
|
+
addObstacles(`obstacle-${obstacleElement.originalData.id}`, {
|
|
5824
|
+
...obstacleElement,
|
|
5825
|
+
});
|
|
5826
|
+
}
|
|
5708
5827
|
}
|
|
5709
5828
|
catch (error) {
|
|
5710
5829
|
console.warn(`Error processing OBSTACLE element:`, element, error);
|
|
@@ -5765,8 +5884,13 @@ class MapDataProcessor {
|
|
|
5765
5884
|
element.direction !== undefined) {
|
|
5766
5885
|
const mapElement = element;
|
|
5767
5886
|
const svgElement = SvgElementDataBuilder.fromMapElement(mapElement, this.mapConfig.doodle);
|
|
5768
|
-
if (svgElement)
|
|
5887
|
+
if (svgElement) {
|
|
5769
5888
|
result.push(svgElement);
|
|
5889
|
+
const { addSvgElements } = useSubBoundaryBorderStore.getState();
|
|
5890
|
+
addSvgElements(`time-limit-obstacle-${svgElement.originalData.id}`, {
|
|
5891
|
+
...svgElement,
|
|
5892
|
+
});
|
|
5893
|
+
}
|
|
5770
5894
|
}
|
|
5771
5895
|
// 如果有points数据,按传统方式绘制
|
|
5772
5896
|
else if ('points' in element &&
|
|
@@ -5775,8 +5899,13 @@ class MapDataProcessor {
|
|
|
5775
5899
|
element.points.length >= 3) {
|
|
5776
5900
|
const mapElement = element;
|
|
5777
5901
|
const polygonElement = ObstacleDataBuilder.createTimeLimitObstacle(mapElement, this.mapConfig.obstacle);
|
|
5778
|
-
if (polygonElement)
|
|
5902
|
+
if (polygonElement) {
|
|
5779
5903
|
result.push(polygonElement);
|
|
5904
|
+
const { addObstacles } = useSubBoundaryBorderStore.getState();
|
|
5905
|
+
addObstacles(`time-limit-obstacle-${polygonElement.originalData.id}`, {
|
|
5906
|
+
...polygonElement,
|
|
5907
|
+
});
|
|
5908
|
+
}
|
|
5780
5909
|
}
|
|
5781
5910
|
}
|
|
5782
5911
|
catch (error) {
|
|
@@ -6113,7 +6242,6 @@ class BoundaryLabelsManager {
|
|
|
6113
6242
|
this.collapseOtherLabels(boundaryId);
|
|
6114
6243
|
// 展开当前标签
|
|
6115
6244
|
extendedContent.style.display = 'block';
|
|
6116
|
-
labelDiv.style.whiteSpace = 'normal';
|
|
6117
6245
|
this.currentExpandedBoundaryId = boundaryId;
|
|
6118
6246
|
}
|
|
6119
6247
|
/**
|
|
@@ -6614,7 +6742,7 @@ class ChargingPileManager {
|
|
|
6614
6742
|
}
|
|
6615
6743
|
// 简化的层级定义 - 充电桩只需要一个固定层级
|
|
6616
6744
|
ChargingPileManager.Z_INDEX = {
|
|
6617
|
-
CHARGING_PILE:
|
|
6745
|
+
CHARGING_PILE: 750, // 充电桩图标固定层级
|
|
6618
6746
|
};
|
|
6619
6747
|
|
|
6620
6748
|
/**
|
|
@@ -7026,7 +7154,7 @@ class AntennaManager {
|
|
|
7026
7154
|
}
|
|
7027
7155
|
// 简化的层级定义
|
|
7028
7156
|
AntennaManager.Z_INDEX = {
|
|
7029
|
-
DEFAULT:
|
|
7157
|
+
DEFAULT: 800, // 默认层级
|
|
7030
7158
|
ACTIVE: 9999, // 点击激活时的高层级
|
|
7031
7159
|
};
|
|
7032
7160
|
|
|
@@ -7173,9 +7301,10 @@ class MowerPositionManager {
|
|
|
7173
7301
|
return;
|
|
7174
7302
|
this.mowerPositionConfig = chargingPilesPositionConfig;
|
|
7175
7303
|
const lastPosition = this.lastPosition;
|
|
7176
|
-
const postureX = chargingPilesPositionConfig.postureX
|
|
7177
|
-
const postureY = chargingPilesPositionConfig.postureY
|
|
7178
|
-
const postureTheta = chargingPilesPositionConfig.postureTheta
|
|
7304
|
+
const postureX = chargingPilesPositionConfig.postureX || chargingPilesPositionConfig.lastPostureX || lastPosition?.x || 0;
|
|
7305
|
+
const postureY = chargingPilesPositionConfig.postureY || chargingPilesPositionConfig.lastPostureY || lastPosition?.y || 0;
|
|
7306
|
+
const postureTheta = chargingPilesPositionConfig.postureTheta || chargingPilesPositionConfig.lastPostureTheta || lastPosition?.rotation || 0;
|
|
7307
|
+
console.log('updatePositionByLastPosition->', postureX, postureY, postureTheta, chargingPilesPositionConfig);
|
|
7179
7308
|
// 检查是否需要更新图片
|
|
7180
7309
|
this.updateMowerImage(chargingPilesPositionConfig);
|
|
7181
7310
|
// 立即更新位置
|
|
@@ -7189,10 +7318,10 @@ class MowerPositionManager {
|
|
|
7189
7318
|
this.updateMowerImage(positionConfig);
|
|
7190
7319
|
// 更新配置
|
|
7191
7320
|
this.mowerPositionConfig = positionConfig;
|
|
7192
|
-
const postureX = positionConfig?.postureX
|
|
7193
|
-
const postureY = positionConfig?.postureY
|
|
7194
|
-
const postureTheta = positionConfig?.postureTheta
|
|
7195
|
-
console.log('updatePosition manager', positionConfig, this.lastPosition);
|
|
7321
|
+
const postureX = positionConfig?.postureX || this.lastPosition?.x || 0;
|
|
7322
|
+
const postureY = positionConfig?.postureY || this.lastPosition?.y || 0;
|
|
7323
|
+
const postureTheta = positionConfig?.postureTheta || this.lastPosition?.rotation || 0;
|
|
7324
|
+
console.log('updatePosition manager', JSON.stringify(this.currentPosition), this.currentPosition, !this.currentPosition, positionConfig, this.lastPosition, animationTime);
|
|
7196
7325
|
// 停止当前动画(如果有)
|
|
7197
7326
|
this.stopAnimation();
|
|
7198
7327
|
// 第一个点
|
|
@@ -7202,6 +7331,7 @@ class MowerPositionManager {
|
|
|
7202
7331
|
y: postureY,
|
|
7203
7332
|
rotation: postureTheta,
|
|
7204
7333
|
};
|
|
7334
|
+
console.log('updatePosition first->', this.currentPosition);
|
|
7205
7335
|
this.setElementPosition(this.currentPosition.x, this.currentPosition.y, this.currentPosition.rotation);
|
|
7206
7336
|
return;
|
|
7207
7337
|
}
|
|
@@ -7251,7 +7381,7 @@ class MowerPositionManager {
|
|
|
7251
7381
|
if (!positonOutOfRange && !positionValid) {
|
|
7252
7382
|
this.lastPosition = { x, y, rotation: theta };
|
|
7253
7383
|
}
|
|
7254
|
-
// console.log('setElementPosition', x, y, targetRotation, positonOutOfRange, positionValid, targetPixelPosition);
|
|
7384
|
+
// console.log('setElementPosition', x, y, theta, targetRotation, positonOutOfRange, positionValid, targetPixelPosition);
|
|
7255
7385
|
if (!this.mowerElement)
|
|
7256
7386
|
return;
|
|
7257
7387
|
this.mowerElement.style.left = `${targetPixelPosition?.x}px`;
|
|
@@ -7305,10 +7435,12 @@ class MowerPositionManager {
|
|
|
7305
7435
|
y: this.onlyUpdateTheta ? 0 : this.targetPosition.y - this.startPosition.y,
|
|
7306
7436
|
rotation: radNormalize(targetTheta - startTheta),
|
|
7307
7437
|
};
|
|
7438
|
+
console.log('startAnimationToPosition-->', this.deltaPosition, this.onlyUpdateTheta, this.targetPosition, this.startPosition);
|
|
7308
7439
|
// 开始动画循环
|
|
7309
7440
|
this.animateStep();
|
|
7310
7441
|
}
|
|
7311
7442
|
forceUpdatePosition() {
|
|
7443
|
+
console.log('forceUpdatePosition-->', this.currentPosition, this.targetPosition, this.startPosition);
|
|
7312
7444
|
this.animateStep();
|
|
7313
7445
|
}
|
|
7314
7446
|
/**
|
|
@@ -7335,6 +7467,7 @@ class MowerPositionManager {
|
|
|
7335
7467
|
vehicleState: this.mowerPositionConfig?.vehicleState,
|
|
7336
7468
|
});
|
|
7337
7469
|
}
|
|
7470
|
+
// console.log('animateStep-->', this.startPosition, this.deltaPosition, this.targetPosition, easedProgress)
|
|
7338
7471
|
// 继续动画或结束
|
|
7339
7472
|
if (progress < 1) {
|
|
7340
7473
|
// 设置当前位置
|
|
@@ -8621,13 +8754,6 @@ class MowerMapOverlay {
|
|
|
8621
8754
|
}
|
|
8622
8755
|
}
|
|
8623
8756
|
|
|
8624
|
-
var RealTimeDataType;
|
|
8625
|
-
(function (RealTimeDataType) {
|
|
8626
|
-
RealTimeDataType[RealTimeDataType["LOCATION"] = 1] = "LOCATION";
|
|
8627
|
-
RealTimeDataType[RealTimeDataType["PROCESS"] = 2] = "PROCESS";
|
|
8628
|
-
RealTimeDataType[RealTimeDataType["PARTITION"] = 3] = "PARTITION";
|
|
8629
|
-
})(RealTimeDataType || (RealTimeDataType = {}));
|
|
8630
|
-
|
|
8631
8757
|
// 获取车辆状态的中文文案
|
|
8632
8758
|
const getVehicleStateText = (vehicleState) => {
|
|
8633
8759
|
switch (vehicleState) {
|
|
@@ -8747,7 +8873,7 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
|
|
|
8747
8873
|
// const mapRef = useMap();
|
|
8748
8874
|
const [isGoogleMapsReady, setIsGoogleMapsReady] = useState(false);
|
|
8749
8875
|
const [hasInitializedBounds, setHasInitializedBounds] = useState(false);
|
|
8750
|
-
const { clearSubBoundaryBorder } = useSubBoundaryBorderStore();
|
|
8876
|
+
const { clearSubBoundaryBorder, clearObstacles } = useSubBoundaryBorderStore();
|
|
8751
8877
|
const currentProcessMowingStatusRef = useRef(false);
|
|
8752
8878
|
const { updateProcessStateIsMowing, processStateIsMowing } = useProcessMowingState();
|
|
8753
8879
|
const [mowPartitionData, setMowPartitionData] = useState(null);
|
|
@@ -8801,8 +8927,12 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
|
|
|
8801
8927
|
lastPostureTheta: currentPositionData?.lastPostureTheta
|
|
8802
8928
|
? Number(currentPositionData.lastPostureTheta)
|
|
8803
8929
|
: 0,
|
|
8804
|
-
lastPostureX: currentPositionData?.lastPostureX
|
|
8805
|
-
|
|
8930
|
+
lastPostureX: currentPositionData?.lastPostureX
|
|
8931
|
+
? Number(currentPositionData.lastPostureX)
|
|
8932
|
+
: 0,
|
|
8933
|
+
lastPostureY: currentPositionData?.lastPostureY
|
|
8934
|
+
? Number(currentPositionData.lastPostureY)
|
|
8935
|
+
: 0,
|
|
8806
8936
|
vehicleState: currentPositionData?.vehicleState || RobotStatus.CHARGING,
|
|
8807
8937
|
};
|
|
8808
8938
|
}, [realTimeData, modelType]);
|
|
@@ -8895,12 +9025,26 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
|
|
|
8895
9025
|
handleError(`初始化Google Maps叠加层失败: ${error instanceof Error ? error.message : String(error)}`);
|
|
8896
9026
|
}
|
|
8897
9027
|
};
|
|
9028
|
+
const resetInCharginPie = useCallback(() => {
|
|
9029
|
+
const elements = MapDataProcessor.processMapData(mapJson, mergedMapConfig);
|
|
9030
|
+
const chargingPiles = elements.find((element) => element.type === 'charging_pile');
|
|
9031
|
+
if (!overlayRef.current)
|
|
9032
|
+
return;
|
|
9033
|
+
// 如果在充电桩上,则直接更新位置到充电桩的位置
|
|
9034
|
+
overlayRef.current.updatePosition({
|
|
9035
|
+
...mowerPositionData,
|
|
9036
|
+
postureX: chargingPiles?.originalData.position[0],
|
|
9037
|
+
postureY: chargingPiles?.originalData.position[1],
|
|
9038
|
+
postureTheta: chargingPiles?.originalData.direction - Math.PI || 0,
|
|
9039
|
+
}, 0);
|
|
9040
|
+
}, [mapJson]);
|
|
8898
9041
|
// 初始化效果
|
|
8899
9042
|
useEffect(() => {
|
|
8900
9043
|
initializeGoogleMapsOverlay();
|
|
8901
9044
|
// 清理函数
|
|
8902
9045
|
return () => {
|
|
8903
9046
|
clearSubBoundaryBorder();
|
|
9047
|
+
clearObstacles();
|
|
8904
9048
|
updateProcessStateIsMowing(false);
|
|
8905
9049
|
currentProcessMowingStatusRef.current = false;
|
|
8906
9050
|
if (overlayRef.current) {
|
|
@@ -8997,12 +9141,12 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
|
|
|
8997
9141
|
// 计算左下角和右上角坐标
|
|
8998
9142
|
sw: {
|
|
8999
9143
|
x: viewBoxInfo.x / SCALE_FACTOR,
|
|
9000
|
-
y: viewBoxInfo.y / SCALE_FACTOR
|
|
9144
|
+
y: viewBoxInfo.y / SCALE_FACTOR,
|
|
9001
9145
|
},
|
|
9002
9146
|
ne: {
|
|
9003
9147
|
x: (viewBoxInfo.x + viewBoxInfo.width) / SCALE_FACTOR,
|
|
9004
|
-
y: (viewBoxInfo.y + viewBoxInfo.height) / SCALE_FACTOR
|
|
9005
|
-
}
|
|
9148
|
+
y: (viewBoxInfo.y + viewBoxInfo.height) / SCALE_FACTOR,
|
|
9149
|
+
},
|
|
9006
9150
|
};
|
|
9007
9151
|
}
|
|
9008
9152
|
}
|
|
@@ -9016,7 +9160,7 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
|
|
|
9016
9160
|
lastY: mowerPositionData.lastPostureY || 0,
|
|
9017
9161
|
lastTheta: mowerPositionData.lastPostureTheta || 0,
|
|
9018
9162
|
vehicleState: mowerPositionData.vehicleState || RobotStatus.UNKNOWN,
|
|
9019
|
-
vehicleStateText: getVehicleStateText(mowerPositionData.vehicleState || RobotStatus.UNKNOWN)
|
|
9163
|
+
vehicleStateText: getVehicleStateText(mowerPositionData.vehicleState || RobotStatus.UNKNOWN),
|
|
9020
9164
|
};
|
|
9021
9165
|
}
|
|
9022
9166
|
// 获取当前割草地块数据
|
|
@@ -9024,9 +9168,6 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
|
|
|
9024
9168
|
setDebugInfo(newDebugInfo);
|
|
9025
9169
|
};
|
|
9026
9170
|
updateDebugInfo();
|
|
9027
|
-
// 设置定时更新(仅在没有数据变化时使用)
|
|
9028
|
-
const interval = setInterval(updateDebugInfo, 1000);
|
|
9029
|
-
return () => clearInterval(interval);
|
|
9030
9171
|
}, [debug, mapJson, mowerPositionData, mowPartitionData, defaultTransform]);
|
|
9031
9172
|
// 当关键数据变化时立即更新debug信息
|
|
9032
9173
|
useEffect(() => {
|
|
@@ -9055,12 +9196,12 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
|
|
|
9055
9196
|
// 计算左下角和右上角坐标
|
|
9056
9197
|
sw: {
|
|
9057
9198
|
x: viewBoxInfo.x / SCALE_FACTOR,
|
|
9058
|
-
y: viewBoxInfo.y / SCALE_FACTOR
|
|
9199
|
+
y: viewBoxInfo.y / SCALE_FACTOR,
|
|
9059
9200
|
},
|
|
9060
9201
|
ne: {
|
|
9061
9202
|
x: (viewBoxInfo.x + viewBoxInfo.width) / SCALE_FACTOR,
|
|
9062
|
-
y: (viewBoxInfo.y + viewBoxInfo.height) / SCALE_FACTOR
|
|
9063
|
-
}
|
|
9203
|
+
y: (viewBoxInfo.y + viewBoxInfo.height) / SCALE_FACTOR,
|
|
9204
|
+
},
|
|
9064
9205
|
};
|
|
9065
9206
|
}
|
|
9066
9207
|
}
|
|
@@ -9074,7 +9215,7 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
|
|
|
9074
9215
|
lastY: mowerPositionData.lastPostureY || 0,
|
|
9075
9216
|
lastTheta: mowerPositionData.lastPostureTheta || 0,
|
|
9076
9217
|
vehicleState: mowerPositionData.vehicleState || RobotStatus.UNKNOWN,
|
|
9077
|
-
vehicleStateText: getVehicleStateText(mowerPositionData.vehicleState || RobotStatus.UNKNOWN)
|
|
9218
|
+
vehicleStateText: getVehicleStateText(mowerPositionData.vehicleState || RobotStatus.UNKNOWN),
|
|
9078
9219
|
};
|
|
9079
9220
|
}
|
|
9080
9221
|
// 获取当前割草地块数据
|
|
@@ -9088,12 +9229,26 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
|
|
|
9088
9229
|
return;
|
|
9089
9230
|
}
|
|
9090
9231
|
console.log('usefeect realTimeData----->', realTimeData, mapJson, pathJson, overlayRef.current);
|
|
9232
|
+
let curMowPartitionData = mowPartitionData;
|
|
9091
9233
|
// realtime中包含当前割草任务的数据,根据数据进行path路径和边界的高亮操作,
|
|
9092
9234
|
const mowingPartition = realTimeData.find((item) => item.type === RealTimeDataType.PARTITION);
|
|
9093
9235
|
if (mowingPartition) {
|
|
9094
9236
|
setMowPartitionData(mowingPartition);
|
|
9237
|
+
curMowPartitionData = mowingPartition;
|
|
9238
|
+
}
|
|
9239
|
+
const statusData = realTimeData?.find(item => item?.type === RealTimeDataType.STATUS);
|
|
9240
|
+
if (statusData) {
|
|
9241
|
+
// 车辆回桩不会回传最后的park的位置,所以根据实时数据的状态数据判断车辆回到桩上
|
|
9242
|
+
if ([RobotStatus.CHARGING, RobotStatus.PARKED].includes(statusData?.vehicleState || RobotStatus.UNKNOWN)) {
|
|
9243
|
+
resetInCharginPie();
|
|
9244
|
+
}
|
|
9245
|
+
else if (statusData?.vehicleState === RobotStatus.WORKING) {
|
|
9246
|
+
// 兜底收不到割草地块的实时数据,使用状态来兜底
|
|
9247
|
+
overlayRef.current.resetBorderLayerHighlight();
|
|
9248
|
+
setMowPartitionData({});
|
|
9249
|
+
curMowPartitionData = {};
|
|
9250
|
+
}
|
|
9095
9251
|
}
|
|
9096
|
-
const curMowPartitionData = mowingPartition || mowPartitionData;
|
|
9097
9252
|
if (!mapJson ||
|
|
9098
9253
|
!pathJson ||
|
|
9099
9254
|
!overlayRef.current)
|
|
@@ -9209,8 +9364,9 @@ const MowerMapRenderer = forwardRef(({ mapConfig, modelType, mapRef, mapJson, pa
|
|
|
9209
9364
|
fontFamily: 'monospace',
|
|
9210
9365
|
zIndex: 10000,
|
|
9211
9366
|
maxWidth: '300px',
|
|
9212
|
-
lineHeight: '1.4'
|
|
9213
|
-
}, children: [jsx("div", { style: { fontWeight: 'bold', marginBottom: '8px' }, children: "\uD83D\uDC1B Debug Info" }), debugInfo.mapBounds && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDCCD Map GPS Bounds:" }), jsxs("div", { children: ["SW: [", debugInfo.mapBounds.sw[0].toFixed(6), ", ", debugInfo.mapBounds.sw[1].toFixed(6), "]"] }), jsxs("div", { children: ["NE: [", debugInfo.mapBounds.ne[0].toFixed(6), ", ", debugInfo.mapBounds.ne[1].toFixed(6), "]"] })] })), debugInfo.viewBox && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDCD0 SVG ViewBox (meters):" }), jsxs("div", { children: ["SW: [", debugInfo.viewBox.sw.x.toFixed(2), ", ", debugInfo.viewBox.sw.y.toFixed(2), "]"] }), jsxs("div", { children: ["NE: [", debugInfo.viewBox.ne.x.toFixed(2), ", ", debugInfo.viewBox.ne.y.toFixed(2), "]"] }), jsxs("div", { children: ["Size: ", debugInfo.viewBox.width.toFixed(2), "m \u00D7 ", debugInfo.viewBox.height.toFixed(2), "m"] }), jsxs("div", { children: ["Scale: 1:", debugInfo.viewBox.scale] })] })), debugInfo.mowerPosition && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDE9C Mower Position:" }), jsxs("div", { children: ["Current: X=", debugInfo.mowerPosition.x.toFixed(2), ", Y=", debugInfo.mowerPosition.y.toFixed(2)] }), jsxs("div", { children: ["Theta: ", (debugInfo.mowerPosition.theta * 180 / Math.PI).toFixed(1), "\u00B0"] }), jsxs("div", { children: ["Last: X=", debugInfo.mowerPosition.lastX.toFixed(2), ", Y=", debugInfo.mowerPosition.lastY.toFixed(2)] }), jsxs("div", { children: ["Last Theta: ", (debugInfo.mowerPosition.lastTheta * 180 / Math.PI).toFixed(1), "\u00B0"] }), jsxs("div", { children: ["Status: ", debugInfo.mowerPosition.vehicleStateText, " (", debugInfo.mowerPosition.vehicleState, ")"] })] })), debugInfo.partitionData && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDD32 Mow Partition Data:" }), jsxs("div", { children: ["Type: ", debugInfo.partitionData.type || 'N/A'] }), debugInfo.partitionData.partitionIds &&
|
|
9367
|
+
lineHeight: '1.4',
|
|
9368
|
+
}, children: [jsx("div", { style: { fontWeight: 'bold', marginBottom: '8px' }, children: "\uD83D\uDC1B Debug Info" }), debugInfo.mapBounds && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDCCD Map GPS Bounds:" }), jsxs("div", { children: ["SW: [", debugInfo.mapBounds.sw[0].toFixed(6), ", ", debugInfo.mapBounds.sw[1].toFixed(6), "]"] }), jsxs("div", { children: ["NE: [", debugInfo.mapBounds.ne[0].toFixed(6), ", ", debugInfo.mapBounds.ne[1].toFixed(6), "]"] })] })), debugInfo.viewBox && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDCD0 SVG ViewBox (meters):" }), jsxs("div", { children: ["SW: [", debugInfo.viewBox.sw.x.toFixed(2), ", ", debugInfo.viewBox.sw.y.toFixed(2), "]"] }), jsxs("div", { children: ["NE: [", debugInfo.viewBox.ne.x.toFixed(2), ", ", debugInfo.viewBox.ne.y.toFixed(2), "]"] }), jsxs("div", { children: ["Size: ", debugInfo.viewBox.width.toFixed(2), "m \u00D7 ", debugInfo.viewBox.height.toFixed(2), "m"] }), jsxs("div", { children: ["Scale: 1:", debugInfo.viewBox.scale] })] })), debugInfo.mowerPosition && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDE9C Mower Position:" }), jsxs("div", { children: ["Current: X=", debugInfo.mowerPosition.x.toFixed(2), ", Y=", debugInfo.mowerPosition.y.toFixed(2)] }), jsxs("div", { children: ["Theta: ", ((debugInfo.mowerPosition.theta * 180) / Math.PI).toFixed(1), "\u00B0"] }), jsxs("div", { children: ["Last: X=", debugInfo.mowerPosition.lastX.toFixed(2), ", Y=", debugInfo.mowerPosition.lastY.toFixed(2)] }), jsxs("div", { children: ["Last Theta: ", ((debugInfo.mowerPosition.lastTheta * 180) / Math.PI).toFixed(1), "\u00B0"] }), jsxs("div", { children: ["Status: ", debugInfo.mowerPosition.vehicleStateText, " (", debugInfo.mowerPosition.vehicleState, ")"] })] })), debugInfo.partitionData && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDD32 Mow Partition Data:" }), jsxs("div", { children: ["Type: ", debugInfo.partitionData.type || 'N/A'] }), debugInfo.partitionData.partitionIds &&
|
|
9369
|
+
debugInfo.partitionData.partitionIds.length > 0 ? (jsxs("div", { children: ["Active IDs: [", debugInfo.partitionData.partitionIds.join(', '), "]"] })) : (jsx("div", { children: "No active partitions" })), debugInfo.partitionData.time && (jsxs("div", { children: ["Updated: ", new Date(debugInfo.partitionData.time).toLocaleTimeString()] }))] })), !debugInfo.partitionData && (jsxs("div", { style: { marginBottom: '6px' }, children: [jsx("div", { style: { fontWeight: 'bold' }, children: "\uD83D\uDD32 Mow Partition Data:" }), jsx("div", { style: { color: '#888' }, children: "No partition data available" })] }))] }));
|
|
9214
9370
|
};
|
|
9215
9371
|
// 错误显示
|
|
9216
9372
|
if (currentError) {
|