@viamrobotics/motion-tools 0.19.2 → 1.0.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/README.md +56 -26
- package/dist/FrameConfigUpdater.svelte.d.ts +11 -17
- package/dist/FrameConfigUpdater.svelte.js +109 -109
- package/dist/WorldObject.svelte.js +2 -15
- package/dist/common/v1/common_pb.d.ts +950 -0
- package/dist/common/v1/common_pb.js +1399 -0
- package/dist/components/App.svelte +37 -21
- package/dist/components/App.svelte.d.ts +1 -0
- package/dist/components/BatchedArrows.svelte +102 -0
- package/dist/components/BatchedArrows.svelte.d.ts +3 -0
- package/dist/components/CameraControls.svelte +2 -3
- package/dist/components/Details.svelte +364 -365
- package/dist/components/Entities.svelte +73 -0
- package/dist/components/{WorldObjects.svelte.d.ts → Entities.svelte.d.ts} +3 -3
- package/dist/components/FileDrop.svelte +9 -23
- package/dist/components/Focus.svelte +2 -3
- package/dist/components/Frame.svelte +41 -22
- package/dist/components/Frame.svelte.d.ts +4 -6
- package/dist/components/GLTF.svelte +36 -0
- package/dist/components/GLTF.svelte.d.ts +11 -0
- package/dist/components/Geometry2.svelte +201 -0
- package/dist/components/Geometry2.svelte.d.ts +18 -0
- package/dist/components/KeyboardControls.svelte +3 -3
- package/dist/components/Line.svelte +10 -13
- package/dist/components/Line.svelte.d.ts +2 -2
- package/dist/components/LiveUpdatesBanner.svelte +51 -15
- package/dist/components/MeasureTool.svelte +4 -5
- package/dist/components/Pointcloud.svelte +27 -14
- package/dist/components/Pointcloud.svelte.d.ts +2 -2
- package/dist/components/PointerMissBox.svelte +3 -3
- package/dist/components/Pose.svelte +31 -6
- package/dist/components/Pose.svelte.d.ts +2 -2
- package/dist/components/Scene.svelte +7 -6
- package/dist/components/SceneProviders.svelte +0 -6
- package/dist/components/Selected.svelte +22 -16
- package/dist/components/StaticGeometries.svelte +51 -27
- package/dist/components/Tree/Tree.svelte +28 -22
- package/dist/components/Tree/Tree.svelte.d.ts +2 -3
- package/dist/components/Tree/TreeContainer.svelte +72 -40
- package/dist/components/Tree/Widgets.svelte +2 -5
- package/dist/components/Tree/buildTree.d.ts +3 -6
- package/dist/components/Tree/buildTree.js +19 -39
- package/dist/components/__tests__/__fixtures__/entity.d.ts +2 -0
- package/dist/components/__tests__/__fixtures__/entity.js +20 -0
- package/dist/components/__tests__/__fixtures__/resource.d.ts +17 -0
- package/dist/components/__tests__/__fixtures__/resource.js +13 -0
- package/dist/components/dashboard/Dashboard.svelte +5 -3
- package/dist/components/dashboard/Dashboard.svelte.d.ts +7 -2
- package/dist/components/widgets/ArmPositions.svelte +19 -7
- package/dist/draw/v1/drawing_pb.d.ts +341 -0
- package/dist/draw/v1/drawing_pb.js +417 -0
- package/dist/draw/v1/metadata_pb.d.ts +23 -0
- package/dist/draw/v1/metadata_pb.js +39 -0
- package/dist/draw/v1/scene_pb.d.ts +230 -0
- package/dist/draw/v1/scene_pb.js +298 -0
- package/dist/draw/v1/snapshot_pb.d.ts +42 -0
- package/dist/draw/v1/snapshot_pb.js +61 -0
- package/dist/draw/v1/transforms_pb.d.ts +23 -0
- package/dist/draw/v1/transforms_pb.js +39 -0
- package/dist/ecs/index.d.ts +4 -0
- package/dist/ecs/index.js +4 -0
- package/dist/ecs/traits.d.ts +128 -0
- package/dist/ecs/traits.js +81 -0
- package/dist/ecs/useQuery.svelte.d.ts +4 -0
- package/dist/ecs/useQuery.svelte.js +49 -0
- package/dist/ecs/useTrait.svelte.d.ts +19 -0
- package/dist/ecs/useTrait.svelte.js +40 -0
- package/dist/ecs/useWorld.d.ts +4 -0
- package/dist/ecs/useWorld.js +10 -0
- package/dist/geometry.js +6 -6
- package/dist/hooks/__tests__/fixtures/ResizableTestWrapper.svelte +41 -0
- package/dist/hooks/__tests__/fixtures/ResizableTestWrapper.svelte.d.ts +6 -0
- package/dist/hooks/use3DModels.svelte.js +6 -4
- package/dist/hooks/useDrawAPI.svelte.d.ts +0 -10
- package/dist/hooks/useDrawAPI.svelte.js +143 -267
- package/dist/hooks/useFramelessComponents.svelte.js +1 -1
- package/dist/hooks/useFrames.svelte.d.ts +6 -2
- package/dist/hooks/useFrames.svelte.js +123 -19
- package/dist/hooks/useGeometries.svelte.d.ts +0 -2
- package/dist/hooks/useGeometries.svelte.js +49 -25
- package/dist/hooks/useObjectEvents.svelte.d.ts +3 -2
- package/dist/hooks/useObjectEvents.svelte.js +11 -7
- package/dist/hooks/usePartConfig.svelte.d.ts +1 -1
- package/dist/hooks/usePartConfig.svelte.js +2 -1
- package/dist/hooks/usePointclouds.svelte.d.ts +0 -2
- package/dist/hooks/usePointclouds.svelte.js +52 -21
- package/dist/hooks/usePose.svelte.js +15 -7
- package/dist/hooks/useResizable.svelte.d.ts +12 -0
- package/dist/hooks/useResizable.svelte.js +45 -0
- package/dist/hooks/useResourceByName.svelte.js +8 -5
- package/dist/hooks/useSelection.svelte.d.ts +13 -23
- package/dist/hooks/useSelection.svelte.js +45 -65
- package/dist/hooks/useVisibility.svelte.d.ts +2 -1
- package/dist/hooks/useWeblabs.svelte.d.ts +0 -1
- package/dist/hooks/useWeblabs.svelte.js +0 -1
- package/dist/hooks/useWorldState.svelte.d.ts +9 -0
- package/dist/hooks/useWorldState.svelte.js +158 -107
- package/dist/lib.d.ts +1 -0
- package/dist/lib.js +2 -0
- package/dist/three/BatchedArrow.d.ts +2 -3
- package/dist/three/BatchedArrow.js +3 -11
- package/dist/three/CapsuleGeometry.d.ts +1 -1
- package/dist/three/CapsuleGeometry.js +3 -1
- package/dist/transform.js +0 -15
- package/package.json +12 -7
- package/dist/components/WorldObject.svelte +0 -28
- package/dist/components/WorldObject.svelte.d.ts +0 -11
- package/dist/components/WorldObjects.svelte +0 -159
- package/dist/components/WorldState.svelte +0 -92
- package/dist/components/WorldState.svelte.d.ts +0 -7
- package/dist/components/__tests__/__fixtures__/worldObject.svelte.d.ts +0 -2
- package/dist/components/__tests__/__fixtures__/worldObject.svelte.js +0 -35
- package/dist/components/portal/Portal.svelte +0 -25
- package/dist/components/portal/Portal.svelte.d.ts +0 -8
- package/dist/components/portal/PortalTarget.svelte +0 -18
- package/dist/components/portal/PortalTarget.svelte.d.ts +0 -6
- package/dist/components/portal/index.d.ts +0 -2
- package/dist/components/portal/index.js +0 -2
- package/dist/components/portal/usePortalContext.svelte.d.ts +0 -5
- package/dist/components/portal/usePortalContext.svelte.js +0 -5
- package/dist/hooks/useArrows.svelte.d.ts +0 -3
- package/dist/hooks/useArrows.svelte.js +0 -9
- package/dist/hooks/useDraggable.svelte.d.ts +0 -10
- package/dist/hooks/useDraggable.svelte.js +0 -36
- package/dist/hooks/useObjects.svelte.d.ts +0 -7
- package/dist/hooks/useObjects.svelte.js +0 -35
- package/dist/hooks/usePersistentUUIDs.svelte.d.ts +0 -5
- package/dist/hooks/usePersistentUUIDs.svelte.js +0 -13
- package/dist/hooks/useResourceByName.svelte.d.ts +0 -7
- package/dist/hooks/useStaticGeometries.svelte.d.ts +0 -9
- package/dist/hooks/useStaticGeometries.svelte.js +0 -47
- package/dist/workers/worldStateWorker.d.ts +0 -1
- package/dist/workers/worldStateWorker.js +0 -114
- package/dist/world-state-messages.d.ts +0 -23
- package/dist/world-state-messages.js +0 -1
|
@@ -6,7 +6,9 @@ import { LatheGeometry, Path } from 'three';
|
|
|
6
6
|
*/
|
|
7
7
|
export class CapsuleGeometry extends LatheGeometry {
|
|
8
8
|
type = 'CapsuleGeometry';
|
|
9
|
-
constructor(
|
|
9
|
+
constructor(r = 1, l = 1, capSegments = 4, radialSegments = 8) {
|
|
10
|
+
const radius = Math.max(0.0001, r);
|
|
11
|
+
const length = Math.max(0.0001, l);
|
|
10
12
|
const path = new Path();
|
|
11
13
|
const midsectionLength = length - 2 * radius;
|
|
12
14
|
path.absarc(0, -midsectionLength / 2, radius, Math.PI * 1.5, 0);
|
package/dist/transform.js
CHANGED
|
@@ -83,21 +83,6 @@ export const poseToDirection = (pose) => {
|
|
|
83
83
|
ov.set(pose.oX, pose.oY, pose.oZ, MathUtils.degToRad(pose.theta));
|
|
84
84
|
return new Vector3(ov.x, ov.y, ov.z);
|
|
85
85
|
};
|
|
86
|
-
export const scaleToDimensions = (scale, geometry) => {
|
|
87
|
-
if (geometry.case === 'box') {
|
|
88
|
-
geometry.value.dimsMm ??= { x: 0, y: 0, z: 0 };
|
|
89
|
-
geometry.value.dimsMm.x *= scale.x;
|
|
90
|
-
geometry.value.dimsMm.y *= scale.y;
|
|
91
|
-
geometry.value.dimsMm.z *= scale.z;
|
|
92
|
-
}
|
|
93
|
-
else if (geometry.case === 'capsule') {
|
|
94
|
-
geometry.value.radiusMm *= scale.x;
|
|
95
|
-
geometry.value.lengthMm *= scale.y;
|
|
96
|
-
}
|
|
97
|
-
else if (geometry.case === 'sphere') {
|
|
98
|
-
geometry.value.radiusMm *= scale.x;
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
86
|
export const poseToMatrix = (pose) => {
|
|
102
87
|
ov.set(pose.oX, pose.oY, pose.oZ, MathUtils.degToRad(pose.theta));
|
|
103
88
|
ov.toQuaternion(quaternion);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@viamrobotics/motion-tools",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Motion visualization with Viam",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -24,14 +24,15 @@
|
|
|
24
24
|
"@tailwindcss/vite": "4.1.13",
|
|
25
25
|
"@testing-library/jest-dom": "6.8.0",
|
|
26
26
|
"@testing-library/svelte": "5.2.8",
|
|
27
|
+
"@testing-library/user-event": "^14.6.1",
|
|
27
28
|
"@thi.ng/paths": "5.2.21",
|
|
28
|
-
"@threlte/core": "8.
|
|
29
|
-
"@threlte/extras": "9.
|
|
30
|
-
"@threlte/rapier": "3.
|
|
29
|
+
"@threlte/core": "8.3.0",
|
|
30
|
+
"@threlte/extras": "9.7.0",
|
|
31
|
+
"@threlte/rapier": "3.2.0",
|
|
31
32
|
"@threlte/xr": "1.0.8",
|
|
32
33
|
"@types/bun": "1.2.21",
|
|
33
34
|
"@types/lodash-es": "4.17.12",
|
|
34
|
-
"@types/three": "0.
|
|
35
|
+
"@types/three": "0.181.0",
|
|
35
36
|
"@typescript-eslint/eslint-plugin": "8.42.0",
|
|
36
37
|
"@typescript-eslint/parser": "8.42.0",
|
|
37
38
|
"@viamrobotics/prime-core": "0.1.5",
|
|
@@ -48,6 +49,7 @@
|
|
|
48
49
|
"globals": "16.3.0",
|
|
49
50
|
"idb-keyval": "6.2.2",
|
|
50
51
|
"jsdom": "26.1.0",
|
|
52
|
+
"koota": "^0.5.3",
|
|
51
53
|
"lodash-es": "4.17.21",
|
|
52
54
|
"lucide-svelte": "0.542.0",
|
|
53
55
|
"prettier": "3.6.2",
|
|
@@ -55,11 +57,11 @@
|
|
|
55
57
|
"prettier-plugin-tailwindcss": "0.6.14",
|
|
56
58
|
"publint": "0.3.12",
|
|
57
59
|
"runed": "0.31.1",
|
|
58
|
-
"svelte": "5.
|
|
60
|
+
"svelte": "5.45.9",
|
|
59
61
|
"svelte-check": "4.3.1",
|
|
60
62
|
"svelte-virtuallists": "1.4.2",
|
|
61
63
|
"tailwindcss": "4.1.13",
|
|
62
|
-
"three": "0.
|
|
64
|
+
"three": "0.182.0",
|
|
63
65
|
"three-mesh-bvh": "^0.9.1",
|
|
64
66
|
"threlte-uikit": "1.2.1",
|
|
65
67
|
"tsx": "4.20.5",
|
|
@@ -117,6 +119,8 @@
|
|
|
117
119
|
"!dist/**/*.spec.*"
|
|
118
120
|
],
|
|
119
121
|
"dependencies": {
|
|
122
|
+
"@bufbuild/protobuf": "1.10.1",
|
|
123
|
+
"@neodrag/svelte": "^2.3.3",
|
|
120
124
|
"@tanstack/svelte-query-devtools": "^6.0.2",
|
|
121
125
|
"uuid-tool": "^2.0.3"
|
|
122
126
|
},
|
|
@@ -130,6 +134,7 @@
|
|
|
130
134
|
"lint": "prettier --check . && eslint .",
|
|
131
135
|
"test:unit": "vitest",
|
|
132
136
|
"test:client": "go test ./client/... -count=1",
|
|
137
|
+
"test:draw": "go test ./draw/... -count=1",
|
|
133
138
|
"test": "pnpm test:unit -- --run",
|
|
134
139
|
"test:coverage": "npx vitest run --coverage",
|
|
135
140
|
"test:e2e": "playwright test",
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { T, type Props as ThrelteProps } from '@threlte/core'
|
|
3
|
-
import type { Snippet } from 'svelte'
|
|
4
|
-
import type { Object3D } from 'three'
|
|
5
|
-
import type { WorldObject } from '../WorldObject.svelte'
|
|
6
|
-
import { useObjectEvents } from '../hooks/useObjectEvents.svelte'
|
|
7
|
-
|
|
8
|
-
interface Props extends ThrelteProps<Object3D> {
|
|
9
|
-
object: WorldObject
|
|
10
|
-
children?: Snippet
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
let { object, children, ...rest }: Props = $props()
|
|
14
|
-
|
|
15
|
-
const objectProps = useObjectEvents(() => object.uuid)
|
|
16
|
-
</script>
|
|
17
|
-
|
|
18
|
-
{#if object.metadata.gltf?.scene}
|
|
19
|
-
<T
|
|
20
|
-
is={object.metadata.gltf.scene}
|
|
21
|
-
uuid={object.uuid}
|
|
22
|
-
name={object.name}
|
|
23
|
-
{...objectProps}
|
|
24
|
-
{...rest}
|
|
25
|
-
>
|
|
26
|
-
{@render children?.()}
|
|
27
|
-
</T>
|
|
28
|
-
{/if}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { type Props as ThrelteProps } from '@threlte/core';
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
import type { Object3D } from 'three';
|
|
4
|
-
import type { WorldObject } from '../WorldObject.svelte';
|
|
5
|
-
interface Props extends ThrelteProps<Object3D> {
|
|
6
|
-
object: WorldObject;
|
|
7
|
-
children?: Snippet;
|
|
8
|
-
}
|
|
9
|
-
declare const WorldObject: import("svelte").Component<Props, {}, "">;
|
|
10
|
-
type WorldObject = ReturnType<typeof WorldObject>;
|
|
11
|
-
export default WorldObject;
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { T } from '@threlte/core'
|
|
3
|
-
import { Portal, PortalTarget } from './portal'
|
|
4
|
-
import { useFrames } from '../hooks/useFrames.svelte'
|
|
5
|
-
import { useGeometries } from '../hooks/useGeometries.svelte'
|
|
6
|
-
import { usePointClouds } from '../hooks/usePointclouds.svelte'
|
|
7
|
-
import { useDrawAPI } from '../hooks/useDrawAPI.svelte'
|
|
8
|
-
import { useWorldStates } from '../hooks/useWorldState.svelte'
|
|
9
|
-
import { useArrows } from '../hooks/useArrows.svelte'
|
|
10
|
-
import Pose from './Pose.svelte'
|
|
11
|
-
import Frame from './Frame.svelte'
|
|
12
|
-
import Line from './Line.svelte'
|
|
13
|
-
import Pointcloud from './Pointcloud.svelte'
|
|
14
|
-
import Model from './WorldObject.svelte'
|
|
15
|
-
import Label from './Label.svelte'
|
|
16
|
-
import WorldState from './WorldState.svelte'
|
|
17
|
-
import { determinePose } from '../WorldObject.svelte'
|
|
18
|
-
import { useWeblabs } from '../hooks/useWeblabs.svelte'
|
|
19
|
-
import type { WorldObject } from '../WorldObject.svelte'
|
|
20
|
-
import type { Pose as ViamPose } from '@viamrobotics/sdk'
|
|
21
|
-
import { WEBLABS_EXPERIMENTS } from '../hooks/useWeblabs.svelte'
|
|
22
|
-
const points = usePointClouds()
|
|
23
|
-
const drawAPI = useDrawAPI()
|
|
24
|
-
const frames = useFrames()
|
|
25
|
-
const geometries = useGeometries()
|
|
26
|
-
const worldStates = useWorldStates()
|
|
27
|
-
const batchedArrow = useArrows()
|
|
28
|
-
const weblabs = useWeblabs()
|
|
29
|
-
|
|
30
|
-
const weblabedDeterminePose = (object: WorldObject, pose: ViamPose | undefined) => {
|
|
31
|
-
if (weblabs.isActive(WEBLABS_EXPERIMENTS.MOTION_TOOLS_EDIT_FRAME)) {
|
|
32
|
-
return determinePose(object, pose)
|
|
33
|
-
}
|
|
34
|
-
return pose ?? object.pose
|
|
35
|
-
}
|
|
36
|
-
</script>
|
|
37
|
-
|
|
38
|
-
{#each frames.current as object (object.uuid)}
|
|
39
|
-
<Pose
|
|
40
|
-
name={object.name}
|
|
41
|
-
parent={object.referenceFrame}
|
|
42
|
-
>
|
|
43
|
-
{#snippet children({ pose })}
|
|
44
|
-
{@const framePose = weblabedDeterminePose(object, pose)}
|
|
45
|
-
<Portal id={object.referenceFrame}>
|
|
46
|
-
<Frame
|
|
47
|
-
uuid={object.uuid}
|
|
48
|
-
name={object.name}
|
|
49
|
-
pose={framePose}
|
|
50
|
-
geometry={object.geometry}
|
|
51
|
-
metadata={object.metadata}
|
|
52
|
-
>
|
|
53
|
-
<PortalTarget id={object.name} />
|
|
54
|
-
<Label text={object.name} />
|
|
55
|
-
</Frame>
|
|
56
|
-
</Portal>
|
|
57
|
-
{/snippet}
|
|
58
|
-
</Pose>
|
|
59
|
-
{/each}
|
|
60
|
-
|
|
61
|
-
{#each geometries.current as object (object.uuid)}
|
|
62
|
-
<Portal id={object.referenceFrame}>
|
|
63
|
-
<Frame
|
|
64
|
-
uuid={object.uuid}
|
|
65
|
-
name={object.name}
|
|
66
|
-
pose={object.pose}
|
|
67
|
-
geometry={object.geometry}
|
|
68
|
-
metadata={object.metadata}
|
|
69
|
-
>
|
|
70
|
-
<PortalTarget id={object.name} />
|
|
71
|
-
<Label text={object.name} />
|
|
72
|
-
</Frame>
|
|
73
|
-
</Portal>
|
|
74
|
-
{/each}
|
|
75
|
-
|
|
76
|
-
{#each worldStates.names as { name } (name)}
|
|
77
|
-
<WorldState worldObjects={worldStates.current[name].worldObjects} />
|
|
78
|
-
{/each}
|
|
79
|
-
|
|
80
|
-
{#each points.current as object (object.uuid)}
|
|
81
|
-
<Portal id={object.referenceFrame}>
|
|
82
|
-
<Pointcloud {object}>
|
|
83
|
-
<Label text={object.name} />
|
|
84
|
-
</Pointcloud>
|
|
85
|
-
</Portal>
|
|
86
|
-
{/each}
|
|
87
|
-
|
|
88
|
-
{#each drawAPI.frames as object (object.uuid)}
|
|
89
|
-
<Portal id={object.referenceFrame}>
|
|
90
|
-
<Frame
|
|
91
|
-
uuid={object.uuid}
|
|
92
|
-
name={object.name}
|
|
93
|
-
pose={object.pose}
|
|
94
|
-
geometry={object.geometry}
|
|
95
|
-
metadata={object.metadata}
|
|
96
|
-
>
|
|
97
|
-
<PortalTarget id={object.name} />
|
|
98
|
-
<Label text={object.name} />
|
|
99
|
-
</Frame>
|
|
100
|
-
</Portal>
|
|
101
|
-
{/each}
|
|
102
|
-
|
|
103
|
-
{#each drawAPI.points as object (object.uuid)}
|
|
104
|
-
<Portal id={object.referenceFrame}>
|
|
105
|
-
<Pointcloud {object}>
|
|
106
|
-
<Label text={object.name} />
|
|
107
|
-
</Pointcloud>
|
|
108
|
-
</Portal>
|
|
109
|
-
{/each}
|
|
110
|
-
|
|
111
|
-
<T
|
|
112
|
-
name={batchedArrow.object3d.name}
|
|
113
|
-
is={batchedArrow.object3d}
|
|
114
|
-
dispose={false}
|
|
115
|
-
bvh={{ enabled: false }}
|
|
116
|
-
/>
|
|
117
|
-
|
|
118
|
-
{#each drawAPI.meshes as object (object.uuid)}
|
|
119
|
-
<Portal id={object.referenceFrame}>
|
|
120
|
-
<Frame
|
|
121
|
-
uuid={object.uuid}
|
|
122
|
-
name={object.name}
|
|
123
|
-
pose={object.pose}
|
|
124
|
-
geometry={object.geometry}
|
|
125
|
-
metadata={object.metadata}
|
|
126
|
-
>
|
|
127
|
-
<PortalTarget id={object.name} />
|
|
128
|
-
<Label text={object.name} />
|
|
129
|
-
</Frame>
|
|
130
|
-
</Portal>
|
|
131
|
-
{/each}
|
|
132
|
-
|
|
133
|
-
{#each drawAPI.nurbs as object (object.uuid)}
|
|
134
|
-
<Portal id={object.referenceFrame}>
|
|
135
|
-
<Frame
|
|
136
|
-
uuid={object.uuid}
|
|
137
|
-
name={object.name}
|
|
138
|
-
pose={object.pose}
|
|
139
|
-
geometry={object.geometry}
|
|
140
|
-
metadata={object.metadata}
|
|
141
|
-
>
|
|
142
|
-
<PortalTarget id={object.name} />
|
|
143
|
-
<Label text={object.name} />
|
|
144
|
-
</Frame>
|
|
145
|
-
</Portal>
|
|
146
|
-
{/each}
|
|
147
|
-
|
|
148
|
-
{#each drawAPI.models as object (object.uuid)}
|
|
149
|
-
<Model {object}>
|
|
150
|
-
<PortalTarget id={object.name} />
|
|
151
|
-
<Label text={object.name} />
|
|
152
|
-
</Model>
|
|
153
|
-
{/each}
|
|
154
|
-
|
|
155
|
-
{#each drawAPI.lines as object (object.uuid)}
|
|
156
|
-
<Line {object}>
|
|
157
|
-
<Label text={object.name} />
|
|
158
|
-
</Line>
|
|
159
|
-
{/each}
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { Color, Vector3 } from 'three'
|
|
3
|
-
|
|
4
|
-
import Frame from './Frame.svelte'
|
|
5
|
-
import Label from './Label.svelte'
|
|
6
|
-
import Portal from './portal/Portal.svelte'
|
|
7
|
-
import PortalTarget from './portal/PortalTarget.svelte'
|
|
8
|
-
import { WorldObject } from '../WorldObject.svelte'
|
|
9
|
-
import { poseToDirection } from '../transform'
|
|
10
|
-
import { BatchedArrow } from '../three/BatchedArrow'
|
|
11
|
-
import { T } from '@threlte/core'
|
|
12
|
-
|
|
13
|
-
interface Props {
|
|
14
|
-
worldObjects: WorldObject[]
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
let { worldObjects }: Props = $props()
|
|
18
|
-
|
|
19
|
-
const currentArrows: Record<string, { id: number; arrow: WorldObject }> = {}
|
|
20
|
-
const arrowBatches = $state<Record<string, BatchedArrow>>({})
|
|
21
|
-
|
|
22
|
-
const arrows = $derived(worldObjects.filter((object) => object.metadata?.shape === 'arrow'))
|
|
23
|
-
const objects = $derived(worldObjects.filter((object) => object.metadata?.shape !== 'arrow'))
|
|
24
|
-
|
|
25
|
-
const getArrows = () => ({ ...currentArrows })
|
|
26
|
-
const getArrow = (referenceFrame: string, uuid: string) =>
|
|
27
|
-
currentArrows[`${referenceFrame}:${uuid}`]
|
|
28
|
-
|
|
29
|
-
const removeArrow = (referenceFrame: string, uuid: string) => {
|
|
30
|
-
delete currentArrows[`${referenceFrame}:${uuid}`]
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const setArrow = (arrow: WorldObject) => {
|
|
34
|
-
const referenceFrame = arrow.referenceFrame ?? 'world'
|
|
35
|
-
const currentArrow = getArrow(referenceFrame, arrow.uuid)
|
|
36
|
-
const color = arrow.metadata?.color ?? new Color('yellow')
|
|
37
|
-
const direction = poseToDirection(arrow.pose)
|
|
38
|
-
const position = new Vector3(arrow.pose.x, arrow.pose.y, arrow.pose.z)
|
|
39
|
-
|
|
40
|
-
arrowBatches[referenceFrame] ??= new BatchedArrow()
|
|
41
|
-
const batchedArrow = arrowBatches[referenceFrame]
|
|
42
|
-
|
|
43
|
-
if (currentArrow) {
|
|
44
|
-
batchedArrow.updateArrow(currentArrow.id, direction, position, 0.1, color, true)
|
|
45
|
-
currentArrows[`${referenceFrame}:${arrow.uuid}`] = { id: currentArrow.id, arrow }
|
|
46
|
-
} else {
|
|
47
|
-
const id = batchedArrow.addArrow(direction, position, 0.1, color, true)
|
|
48
|
-
currentArrows[`${referenceFrame}:${arrow.uuid}`] = { id, arrow }
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
$effect(() => {
|
|
53
|
-
const toRemove = getArrows()
|
|
54
|
-
arrows.forEach((arrow) => {
|
|
55
|
-
setArrow(arrow)
|
|
56
|
-
const referenceFrame = arrow.referenceFrame ?? 'world'
|
|
57
|
-
delete toRemove[`${referenceFrame}:${arrow.uuid}`]
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
Object.values(toRemove).forEach(({ id, arrow }) => {
|
|
61
|
-
const referenceFrame = arrow.referenceFrame ?? 'world'
|
|
62
|
-
arrowBatches[referenceFrame].removeArrow(id)
|
|
63
|
-
removeArrow(referenceFrame, arrow.uuid)
|
|
64
|
-
})
|
|
65
|
-
})
|
|
66
|
-
</script>
|
|
67
|
-
|
|
68
|
-
{#each Object.entries(arrowBatches) as [referenceFrame, batch] (referenceFrame)}
|
|
69
|
-
<Portal id={referenceFrame}>
|
|
70
|
-
<T
|
|
71
|
-
name={batch.object3d.name}
|
|
72
|
-
is={batch.object3d}
|
|
73
|
-
dispose={false}
|
|
74
|
-
bvh={{ enabled: false }}
|
|
75
|
-
/>
|
|
76
|
-
</Portal>
|
|
77
|
-
{/each}
|
|
78
|
-
|
|
79
|
-
{#each objects as object (object.uuid)}
|
|
80
|
-
<Portal id={object.referenceFrame}>
|
|
81
|
-
<Frame
|
|
82
|
-
uuid={object.uuid}
|
|
83
|
-
name={object.name}
|
|
84
|
-
pose={object.pose}
|
|
85
|
-
geometry={object.geometry}
|
|
86
|
-
metadata={object.metadata}
|
|
87
|
-
>
|
|
88
|
-
<PortalTarget id={object.name} />
|
|
89
|
-
<Label text={object.name} />
|
|
90
|
-
</Frame>
|
|
91
|
-
</Portal>
|
|
92
|
-
{/each}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { WorldObject } from '../../../WorldObject.svelte';
|
|
2
|
-
export const createWorldObjectFixture = () => {
|
|
3
|
-
const object = new WorldObject();
|
|
4
|
-
object.name = 'Test Object';
|
|
5
|
-
object.uuid = '1234-5678';
|
|
6
|
-
object.referenceFrame = 'parent_frame';
|
|
7
|
-
object.pose = {
|
|
8
|
-
x: 10,
|
|
9
|
-
y: 20,
|
|
10
|
-
z: 30,
|
|
11
|
-
oX: 0.1,
|
|
12
|
-
oY: 0.2,
|
|
13
|
-
oZ: 0.3,
|
|
14
|
-
theta: 0.4,
|
|
15
|
-
};
|
|
16
|
-
object.geometry = {
|
|
17
|
-
label: 'my geometry',
|
|
18
|
-
geometryType: {
|
|
19
|
-
case: 'box',
|
|
20
|
-
value: {
|
|
21
|
-
dimsMm: { x: 10, y: 20, z: 30 },
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
};
|
|
25
|
-
object.localEditedPose = {
|
|
26
|
-
x: 10,
|
|
27
|
-
y: 20,
|
|
28
|
-
z: 30,
|
|
29
|
-
oX: 0.1,
|
|
30
|
-
oY: 0.2,
|
|
31
|
-
oZ: 0.3,
|
|
32
|
-
theta: 0.4,
|
|
33
|
-
};
|
|
34
|
-
return object;
|
|
35
|
-
};
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte'
|
|
3
|
-
import { usePortalContext } from './usePortalContext.svelte'
|
|
4
|
-
import { SvelteSet } from 'svelte/reactivity'
|
|
5
|
-
|
|
6
|
-
interface Props {
|
|
7
|
-
id?: string
|
|
8
|
-
children?: Snippet
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
let { id = 'default', children }: Props = $props()
|
|
12
|
-
|
|
13
|
-
const portals = usePortalContext()
|
|
14
|
-
|
|
15
|
-
$effect.pre(() => {
|
|
16
|
-
if (!children) return
|
|
17
|
-
|
|
18
|
-
if (!portals.has(id)) {
|
|
19
|
-
portals.set(id, new SvelteSet())
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
portals.get(id)?.add(children)
|
|
23
|
-
return () => portals.get(id)?.delete(children)
|
|
24
|
-
})
|
|
25
|
-
</script>
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { usePortalContext } from './usePortalContext.svelte'
|
|
3
|
-
|
|
4
|
-
interface Props {
|
|
5
|
-
id?: string
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
let { id = 'default' }: Props = $props()
|
|
9
|
-
|
|
10
|
-
const portals = usePortalContext()
|
|
11
|
-
const childrenArray = $derived(portals.get(id))
|
|
12
|
-
</script>
|
|
13
|
-
|
|
14
|
-
{#if childrenArray !== undefined}
|
|
15
|
-
{#each childrenArray as children (children)}
|
|
16
|
-
{@render children()}
|
|
17
|
-
{/each}
|
|
18
|
-
{/if}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { BatchedArrow } from '../lib';
|
|
2
|
-
import { getContext, setContext } from 'svelte';
|
|
3
|
-
const key = Symbol('arrow-context');
|
|
4
|
-
export const provideArrows = () => {
|
|
5
|
-
setContext(key, new BatchedArrow());
|
|
6
|
-
};
|
|
7
|
-
export const useArrows = () => {
|
|
8
|
-
return getContext(key);
|
|
9
|
-
};
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { get, set } from 'idb-keyval';
|
|
2
|
-
export const useDraggable = (name) => {
|
|
3
|
-
const down = { x: 0, y: 0 };
|
|
4
|
-
const last = { x: 0, y: 0 };
|
|
5
|
-
let translate = $state({ x: 0, y: 0 });
|
|
6
|
-
const onDragMove = (event) => {
|
|
7
|
-
translate.x = event.clientX - down.x + last.x;
|
|
8
|
-
translate.y = event.clientY - down.y + last.y;
|
|
9
|
-
};
|
|
10
|
-
const onDragStart = (event) => {
|
|
11
|
-
down.x = event.clientX;
|
|
12
|
-
down.y = event.clientY;
|
|
13
|
-
last.x = translate.x;
|
|
14
|
-
last.y = translate.y;
|
|
15
|
-
window.addEventListener('pointermove', onDragMove, { passive: true });
|
|
16
|
-
};
|
|
17
|
-
const onDragEnd = () => {
|
|
18
|
-
set(`${name}-draggable`, $state.snapshot(translate));
|
|
19
|
-
window.removeEventListener('pointermove', onDragMove);
|
|
20
|
-
};
|
|
21
|
-
get(`${name}-draggable`).then((response) => {
|
|
22
|
-
if (response) {
|
|
23
|
-
translate = response;
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
$effect(() => {
|
|
27
|
-
return () => window.removeEventListener('pointermove', onDragMove);
|
|
28
|
-
});
|
|
29
|
-
return {
|
|
30
|
-
onDragStart,
|
|
31
|
-
onDragEnd,
|
|
32
|
-
get current() {
|
|
33
|
-
return translate;
|
|
34
|
-
},
|
|
35
|
-
};
|
|
36
|
-
};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { getContext, setContext } from 'svelte';
|
|
2
|
-
import { useFrames } from './useFrames.svelte';
|
|
3
|
-
import { useGeometries } from './useGeometries.svelte';
|
|
4
|
-
import { useStaticGeometries } from './useStaticGeometries.svelte';
|
|
5
|
-
import { useDrawAPI } from './useDrawAPI.svelte';
|
|
6
|
-
import { usePointClouds } from './usePointclouds.svelte';
|
|
7
|
-
const key = Symbol('objects-context');
|
|
8
|
-
export const provideObjects = () => {
|
|
9
|
-
const frames = useFrames();
|
|
10
|
-
const geometries = useGeometries();
|
|
11
|
-
const statics = useStaticGeometries();
|
|
12
|
-
const drawAPI = useDrawAPI();
|
|
13
|
-
const points = usePointClouds();
|
|
14
|
-
const objects = $derived([
|
|
15
|
-
...frames.current,
|
|
16
|
-
...geometries.current,
|
|
17
|
-
...points.current,
|
|
18
|
-
...statics.current,
|
|
19
|
-
...drawAPI.frames,
|
|
20
|
-
...drawAPI.meshes,
|
|
21
|
-
...drawAPI.models,
|
|
22
|
-
...drawAPI.nurbs,
|
|
23
|
-
...drawAPI.points,
|
|
24
|
-
...drawAPI.lines,
|
|
25
|
-
...drawAPI.poses,
|
|
26
|
-
]);
|
|
27
|
-
setContext(key, {
|
|
28
|
-
get current() {
|
|
29
|
-
return objects;
|
|
30
|
-
},
|
|
31
|
-
});
|
|
32
|
-
};
|
|
33
|
-
export const useObjects = () => {
|
|
34
|
-
return getContext(key);
|
|
35
|
-
};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export const usePersistentUUIDs = () => {
|
|
2
|
-
const uuids = new Map();
|
|
3
|
-
const updateUUIDs = (objects) => {
|
|
4
|
-
for (const object of objects) {
|
|
5
|
-
const ref = `${object.referenceFrame}-${object.name}`;
|
|
6
|
-
if (uuids.has(ref) === false) {
|
|
7
|
-
uuids.set(ref, object.uuid);
|
|
8
|
-
}
|
|
9
|
-
object.uuid = uuids.get(ref) ?? object.uuid;
|
|
10
|
-
}
|
|
11
|
-
};
|
|
12
|
-
return { uuids, updateUUIDs };
|
|
13
|
-
};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { ResourceName } from '@viamrobotics/sdk';
|
|
2
|
-
interface Context {
|
|
3
|
-
current: Record<string, ResourceName | undefined>;
|
|
4
|
-
}
|
|
5
|
-
export declare const provideResourceByName: (partID: () => string) => void;
|
|
6
|
-
export declare const useResourceByName: () => Context;
|
|
7
|
-
export {};
|