@wandelbots/wandelbots-js-react-components 1.11.2 → 1.11.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"SafetyZonesRenderer.d.ts","sourceRoot":"","sources":["../../../../src/components/3d-viewport/SafetyZonesRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAItE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,EAAE,qBAAqB,EAAE,CAAA;CACrC,GAAG,UAAU,CAAA;AAEd,wBAAgB,mBAAmB,CAAC,EAClC,WAAW,EACX,GAAG,KAAK,EACT,EAAE,wBAAwB,2CA+C1B"}
1
+ {"version":3,"file":"SafetyZonesRenderer.d.ts","sourceRoot":"","sources":["../../../../src/components/3d-viewport/SafetyZonesRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAItE,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,EAAE,qBAAqB,EAAE,CAAA;CACrC,GAAG,UAAU,CAAA;AAqCd,wBAAgB,mBAAmB,CAAC,EAClC,WAAW,EACX,GAAG,KAAK,EACT,EAAE,wBAAwB,2CA+D1B"}
@@ -0,0 +1,147 @@
1
+ import { Euler, Vector3, WebGLRenderer } from "three";
2
+ import { SafetyZonesRenderer } from "../src";
3
+ import type { SafetySetupSafetyZone } from "@wandelbots/wandelbots-js";
4
+ declare const _default: {
5
+ tags: string[];
6
+ title: string;
7
+ component: typeof SafetyZonesRenderer;
8
+ decorators: ((Story: import("@storybook/csf").PartialStoryFn<import("@storybook/react").ReactRenderer, {
9
+ safetyZones: SafetySetupSafetyZone[];
10
+ ref?: import("react").Ref<import("three").Group<import("three").Object3DEventMap>> | undefined;
11
+ children?: React.ReactNode;
12
+ attach?: import("@react-three/fiber/dist/declarations/src/core/renderer").AttachType | undefined;
13
+ args?: [] | undefined;
14
+ key?: React.Key | undefined;
15
+ onUpdate?: ((self: import("three").Group<import("three").Object3DEventMap>) => void) | undefined;
16
+ readonly type?: string | undefined;
17
+ toJSON?: ((meta?: import("three").JSONMeta) => import("three").Object3DJSON) | undefined;
18
+ readonly isObject3D?: true | undefined;
19
+ readonly id?: number | undefined;
20
+ uuid?: string | undefined;
21
+ name?: string | undefined;
22
+ parent?: import("three").Object3D<import("three").Object3DEventMap> | null | undefined;
23
+ readonly modelViewMatrix?: import("three").Matrix4 | undefined;
24
+ readonly normalMatrix?: import("three").Matrix3 | undefined;
25
+ matrixWorld?: import("three").Matrix4 | undefined;
26
+ matrixAutoUpdate?: boolean | undefined;
27
+ matrixWorldAutoUpdate?: boolean | undefined;
28
+ matrixWorldNeedsUpdate?: boolean | undefined;
29
+ visible?: boolean | undefined;
30
+ castShadow?: boolean | undefined;
31
+ receiveShadow?: boolean | undefined;
32
+ frustumCulled?: boolean | undefined;
33
+ renderOrder?: number | undefined;
34
+ animations?: import("three").AnimationClip[] | undefined;
35
+ userData?: Record<string, any> | undefined;
36
+ customDepthMaterial?: import("three").Material | undefined;
37
+ customDistanceMaterial?: import("three").Material | undefined;
38
+ onBeforeShadow?: ((renderer: WebGLRenderer, scene: import("three").Scene, shadowCamera: import("three").Camera, geometry: import("three").BufferGeometry, depthMaterial: import("three").Material, group: import("three").Group) => void) | undefined;
39
+ onAfterShadow?: ((renderer: WebGLRenderer, scene: import("three").Scene, shadowCamera: import("three").Camera, geometry: import("three").BufferGeometry, depthMaterial: import("three").Material, group: import("three").Group) => void) | undefined;
40
+ onBeforeRender?: ((renderer: WebGLRenderer, scene: import("three").Scene, camera: import("three").Camera, geometry: import("three").BufferGeometry, material: import("three").Material, group: import("three").Group) => void) | undefined;
41
+ onAfterRender?: ((renderer: WebGLRenderer, scene: import("three").Scene, camera: import("three").Camera, geometry: import("three").BufferGeometry, material: import("three").Material, group: import("three").Group) => void) | undefined;
42
+ applyMatrix4?: ((matrix: import("three").Matrix4) => void) | undefined;
43
+ applyQuaternion?: ((quaternion: import("three").Quaternion) => import("three").Group<import("three").Object3DEventMap>) | undefined;
44
+ setRotationFromAxisAngle?: ((axis: Vector3, angle: number) => void) | undefined;
45
+ setRotationFromEuler?: ((euler: Euler) => void) | undefined;
46
+ setRotationFromMatrix?: ((m: import("three").Matrix4) => void) | undefined;
47
+ setRotationFromQuaternion?: ((q: import("three").Quaternion) => void) | undefined;
48
+ rotateOnAxis?: ((axis: Vector3, angle: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
49
+ rotateOnWorldAxis?: ((axis: Vector3, angle: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
50
+ rotateX?: ((angle: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
51
+ rotateY?: ((angle: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
52
+ rotateZ?: ((angle: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
53
+ translateOnAxis?: ((axis: Vector3, distance: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
54
+ translateX?: ((distance: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
55
+ translateY?: ((distance: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
56
+ translateZ?: ((distance: number) => import("three").Group<import("three").Object3DEventMap>) | undefined;
57
+ localToWorld?: ((vector: Vector3) => Vector3) | undefined;
58
+ worldToLocal?: ((vector: Vector3) => Vector3) | undefined;
59
+ lookAt?: {
60
+ (vector: Vector3): void;
61
+ (x: number, y: number, z: number): void;
62
+ } | undefined;
63
+ add?: ((...object: import("three").Object3D[]) => import("three").Group<import("three").Object3DEventMap>) | undefined;
64
+ remove?: ((...object: import("three").Object3D[]) => import("three").Group<import("three").Object3DEventMap>) | undefined;
65
+ removeFromParent?: (() => import("three").Group<import("three").Object3DEventMap>) | undefined;
66
+ clear?: (() => import("three").Group<import("three").Object3DEventMap>) | undefined;
67
+ getObjectById?: ((id: number) => import("three").Object3D | undefined) | undefined;
68
+ getObjectByName?: ((name: string) => import("three").Object3D | undefined) | undefined;
69
+ getObjectByProperty?: ((name: string, value: any) => import("three").Object3D | undefined) | undefined;
70
+ getObjectsByProperty?: ((name: string, value: any, optionalTarget?: import("three").Object3D[]) => import("three").Object3D[]) | undefined;
71
+ getWorldPosition?: ((target: Vector3) => Vector3) | undefined;
72
+ getWorldQuaternion?: ((target: import("three").Quaternion) => import("three").Quaternion) | undefined;
73
+ getWorldScale?: ((target: Vector3) => Vector3) | undefined;
74
+ getWorldDirection?: ((target: Vector3) => Vector3) | undefined;
75
+ raycast?: ((raycaster: import("three").Raycaster, intersects: import("three").Intersection[]) => void) | undefined;
76
+ traverse?: ((callback: (object: import("three").Object3D) => any) => void) | undefined;
77
+ traverseVisible?: ((callback: (object: import("three").Object3D) => any) => void) | undefined;
78
+ traverseAncestors?: ((callback: (object: import("three").Object3D) => any) => void) | undefined;
79
+ updateMatrix?: (() => void) | undefined;
80
+ updateMatrixWorld?: ((force?: boolean) => void) | undefined;
81
+ updateWorldMatrix?: ((updateParents: boolean, updateChildren: boolean) => void) | undefined;
82
+ clone?: ((recursive?: boolean) => import("three").Group<import("three").Object3DEventMap>) | undefined;
83
+ copy?: ((object: import("three").Object3D, recursive?: boolean) => import("three").Group<import("three").Object3DEventMap>) | undefined;
84
+ addEventListener?: {
85
+ <T extends keyof import("three").Object3DEventMap>(type: T, listener: import("three").EventListener<import("three").Object3DEventMap[T], T, import("three").Group<import("three").Object3DEventMap>>): void;
86
+ <T extends string>(type: T, listener: import("three").EventListener<{}, T, import("three").Group<import("three").Object3DEventMap>>): void;
87
+ } | undefined;
88
+ hasEventListener?: {
89
+ <T extends keyof import("three").Object3DEventMap>(type: T, listener: import("three").EventListener<import("three").Object3DEventMap[T], T, import("three").Group<import("three").Object3DEventMap>>): boolean;
90
+ <T extends string>(type: T, listener: import("three").EventListener<{}, T, import("three").Group<import("three").Object3DEventMap>>): boolean;
91
+ } | undefined;
92
+ removeEventListener?: {
93
+ <T extends keyof import("three").Object3DEventMap>(type: T, listener: import("three").EventListener<import("three").Object3DEventMap[T], T, import("three").Group<import("three").Object3DEventMap>>): void;
94
+ <T extends string>(type: T, listener: import("three").EventListener<{}, T, import("three").Group<import("three").Object3DEventMap>>): void;
95
+ } | undefined;
96
+ dispatchEvent?: (<T extends keyof import("three").Object3DEventMap>(event: import("three").BaseEvent<T> & import("three").Object3DEventMap[T]) => void) | undefined;
97
+ readonly isGroup?: true | undefined;
98
+ position?: import("@react-three/fiber").Vector3 | undefined;
99
+ up?: import("@react-three/fiber").Vector3 | undefined;
100
+ scale?: import("@react-three/fiber").Vector3 | undefined;
101
+ rotation?: import("@react-three/fiber").Euler | undefined;
102
+ matrix?: import("@react-three/fiber").Matrix4 | undefined;
103
+ quaternion?: import("@react-three/fiber").Quaternion | undefined;
104
+ layers?: import("@react-three/fiber").Layers | undefined;
105
+ dispose?: ((() => void) | null) | undefined;
106
+ onClick?: ((event: import("@react-three/fiber").ThreeEvent<MouseEvent>) => void) | undefined;
107
+ onContextMenu?: ((event: import("@react-three/fiber").ThreeEvent<MouseEvent>) => void) | undefined;
108
+ onDoubleClick?: ((event: import("@react-three/fiber").ThreeEvent<MouseEvent>) => void) | undefined;
109
+ onPointerUp?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
110
+ onPointerDown?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
111
+ onPointerOver?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
112
+ onPointerOut?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
113
+ onPointerEnter?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
114
+ onPointerLeave?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
115
+ onPointerMove?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
116
+ onPointerMissed?: ((event: MouseEvent) => void) | undefined;
117
+ onPointerCancel?: ((event: import("@react-three/fiber").ThreeEvent<PointerEvent>) => void) | undefined;
118
+ onWheel?: ((event: import("@react-three/fiber").ThreeEvent<WheelEvent>) => void) | undefined;
119
+ }>) => import("react/jsx-runtime").JSX.Element)[];
120
+ };
121
+ export default _default;
122
+ export declare const SafetyZonesRendererSt: {
123
+ args: {};
124
+ render: (args: {
125
+ safetyZones: SafetySetupSafetyZone[];
126
+ } & Omit<import("@react-three/fiber").ExtendedColors<import("@react-three/fiber").Overwrite<Partial<import("three").Group<import("three").Object3DEventMap>>, import("@react-three/fiber").NodeProps<import("three").Group<import("three").Object3DEventMap>, typeof import("three").Group>>>, import("@react-three/fiber").NonFunctionKeys<{
127
+ position?: import("@react-three/fiber").Vector3;
128
+ up?: import("@react-three/fiber").Vector3;
129
+ scale?: import("@react-three/fiber").Vector3;
130
+ rotation?: import("@react-three/fiber").Euler;
131
+ matrix?: import("@react-three/fiber").Matrix4;
132
+ quaternion?: import("@react-three/fiber").Quaternion;
133
+ layers?: import("@react-three/fiber").Layers;
134
+ dispose?: (() => void) | null;
135
+ }>> & {
136
+ position?: import("@react-three/fiber").Vector3;
137
+ up?: import("@react-three/fiber").Vector3;
138
+ scale?: import("@react-three/fiber").Vector3;
139
+ rotation?: import("@react-three/fiber").Euler;
140
+ matrix?: import("@react-three/fiber").Matrix4;
141
+ quaternion?: import("@react-three/fiber").Quaternion;
142
+ layers?: import("@react-three/fiber").Layers;
143
+ dispose?: (() => void) | null;
144
+ } & import("@react-three/fiber/dist/declarations/src/core/events").EventHandlers) => import("react/jsx-runtime").JSX.Element;
145
+ name: string;
146
+ };
147
+ //# sourceMappingURL=SafetyZonesRenderer.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SafetyZonesRenderer.stories.d.ts","sourceRoot":"","sources":["../../stories/SafetyZonesRenderer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAA;AAC5C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;;;;;;;;mBAuEtD,MAAA,SAAI;;;cAEF,MAAA,GAAR;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAtEV,wBAuB4C;AA0c5C,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;CAIjB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wandelbots/wandelbots-js-react-components",
3
- "version": "1.11.2",
3
+ "version": "1.11.3",
4
4
  "description": "React UI toolkit for building applications on top of the Wandelbots platform",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -8,6 +8,41 @@ export type SafetyZonesRendererProps = {
8
8
  safetyZones: SafetySetupSafetyZone[]
9
9
  } & GroupProps
10
10
 
11
+ interface CoplanarityResult {
12
+ isCoplanar: boolean
13
+ normal?: THREE.Vector3
14
+ }
15
+
16
+ function areVerticesCoplanar(vertices: THREE.Vector3[]): CoplanarityResult {
17
+ if (vertices.length < 3) {
18
+ console.log("Not enough vertices to define a plane")
19
+ return { isCoplanar: false }
20
+ }
21
+
22
+ // Convert Vector3d to THREE.Vector3
23
+ const v0 = new THREE.Vector3(vertices[0].x, vertices[0].y, vertices[0].z)
24
+ const v1 = new THREE.Vector3(vertices[1].x, vertices[1].y, vertices[1].z)
25
+ const v2 = new THREE.Vector3(vertices[2].x, vertices[2].y, vertices[2].z)
26
+
27
+ const vector1 = new THREE.Vector3().subVectors(v1, v0)
28
+ const vector2 = new THREE.Vector3().subVectors(v2, v0)
29
+ const normal = new THREE.Vector3().crossVectors(vector1, vector2).normalize()
30
+
31
+ // Check if all remaining vertices lie on the same plane
32
+ for (let i = 3; i < vertices.length; i++) {
33
+ const vi = new THREE.Vector3(vertices[i].x, vertices[i].y, vertices[i].z)
34
+ const vector = new THREE.Vector3().subVectors(vi, v0)
35
+ const dotProduct = normal.dot(vector)
36
+ if (Math.abs(dotProduct) > 1e-6) {
37
+ // Allowing a small tolerance
38
+ console.log("Vertices are not on the same plane")
39
+ return { isCoplanar: false }
40
+ }
41
+ }
42
+
43
+ return { isCoplanar: true, normal }
44
+ }
45
+
11
46
  export function SafetyZonesRenderer({
12
47
  safetyZones,
13
48
  ...props
@@ -30,6 +65,22 @@ export function SafetyZonesRenderer({
30
65
  const vertices = geometry.convex_hull.vertices.map(
31
66
  (v) => new THREE.Vector3(v.x / 1000, v.y / 1000, v.z / 1000),
32
67
  )
68
+
69
+ // Check if the vertices are on the same plane and only define a plane
70
+ // Algorithm has troubles with vertices that are on the same plane so we
71
+ // add a new vertex slightly moved along the normal direction
72
+ const coplanarityResult = areVerticesCoplanar(vertices)
73
+
74
+ if (coplanarityResult.isCoplanar && coplanarityResult.normal) {
75
+ // Add a new vertex slightly moved along the normal direction
76
+ const offset = 0.0001 // Adjust the offset as needed
77
+ const newVertex = new THREE.Vector3().addVectors(
78
+ vertices[0],
79
+ coplanarityResult.normal.multiplyScalar(offset),
80
+ )
81
+ vertices.push(newVertex)
82
+ }
83
+
33
84
  let convexGeometry
34
85
  try {
35
86
  convexGeometry = new ConvexGeometry(vertices)