@wandelbots/wandelbots-js-react-components 1.3.1 → 1.3.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.
Files changed (77) hide show
  1. package/package.json +18 -7
  2. package/src/components/3d-viewport/CoordinateSystemTransform.tsx +44 -0
  3. package/src/components/3d-viewport/PresetEnvironment.tsx +78 -0
  4. package/src/components/3d-viewport/SafetyZonesRenderer.tsx +54 -0
  5. package/src/components/LoadingButton.stories.tsx +61 -0
  6. package/src/components/LoadingButton.tsx +19 -0
  7. package/src/components/LoadingCover.tsx +75 -0
  8. package/src/components/ThemeSelect.tsx +49 -0
  9. package/src/components/VelocitySlider.stories.tsx +32 -0
  10. package/src/components/VelocitySlider.tsx +52 -0
  11. package/src/components/jogging/JoggingCartesianAxisControl.stories.tsx +41 -0
  12. package/src/components/jogging/JoggingCartesianAxisControl.tsx +127 -0
  13. package/src/components/jogging/JoggingCartesianTab.tsx +265 -0
  14. package/src/components/jogging/JoggingCartesianValues.tsx +45 -0
  15. package/src/components/jogging/JoggingFreedriveTab.tsx +9 -0
  16. package/src/components/jogging/JoggingJointLimitDetector.tsx +51 -0
  17. package/src/components/jogging/JoggingJointRotationControl.stories.tsx +38 -0
  18. package/src/components/jogging/JoggingJointRotationControl.tsx +197 -0
  19. package/src/components/jogging/JoggingJointTab.tsx +93 -0
  20. package/src/components/jogging/JoggingJointValues.tsx +45 -0
  21. package/src/components/jogging/JoggingOptions.tsx +96 -0
  22. package/src/components/jogging/JoggingPanel.stories.tsx +26 -0
  23. package/src/components/jogging/JoggingPanel.tsx +148 -0
  24. package/src/components/jogging/JoggingStore.tsx +294 -0
  25. package/src/components/jogging/JoggingVelocitySlider.tsx +56 -0
  26. package/src/components/robots/ABB_1200_07_7.tsx +123 -0
  27. package/src/components/robots/AxisConfig.ts +3 -0
  28. package/src/components/robots/DHRobot.tsx +129 -0
  29. package/src/components/robots/FANUC_ARC_Mate_100iD.tsx +187 -0
  30. package/src/components/robots/FANUC_ARC_Mate_120iD.tsx +187 -0
  31. package/src/components/robots/FANUC_CRX10iA.tsx +167 -0
  32. package/src/components/robots/FANUC_CRX25iA.tsx +167 -0
  33. package/src/components/robots/FANUC_CRX25iAL.tsx +178 -0
  34. package/src/components/robots/KUKA_KR210_R2700.tsx +291 -0
  35. package/src/components/robots/KUKA_KR270_R2700.tsx +244 -0
  36. package/src/components/robots/RobotAnimator.tsx +83 -0
  37. package/src/components/robots/SupportedRobot.tsx +131 -0
  38. package/src/components/robots/UniversalRobots_UR10.tsx +112 -0
  39. package/src/components/robots/UniversalRobots_UR10e.tsx +275 -0
  40. package/src/components/robots/UniversalRobots_UR3.tsx +112 -0
  41. package/src/components/robots/UniversalRobots_UR3e.tsx +112 -0
  42. package/src/components/robots/UniversalRobots_UR5.tsx +111 -0
  43. package/src/components/robots/UniversalRobots_UR5e.tsx +280 -0
  44. package/src/components/robots/Yaskawa_AR1440.tsx +152 -0
  45. package/src/components/robots/Yaskawa_AR1730.tsx +165 -0
  46. package/src/components/robots/Yaskawa_AR2010.tsx +159 -0
  47. package/src/components/robots/Yaskawa_AR3120.tsx +160 -0
  48. package/src/components/robots/Yaskawa_AR900.tsx +121 -0
  49. package/src/components/utils/converters.ts +23 -0
  50. package/src/components/utils/errorHandling.ts +30 -0
  51. package/src/components/utils/hooks.tsx +54 -0
  52. package/src/components/utils/robotTreeQuery.ts +27 -0
  53. package/src/components/wandelscript-editor/WandelscriptEditor.stories.tsx +45 -0
  54. package/src/components/wandelscript-editor/WandelscriptEditor.tsx +114 -0
  55. package/src/components/wandelscript-editor/wandelscript.tmLanguage.ts +62 -0
  56. package/src/declarations.d.ts +10 -0
  57. package/src/i18n/config.ts +27 -0
  58. package/src/i18n/locales/de/translations.json +12 -0
  59. package/src/i18n/locales/en/translations.json +12 -0
  60. package/src/icons/arrowForwardFilled.tsx +7 -0
  61. package/src/icons/axis-x.svg +3 -0
  62. package/src/icons/axis-y.svg +3 -0
  63. package/src/icons/axis-z.svg +3 -0
  64. package/src/icons/expandFilled.tsx +11 -0
  65. package/src/icons/home.tsx +12 -0
  66. package/src/icons/index.ts +6 -0
  67. package/src/icons/infoOutlined.tsx +10 -0
  68. package/src/icons/jogging.svg +3 -0
  69. package/src/icons/robot.svg +3 -0
  70. package/src/icons/robot.tsx +14 -0
  71. package/src/icons/rotation.svg +4 -0
  72. package/src/icons/wbLogo.tsx +21 -0
  73. package/src/index.ts +7 -0
  74. package/src/themes/color.tsx +74 -0
  75. package/src/themes/theme.ts +150 -0
  76. package/src/themes/wbTheme.stories.tsx +64 -0
  77. package/src/themes/wbTheme.ts +186 -0
