@viamrobotics/motion-tools 0.15.1 → 0.15.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hooks/useFrames.svelte.js +64 -64
- package/package.json +1 -1
|
@@ -6,7 +6,6 @@ import { resourceNameToColor } from '../color';
|
|
|
6
6
|
import { usePartConfig } from './usePartConfig.svelte';
|
|
7
7
|
import { useEnvironment } from './useEnvironment.svelte';
|
|
8
8
|
import { createPoseFromFrame } from '../transform';
|
|
9
|
-
import { usePersistentUUIDs } from './usePersistentUUIDs.svelte';
|
|
10
9
|
import { createGeometryFromFrame } from '../geometry';
|
|
11
10
|
import { useResourceByName } from './useResourceByName.svelte';
|
|
12
11
|
const key = Symbol('frames-context');
|
|
@@ -19,7 +18,6 @@ export const provideFrames = (partID) => {
|
|
|
19
18
|
const revision = $derived(machineStatus.current?.config?.revision);
|
|
20
19
|
const partConfig = usePartConfig();
|
|
21
20
|
const environment = useEnvironment();
|
|
22
|
-
const { updateUUIDs } = usePersistentUUIDs();
|
|
23
21
|
$effect.pre(() => {
|
|
24
22
|
if (revision) {
|
|
25
23
|
untrack(() => query.current).refetch();
|
|
@@ -34,8 +32,8 @@ export const provideFrames = (partID) => {
|
|
|
34
32
|
environment.current.viewerMode = 'monitor';
|
|
35
33
|
}
|
|
36
34
|
});
|
|
37
|
-
|
|
38
|
-
const objects =
|
|
35
|
+
let current = $derived.by(() => {
|
|
36
|
+
const objects = [];
|
|
39
37
|
for (const { frame } of query.current.data ?? []) {
|
|
40
38
|
if (frame === undefined) {
|
|
41
39
|
continue;
|
|
@@ -43,32 +41,60 @@ export const provideFrames = (partID) => {
|
|
|
43
41
|
const resourceName = resourceByName.current[frame.referenceFrame];
|
|
44
42
|
const frameName = frame.referenceFrame ? frame.referenceFrame : 'Unnamed frame';
|
|
45
43
|
const color = resourceNameToColor(resourceName);
|
|
46
|
-
objects
|
|
44
|
+
objects.push(new WorldObject(frameName, frame.poseInObserverFrame?.pose, frame.poseInObserverFrame?.referenceFrame, frame.physicalObject, color ? { color } : undefined));
|
|
47
45
|
}
|
|
48
46
|
return objects;
|
|
49
47
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
48
|
+
let currentWorldObjects = {};
|
|
49
|
+
const getWorldObjects = () => ({ ...currentWorldObjects });
|
|
50
|
+
const getWorldObject = (componentName) => currentWorldObjects[componentName];
|
|
51
|
+
const setWorldObject = (component, worldObject) => {
|
|
52
|
+
if (!component.frame) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
worldObject.referenceFrame = component.frame.parent;
|
|
56
|
+
worldObject.localEditedPose = createPoseFromFrame(component.frame);
|
|
57
|
+
if (component.frame.geometry) {
|
|
58
|
+
worldObject.geometry = createGeometryFromFrame(component.frame);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
worldObject.geometry = undefined;
|
|
62
|
+
}
|
|
63
|
+
currentWorldObjects[component.name] = worldObject;
|
|
64
|
+
};
|
|
65
|
+
const deleteWorldObject = (componentName) => {
|
|
66
|
+
delete currentWorldObjects[componentName];
|
|
67
|
+
};
|
|
68
|
+
$effect.pre(() => {
|
|
69
|
+
untrack(() => {
|
|
70
|
+
currentWorldObjects = {};
|
|
71
|
+
for (const currentWorldObject of current) {
|
|
72
|
+
currentWorldObjects[currentWorldObject.name] = currentWorldObject;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
const components = partConfig.localPartConfig.toJson()?.components;
|
|
76
|
+
const fragmentMods = partConfig.localPartConfig.toJson()
|
|
77
|
+
?.fragment_mods;
|
|
78
|
+
const fragmentDefinedComponents = Object.keys(partConfig.componentNameToFragmentId);
|
|
53
79
|
// deal with part defined frame config
|
|
54
|
-
for (const component of components
|
|
55
|
-
|
|
56
|
-
|
|
80
|
+
for (const component of components || []) {
|
|
81
|
+
const worldObject = getWorldObject(component.name);
|
|
82
|
+
if (worldObject && component.frame) {
|
|
83
|
+
setWorldObject(component, worldObject);
|
|
84
|
+
}
|
|
85
|
+
else if (component.frame && Object.keys(getWorldObjects()).length > 0) {
|
|
86
|
+
// extra clause to prevent adding a component to the world objects when it may be loaded via frame system config later (first tick issue where config updated but current world objects not triggered yet)
|
|
87
|
+
const pose = createPoseFromFrame(component.frame);
|
|
88
|
+
const newWorldObject = new WorldObject(component.name, pose, component.frame.parent);
|
|
89
|
+
setWorldObject(component, newWorldObject);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
deleteWorldObject(component.name);
|
|
57
93
|
}
|
|
58
|
-
const pose = createPoseFromFrame(component.frame);
|
|
59
|
-
const geometry = createGeometryFromFrame(component.frame);
|
|
60
|
-
const worldObject = new WorldObject(component.name, pose, component.frame.parent, geometry);
|
|
61
|
-
objects.push(worldObject);
|
|
62
94
|
}
|
|
63
|
-
return objects;
|
|
64
|
-
});
|
|
65
|
-
const [fragmentFrames, fragmentUnsetFrames] = $derived.by(() => {
|
|
66
|
-
const { fragment_mods: fragmentMods = [] } = partConfig.localPartConfig.toJson() ?? {};
|
|
67
|
-
const fragmentDefinedComponents = Object.keys(partConfig.componentNameToFragmentId);
|
|
68
|
-
const objects = [];
|
|
69
|
-
const unsetObjects = [];
|
|
70
95
|
// deal with fragment defined components
|
|
71
96
|
for (const fragmentComponentName of fragmentDefinedComponents || []) {
|
|
97
|
+
const worldObject = getWorldObject(fragmentComponentName);
|
|
72
98
|
const fragmentId = partConfig.componentNameToFragmentId[fragmentComponentName];
|
|
73
99
|
const fragmentMod = fragmentMods?.find((mod) => mod.fragment_id === fragmentId);
|
|
74
100
|
if (!fragmentMod) {
|
|
@@ -77,53 +103,27 @@ export const provideFrames = (partID) => {
|
|
|
77
103
|
const setComponentModIndex = fragmentMod.mods.findLastIndex((mod) => mod['$set']?.[`components.${fragmentComponentName}.frame`] !== undefined);
|
|
78
104
|
const unsetComponentModIndex = fragmentMod.mods.findLastIndex((mod) => mod['$unset']?.[`components.${fragmentComponentName}.frame`] !== undefined);
|
|
79
105
|
if (setComponentModIndex < unsetComponentModIndex) {
|
|
80
|
-
|
|
106
|
+
deleteWorldObject(fragmentComponentName);
|
|
81
107
|
}
|
|
82
108
|
else if (unsetComponentModIndex < setComponentModIndex) {
|
|
83
109
|
const frameData = fragmentMod.mods[setComponentModIndex]['$set'][`components.${fragmentComponentName}.frame`];
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
result.referenceFrame = frame.referenceFrame;
|
|
97
|
-
result.pose = frame.pose;
|
|
98
|
-
result.geometry = frame.geometry;
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
machineFrames[frame.name] = frame;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
$effect.pre(() => {
|
|
106
|
-
for (const frame of fragmentFrames) {
|
|
107
|
-
const result = machineFrames[frame.name];
|
|
108
|
-
if (result) {
|
|
109
|
-
result.referenceFrame = frame.referenceFrame;
|
|
110
|
-
result.pose = frame.pose;
|
|
111
|
-
result.geometry = frame.geometry;
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
machineFrames[frame.name] = frame;
|
|
110
|
+
const componentConfig = {
|
|
111
|
+
name: fragmentComponentName,
|
|
112
|
+
frame: frameData,
|
|
113
|
+
};
|
|
114
|
+
if (worldObject) {
|
|
115
|
+
setWorldObject(componentConfig, worldObject);
|
|
116
|
+
}
|
|
117
|
+
else if (Object.keys(getWorldObjects()).length > 0) {
|
|
118
|
+
const pose = createPoseFromFrame(frameData);
|
|
119
|
+
const newWorldObject = new WorldObject(fragmentComponentName, pose, frameData.parent);
|
|
120
|
+
setWorldObject(componentConfig, newWorldObject);
|
|
121
|
+
}
|
|
115
122
|
}
|
|
116
123
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
delete machineFrames[name];
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
const current = $derived.by(() => {
|
|
124
|
-
const results = Object.values(machineFrames);
|
|
125
|
-
updateUUIDs(results);
|
|
126
|
-
return results;
|
|
124
|
+
untrack(() => {
|
|
125
|
+
current = [...Object.values(getWorldObjects())];
|
|
126
|
+
});
|
|
127
127
|
});
|
|
128
128
|
const error = $derived(query.current.error ?? undefined);
|
|
129
129
|
const fetching = $derived(query.current.isFetching);
|