@reearth/core 0.0.7-alpha.14 → 0.0.7-alpha.16
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 +7164 -5873
- package/dist/core.umd.cjs +71 -71
- package/dist/index.d.ts +62 -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 +27 -1
- package/src/Visualizer/coreContext.tsx +2 -0
- package/src/Visualizer/hooks.ts +25 -0
- package/src/Visualizer/index.tsx +20 -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/Globe.tsx +11 -2
- package/src/engines/Cesium/core/Imagery.tsx +7 -2
- package/src/engines/Cesium/core/presets.ts +0 -11
- package/src/engines/Cesium/hooks/useEngineRef.ts +36 -0
- package/src/engines/Cesium/hooks.ts +50 -0
- package/src/engines/Cesium/index.tsx +16 -3
|
@@ -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 = {
|
|
@@ -220,6 +235,7 @@ export type EngineProps = {
|
|
|
220
235
|
isLayerDragging?: boolean;
|
|
221
236
|
shouldRender?: boolean;
|
|
222
237
|
meta?: Record<string, unknown>;
|
|
238
|
+
displayCredits?: boolean;
|
|
223
239
|
layersRef?: RefObject<LayersRef>;
|
|
224
240
|
requestingRenderMode?: MutableRefObject<RequestingRenderMode>;
|
|
225
241
|
timelineManagerRef?: TimelineManagerRef;
|
|
@@ -243,6 +259,7 @@ export type EngineProps = {
|
|
|
243
259
|
onLayerSelectWithRectStart?: (e: LayerSelectWithRectStart) => void;
|
|
244
260
|
onLayerSelectWithRectMove?: (e: LayerSelectWithRectMove) => void;
|
|
245
261
|
onLayerSelectWithRectEnd?: (e: LayerSelectWithRectEnd) => void;
|
|
262
|
+
onCreditsUpdate?: (credits: Credit[]) => void;
|
|
246
263
|
};
|
|
247
264
|
|
|
248
265
|
export type LayerEditEvent = {
|
|
@@ -360,4 +377,13 @@ export type SketchRef = {
|
|
|
360
377
|
setType: (type: SketchType | undefined, from?: "editor" | "plugin") => void;
|
|
361
378
|
getOptions: () => SketchOptions;
|
|
362
379
|
overrideOptions: (options: SketchOptions) => void;
|
|
380
|
+
editFeature: (feature: SketchEditingFeature | undefined) => void;
|
|
381
|
+
cancelEdit: (ignoreAutoReSelect?: boolean) => void;
|
|
382
|
+
applyEdit: () => void;
|
|
383
|
+
deleteFeature: (layerId: string, featureId: string) => void;
|
|
384
|
+
onEditFeatureChange: (cb: SketchEditFeatureChangeCb) => void;
|
|
385
|
+
};
|
|
386
|
+
|
|
387
|
+
export type Credit = {
|
|
388
|
+
html?: string;
|
|
363
389
|
};
|
|
@@ -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
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
type LatLng,
|
|
13
13
|
type Cluster,
|
|
14
14
|
type ComputedLayer,
|
|
15
|
+
type Credit,
|
|
15
16
|
} from "../Map";
|
|
16
17
|
import { SketchFeature, SketchType } from "../Map/Sketch/types";
|
|
17
18
|
|
|
@@ -46,6 +47,7 @@ export type CoreVisualizerProps = {
|
|
|
46
47
|
ready?: boolean;
|
|
47
48
|
hiddenLayers?: string[];
|
|
48
49
|
zoomedLayerId?: string;
|
|
50
|
+
displayCredits?: boolean;
|
|
49
51
|
onCameraChange?: (camera: Camera) => void;
|
|
50
52
|
onLayerDrop?: (layerId: string, propertyKey: string, position: LatLng | undefined) => void;
|
|
51
53
|
onLayerSelect?: (
|
|
@@ -58,7 +60,11 @@ export type CoreVisualizerProps = {
|
|
|
58
60
|
onMount?: () => void;
|
|
59
61
|
onSketchTypeChangeProp?: (type: SketchType | undefined) => void;
|
|
60
62
|
onSketchFeatureCreate?: (feature: SketchFeature | null) => void;
|
|
63
|
+
onSketchFeatureUpdate?: (feature: SketchFeature | null) => void;
|
|
64
|
+
onSketchFeatureDelete?: (layerId: string, featureId: string) => void;
|
|
61
65
|
onInteractionModeChange?: (mode: InteractionModeType) => void;
|
|
66
|
+
onAPIReady?: () => void;
|
|
67
|
+
onCreditsUpdate?: (credits: Credit[]) => void;
|
|
62
68
|
};
|
|
63
69
|
|
|
64
70
|
export const CoreVisualizer = memo(
|
|
@@ -79,6 +85,7 @@ export const CoreVisualizer = memo(
|
|
|
79
85
|
interactionMode,
|
|
80
86
|
shouldRender,
|
|
81
87
|
meta,
|
|
88
|
+
displayCredits = true,
|
|
82
89
|
style,
|
|
83
90
|
zoomedLayerId,
|
|
84
91
|
children,
|
|
@@ -90,6 +97,10 @@ export const CoreVisualizer = memo(
|
|
|
90
97
|
onMount,
|
|
91
98
|
onSketchTypeChangeProp,
|
|
92
99
|
onSketchFeatureCreate,
|
|
100
|
+
onSketchFeatureUpdate,
|
|
101
|
+
onSketchFeatureDelete,
|
|
102
|
+
onAPIReady,
|
|
103
|
+
onCreditsUpdate,
|
|
93
104
|
},
|
|
94
105
|
ref: Ref<MapRef | null>,
|
|
95
106
|
) => {
|
|
@@ -112,6 +123,8 @@ export const CoreVisualizer = memo(
|
|
|
112
123
|
handleCameraChange,
|
|
113
124
|
handleInteractionModeChange,
|
|
114
125
|
handleSketchPluginFeatureCreate,
|
|
126
|
+
handleSketchPluginFeatureUpdate,
|
|
127
|
+
handleSketchPluginFeatureDelete,
|
|
115
128
|
handleSketchTypeChange,
|
|
116
129
|
handleLayerVisibility,
|
|
117
130
|
handleLayerLoad,
|
|
@@ -152,6 +165,7 @@ export const CoreVisualizer = memo(
|
|
|
152
165
|
isLayerDragging={isLayerDragging}
|
|
153
166
|
isLayerDraggable={isEditable}
|
|
154
167
|
meta={meta}
|
|
168
|
+
displayCredits={displayCredits}
|
|
155
169
|
style={style}
|
|
156
170
|
featureFlags={featureFlags}
|
|
157
171
|
shouldRender={shouldRender}
|
|
@@ -171,6 +185,10 @@ export const CoreVisualizer = memo(
|
|
|
171
185
|
overrideInteractionMode={handleInteractionModeChange}
|
|
172
186
|
onSketchFeatureCreate={onSketchFeatureCreate}
|
|
173
187
|
onSketchPluginFeatureCreate={handleSketchPluginFeatureCreate}
|
|
188
|
+
onSketchFeatureUpdate={onSketchFeatureUpdate}
|
|
189
|
+
onSketchPluginFeatureUpdate={handleSketchPluginFeatureUpdate}
|
|
190
|
+
onSketchFeatureDelete={onSketchFeatureDelete}
|
|
191
|
+
onSketchPluginFeatureDelete={handleSketchPluginFeatureDelete}
|
|
174
192
|
onSketchTypeChange={handleSketchTypeChange}
|
|
175
193
|
onMount={onMount}
|
|
176
194
|
onLayerVisibility={handleLayerVisibility}
|
|
@@ -178,6 +196,8 @@ export const CoreVisualizer = memo(
|
|
|
178
196
|
onLayerSelectWithRectStart={handleLayerSelectWithRectStart}
|
|
179
197
|
onLayerSelectWithRectMove={handleLayerSelectWithRectMove}
|
|
180
198
|
onLayerSelectWithRectEnd={handleLayerSelectWithRectEnd}
|
|
199
|
+
onAPIReady={onAPIReady}
|
|
200
|
+
onCreditsUpdate={onCreditsUpdate}
|
|
181
201
|
/>
|
|
182
202
|
<coreContext.Provider value={coreContextValue}>{children}</coreContext.Provider>
|
|
183
203
|
</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) {
|