@@ -0,0 +1,123 @@
1
+ import { useGLTF } from "@react-three/drei"
2
+ import type * as THREE from "three"
3
+ import type { RobotProps } from "./SupportedRobot"
4
+ import { animated } from "@react-spring/three"
5
+ import RobotAnimator from "./RobotAnimator"
6
+
7
+ export function ABB_1200_07_7({ modelURL, connectedMotionGroup, ...props }: RobotProps) {
8
+ const gltf = useGLTF(modelURL) as any
9
+ const nodes = gltf.nodes
10
+ const materials = gltf.materials
11
+ const rotationOffsets = [0, -Math.PI / 2, 0, 0, 0, 0]
12
+
13
+ function setRotation(jointObjects: THREE.Object3D[], jointValues: number[]) {
14
+ jointObjects.forEach(
15
+ (object, index) =>
16
+ (object.rotation.y = jointValues[index]! + rotationOffsets[index]!),
17
+ )
18
+ }
19
+
20
+ return (
21
+ <>
22
+ <RobotAnimator
23
+ connectedMotionGroup={connectedMotionGroup}
24
+ robotRootObjectName="Scene"
25
+ onRotationChanged={setRotation}
26
+ />
27
+ <group {...props} dispose={null}>
28
+ <group name="Scene">
29
+ <group name="IRB1200_7_70_IRC5" rotation={[Math.PI / 2, 0, 0]}>
30
+ <animated.group
31
+ name="IRB1200_7_70_IRC5_J01"
32
+ rotation={[-Math.PI / 2, 0, 0]}
33
+ >
34
+ <animated.group
35
+ name="IRB1200_7_70_IRC5_J02"
36
+ position={[0, 0.399, 0]}
37
+ rotation={[-Math.PI / 2, -Math.PI / 2, 0]}
38
+ >
39
+ <animated.group
40
+ name="IRB1200_7_70_IRC5_J03"
41
+ position={[0.35, 0, 0]}
42
+ >
43
+ <animated.group
44
+ name="IRB1200_7_70_IRC5_J04"
45
+ position={[0.042, 0, 0]}
46
+ rotation={[-Math.PI / 2, 0, 0]}
47
+ >
48
+ <animated.group
49
+ name="IRB1200_7_70_IRC5_J05"
50
+ position={[0, 0.351, 0]}
51
+ rotation={[Math.PI / 2, 0, 0]}
52
+ >
53
+ <animated.group
54
+ name="IRB1200_7_70_IRC5_J06"
55
+ rotation={[Math.PI / 2, 0, -Math.PI]}
56
+ >
57
+ <group
58
+ name="IRB1200_7_70_IRC5_FLG"
59
+ position={[0, 0.082, 0]}
60
+ />
61
+ <mesh
62
+ name="IRB1200_7_70_IRC5_L06"
63
+ castShadow
64
+ receiveShadow
65
+ geometry={nodes.IRB1200_7_70_IRC5_L06.geometry}
66
+ material={materials["IRB1200_7-70_IRC5.003_Bake"]}
67
+ />
68
+ </animated.group>
69
+ <mesh
70
+ name="IRB1200_7_70_IRC5_L05"
71
+ castShadow
72
+ receiveShadow
73
+ geometry={nodes.IRB1200_7_70_IRC5_L05.geometry}
74
+ material={materials["IRB1200_7-70_IRC5.003_Bake"]}
75
+ />
76
+ </animated.group>
77
+ <mesh
78
+ name="IRB1200_7_70_IRC5_L04"
79
+ castShadow
80
+ receiveShadow
81
+ geometry={nodes.IRB1200_7_70_IRC5_L04.geometry}
82
+ material={materials["IRB1200_7-70_IRC5.003_Bake"]}
83
+ />
84
+ </animated.group>
85
+ <mesh
86
+ name="IRB1200_7_70_IRC5_L03"
87
+ castShadow
88
+ receiveShadow
89
+ geometry={nodes.IRB1200_7_70_IRC5_L03.geometry}
90
+ material={materials["IRB1200_7-70_IRC5.003_Bake"]}
91
+ />
92
+ </animated.group>
93
+ <mesh
94
+ name="IRB1200_7_70_IRC5_L02"
95
+ castShadow
96
+ receiveShadow
97
+ geometry={nodes.IRB1200_7_70_IRC5_L02.geometry}
98
+ material={materials["IRB1200_7-70_IRC5.003_Bake"]}
99
+ />
100
+ </animated.group>
101
+ <mesh
102
+ name="IRB1200_7_70_IRC5_L01"
103
+ castShadow
104
+ receiveShadow
105
+ geometry={nodes.IRB1200_7_70_IRC5_L01.geometry}
106
+ material={materials["IRB1200_7-70_IRC5.003_Bake"]}
107
+ rotation={[Math.PI / 2, 0, 0]}
108
+ />
109
+ </animated.group>
110
+ <mesh
111
+ name="IRB1200_7_70_IRC5_L00"
112
+ castShadow
113
+ receiveShadow
114
+ geometry={nodes.IRB1200_7_70_IRC5_L00.geometry}
115
+ material={materials["IRB1200_7-70_IRC5.003_Bake"]}
116
+ rotation={[-Math.PI / 2, 0, 0]}
117
+ />
118
+ </group>
119
+ </group>
120
+ </group>
121
+ </>
122
+ )
123
+ }
@@ -0,0 +1,3 @@
1
+ export type AxisConfig = number[]
2
+
3
+ export const defaultAxisConfig: AxisConfig = Array(6).fill(2 * Math.PI)
@@ -0,0 +1,129 @@
1
+ import { Vector3, Matrix4, Quaternion } from "three"
2
+ import { Line } from "@react-three/drei"
3
+ import type { LineGeometry } from "three/examples/jsm/lines/LineGeometry.js"
4
+ import type { DHParameter } from "@wandelbots/wandelbots-api-client"
5
+ import RobotAnimator from "./RobotAnimator"
6
+ import type * as THREE from "three"
7
+ import {
8
+ getAllJointsByName,
9
+ type RobotSceneJoint,
10
+ } from "../utils/robotTreeQuery"
11
+ import type { DHRobotProps } from "./SupportedRobot"
12
+
13
+ const CHILD_LINE = "line"
14
+ const CHILD_MESH = "mesh"
15
+
16
+ export function DHRobot({ connectedMotionGroup, ...props }: DHRobotProps) {
17
+ // reused in every update
18
+ const accumulatedMatrix = new Matrix4()
19
+
20
+ // Updates accumulatedMatrix with every execution
21
+ // Reset the matrix to identity if you start a new position update
22
+ function getLinePoints(
23
+ dhParameter: DHParameter,
24
+ jointRotation: number,
25
+ ): {
26
+ a: THREE.Vector3
27
+ b: THREE.Vector3
28
+ } {
29
+ const position = new Vector3()
30
+ const quaternion = new Quaternion()
31
+ const scale = new Vector3()
32
+ accumulatedMatrix.decompose(position, quaternion, scale)
33
+ const prevPosition = position.clone() // Update the previous position
34
+
35
+ const matrix = new Matrix4()
36
+ .makeRotationY(
37
+ dhParameter.theta! +
38
+ jointRotation * (dhParameter.reverse_rotation_direction ? -1 : 1),
39
+ ) // Rotate around Z
40
+ .multiply(new Matrix4().makeTranslation(0, dhParameter.d! / 1000, 0)) // Translate along Z
41
+ .multiply(new Matrix4().makeTranslation(dhParameter.a! / 1000, 0, 0)) // Translate along X
42
+ .multiply(new Matrix4().makeRotationX(dhParameter.alpha!)) // Rotate around X
43
+
44
+ // Accumulate transformations
45
+ accumulatedMatrix.multiply(matrix)
46
+ accumulatedMatrix.decompose(position, quaternion, scale)
47
+ return { a: prevPosition, b: position }
48
+ }
49
+
50
+ function setJointLineRotation(
51
+ jointIndex: number,
52
+ line: THREE.Line,
53
+ mesh: THREE.Mesh,
54
+ jointValue: number,
55
+ ) {
56
+ const dh_parameters =
57
+ connectedMotionGroup.motionGroupSpecification.dh_parameters
58
+ if (!dh_parameters) {
59
+ return
60
+ }
61
+
62
+ const dh_parameter = dh_parameters[jointIndex]
63
+ if (!dh_parameter) {
64
+ return
65
+ }
66
+
67
+ const { a, b } = getLinePoints(dh_parameter, jointValue)
68
+ const lineGeometry = line.geometry as LineGeometry
69
+ lineGeometry.setPositions([a.toArray(), b.toArray()].flat())
70
+
71
+ mesh.position.set(b.x, b.y, b.z)
72
+ }
73
+
74
+ function setRotation(joints: THREE.Object3D[], jointValues: number[]) {
75
+ accumulatedMatrix.identity()
76
+ joints.forEach((joint, jointIndex) => {
77
+ setJointLineRotation(
78
+ jointIndex,
79
+ joint.getObjectByName(CHILD_LINE) as THREE.Line,
80
+ joint.getObjectByName(CHILD_MESH) as THREE.Mesh,
81
+ jointValues[jointIndex]!,
82
+ )
83
+ })
84
+ }
85
+
86
+ function getAllJoints(rootObject: THREE.Object3D): RobotSceneJoint[] {
87
+ return getAllJointsByName(rootObject, "^group_[0-9]+$")
88
+ }
89
+
90
+ return (
91
+ <>
92
+ <RobotAnimator
93
+ connectedMotionGroup={connectedMotionGroup}
94
+ robotRootObjectName="Scene"
95
+ onRotationChanged={setRotation}
96
+ jointCollector={getAllJoints}
97
+ />
98
+ <group {...props} name="Scene">
99
+ <mesh>
100
+ <sphereGeometry args={[0.01, 32, 32]} />
101
+ <meshStandardMaterial color={"black"} depthTest={true} />
102
+ </mesh>
103
+ {connectedMotionGroup.motionGroupSpecification.dh_parameters!.map(
104
+ (param, index) => {
105
+ const { a, b } = getLinePoints(
106
+ param,
107
+ connectedMotionGroup.rapidlyChangingMotionState.state
108
+ .joint_position.joints[index] ?? 0,
109
+ )
110
+ return (
111
+ <group name={`group_${index}`} key={"group_" + index}>
112
+ <Line
113
+ name={CHILD_LINE}
114
+ points={[a, b]}
115
+ color={"white"}
116
+ lineWidth={5}
117
+ />
118
+ <mesh name={CHILD_MESH} key={"mesh_" + index} position={b}>
119
+ <sphereGeometry args={[0.01, 32, 32]} />
120
+ <meshStandardMaterial color={"black"} depthTest={true} />
121
+ </mesh>
122
+ </group>
123
+ )
124
+ },
125
+ )}
126
+ </group>
127
+ </>
128
+ )
129
+ }
@@ -0,0 +1,187 @@
1
+ import { useGLTF } from "@react-three/drei"
2
+ import type * as THREE from "three"
3
+ import type { RobotProps } from "./SupportedRobot"
4
+ import RobotAnimator from "./RobotAnimator"
5
+ import { animated } from "@react-spring/three"
6
+
7
+ export function FANUC_ARC_Mate_100iD({
8
+ modelURL,
9
+ connectedMotionGroup,
10
+ ...props
11
+ }: RobotProps) {
12
+ const gltf = useGLTF(modelURL) as any
13
+ const nodes = gltf.nodes
14
+ const materials = gltf.materials
15
+ const rotationOffsets = [0, Math.PI / 2, 0, 0, 0, 0]
16
+
17
+ function setRotation(jointObjects: THREE.Object3D[], jointValues: number[]) {
18
+ jointObjects.forEach(
19
+ (object, index) =>
20
+ (object.rotation.y = jointValues[index]! + rotationOffsets[index]!),
21
+ )
22
+ }
23
+
24
+ return (
25
+ <>
26
+ <RobotAnimator
27
+ connectedMotionGroup={connectedMotionGroup}
28
+ robotRootObjectName="Scene"
29
+ onRotationChanged={setRotation}
30
+ />
31
+ <group {...props} dispose={null}>
32
+ <group name="Scene">
33
+ <group name="M10iD" rotation={[Math.PI / 2, 0, 0]}>
34
+ <animated.group name="M10iD_J01" rotation={[-Math.PI / 2, 0, 0]}>
35
+ <animated.group
36
+ name="M10iD_J02"
37
+ position={[0.075, 0, 0]}
38
+ rotation={[Math.PI / 2, Math.PI / 2, 0]}
39
+ >
40
+ <animated.group name="M10iD_J03" position={[0.64, 0, 0]}>
41
+ <animated.group
42
+ name="M10iD_J04"
43
+ position={[0.195, 0, 0]}
44
+ rotation={[-Math.PI / 2, 0, 0]}
45
+ >
46
+ <animated.group
47
+ name="M10iD_J05"
48
+ position={[0, -0.7, 0]}
49
+ rotation={[Math.PI / 2, 0, 0]}
50
+ >
51
+ <animated.group
52
+ name="M10iD_J06"
53
+ rotation={[-Math.PI / 2, 0, 0]}
54
+ >
55
+ <group
56
+ name="M10iD_FLG"
57
+ position={[0, -0.075, 0]}
58
+ rotation={[-Math.PI, 0, 0]}
59
+ />
60
+ <mesh
61
+ name="M10iD_L06"
62
+ castShadow
63
+ receiveShadow
64
+ geometry={nodes.M10iD_L06.geometry}
65
+ material={materials.Fanuc_BlackMetal_AO}
66
+ position={[-0.835, 0.775, 0]}
67
+ rotation={[0, 0, -Math.PI / 2]}
68
+ />
69
+ </animated.group>
70
+ <mesh
71
+ name="M10iD_L05"
72
+ castShadow
73
+ receiveShadow
74
+ geometry={nodes.M10iD_L05.geometry}
75
+ material={materials.Fanuc_BlackMetal_AO}
76
+ position={[-0.835, 0, -0.775]}
77
+ rotation={[-Math.PI / 2, 0, -Math.PI / 2]}
78
+ />
79
+ </animated.group>
80
+ <group
81
+ name="M10iD_L04"
82
+ position={[-0.835, 0.075, 0]}
83
+ rotation={[0, 0, -Math.PI / 2]}
84
+ >
85
+ <mesh
86
+ name="Mesh_654"
87
+ castShadow
88
+ receiveShadow
89
+ geometry={nodes.Mesh_654.geometry}
90
+ material={materials.Fanuc_Yellow_Textured_AO}
91
+ />
92
+ <mesh
93
+ name="Mesh_654_1"
94
+ castShadow
95
+ receiveShadow
96
+ geometry={nodes.Mesh_654_1.geometry}
97
+ material={materials.Fanuc_BlackMetal_AO}
98
+ />
99
+ </group>
100
+ </animated.group>
101
+ <group
102
+ name="M10iD_L03"
103
+ position={[-0.64, 0, -0.075]}
104
+ rotation={[-Math.PI / 2, 0, -Math.PI / 2]}
105
+ >
106
+ <mesh
107
+ name="Mesh_378"
108
+ castShadow
109
+ receiveShadow
110
+ geometry={nodes.Mesh_378.geometry}
111
+ material={materials.Material_1_AO}
112
+ />
113
+ <mesh
114
+ name="Mesh_378_1"
115
+ castShadow
116
+ receiveShadow
117
+ geometry={nodes.Mesh_378_1.geometry}
118
+ material={materials.Fanuc_Yellow_Textured_AO}
119
+ />
120
+ <mesh
121
+ name="Mesh_378_2"
122
+ castShadow
123
+ receiveShadow
124
+ geometry={nodes.Mesh_378_2.geometry}
125
+ material={materials.Fanuc_BlackMetal_AO}
126
+ />
127
+ </group>
128
+ </animated.group>
129
+ <group
130
+ name="M10iD_L02"
131
+ position={[0, 0, -0.075]}
132
+ rotation={[-Math.PI / 2, 0, -Math.PI / 2]}
133
+ >
134
+ <mesh
135
+ name="Mesh_358"
136
+ castShadow
137
+ receiveShadow
138
+ geometry={nodes.Mesh_358.geometry}
139
+ material={materials.Fanuc_Yellow_Textured_AO}
140
+ />
141
+ <mesh
142
+ name="Mesh_358_1"
143
+ castShadow
144
+ receiveShadow
145
+ geometry={nodes.Mesh_358_1.geometry}
146
+ material={materials.Fanuc_BlackMetal_AO}
147
+ />
148
+ </group>
149
+ </animated.group>
150
+ <group name="M10iD_L01">
151
+ <mesh
152
+ name="Mesh_356"
153
+ castShadow
154
+ receiveShadow
155
+ geometry={nodes.Mesh_356.geometry}
156
+ material={materials.Fanuc_Yellow_Textured_AO}
157
+ />
158
+ <mesh
159
+ name="Mesh_356_1"
160
+ castShadow
161
+ receiveShadow
162
+ geometry={nodes.Mesh_356_1.geometry}
163
+ material={materials.Material_1_AO}
164
+ />
165
+ <mesh
166
+ name="Mesh_356_2"
167
+ castShadow
168
+ receiveShadow
169
+ geometry={nodes.Mesh_356_2.geometry}
170
+ material={materials.Fanuc_BlackMetal_AO}
171
+ />
172
+ </group>
173
+ </animated.group>
174
+ <mesh
175
+ name="M10iD_L00"
176
+ castShadow
177
+ receiveShadow
178
+ geometry={nodes.M10iD_L00.geometry}
179
+ material={materials.Fanuc_BlackMetal_AO}
180
+ rotation={[-Math.PI / 2, 0, 0]}
181
+ />
182
+ </group>
183
+ </group>
184
+ </group>
185
+ </>
186
+ )
187
+ }
@@ -0,0 +1,187 @@
1
+ import { useGLTF } from "@react-three/drei"
2
+ import type * as THREE from "three"
3
+ import type { RobotProps } from "./SupportedRobot"
4
+ import RobotAnimator from "./RobotAnimator"
5
+ import { animated } from "@react-spring/three"
6
+
7
+ export function FANUC_ARC_Mate_120iD({
8
+ modelURL,
9
+ connectedMotionGroup,
10
+ ...props
11
+ }: RobotProps) {
12
+ const gltf = useGLTF(modelURL) as any
13
+ const nodes = gltf.nodes
14
+ const materials = gltf.materials
15
+ const rotationOffsets = [0, Math.PI / 2, 0, 0, 0, 0]
16
+
17
+ function setRotation(jointObjects: THREE.Object3D[], jointValues: number[]) {
18
+ jointObjects.forEach(
19
+ (object, index) =>
20
+ (object.rotation.y = jointValues[index]! + rotationOffsets[index]!),
21
+ )
22
+ }
23
+
24
+ return (
25
+ <>
26
+ <RobotAnimator
27
+ connectedMotionGroup={connectedMotionGroup}
28
+ robotRootObjectName="Scene"
29
+ onRotationChanged={setRotation}
30
+ />
31
+ <group {...props} dispose={null}>
32
+ <group name="Scene">
33
+ <group name="M10iD" rotation={[0, 0, 0]}>
34
+ <animated.group name="M20iD25_J00">
35
+ <animated.group
36
+ name="M20iD25_J01"
37
+ position={[0.075, 0, 0]}
38
+ rotation={[Math.PI / 2, Math.PI / 2, 0]}
39
+ >
40
+ <animated.group name="M20iD25_J02" position={[0.84, 0, 0]}>
41
+ <animated.group
42
+ name="M20iD25_J03"
43
+ position={[0.215, 0, 0]}
44
+ rotation={[-Math.PI / 2, 0, 0]}
45
+ >
46
+ <animated.group
47
+ name="M20iD25_J04"
48
+ position={[0, -0.89, 0]}
49
+ rotation={[Math.PI / 2, 0, 0]}
50
+ >
51
+ <animated.group
52
+ name="M20iD25_J05"
53
+ rotation={[-Math.PI / 2, 0, 0]}
54
+ >
55
+ <group
56
+ name="M20iD25_FLG"
57
+ position={[0, -0.09, 0]}
58
+ rotation={[-Math.PI, 0, 0]}
59
+ />
60
+ <mesh
61
+ name="M20iD25_L06"
62
+ castShadow
63
+ receiveShadow
64
+ geometry={nodes.M20iD25_L06.geometry}
65
+ material={materials.Fanuc_BlackMetal_AO}
66
+ position={[0, -0.09, 0]}
67
+ rotation={[Math.PI / 2, 0, Math.PI]}
68
+ />
69
+ </animated.group>
70
+ <mesh
71
+ name="M20iD25_L05"
72
+ castShadow
73
+ receiveShadow
74
+ geometry={nodes.M20iD25_L05.geometry}
75
+ material={materials.Fanuc_BlackMetal_AO}
76
+ rotation={[Math.PI, Math.PI / 2, 0]}
77
+ />
78
+ </animated.group>
79
+ <group
80
+ name="M20iD25_L04"
81
+ position={[0, -0.286, 0]}
82
+ rotation={[-Math.PI / 2, Math.PI / 2, 0]}
83
+ >
84
+ <mesh
85
+ name="Mesh_2"
86
+ castShadow
87
+ receiveShadow
88
+ geometry={nodes.Mesh_2.geometry}
89
+ material={materials.Fanuc_Yellow_Textured_AO}
90
+ />
91
+ <mesh
92
+ name="Mesh_2_1"
93
+ castShadow
94
+ receiveShadow
95
+ geometry={nodes.Mesh_2_1.geometry}
96
+ material={materials.Fanuc_BlackMetal_AO}
97
+ />
98
+ </group>
99
+ </animated.group>
100
+ <group
101
+ name="M20iD25_L03"
102
+ position={[0, 0.406, 0]}
103
+ rotation={[Math.PI, Math.PI / 2, 0]}
104
+ >
105
+ <mesh
106
+ name="Mesh_15"
107
+ castShadow
108
+ receiveShadow
109
+ geometry={nodes.Mesh_15.geometry}
110
+ material={materials.Fanuc_BlackMetal_AO}
111
+ />
112
+ <mesh
113
+ name="Mesh_15_1"
114
+ castShadow
115
+ receiveShadow
116
+ geometry={nodes.Mesh_15_1.geometry}
117
+ material={materials.Fanuc_Yellow_Textured_AO}
118
+ />
119
+ <mesh
120
+ name="Mesh_15_2"
121
+ castShadow
122
+ receiveShadow
123
+ geometry={nodes.Mesh_15_2.geometry}
124
+ material={materials.Material_9_AO}
125
+ />
126
+ </group>
127
+ </animated.group>
128
+ <group
129
+ name="M20iD25_L02"
130
+ position={[0, 0.505, -0.055]}
131
+ rotation={[-Math.PI, Math.PI / 2, 0]}
132
+ >
133
+ <mesh
134
+ name="Mesh_37"
135
+ castShadow
136
+ receiveShadow
137
+ geometry={nodes.Mesh_37.geometry}
138
+ material={materials.Fanuc_BlackMetal_AO}
139
+ />
140
+ <mesh
141
+ name="Mesh_37_1"
142
+ castShadow
143
+ receiveShadow
144
+ geometry={nodes.Mesh_37_1.geometry}
145
+ material={materials.Fanuc_Yellow_Textured_AO}
146
+ />
147
+ </group>
148
+ </animated.group>
149
+ <group name="M20iD25_L01" rotation={[-Math.PI / 2, 0, 0]}>
150
+ <mesh
151
+ name="Mesh_45"
152
+ castShadow
153
+ receiveShadow
154
+ geometry={nodes.Mesh_45.geometry}
155
+ material={materials.Material_9_AO}
156
+ />
157
+ <mesh
158
+ name="Mesh_45_1"
159
+ castShadow
160
+ receiveShadow
161
+ geometry={nodes.Mesh_45_1.geometry}
162
+ material={materials.Fanuc_Yellow_Textured_AO}
163
+ />
164
+ <mesh
165
+ name="Mesh_45_2"
166
+ castShadow
167
+ receiveShadow
168
+ geometry={nodes.Mesh_45_2.geometry}
169
+ material={materials.Fanuc_BlackMetal_AO}
170
+ />
171
+ </group>
172
+ </animated.group>
173
+ <mesh
174
+ name="M20iD25_L00"
175
+ castShadow
176
+ receiveShadow
177
+ geometry={nodes.M20iD25_L00.geometry}
178
+ material={materials.Fanuc_BlackMetal_AO}
179
+ position={[0, -0.425, 0]}
180
+ rotation={[-Math.PI / 2, 0, 0]}
181
+ />
182
+ </group>
183
+ </group>
184
+ </group>
185
+ </>
186
+ )
187
+ }