@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.
@@ -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
- const machineFrames = $derived.by(() => {
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[frameName] = new WorldObject(frameName, frame.poseInObserverFrame?.pose, frame.poseInObserverFrame?.referenceFrame, frame.physicalObject, color ? { color } : undefined);
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
- const configFrames = $derived.by(() => {
51
- const components = partConfig.localPartConfig.toJson().components;
52
- const objects = [];
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
- if (!component.frame) {
56
- continue;
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
- unsetObjects.push(fragmentComponentName);
106
+ deleteWorldObject(fragmentComponentName);
81
107
  }
82
108
  else if (unsetComponentModIndex < setComponentModIndex) {
83
109
  const frameData = fragmentMod.mods[setComponentModIndex]['$set'][`components.${fragmentComponentName}.frame`];
84
- const pose = createPoseFromFrame(frameData);
85
- const geometry = createGeometryFromFrame(frameData);
86
- const worldObject = new WorldObject(fragmentComponentName, pose, frameData.parent, geometry);
87
- objects.push(worldObject);
88
- }
89
- }
90
- return [objects, unsetObjects];
91
- });
92
- $effect.pre(() => {
93
- for (const frame of configFrames) {
94
- const result = machineFrames[frame.name];
95
- if (result) {
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
- $effect.pre(() => {
119
- for (const name of fragmentUnsetFrames) {
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);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@viamrobotics/motion-tools",
3
- "version": "0.15.1",
3
+ "version": "0.15.2",
4
4
  "description": "Motion visualization with Viam",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",