@reearth/core 0.0.7-alpha.13 → 0.0.7-alpha.15
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/core.js +6864 -5606
- package/dist/core.umd.cjs +71 -71
- package/dist/index.d.ts +56 -13
- package/package.json +8 -5
- package/src/Map/Layer/hooks.ts +6 -3
- package/src/Map/Layer/index.tsx +2 -0
- package/src/Map/Layers/hooks.ts +17 -0
- package/src/Map/Layers/index.tsx +12 -1
- package/src/Map/Layers/keys.ts +1 -0
- package/src/Map/Sketch/hooks.ts +405 -399
- package/src/Map/Sketch/index.tsx +65 -18
- package/src/Map/Sketch/sketchMachine.ts +359 -4
- package/src/Map/Sketch/sketchMachine.typegen.ts +58 -1
- package/src/Map/Sketch/types.ts +10 -20
- package/src/Map/Sketch/usePluginSketchLayer.ts +105 -0
- package/src/Map/Sketch/useSketch.ts +559 -0
- package/src/Map/Sketch/useSketchFeature.ts +198 -0
- package/src/Map/hooks.ts +32 -1
- package/src/Map/index.tsx +24 -0
- package/src/Map/ref.ts +8 -0
- package/src/Map/types/index.ts +21 -1
- package/src/Map/types/viewerProperty.ts +2 -0
- package/src/Visualizer/coreContext.tsx +2 -0
- package/src/Visualizer/hooks.ts +25 -0
- package/src/Visualizer/index.tsx +13 -0
- package/src/engines/Cesium/Feature/index.tsx +6 -2
- package/src/engines/Cesium/Sketch/ControlPoint.tsx +128 -24
- package/src/engines/Cesium/Sketch/ExtrudedControlPoints.tsx +70 -25
- package/src/engines/Cesium/Sketch/ExtrudedMeasurement.tsx +3 -1
- package/src/engines/Cesium/Sketch/ExtrudedPolygonEntity.tsx +14 -14
- package/src/engines/Cesium/Sketch/PolylineEntity.tsx +7 -4
- package/src/engines/Cesium/Sketch/SurfaceAddingPoints.tsx +60 -0
- package/src/engines/Cesium/Sketch/SurfaceControlPoints.tsx +125 -35
- package/src/engines/Cesium/Sketch/constants.ts +5 -0
- package/src/engines/Cesium/Sketch/index.tsx +68 -29
- package/src/engines/Cesium/core/labels/JapanGSIOptimalBVmapVectorMapLabel/JapanGSIOptimalBVmapLabelImagery.tsx +8 -1
- package/src/engines/Cesium/core/labels/JapanGSIOptimalBVmapVectorMapLabel/JapanGSIOptimalBVmapVectorMapLabel.tsx +14 -2
- package/src/engines/Cesium/core/labels/LabelImageryLayers.tsx +10 -1
- package/src/engines/Cesium/hooks/useEngineRef.ts +36 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { Dispatch, RefObject, SetStateAction, useCallback } from "react";
|
|
2
|
+
|
|
3
|
+
import { LazyLayer } from "../Layers";
|
|
4
|
+
import { LayersRef } from "../types";
|
|
5
|
+
|
|
6
|
+
import { SketchEventProps, SketchFeature, SketchOptions, SketchType } from "./types";
|
|
7
|
+
|
|
8
|
+
import { OnLayerSelectType } from ".";
|
|
9
|
+
|
|
10
|
+
type Props = {
|
|
11
|
+
sketchOptions: SketchOptions;
|
|
12
|
+
from: "editor" | "plugin";
|
|
13
|
+
updateType: Dispatch<SetStateAction<SketchType | undefined>>;
|
|
14
|
+
layersRef: RefObject<LayersRef>;
|
|
15
|
+
pluginSketchLayerCreate: (feature: SketchFeature) => {
|
|
16
|
+
layerId: string | undefined;
|
|
17
|
+
featureId: string;
|
|
18
|
+
};
|
|
19
|
+
pluginSketchLayerFeatureAdd: (
|
|
20
|
+
layer: LazyLayer,
|
|
21
|
+
feature: SketchFeature,
|
|
22
|
+
) =>
|
|
23
|
+
| {
|
|
24
|
+
layerId?: undefined;
|
|
25
|
+
featureId?: undefined;
|
|
26
|
+
}
|
|
27
|
+
| {
|
|
28
|
+
layerId: string;
|
|
29
|
+
featureId: string;
|
|
30
|
+
};
|
|
31
|
+
pluginSketchLayerFeatureUpdate: (
|
|
32
|
+
layer: LazyLayer,
|
|
33
|
+
feature: SketchFeature,
|
|
34
|
+
) =>
|
|
35
|
+
| {
|
|
36
|
+
layerId?: undefined;
|
|
37
|
+
featureId?: undefined;
|
|
38
|
+
}
|
|
39
|
+
| {
|
|
40
|
+
layerId: string;
|
|
41
|
+
featureId: string;
|
|
42
|
+
};
|
|
43
|
+
pluginSketchLayerFeatureRemove: (layer: LazyLayer, featureId: string) => void;
|
|
44
|
+
onSketchFeatureCreate?: (feature: SketchFeature | null) => void;
|
|
45
|
+
onSketchFeatureUpdate?: (feature: SketchFeature) => void;
|
|
46
|
+
onSketchFeatureDelete?: (layerId: string, featureId: string) => void;
|
|
47
|
+
onSketchPluginFeatureCreate?: (props: SketchEventProps) => void;
|
|
48
|
+
onSketchPluginFeatureUpdate?: (props: SketchEventProps) => void;
|
|
49
|
+
onSketchPluginFeatureDelete?: (props: { layerId: string; featureId: string }) => void;
|
|
50
|
+
onLayerSelect?: OnLayerSelectType;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export default ({
|
|
54
|
+
sketchOptions,
|
|
55
|
+
from,
|
|
56
|
+
updateType,
|
|
57
|
+
layersRef,
|
|
58
|
+
onSketchFeatureCreate,
|
|
59
|
+
pluginSketchLayerCreate,
|
|
60
|
+
pluginSketchLayerFeatureAdd,
|
|
61
|
+
pluginSketchLayerFeatureUpdate,
|
|
62
|
+
pluginSketchLayerFeatureRemove,
|
|
63
|
+
onSketchPluginFeatureCreate,
|
|
64
|
+
onSketchPluginFeatureUpdate,
|
|
65
|
+
onSketchPluginFeatureDelete,
|
|
66
|
+
onSketchFeatureUpdate,
|
|
67
|
+
onSketchFeatureDelete,
|
|
68
|
+
onLayerSelect,
|
|
69
|
+
}: Props) => {
|
|
70
|
+
const handleFeatureCreate = useCallback(
|
|
71
|
+
(feature: SketchFeature) => {
|
|
72
|
+
if (sketchOptions.autoResetInteractionMode) {
|
|
73
|
+
updateType(undefined);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (from === "editor" && sketchOptions.dataOnly) {
|
|
77
|
+
onSketchFeatureCreate?.(feature);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!sketchOptions.dataOnly) {
|
|
82
|
+
const selectedLayer = layersRef.current?.selectedLayer();
|
|
83
|
+
const { layerId, featureId } =
|
|
84
|
+
!layersRef?.current?.isTempLayer(selectedLayer?.id) ||
|
|
85
|
+
selectedLayer?.type !== "simple" ||
|
|
86
|
+
selectedLayer.computed?.layer.type !== "simple"
|
|
87
|
+
? pluginSketchLayerCreate(feature)
|
|
88
|
+
: pluginSketchLayerFeatureAdd(selectedLayer, feature);
|
|
89
|
+
|
|
90
|
+
if (layerId && featureId) {
|
|
91
|
+
requestAnimationFrame(() => {
|
|
92
|
+
onLayerSelect?.(
|
|
93
|
+
layerId,
|
|
94
|
+
featureId,
|
|
95
|
+
layerId
|
|
96
|
+
? () =>
|
|
97
|
+
new Promise(resolve => {
|
|
98
|
+
// Wait until computed feature is ready
|
|
99
|
+
queueMicrotask(() => {
|
|
100
|
+
resolve(layersRef.current?.findById?.(layerId)?.computed);
|
|
101
|
+
});
|
|
102
|
+
})
|
|
103
|
+
: undefined,
|
|
104
|
+
undefined,
|
|
105
|
+
undefined,
|
|
106
|
+
);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
onSketchPluginFeatureCreate?.({ layerId, featureId, feature });
|
|
110
|
+
}
|
|
111
|
+
} else {
|
|
112
|
+
onSketchPluginFeatureCreate?.({ feature });
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
[
|
|
116
|
+
layersRef,
|
|
117
|
+
from,
|
|
118
|
+
sketchOptions.dataOnly,
|
|
119
|
+
sketchOptions.autoResetInteractionMode,
|
|
120
|
+
pluginSketchLayerCreate,
|
|
121
|
+
pluginSketchLayerFeatureAdd,
|
|
122
|
+
onSketchFeatureCreate,
|
|
123
|
+
onSketchPluginFeatureCreate,
|
|
124
|
+
onLayerSelect,
|
|
125
|
+
updateType,
|
|
126
|
+
],
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
const handleFeatureUpdate = useCallback(
|
|
130
|
+
(feature: SketchFeature) => {
|
|
131
|
+
if (from === "editor" && sketchOptions.dataOnly) {
|
|
132
|
+
onSketchFeatureUpdate?.(feature);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (!sketchOptions.dataOnly) {
|
|
137
|
+
const selectedLayer = layersRef.current?.selectedLayer();
|
|
138
|
+
if (!selectedLayer) return;
|
|
139
|
+
|
|
140
|
+
const { layerId, featureId } = pluginSketchLayerFeatureUpdate(selectedLayer, feature);
|
|
141
|
+
|
|
142
|
+
if (layerId && featureId) {
|
|
143
|
+
setTimeout(() => {
|
|
144
|
+
layersRef.current?.selectFeatures([
|
|
145
|
+
{
|
|
146
|
+
layerId,
|
|
147
|
+
featureId: [featureId],
|
|
148
|
+
},
|
|
149
|
+
]);
|
|
150
|
+
}, 20);
|
|
151
|
+
|
|
152
|
+
onSketchPluginFeatureUpdate?.({ layerId, featureId, feature });
|
|
153
|
+
}
|
|
154
|
+
} else {
|
|
155
|
+
onSketchPluginFeatureUpdate?.({ feature });
|
|
156
|
+
}
|
|
157
|
+
},
|
|
158
|
+
[
|
|
159
|
+
from,
|
|
160
|
+
sketchOptions.dataOnly,
|
|
161
|
+
layersRef,
|
|
162
|
+
pluginSketchLayerFeatureUpdate,
|
|
163
|
+
onSketchFeatureUpdate,
|
|
164
|
+
onSketchPluginFeatureUpdate,
|
|
165
|
+
],
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
const handleFeatureDelete = useCallback(
|
|
169
|
+
(layerId: string, featureId: string) => {
|
|
170
|
+
if (from === "editor" && sketchOptions.dataOnly) {
|
|
171
|
+
onSketchFeatureDelete?.(layerId, featureId);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (!sketchOptions.dataOnly) {
|
|
176
|
+
const layer = layersRef.current?.findById(layerId);
|
|
177
|
+
if (!layer) return;
|
|
178
|
+
pluginSketchLayerFeatureRemove(layer, featureId);
|
|
179
|
+
layersRef.current?.selectFeatures([]);
|
|
180
|
+
}
|
|
181
|
+
onSketchPluginFeatureDelete?.({ layerId, featureId });
|
|
182
|
+
},
|
|
183
|
+
[
|
|
184
|
+
from,
|
|
185
|
+
sketchOptions.dataOnly,
|
|
186
|
+
layersRef,
|
|
187
|
+
pluginSketchLayerFeatureRemove,
|
|
188
|
+
onSketchFeatureDelete,
|
|
189
|
+
onSketchPluginFeatureDelete,
|
|
190
|
+
],
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
return {
|
|
194
|
+
handleFeatureCreate,
|
|
195
|
+
handleFeatureUpdate,
|
|
196
|
+
handleFeatureDelete,
|
|
197
|
+
};
|
|
198
|
+
};
|
package/src/Map/hooks.ts
CHANGED
|
@@ -13,7 +13,7 @@ import type {
|
|
|
13
13
|
} from "./types";
|
|
14
14
|
import useTimelineManager, { TimelineManagerRef } from "./useTimelineManager";
|
|
15
15
|
|
|
16
|
-
import { CursorType } from ".";
|
|
16
|
+
import { CursorType, SketchEditingFeature } from ".";
|
|
17
17
|
|
|
18
18
|
export type { MapRef } from "./ref";
|
|
19
19
|
|
|
@@ -26,6 +26,8 @@ export default function ({
|
|
|
26
26
|
timelineManagerRef,
|
|
27
27
|
cursor,
|
|
28
28
|
onLayerSelect,
|
|
29
|
+
onMount,
|
|
30
|
+
onAPIReady,
|
|
29
31
|
}: {
|
|
30
32
|
ref: Ref<MapRef>;
|
|
31
33
|
timelineManagerRef?: TimelineManagerRef;
|
|
@@ -37,7 +39,10 @@ export default function ({
|
|
|
37
39
|
options?: LayerSelectionReason,
|
|
38
40
|
info?: SelectedFeatureInfo,
|
|
39
41
|
) => void;
|
|
42
|
+
onMount?: () => void;
|
|
43
|
+
onAPIReady?: () => void;
|
|
40
44
|
}) {
|
|
45
|
+
const [mapAPIReady, setMapAPIReady] = useState({ engine: false, layers: false, sketch: false });
|
|
41
46
|
const engineRef = useRef<EngineRef>(null);
|
|
42
47
|
const layersRef = useRef<LayersRef>(null);
|
|
43
48
|
const sketchRef = useRef<SketchRef>(null);
|
|
@@ -55,6 +60,12 @@ export default function ({
|
|
|
55
60
|
[timelineManagerRef],
|
|
56
61
|
);
|
|
57
62
|
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
if (onAPIReady && mapAPIReady.engine && mapAPIReady.layers && mapAPIReady.sketch) {
|
|
65
|
+
onAPIReady?.();
|
|
66
|
+
}
|
|
67
|
+
}, [onAPIReady, mapAPIReady]);
|
|
68
|
+
|
|
58
69
|
// selectLayer logic
|
|
59
70
|
// 1. Map/hooks(here) is the source
|
|
60
71
|
// 1.2 State updates propagate up, through onLayerSelect, to update
|
|
@@ -111,6 +122,21 @@ export default function ({
|
|
|
111
122
|
}
|
|
112
123
|
}, [cursor]);
|
|
113
124
|
|
|
125
|
+
const [sketchEditingFeature, setSketchEditingFeature] = useState<
|
|
126
|
+
SketchEditingFeature | undefined
|
|
127
|
+
>();
|
|
128
|
+
|
|
129
|
+
const handleEngineMount = useCallback(() => {
|
|
130
|
+
setMapAPIReady(s => ({ ...s, engine: true }));
|
|
131
|
+
onMount?.();
|
|
132
|
+
}, [onMount]);
|
|
133
|
+
const handleLayersMount = useCallback(() => {
|
|
134
|
+
setMapAPIReady(s => ({ ...s, layers: true }));
|
|
135
|
+
}, []);
|
|
136
|
+
const handleSketchMount = useCallback(() => {
|
|
137
|
+
setMapAPIReady(s => ({ ...s, sketch: true }));
|
|
138
|
+
}, []);
|
|
139
|
+
|
|
114
140
|
return {
|
|
115
141
|
engineRef,
|
|
116
142
|
layersRef,
|
|
@@ -119,5 +145,10 @@ export default function ({
|
|
|
119
145
|
requestingRenderMode,
|
|
120
146
|
handleLayerSelect,
|
|
121
147
|
handleEngineLayerSelect,
|
|
148
|
+
sketchEditingFeature,
|
|
149
|
+
setSketchEditingFeature,
|
|
150
|
+
handleEngineMount,
|
|
151
|
+
handleLayersMount,
|
|
152
|
+
handleSketchMount,
|
|
122
153
|
};
|
|
123
154
|
}
|
package/src/Map/index.tsx
CHANGED
|
@@ -34,6 +34,7 @@ export type CursorType = "auto" | "grab" | "crosshair";
|
|
|
34
34
|
export type Props = {
|
|
35
35
|
engines?: Record<string, Engine>;
|
|
36
36
|
engine?: string;
|
|
37
|
+
onAPIReady?: () => void;
|
|
37
38
|
} & Omit<
|
|
38
39
|
LayersProps,
|
|
39
40
|
| "Feature"
|
|
@@ -67,7 +68,13 @@ function MapFn(
|
|
|
67
68
|
onSketchTypeChange,
|
|
68
69
|
onSketchFeatureCreate,
|
|
69
70
|
onSketchPluginFeatureCreate,
|
|
71
|
+
onSketchFeatureUpdate,
|
|
72
|
+
onSketchPluginFeatureUpdate,
|
|
73
|
+
onSketchFeatureDelete,
|
|
74
|
+
onSketchPluginFeatureDelete,
|
|
70
75
|
featureFlags = INTERACTION_MODES.default,
|
|
76
|
+
onMount,
|
|
77
|
+
onAPIReady,
|
|
71
78
|
...props
|
|
72
79
|
}: Props,
|
|
73
80
|
ref: Ref<MapRef>,
|
|
@@ -82,11 +89,18 @@ function MapFn(
|
|
|
82
89
|
requestingRenderMode,
|
|
83
90
|
handleLayerSelect,
|
|
84
91
|
handleEngineLayerSelect,
|
|
92
|
+
sketchEditingFeature,
|
|
93
|
+
setSketchEditingFeature,
|
|
94
|
+
handleEngineMount,
|
|
95
|
+
handleLayersMount,
|
|
96
|
+
handleSketchMount,
|
|
85
97
|
} = useHooks({
|
|
86
98
|
ref,
|
|
87
99
|
timelineManagerRef,
|
|
88
100
|
cursor,
|
|
89
101
|
onLayerSelect,
|
|
102
|
+
onMount,
|
|
103
|
+
onAPIReady,
|
|
90
104
|
});
|
|
91
105
|
|
|
92
106
|
const selectedLayerIds = useMemo(
|
|
@@ -111,6 +125,7 @@ function MapFn(
|
|
|
111
125
|
timelineManagerRef={timelineManagerRef}
|
|
112
126
|
onLayerSelect={handleEngineLayerSelect}
|
|
113
127
|
featureFlags={featureFlags}
|
|
128
|
+
onMount={handleEngineMount}
|
|
114
129
|
{...props}>
|
|
115
130
|
<Layers
|
|
116
131
|
ref={layersRef}
|
|
@@ -128,7 +143,9 @@ function MapFn(
|
|
|
128
143
|
meta={props.meta}
|
|
129
144
|
viewerProperty={props.property}
|
|
130
145
|
requestingRenderMode={requestingRenderMode}
|
|
146
|
+
sketchEditingFeature={sketchEditingFeature}
|
|
131
147
|
onLayerSelect={handleLayerSelect}
|
|
148
|
+
onMount={handleLayersMount}
|
|
132
149
|
/>
|
|
133
150
|
<Sketch
|
|
134
151
|
ref={sketchRef}
|
|
@@ -142,6 +159,13 @@ function MapFn(
|
|
|
142
159
|
onSketchTypeChange={onSketchTypeChange}
|
|
143
160
|
onSketchFeatureCreate={onSketchFeatureCreate}
|
|
144
161
|
onSketchPluginFeatureCreate={onSketchPluginFeatureCreate}
|
|
162
|
+
onSketchFeatureUpdate={onSketchFeatureUpdate}
|
|
163
|
+
onSketchPluginFeatureUpdate={onSketchPluginFeatureUpdate}
|
|
164
|
+
onSketchFeatureDelete={onSketchFeatureDelete}
|
|
165
|
+
onSketchPluginFeatureDelete={onSketchPluginFeatureDelete}
|
|
166
|
+
sketchEditingFeature={sketchEditingFeature}
|
|
167
|
+
onSketchEditFeature={setSketchEditingFeature}
|
|
168
|
+
onMount={handleSketchMount}
|
|
145
169
|
/>
|
|
146
170
|
</Engine>
|
|
147
171
|
) : null;
|
package/src/Map/ref.ts
CHANGED
|
@@ -82,6 +82,7 @@ const engineRefKeys: FunctionKeys<EngineRef> = {
|
|
|
82
82
|
unselectFeatures: 1,
|
|
83
83
|
pickManyFromViewport: 1,
|
|
84
84
|
getExtrudedHeight: 1,
|
|
85
|
+
getExtrudedPoint: 1,
|
|
85
86
|
getSurfaceDistance: 1,
|
|
86
87
|
equalsEpsilon2d: 1,
|
|
87
88
|
equalsEpsilon3d: 1,
|
|
@@ -89,6 +90,7 @@ const engineRefKeys: FunctionKeys<EngineRef> = {
|
|
|
89
90
|
setCursor: 1,
|
|
90
91
|
bringToFront: 1,
|
|
91
92
|
sendToBack: 1,
|
|
93
|
+
calcRectangleControlPoint: 1,
|
|
92
94
|
};
|
|
93
95
|
|
|
94
96
|
const layersRefKeys: FunctionKeys<LayersRef> = {
|
|
@@ -104,6 +106,7 @@ const layersRefKeys: FunctionKeys<LayersRef> = {
|
|
|
104
106
|
hide: 1,
|
|
105
107
|
isLayer: 1,
|
|
106
108
|
isComputedLayer: 1,
|
|
109
|
+
isTempLayer: 1,
|
|
107
110
|
layers: 1,
|
|
108
111
|
override: 1,
|
|
109
112
|
replace: 1,
|
|
@@ -122,6 +125,11 @@ const sketchRefKeys: FunctionKeys<SketchRef> = {
|
|
|
122
125
|
setType: 1,
|
|
123
126
|
getOptions: 1,
|
|
124
127
|
overrideOptions: 1,
|
|
128
|
+
editFeature: 1,
|
|
129
|
+
applyEdit: 1,
|
|
130
|
+
cancelEdit: 1,
|
|
131
|
+
deleteFeature: 1,
|
|
132
|
+
onEditFeatureChange: 1,
|
|
125
133
|
};
|
|
126
134
|
|
|
127
135
|
export function mapRef({
|
package/src/Map/types/index.ts
CHANGED
|
@@ -38,7 +38,13 @@ import type {
|
|
|
38
38
|
LayerSelectionReason,
|
|
39
39
|
Ref as LayersRef,
|
|
40
40
|
} from "../Layers";
|
|
41
|
-
import {
|
|
41
|
+
import {
|
|
42
|
+
SketchType,
|
|
43
|
+
SketchOptions,
|
|
44
|
+
SketchComponentType,
|
|
45
|
+
SketchEditFeatureChangeCb,
|
|
46
|
+
SketchEditingFeature,
|
|
47
|
+
} from "../Sketch/types";
|
|
42
48
|
import type { TimelineManagerRef } from "../useTimelineManager";
|
|
43
49
|
|
|
44
50
|
import type { SceneMode, ViewerProperty } from "./viewerProperty";
|
|
@@ -114,6 +120,10 @@ export type EngineRef = {
|
|
|
114
120
|
position: [x: number, y: number, z: number],
|
|
115
121
|
windowPosition: [x: number, y: number],
|
|
116
122
|
) => number | undefined;
|
|
123
|
+
getExtrudedPoint: (
|
|
124
|
+
position: [x: number, y: number, z: number],
|
|
125
|
+
extrutedHeight: number,
|
|
126
|
+
) => Position3d | undefined;
|
|
117
127
|
getSurfaceDistance: (point1: Cartesian3, point2: Cartesian3) => number | undefined;
|
|
118
128
|
equalsEpsilon2d: (
|
|
119
129
|
point1: Position2d,
|
|
@@ -196,6 +206,11 @@ export type EngineRef = {
|
|
|
196
206
|
// TODO: Get condition as expression for plugin
|
|
197
207
|
condition?: (f: PickedFeature) => boolean,
|
|
198
208
|
) => PickedFeature[] | undefined;
|
|
209
|
+
calcRectangleControlPoint: (
|
|
210
|
+
p1: Position3d,
|
|
211
|
+
p2: Position3d,
|
|
212
|
+
p3: Position3d,
|
|
213
|
+
) => [p1: Position3d, p2: Position3d, p3: Position3d];
|
|
199
214
|
} & MouseEventHandles;
|
|
200
215
|
|
|
201
216
|
export type EngineProps = {
|
|
@@ -360,4 +375,9 @@ export type SketchRef = {
|
|
|
360
375
|
setType: (type: SketchType | undefined, from?: "editor" | "plugin") => void;
|
|
361
376
|
getOptions: () => SketchOptions;
|
|
362
377
|
overrideOptions: (options: SketchOptions) => void;
|
|
378
|
+
editFeature: (feature: SketchEditingFeature | undefined) => void;
|
|
379
|
+
cancelEdit: (ignoreAutoReSelect?: boolean) => void;
|
|
380
|
+
applyEdit: () => void;
|
|
381
|
+
deleteFeature: (layerId: string, featureId: string) => void;
|
|
382
|
+
onEditFeatureChange: (cb: SketchEditFeatureChangeCb) => void;
|
|
363
383
|
};
|
|
@@ -26,6 +26,8 @@ type CoreContext = {
|
|
|
26
26
|
handleCameraForceHorizontalRollChange?: (enable?: boolean) => void;
|
|
27
27
|
handleInteractionModeChange?: (mode?: InteractionModeType | undefined) => void;
|
|
28
28
|
onSketchPluginFeatureCreate?: (cb: SketchEventCallback) => void;
|
|
29
|
+
onSketchPluginFeatureUpdate?: (cb: SketchEventCallback) => void;
|
|
30
|
+
onSketchPluginFeatureDelete?: (cb: SketchEventCallback) => void;
|
|
29
31
|
onSketchTypeChange?: (cb: (type: SketchType | undefined) => void) => void;
|
|
30
32
|
onLayerVisibility?: (cb: (e: LayerVisibilityEvent) => void) => void;
|
|
31
33
|
onLayerLoad?: (cb: (e: LayerLoadEvent) => void) => void;
|
package/src/Visualizer/hooks.ts
CHANGED
|
@@ -206,6 +206,25 @@ export default function useHooks(
|
|
|
206
206
|
onSketchPluginFeatureCreateCallbacksRef.current.forEach(fn => fn(props));
|
|
207
207
|
}, []);
|
|
208
208
|
|
|
209
|
+
const onSketchPluginFeatureUpdateCallbacksRef = useRef<SketchEventCallback[]>([]);
|
|
210
|
+
const onSketchPluginFeatureUpdate = useCallback((cb: SketchEventCallback) => {
|
|
211
|
+
onSketchPluginFeatureUpdateCallbacksRef.current.push(cb);
|
|
212
|
+
}, []);
|
|
213
|
+
const handleSketchPluginFeatureUpdate = useCallback((props: SketchEventProps) => {
|
|
214
|
+
onSketchPluginFeatureUpdateCallbacksRef.current.forEach(fn => fn(props));
|
|
215
|
+
}, []);
|
|
216
|
+
|
|
217
|
+
const onSketchPluginFeatureDeleteCallbacksRef = useRef<SketchEventCallback[]>([]);
|
|
218
|
+
const onSketchPluginFeatureDelete = useCallback((cb: SketchEventCallback) => {
|
|
219
|
+
onSketchPluginFeatureDeleteCallbacksRef.current.push(cb);
|
|
220
|
+
}, []);
|
|
221
|
+
const handleSketchPluginFeatureDelete = useCallback(
|
|
222
|
+
(props: { layerId: string; featureId: string }) => {
|
|
223
|
+
onSketchPluginFeatureDeleteCallbacksRef.current.forEach(fn => fn(props));
|
|
224
|
+
},
|
|
225
|
+
[],
|
|
226
|
+
);
|
|
227
|
+
|
|
209
228
|
const onSketchTypeChangeCallbacksRef = useRef<((type: SketchType | undefined) => void)[]>([]);
|
|
210
229
|
const onSketchTypeChange = useCallback((cb: (type: SketchType | undefined) => void) => {
|
|
211
230
|
onSketchTypeChangeCallbacksRef.current.push(cb);
|
|
@@ -256,6 +275,8 @@ export default function useHooks(
|
|
|
256
275
|
handleCameraForceHorizontalRollChange,
|
|
257
276
|
handleInteractionModeChange: changeInteractionMode,
|
|
258
277
|
onSketchPluginFeatureCreate,
|
|
278
|
+
onSketchPluginFeatureUpdate,
|
|
279
|
+
onSketchPluginFeatureDelete,
|
|
259
280
|
onSketchTypeChange,
|
|
260
281
|
onLayerVisibility,
|
|
261
282
|
onLayerLoad,
|
|
@@ -273,6 +294,8 @@ export default function useHooks(
|
|
|
273
294
|
handleCameraForceHorizontalRollChange,
|
|
274
295
|
onLayerEdit,
|
|
275
296
|
onSketchPluginFeatureCreate,
|
|
297
|
+
onSketchPluginFeatureUpdate,
|
|
298
|
+
onSketchPluginFeatureDelete,
|
|
276
299
|
onSketchTypeChange,
|
|
277
300
|
onLayerVisibility,
|
|
278
301
|
onLayerLoad,
|
|
@@ -313,6 +336,8 @@ export default function useHooks(
|
|
|
313
336
|
handleCameraChange: changeCamera,
|
|
314
337
|
handleInteractionModeChange: changeInteractionMode,
|
|
315
338
|
handleSketchPluginFeatureCreate,
|
|
339
|
+
handleSketchPluginFeatureUpdate,
|
|
340
|
+
handleSketchPluginFeatureDelete,
|
|
316
341
|
handleSketchTypeChange,
|
|
317
342
|
handleLayerVisibility,
|
|
318
343
|
handleLayerLoad,
|
package/src/Visualizer/index.tsx
CHANGED
|
@@ -58,7 +58,10 @@ export type CoreVisualizerProps = {
|
|
|
58
58
|
onMount?: () => void;
|
|
59
59
|
onSketchTypeChangeProp?: (type: SketchType | undefined) => void;
|
|
60
60
|
onSketchFeatureCreate?: (feature: SketchFeature | null) => void;
|
|
61
|
+
onSketchFeatureUpdate?: (feature: SketchFeature | null) => void;
|
|
62
|
+
onSketchFeatureDelete?: (layerId: string, featureId: string) => void;
|
|
61
63
|
onInteractionModeChange?: (mode: InteractionModeType) => void;
|
|
64
|
+
onAPIReady?: () => void;
|
|
62
65
|
};
|
|
63
66
|
|
|
64
67
|
export const CoreVisualizer = memo(
|
|
@@ -90,6 +93,9 @@ export const CoreVisualizer = memo(
|
|
|
90
93
|
onMount,
|
|
91
94
|
onSketchTypeChangeProp,
|
|
92
95
|
onSketchFeatureCreate,
|
|
96
|
+
onSketchFeatureUpdate,
|
|
97
|
+
onSketchFeatureDelete,
|
|
98
|
+
onAPIReady,
|
|
93
99
|
},
|
|
94
100
|
ref: Ref<MapRef | null>,
|
|
95
101
|
) => {
|
|
@@ -112,6 +118,8 @@ export const CoreVisualizer = memo(
|
|
|
112
118
|
handleCameraChange,
|
|
113
119
|
handleInteractionModeChange,
|
|
114
120
|
handleSketchPluginFeatureCreate,
|
|
121
|
+
handleSketchPluginFeatureUpdate,
|
|
122
|
+
handleSketchPluginFeatureDelete,
|
|
115
123
|
handleSketchTypeChange,
|
|
116
124
|
handleLayerVisibility,
|
|
117
125
|
handleLayerLoad,
|
|
@@ -171,6 +179,10 @@ export const CoreVisualizer = memo(
|
|
|
171
179
|
overrideInteractionMode={handleInteractionModeChange}
|
|
172
180
|
onSketchFeatureCreate={onSketchFeatureCreate}
|
|
173
181
|
onSketchPluginFeatureCreate={handleSketchPluginFeatureCreate}
|
|
182
|
+
onSketchFeatureUpdate={onSketchFeatureUpdate}
|
|
183
|
+
onSketchPluginFeatureUpdate={handleSketchPluginFeatureUpdate}
|
|
184
|
+
onSketchFeatureDelete={onSketchFeatureDelete}
|
|
185
|
+
onSketchPluginFeatureDelete={handleSketchPluginFeatureDelete}
|
|
174
186
|
onSketchTypeChange={handleSketchTypeChange}
|
|
175
187
|
onMount={onMount}
|
|
176
188
|
onLayerVisibility={handleLayerVisibility}
|
|
@@ -178,6 +190,7 @@ export const CoreVisualizer = memo(
|
|
|
178
190
|
onLayerSelectWithRectStart={handleLayerSelectWithRectStart}
|
|
179
191
|
onLayerSelectWithRectMove={handleLayerSelectWithRectMove}
|
|
180
192
|
onLayerSelectWithRectEnd={handleLayerSelectWithRectEnd}
|
|
193
|
+
onAPIReady={onAPIReady}
|
|
181
194
|
/>
|
|
182
195
|
<coreContext.Provider value={coreContextValue}>{children}</coreContext.Provider>
|
|
183
196
|
</div>
|
|
@@ -96,6 +96,7 @@ const FEATURE_DELEGATE_THRESHOLD = 6000;
|
|
|
96
96
|
export default function Feature({
|
|
97
97
|
layer,
|
|
98
98
|
isHidden,
|
|
99
|
+
sketchEditingFeature,
|
|
99
100
|
...props
|
|
100
101
|
}: FeatureComponentProps): JSX.Element | null {
|
|
101
102
|
const data = extractSimpleLayerData(layer);
|
|
@@ -131,7 +132,10 @@ export default function Feature({
|
|
|
131
132
|
const useSceneSpecularEnvironmentMaps =
|
|
132
133
|
!!props.viewerProperty?.scene?.imageBasedLighting?.specularEnvironmentMaps;
|
|
133
134
|
|
|
134
|
-
const isVisible =
|
|
135
|
+
const isVisible =
|
|
136
|
+
layer.layer.visible !== false &&
|
|
137
|
+
!isHidden &&
|
|
138
|
+
!(sketchEditingFeature?.layerId === layer.id && sketchEditingFeature?.feature?.id === f?.id);
|
|
135
139
|
|
|
136
140
|
const componentId =
|
|
137
141
|
urlMD5 +
|
|
@@ -140,7 +144,7 @@ export default function Feature({
|
|
|
140
144
|
f?.id ?? ""
|
|
141
145
|
}_${k}_${isVisible}_${useSceneSphericalHarmonicCoefficients}_${useSceneSpecularEnvironmentMaps}_${
|
|
142
146
|
JSON.stringify(f?.[k]) ?? ""
|
|
143
|
-
}_${JSON.stringify(layer.transition) ?? ""}`,
|
|
147
|
+
}_${JSON.stringify(layer.transition) ?? ""}_${JSON.stringify(f?.geometry) ?? ""}`,
|
|
144
148
|
);
|
|
145
149
|
|
|
146
150
|
if (cacheable) {
|