@wandelbots/wandelbots-js-react-components 4.2.0 → 4.3.0

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 (42) hide show
  1. package/README.md +1 -1
  2. package/dist/3d.cjs.js +1 -1
  3. package/dist/3d.es.js +1 -1
  4. package/dist/{MotionGroupVisualizer-CrLamHYm.js → MotionGroupVisualizer-BgvrTXeT.js} +93 -93
  5. package/dist/{MotionGroupVisualizer-CrLamHYm.js.map → MotionGroupVisualizer-BgvrTXeT.js.map} +1 -1
  6. package/dist/{MotionGroupVisualizer-C3CB-L2z.cjs → MotionGroupVisualizer-C_fyiA-X.cjs} +2 -2
  7. package/dist/{MotionGroupVisualizer-C3CB-L2z.cjs.map → MotionGroupVisualizer-C_fyiA-X.cjs.map} +1 -1
  8. package/dist/components/jogging/JoggingJointTab.d.ts +1 -1
  9. package/dist/components/jogging/JoggingJointTab.d.ts.map +1 -1
  10. package/dist/components/jogging/JoggingJointValueControl.d.ts +16 -0
  11. package/dist/components/jogging/JoggingJointValueControl.d.ts.map +1 -0
  12. package/dist/components/jogging/JoggingStore.d.ts +17 -19
  13. package/dist/components/jogging/JoggingStore.d.ts.map +1 -1
  14. package/dist/core.cjs.js +1 -1
  15. package/dist/core.d.ts +1 -1
  16. package/dist/core.d.ts.map +1 -1
  17. package/dist/core.es.js +8 -8
  18. package/dist/index.cjs.js +1 -1
  19. package/dist/index.es.js +10 -10
  20. package/dist/{interpolation-Cs2pC1zE.js → interpolation-6ZZN4S_x.js} +2 -2
  21. package/dist/{interpolation-Cs2pC1zE.js.map → interpolation-6ZZN4S_x.js.map} +1 -1
  22. package/dist/{interpolation-C5OTEwAm.cjs → interpolation-CyO6DaVa.cjs} +2 -2
  23. package/dist/{interpolation-C5OTEwAm.cjs.map → interpolation-CyO6DaVa.cjs.map} +1 -1
  24. package/dist/lib/JoggerConnection.d.ts +4 -3
  25. package/dist/lib/JoggerConnection.d.ts.map +1 -1
  26. package/dist/{theming-Dk07SE2_.cjs → theming-Cqo-msxF.cjs} +36 -36
  27. package/dist/theming-Cqo-msxF.cjs.map +1 -0
  28. package/dist/{theming-C-zvh022.js → theming-gUgI75AD.js} +2915 -2891
  29. package/dist/theming-gUgI75AD.js.map +1 -0
  30. package/package.json +2 -2
  31. package/src/components/jogging/JoggingJointTab.tsx +18 -18
  32. package/src/components/jogging/{JoggingJointRotationControl.tsx → JoggingJointValueControl.tsx} +51 -28
  33. package/src/components/jogging/JoggingPanel.tsx +1 -1
  34. package/src/components/jogging/JoggingStore.ts +42 -12
  35. package/src/components/robots/MotionGroupVisualizer.tsx +4 -4
  36. package/src/core.ts +2 -1
  37. package/src/lib/JoggerConnection.test.ts +4 -2
  38. package/src/lib/JoggerConnection.ts +8 -4
  39. package/dist/components/jogging/JoggingJointRotationControl.d.ts +0 -15
  40. package/dist/components/jogging/JoggingJointRotationControl.d.ts.map +0 -1
  41. package/dist/theming-C-zvh022.js.map +0 -1
  42. package/dist/theming-Dk07SE2_.cjs.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wandelbots/wandelbots-js-react-components",
3
- "version": "4.2.0",
3
+ "version": "4.3.0",
4
4
  "description": "React UI toolkit for building applications on top of the Wandelbots platform",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -93,7 +93,7 @@
93
93
  "@types/react": "^19.1.8",
94
94
  "@types/three": "^0.182.0",
95
95
  "@vitejs/plugin-react": "^4.3.4",
96
- "@wandelbots/nova-js": "^3.5.2",
96
+ "@wandelbots/nova-js": "^3.5.3",
97
97
  "add": "^2.0.6",
98
98
  "eslint-plugin-storybook": "^10.1.10",
99
99
  "glob": "^13.0.0",
@@ -1,10 +1,9 @@
1
1
  import { Divider, Stack, Typography, useTheme } from "@mui/material"
2
- import { radiansToDegrees } from "@wandelbots/nova-js"
3
2
  import { observer } from "mobx-react-lite"
