@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 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
+ };
@@ -497,6 +497,7 @@ export const provideDrawAPI = () => {
497
497
  sendResponse({ code: 200, requestID, message: `${operation} succeeded.` });
498
498
  }
499
499
  catch (error) {
500
+ logs.add(`${error}`, 'error');
500
501
  sendResponse({
501
502
  code: 500,
502
503
  requestID,
@@ -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.pre(() => {
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.pre(() => {
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 objects = {};
45
+ const frames = {};
46
46
  for (const { frame } of query.data ?? []) {
47
47
  if (frame === undefined) {
48
48
  continue;
49
49
  }
50
- const resourceName = resourceByName.current[frame.referenceFrame];
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 objects;
52
+ return frames;
56
53
  });
57
- const [configFrames, configUnsetFrames] = $derived.by(() => {
54
+ const [configFrames, configUnsetFrameNames] = $derived.by(() => {
58
55
  const components = partConfig.localPartConfig.toJson().components;
59
- const objects = [];
60
- const unsetObjects = [];
61
- // deal with part defined frame config
62
- for (const component of components ?? []) {
63
- if (!component.frame) {
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
- const pose = createPoseFromFrame(component.frame);
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 [objects, unsetObjects];
65
+ return [results, unsetResults];
73
66
  });
74
- const [fragmentFrames, fragmentUnsetFrames] = $derived.by(() => {
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 objects = [];
78
- const unsetObjects = [];
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
- unsetObjects.push(fragmentComponentName);
82
+ unsetResults.push(fragmentComponentName);
90
83
  }
91
84
  else if (unsetComponentModIndex < setComponentModIndex) {
92
85
  const frameData = fragmentMod.mods[setComponentModIndex]['$set'][`components.${fragmentComponentName}.frame`];
93
- const pose = createPoseFromFrame(frameData);
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
- $effect.pre(() => {
115
- for (const frame of fragmentFrames) {
116
- const result = machineFrames[frame.name];
117
- if (result) {
118
- result.referenceFrame = frame.referenceFrame;
119
- result.localEditedPose = frame.pose;
120
- result.geometry = frame.geometry;
121
- }
122
- else {
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
- $effect.pre(() => {
128
- for (const name of configUnsetFrames) {
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
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
139
- const _configFrames = configFrames;
140
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
141
- const _fragmentFrames = fragmentFrames;
142
- const results = Object.values(machineFrames);
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
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@viamrobotics/motion-tools",
3
- "version": "0.19.1",
3
+ "version": "0.19.2",
4
4
  "description": "Motion visualization with Viam",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",