@viamrobotics/motion-tools 0.19.1 → 0.19.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/frame.d.ts +2 -0
- package/dist/frame.js +14 -0
- package/dist/hooks/useDrawAPI.svelte.js +1 -0
- package/dist/hooks/useFrames.svelte.js +41 -69
- package/package.json +1 -1
package/dist/frame.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Transform } from '@viamrobotics/sdk';
|
|
1
2
|
import type { ValueOf } from 'type-fest';
|
|
2
3
|
type FrameGeometryMap = {
|
|
3
4
|
none: {
|
|
@@ -73,4 +74,5 @@ export interface Frame<T extends FrameGeometry = FrameGeometry, K extends FrameO
|
|
|
73
74
|
geometry?: FrameGeometryMap[T];
|
|
74
75
|
}
|
|
75
76
|
export declare const createFrame: <T extends FrameGeometry = "box", K extends FrameOrientation = "ov_degrees">(geometry?: FrameGeometryMap[T]) => Frame<T>;
|
|
77
|
+
export declare const createTransformFromFrame: (name: string, frame: Partial<Frame>) => Transform;
|
|
76
78
|
export {};
|
package/dist/frame.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
// TODO: replace with types exported from the sdk when created
|
|
2
|
+
import { UuidTool } from 'uuid-tool';
|
|
3
|
+
import { createPoseFromFrame } from './transform';
|
|
4
|
+
import { createGeometryFromFrame } from './geometry';
|
|
2
5
|
export const createFrame = (geometry) => {
|
|
3
6
|
return {
|
|
4
7
|
parent: 'world',
|
|
@@ -10,3 +13,14 @@ export const createFrame = (geometry) => {
|
|
|
10
13
|
geometry: (geometry ?? { type: 'box', x: 100, y: 100, z: 100 }),
|
|
11
14
|
};
|
|
12
15
|
};
|
|
16
|
+
export const createTransformFromFrame = (name, frame) => {
|
|
17
|
+
return {
|
|
18
|
+
uuid: new Uint8Array(UuidTool.toBytes(UuidTool.newUuid())),
|
|
19
|
+
referenceFrame: name,
|
|
20
|
+
poseInObserverFrame: {
|
|
21
|
+
referenceFrame: frame.parent ?? 'world',
|
|
22
|
+
pose: createPoseFromFrame(frame),
|
|
23
|
+
},
|
|
24
|
+
physicalObject: createGeometryFromFrame(frame),
|
|
25
|
+
};
|
|
26
|
+
};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { getContext, setContext, untrack } from 'svelte';
|
|
2
|
+
import { Transform } from '@viamrobotics/sdk';
|
|
2
3
|
import { useRobotClient, createRobotQuery, useMachineStatus } from '@viamrobotics/svelte-sdk';
|
|
3
4
|
import { WorldObject } from '../WorldObject.svelte';
|
|
4
5
|
import { useLogs } from './useLogs.svelte';
|
|
5
6
|
import { resourceNameToColor } from '../color';
|
|
7
|
+
import { createTransformFromFrame } from '../frame';
|
|
6
8
|
import { usePartConfig } from './usePartConfig.svelte';
|
|
7
9
|
import { useEnvironment } from './useEnvironment.svelte';
|
|
8
|
-
import { createPoseFromFrame } from '../transform';
|
|
9
|
-
import { createGeometryFromFrame } from '../geometry';
|
|
10
10
|
import { useResourceByName } from './useResourceByName.svelte';
|
|
11
11
|
import { usePersistentUUIDs } from './usePersistentUUIDs.svelte';
|
|
12
12
|
const key = Symbol('frames-context');
|
|
@@ -20,7 +20,7 @@ export const provideFrames = (partID) => {
|
|
|
20
20
|
const partConfig = usePartConfig();
|
|
21
21
|
const environment = useEnvironment();
|
|
22
22
|
const { updateUUIDs } = usePersistentUUIDs();
|
|
23
|
-
$effect
|
|
23
|
+
$effect(() => {
|
|
24
24
|
if (revision) {
|
|
25
25
|
untrack(() => query.refetch());
|
|
26
26
|
}
|
|
@@ -33,7 +33,7 @@ export const provideFrames = (partID) => {
|
|
|
33
33
|
logs.add(`Frames: ${query.error.message}`, 'error');
|
|
34
34
|
}
|
|
35
35
|
});
|
|
36
|
-
$effect
|
|
36
|
+
$effect(() => {
|
|
37
37
|
if (partConfig.isDirty) {
|
|
38
38
|
environment.current.viewerMode = 'edit';
|
|
39
39
|
}
|
|
@@ -42,40 +42,33 @@ export const provideFrames = (partID) => {
|
|
|
42
42
|
}
|
|
43
43
|
});
|
|
44
44
|
const machineFrames = $derived.by(() => {
|
|
45
|
-
const
|
|
45
|
+
const frames = {};
|
|
46
46
|
for (const { frame } of query.data ?? []) {
|
|
47
47
|
if (frame === undefined) {
|
|
48
48
|
continue;
|
|
49
49
|
}
|
|
50
|
-
|
|
51
|
-
const frameName = frame.referenceFrame ? frame.referenceFrame : 'Unnamed frame';
|
|
52
|
-
const color = resourceNameToColor(resourceName);
|
|
53
|
-
objects[frameName] = new WorldObject(frameName, frame.poseInObserverFrame?.pose, frame.poseInObserverFrame?.referenceFrame, frame.physicalObject, color ? { color } : undefined);
|
|
50
|
+
frames[frame.referenceFrame] = frame;
|
|
54
51
|
}
|
|
55
|
-
return
|
|
52
|
+
return frames;
|
|
56
53
|
});
|
|
57
|
-
const [configFrames,
|
|
54
|
+
const [configFrames, configUnsetFrameNames] = $derived.by(() => {
|
|
58
55
|
const components = partConfig.localPartConfig.toJson().components;
|
|
59
|
-
const
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
unsetObjects.push(component.name);
|
|
56
|
+
const results = {};
|
|
57
|
+
const unsetResults = [];
|
|
58
|
+
for (const { name, frame } of components ?? []) {
|
|
59
|
+
if (!frame) {
|
|
60
|
+
unsetResults.push(name);
|
|
65
61
|
continue;
|
|
66
62
|
}
|
|
67
|
-
|
|
68
|
-
const geometry = createGeometryFromFrame(component.frame);
|
|
69
|
-
const worldObject = new WorldObject(component.name, pose, component.frame.parent, geometry);
|
|
70
|
-
objects.push(worldObject);
|
|
63
|
+
results[name] = createTransformFromFrame(name, frame);
|
|
71
64
|
}
|
|
72
|
-
return [
|
|
65
|
+
return [results, unsetResults];
|
|
73
66
|
});
|
|
74
|
-
const [fragmentFrames,
|
|
67
|
+
const [fragmentFrames, fragmentUnsetFrameNames] = $derived.by(() => {
|
|
75
68
|
const { fragment_mods: fragmentMods = [] } = partConfig.localPartConfig.toJson() ?? {};
|
|
76
69
|
const fragmentDefinedComponents = Object.keys(partConfig.componentNameToFragmentId);
|
|
77
|
-
const
|
|
78
|
-
const
|
|
70
|
+
const results = {};
|
|
71
|
+
const unsetResults = [];
|
|
79
72
|
// deal with fragment defined components
|
|
80
73
|
for (const fragmentComponentName of fragmentDefinedComponents || []) {
|
|
81
74
|
const fragmentId = partConfig.componentNameToFragmentId[fragmentComponentName];
|
|
@@ -86,60 +79,39 @@ export const provideFrames = (partID) => {
|
|
|
86
79
|
const setComponentModIndex = fragmentMod.mods.findLastIndex((mod) => mod['$set']?.[`components.${fragmentComponentName}.frame`] !== undefined);
|
|
87
80
|
const unsetComponentModIndex = fragmentMod.mods.findLastIndex((mod) => mod['$unset']?.[`components.${fragmentComponentName}.frame`] !== undefined);
|
|
88
81
|
if (setComponentModIndex < unsetComponentModIndex) {
|
|
89
|
-
|
|
82
|
+
unsetResults.push(fragmentComponentName);
|
|
90
83
|
}
|
|
91
84
|
else if (unsetComponentModIndex < setComponentModIndex) {
|
|
92
85
|
const frameData = fragmentMod.mods[setComponentModIndex]['$set'][`components.${fragmentComponentName}.frame`];
|
|
93
|
-
|
|
94
|
-
const geometry = createGeometryFromFrame(frameData);
|
|
95
|
-
const worldObject = new WorldObject(fragmentComponentName, pose, frameData.parent, geometry);
|
|
96
|
-
objects.push(worldObject);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
return [objects, unsetObjects];
|
|
100
|
-
});
|
|
101
|
-
$effect.pre(() => {
|
|
102
|
-
for (const frame of configFrames) {
|
|
103
|
-
const result = machineFrames[frame.name];
|
|
104
|
-
if (result) {
|
|
105
|
-
result.referenceFrame = frame.referenceFrame;
|
|
106
|
-
result.localEditedPose = frame.pose;
|
|
107
|
-
result.geometry = frame.geometry;
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
machineFrames[frame.name] = frame;
|
|
86
|
+
results[fragmentComponentName] = createTransformFromFrame(fragmentComponentName, frameData);
|
|
111
87
|
}
|
|
112
88
|
}
|
|
89
|
+
return [results, unsetResults];
|
|
113
90
|
});
|
|
114
|
-
$
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
machineFrames[frame.name] = frame;
|
|
124
|
-
}
|
|
91
|
+
const frames = $derived.by(() => {
|
|
92
|
+
const result = {
|
|
93
|
+
...machineFrames,
|
|
94
|
+
...configFrames,
|
|
95
|
+
...fragmentFrames,
|
|
96
|
+
};
|
|
97
|
+
// Remove frames that have just been deleted locally for optimistic updates
|
|
98
|
+
for (const name of configUnsetFrameNames) {
|
|
99
|
+
delete result[name];
|
|
125
100
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
delete machineFrames[name];
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
$effect.pre(() => {
|
|
133
|
-
for (const name of fragmentUnsetFrames) {
|
|
134
|
-
delete machineFrames[name];
|
|
101
|
+
// Remove frames that have been removed by fragment overrides
|
|
102
|
+
for (const name of fragmentUnsetFrameNames) {
|
|
103
|
+
delete result[name];
|
|
135
104
|
}
|
|
105
|
+
return result;
|
|
136
106
|
});
|
|
137
107
|
const current = $derived.by(() => {
|
|
138
|
-
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
108
|
+
const results = [];
|
|
109
|
+
for (const frame of Object.values(frames)) {
|
|
110
|
+
const resourceName = resourceByName.current[frame.referenceFrame];
|
|
111
|
+
const frameName = frame.referenceFrame ? frame.referenceFrame : 'Unnamed frame';
|
|
112
|
+
const color = resourceNameToColor(resourceName);
|
|
113
|
+
results.push(new WorldObject(frameName, frame.poseInObserverFrame?.pose, frame.poseInObserverFrame?.referenceFrame, frame.physicalObject, color ? { color } : undefined));
|
|
114
|
+
}
|
|
143
115
|
updateUUIDs(results);
|
|
144
116
|
return results;
|
|
145
117
|
});
|