4
3
  import type { ReactNode } from "react"
5
4
  import { JoggingJointLimitDetector } from "./JoggingJointLimitDetector"
6
- import { JoggingJointRotationControl } from "./JoggingJointRotationControl"
7
- import type { JoggingStore } from "./JoggingStore"
5
+ import { JoggingJointValueControl } from "./JoggingJointValueControl"
6
+ import { type JoggingStore, JointCategory } from "./JoggingStore"
8
7
  import { JoggingVelocitySlider } from "./JoggingVelocitySlider"
9
8
 
10
9
  export const JoggingJointTab = observer(
@@ -12,14 +11,22 @@ export const JoggingJointTab = observer(
12
11
  const theme = useTheme()
13
12
  async function startJointJogging(opts: {
14
13
  joint: number
15
- direction: "-" | "+"
14
+ direction: "-" | "+",
16
15
  }) {
17
16
  await store.activate()
18
17
 
19
18
  await store.jogger.rotateJoints({
20
19
  joint: opts.joint,
21
20
  direction: opts.direction,
22
- velocityRadsPerSec: store.rotationVelocityRadsPerSec,
21
+ velocityUnit:
22
+ store.jointCategory === JointCategory.PRISMATIC
23
+ ? "mm/s"
24
+ : "rad/s",
25
+ velocityValue:
26
+ store.jointCategory === JointCategory.PRISMATIC
27
+ ? store.translationVelocityMmPerSec
28
+ : store.rotationVelocityRadsPerSec,
29
+
23
30
  })
24
31
  }
25
32
 
@@ -43,14 +50,6 @@ export const JoggingJointTab = observer(
43
50
  const jointLimits =
44
51
  store.motionGroupDescription.operation_limits.auto_limits
45
52
  ?.joints?.[joint.index]?.position
46
- const lowerLimitDegs =
47
- jointLimits?.lower_limit !== undefined
48
- ? radiansToDegrees(jointLimits.lower_limit)
49
- : undefined
50
- const upperLimitDegs =
51
- jointLimits?.upper_limit !== undefined
52
- ? radiansToDegrees(jointLimits.upper_limit)
53
- : undefined
54
53
 
55
54
  return (
56
55
  <Stack
@@ -73,16 +72,17 @@ export const JoggingJointTab = observer(
73
72
  </Typography>
74
73
  )}
75
74
 
76
- <JoggingJointRotationControl
75
+ <JoggingJointValueControl
77
76
  disabled={store.isLocked}
78
- lowerLimitDegs={lowerLimitDegs}
79
- upperLimitDegs={upperLimitDegs}
80
- getValueDegs={() => {
77
+ lowerLimit={jointLimits?.lower_limit}
78
+ upperLimit={jointLimits?.upper_limit}
79
+ useDegree={store.currentMotionType === "rotate"}
80
+ getValue={() => {
81
81
  const value =
82
82
  store.jogger.motionStream.rapidlyChangingMotionState
83
83
  .joint_position[joint.index]
84
84
  return value !== undefined
85
- ? radiansToDegrees(value)
85
+ ? value
86
86
  : undefined
87
87
  }}
88
88
  startJogging={(direction: "-" | "+") =>
@@ -1,5 +1,6 @@
1
1
  import ChevronLeft from "@mui/icons-material/ChevronLeft"
2
2
  import ChevronRight from "@mui/icons-material/ChevronRight"
3
+ import { radiansToDegrees } from "@wandelbots/nova-js"
3
4
  import { IconButton, Slider, Typography, useTheme } from "@mui/material"
4
5
  import Stack from "@mui/material/Stack"
5
6
  import throttle from "lodash-es/throttle"
@@ -9,28 +10,29 @@ import { useTranslation } from "react-i18next"
9
10
  import { externalizeComponent } from "../../externalizeComponent"
10
11
  import { useAnimationFrame } from "../utils/hooks"
11
12
 
12
- type JoggingJointRotationControlProps = {
13
+ type JoggingJointValueControlProps = {
13
14
  startJogging: (direction: "-" | "+") => void
14
15
  stopJogging: () => void
15
- lowerLimitDegs?: number
16
- upperLimitDegs?: number
17
- getValueDegs: () => number | undefined
18
-
16
+ lowerLimit?: number
17
+ upperLimit?: number
18
+ useDegree: boolean
19
+ getValue: () => number | undefined
19
20
  disabled?: boolean
20
21
  } & React.ComponentProps<typeof Stack>
21
22
 
22
23
  /** A input widget to control an individual joint */
23
- export const JoggingJointRotationControl = externalizeComponent(
24
+ export const JoggingJointValueControl = externalizeComponent(
24
25
  observer(
25
26
  ({
26
- startJogging,
27
- stopJogging,
28
- lowerLimitDegs,
29
- upperLimitDegs,
30
- getValueDegs,
31
- disabled,
32
- ...rest
33
- }: JoggingJointRotationControlProps) => {
27
+ startJogging,
28
+ stopJogging,
29
+ lowerLimit,
30
+ upperLimit,
31
+ useDegree,
32
+ getValue,
33
+ disabled,
34
+ ...rest
35
+ }: JoggingJointValueControlProps) => {
34
36
  const { t } = useTranslation()
35
37
  const [currentValue, setCurrentValue] = useState<number | undefined>()
36
38
  const theme = useTheme()
@@ -55,11 +57,18 @@ export const JoggingJointRotationControl = externalizeComponent(
55
57
  }))
56
58
 
57
59
  const updateValue = throttle(() => {
58
- setCurrentValue(getValueDegs())
60
+ setCurrentValue(useDegree ? convertToDegree(getValue()) : getValue())
59
61
  }, 50)
60
62
 
61
63
  useAnimationFrame(updateValue)
62
64
 
65
+ function convertToDegree(value: number| undefined){
66
+ if (value == undefined){
67
+ return undefined;
68
+ }
69
+ return radiansToDegrees(value);
70
+ }
71
+
63
72
  function onPointerDownMinus(ev: React.PointerEvent) {
64
73
  // Stop right click from triggering jog
65
74
  if (ev.button === 0) state.startJogging("-")
@@ -90,6 +99,20 @@ export const JoggingJointRotationControl = externalizeComponent(
90
99
  return output
91
100
  }
92
101
  }
102
+ function formatMm(value: number | undefined, precision = 1) {
103
+ if (value === undefined || isNaN(value)) return ""
104
+
105
+ const output = t("General.mm.variable", {
106
+ amount: value.toFixed(precision),
107
+ })
108
+
109
+ if (value > 0 && precision === 0) {
110
+ return `+${output}`
111
+ } else {
112
+ return output
113
+ }
114
+ }
115
+
93
116
 
94
117
  return (
95
118
  <Stack
@@ -138,8 +161,8 @@ export const JoggingJointRotationControl = externalizeComponent(
138
161
  sx={{
139
162
  pointerEvents: "none",
140
163
  color:
141
- theme.componentsExt?.JoggingPanel?.JoggingJoint?.Joint
142
- ?.arrowColor,
164
+ theme.componentsExt?.JoggingPanel?.JoggingJoint?.Joint
165
+ ?.arrowColor,
143
166
  }}
144
167
  />
145
168
  </IconButton>
@@ -171,14 +194,14 @@ export const JoggingJointRotationControl = externalizeComponent(
171
194
  : theme.palette.text.primary,
172
195
  }}
173
196
  >
174
- {formatDegrees(currentValue)}
197
+ {useDegree ? formatDegrees(currentValue) : formatMm(currentValue)}
175
198
  </Typography>
176
199
 
177
200
  <Slider
178
201
  disabled
179
202
  aria-label="Joint position"
180
- min={lowerLimitDegs}
181
- max={upperLimitDegs}
203
+ min={ useDegree ? convertToDegree(lowerLimit) : lowerLimit}
204
+ max={ useDegree ? convertToDegree(upperLimit) : upperLimit}
182
205
  value={currentValue || 0}
183
206
  track={false}
184
207
  sx={{
@@ -206,15 +229,15 @@ export const JoggingJointRotationControl = externalizeComponent(
206
229
  },
207
230
  }}
208
231
  marks={
209
- lowerLimitDegs !== undefined &&
210
- upperLimitDegs !== undefined && [
232
+ lowerLimit !== undefined &&
233
+ upperLimit !== undefined && [
211
234
  {
212
- value: lowerLimitDegs,
213
- label: formatDegrees(lowerLimitDegs, 0),
235
+ value: (useDegree ? convertToDegree(lowerLimit) : lowerLimit) as number,
236
+ label: useDegree ? formatDegrees(convertToDegree(lowerLimit),0) : formatMm(lowerLimit),
214
237
  },
215
238
  {
216
- value: upperLimitDegs,
217
- label: formatDegrees(upperLimitDegs, 0),
239
+ value: (useDegree ? convertToDegree(upperLimit) : upperLimit) as number,
240
+ label: useDegree ? formatDegrees(convertToDegree(upperLimit),0) : formatMm(upperLimit),
218
241
  },
219
242
  ]
220
243
  }
@@ -236,8 +259,8 @@ export const JoggingJointRotationControl = externalizeComponent(
236
259
  sx={{
237
260
  pointerEvents: "none",
238
261
  color:
239
- theme.componentsExt?.JoggingPanel?.JoggingJoint?.Joint
240
- ?.arrowColor,
262
+ theme.componentsExt?.JoggingPanel?.JoggingJoint?.Joint
263
+ ?.arrowColor,
241
264
  }}
242
265
  />
243
266
  </IconButton>
@@ -153,7 +153,7 @@ const JoggingPanelInner = observer(
153
153
  >
154
154
  {store.tabs.map((tab) => {
155
155
  const label =
156
- tab.label === "cartesian"
156
+ tab.label === "Cartesian"
157
157
  ? t("Jogging.Cartesian.bt")
158
158
  : t("Jogging.Joints.bt")
159
159
 
@@ -40,8 +40,16 @@ export type IncrementJogInProgress = {
40
40
  axis: JoggingAxis
41
41
  }
42
42
 
43
+ export enum JointCategory {
44
+ REVOLUTE = "REVOLUTE",
45
+ PRISMATIC = "PRISMATIC",
46
+ }
47
+
48
+ type TabType = "cartesian" | "joint" | "debug";
49
+
50
+
43
51
  export class JoggingStore {
44
- selectedTabId: "cartesian" | "joint" | "debug" = "cartesian"
52
+ selectedTabId: TabType = "cartesian";
45
53
 
46
54
  /**
47
55
  * State of the jogging panel. Starts as "inactive"
@@ -298,18 +306,20 @@ export class JoggingStore {
298
306
  }
299
307
 
300
308
  get tabs() {
301
- return [
302
- {
309
+ const tempTabs : {id: TabType, label: string}[] = [{
310
+ id: "joint",
311
+ label: "Joints",
312
+ }] ;
313
+ if(this.isTcpCartesianMoveable){
314
+ tempTabs.unshift({
303
315
  id: "cartesian",
304
- label: "cartesian",
305
- },
306
- {
307
- id: "joint",
308
- label: "joint",
309
- },
310
- ] as const
316
+ label: "Cartesian",
317
+ })}
318
+
319
+ return tempTabs;
311
320
  }
312
321
 
322
+
313
323
  get incrementOptions() {
314
324
  return incrementOptions
315
325
  }
@@ -395,8 +405,10 @@ export class JoggingStore {
395
405
  */
396
406
  get currentMotionType() {
397
407
  if (
398
- this.selectedTabId === "cartesian" &&
399
- this.selectedCartesianMotionType === "translate"
408
+ (
409
+ this.selectedTabId === "cartesian" &&
410
+ this.selectedCartesianMotionType === "translate"
411
+ ) || this.jointCategory === JointCategory.PRISMATIC
400
412
  ) {
401
413
  return "translate"
402
414
  } else {
@@ -404,6 +416,24 @@ export class JoggingStore {
404
416
  }
405
417
  }
406
418
 
419
+
420
+ /*
421
+ * ToDo replace Hardcoded Models with an api request that delivers the type (will become part of DH-Parameters)
422
+ * Ticket already created
423
+ * */
424
+ get jointCategory(): JointCategory {
425
+ return this.motionGroupDescription.motion_group_model === "ABB_IRT710"
426
+ ? JointCategory.PRISMATIC
427
+ : JointCategory.REVOLUTE
428
+ }
429
+
430
+ get isTcpCartesianMoveable(): boolean{
431
+ if(this.motionGroupDescription.motion_group_model === "ABB_IRT710"){
432
+ return false;
433
+ }
434
+ return true;
435
+ }
436
+
407
437
  onTabChange(_event: React.SyntheticEvent, newValue: number) {
408
438
  const tab = this.tabs[newValue] || this.tabs[0]!
409
439
  this.selectedTabId = tab.id
@@ -83,10 +83,10 @@ export const MotionGroupVisualizer: React.FC<MotionGroupVisualizerProps> = exter
83
83
  return [
84
84
  "KUKA_DKP250",
85
85
  "KUKA_DKP500_2",
86
- "YASKAWA_TURN1",
87
- "YASKAWA_TURN2",
88
- "YASKAWA_TURN3",
89
- ].includes(modelFromController)
86
+ "Yaskawa_TURN1",
87
+ "Yaskawa_TURN2",
88
+ "Yaskawa_TURN3",
89
+ ].some(model => model.toLowerCase() === modelFromController.toLowerCase())
90
90
  }, [modelFromController])
91
91
 
92
92
  if (inverseSolver || isTurnTable) {
package/src/core.ts CHANGED
@@ -3,7 +3,7 @@ export * from "./components/AppHeader"
3
3
  export * from "./components/CycleTimer"
4
4
  export * from "./components/DataGrid"
5
5
  export * from "./components/jogging/JoggingCartesianAxisControl"
6
- export * from "./components/jogging/JoggingJointRotationControl"
6
+ export * from "./components/jogging/JoggingJointValueControl"
7
7
  export * from "./components/jogging/JoggingPanel"
8
8
  export { JoggingStore } from "./components/jogging/JoggingStore"
9
9
  export * from "./components/jogging/PoseCartesianValues"
@@ -31,3 +31,4 @@ export * from "./lib/motionStateUpdate"
31
31
  export * from "./lib/MotionStreamConnection"
32
32
  export * from "./themes/themeTypes"
33
33
  export { createNovaMuiTheme } from "./themes/theming"
34
+
@@ -77,7 +77,8 @@ test("jog a robot somewhat", async () => {
77
77
  await jogger.rotateJoints({
78
78
  joint: 0,
79
79
  direction: "+",
80
- velocityRadsPerSec: 0.1,
80
+ velocityValue: 0.1,
81
+ velocityUnit: "rad/s",
81
82
  })
82
83
 
83
84
  await delay(500)
@@ -94,7 +95,8 @@ test("jog a robot somewhat", async () => {
94
95
  await jogger.rotateJoints({
95
96
  joint: 0,
96
97
  direction: "-",
97
- velocityRadsPerSec: 0.1,
98
+ velocityValue: 0.1,
99
+ velocityUnit: "rad/s",
98
100
  })
99
101
  await delay(500)
100
102
  await jogger.stop()
@@ -282,14 +282,18 @@ export class JoggerConnection {
282
282
  async rotateJoints({
283
283
  joint,
284
284
  direction,
285
- velocityRadsPerSec,
285
+ velocityValue,
286
+ velocityUnit
287
+
286
288
  }: {
287
289
  /** Index of the joint to rotate */
288
290
  joint: number
289
291
  /** Direction of rotation ("+" or "-") */
290
292
  direction: "+" | "-"
291
- /** Speed of the rotation in radians per second */
292
- velocityRadsPerSec: number
293
+ /** Speed of the rotation, unit is currently unused, but i wanted it there to raise awareness that not everything here is rad/s*/
294
+ velocityValue: number
295
+ velocityUnit: "mm/s" | "rad/s"
296
+
293
297
  }) {
294
298
  if (!this.joggingSocket || this.mode !== "jogging") {
295
299
  throw new Error(
@@ -300,7 +304,7 @@ export class JoggerConnection {
300
304
  const velocity = new Array(this.numJoints).fill(0)
301
305
 
302
306
  velocity[joint] =
303
- direction === "-" ? -velocityRadsPerSec : velocityRadsPerSec
307
+ direction === "-" ? - velocityValue : velocityValue
304
308
 
305
309
  this.joggingSocket.sendJson({
306
310
  message_type: "JointVelocityRequest",
@@ -1,15 +0,0 @@
1
- import Stack from "@mui/material/Stack";
2
- type JoggingJointRotationControlProps = {
3
- startJogging: (direction: "-" | "+") => void;
4
- stopJogging: () => void;
5
- lowerLimitDegs?: number;
6
- upperLimitDegs?: number;
7
- getValueDegs: () => number | undefined;
8
- disabled?: boolean;
9
- } & React.ComponentProps<typeof Stack>;
10
- /** A input widget to control an individual joint */
11
- export declare const JoggingJointRotationControl: (({ startJogging, stopJogging, lowerLimitDegs, upperLimitDegs, getValueDegs, disabled, ...rest }: JoggingJointRotationControlProps) => import("react/jsx-runtime").JSX.Element) & {
12
- displayName: string;
13
- };
14
- export {};
15
- //# sourceMappingURL=JoggingJointRotationControl.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"JoggingJointRotationControl.d.ts","sourceRoot":"","sources":["../../../src/components/jogging/JoggingJointRotationControl.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,qBAAqB,CAAA;AAQvC,KAAK,gCAAgC,GAAG;IACtC,YAAY,EAAE,CAAC,SAAS,EAAE,GAAG,GAAG,GAAG,KAAK,IAAI,CAAA;IAC5C,WAAW,EAAE,MAAM,IAAI,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IAEtC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,KAAK,CAAC,CAAA;AAEtC,oDAAoD;AACpD,eAAO,MAAM,2BAA2B,oGAUjC,gCAAgC;;CAuNtC,CAAA"}