diff --git a/.github/workflows/robot-cell-snapshots.yml b/.github/workflows/robot-cell-snapshots.yml
new file mode 100644
index 000000000..79dd39486
--- /dev/null
+++ b/.github/workflows/robot-cell-snapshots.yml
@@ -0,0 +1,97 @@
+name: robot-cell-snapshots
+
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - main
+ pull_request:
+ branches:
+ - main
+
+permissions:
+ contents: read
+
+concurrency:
+ group: robot-cell-snapshots-${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ generate:
+ name: Generate robot-cell GLB snapshots
+ runs-on: ubuntu-latest
+ timeout-minutes: 45
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v6
+
+ - name: Set up Python 3.11
+ uses: actions/setup-python@v5
+ with:
+ python-version: "3.11"
+ cache: pip
+ cache-dependency-path: |
+ requirements.txt
+ requirements-dev.txt
+
+ - name: Bring up ROS 1 and ROS 2 integration stacks
+ run: |
+ docker compose -f tests/integration_setup/docker-compose.yml up -d --build
+ docker compose -f tests/integration_setup/docker-compose-ros2.yml up -d --build
+ docker ps -a
+
+ - name: Install project and snapshot dependencies
+ run: |
+ python -m pip install --upgrade pip wheel
+ python -m pip install --no-cache-dir -e ".[dev]"
+
+ - name: Generate local robot-cell snapshots
+ run: |
+ python scripts/generate_robot_cell_gltf_snapshots.py \
+ --cells all \
+ --output-dir artifacts/robot-cell-snapshots/local
+
+ - name: Generate ROS 1 robot-cell snapshots
+ env:
+ ROSLIBPY_TRANSPORT: asyncio
+ run: |
+ python scripts/generate_robot_cell_gltf_snapshots.py \
+ --solvers ros \
+ --ros-host localhost \
+ --ros-port 9090 \
+ --output-dir artifacts/robot-cell-snapshots/ros1
+
+ - name: Generate ROS 2 robot-cell snapshots
+ env:
+ ROSLIBPY_TRANSPORT: asyncio
+ run: |
+ python scripts/generate_robot_cell_gltf_snapshots.py \
+ --solvers ros \
+ --ros-host localhost \
+ --ros-port 9091 \
+ --ros-http-file-server http://localhost:9190 \
+ --output-dir artifacts/robot-cell-snapshots/ros2
+
+ - name: Upload GLB snapshots
+ if: always()
+ uses: actions/upload-artifact@v5
+ with:
+ name: robot-cell-glb-snapshots
+ path: |
+ artifacts/robot-cell-snapshots/**/*.glb
+ artifacts/robot-cell-snapshots/**/manifest.json
+ if-no-files-found: error
+ retention-days: 14
+
+ - name: Show ROS container logs on failure
+ if: failure()
+ run: |
+ docker compose -f tests/integration_setup/docker-compose.yml logs --no-color
+ docker compose -f tests/integration_setup/docker-compose-ros2.yml logs --no-color
+
+ - name: Tear down ROS integration stacks
+ if: always()
+ run: |
+ docker compose -f tests/integration_setup/docker-compose.yml down
+ docker compose -f tests/integration_setup/docker-compose-ros2.yml down
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b6f3ed7eb..988249e3f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,10 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased
+### Migrating
+
+Three changes in this release alter results rather than the API. Code that compensated for the old behaviour needs the compensation removed.
+
+* **Tools from `ToolLibrary` mount along +Z.** If you attached one with an `attachment_frame` that rotated it to bridge the old +X convention — `state.set_tool_attached_to_group(tool_id, group, attachment_frame=Frame([0, 0, 0], [0, 0, 1], [1, 0, 0]))`, which is what the library's own cells used to do — drop that argument. The tool now attaches with an identity frame, and a leftover rotation rotates it twice. This is the one break that fails silently: nothing errors, the tool simply hangs off the flange sideways. Tools you authored yourself are untouched; if one was modelled along +X to match the old library convention, either re-express it with the new `base_frame` argument of `ToolModel` (`base_frame=Frame([0, 0, 0], [0, 1, 0], [0, 0, 1])`, the plane whose z+ runs along the tool's x+) or keep attaching it with the rotation you already use.
+* **`TargetMode.TOOL` targets against library tools moved 90 degrees.** The TCF's Z axis now runs along the tool's working direction, where its X axis used to. A target frame that was correct before now points the tool sideways. Re-author such targets so their Z axis points where the tool should point — which is what the mode meant all along.
+* **Analytical kinematics for UR robots returns different numbers.** Forward kinematics now reports the orientation of the `tool0` link (matching the robot model and PyBullet) instead of a version rotated by the never-applied `flange_frame`, and inverse kinematics interprets targets in that same corrected frame. Positions are unchanged; orientations are not. Frames and configurations recorded from the old solver — golden values in tests, targets tuned by trial and error, cached trajectories — have to be regenerated. Targets that were correct in `TargetMode.ROBOT` under PyBullet or MoveIt now work unchanged with the analytical planner too, which was the point.
+
+Requires `compas_robots >= 1.1`.
+
### Added
+* The `Tool From Mesh` Grasshopper component gained a `base_plane` input: where the robot's flange takes hold of the geometry, expressed in the coordinates the mesh was modelled in. Its Z axis points away from the robot, so a tool drawn reaching along world Z needs none, and a tool drawn along another axis is mounted by wiring a plane instead of redrawing the geometry. Backed by the new `base_frame` argument of `compas_robots.ToolModel`; nothing is baked into the mesh, so the plane can be re-wired at any time. The component also surfaces a remark when the TCP does not sit roughly on the tool's +Z, since that means the tool will point sideways once attached — the direction from the mount to the TCP is only a hint (it says nothing about roll), so it is reported rather than applied.
+
### Changed
+* The tools in `ToolLibrary` now mount along the +Z axis of their base frame instead of +X. Every planning group in `RobotCellLibrary` ends at a link whose +Z points away from the arm (`tool0` for the industrial robots, `panda_hand_tcp` for the Panda), so with this the same tool attaches to any of them with an identity attachment frame — previously each cell carried a rotation to bridge the two conventions, and a tool authored for one robot did not necessarily fit another. Their TCF states the tool's working direction with its own Z axis too, so a `TargetMode.TOOL` target aligns the tool along the target's Z — previously the TCF's X axis ran along the tool, which put every tool-mode target 90 degrees out. The tools are still modelled along +X internally and re-framed on the way out via `ToolModel.reframe_base`. The beams held by the gripper cells are authored in TCF coordinates and were re-authored to match, so they stay put. Poses are unchanged: the attached tools and workpieces of every cell land exactly where they did, only the tool's base frame is now the end effector link's frame rather than a rotated version of it. Requires the `reframe_base` support of `compas_robots >= 1.1`.
+* `MoveItInverseKinematics` now sends the target pose with an explicit `ik_link_name` (the planning group's end effector link, overridable via the new `"link"` option) instead of relying on MoveIt's default tip link for the group. The two are the same link for the robots in this library, but nothing guarantees that for a planning group configured with a different tip, in which case MoveIt would interpret the target pose at the wrong frame. `PositionIKRequest` gained the corresponding `ik_link_name` field.
+* `AnalyticalKinematicsPlanner` now honours the `flange_frame` of its kinematics solver, and the UR solvers (`OffsetWristKinematics` and its subclasses) declare one. Their DH chain ends at the robot's flange, whose x+ points away from the last link, while the planning group ends at `tool0`, whose z+ does — a fixed rotation apart. `flange_frame` was documented as the way to state that offset but was never applied, so the solver and the URDF model disagreed on the orientation of the end effector: every target was interpreted rotated and the robot never reached the frame it was asked for. Analytical forward kinematics now agrees with the robot model (and with PyBullet) to 1e-10, and a `TargetMode.TOOL` target is reached exactly.
+
### Removed
diff --git a/docs/backends/ros/files/02_set_robot_cell_state_attach_objects.py b/docs/backends/ros/files/02_set_robot_cell_state_attach_objects.py
index 62428b523..695c5e8d5 100644
--- a/docs/backends/ros/files/02_set_robot_cell_state_attach_objects.py
+++ b/docs/backends/ros/files/02_set_robot_cell_state_attach_objects.py
@@ -31,8 +31,10 @@
robot_cell_state.rigid_body_states["beam"].frame = Frame([1.2, 0, 0], [0, 0, 1], [1, 0, 0])
# Attach the gripper to the robot
+ # The gripper mounts along z+, same as the last link of the UR5's planning group
+ # ('tool0'), so the attachment frame does not need any rotation.
robot_cell_state.tool_states["gripper"].attached_to_group = robot_cell.main_group_name
- robot_cell_state.tool_states["gripper"].attachment_frame = Frame([0, 0, 0], [0, 0, 1], [1, 0, 0])
+ robot_cell_state.tool_states["gripper"].attachment_frame = Frame.worldXY()
# Set the robot cell state in the planner
planner.set_robot_cell_state(robot_cell_state)
diff --git a/docs/backends/ros/files/02_set_robot_cell_state_with_kinematic_tools.py b/docs/backends/ros/files/02_set_robot_cell_state_with_kinematic_tools.py
index 320009bd5..aa28540f5 100644
--- a/docs/backends/ros/files/02_set_robot_cell_state_with_kinematic_tools.py
+++ b/docs/backends/ros/files/02_set_robot_cell_state_with_kinematic_tools.py
@@ -1,5 +1,3 @@
-from compas.geometry import Frame
-
from compas_fab.backends import MoveItPlanner
from compas_fab.backends import RosClient
from compas_fab.robots import ToolLibrary
@@ -16,11 +14,12 @@
gripper = ToolLibrary.kinematic_gripper()
robot_cell.tool_models[gripper.name] = gripper
# Attach the gripper to the robot
+ # The tools in the ToolLibrary mount along z+, same as the last link of the UR5's
+ # planning group ('tool0'), so no attachment_frame (i.e. no rotation) is needed here.
robot_cell_state = robot_cell.default_cell_state()
robot_cell_state.set_tool_attached_to_group(
gripper.name,
robot_cell.main_group_name,
- attachment_frame=Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]),
touch_links=["wrist_3_link"], # This is the link that the tool is attached to
)
diff --git a/docs/backends/ros/files/03_forward_kinematics_target_mode.py b/docs/backends/ros/files/03_forward_kinematics_target_mode.py
index 0406e0c40..b154d6e58 100644
--- a/docs/backends/ros/files/03_forward_kinematics_target_mode.py
+++ b/docs/backends/ros/files/03_forward_kinematics_target_mode.py
@@ -21,11 +21,13 @@
# The default robot cell state already have the gripper and beam attached
# We modify the robot's configuration here to a specific joint configuration
robot_cell_state.robot_configuration.joint_values = [-2.238, -1.153, -2.174, 0.185, 0.667, 0.0]
+ # Offset across the tool axis: the TCF's Y, since its Z now runs along the tool
robot_cell_state.rigid_body_states["beam"].attachment_frame = Frame(
- [0.0, 0.0, -0.1], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]
+ [0.0, -0.1, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]
)
- # Note that the values for these frames are not the same.
+ # Note that these frames sit at different origins. The gripper works along its
+ # mounting axis, so its TCF has the same orientation as the PCF.
print("Robot Planner Coordinate Frame (PCF) relative to the world coordinate system (WCF):")
frame = planner.forward_kinematics(robot_cell_state, TargetMode.ROBOT)
print("- {}".format(frame))
@@ -44,7 +46,7 @@
>>> Robot Planner Coordinate Frame (PCF) relative to the world coordinate system (WCF):
>>> - Frame(point=Point(x=0.300, y=0.100, z=0.500), xaxis=Vector(x=-0.000, y=-1.000, z=0.000), yaxis=Vector(x=-0.000, y=-0.000, z=-1.000))
>>> Tool Coordinate Frame (TCF) relative to the world coordinate system (WCF):
->>> - Frame(point=Point(x=0.350, y=0.100, z=0.500), xaxis=Vector(x=1.000, y=-0.000, z=-0.000), yaxis=Vector(x=-0.000, y=-1.000, z=0.000))
+>>> - Frame(point=Point(x=0.350, y=0.100, z=0.500), xaxis=Vector(x=-0.000, y=-1.000, z=0.000), yaxis=Vector(x=-0.000, y=-0.000, z=-1.000))
>>> Workpiece's Object Coordinate Frame (OCF) relative to the world coordinate system (WCF):
->>> - Frame(point=Point(x=0.350, y=0.100, z=0.600), xaxis=Vector(x=1.000, y=-0.000, z=-0.000), yaxis=Vector(x=-0.000, y=-1.000, z=0.000))
+>>> - Frame(point=Point(x=0.350, y=0.100, z=0.600), xaxis=Vector(x=-0.000, y=-1.000, z=0.000), yaxis=Vector(x=-0.000, y=-0.000, z=-1.000))
"""
diff --git a/docs/concepts/05_robot_cell/files/01_ros_robot_cell_with_tools.py b/docs/concepts/05_robot_cell/files/01_ros_robot_cell_with_tools.py
index 798c65057..b879c8210 100644
--- a/docs/concepts/05_robot_cell/files/01_ros_robot_cell_with_tools.py
+++ b/docs/concepts/05_robot_cell/files/01_ros_robot_cell_with_tools.py
@@ -31,7 +31,9 @@
robot_cell_state = robot_cell.default_cell_state()
# Modify the tool state to attach the cone to the robot
robot_cell_state.tool_states["cone"].attached_to_group = robot_cell.main_group_name
- robot_cell_state.tool_states["cone"].attachment_frame = Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0])
+ # The tools in the ToolLibrary mount along z+, same as the last link of the UR5's
+ # planning group ('tool0'), so the attachment frame does not need any rotation.
+ robot_cell_state.tool_states["cone"].attachment_frame = Frame.worldXY()
# Specify the link of the robot that the tool is allowed to collide with
robot_cell_state.tool_states["cone"].touch_links = ["wrist_3_link"]
# Move the robot to a different configuration
@@ -62,7 +64,6 @@
robot_cell_state.set_tool_attached_to_group(
gripper.name,
robot_cell.main_group_name,
- attachment_frame=Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]),
touch_links=["wrist_3_link"],
)
# Specify the location of the detached cone tool
diff --git a/docs/frontends/ghpython/files/03_build_robot_cell.ghx b/docs/frontends/ghpython/files/03_build_robot_cell.ghx
index 622cc37b5..60e59dd23 100644
--- a/docs/frontends/ghpython/files/03_build_robot_cell.ghx
+++ b/docs/frontends/ghpython/files/03_build_robot_cell.ghx
@@ -50,10 +50,10 @@
-
- -90
- 213
+ -149
+ 279
- - 0.6275781
+ - 0.502582
@@ -78,7 +78,7 @@
- Robert McNeel & Associates
- 00000000-0000-0000-0000-000000000000
- Grasshopper
- - 8.32.26160.13002
+ - 8.33.26188.13002
@@ -86,7 +86,7 @@
- Robert McNeel & Associates
- 00000000-0000-0000-0000-000000000000
- Grasshopper
- - 8.32.26160.13002
+ - 8.33.26188.13002
@@ -108,7 +108,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABsElEQVRIDbVVzU7DMAxOV56CI9DRjis3eAJOE4ynAGlXhpAQEgKuk+ApGGgn3oAb4kjLChx5i9HlM3WVBHddN2Ypc+Kfz7G9xkotmTwTP8uyjj5304+vnfF4bOlMO2nv+34WbKw9a13f87wB2xQgGvwqeU97rFiEh5vBtQ5yCowV/ODmAL9Lv9WtXiYdB6vqSC+JSu2V6mnMV2TSyB274C64BFolMzAIk0o0Sj9/UPPo6YX8473tKhxRb/qjJ81gvUEZ1G2oiO4IGZN64OjE41ucqPuHodpqhaoV/S7R0BFaAdBQiS4ubxQCgJgfHrRVZ79tmUv+1IM4GWWWpXEYPA7p5hCdn51QAGQCQiaQlVEUNj0rA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8ug5DBzALPe5r4EtxBXBuCSoBdMKBWIdSyXeGWT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjetw11/ZFDZgzoBJFsKgIdJUi4iY0z60DCJ9DzYZUBOFee684Ax8ummuER9BmODebnxHhEmNRlgyxqZRYA8yL8P/XkrMbPfBNULvFi5msP0AAAAAElFTkSuQmCC
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABsUlEQVRIDbVVzU7DMAx2pz4FN2CFbly5wRNwmmA8BUi7MoSEkBBwnQRPwUA78QbcEEda6IAbT1FR8oW6SoK7rhuzlDnxz+fYXmOiBZNn4mdZ1lXn3vj9cytNU0tn2kl73/ez5uryo9INPM8bsk0BosAv4tekz4p5eLgeXKogx8Dw8YObA/wm+aJrtUw6DJboQC2JSu2J+grzGZk0csceuAsugVbJDAyNqUuUjD++UfPWw5P2j3Y2q3BEvemPngTNlYbOoG5DRXRHyJi6B45OPL5EMd3ejWijHVK79btEQ0doBUBDJTo7vyIEADHf3+tQd7djmUv+ugdR/JZZlsZheD/SN4fo9ORIB0AmIGQCWRm1wjXPykAyZDDokAlAmTgbPkuc/6aSzpKhJCCA8t4yKDlMHcCst7kvwS3ElQG4JOgFE0oFYh3LJV7ZZDiZjWYQgKNUk4L8aTLeFpD79nBJ0PBJwJK/lYH5qfNN63DXHxlU9qBOAMlWB8DDJCnnkTGm/tAwidQ82GZAThXnuvOAMfLpRlyiAYOxwazceI80pm4ywBY1MosAeZB/H/qzVmJqvx+vzbxSXiOWzgAAAABJRU5ErkJggg==
- e3ecf34e-b507-4e7a-b64b-25f7eb105fc0
- true
@@ -125,7 +125,7 @@
-
+
-
2003
144
@@ -136,7 +136,6 @@
2090
196
- - true
@@ -172,7 +171,7 @@
-
+
-
2005
146
@@ -183,7 +182,6 @@
2041.5
156
- - true
@@ -212,7 +210,7 @@
-
+
-
2005
166
@@ -223,7 +221,6 @@
2041.5
176
- - true
@@ -251,7 +248,7 @@
-
+
-
2005
186
@@ -262,7 +259,6 @@
2041.5
196
- - true
@@ -290,7 +286,7 @@
-
+
-
2005
206
@@ -301,7 +297,6 @@
2041.5
216
- - true
@@ -329,7 +324,7 @@
-
+
-
2005
226
@@ -340,7 +335,6 @@
2041.5
236
- - true
@@ -368,7 +362,7 @@
-
+
-
2105
146
@@ -379,7 +373,6 @@
2154.5
158.5
- - true
@@ -407,7 +400,7 @@
-
+
-
2105
171
@@ -418,7 +411,6 @@
2154.5
183.5
- - true
@@ -446,7 +438,7 @@
-
+
-
2105
196
@@ -457,7 +449,6 @@
2154.5
208.5
- - true
@@ -485,7 +476,7 @@
-
+
-
2105
221
@@ -496,7 +487,6 @@
2154.5
233.5
- - true
@@ -552,7 +542,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACXElEQVRIDbVVz0tUcRCffe1hH+2G1iHoWutqp4qQIAWxTp2kXIIuXQUFPVYE3uqaYOApECSQtfQfKILqkIfqULrrFqFEUGEGarvha1/zmd35+n3Pd1DfOrD7ne/8+MzMd77vO0QHTAkb3/f9ft4PL5U/X6zVagGdbRfFO47jt2VPvmbdWCKRmFEbA8Lg94ql8m1VxFnbc9n7HOQOMCQAMmfwQhzQsC8HyaMSp6EYDhs0YS+YUkFp6RMfef3MNzY26fF0gd6+e7+nGOfOnqEb1/OUTh8WP/Qk13bKkQoUHBqAP3v+gsjnzR5+8IGvkmImVaArMm9tbaGJ8Qcq2tU6MDgSWbX2gBYWizTzdI6q1Wo98wjYh+VvdPNNKUJD5Hme+ALDJlNB4cmcBIFya8uzbQw/zgFA87/WqfNoxsjBVDgxBAHOx4Uijd69JXpTAQT5a33kuilyU6mAMzbIXsnmVZZJp8UXGPgpmQAQ9F/toxSDJ5OmMLUjZD+UPUGdx4KZGwNm4AuM0x3tRhwIYKQhZvTDskimln/Qplej+dV1ml75GbKK3poAgSaHbN1DdbPLx1uo44gr2tmvqwEr71+MJk9++S7HM8hHBFr581eqsCNUKvtsMm4MSMHDvCj5L5PZZ5NxHScv5BRHVsgWr5wPyLCJavKO64I3BZ/9wNBI4IN7ZMOZR35buLb2my719mwLGpwEwMOkbwceLJA8dhFADb8dC8DVF0pgYhUIngcveR50QdAs4nnwiudBt17TsWYBWziCKQEweTDmLGUstjEyZS4HTvkghn6sTHfj/B/RXwWUJQ405QAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACW0lEQVRIDbVVzUtUURQ/48xiHs6E1iJoWU1qq4qQQIOoVq2kHII2bQUFXVYE7mqboNBKEEKQ0fIfKIJqkYtqUTo2faBEUGEGajPhG1/nd5xzvff5FuobD8zcc8/H75xzz333EO0zJWz8IAi6ed9f+vSlo1qtOjrbLopPJpNB7vjRV6wbSiQSk2pjQBj8XnG+dFsVcdbWltx9DnIHGBIAmTN4IQ5o2JeD5FFJQ03RHzaow14wpYKPpc8beuarq2s0PlGgN2/f7SrGmdOn6Mb1PGUyjeKHnpzIHWuQChQcGoA/ffacKODNLn7wga+SYqZUoCsyb25uoofDD1S0o7WndyCyau0Bzc4VafLxNFUqlc3MI2BHSt/p5uv5CA2R7/viCwybTAWFqWkJAuX6um/bGH6YA4Bmfq9Q+8GskYMpc2IIApwPs0UavHtL9KYCCPLXusjz0uSl044zNsheyeZVls1kxBcY+CmZABB0X+2iNIOnUqYwtSNk35c7Qu2H3MyNATPwBcbJtlYjdgIYaYgZfL8gkkcLP2nN36CZpRWaWPwVsoremgBOk0O2XnLT7PLhJmo74In2ybclx8qvxmjy2Ncfcjy9fESgxb//pAo7Qrm8xybjxoAUPMyLkv+y2T02Gddx7FyL4sgK2dyVs44Mm6gmb7sueFPw2ff0DTgf3KgNZx75LeHy8h+6dPHClqDGSQA8TPp24MECyWMXAVTz27YAXH2hBCZWgeB58ILnQScE9SKeBy95HpzXazpUL2ALRzAlACYPxpyljMXWRqbMZeeU92Pox8p0J87/Aa+rBZGCER/uAAAAAElFTkSuQmCC
- 437b5bd6-da2a-464e-9bec-b8311f38cc2f
- true
@@ -827,7 +817,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABv0lEQVRIDWNgoDFgRDb/////IUB+/q3bd63//fuHIoesDhubiYnpv5qq8lGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5IPoNes2gDG6YjL5YDPBPrh56w4wyP8xhkcngM1auXQBmKaEAMWJupoKE9gH6BHa2NJBsU9gZsKCCMWx167fQOHj4+x+8Z4BhHEBrBaAFK9eu4EBFGSgeMEFQAbnnbsLxrgsQbEgNDgAl1kExbc/f4dVDTiSr9+49R+rLBZBUPBpaWrAZdY+fsPQdeMxw6fffxmmmagwOIoJwOU0NdQYUXwAl8HBABkOSgAgDIunYFkRhg59RbCOiov3GdYALUQGRPkAFA+gOEEH9TUVcN8Unr/HsAMaTJOMlBlcJQQZSPYBugXIQeUlKYguDeYT5QOYTlgQgQwGJQhkC0BqYCkJ5HoQAPmAJAtAmtAjGSSGC5AVROiuxmU4TJykVATTRAoNtgBUMJGiiRi1MDPBFkBrImL0Ea0GZiYsiCYSrZN4hWAzwRaAah5QNUe8XvwqoVUmuF4GJ1OYclpU+jCzaUYDALUcqb2TIfgBAAAAAElFTkSuQmCC
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvklEQVRIDWNgoDFgRDb/////IUB+/u0796z//v2LIoesDhubmZn5v6qK0lGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5IPoNes2gDG6YjL5YDPBPrh1++4/UJiHRyeAzVq5dAGYpoQAxYmaqjIT2AfoEdrY0kGxT2BmwoIIxbHXrt9A4ePj7H7xngGEcQGsFoAUr167gQEUZKB4wQVABueduwvGuCxBsSA0OACXWQTFtz9/h1UNOJKv37j1H6ssFkFQ8GlpasBl1j5+w9B14zHDp99/GaaZqDA4ignA5TQ11BhRfACXwcEAGQ5KACAMi6dgWRGGDn1FsI6Ki/cZ1gAtRAZE+QAUD6A4QQf1NRVw3xSev8ewAxpMk4yUGVwlBBlI9gG6BchB5SUpiC4N5hPlA5hOWBCBDAYlCGQLQGpgKQnkehAA+YAkC0Ca0CMZJIYLkBVE6K7GZThMnKRUBNNECg22AFQwkaKJGLUwM8EWQGsiYvQRrQZmJiyIJhKtk3iFYDPBFoBqHlA1R7xe/CqhVSa4XgYnU5hyWlT6MLNpRgMAj96pt4FfdZEAAAAASUVORK5CYII=
- 08fba69e-6e56-4d64-b53e-bdf9e7e5b6e7
- true
@@ -1223,7 +1213,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDbVV3ytDcRQ/95qRH5skpHlhP5UkHggJb54W27O8Sau9ovbKs1ry5g8wUl5kSWJ44MXDbDORJGkPSBJ2r+859p1t7uwOO3Xv93vPj8/5fs75dg9AgUVIxZdl2cG+3ZGz8x5JktJsqX5Ke1EUZbOpOcBs84Ig+LhPEoSBz4bCZ9Pc8JfVajHNsSQziEEJ8OQMfPkvoJmxLIkTmYgJgzvT4R++CZMYhCNRVvL8ap7rANgTi9koEoNc4L7VNcAnH+GYGjVByyuf4I4Ruxr3NB/egzTlf34UPIGqEsW1pb8mRbfoNBSRlRC27+7BG7mB4OMzmVt0ZeAyN8BAbZWS+zedzWoWspYIwSePogRecXsN+GAi1KFNrWRNgCdH8XYYwXC4BY37ftqTLmEjhxwvxR48vL3TabtrdNCqL4eQfYxgvB4PVHQNQRAM4BifgKLXlyS8c9QOStc4KwMeGZe/2iPIElerXhUZ6Is1gA09iD0Sk53BNljf2ARfdR081RugSSuCb2lRVZKsDPC2oLiOozB1cgGBBhNc9g+TTvKvQ/A0RPtcL2KAPyb+7+ABeBUXOo10TZEJCrJqj11BvLIEWmxW7qq4IiYa+DzYZfOgV9GTKbHpKFg6tcLmwR6bB328RPM/BSJwPuAJLMKkBDh5cMz9lCQfW2Jk0lymEvHgQgx9jl2w9QOYn7dbu7ZRPAAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDWNgoDFgRDb/////IUB+/u0796z//v2LIoesDhubmZn5v6qK0lGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB7du3/1HapgTcgAoTtRUlZnAPiBk+Jp1GxhAmBQAM5OFGE2r10IMDwkKIEY5ihpYHKAIUpNDcwuICqK/bBxkewqciq7fuPUfmwn7X31gmHLrGcO1T9/A0lp8XAw5alIMjmIC2JRjiGlqqDHiDCKQ4Vln7oAN53nxhAGEQRaBxEByxAKcFoBcDgJTjFUYZE7sZZA9thvMBotB5cAKCBBY4+Dj7z9g11qK8DHo8nMz3AiIBxszpbaWgcfCmeEagwxDSGIGA/OvH3DjQ4MDGLAlY5w+gOn8+x8RPYz//8GEiaax+oCflYUBFKHH33wC++Sgkz7D5h27GNYIiTN8kZBhUGJjYlgzfwZRluD0ASi1gEDO2TsMFZfuMxyVUmV4YO8FFvu3ezPDtes3wGxCBNgHoIIJVnbANICS4jQTFXAyBfkEBEC+MnzziOEvLzuDlqYGTClWGmQmSAJWHxwG1gc2WFUCBUGRDgKgoCMWAOuDI8D6wBYWRBPxaQQZTIrhULPAZoItANU8oGoOnyWkyEGrTHC9DA4imGZaVPows2lGAwB267dY+cyKeAAAAABJRU5ErkJggg==
- 2daad94e-cced-4d4a-8811-bf6652f839d9
- true
@@ -1661,7 +1651,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACO0lEQVRIDbVVPU8bQRDdOxAFKCBBlxb8CRUKKFLgP1jBFkUK0huJlkSREBJKUmIJ+qRIEfEh06ZNkIwLqPBnKKHCNC6QouDLvD3Pebxn3zmFRzrv7czb92Z29rxKDdksye84TprmW7X6zatWq9UVk7he77ZtO9HI7DnFcpZlHTPGIyHyj5Vq/R0H5FgqV9TRSV7NJ+MqmXAfGTff47HIJxJ5D78WQOZEfmQCMT8+zWtyGcuspVT6dUq6fO8kkkElLPCTBFYkClnv7n32XDsfthVXws4gIRL4RQKrWqBa+01b3r3n62/eah5sCYgwwkzh79++wO0z9CQWnbNHETHJJZoJIQJDLwYx5rTDwJIY5KgE2zWohQqgmXIbQM7bNYhIqABOkWm9fCaG57rJ5UrNYQePvY4nYsgefYEFnSLEE/Go1VcAAFgvIYjIk+Ui/b8Q0KfIH+p4+IO6LnWy/p8e9K2g+NDUKsvTzzpq4i0sDqivgsP6nTqgx7TNyHPV+PNXLUyNq7Pbhio2XHGJAyZLj2neFiEjJl+ecbNG9vCxnxfLONZBEJglWmdW7AnwYjMTzurFjys1Zltqf3G2iyRLC/tVDk6fAAuZ48SI+8mYGZo4c64F8MdEAd1wXfJF1cOZhIgj4zBrc7oV4CYq3F/qv2uzgTzH9sA2Ch3xIJH27eZtUY4yXfn6MqbXyKw5W240Goy+SAyqgkkfTXPwuWnRS9CVCWCt+aieHEclJscxDTTflcnoYVz6zD208R9Sfv3UuEKitQAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACPUlEQVRIDbVVPU8bQRDdsyMKUIgEXcoQ4w+oIkCRYv4DCiCKFKEHiZZEkRASCpRYIn1SpIhwImhpAfFRQBVsbKBLGmQaF5GimGPenuc8nrPvnMIjnfd25u17Mzt7XmO6bI7kd113huZL5aubV7VarSkmca3e4/G4m3j+7JBiOcdx8ozxSYj8Y/Gy/I4DcrwoFM329x0zkkmZTNp7ZFy/p5KJdRJ5D78VQOZEvq2BmOd/7FhyGZudnjIzr6ekK/BOIrOohAX2SSArUch6dW3Dd618WDZcCTvDhEjggAQmrUCpfH2v93zuzbzlwZaACCNMC3/7+hnugKEnw4mh2CNENLlEMyFEYOhFJ8acsSiwJAY5KsF2dWqRAmim3AaQ83Z1IhIpgFOkrZVPY3hum1wollx28NjqeCKG7NEXWNgpQjydGnbaCgAAayUEEXmyPGTwFwL2FAVDDQ9/UD8vGln/Tw/aVnB6V7UqEwOPG2riLSoOaKCCT+XfZosebYuJp6by958ZfdJrdn9VzGnFE5c4YBbo0eZvETJi8olBL2tkDx/7ebGMYx0EgRmndbpiX4AX60w4q7G9c9MTc8zmi6EmkgVa2K5ycAYEWEiPfXHvk9EZapyeWwH8MVHANtyWfHLp4zQh4sg4yuqcXgW4iY5uz+zftW4gz7E9sLfHDfEwkfrt5m9RjjLNfnmZtGtk1pwtNxoNRl8kBlXBpI+mOfi8tOgl7MoEsFT9Y2qua9L9vZiGWuDKZHQ3Ln3m7tr4ACmJ/cyE62ybAAAAAElFTkSuQmCC
- 17a19208-b966-4839-8eff-7362056dba89
- true
@@ -1832,7 +1822,7 @@
- 1
- 2
- true
- - 0c26d40b-ce02-4863-b88a-6713fa7abfbb
+ - 0bd56e73-ac52-4472-8e49-534eb360ae0a
- 1
- Optional list of ToolModels to register into the cell. Each is keyed by its `.name`.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
@@ -2165,7 +2155,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCklEQVRIDbVVzUsCQRR/u4WBYZ8HI6gOYhZ0ioog/4MIkaxr10DBrvUH1FXBoGuXiApCokv3wDzUNZUOGUVCZuAhiHKbN+7bZscdLcgH68z7+v3em7frALRZNBHfMIwI0+P5wt1CrVaz+cQ4p72u68a433fJfElN004oxgJh4Nu3ucImOXA9OjmF51JJNFn7sdERCC0tWrq4mQj4dxjJFto4AVbOwI/FoPTZORwc2kyim++XwyFYjYQb7GhgJCvYSafpjctRxeIDN+2lErKL6+uxDWV3ZgJi1gnwzB1RTGN/f5/NXam82XQnhTB1dP51oE6Aso0wOYHs/E+97QQ05KZF/+bMVQBKAq/Xy3PwbVEJfgutREmA73dXlwvuzddVBhpiBag+NDFWSYBBvwEQwZz2yiFnX6uAj0pa+SnP1sFu4QlS7JEl5h+G8scnTPW6If1Yhmy5kRhjouyRxSLAigh8btDD4+YGPNxGdkoW/bwTRogxsywPc0SxCMgoV0JVzVzcgEvXIDHts4FEWaKqc8RsICAiee3uqI9LrlCOk3VOgJcFc/C/bt7yVc6KkwHRjxW3EhOz3gHeRJmX6yAmyQMkHY8HZS3zQ84Nih/zdrOOKMkqDe7PB3i4WDVVS4PGAeNcxBjsCkW0MTWJtqZXJgaQ5Kvv8GUYMNnjJpNybbgyKbIdlz5ht239BvrNw7Lbs78cAAAAAElFTkSuQmCC
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACC0lEQVRIDbVVO0sDQRCey0kExUe0iAgqqCEKVqIimH8gEoKP1lZIILb6A7RNIIKtjYgGJIiNvagptDVGBBVFkahgIYjh3NncnHt7t0kEb+CyO6/vm9m5ywJ4LJqIbxjGHNOTxeubqXK5bPOJcW57XdeN0GD/MfOlNU3LUowFwsDXLgvFFXLgupvdh6fnZ9Fk7ft6eyA6M23p4mYoHFpnJKto4wRYOQPfE4NyB4ewvWMziW6+n41FYWEu5rCjgZHMYycNpjcpR93d3XPTZiYlu7i+lFhWdmcmIGaFAM/cFcU0BgLtNvfb27tNd1MI04fOvw7UDVC2ESYnkJ3/qXtOQEOuWnQ9Z64CUBIEg0Geg2+LSvBbqCVKAny/Gxv9cGu+rjJQFytA9aGJsUoCDKoHQARz2yuHnH/9AHxUUstPebYONoqPkGGPLIlQN5S+vmGkrQlyDyXIl5zEGBNnjywWAVZE4BOdLTxuoqOF28hOyaKfd8IIMWac5WGOKBYBGeVKqKqxowvw+zRIjQ7YQOIsUdU5YjoIiEhem/XKuOQK5ThZ5wR4WTAH/+vmLZ8VrDgZEP1YcS0xMSsd4E108nIewSR5gKTj8aAsnv6Sc4Pix7zdrCNKs0ojW5NhHi5WTdXSoHHAOBcxBrtCEW1MTaOt6pWJASRXH59QNgwYbm0ik3J1XJkU6cWlT9ierT/70sOwbr1lsQAAAABJRU5ErkJggg==
- bc8a002f-cbef-4901-a35d-a64883a911b7
- true
@@ -2495,7 +2485,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACKklEQVRIDbWVTUtbQRSGTy7dZeOi9qaL2IUfiaZtkIqkaP9CCTHBrZQiFAWli9IUS3d1JwYsBSnubVSkf6EVxaUazYcummwS40IX2SbOe5K5nYS5qTeSgZk5c86Z571zBu4Qdbm5VH6tVouK9UI2dzFRrVabYmqezjYMozY02L8nYgmXy7UlcyyIgH9NZ3JxGbjP7PcNLguRT2CwAL5cwJOt0P2DQzo6PmH36GiQxsdetKbYroVIDCeRAr+FwKSavbP7izaTO6qLpmMRioRfN/nsFkLgjxB4xQKZ7Lko+b+aVyoVejM7Rx7TpPeL88xYWV2jYqlEG+vfyO1223EtP+7ENzRgGPCocKxLl2VM9DQwTE/6vNxho8kYL9oMkvlAl2M+6mX3SeqM/uYLlg1Dxth5h0ErgBKg3riDD/HPFga+u5TH2iAMrQAScJmPPR76vv6D89/NvqWXoXG2nQx8B3YbALzxPadrf7AjOLi2J0DwZ75M2WchmLRVuKKo9yHbTgatwOlZmtBT1xUyyzfMOy5miHrcFI2EnfD1J0hu77IASGYDlxYzeuo0TV+WPja8/5+0dxAY8Vs7Y1NhQh8ZrvvUmJXUxtCWSMIwy5Ikt2cYI9dtmE0hWwHA5V1gRsNJnDZtiVQY7gMdzenXYw8L4MeEhdpwAnkK+J1+vWSyQOMlUvlsO4WqAMmUd5AQwab3AMk4gRTpoDxg1l80GF19MiGA1o1Hv07u4ngLeKXBZ/oKpBEAAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACJklEQVRIDbWVz0tbQRDHJ6a3XDyoLx5UUFPjr4ooIaL+CxLSBK+liCAWFA9Si9Kb3kRBEUS8a1TEf0FF8WgSjaYWqhfTeNBDjjHd7yT72Mi+6LNkYXdnZ2Y/37c78JaozM2h8nO5XEisJ5K/fvdns9mimJqns51OZ87T3HgsYssOh2NH5pgQAZ9PXCVnZOB/Zm+LZ0GI/ACDBfDlAh55CT05PaPzaIzd3d1d5OvteZliuRYiYZxEChwKgQE1e2//gLYie6qLhsNBCgaGinxWCyFwJAQGWeA6efOs3nkmk6Gvo+PkNgyamvzGjMWlFbpPpWhzfZVcLpcV1/SjJh89TRUV8KhwrFN/05ioo72VGurruMNGkzFelBgk84Mux6ipZncsfkl/bu9MG4aMsfMNg1YAV4D7Rg2mZ+ZMDHxvuR5zgzC0AkhAMWvdblpb3+D8sdER6vP72LYzcA2sNgD41PKJHr1d74KDa3kCBLdv03Td6YdJO3cPFKqrYtvOoBW4uEwQevwxQ0b6iXnR+yuiSheFggE7fP0JIrv7LACSUcAlxIwev0jQz9nvBe/rk7YG7W1ec2f4c4DQ21rzPjVmJpUwtFckYZjllUR2vzBGrkswi0KWAoDLWmBGw0nsNu0VqTDUAx3N7tdjDwvgx4SF2nACeQr47X69ZLJA4SVS+WzbhaoAyZQ1WBbBovcAyTiBFHnH9YCZf9FglPXJhABaOR79PLmM4z9TZ8Fh8nXMxwAAAABJRU5ErkJggg==
- 7b338da0-dca2-40c1-a9fe-ef6c978d06b2
- true
@@ -2972,7 +2962,7 @@
-
- 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
+ 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
- 6
- 00000000-0000-0000-0000-000000000000
@@ -2988,408 +2978,128 @@
- - c9b2d725-6f87-4b07-af90-bd9aefef68eb
- - COMPAS FAB: Tool From Mesh
+ - 59e0b89a-e487-49f8-bab8-b5bab16be14c
+ - Panel
-
-
- - true
- - 2
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABsUlEQVRIDbVVvUoDQRDeO30AIaJtwPxpbWcEfQPRpPURTKsiiCBqJeQNbCwkUXwHtbPW/FlZ2KmNoM2d+42ZZb3bvdsjyRbZ2Z1vvm9mltwIMeHl6fxhGNbkudHrv6wEQfDPp+NMtu/7Yam48CB9Tc/z2oxRJJL8pNPt77FjlL1SLp5KkX1wkAAyl+StUUijsVKkjkr8oaMRBYzhTJxUQbc3kC3P1vO0BPAm5VLBnwYwSn50fCaenjtpHMp/eLArlhYr6gyDOblFygniLOQq0GLEBJBJNBvEIsv61kaMBncmPANjAnCYiNC21vUtxznvRgG9ClN2fIdEapvxqnR1owAAehVXlxe4ogWb3yiNHAFWAa4i+ujtm7826QmQsuXHKgA8k+i9Z9sle3AkCuhVAMyLhfmctCcKINBE5po94umfDMO2UAVEzt++xNTPt9jJ52xQ432qAKJy1TXx8TgggtnlgpHIdkkC+DDxt8MEXJ+bEdv5efH6/ilguyxwAsfz4E7Og6pLoCtGzoN7OQ9W+ZGbroEZcMRJApg8GHMZghOhw5FJc1nNZERMYugnZjIO5y+SaI6beOV7vAAAAABJRU5ErkJggg==
-
- - 83b96250-454d-4bd9-88a1-ea599d5391b2
- - true
- - false
- - true
- - COMPAS FAB: Tool From Mesh
- - COMPAS FAB: Tool From Mesh
- - 3
-
- - false
- - false
- - false
- - false
+
+ - A panel for custom notes and text values
+ - 005fbb2a-8d9c-47ba-a343-2c44624eec15
+ - Panel
+
+ - false
+ - 0
+ - 0
+ - gripper
-
+
-
+
-
- 482
- 301
- 167
- 84
+ 241
+ 304
+ 53
+ 20
+ - 0
+ - 0
+ - 0
-
- 573
- 343
+ 241.09781
+ 304.7948
-
+
- - 4
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 1
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ -
+ 255;255;250;90
+
+ - true
+ - true
+ - true
+ - false
+ - false
+ - true
-
-
-
- - true
- - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`.
- - 7029b4ed-6f8b-4319-b317-5c7038cc54ba
- - name
- - name
- - true
- - 0
- - 2
- - true
- - 005fbb2a-8d9c-47ba-a343-2c44624eec15
- - 1
- - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`.
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
-
-
-
-
- -
- 484
- 303
- 74
- 20
-
- -
- 522.5
- 313
-
-
-
-
-
- - System.Private.CoreLib
- - System.String
-
-
-
-
-
-
- - true
- - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided).
- - 06535f11-3e58-4cee-b2fe-053484f6e646
- - visual_mesh
- - visual_mesh
- - true
- - 0
- - 2
- - true
- - 548b96ae-d6b1-4cfa-a8f2-865e9d100241
- - 1
- - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided).
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
-
-
-
- -
- 484
- 323
- 74
- 20
-
- -
- 522.5
- 333
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
-
- - true
- - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`.
- - 37ce7642-a02f-4c34-a272-f8b8a636f702
- - collision_mesh
- - collision_mesh
- - true
- - 0
- - 2
- - true
- - 548b96ae-d6b1-4cfa-a8f2-865e9d100241
- - 1
- - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+
+
+
+ - 4f8984c4-7c7a-4d69-b0a2-183cbb330d20
+ - Plane
+
+
+
+
+ - Contains a collection of three-dimensional axis-systems
+ - 54d29d93-0a34-4b7d-aa5d-ecd9d4daa196
+ - Plane
+ - Plane
+ - false
+ - 0
+
+
+
+
+ -
+ 244
+ 363
+ 50
+ 24
+
+ -
+ 269.66293
+ 375.1797
+
+
+
+
+
+ - 1
+
+
+
+
+ - 1
+ - {0}
-
-
-
- -
- 484
- 343
- 74
- 20
-
- -
- 522.5
- 353
+
+
+
+
-
+ 0
+ 0
+ 0.24076616764068604
+ 1
+ 0
+ 0
+ 0
+ 1
+ 0
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
- - true
- - Tool Coordinate Frame in the robot's `tool0` link frame, as a Rhino Plane or COMPAS Frame.
- - 5aabe885-38a2-489a-8206-4bae1c24541c
- - tcp_plane
- - tcp_plane
- - true
- - 0
- - 2
- - true
- - 54d29d93-0a34-4b7d-aa5d-ecd9d4daa196
- - 1
- - Tool Coordinate Frame in the robot's `tool0` link frame, as a Rhino Plane or COMPAS Frame.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
-
-
-
- -
- 484
- 363
- 74
- 20
-
- -
- 522.5
- 373
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
-
- - false
- - ToolModel.
- - 0c26d40b-ce02-4863-b88a-6713fa7abfbb
- - tool_model
- - tool_model
- - false
- - 0
- - 2
- - true
- - 0
- - ToolModel.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
-
-
-
- -
- 588
- 303
- 59
- 80
-
- -
- 617.5
- 343
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
-
-
-
- - true
- - false
- - true
- - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDb25zdHJ1Y3QgYSBUb29sTW9kZWwgZnJvbSBhIFJoaW5vIG1lc2ggYW5kIGEgVENQIHBsYW5lLgoKYHRjcF9wbGFuZWAgbWF5IGJlIGEgUmhpbm8gUGxhbmUgb3IgYSBjb21wYXMgRnJhbWU7IGl0IGlzIHRoZSBUb29sCkNvb3JkaW5hdGUgRnJhbWUgZXhwcmVzc2VkIGluIHRoZSByb2JvdCdzIGB0b29sMGAgbGluayBmcmFtZS4gSWYKYGNvbGxpc2lvbl9tZXNoYCBpcyB1bndpcmVkLCBgdmlzdWFsX21lc2hgIGlzIHJldXNlZCBmb3IgY29sbGlzaW9uCmNoZWNrcy4KClRoZSByZXN1bHQgaXMgYSBzdGF0aWMgKG5vIGpvaW50cykgYFRvb2xNb2RlbGAgcmVhZHkgdG8gZmVlZCBpbnRvIGEKYExvYWQgUm9ib3QgQ2VsbGAgY29tcG9uZW50J3MgYHRvb2xzYCBpbnB1dC4gS2luZW1hdGljIHRvb2xzICh3aXRoIHRoZWlyCm93biBqb2ludHMpIHNob3VsZCBiZSBsb2FkZWQgZnJvbSBVUkRGIGluc3RlYWQuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IHJoaW5vc2NyaXB0c3ludGF4IGFzIHJzCmltcG9ydCBTeXN0ZW0KZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IEZyYW1lCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCB3YXJuaW5nIGFzIGdoX3dhcm5pbmcKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IG1lc2hfdG9fY29tcGFzCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKZnJvbSBjb21wYXNfcm9ib3RzIGltcG9ydCBUb29sTW9kZWwKCgpjbGFzcyBUb29sRnJvbU1lc2goR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgbmFtZTogc3RyLCB2aXN1YWxfbWVzaCwgY29sbGlzaW9uX21lc2gsIHRjcF9wbGFuZSk6CiAgICAgICAgaWYgdmlzdWFsX21lc2ggaXMgTm9uZSBvciB0Y3BfcGxhbmUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZnJhbWUgPSB0Y3BfcGxhbmUgaWYgaXNpbnN0YW5jZSh0Y3BfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZSh0Y3BfcGxhbmUpCiAgICAgICAgY192aXN1YWwgPSBtZXNoX3RvX2NvbXBhcyhycy5jb2VyY2VtZXNoKHZpc3VhbF9tZXNoKSkgaWYgdmlzdWFsX21lc2ggZWxzZSBOb25lCiAgICAgICAgY19jb2xsaXNpb24gPSBtZXNoX3RvX2NvbXBhcyhycy5jb2VyY2VtZXNoKGNvbGxpc2lvbl9tZXNoKSkgaWYgY29sbGlzaW9uX21lc2ggZWxzZSBOb25lCgogICAgICAgIGlmIGNvbGxpc2lvbl9tZXNoIGlzIE5vbmU6CiAgICAgICAgICAgIGdoX3dhcm5pbmcoZ2hlbnYuQ29tcG9uZW50LCAiTm8gY29sbGlzaW9uIG1lc2ggcHJvdmlkZWQ6IHRoZSB0b29sIHdpbGwgYmUgdmlzdWFsaXplZCBidXQgaWdub3JlZCBmb3IgY29sbGlzaW9uIGNoZWNraW5nLiIpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgcmV0dXJuIFRvb2xNb2RlbCgKICAgICAgICAgICAgdmlzdWFsPWNfdmlzdWFsLAogICAgICAgICAgICBmcmFtZV9pbl90b29sMF9mcmFtZT1mcmFtZSwKICAgICAgICAgICAgY29sbGlzaW9uPWNfY29sbGlzaW9uLAogICAgICAgICAgICBuYW1lPShuYW1lIG9yICJhdHRhY2hlZF90b29sIikuc3RyaXAoKSwKICAgICAgICApCg==
- - COMPAS FAB: Tool From Mesh
-
-
-
-
- - *.*.python
- - 3.*
-
-
-
-
- -
- 330
- 199
- 550
- 650
-
-
-
-
-
-
-
-
-
- - 59e0b89a-e487-49f8-bab8-b5bab16be14c
- - Panel
-
-
-
-
- - A panel for custom notes and text values
- - 005fbb2a-8d9c-47ba-a343-2c44624eec15
- - Panel
-
- - false
- - 0
- - 0
- - gripper
-
-
-
-
- -
- 241
- 304
- 53
- 20
-
- - 0
- - 0
- - 0
- -
- 241.09781
- 304.7948
-
-
-
-
-
- -
- 255;255;250;90
-
- - true
- - true
- - true
- - false
- - false
- - true
-
-
-
- - 4f8984c4-7c7a-4d69-b0a2-183cbb330d20
- - Plane
-
-
-
-
- - Contains a collection of three-dimensional axis-systems
- - 54d29d93-0a34-4b7d-aa5d-ecd9d4daa196
- - Plane
- - Plane
- - false
- - 0
-
-
-
-
- -
- 244
- 363
- 50
- 24
-
- -
- 269.66293
- 375.1797
-
-
-
-
-
- - 1
-
-
-
-
- - 1
- - {0}
-
-
-
-
- -
- 0
- 0
- 0.24076616764068604
- 1
- 0
- 0
- 0
- 1
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
-
+
- 1
-
198;217;216;237
@@ -3402,7 +3112,8 @@
- 83b96250-454d-4bd9-88a1-ea599d5391b2
- 005fbb2a-8d9c-47ba-a343-2c44624eec15
- 54d29d93-0a34-4b7d-aa5d-ecd9d4daa196
- - 7
+ - 0c0a7bb9-2c36-4b1a-bc0b-e1e73bf41a91
+ - 8
- 9cd90d33-8de2-48af-837c-caa019d3cb24
- Group
@@ -3413,7 +3124,7 @@
-
+
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
@@ -3440,7 +3151,7 @@
-
+
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
@@ -3466,7 +3177,7 @@
-
+
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
@@ -3493,7 +3204,7 @@
-
+
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
@@ -3518,6 +3229,315 @@
+
+
+ - c9b2d725-6f87-4b07-af90-bd9aefef68eb
+ - COMPAS FAB: Tool From Mesh
+
+
+
+
+ - Construct a ToolModel from a Rhino mesh and a TCP plane, both expressed in the coordinates the mesh was modelled in. Wire `base_plane` to say where the robot's flange takes hold of the geometry, so the tool can be modelled wherever is convenient. The same mesh is used for collision checking unless a separate `collision_mesh` is provided. Output feeds directly into a Load Robot Cell component's `tools` input.
+ - true
+ - 2
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABq0lEQVRIDbVVsU7DMBB1Ch+A1ArWDoUWZjaKBH+AoF35BLoCQkJICJiQ+gcsDKgB8Q/AxgwtdGNgAxYkWBruHZxlEjtx1PaG+Ox7996drdhKjdkCkz+KogbNW72n/hL5/2ImzuYHQRBV5yp3FGuTHwpGkxDhUbf3vCOBYcZadfaYRHbBwQKonMg7w5DGc0mkiU4Kf4FWHDCCOXNyB1T9IO+eZxWAM6EuCpMAxskPDk/Uw2M3i0PH9/e21cJ8Tc/hCKdskQ6COA+5TnQ4CQFUEq8GuaiyubGWoMGaDS/AhAACNiJsW+fyWvK8R6uA2YWtOllDIY31ZFemulUAALOLi/MzLLHBlzPKIkeCU0C6iB96ePW7TWYBrOz4OAWAFxJz78X3qR4cqQJmFwCLibDM08ZUASTayHyrRz7/yXBchi4gcvr6qSa+v9RWueiCWtczBZBVrK+o9/s+E5QWK1Yi1yIL4GKSu8MGXJ2eUpvlGfXy9qHg+xg4gZP34IZu1LpPoi+GbtJbElmWQ277JubAMScLkFKIZy5HcioUXOAESL/JmNA5jPzRB+9Y7Qe0HI6ecIyijwAAAABJRU5ErkJggg==
+
+ - 0c0a7bb9-2c36-4b1a-bc0b-e1e73bf41a91
+ - true
+ - false
+ - true
+ - COMPAS FAB: Tool From Mesh
+ - COMPAS FAB: Tool From Mesh
+ - 3
+
+ - false
+ - false
+ - false
+ - false
+
+
+
+
+ -
+ 482
+ 302
+ 167
+ 104
+
+ -
+ 573
+ 354
+
+
+
+
+
+ - 5
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 1
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+
+
+
+
+ - true
+ - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`.
+ - 436381bd-6eae-4f6f-bcab-332e39fe96a2
+ - name
+ - name
+ - true
+ - 0
+ - 2
+ - true
+ - 005fbb2a-8d9c-47ba-a343-2c44624eec15
+ - 1
+ - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`.
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+
+
+
+
+ -
+ 484
+ 304
+ 74
+ 20
+
+ -
+ 522.5
+ 314
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.String
+
+
+
+
+
+
+ - true
+ - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided).
+ - fa9dcc6c-a042-46a4-9395-f47f47434dda
+ - visual_mesh
+ - visual_mesh
+ - true
+ - 0
+ - 2
+ - true
+ - 548b96ae-d6b1-4cfa-a8f2-865e9d100241
+ - 1
+ - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided).
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 484
+ 324
+ 74
+ 20
+
+ -
+ 522.5
+ 334
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+ - true
+ - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`.
+ - 798e918d-e018-46bb-bbf6-e7682f1700af
+ - collision_mesh
+ - collision_mesh
+ - true
+ - 0
+ - 2
+ - true
+ - 548b96ae-d6b1-4cfa-a8f2-865e9d100241
+ - 1
+ - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 484
+ 344
+ 74
+ 20
+
+ -
+ 522.5
+ 354
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+ - true
+ - Tool Coordinate Frame, as a Rhino Plane or COMPAS Frame, expressed in the coordinates the mesh was modelled in.
+ - 54709955-a89f-4bdc-9fd8-7077f4f8292b
+ - tcp_plane
+ - tcp_plane
+ - true
+ - 0
+ - 2
+ - true
+ - 54d29d93-0a34-4b7d-aa5d-ecd9d4daa196
+ - 1
+ - Tool Coordinate Frame, as a Rhino Plane or COMPAS Frame, expressed in the coordinates the mesh was modelled in.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 484
+ 364
+ 74
+ 20
+
+ -
+ 522.5
+ 374
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+ - true
+ - Optional plane, in the coordinates the mesh was modelled in, at which the robot's flange takes hold of the tool. Its Z axis points away from the robot: a tool drawn reaching along world Z needs none. For a tool drawn reaching along world X, wire the plane with Z = world X. Defaults to the world XY plane, i.e. the modelling coordinates are the tool's base frame.
+ - ae622948-3a93-45db-812f-723f350cff21
+ - base_plane
+ - base_plane
+ - true
+ - 0
+ - 2
+ - true
+ - 0
+ - Optional plane, in the coordinates the mesh was modelled in, at which the robot's flange takes hold of the tool. Its Z axis points away from the robot: a tool drawn reaching along world Z needs none. For a tool drawn reaching along world X, wire the plane with Z = world X. Defaults to the world XY plane, i.e. the modelling coordinates are the tool's base frame.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 484
+ 384
+ 74
+ 20
+
+ -
+ 522.5
+ 394
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+ - false
+ - ToolModel.
+ - 0bd56e73-ac52-4472-8e49-534eb360ae0a
+ - tool_model
+ - tool_model
+ - false
+ - 0
+ - 2
+ - true
+ - 0
+ - ToolModel.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 588
+ 304
+ 59
+ 100
+
+ -
+ 617.5
+ 354
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+
+
+ - true
+ - false
+ - true
+ - IyByOiBjb21wYXNfZmFiPj0yLjAuMQoiIiIKQ29uc3RydWN0IGEgVG9vbE1vZGVsIGZyb20gYSBSaGlubyBtZXNoIGFuZCBhIFRDUCBwbGFuZS4KCmB0Y3BfcGxhbmVgIG1heSBiZSBhIFJoaW5vIFBsYW5lIG9yIGEgY29tcGFzIEZyYW1lOyBpdCBpcyB0aGUgVG9vbApDb29yZGluYXRlIEZyYW1lLCBleHByZXNzZWQgaW4gdGhlIHNhbWUgY29vcmRpbmF0ZXMgeW91IG1vZGVsbGVkIHRoZSBtZXNoCmluLiBJZiBgY29sbGlzaW9uX21lc2hgIGlzIHVud2lyZWQsIGB2aXN1YWxfbWVzaGAgaXMgcmV1c2VkIGZvciBjb2xsaXNpb24KY2hlY2tzLgoKYGJhc2VfcGxhbmVgIGlzIHdoZXJlIHRoZSByb2JvdCdzIGZsYW5nZSB0YWtlcyBob2xkIG9mIHRoZSBnZW9tZXRyeSwgYWxzbwppbiB0aGUgY29vcmRpbmF0ZXMgeW91IG1vZGVsbGVkIGluLiBJdHMgWiBheGlzIHBvaW50cyBhd2F5IGZyb20gdGhlIHJvYm90LAptYXRjaGluZyB0aGUgcGxhbm5pbmcgZ3JvdXBzIG9mIHRoZSByb2JvdHMgaW4gdGhlIGxpYnJhcnksIHNvIGEgdG9vbCBkcmF3bgpyZWFjaGluZyBhbG9uZyB3b3JsZCBaIG5lZWRzIG5vIGBiYXNlX3BsYW5lYCBhdCBhbGwuIFdpcmUgb25lIHdoZW4gdGhlIHRvb2wKd2FzIGRyYXduIGFsb25nIGFub3RoZXIgYXhpczogZm9yIGEgdG9vbCByZWFjaGluZyBhbG9uZyB3b3JsZCBYLCB0aGF0IGlzCnRoZSBwbGFuZSB3aXRoIFogPSB3b3JsZCBYLiBOb3RoaW5nIGlzIGJha2VkIGludG8gdGhlIG1lc2gsIHNvIHRoZSBwbGFuZQpjYW4gYmUgcmUtd2lyZWQgYXQgYW55IHRpbWUuCgpBIHJlbWFyayBpcyBzdXJmYWNlZCB3aGVuIHRoZSBUQ1AgZG9lcyBub3Qgc2l0IHJvdWdobHkgb24gdGhlIHRvb2wncyArWiwKc2luY2UgdGhhdCBtZWFucyB0aGUgdG9vbCB3aWxsIHBvaW50IHNpZGV3YXlzIG9uY2UgYXR0YWNoZWQuCgpUaGUgcmVzdWx0IGlzIGEgc3RhdGljIChubyBqb2ludHMpIGBUb29sTW9kZWxgIHJlYWR5IHRvIGZlZWQgaW50byBhCmBMb2FkIFJvYm90IENlbGxgIGNvbXBvbmVudCdzIGB0b29sc2AgaW5wdXQuIEtpbmVtYXRpYyB0b29scyAod2l0aCB0aGVpcgpvd24gam9pbnRzKSBzaG91bGQgYmUgbG9hZGVkIGZyb20gVVJERiBpbnN0ZWFkLgoKQ09NUEFTIEZBQiB2Mi4wLjEgKGJ1aWx0IDIwMjYtMDgtMDMgMTU6MzAgVVRDKQoiIiIKCmZyb20gbWF0aCBpbXBvcnQgZGVncmVlcwoKaW1wb3J0IEdyYXNzaG9wcGVyCmltcG9ydCBSaGlubwppbXBvcnQgcmhpbm9zY3JpcHRzeW50YXggYXMgcnMKaW1wb3J0IFN5c3RlbQpmcm9tIGNvbXBhcy5nZW9tZXRyeSBpbXBvcnQgRnJhbWUKZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IFZlY3Rvcgpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgcmVtYXJrCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCB3YXJuaW5nIGFzIGdoX3dhcm5pbmcKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IG1lc2hfdG9fY29tcGFzCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKZnJvbSBjb21wYXNfcm9ib3RzIGltcG9ydCBUb29sTW9kZWwKCiMgQmV5b25kIHRoaXMgYW5nbGUgYmV0d2VlbiB0aGUgdG9vbCdzICtaIGFuZCBpdHMgVENQLCB0aGUgdG9vbCBpcyBjb25zaWRlcmVkCiMgdG8gYmUgcG9pbnRpbmcgc29tZXdoZXJlIG90aGVyIHRoYW4gYXdheSBmcm9tIHRoZSBmbGFuZ2UuCk1BWF9UQ1BfT0ZGX0FYSVNfQU5HTEUgPSAzMC4wCgoKZGVmIF9vZmZfYXhpc19yZW1hcmsodG9vbCk6CiAgICAiIiJUZXh0IGZvciB0aGUgbW91bnRpbmctYXhpcyByZW1hcmssIG9yIE5vbmUgd2hlbiB0aGUgdG9vbCBsb29rcyBmaW5lLgoKICAgIFRoZSBUQ1AgZGlyZWN0aW9uIGlzIG9ubHkgYSBoaW50OiBpdCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHJvbGwgb2YgdGhlIHRvb2wKICAgIGFuZCBpcyBtZWFuaW5nbGVzcyBmb3IgYSBUQ1Agc2l0dGluZyBvbiB0aGUgbW91bnQgaXRzZWxmLCBzbyBpdCBpcyByZXBvcnRlZAogICAgcmF0aGVyIHRoYW4gYXBwbGllZC4KICAgICIiIgogICAgdGNwX2RpcmVjdGlvbiA9IFZlY3RvcigqdG9vbC5mcmFtZS5wb2ludCkKICAgIGlmIHRjcF9kaXJlY3Rpb24ubGVuZ3RoIDwgMWUtNjoKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGFuZ2xlID0gZGVncmVlcyh0Y3BfZGlyZWN0aW9uLmFuZ2xlKFZlY3Rvci5aYXhpcygpKSkKICAgIGlmIGFuZ2xlIDwgTUFYX1RDUF9PRkZfQVhJU19BTkdMRToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIG1lc3NhZ2UgPSAoIlRDUCBzaXRzIHs6LjBmfSBkZWcgb2ZmIHRoZSB0b29sJ3MgK1ogYXhpcywgc28gdGhpcyB0b29sIHdpbGwgcG9pbnQgc2lkZXdheXMgb25jZSBhdHRhY2hlZDogdG9vbHMgbW91bnQgd2l0aCArWiBwb2ludGluZyBhd2F5IGZyb20gdGhlIGZsYW5nZS4gIikuZm9ybWF0KGFuZ2xlKQoKICAgIHVuaXRpemVkID0gdGNwX2RpcmVjdGlvbi51bml0aXplZCgpCiAgICBpZiBhYnModW5pdGl6ZWQueCkgPiAwLjk5OgogICAgICAgIG1lc3NhZ2UgKz0gIllvdXIgdG9vbCByZWFjaGVzIGFsb25nIFgsIHNvIHNldCBgYmFzZV9wbGFuZWAgdG8gYSBwbGFuZSB3aXRoIGl0cyBaIGF4aXMgYWxvbmcgd29ybGQgWCAob3JpZ2luLCB4PSgwLDEsMCksIHk9KDAsMCwxKSkuIgogICAgZWxpZiBhYnModW5pdGl6ZWQueSkgPiAwLjk5OgogICAgICAgIG1lc3NhZ2UgKz0gIllvdXIgdG9vbCByZWFjaGVzIGFsb25nIFksIHNvIHNldCBgYmFzZV9wbGFuZWAgdG8gYSBwbGFuZSB3aXRoIGl0cyBaIGF4aXMgYWxvbmcgd29ybGQgWSAob3JpZ2luLCB4PSgwLDAsMSksIHk9KDEsMCwwKSkuIgogICAgZWxzZToKICAgICAgICBtZXNzYWdlICs9ICJTZXQgYGJhc2VfcGxhbmVgIHRvIGEgcGxhbmUgd2hvc2UgWiBheGlzIHJ1bnMgYWxvbmcgeW91ciB0b29sLCB3aXRoIGl0cyBYIGF4aXMgcGlja2VkIHRvIGdpdmUgdGhlIHJvbGwgeW91IHdhbnQuIgogICAgcmV0dXJuIG1lc3NhZ2UKCgpjbGFzcyBUb29sRnJvbU1lc2goR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgbmFtZTogc3RyLAogICAgICAgICAgICB2aXN1YWxfbWVzaCwKICAgICAgICAgICAgY29sbGlzaW9uX21lc2gsCiAgICAgICAgICAgIHRjcF9wbGFuZSwKICAgICAgICAgICAgYmFzZV9wbGFuZSk6CiAgICAgICAgaWYgdmlzdWFsX21lc2ggaXMgTm9uZSBvciB0Y3BfcGxhbmUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZnJhbWUgPSB0Y3BfcGxhbmUgaWYgaXNpbnN0YW5jZSh0Y3BfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZSh0Y3BfcGxhbmUpCiAgICAgICAgYmFzZV9mcmFtZSA9IE5vbmUKICAgICAgICBpZiBiYXNlX3BsYW5lIGlzIG5vdCBOb25lOgogICAgICAgICAgICBiYXNlX2ZyYW1lID0gYmFzZV9wbGFuZSBpZiBpc2luc3RhbmNlKGJhc2VfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZShiYXNlX3BsYW5lKQogICAgICAgIGNfdmlzdWFsID0gbWVzaF90b19jb21wYXMocnMuY29lcmNlbWVzaCh2aXN1YWxfbWVzaCkpIGlmIHZpc3VhbF9tZXNoIGVsc2UgTm9uZQogICAgICAgIGNfY29sbGlzaW9uID0gbWVzaF90b19jb21wYXMocnMuY29lcmNlbWVzaChjb2xsaXNpb25fbWVzaCkpIGlmIGNvbGxpc2lvbl9tZXNoIGVsc2UgTm9uZQoKICAgICAgICBpZiBjb2xsaXNpb25fbWVzaCBpcyBOb25lOgogICAgICAgICAgICBnaF93YXJuaW5nKGdoZW52LkNvbXBvbmVudCwgIk5vIGNvbGxpc2lvbiBtZXNoIHByb3ZpZGVkOiB0aGUgdG9vbCB3aWxsIGJlIHZpc3VhbGl6ZWQgYnV0IGlnbm9yZWQgZm9yIGNvbGxpc2lvbiBjaGVja2luZy4iKSAgIyBub3FhOiBGODIxCgogICAgICAgICMgYGJhc2VfZnJhbWVgIGlzIG9ubHkgcGFzc2VkIHdoZW4gd2lyZWQsIHNvIGFuIG9sZGVyIGNvbXBhc19yb2JvdHMga2VlcHMKICAgICAgICAjIHdvcmtpbmcgZm9yIGRlZmluaXRpb25zIHRoYXQgZG9uJ3QgdXNlIGl0LgogICAgICAgIGt3YXJncyA9IHsiYmFzZV9mcmFtZSI6IGJhc2VfZnJhbWV9IGlmIGJhc2VfZnJhbWUgZWxzZSB7fQogICAgICAgIHRvb2wgPSBUb29sTW9kZWwoCiAgICAgICAgICAgIHZpc3VhbD1jX3Zpc3VhbCwKICAgICAgICAgICAgZnJhbWVfaW5fdG9vbDBfZnJhbWU9ZnJhbWUsCiAgICAgICAgICAgIGNvbGxpc2lvbj1jX2NvbGxpc2lvbiwKICAgICAgICAgICAgbmFtZT0obmFtZSBvciAiYXR0YWNoZWRfdG9vbCIpLnN0cmlwKCksCiAgICAgICAgICAgICoqa3dhcmdzLAogICAgICAgICkKCiAgICAgICAgbWVzc2FnZSA9IF9vZmZfYXhpc19yZW1hcmsodG9vbCkKICAgICAgICBpZiBtZXNzYWdlOgogICAgICAgICAgICByZW1hcmsoZ2hlbnYuQ29tcG9uZW50LCBtZXNzYWdlKSAgIyBub3FhOiBGODIxCgogICAgICAgIHJldHVybiB0b29sCg==
+ - COMPAS FAB: Tool From Mesh
+
+
+
+
+ - *.*.python
+ - 3.*
+
+
+
+
+
+
+
+
@@ -3525,7 +3545,7 @@
-
- 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
+ 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
diff --git a/docs/frontends/ghpython/files/04_plan_motion.ghx b/docs/frontends/ghpython/files/04_plan_motion.ghx
index dc86ffbda..14a9a232a 100644
--- a/docs/frontends/ghpython/files/04_plan_motion.ghx
+++ b/docs/frontends/ghpython/files/04_plan_motion.ghx
@@ -50,10 +50,10 @@
-
- -209
- 275
+ -319
+ 175
- - 0.3132806
+ - 0.44672015
@@ -78,7 +78,7 @@
- Robert McNeel & Associates
- 00000000-0000-0000-0000-000000000000
- Grasshopper
- - 8.32.26160.13002
+ - 8.33.26188.13002
@@ -86,7 +86,7 @@
- Robert McNeel & Associates
- 00000000-0000-0000-0000-000000000000
- Grasshopper
- - 8.32.26160.13002
+ - 8.33.26188.13002
@@ -94,7 +94,7 @@
- Robert McNeel & Associates
- 00000000-0000-0000-0000-000000000000
- Grasshopper
- - 8.32.26160.13002
+ - 8.33.26188.13002
@@ -102,7 +102,7 @@
- Robert McNeel & Associates
- 00000000-0000-0000-0000-000000000000
- Grasshopper
- - 8.32.26160.13002
+ - 8.33.26188.13002
@@ -156,7 +156,7 @@
-
- 0.4008130799542978
+ 0.33741530588272634
-0.4308280237301899
0.08170787080470088
1
@@ -1084,7 +1084,7 @@
-
528
- 223
+ 239
50
20
@@ -1092,8 +1092,8 @@
- 0
- 0
-
- 528.39716
- 223.43997
+ 528.7902
+ 239.43997
@@ -1158,7 +1158,7 @@
-
- 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
+ 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
- 6
- 00000000-0000-0000-0000-000000000000
@@ -1331,7 +1331,7 @@
-
+
- 1
-
198;217;216;237
@@ -1363,7 +1363,8 @@
- 0855e543-9f77-4823-8f21-2b134bc4fca3
- 9c92c74a-5e86-436d-874f-a0030c6dab03
- 14762c92-f1ae-4fe4-98ab-802dc2b518e2
- - 26
+ - 1f179f42-a302-4b46-a703-cf43ac8ec09f
+ - 27
- 1ca67453-7fdd-4978-814c-31ac691a83ba
- Group
- Prepare robot cell elements
@@ -1636,7 +1637,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg==
- 879f838f-40fa-475b-a82f-c6514e3d7044
- true
@@ -2080,7 +2081,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvklEQVRIDb1VvU4CQRDeI1Y8gj9oAxz4CPoEVkShM6E10QQLE5WYGBODmtiY6FOAhpcwUUoT4Q4q8afTxoTSc7/xhuwee/EAcZvZmfnm+2bvZ0eICS9L5fc8Ly/9Uvf5danX62k5FWfax+NxLzE3cytzF5Zl1RjTJ5HkFcft7HNiHGunkydSpAwOEkDnkrw6DmmwVooUcJKYnygFAX/gEyed4Kn78jXsM+cGmi2HttmMzSGyeCfzidnYFLww8rBiZqrd1EX1us6uKKzlRH41Rz5z0glaTtvro+QGxChkAeTUYjWPzheztiZ0eLAnEM/YKUsTCHZkKkaMhVVRNIH6x6YjIIClCaDo6PiUEiBBMSwvVdyUZ5xqNQEkIKKSqmDeR8EwdkCAE8Paq84blWwmp7VSCNBXpEUNThgBQy9DBJDnH42xRgsCJgGg8fFpxJmCRoHfCIp3rijeuya+gZhRIApB4z3aKYwCaCMqwUDLgUCoQAA3sktfES6mytm55bjtH6KVdbIbW9sj+XY6Jcq7O3T9kIA/iZa5zYXOA2/JDuujyOf8p4GDyYMxp7U9huOPTJrLdJsy1ySGPnNPzH4DnVnW4pC0cHgAAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvElEQVRIDb1VvU4CQRDeI3a8AYqxAQ58BH0CK6LQmdCaaIKNCf4kxsQfEisTfQrQ8BImSmki3EEnSqeNofXcb7whu8dePEDcZnZmvvm+2fvZEWLGy1L5Pc8rSL/ce+2vDAYDLafiTPt4PO4lFxL3MndlWVadMUMSSX7uuN19Tkxj7UzqQoocgIME0Lkkr01DGqyVIkWcJOYnykHAH/jESSd46b19jfvMuYFW26FtLmtziCzeyWJyPjYHL4w8rJiZ6ncNUbttsCuKG3lRWM+Tz5x0grbT8YYouQExClkAObVYzaPz5ZytCR0fVQTiWTttaQLBjkzFiLGwKoomUP/ccgQEsDQBFJ2cVikBEhTD8lLFTXnGqVYTQAIiKqkK5n0UDGNHBDgxrr3p9qlkO5XQSiFAX5EWNThhBAy9DhFAnn80xhotCJgEgObHpxFnChoFfiMoPbii9Oia+EZiRoEoBM33aKcwCqCNqAQjLQcCoQIB3MQufUW4mM6ql5bjdn6I1jbJbu3sTuTbmbQ4rOzR9UMC/iRa5TaXuk+8JTuujyKf858GDiYPxpzW9hSOPzJpLtNtylyzGPrMPTP7DXFn1tne6IQrAAAAAElFTkSuQmCC
- 282367d0-3f19-41d2-8c3e-903cdb22e13b
- true
@@ -2099,14 +2100,14 @@
-
- 3096
- 518
+ 3101
+ 522
158
104
-
- 3162
- 570
+ 3167
+ 574
@@ -2142,14 +2143,14 @@
-
- 3098
- 520
+ 3103
+ 524
49
100
-
- 3124
- 570
+ 3129
+ 574
@@ -2180,14 +2181,14 @@
-
- 3177
- 520
+ 3182
+ 524
75
20
-
- 3214.5
- 530
+ 3219.5
+ 534
@@ -2218,14 +2219,14 @@
-
- 3177
- 540
+ 3182
+ 544
75
20
-
- 3214.5
- 550
+ 3219.5
+ 554
@@ -2256,14 +2257,14 @@
-
- 3177
- 560
+ 3182
+ 564
75
20
-
- 3214.5
- 570
+ 3219.5
+ 574
@@ -2294,14 +2295,14 @@
-
- 3177
- 580
+ 3182
+ 584
75
20
-
- 3214.5
- 590
+ 3219.5
+ 594
@@ -2332,14 +2333,14 @@
-
- 3177
- 600
+ 3182
+ 604
75
20
-
- 3214.5
- 610
+ 3219.5
+ 614
@@ -2396,7 +2397,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACEUlEQVRIDdVVyytEYRQ/d3A1M81kyMZ4bRhrjHeS7CQSJX+BhZIlfwBLKTZKsfGIRLIkCQskO49ZeEuUxzCGqOs7H+d279zvoysWTs2c853fOb/fd7/7OAB/bIqRX9O0JrbuOD27KI9EIibMWCeK3W63lpGetsawfkVRpqlGJ2HkPXv7oS4C0G9ubUM4HDam9NjlckFpSZG+NgZ5gZxeJtKNuXj8w53Hko9NTMHc/ALCUjs8OobWlmYLjlyMcxuvhAuwio7YqpXVNfD5kqCpsSEW4uvpmVnAGpHAZwNyfgjgmQtZWLKmukoIocBXRpwOLLJ7Q78iJow4uQAl/8L/fwF6iqSns7i0DJoU/R6QClRWlPP3YGh4RMpSX1crxQiQCuDznZ2VCdFolGpN3uv1QrAw35QTLaQCWFxWWizqsZUTCgyGLmyRYHEwxQNFyR5Ln0Vg4+YBBn4g0A5p3wvshp9g5/aR7yLX44SDh4/z7wz4LTujxOXzK4wfX9HS4k1X0LYVgivWgEbkGPftn6MTmk81UVhqOIrDgr4dqYkJoDoccB59Ab8zkZ+t36maGmmITJ5cg8IWoyUBy/EgJzZxAZxE7BteQSx3r288RL9+fU9p3ce+eKKb+zndgL5F/dhd4PMA7k5l21IdCrjjCNa5eYA19MMeiXFOrOMmGpmE2fXGkakLIAmOTuZ+dejb3Zzt+ne5RKuqd5c7kwAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACEklEQVRIDdVVyytEYRQ/d3A1Y2YyZMEIG8ba+5UkO4lEyV9goWTJH8BSio1SbDwikSxJwgLJzmMWHhlEeYzJEHV95+Pc7p37fXTFwqmZc77zO+f3++53Hwfgj00x8mua1sLWXeehy8pIJGLCjHWi2O12a5n+9A2GDSqKMks1Ogkj7zs4DPYQgH57ZxfC4bAxpcculwvKy0r0tTHID+T2M5FezMXjH+48lnxiagYWFpcQltrxySm0t7VacORinLt4JVyAVXTFVq2tb4DPlwwtzU2xEF/Pzs0D1ogEPhuQ80MAz1zIwpJ1tTVCCAW+MuJ0YJHdG/oVMWHEyQUo+Rf+/wvQUyQ9neWVVdCk6PeAVKC6qpK/ByOjY1KWxoZ6KUaAVACf75zsLIhGo1Rr8l6vF4qLCkw50UIqgMUV5aWiHls5ocBw8MIWCRYXp3qgJMVj6bMIbN0+wtAPBDoh43uB/fAT7N1F+C7yPE44evw4/+6A37IzSlw9v8Lk6TUtLd50BR07QbhmDWhEjvHAYQid0HyqicJSw1EcFvTtSEtMANXhgFD0BfzORH62fqdqaqQhMn12AwpbjJcFLMeDnNjEBXASsW94FbHcv77xEP3mzQOldR/74olu7ud0A/oWDWJ3oc8DuDuVbUt1KJAUR7DOzQOsoR/2SIxzYh030cgkzK43jkxdAElwdDL3q0Pf7uZs178Dt0yrp/1lc7YAAAAASUVORK5CYII=
- 9c92c74a-5e86-436d-874f-a0030c6dab03
- true
@@ -2416,13 +2417,13 @@
-
675
- 219
+ 237
159
64
-
760
- 251
+ 269
@@ -2458,13 +2459,13 @@
-
677
- 221
+ 239
68
20
-
712.5
- 231
+ 249
@@ -2496,13 +2497,13 @@
-
677
- 241
+ 259
68
20
-
712.5
- 251
+ 269
@@ -2534,13 +2535,13 @@
-
677
- 261
+ 279
68
20
-
712.5
- 271
+ 289
@@ -2572,13 +2573,13 @@
-
775
- 221
+ 239
57
30
-
803.5
- 236
+ 254
@@ -2610,13 +2611,13 @@
-
775
- 251
+ 269
57
30
-
803.5
- 266
+ 284
@@ -2664,7 +2665,7 @@
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- - COMPAS FAB: Tool From Mesh
+ - COMPAS FAB: Frame Target
@@ -2673,14 +2674,14 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVPUsDQRDdi4LFgQgRBTWSQjFa2xnB/APRpPUnmFZFEEHUSsg/sLGQRPE/qJ21RrQyfpRWB9p47hszx7q3e3dJLltkZ2fevDezy2WE6PNyVH7f98vyXG29vi95nvcvpuJMtuu6fm5q4lbGao7jNBgTkEjyw+bj0zYHetkLc7NHUmQHHCSAyiV5vRdSPVeKVNBJph2o6oAUzsRJHby03n46vfO4AvAm07nJzCCAOvn+wbG4f2jGcQTxvd0tsTBfCM4wmJOvKAiCuBPyINFihARQiV4NclFlZX01RAOfCc/AkAACJiJcW/3iivMS70YBtQtTdexDIeW1cFequlEAALWL87NTuGjB5jeKI0eCVYC70B+9cfl3TWoBpGz5sQoAzyTq3bOdpHpwRAqoXQDMi4X5HLVHCiDRRJa0euTTlwzDttAFRE4+PDHw/SU281kb1OiPFUBWtrgiPu+eiWB0ccZIZHPSFeGPyQaAvzQ2Ijby46I0PER2FJZjzMnz4FrOgyIH09jlPLiR82CZH7mWBqnGQZwkgMmDMacBuj62RybN5WAmg60fQ7/rKpMm/gLhhokzxSFCzgAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDWNgoDFgRDb/////IUB+/pOnz62/fPmCIoesDhubh4fnv4y05FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB4+fPPtHapgTcgAoTmRlpJjAPiBk+Jp1GxhAmBQAM5OFGE2r10IMDwkKIEY5ihpYHKAIUpNDcwuICqK/bBxkewqciq7fuPUfmwn7X31gmHLrGcO1T9/A0lp8XAw5alIMjmIC2JRjiGlqqDHiDCKQ4Vln7oAN53nxhAGEQRaBxEByxAKcFoBcDgJTjFUYZE7sZZA9thvMBotB5cAKCBBY4+Dj7z9g11qK8DHo8nMz3AiIBxszpbaWgcfCmeEagwxDSGIGA/OvH3DjQ4MDGLAlY5w+gOn8+x8RPYz//8GEiaax+oCflYUBFKHH33wC++Sgkz7D5h27GNYIiTN8kZBhUGJjYlgzfwZRluD0ASi1gEDO2TsMFZfuMxyVUmV4YO8FFvu3ezPDtes3wGxCBNgHoIIJVnbANICS4jQTFXAyBfkEBEC+MnzziOEvLzuDlqYGTClWGmQmSAJWHxwG1gc2WFUCBUGRDgKgoCMWAOuDI8D6wBYWRBPxaQQZTIrhULPAZoItANU8oGoOnyWkyEGrTHC9DA4imGZaVPows2lGAwBHiLc94c9LygAAAABJRU5ErkJggg==
- - 14762c92-f1ae-4fe4-98ab-802dc2b518e2
+ - 2c3deda5-7a78-4902-bb79-4796273ba3ff
- true
- false
- true
- - COMPAS FAB: Tool From Mesh
- - COMPAS FAB: Tool From Mesh
+ - COMPAS FAB: Frame Target
+ - COMPAS FAB: Frame Target
- 3
- false
@@ -2692,63 +2693,64 @@
-
- 673
- 116
- 167
- 84
+ 2245
+ 623
+ 173
+ 104
-
- 764
- 158
+ 2367
+ 675
-
- - 4
+
+ - 5
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
- 1
- 08908df5-fa14-4982-9ab2-1aa0927566aa
-
+
- true
- - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`.
- - da2ca3e1-ada7-4121-93b6-7b421382aab4
- - name
- - name
+ - Rhino plane or COMPAS Frame describing the target pose (in WCF).
+ - f086b18c-92ca-408c-b345-a009bfdc1d25
+ - plane
+ - plane
- true
- 0
- 2
- true
- - b1d6bdbb-bbbc-482e-9851-581e5580f4a9
+ - fa1878da-0da2-406e-95ad-60f40216bfa7
- 1
- - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`.
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+ - Rhino plane or COMPAS Frame describing the target pose (in WCF).
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 675
- 118
- 74
+ 2247
+ 625
+ 105
20
-
- 713.5
- 128
+ 2301
+ 635
- System.Private.CoreLib
- - System.String
+ - System.Object
@@ -2756,116 +2758,152 @@
- true
- - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided).
- - f2ed7ea7-33d7-441d-8089-38c02ce07c76
- - visual_mesh
- - visual_mesh
+ - Which frame on the robot to match. One of 'ROBOT' (PCF, default), 'TOOL' (TCF of attached tool), or 'WORKPIECE' (OCF of attached workpiece).
+ - 4ea23f34-2f44-4fea-ace2-ed14776c55fd
+ - target_mode
+ - target_mode
- true
- 0
- 2
- true
- - de7ea5f7-f04b-48c8-80ca-659046e21818
+ - 7f84f5b4-4206-4870-9cc2-3f06eea92a96
- 1
- - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided).
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+ - Which frame on the robot to match. One of 'ROBOT' (PCF, default), 'TOOL' (TCF of attached tool), or 'WORKPIECE' (OCF of attached workpiece).
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
-
- 675
- 138
- 74
+ 2247
+ 645
+ 105
20
-
- 713.5
- 148
+ 2301
+ 655
- System.Private.CoreLib
- - System.Object
+ - System.String
-
+
- true
- - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`.
- - 845901a6-5ddb-4f5f-9663-353bb0d7d2b1
- - collision_mesh
- - collision_mesh
+ - Position tolerance in meters (not affected by native_scale). If unset, the planner default is used.
+ - e64a05b9-8639-4029-88ed-8e9187a04a68
+ - tolerance_position
+ - tolerance_position
- true
- 0
- 2
- true
- - de7ea5f7-f04b-48c8-80ca-659046e21818
- - 1
- - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+ - 0
+ - Position tolerance in meters (not affected by native_scale). If unset, the planner default is used.
+ - 9d51e32e-c038-4352-9554-f4137ca91b9a
-
- 675
- 158
- 74
+ 2247
+ 665
+ 105
20
-
- 713.5
- 168
+ 2301
+ 675
- System.Private.CoreLib
- - System.Object
+ - System.Double
-
+
- true
- - Tool Coordinate Frame in the robot's `tool0` link frame, as a Rhino Plane or COMPAS Frame.
- - 10f1a94a-a2c7-4f77-a6f5-0047b6ca053a
- - tcp_plane
- - tcp_plane
+ - Orientation tolerance in radians. If unset, the planner default is used.
+ - b9b337d0-dbe9-450e-b28b-ec6b45abb002
+ - tolerance_orientation
+ - tolerance_orientation
- true
- 0
- 2
- true
- - 3e07e26f-7364-466c-bf58-2608d206128a
- - 1
- - Tool Coordinate Frame in the robot's `tool0` link frame, as a Rhino Plane or COMPAS Frame.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+ - 0
+ - Orientation tolerance in radians. If unset, the planner default is used.
+ - 9d51e32e-c038-4352-9554-f4137ca91b9a
-
- 675
- 178
- 74
+ 2247
+ 685
+ 105
20
-
- 713.5
- 188
+ 2301
+ 695
- System.Private.CoreLib
- - System.Object
+ - System.Double
+
+
+
+
+
+
+ - true
+ - Scale factor: user_value * native_scale = meters. Use 0.001 if modeling in millimeters. Defaults to 1.0.
+ - b27f1e89-e38c-49cc-952b-6cd07d5aad25
+ - native_scale
+ - native_scale
+ - true
+ - 0
+ - 2
+ - true
+ - 0
+ - Scale factor: user_value * native_scale = meters. Use 0.001 if modeling in millimeters. Defaults to 1.0.
+ - 9d51e32e-c038-4352-9554-f4137ca91b9a
+
+
+
+
+ -
+ 2247
+ 705
+ 105
+ 20
+
+ -
+ 2301
+ 715
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Double
@@ -2873,30 +2911,30 @@
- false
- - ToolModel.
- - 6f0b279a-83bc-49d8-b291-d9861d788592
- - tool_model
- - tool_model
+ - FrameTarget.
+ - 4d4c2587-3e67-44b5-ad21-f205a57ebe3a
+ - target
+ - target
- false
- 0
- 2
- true
- 0
- - ToolModel.
+ - FrameTarget.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 779
- 118
- 59
- 80
+ 2382
+ 625
+ 34
+ 100
-
- 808.5
- 158
+ 2399
+ 675
@@ -2915,8 +2953,8 @@
- true
- false
- true
- - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDb25zdHJ1Y3QgYSBUb29sTW9kZWwgZnJvbSBhIFJoaW5vIG1lc2ggYW5kIGEgVENQIHBsYW5lLgoKYHRjcF9wbGFuZWAgbWF5IGJlIGEgUmhpbm8gUGxhbmUgb3IgYSBjb21wYXMgRnJhbWU7IGl0IGlzIHRoZSBUb29sCkNvb3JkaW5hdGUgRnJhbWUgZXhwcmVzc2VkIGluIHRoZSByb2JvdCdzIGB0b29sMGAgbGluayBmcmFtZS4gSWYKYGNvbGxpc2lvbl9tZXNoYCBpcyB1bndpcmVkLCBgdmlzdWFsX21lc2hgIGlzIHJldXNlZCBmb3IgY29sbGlzaW9uCmNoZWNrcy4KClRoZSByZXN1bHQgaXMgYSBzdGF0aWMgKG5vIGpvaW50cykgYFRvb2xNb2RlbGAgcmVhZHkgdG8gZmVlZCBpbnRvIGEKYExvYWQgUm9ib3QgQ2VsbGAgY29tcG9uZW50J3MgYHRvb2xzYCBpbnB1dC4gS2luZW1hdGljIHRvb2xzICh3aXRoIHRoZWlyCm93biBqb2ludHMpIHNob3VsZCBiZSBsb2FkZWQgZnJvbSBVUkRGIGluc3RlYWQuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IHJoaW5vc2NyaXB0c3ludGF4IGFzIHJzCmltcG9ydCBTeXN0ZW0KZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IEZyYW1lCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCB3YXJuaW5nIGFzIGdoX3dhcm5pbmcKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IG1lc2hfdG9fY29tcGFzCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKZnJvbSBjb21wYXNfcm9ib3RzIGltcG9ydCBUb29sTW9kZWwKCgpjbGFzcyBUb29sRnJvbU1lc2goR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgbmFtZTogc3RyLCB2aXN1YWxfbWVzaCwgY29sbGlzaW9uX21lc2gsIHRjcF9wbGFuZSk6CiAgICAgICAgaWYgdmlzdWFsX21lc2ggaXMgTm9uZSBvciB0Y3BfcGxhbmUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZnJhbWUgPSB0Y3BfcGxhbmUgaWYgaXNpbnN0YW5jZSh0Y3BfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZSh0Y3BfcGxhbmUpCiAgICAgICAgY192aXN1YWwgPSBtZXNoX3RvX2NvbXBhcyhycy5jb2VyY2VtZXNoKHZpc3VhbF9tZXNoKSkgaWYgdmlzdWFsX21lc2ggZWxzZSBOb25lCiAgICAgICAgY19jb2xsaXNpb24gPSBtZXNoX3RvX2NvbXBhcyhycy5jb2VyY2VtZXNoKGNvbGxpc2lvbl9tZXNoKSkgaWYgY29sbGlzaW9uX21lc2ggZWxzZSBOb25lCgogICAgICAgIGlmIGNvbGxpc2lvbl9tZXNoIGlzIE5vbmU6CiAgICAgICAgICAgIGdoX3dhcm5pbmcoZ2hlbnYuQ29tcG9uZW50LCAiTm8gY29sbGlzaW9uIG1lc2ggcHJvdmlkZWQ6IHRoZSB0b29sIHdpbGwgYmUgdmlzdWFsaXplZCBidXQgaWdub3JlZCBmb3IgY29sbGlzaW9uIGNoZWNraW5nLiIpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgcmV0dXJuIFRvb2xNb2RlbCgKICAgICAgICAgICAgdmlzdWFsPWNfdmlzdWFsLAogICAgICAgICAgICBmcmFtZV9pbl90b29sMF9mcmFtZT1mcmFtZSwKICAgICAgICAgICAgY29sbGlzaW9uPWNfY29sbGlzaW9uLAogICAgICAgICAgICBuYW1lPShuYW1lIG9yICJhdHRhY2hlZF90b29sIikuc3RyaXAoKSwKICAgICAgICApCg==
- - COMPAS FAB: Tool From Mesh
+ - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDcmVhdGUgYSBGcmFtZVRhcmdldCBmb3IgdGhlIHJvYm90J3MgZW5kLWVmZmVjdG9yIG1vdGlvbiBwbGFubmluZy4KCkFjY2VwdHMgYSBSaGlubyBwbGFuZSBvciBhIENPTVBBUyBGcmFtZS4gVGhlIGB0YXJnZXRfbW9kZWAgY29udHJvbHMgd2hpY2gKZnJhbWUgb24gdGhlIHJvYm90L3Rvb2wvd29ya3BpZWNlIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgdGFyZ2V0LgoKQ09NUEFTIEZBQiB2Mi4wLjAKIiIiCgppbXBvcnQgR3Jhc3Nob3BwZXIKaW1wb3J0IFJoaW5vCmltcG9ydCBTeXN0ZW0KZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IEZyYW1lCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgZW5zdXJlX3ZhbHVlX2xpc3QKZnJvbSBjb21wYXNfZmFiLnJvYm90cyBpbXBvcnQgRnJhbWVUYXJnZXQKZnJvbSBjb21wYXNfZmFiLnJvYm90cyBpbXBvcnQgVGFyZ2V0TW9kZQoKX1RBUkdFVF9NT0RFUyA9IFttb2RlLnZhbHVlIGZvciBtb2RlIGluIFRhcmdldE1vZGVdCgoKY2xhc3MgRnJhbWVUYXJnZXRDb21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgcGxhbmUsCiAgICAgICAgICAgIHRhcmdldF9tb2RlOiBzdHIsCiAgICAgICAgICAgIHRvbGVyYW5jZV9wb3NpdGlvbjogZmxvYXQsCiAgICAgICAgICAgIHRvbGVyYW5jZV9vcmllbnRhdGlvbjogZmxvYXQsCiAgICAgICAgICAgIG5hdGl2ZV9zY2FsZTogZmxvYXQpOgogICAgICAgIGVuc3VyZV92YWx1ZV9saXN0KGdoZW52LkNvbXBvbmVudCwgInRhcmdldF9tb2RlIiwgX1RBUkdFVF9NT0RFUywgZGVmYXVsdD0iUk9CT1QiKSAgIyBub3FhOiBGODIxCgogICAgICAgIGlmIHBsYW5lIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGZyYW1lID0gcGxhbmUgaWYgaXNpbnN0YW5jZShwbGFuZSwgRnJhbWUpIGVsc2UgcGxhbmVfdG9fY29tcGFzX2ZyYW1lKHBsYW5lKQoKICAgICAgICBtb2RlID0gdGFyZ2V0X21vZGUgb3IgIlJPQk9UIgogICAgICAgIGlmIGlzaW5zdGFuY2UobW9kZSwgc3RyKToKICAgICAgICAgICAgbW9kZSA9IFRhcmdldE1vZGUobW9kZS5zdHJpcCgpLnVwcGVyKCkpCgogICAgICAgIG5hdGl2ZV9zY2FsZSA9IG5hdGl2ZV9zY2FsZSBpZiBuYXRpdmVfc2NhbGUgZWxzZSAxLjAKCiAgICAgICAgdGFyZ2V0ID0gRnJhbWVUYXJnZXQoCiAgICAgICAgICAgIHRhcmdldF9mcmFtZT1mcmFtZSwKICAgICAgICAgICAgdGFyZ2V0X21vZGU9bW9kZSwKICAgICAgICAgICAgbmF0aXZlX3NjYWxlPW5hdGl2ZV9zY2FsZSwKICAgICAgICAgICAgdG9sZXJhbmNlX3Bvc2l0aW9uPXRvbGVyYW5jZV9wb3NpdGlvbiwKICAgICAgICAgICAgdG9sZXJhbmNlX29yaWVudGF0aW9uPXRvbGVyYW5jZV9vcmllbnRhdGlvbiwKICAgICAgICApCiAgICAgICAgcmV0dXJuIHRhcmdldAo=
+ - COMPAS FAB: Frame Target
@@ -2930,10 +2968,10 @@
-
- 399
- 149
+ 525
+ 199
550
- 700
+ 650
@@ -2944,7 +2982,7 @@
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- - COMPAS FAB: Frame Target
+ - COMPAS FAB: Attach Tool To Robot
@@ -2953,14 +2991,14 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDWNgoDFgRDb/////IUB+/uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB48eP/1HapgTcgAoTuRkpZnAPiBk+Jp1GxhAmBQAM5OFGE2r10IMDwkKIEY5ihpYHKAIUpNDcwuICqK/bBxkewqciq7fuPUfmwn7X31gmHLrGcO1T9/A0lp8XAw5alIMjmIC2JRjiGlqqDHiDCKQ4Vln7oAN53nxhAGEQRaBxEByxAKcFoBcDgJTjFUYZE7sZZA9thvMBotB5cAKCBBY4+Dj7z9g11qK8DHo8nMz3AiIBxszpbaWgcfCmeEagwxDSGIGA/OvH3DjQ4MDGLAlY5w+gOn8+x8RPYz//8GEiaax+oCflYUBFKHH33wC++Sgkz7D5h27GNYIiTN8kZBhUGJjYlgzfwZRluD0ASi1gEDO2TsMFZfuMxyVUmV4YO8FFvu3ezPDtes3wGxCBNgHoIIJVnbANICS4jQTFXAyBfkEBEC+MnzziOEvLzuDlqYGTClWGmQmSAJWHxwG1gc2WFUCBUGRDgKgoCMWAOuDI8D6wBYWRBPxaQQZTIrhULPAZoItANU8oGoOnyWkyEGrTHC9DA4imGZaVPows2lGAwBpPLdAuMVd1AAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACBUlEQVRIDbWVTS9DQRSGT8WuXVjgtvG1EvXZCGkI/oI01cbWQiRWdoIQCwmJnZVE/AGKiL+AEEttuVhpiY9akLTrmve0czNt5pZLepKZOXPOuc97Z85iiKpsLpWfz+cjYj/39Pwyks1mS3Jqnc73eDz55ibfuchtuVyuA1ljQQR83bx7WJSJ/6z+jvYNIbIEBgvgzwU8Vg69uLyi63iCw/39AQoODpSX2O6FSBQnkQKnQmBUrT46PqG92JEaoslomMKh8ZKY3UYInAmBsRoU4M7Vwlwux3CvYdDmxhoP+BBE7jcmmSxQ3tC39wwzero7qa21hQd8mMzxpsIkmbW6GqOxgcOJ5C09ptKWD0fmOPiLSSvgdrv5vnEl84srFgY9QM6JaQUAQDN9Xi9t7+wyb3ZmmoaHgk7YXMs9sPsKwK+OPvr0B/4EB9f2BEjupzJ03zsElw7SHxRpqWffyaQVuLk1CSP5mSMj88W8+OsdUZ2bIuGQE77+BLHDYxYAySjiTLFiJG9MWl1eKEZ/XrQ96O7yW19GJ0KE0dVZiKk5q6iCo70iCcMqryR2OMUYua/ALEnZCgAue4EVhpM4Ne0VqTD0AwPm9O/xDQvgscBGNZxAngJxp38vmSxQfIlUPvtOoSpAMmUPtkSy5D1AMU4gRf5wPWAWXjQ4VX0yIQCrxqNfIFdx/gZyM8B488sZSgAAAABJRU5ErkJggg==
- - 2c3deda5-7a78-4902-bb79-4796273ba3ff
+ - a0b7288b-d4f9-4c4c-88eb-9a4e1b20e889
- true
- false
- true
- - COMPAS FAB: Frame Target
- - COMPAS FAB: Frame Target
+ - COMPAS FAB: Attach Tool To Robot
+ - COMPAS FAB: Attach Tool To Robot
- 3
- false
@@ -2972,57 +3010,58 @@
-
- 2245
- 623
- 173
- 104
+ 2484
+ 124
+ 176
+ 124
-
- 2367
- 675
+ 2591
+ 186
-
- - 5
+
+ - 6
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
- 1
- 08908df5-fa14-4982-9ab2-1aa0927566aa
-
+
- true
- - Rhino plane or COMPAS Frame describing the target pose (in WCF).
- - f086b18c-92ca-408c-b345-a009bfdc1d25
- - plane
- - plane
+ - Optional RobotCell — validates `tool_id`, derives the default `cell_state` when unwired, and resolves the main planning group when `group` is empty.
+ - 0632a7ab-b841-4e40-8475-8b8dadca3ef5
+ - robot_cell
+ - robot_cell
- true
- 0
- 2
- true
- - fa1878da-0da2-406e-95ad-60f40216bfa7
+ - c4c3df53-0a94-4574-afc8-9e68cb15bc46
- 1
- - Rhino plane or COMPAS Frame describing the target pose (in WCF).
+ - Optional RobotCell — validates `tool_id`, derives the default `cell_state` when unwired, and resolves the main planning group when `group` is empty.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2247
- 625
- 105
+ 2486
+ 126
+ 90
20
-
- 2301
- 635
+ 2532.5
+ 136
@@ -3037,76 +3076,77 @@
- true
- - Which frame on the robot to match. One of 'ROBOT' (PCF, default), 'TOOL' (TCF of attached tool), or 'WORKPIECE' (OCF of attached workpiece).
- - 4ea23f34-2f44-4fea-ace2-ed14776c55fd
- - target_mode
- - target_mode
+ - The RobotCellState to modify. If left unwired, the default state is derived from `robot_cell`.
+ - 5c8ad236-9f77-449f-9f22-cc089f77999f
+ - cell_state
+ - cell_state
- true
- 0
- 2
- true
- - 7f84f5b4-4206-4870-9cc2-3f06eea92a96
+ - e3d8b137-b6b2-491f-a175-53c88474afd2
- 1
- - Which frame on the robot to match. One of 'ROBOT' (PCF, default), 'TOOL' (TCF of attached tool), or 'WORKPIECE' (OCF of attached workpiece).
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+ - The RobotCellState to modify. If left unwired, the default state is derived from `robot_cell`.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2247
- 645
- 105
+ 2486
+ 146
+ 90
20
-
- 2301
- 655
+ 2532.5
+ 156
- System.Private.CoreLib
- - System.String
+ - System.Object
-
+
- true
- - Position tolerance in meters (not affected by native_scale). If unset, the planner default is used.
- - e64a05b9-8639-4029-88ed-8e9187a04a68
- - tolerance_position
- - tolerance_position
+ - Id of the tool inside the RobotCell.
+ - e931a4e6-c85a-4040-a631-65ab93fd2b4d
+ - tool_id
+ - tool_id
- true
- 0
- 2
- true
- - 0
- - Position tolerance in meters (not affected by native_scale). If unset, the planner default is used.
- - 9d51e32e-c038-4352-9554-f4137ca91b9a
+ - a194c46d-2cff-4b97-9fc2-c1b5762db47b
+ - 1
+ - Id of the tool inside the RobotCell.
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
-
- 2247
- 665
- 105
+ 2486
+ 166
+ 90
20
-
- 2301
- 675
+ 2532.5
+ 176
- System.Private.CoreLib
- - System.Double
+ - System.String
@@ -3114,37 +3154,37 @@
- true
- - Orientation tolerance in radians. If unset, the planner default is used.
- - b9b337d0-dbe9-450e-b28b-ec6b45abb002
- - tolerance_orientation
- - tolerance_orientation
+ - Planning group to attach the tool to. If empty, the main planning group is taken from `robot_cell`.
+ - efc78418-137f-4d2a-bc1e-9ac84b85ba02
+ - group
+ - group
- true
- 0
- 2
- true
- 0
- - Orientation tolerance in radians. If unset, the planner default is used.
- - 9d51e32e-c038-4352-9554-f4137ca91b9a
+ - Planning group to attach the tool to. If empty, the main planning group is taken from `robot_cell`.
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
-
- 2247
- 685
- 105
+ 2486
+ 186
+ 90
20
-
- 2301
- 695
+ 2532.5
+ 196
- System.Private.CoreLib
- - System.Double
+ - System.String
@@ -3152,37 +3192,76 @@
- true
- - Scale factor: user_value * native_scale = meters. Use 0.001 if modeling in millimeters. Defaults to 1.0.
- - b27f1e89-e38c-49cc-952b-6cd07d5aad25
- - native_scale
- - native_scale
+ - Optional Rhino Plane or COMPAS Frame describing the tool's frame relative to the end-effector link. Defaults to World XY (coincident with the end link).
+ - a7f72b11-5611-4e89-a36b-81f37715729b
+ - attachment_plane
+ - attachment_plane
- true
- 0
- 2
- true
- 0
- - Scale factor: user_value * native_scale = meters. Use 0.001 if modeling in millimeters. Defaults to 1.0.
- - 9d51e32e-c038-4352-9554-f4137ca91b9a
+ - Optional Rhino Plane or COMPAS Frame describing the tool's frame relative to the end-effector link. Defaults to World XY (coincident with the end link).
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2247
- 705
- 105
+ 2486
+ 206
+ 90
20
-
- 2301
- 715
+ 2532.5
+ 216
- System.Private.CoreLib
- - System.Double
+ - System.Object
+
+
+
+
+
+
+ - 1
+ - true
+ - Optional list of robot link names allowed to collide with the tool.
+ - b0b069e8-af5a-4216-9545-d1ebba73f40f
+ - touch_links
+ - touch_links
+ - true
+ - 1
+ - 2
+ - true
+ - 0
+ - Optional list of robot link names allowed to collide with the tool.
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+
+
+
+
+ -
+ 2486
+ 226
+ 90
+ 20
+
+ -
+ 2532.5
+ 236
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.String
@@ -3190,30 +3269,30 @@
- false
- - FrameTarget.
- - 4d4c2587-3e67-44b5-ad21-f205a57ebe3a
- - target
- - target
+ - New RobotCellState with the tool attached.
+ - 69e48047-60c1-4584-8133-6458bdb0f4da
+ - cell_state
+ - cell_state
- false
- 0
- 2
- true
- 0
- - FrameTarget.
+ - New RobotCellState with the tool attached.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2382
- 625
- 34
- 100
+ 2606
+ 126
+ 52
+ 120
-
- 2399
- 675
+ 2632
+ 186
@@ -3232,8 +3311,8 @@
- true
- false
- true
- - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDcmVhdGUgYSBGcmFtZVRhcmdldCBmb3IgdGhlIHJvYm90J3MgZW5kLWVmZmVjdG9yIG1vdGlvbiBwbGFubmluZy4KCkFjY2VwdHMgYSBSaGlubyBwbGFuZSBvciBhIENPTVBBUyBGcmFtZS4gVGhlIGB0YXJnZXRfbW9kZWAgY29udHJvbHMgd2hpY2gKZnJhbWUgb24gdGhlIHJvYm90L3Rvb2wvd29ya3BpZWNlIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgdGFyZ2V0LgoKQ09NUEFTIEZBQiB2Mi4wLjAKIiIiCgppbXBvcnQgR3Jhc3Nob3BwZXIKaW1wb3J0IFJoaW5vCmltcG9ydCBTeXN0ZW0KZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IEZyYW1lCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgZW5zdXJlX3ZhbHVlX2xpc3QKZnJvbSBjb21wYXNfZmFiLnJvYm90cyBpbXBvcnQgRnJhbWVUYXJnZXQKZnJvbSBjb21wYXNfZmFiLnJvYm90cyBpbXBvcnQgVGFyZ2V0TW9kZQoKX1RBUkdFVF9NT0RFUyA9IFttb2RlLnZhbHVlIGZvciBtb2RlIGluIFRhcmdldE1vZGVdCgoKY2xhc3MgRnJhbWVUYXJnZXRDb21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgcGxhbmUsCiAgICAgICAgICAgIHRhcmdldF9tb2RlOiBzdHIsCiAgICAgICAgICAgIHRvbGVyYW5jZV9wb3NpdGlvbjogZmxvYXQsCiAgICAgICAgICAgIHRvbGVyYW5jZV9vcmllbnRhdGlvbjogZmxvYXQsCiAgICAgICAgICAgIG5hdGl2ZV9zY2FsZTogZmxvYXQpOgogICAgICAgIGVuc3VyZV92YWx1ZV9saXN0KGdoZW52LkNvbXBvbmVudCwgInRhcmdldF9tb2RlIiwgX1RBUkdFVF9NT0RFUywgZGVmYXVsdD0iUk9CT1QiKSAgIyBub3FhOiBGODIxCgogICAgICAgIGlmIHBsYW5lIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIGZyYW1lID0gcGxhbmUgaWYgaXNpbnN0YW5jZShwbGFuZSwgRnJhbWUpIGVsc2UgcGxhbmVfdG9fY29tcGFzX2ZyYW1lKHBsYW5lKQoKICAgICAgICBtb2RlID0gdGFyZ2V0X21vZGUgb3IgIlJPQk9UIgogICAgICAgIGlmIGlzaW5zdGFuY2UobW9kZSwgc3RyKToKICAgICAgICAgICAgbW9kZSA9IFRhcmdldE1vZGUobW9kZS5zdHJpcCgpLnVwcGVyKCkpCgogICAgICAgIG5hdGl2ZV9zY2FsZSA9IG5hdGl2ZV9zY2FsZSBpZiBuYXRpdmVfc2NhbGUgZWxzZSAxLjAKCiAgICAgICAgdGFyZ2V0ID0gRnJhbWVUYXJnZXQoCiAgICAgICAgICAgIHRhcmdldF9mcmFtZT1mcmFtZSwKICAgICAgICAgICAgdGFyZ2V0X21vZGU9bW9kZSwKICAgICAgICAgICAgbmF0aXZlX3NjYWxlPW5hdGl2ZV9zY2FsZSwKICAgICAgICAgICAgdG9sZXJhbmNlX3Bvc2l0aW9uPXRvbGVyYW5jZV9wb3NpdGlvbiwKICAgICAgICAgICAgdG9sZXJhbmNlX29yaWVudGF0aW9uPXRvbGVyYW5jZV9vcmllbnRhdGlvbiwKICAgICAgICApCiAgICAgICAgcmV0dXJuIHRhcmdldAo=
- - COMPAS FAB: Frame Target
+ - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpBdHRhY2ggYSB0b29sIHRvIGEgcm9ib3QgcGxhbm5pbmcgZ3JvdXAgaW5zaWRlIGEgUm9ib3RDZWxsU3RhdGUuCgpQYXNzdGhyb3VnaCBidWlsZGVyOiB0aGUgaW5wdXQgc3RhdGUgaXMgY29waWVkLCB0aGUgYXR0YWNobWVudCBpcyBzZXQsIGFuZAp0aGUgbmV3IHN0YXRlIGlzIHJldHVybmVkLgoKV2hlbiBgcm9ib3RfY2VsbGAgaXMgd2lyZWQgYW5kIGB0b29sX2lkYCBoYXMgbm8gc291cmNlLCB0aGUgY29tcG9uZW50CmF1dG8tY3JlYXRlcyBhIFZhbHVlIExpc3QgZHJvcGRvd24gbGlzdGluZyBldmVyeSB0b29sIGN1cnJlbnRseSBpbgpgY2VsbC50b29sX21vZGVsc2AgKHJlZnJlc2hlZCB3aGVuIHRoZSBzZXQgY2hhbmdlcykuIFRoZSBgdG9vbF9pZGAgaXMgYWxzbwp2YWxpZGF0ZWQgYWdhaW5zdCBgY2VsbC50b29sX21vZGVsc2A7IGFuIHVua25vd24gaWQgcmFpc2VzIGFuIGVycm9yIHJhdGhlcgp0aGFuIHByb2R1Y2luZyBhIGJyb2tlbiBzdGF0ZS4KCklmIGBjZWxsX3N0YXRlYCBpcyBsZWZ0IHVud2lyZWQsIHRoZSBkZWZhdWx0IHN0YXRlIGlzIGRlcml2ZWQgZnJvbQpgcm9ib3RfY2VsbGAsIHNvIGF0dGFjaGluZyBhIHNpbmdsZSB0b29sIG5lZWRzIG9ubHkgYHJvYm90X2NlbGxgICsgYHRvb2xfaWRgLgoKSWYgYGdyb3VwYCBpcyBsZWZ0IGVtcHR5LCB0aGUgY2VsbCdzIG1haW4gcGxhbm5pbmcgZ3JvdXAgaXMgdXNlZCAocmVxdWlyZXMKYHJvYm90X2NlbGxgIHRvIGJlIHdpcmVkIGluKS4gQW55IHRvb2wgYWxyZWFkeSBhdHRhY2hlZCB0byB0aGUgc2FtZSBncm91cCBpcwphdXRvbWF0aWNhbGx5IGRldGFjaGVkLgoKSWYgYHRvdWNoX2xpbmtzYCBpcyBsZWZ0IHVud2lyZWQsIHRoZSBjb21wb25lbnQgZGVmYXVsdHMgdG8gdGhlIGVuZC1lZmZlY3RvcgpsaW5rIG9mIHRoZSBwbGFubmluZyBncm91cCAocGx1cyBpdHMgcGFyZW50IGxpbmsgd2hlbiB0aGUgZW5kLWVmZmVjdG9yIGxpbmsKaXRzZWxmIGhhcyBubyBnZW9tZXRyeSwgZS5nLiBVUidzIGB0b29sMGAgaXMgYSB6ZXJvLWdlb21ldHJ5IGZyYW1lIHNvIHRoZQpwYXJlbnQgYHdyaXN0XzNfbGlua2AgaXMgaW5jbHVkZWQgYXV0b21hdGljYWxseSkuIEEgcmVtYXJrIGlzIHN1cmZhY2VkIHNvCnRoZSBhdXRvLXBpY2sgaXNuJ3Qgc2lsZW50LgoKQSByZW1hcmsgYWx3YXlzIGFubm91bmNlcyB0aGUgbGluayB0aGUgdG9vbCBhY3R1YWxseSBlbmRzIHVwIGF0dGFjaGVkIHRvOgp0aGUgcGxhbm5pbmcgZ3JvdXAncyBlbmQtZWZmZWN0b3IgbGluayBhcyByZXR1cm5lZCBieQpgcm9ib3RfY2VsbC5nZXRfZW5kX2VmZmVjdG9yX2xpbmtfbmFtZShncm91cClgLiBPdmVycmlkZSB0aGF0IGVmZmVjdGl2ZQpmcmFtZSB2aWEgdGhlIGBhdHRhY2htZW50X3BsYW5lYCBpbnB1dC4KCkNPTVBBUyBGQUIgdjIuMC4wCiIiIgoKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQoKaW1wb3J0IEdyYXNzaG9wcGVyCmltcG9ydCBSaGlubwppbXBvcnQgU3lzdGVtCmZyb20gY29tcGFzLmdlb21ldHJ5IGltcG9ydCBGcmFtZQpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgZXJyb3IKZnJvbSBjb21wYXNfZ2hweXRob24gaW1wb3J0IHJlbWFyawpmcm9tIGNvbXBhc19yaGluby5jb252ZXJzaW9ucyBpbXBvcnQgcGxhbmVfdG9fY29tcGFzX2ZyYW1lCgpmcm9tIGNvbXBhc19mYWIuZ2hweXRob24gaW1wb3J0IGVuc3VyZV9keW5hbWljX3ZhbHVlX2xpc3QKCgpjbGFzcyBBdHRhY2hUb29sVG9Sb2JvdChHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLAogICAgICAgICAgICByb2JvdF9jZWxsLAogICAgICAgICAgICBjZWxsX3N0YXRlLAogICAgICAgICAgICB0b29sX2lkOiBzdHIsCiAgICAgICAgICAgIGdyb3VwOiBzdHIsCiAgICAgICAgICAgIGF0dGFjaG1lbnRfcGxhbmUsCiAgICAgICAgICAgIHRvdWNoX2xpbmtzOiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W3N0cl0pOgogICAgICAgICMgQXV0by1wb3B1bGF0ZSB0aGUgdG9vbF9pZCBkcm9wZG93biBmcm9tIHRoZSBjZWxsJ3MgdG9vbCBpbnZlbnRvcnkuCiAgICAgICAgIyBSdW5zIGV2ZW4gd2hlbiB0b29sX2lkIGlzIGN1cnJlbnRseSBOb25lOiB0aGF0J3MgdGhlIHRyaWdnZXIuCiAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZW5zdXJlX2R5bmFtaWNfdmFsdWVfbGlzdCgKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudCwgICMgbm9xYTogRjgyMQogICAgICAgICAgICAgICAgInRvb2xfaWQiLAogICAgICAgICAgICAgICAgc29ydGVkKHJvYm90X2NlbGwudG9vbF9tb2RlbHMua2V5cygpKSwKICAgICAgICAgICAgKQoKICAgICAgICBpZiBub3QgdG9vbF9pZDoKICAgICAgICAgICAgcmV0dXJuIGNlbGxfc3RhdGUKCiAgICAgICAgdG9vbF9pZCA9IHRvb2xfaWQuc3RyaXAoKQoKICAgICAgICAjIFZhbGlkYXRlIHRoZSB0b29sIGV4aXN0cyBpbiB0aGUgY2VsbCBiZWZvcmUgYXR0YWNoaW5nIGl0LgogICAgICAgIGlmIHJvYm90X2NlbGwgaXMgbm90IE5vbmUgYW5kIHRvb2xfaWQgbm90IGluIHJvYm90X2NlbGwudG9vbF9tb2RlbHM6CiAgICAgICAgICAgIGVycm9yKCAgIyBub3FhOiBGODIxCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQsICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgICJUb29sIGlkICd7fScgaXMgbm90IGluIHRoZSByb2JvdCBjZWxsLiBBdmFpbGFibGUgdG9vbHM6IHt9LiIuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgIHRvb2xfaWQsICIsICIuam9pbihzb3J0ZWQocm9ib3RfY2VsbC50b29sX21vZGVscy5rZXlzKCkpKSBvciAiKG5vbmUpIgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gY2VsbF9zdGF0ZQoKICAgICAgICAjIERlcml2ZSB0aGUgZGVmYXVsdCBzdGF0ZSBmcm9tIHRoZSBjZWxsIHdoZW4gYGNlbGxfc3RhdGVgIGlzIGxlZnQgdW53aXJlZC4KICAgICAgICBpZiBjZWxsX3N0YXRlIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIHJvYm90X2NlbGwgaXMgTm9uZToKICAgICAgICAgICAgICAgIGVycm9yKGdoZW52LkNvbXBvbmVudCwgIldpcmUgYSBgY2VsbF9zdGF0ZWAsIG9yIHdpcmUgYHJvYm90X2NlbGxgIHNvIHRoZSBkZWZhdWx0IHN0YXRlIGNhbiBiZSBkZXJpdmVkLiIpICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGNlbGxfc3RhdGUgPSByb2JvdF9jZWxsLmRlZmF1bHRfY2VsbF9zdGF0ZSgpCgogICAgICAgIGlmIG5vdCBncm91cDoKICAgICAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBOb25lOgogICAgICAgICAgICAgICAgZXJyb3IoZ2hlbnYuQ29tcG9uZW50LCAiYGdyb3VwYCBpcyBlbXB0eSBhbmQgbm8gYHJvYm90X2NlbGxgIHdhcyB3aXJlZCBpbjogcHJvdmlkZSBvbmUgb3IgdGhlIG90aGVyIHNvIHRoZSB0b29sJ3MgcGxhbm5pbmcgZ3JvdXAgY2FuIGJlIHJlc29sdmVkLiIpICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgIHJldHVybiBjZWxsX3N0YXRlCiAgICAgICAgICAgIGdyb3VwID0gcm9ib3RfY2VsbC5tYWluX2dyb3VwX25hbWUKCiAgICAgICAgZ3JvdXAgPSBncm91cC5zdHJpcCgpCgogICAgICAgIGF0dGFjaG1lbnRfZnJhbWUgPSBOb25lCiAgICAgICAgaWYgYXR0YWNobWVudF9wbGFuZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgYXR0YWNobWVudF9mcmFtZSA9IGF0dGFjaG1lbnRfcGxhbmUgaWYgaXNpbnN0YW5jZShhdHRhY2htZW50X3BsYW5lLCBGcmFtZSkgZWxzZSBwbGFuZV90b19jb21wYXNfZnJhbWUoYXR0YWNobWVudF9wbGFuZSkKCiAgICAgICAgdG91Y2hfbGlua3NfbGlzdCA9IGxpc3QodG91Y2hfbGlua3MpIGlmIHRvdWNoX2xpbmtzIGVsc2UgTm9uZQoKICAgICAgICBpZiB0b3VjaF9saW5rc19saXN0IGlzIE5vbmUgYW5kIHJvYm90X2NlbGwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRvdWNoX2xpbmtzX2xpc3QgPSByb2JvdF9jZWxsLmRlZmF1bHRfdG91Y2hfbGlua3MoZ3JvdXApCiAgICAgICAgICAgIHJlbWFyayhnaGVudi5Db21wb25lbnQsICJ0b3VjaF9saW5rcyB1bndpcmVkOyBkZWZhdWx0ZWQgdG8ge30gKGxpbmtzIHRoZSB0b29sIGluZXZpdGFibHkgb3ZlcmxhcHMpLiBXaXJlIHlvdXIgb3duIGxpc3QgdG8gb3ZlcnJpZGUuIi5mb3JtYXQodG91Y2hfbGlua3NfbGlzdCkpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZWVfbGluayA9IHJvYm90X2NlbGwuZ2V0X2VuZF9lZmZlY3Rvcl9saW5rX25hbWUoZ3JvdXApCiAgICAgICAgICAgIHJlbWFyayggICMgbm9xYTogRjgyMQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LCAgIyBub3FhOiBGODIxCiAgICAgICAgICAgICAgICAiYXR0YWNoaW5nICd7fScgYXQgbGluayAne30nIChncm91cCAne30nIGVuZC1lZmZlY3RvcikuIFRoZSB0b29sJ3MgYHRvb2wwYCBmcmFtZSBpcyBhdCB0aGlzIGxpbms7ICIKICAgICAgICAgICAgICAgICJ1c2UgYGF0dGFjaG1lbnRfcGxhbmVgIHRvIHJvdGF0ZS9vZmZzZXQgdGhlIHRvb2wgcmVsYXRpdmUgdG8gaXQuIi5mb3JtYXQodG9vbF9pZCwgZWVfbGluaywgZ3JvdXApLAogICAgICAgICAgICApCgogICAgICAgIG5ld19zdGF0ZSA9IGRlZXBjb3B5KGNlbGxfc3RhdGUpCiAgICAgICAgbmV3X3N0YXRlLnNldF90b29sX2F0dGFjaGVkX3RvX2dyb3VwKAogICAgICAgICAgICB0b29sX2lkPXRvb2xfaWQsCiAgICAgICAgICAgIGdyb3VwPWdyb3VwLAogICAgICAgICAgICBhdHRhY2htZW50X2ZyYW1lPWF0dGFjaG1lbnRfZnJhbWUsCiAgICAgICAgICAgIHRvdWNoX2xpbmtzPXRvdWNoX2xpbmtzX2xpc3QsCiAgICAgICAgKQogICAgICAgIHJldHVybiBuZXdfc3RhdGUK
+ - COMPAS FAB: Attach Tool To Robot
@@ -3247,7 +3326,7 @@
-
- 525
+ 383
199
550
650
@@ -3261,23 +3340,24 @@
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- - COMPAS FAB: Attach Tool To Robot
+ - COMPAS FAB: Visualize Robot Cell
-
+
- true
+ - true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACA0lEQVRIDbWVTS9DQRSGT8WuGwvcEmUlbdVHhEgFf0GaamNrIRIrO1EhFhISOyuJ+AO0RPwFhFjST1ZUBLVoF13XvKedm2kzt1zSk8ydM3POfd4759xkiJpsDpVfLpfDYr2Se32bKpVKNTE1T+c7nc6yu6f7WsT2HQ5HXOaYEAHfyWSfojLwn9nr6d8VIutgsAC+XMBj9dCb2zu6f0jw9ujoCE2Mj9WnWK6FSAQnkQKXQmBazT47v6Dj2Jm6RfOREIWCszV7VgshcCUEZlqQgJqriaL+DHcZBu3tbvOAD0HEfmOSyQL1Df34zDNj0O+jvl43D/gwGeNFg4dktupyjM4O3k4k0/T8kjN9ODLGm794aAXEL8f1RklWo5smBj1AzI5pBQBAM7tcLjo4PGLe8tIiTQYm7LA5l3tg9RaARc8wFbwjf4KDa3kCBE9e8vQ4FIBL8dwXhd3t7Nt5aAVS6QxhJAslMvJF5j28Z4nanBQOBe3w9SeInZ6zAEhGFZcRM0YylaGtjbXq7s+Ttgf+Aa/5ZmQuSBgDvsqeGjOTGjjaEkkYZlmS2OkCY+S6AbMmZCkAuOwFZhhOYte0JVJh6AcGzO7X4x0WwGWBhWo4gTwF9u1+vWSyQPUmUvns24WqAMmUPdgXwZr7AMk4gRT5Q3nArNxocJp6ZUIA1oxLv0Ju4vMbbXfAeMEPB5cAAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg==
- - a0b7288b-d4f9-4c4c-88eb-9a4e1b20e889
+ - c300a51d-ea1d-4a6f-aac8-a4d4a36ca3fd
- true
- false
- true
- - COMPAS FAB: Attach Tool To Robot
- - COMPAS FAB: Attach Tool To Robot
+ - COMPAS FAB: Visualize Robot Cell
+ - COMPAS FAB: Visualize Robot Cell
- 3
- false
@@ -3289,58 +3369,60 @@
-
- 2484
- 124
- 176
- 124
+ 2753
+ 88
+ 203
+ 104
-
- 2591
- 186
+ 2840
+ 140
-
- - 6
+
+ - 5
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 1
+ - 4
- 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
-
+
- true
- - Optional RobotCell — validates `tool_id`, derives the default `cell_state` when unwired, and resolves the main planning group when `group` is empty.
- - 0632a7ab-b841-4e40-8475-8b8dadca3ef5
+ - The RobotCell to draw.
+ - 0c5aa94e-7a38-43c6-adf2-eee52207dafd
- robot_cell
- robot_cell
- true
- 0
- 2
- true
- - c4c3df53-0a94-4574-afc8-9e68cb15bc46
+ - 4faef0a9-d25c-40bb-862f-6f5183f66019
- 1
- - Optional RobotCell — validates `tool_id`, derives the default `cell_state` when unwired, and resolves the main planning group when `group` is empty.
+ - The RobotCell to draw.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2486
- 126
- 90
+ 2755
+ 90
+ 70
20
-
- 2532.5
- 136
+ 2791.5
+ 100
@@ -3355,31 +3437,31 @@
- true
- - The RobotCellState to modify. If left unwired, the default state is derived from `robot_cell`.
- - 5c8ad236-9f77-449f-9f22-cc089f77999f
+ - Optional RobotCellState describing the configuration to draw. If unwired, the cell's default state is used.
+ - 099fb9a6-50e4-488c-8fb8-e961b1a1251b
- cell_state
- cell_state
- true
- 0
- 2
- true
- - e3d8b137-b6b2-491f-a175-53c88474afd2
+ - 69e48047-60c1-4584-8133-6458bdb0f4da
- 1
- - The RobotCellState to modify. If left unwired, the default state is derived from `robot_cell`.
+ - Optional RobotCellState describing the configuration to draw. If unwired, the cell's default state is used.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2486
- 146
- 90
+ 2755
+ 110
+ 70
20
-
- 2532.5
- 156
+ 2791.5
+ 120
@@ -3392,40 +3474,39 @@
-
+
- true
- - Id of the tool inside the RobotCell.
- - e931a4e6-c85a-4040-a631-65ab93fd2b4d
- - tool_id
- - tool_id
+ - Draw visual meshes. Defaults to True.
+ - fbb9921d-2976-406f-bae0-f496a01fc3f3
+ - draw_visual
+ - draw_visual
- true
- 0
- 2
- true
- - a194c46d-2cff-4b97-9fc2-c1b5762db47b
- - 1
- - Id of the tool inside the RobotCell.
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+ - 0
+ - Draw visual meshes. Defaults to True.
+ - d60527f5-b5af-4ef6-8970-5f96fe412559
-
- 2486
- 166
- 90
+ 2755
+ 130
+ 70
20
-
- 2532.5
- 176
+ 2791.5
+ 140
- System.Private.CoreLib
- - System.String
+ - System.Boolean
@@ -3433,37 +3514,37 @@
- true
- - Planning group to attach the tool to. If empty, the main planning group is taken from `robot_cell`.
- - efc78418-137f-4d2a-bc1e-9ac84b85ba02
- - group
- - group
+ - Draw collision meshes. Defaults to False.
+ - df827498-35ea-4d0b-8421-db67c2ea9dc5
+ - draw_collision
+ - draw_collision
- true
- 0
- 2
- true
- 0
- - Planning group to attach the tool to. If empty, the main planning group is taken from `robot_cell`.
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+ - Draw collision meshes. Defaults to False.
+ - d60527f5-b5af-4ef6-8970-5f96fe412559
-
- 2486
- 186
- 90
+ 2755
+ 150
+ 70
20
-
- 2532.5
- 196
+ 2791.5
+ 160
- System.Private.CoreLib
- - System.String
+ - System.Boolean
@@ -3471,30 +3552,68 @@
- true
- - Optional Rhino Plane or COMPAS Frame describing the tool's frame relative to the end-effector link. Defaults to World XY (coincident with the end link).
- - a7f72b11-5611-4e89-a36b-81f37715729b
- - attachment_plane
- - attachment_plane
+ - Scale factor for the drawn geometry: meter_value / native_scale = native_value. Use 0.001 for a millimeter document. Defaults to 1.0.
+ - 9fb3f85b-9eef-4a39-a92b-7d864813ecdc
+ - native_scale
+ - native_scale
- true
- 0
- 2
- true
- 0
- - Optional Rhino Plane or COMPAS Frame describing the tool's frame relative to the end-effector link. Defaults to World XY (coincident with the end link).
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+ - Scale factor for the drawn geometry: meter_value / native_scale = native_value. Use 0.001 for a millimeter document. Defaults to 1.0.
+ - 9d51e32e-c038-4352-9554-f4137ca91b9a
-
- 2486
- 206
- 90
+ 2755
+ 170
+ 70
20
-
- 2532.5
- 216
+ 2791.5
+ 180
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Double
+
+
+
+
+
+
+ - false
+ - Rhino meshes of the robot model.
+ - a10405c9-71de-4f11-861b-bd07a05b37f3
+ - robot_meshes
+ - robot_meshes
+ - false
+ - 0
+ - 2
+ - true
+ - 0
+ - Rhino meshes of the robot model.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 2855
+ 90
+ 99
+ 25
+
+ -
+ 2904.5
+ 102.5
@@ -3506,72 +3625,110 @@
-
+
- - 1
- - true
- - Optional list of robot link names allowed to collide with the tool.
- - b0b069e8-af5a-4216-9545-d1ebba73f40f
- - touch_links
- - touch_links
- - true
- - 1
+ - false
+ - Rhino meshes of all tool models in the cell.
+ - true
+ - 6502b183-bd8e-480f-9d1a-d5de5c1a6a4f
+ - tool_meshes
+ - tool_meshes
+ - false
+ - 0
- 2
- true
- 0
- - Optional list of robot link names allowed to collide with the tool.
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+ - Rhino meshes of all tool models in the cell.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2486
- 226
- 90
- 20
+ 2855
+ 115
+ 99
+ 25
-
- 2532.5
- 236
+ 2904.5
+ 127.5
- System.Private.CoreLib
- - System.String
+ - System.Object
-
+
- false
- - New RobotCellState with the tool attached.
- - 69e48047-60c1-4584-8133-6458bdb0f4da
- - cell_state
- - cell_state
+ - Rhino meshes of all rigid bodies in the cell.
+ - 4e5f49ec-4d8c-4aed-b12d-1b7dd2b223df
+ - rigid_body_meshes
+ - rigid_body_meshes
- false
- 0
- 2
- true
- 0
- - New RobotCellState with the tool attached.
+ - Rhino meshes of all rigid bodies in the cell.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2606
- 126
- 52
- 120
+ 2855
+ 140
+ 99
+ 25
-
- 2632
- 186
+ 2904.5
+ 152.5
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+ - false
+ - Rhino plane at the robot's base frame.
+ - 29539e21-299b-4f8f-af94-2afad9c5a860
+ - base_plane
+ - base_plane
+ - false
+ - 0
+ - 2
+ - true
+ - 0
+ - Rhino plane at the robot's base frame.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 2855
+ 165
+ 99
+ 25
+
+ -
+ 2904.5
+ 177.5
@@ -3590,8 +3747,8 @@
- true
- false
- true
- - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpBdHRhY2ggYSB0b29sIHRvIGEgcm9ib3QgcGxhbm5pbmcgZ3JvdXAgaW5zaWRlIGEgUm9ib3RDZWxsU3RhdGUuCgpQYXNzdGhyb3VnaCBidWlsZGVyOiB0aGUgaW5wdXQgc3RhdGUgaXMgY29waWVkLCB0aGUgYXR0YWNobWVudCBpcyBzZXQsIGFuZAp0aGUgbmV3IHN0YXRlIGlzIHJldHVybmVkLgoKV2hlbiBgcm9ib3RfY2VsbGAgaXMgd2lyZWQgYW5kIGB0b29sX2lkYCBoYXMgbm8gc291cmNlLCB0aGUgY29tcG9uZW50CmF1dG8tY3JlYXRlcyBhIFZhbHVlIExpc3QgZHJvcGRvd24gbGlzdGluZyBldmVyeSB0b29sIGN1cnJlbnRseSBpbgpgY2VsbC50b29sX21vZGVsc2AgKHJlZnJlc2hlZCB3aGVuIHRoZSBzZXQgY2hhbmdlcykuIFRoZSBgdG9vbF9pZGAgaXMgYWxzbwp2YWxpZGF0ZWQgYWdhaW5zdCBgY2VsbC50b29sX21vZGVsc2A7IGFuIHVua25vd24gaWQgcmFpc2VzIGFuIGVycm9yIHJhdGhlcgp0aGFuIHByb2R1Y2luZyBhIGJyb2tlbiBzdGF0ZS4KCklmIGBjZWxsX3N0YXRlYCBpcyBsZWZ0IHVud2lyZWQsIHRoZSBkZWZhdWx0IHN0YXRlIGlzIGRlcml2ZWQgZnJvbQpgcm9ib3RfY2VsbGAsIHNvIGF0dGFjaGluZyBhIHNpbmdsZSB0b29sIG5lZWRzIG9ubHkgYHJvYm90X2NlbGxgICsgYHRvb2xfaWRgLgoKSWYgYGdyb3VwYCBpcyBsZWZ0IGVtcHR5LCB0aGUgY2VsbCdzIG1haW4gcGxhbm5pbmcgZ3JvdXAgaXMgdXNlZCAocmVxdWlyZXMKYHJvYm90X2NlbGxgIHRvIGJlIHdpcmVkIGluKS4gQW55IHRvb2wgYWxyZWFkeSBhdHRhY2hlZCB0byB0aGUgc2FtZSBncm91cCBpcwphdXRvbWF0aWNhbGx5IGRldGFjaGVkLgoKSWYgYHRvdWNoX2xpbmtzYCBpcyBsZWZ0IHVud2lyZWQsIHRoZSBjb21wb25lbnQgZGVmYXVsdHMgdG8gdGhlIGVuZC1lZmZlY3RvcgpsaW5rIG9mIHRoZSBwbGFubmluZyBncm91cCAocGx1cyBpdHMgcGFyZW50IGxpbmsgd2hlbiB0aGUgZW5kLWVmZmVjdG9yIGxpbmsKaXRzZWxmIGhhcyBubyBnZW9tZXRyeSwgZS5nLiBVUidzIGB0b29sMGAgaXMgYSB6ZXJvLWdlb21ldHJ5IGZyYW1lIHNvIHRoZQpwYXJlbnQgYHdyaXN0XzNfbGlua2AgaXMgaW5jbHVkZWQgYXV0b21hdGljYWxseSkuIEEgcmVtYXJrIGlzIHN1cmZhY2VkIHNvCnRoZSBhdXRvLXBpY2sgaXNuJ3Qgc2lsZW50LgoKQSByZW1hcmsgYWx3YXlzIGFubm91bmNlcyB0aGUgbGluayB0aGUgdG9vbCBhY3R1YWxseSBlbmRzIHVwIGF0dGFjaGVkIHRvOgp0aGUgcGxhbm5pbmcgZ3JvdXAncyBlbmQtZWZmZWN0b3IgbGluayBhcyByZXR1cm5lZCBieQpgcm9ib3RfY2VsbC5nZXRfZW5kX2VmZmVjdG9yX2xpbmtfbmFtZShncm91cClgLiBPdmVycmlkZSB0aGF0IGVmZmVjdGl2ZQpmcmFtZSB2aWEgdGhlIGBhdHRhY2htZW50X3BsYW5lYCBpbnB1dC4KCkNPTVBBUyBGQUIgdjIuMC4wCiIiIgoKZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQoKaW1wb3J0IEdyYXNzaG9wcGVyCmltcG9ydCBSaGlubwppbXBvcnQgU3lzdGVtCmZyb20gY29tcGFzLmdlb21ldHJ5IGltcG9ydCBGcmFtZQpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgZXJyb3IKZnJvbSBjb21wYXNfZ2hweXRob24gaW1wb3J0IHJlbWFyawpmcm9tIGNvbXBhc19yaGluby5jb252ZXJzaW9ucyBpbXBvcnQgcGxhbmVfdG9fY29tcGFzX2ZyYW1lCgpmcm9tIGNvbXBhc19mYWIuZ2hweXRob24gaW1wb3J0IGVuc3VyZV9keW5hbWljX3ZhbHVlX2xpc3QKCgpjbGFzcyBBdHRhY2hUb29sVG9Sb2JvdChHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLAogICAgICAgICAgICByb2JvdF9jZWxsLAogICAgICAgICAgICBjZWxsX3N0YXRlLAogICAgICAgICAgICB0b29sX2lkOiBzdHIsCiAgICAgICAgICAgIGdyb3VwOiBzdHIsCiAgICAgICAgICAgIGF0dGFjaG1lbnRfcGxhbmUsCiAgICAgICAgICAgIHRvdWNoX2xpbmtzOiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W3N0cl0pOgogICAgICAgICMgQXV0by1wb3B1bGF0ZSB0aGUgdG9vbF9pZCBkcm9wZG93biBmcm9tIHRoZSBjZWxsJ3MgdG9vbCBpbnZlbnRvcnkuCiAgICAgICAgIyBSdW5zIGV2ZW4gd2hlbiB0b29sX2lkIGlzIGN1cnJlbnRseSBOb25lOiB0aGF0J3MgdGhlIHRyaWdnZXIuCiAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZW5zdXJlX2R5bmFtaWNfdmFsdWVfbGlzdCgKICAgICAgICAgICAgICAgIGdoZW52LkNvbXBvbmVudCwgICMgbm9xYTogRjgyMQogICAgICAgICAgICAgICAgInRvb2xfaWQiLAogICAgICAgICAgICAgICAgc29ydGVkKHJvYm90X2NlbGwudG9vbF9tb2RlbHMua2V5cygpKSwKICAgICAgICAgICAgKQoKICAgICAgICBpZiBub3QgdG9vbF9pZDoKICAgICAgICAgICAgcmV0dXJuIGNlbGxfc3RhdGUKCiAgICAgICAgdG9vbF9pZCA9IHRvb2xfaWQuc3RyaXAoKQoKICAgICAgICAjIFZhbGlkYXRlIHRoZSB0b29sIGV4aXN0cyBpbiB0aGUgY2VsbCBiZWZvcmUgYXR0YWNoaW5nIGl0LgogICAgICAgIGlmIHJvYm90X2NlbGwgaXMgbm90IE5vbmUgYW5kIHRvb2xfaWQgbm90IGluIHJvYm90X2NlbGwudG9vbF9tb2RlbHM6CiAgICAgICAgICAgIGVycm9yKCAgIyBub3FhOiBGODIxCiAgICAgICAgICAgICAgICBnaGVudi5Db21wb25lbnQsICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgICJUb29sIGlkICd7fScgaXMgbm90IGluIHRoZSByb2JvdCBjZWxsLiBBdmFpbGFibGUgdG9vbHM6IHt9LiIuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgIHRvb2xfaWQsICIsICIuam9pbihzb3J0ZWQocm9ib3RfY2VsbC50b29sX21vZGVscy5rZXlzKCkpKSBvciAiKG5vbmUpIgogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gY2VsbF9zdGF0ZQoKICAgICAgICAjIERlcml2ZSB0aGUgZGVmYXVsdCBzdGF0ZSBmcm9tIHRoZSBjZWxsIHdoZW4gYGNlbGxfc3RhdGVgIGlzIGxlZnQgdW53aXJlZC4KICAgICAgICBpZiBjZWxsX3N0YXRlIGlzIE5vbmU6CiAgICAgICAgICAgIGlmIHJvYm90X2NlbGwgaXMgTm9uZToKICAgICAgICAgICAgICAgIGVycm9yKGdoZW52LkNvbXBvbmVudCwgIldpcmUgYSBgY2VsbF9zdGF0ZWAsIG9yIHdpcmUgYHJvYm90X2NlbGxgIHNvIHRoZSBkZWZhdWx0IHN0YXRlIGNhbiBiZSBkZXJpdmVkLiIpICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgICAgIGNlbGxfc3RhdGUgPSByb2JvdF9jZWxsLmRlZmF1bHRfY2VsbF9zdGF0ZSgpCgogICAgICAgIGlmIG5vdCBncm91cDoKICAgICAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBOb25lOgogICAgICAgICAgICAgICAgZXJyb3IoZ2hlbnYuQ29tcG9uZW50LCAiYGdyb3VwYCBpcyBlbXB0eSBhbmQgbm8gYHJvYm90X2NlbGxgIHdhcyB3aXJlZCBpbjogcHJvdmlkZSBvbmUgb3IgdGhlIG90aGVyIHNvIHRoZSB0b29sJ3MgcGxhbm5pbmcgZ3JvdXAgY2FuIGJlIHJlc29sdmVkLiIpICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgIHJldHVybiBjZWxsX3N0YXRlCiAgICAgICAgICAgIGdyb3VwID0gcm9ib3RfY2VsbC5tYWluX2dyb3VwX25hbWUKCiAgICAgICAgZ3JvdXAgPSBncm91cC5zdHJpcCgpCgogICAgICAgIGF0dGFjaG1lbnRfZnJhbWUgPSBOb25lCiAgICAgICAgaWYgYXR0YWNobWVudF9wbGFuZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgYXR0YWNobWVudF9mcmFtZSA9IGF0dGFjaG1lbnRfcGxhbmUgaWYgaXNpbnN0YW5jZShhdHRhY2htZW50X3BsYW5lLCBGcmFtZSkgZWxzZSBwbGFuZV90b19jb21wYXNfZnJhbWUoYXR0YWNobWVudF9wbGFuZSkKCiAgICAgICAgdG91Y2hfbGlua3NfbGlzdCA9IGxpc3QodG91Y2hfbGlua3MpIGlmIHRvdWNoX2xpbmtzIGVsc2UgTm9uZQoKICAgICAgICBpZiB0b3VjaF9saW5rc19saXN0IGlzIE5vbmUgYW5kIHJvYm90X2NlbGwgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHRvdWNoX2xpbmtzX2xpc3QgPSByb2JvdF9jZWxsLmRlZmF1bHRfdG91Y2hfbGlua3MoZ3JvdXApCiAgICAgICAgICAgIHJlbWFyayhnaGVudi5Db21wb25lbnQsICJ0b3VjaF9saW5rcyB1bndpcmVkOyBkZWZhdWx0ZWQgdG8ge30gKGxpbmtzIHRoZSB0b29sIGluZXZpdGFibHkgb3ZlcmxhcHMpLiBXaXJlIHlvdXIgb3duIGxpc3QgdG8gb3ZlcnJpZGUuIi5mb3JtYXQodG91Y2hfbGlua3NfbGlzdCkpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBub3QgTm9uZToKICAgICAgICAgICAgZWVfbGluayA9IHJvYm90X2NlbGwuZ2V0X2VuZF9lZmZlY3Rvcl9saW5rX25hbWUoZ3JvdXApCiAgICAgICAgICAgIHJlbWFyayggICMgbm9xYTogRjgyMQogICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LCAgIyBub3FhOiBGODIxCiAgICAgICAgICAgICAgICAiYXR0YWNoaW5nICd7fScgYXQgbGluayAne30nIChncm91cCAne30nIGVuZC1lZmZlY3RvcikuIFRoZSB0b29sJ3MgYHRvb2wwYCBmcmFtZSBpcyBhdCB0aGlzIGxpbms7ICIKICAgICAgICAgICAgICAgICJ1c2UgYGF0dGFjaG1lbnRfcGxhbmVgIHRvIHJvdGF0ZS9vZmZzZXQgdGhlIHRvb2wgcmVsYXRpdmUgdG8gaXQuIi5mb3JtYXQodG9vbF9pZCwgZWVfbGluaywgZ3JvdXApLAogICAgICAgICAgICApCgogICAgICAgIG5ld19zdGF0ZSA9IGRlZXBjb3B5KGNlbGxfc3RhdGUpCiAgICAgICAgbmV3X3N0YXRlLnNldF90b29sX2F0dGFjaGVkX3RvX2dyb3VwKAogICAgICAgICAgICB0b29sX2lkPXRvb2xfaWQsCiAgICAgICAgICAgIGdyb3VwPWdyb3VwLAogICAgICAgICAgICBhdHRhY2htZW50X2ZyYW1lPWF0dGFjaG1lbnRfZnJhbWUsCiAgICAgICAgICAgIHRvdWNoX2xpbmtzPXRvdWNoX2xpbmtzX2xpc3QsCiAgICAgICAgKQogICAgICAgIHJldHVybiBuZXdfc3RhdGUK
- - COMPAS FAB: Attach Tool To Robot
+ - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpEcmF3IGEgUm9ib3RDZWxsIGF0IHRoZSBjb25maWd1cmF0aW9uIGRlc2NyaWJlZCBieSBhIFJvYm90Q2VsbFN0YXRlLgoKSWYgbm8gYGNlbGxfc3RhdGVgIGlzIHdpcmVkLCB0aGUgY2VsbCdzIGRlZmF1bHQgc3RhdGUgaXMgdXNlZCwgc28gdGhlIGNlbGwgaXMKc3RpbGwgZHJhd24gKGluIGl0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCBub3RoaW5nIGF0dGFjaGVkKS4KClRoaXMgY29tcG9uZW50IHJldXNlcyBhIGNhY2hlZCBgUm9ib3RDZWxsT2JqZWN0YCBrZXllZCBvbiB0aGUgaW5wdXQgY2VsbCdzCmlkZW50aXR5LCBzbyBtZXNoZXMgYXJlIG9ubHkgYnVpbHQgb25jZSBwZXIgY2FudmFzIHNlc3Npb24gYW5kIHN1YnNlcXVlbnQKc3RhdGUgY2hhbmdlcyBvbmx5IHVwZGF0ZSB0cmFuc2Zvcm1zIChmYXN0KS4KClRoZSByb2JvdCBtb2RlbCwgdG9vbHMsIGFuZCByaWdpZCBib2RpZXMgYXJlIHJldHVybmVkIGFzIHNlcGFyYXRlIG91dHB1dHMgdG8KbWFrZSB3aXJpbmcgZG93bnN0cmVhbSBzdHlsaW5nL2ZpbHRlcmluZyBlYXN5LgoKQ09NUEFTIEZBQiB2Mi4wLjAKIiIiCgppbXBvcnQgR3Jhc3Nob3BwZXIKaW1wb3J0IFJoaW5vCmltcG9ydCBTeXN0ZW0KZnJvbSBjb21wYXMuc2NlbmUgaW1wb3J0IFNjZW5lT2JqZWN0CmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBjcmVhdGVfaWQKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IGZyYW1lX3RvX3JoaW5vX3BsYW5lCmZyb20gc2NyaXB0Y29udGV4dCBpbXBvcnQgc3RpY2t5IGFzIHN0Cgpmcm9tIGNvbXBhc19mYWIuZ2hweXRob24uc2NlbmUgaW1wb3J0IFJvYm90Q2VsbE9iamVjdAoKCmNsYXNzIFZpc3VhbGl6ZVJvYm90Q2VsbChHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLAogICAgICAgICAgICByb2JvdF9jZWxsLAogICAgICAgICAgICBjZWxsX3N0YXRlLAogICAgICAgICAgICBkcmF3X3Zpc3VhbDogYm9vbCwKICAgICAgICAgICAgZHJhd19jb2xsaXNpb246IGJvb2wsCiAgICAgICAgICAgIG5hdGl2ZV9zY2FsZTogZmxvYXQpOgogICAgICAgIGlmIHJvYm90X2NlbGwgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCBOb25lLCBOb25lKQoKICAgICAgICAjIEZhbGwgYmFjayB0byB0aGUgY2VsbCdzIGRlZmF1bHQgc3RhdGUgd2hlbiBub25lIGlzIHdpcmVkLiBUaGUgY2hpbGQKICAgICAgICAjIHNjZW5lIG9iamVjdHMgKHJvYm90IG1vZGVsLCB0b29scywgcmlnaWQgYm9kaWVzKSBhcmUgb25seSBidWlsdCB3aGVuIGEKICAgICAgICAjIHN0YXRlIGlzIGFwcGxpZWQsIHNvIHdpdGhvdXQgdGhpcyB0aGUgZHJhd3MgYmVsb3cgaGl0IGEgTm9uZSBvYmplY3QuCiAgICAgICAgaWYgY2VsbF9zdGF0ZSBpcyBOb25lOgogICAgICAgICAgICBjZWxsX3N0YXRlID0gcm9ib3RfY2VsbC5kZWZhdWx0X2NlbGxfc3RhdGUoKQoKICAgICAgICBkcmF3X3Zpc3VhbCA9IFRydWUgaWYgZHJhd192aXN1YWwgaXMgTm9uZSBlbHNlIGRyYXdfdmlzdWFsCiAgICAgICAgZHJhd19jb2xsaXNpb24gPSBGYWxzZSBpZiBkcmF3X2NvbGxpc2lvbiBpcyBOb25lIGVsc2UgZHJhd19jb2xsaXNpb24KICAgICAgICBuYXRpdmVfc2NhbGUgPSBuYXRpdmVfc2NhbGUgaWYgbmF0aXZlX3NjYWxlIGVsc2UgMS4wCgogICAgICAgIGtleSA9IGNyZWF0ZV9pZCggICMgbm9xYTogRjgyMQogICAgICAgICAgICBnaGVudi5Db21wb25lbnQsICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgInJvYm90X2NlbGxfb2JqZWN0X3t9X3t9X3t9X3t9Ii5mb3JtYXQoaWQocm9ib3RfY2VsbCksIGRyYXdfdmlzdWFsLCBkcmF3X2NvbGxpc2lvbiwgbmF0aXZlX3NjYWxlKSwKICAgICAgICApCiAgICAgICAgc2NlbmVfb2JqZWN0ID0gc3QuZ2V0KGtleSkKICAgICAgICBpZiBzY2VuZV9vYmplY3QgaXMgTm9uZToKICAgICAgICAgICAgc2NlbmVfb2JqZWN0ID0gU2NlbmVPYmplY3QoCiAgICAgICAgICAgICAgICBpdGVtPXJvYm90X2NlbGwsCiAgICAgICAgICAgICAgICBzY2VuZW9iamVjdF90eXBlPVJvYm90Q2VsbE9iamVjdCwKICAgICAgICAgICAgICAgIGRyYXdfdmlzdWFsPWRyYXdfdmlzdWFsLAogICAgICAgICAgICAgICAgZHJhd19jb2xsaXNpb249ZHJhd19jb2xsaXNpb24sCiAgICAgICAgICAgICAgICBuYXRpdmVfc2NhbGU9bmF0aXZlX3NjYWxlLAogICAgICAgICAgICApCiAgICAgICAgICAgIHN0W2tleV0gPSBzY2VuZV9vYmplY3QKCiAgICAgICAgc2NlbmVfb2JqZWN0LnVwZGF0ZShjZWxsX3N0YXRlKQoKICAgICAgICAjIENvbGxlY3Qgb3V0cHV0cyBmcm9tIHRoZSBjaGlsZCBzY2VuZSBvYmplY3RzIGRpcmVjdGx5IHNvIGVhY2ggb3V0cHV0CiAgICAgICAgIyBjYW4gYmUgd2lyZWQgc2VwYXJhdGVseSB3aXRob3V0IHJlLXJ1bm5pbmcgZHJhdygpLgogICAgICAgIHJvYm90X21lc2hlcyA9IHNjZW5lX29iamVjdC5fcm9ib3RfbW9kZWxfc2NlbmVfb2JqZWN0LmRyYXcoKQoKICAgICAgICB0b29sX21lc2hlcyA9IFtdCiAgICAgICAgZm9yIHRvb2xfc28gaW4gc2NlbmVfb2JqZWN0Ll90b29sX3NjZW5lX29iamVjdHMudmFsdWVzKCk6CiAgICAgICAgICAgIHRvb2xfbWVzaGVzLmV4dGVuZCh0b29sX3NvLmRyYXcoKSkKCiAgICAgICAgcmlnaWRfYm9keV9tZXNoZXMgPSBbXQogICAgICAgIGZvciByYl9zbyBpbiBzY2VuZV9vYmplY3QuX3JpZ2lkX2JvZHlfc2NlbmVfb2JqZWN0cy52YWx1ZXMoKToKICAgICAgICAgICAgcmlnaWRfYm9keV9tZXNoZXMuZXh0ZW5kKHJiX3NvLmRyYXcoKSkKCiAgICAgICAgYmFzZV9wbGFuZSA9IE5vbmUKICAgICAgICBpZiBjZWxsX3N0YXRlLnJvYm90X2Jhc2VfZnJhbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGJhc2VfcGxhbmUgPSBmcmFtZV90b19yaGlub19wbGFuZShjZWxsX3N0YXRlLnJvYm90X2Jhc2VfZnJhbWUpCgogICAgICAgIHJldHVybiAocm9ib3RfbWVzaGVzLCB0b29sX21lc2hlcywgcmlnaWRfYm9keV9tZXNoZXMsIGJhc2VfcGxhbmUpCg==
+ - COMPAS FAB: Visualize Robot Cell
@@ -3605,7 +3762,7 @@
-
- 383
+ 575
199
550
650
@@ -3619,24 +3776,23 @@
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- - COMPAS FAB: Visualize Robot Cell
+ - COMPAS FAB: ROS Client
-
+
- true
- - true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvElEQVRIDWNgoDFgRDb/////UUB+5pOnz62/fPmCIoesDhubh4fnv4y05FGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYB4+fPPtHapgTcgAoTmRlpJjAPqC24SDLYWbCgoiQg8iWZ0HXee/+A4bLV66BhXV1tBiUFBXQlaDwCalHsWDT5m0MS1esQjEgOiKMwc/XC0UMxiFGPdwCkEtAhouICDOEBgeCzVi9dj1YTAfqk70vP4DFncUFGIhRD1IMtwAWLCDDHexswAY9/cfI0Pn2D0Pk9VcMjHfeM3z8/Rcszs/KzPD/92+G70GJDOXCLED11mBxEDF95hxwEMOCln6RDIpQEAAFCwwcW7+eQfPNW4b2lgZwZKMHUWVNA8MxYJBKM/0Ha4HphZkFEgRntOs3boFVEBNpYJOgBCH1mhpqjCgWgPQRSnbIFhBSj9UCdAMo4YMsoHkkgy0AFUyUuBSbXpiZYAugNRE2dWSLwcyEBdF0sk3CrRFsJtgCUM0DquZwqyVNBlplgutlcDKFaadFpQ8zm2Y0AJ2kxEQg2Zf8AAAAAElFTkSuQmCC
- - c300a51d-ea1d-4a6f-aac8-a4d4a36ca3fd
+ - d669cfde-80ea-4143-bcdc-260a09b8dd65
- true
- false
- true
- - COMPAS FAB: Visualize Robot Cell
- - COMPAS FAB: Visualize Robot Cell
+ - COMPAS FAB: ROS Client
+ - COMPAS FAB: ROS Client
- 3
- false
@@ -3648,67 +3804,64 @@
-
- 2753
- 88
- 203
- 104
+ 281
+ 71
+ 151
+ 84
-
- 2840
- 140
+ 345
+ 113
-
- - 5
+
+ - 4
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 4
+ - 3
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
-
+
-
+
- true
- - The RobotCell to draw.
- - 0c5aa94e-7a38-43c6-adf2-eee52207dafd
- - robot_cell
- - robot_cell
+ - ROS bridge host. Defaults to '127.0.0.1'.
+ - c2f35edf-a776-4bfe-acc6-7426fe3408e6
+ - host
+ - host
- true
- 0
- 2
- true
- - 4faef0a9-d25c-40bb-862f-6f5183f66019
- - 1
- - The RobotCell to draw.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+ - 0
+ - ROS bridge host. Defaults to '127.0.0.1'.
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
-
- 2755
- 90
- 70
+ 283
+ 73
+ 47
20
-
- 2791.5
- 100
+ 308
+ 83
- System.Private.CoreLib
- - System.Object
+ - System.String
@@ -3716,69 +3869,70 @@
- true
- - Optional RobotCellState describing the configuration to draw. If unwired, the cell's default state is used.
- - 099fb9a6-50e4-488c-8fb8-e961b1a1251b
- - cell_state
- - cell_state
+ - ROS bridge port. Defaults to 9090.
+ - 2652f473-4a38-4bd5-a19b-49dcd5e5d507
+ - port
+ - port
- true
- 0
- 2
- true
- - 69e48047-60c1-4584-8133-6458bdb0f4da
+ - 7508753f-ee58-41f3-927d-759349106fed
- 1
- - Optional RobotCellState describing the configuration to draw. If unwired, the cell's default state is used.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+ - ROS bridge port. Defaults to 9090.
+ - 48d01794-d3d8-4aef-990e-127168822244
-
- 2755
- 110
- 70
+ 283
+ 93
+ 47
20
-
- 2791.5
- 120
+ 308
+ 103
- System.Private.CoreLib
- - System.Object
+ - System.Int32
-
+
- true
- - Draw visual meshes. Defaults to True.
- - fbb9921d-2976-406f-bae0-f496a01fc3f3
- - draw_visual
- - draw_visual
+ - If True, (re)connects. If False, disconnects. A Boolean Toggle (defaulting to False) is auto-created on this input when nothing is wired.
+ - 4db7c716-8be5-41c0-8dd3-1c0a38d0885a
+ - connect
+ - connect
- true
- 0
- 2
- true
- - 0
- - Draw visual meshes. Defaults to True.
+ - cabb38ef-411b-4279-aa2d-497d7c31c5c7
+ - 1
+ - If True, (re)connects. If False, disconnects. A Boolean Toggle (defaulting to False) is auto-created on this input when nothing is wired.
- d60527f5-b5af-4ef6-8970-5f96fe412559
-
- 2755
- 130
- 70
+ 283
+ 113
+ 47
20
-
- 2791.5
- 140
+ 308
+ 123
@@ -3791,77 +3945,40 @@
-
- - true
- - Draw collision meshes. Defaults to False.
- - df827498-35ea-4d0b-8421-db67c2ea9dc5
- - draw_collision
- - draw_collision
- - true
- - 0
- - 2
- - true
- - 0
- - Draw collision meshes. Defaults to False.
- - d60527f5-b5af-4ef6-8970-5f96fe412559
-
-
-
-
- -
- 2755
- 150
- 70
- 20
-
- -
- 2791.5
- 160
-
-
-
-
-
- - System.Private.CoreLib
- - System.Boolean
-
-
-
-
-
-
+
- true
- - Scale factor for the drawn geometry: meter_value / native_scale = native_value. Use 0.001 for a millimeter document. Defaults to 1.0.
- - 9fb3f85b-9eef-4a39-a92b-7d864813ecdc
- - native_scale
- - native_scale
+ - Optional roslibpy transport: 'twisted' (default on most platforms), 'asyncio' (opt-in, requires roslibpy[asyncio]), or 'cli' (IronPython). When empty the choice falls through to ROSLIBPY_TRANSPORT and roslibpy.set_default_transport.
+ - 5a940e85-9726-4ead-81c1-3e2f8dfd9716
+ - transport
+ - transport
- true
- 0
- 2
- true
- - 0
- - Scale factor for the drawn geometry: meter_value / native_scale = native_value. Use 0.001 for a millimeter document. Defaults to 1.0.
- - 9d51e32e-c038-4352-9554-f4137ca91b9a
+ - 14c71912-2008-445b-9fc4-bc21691e2d07
+ - 1
+ - Optional roslibpy transport: 'twisted' (default on most platforms), 'asyncio' (opt-in, requires roslibpy[asyncio]), or 'cli' (IronPython). When empty the choice falls through to ROSLIBPY_TRANSPORT and roslibpy.set_default_transport.
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
-
- 2755
- 170
- 70
+ 283
+ 133
+ 47
20
-
- 2791.5
- 180
+ 308
+ 143
- System.Private.CoreLib
- - System.Double
+ - System.String
@@ -3869,30 +3986,30 @@
- false
- - Rhino meshes of the robot model.
- - a10405c9-71de-4f11-861b-bd07a05b37f3
- - robot_meshes
- - robot_meshes
+ - Connected RosClient (or None if disconnected).
+ - 3cc3528f-e4c6-4289-aa09-ea2f4e282515
+ - ros_client
+ - ros_client
- false
- 0
- 2
- true
- 0
- - Rhino meshes of the robot model.
+ - Connected RosClient (or None if disconnected).
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2855
- 90
- 99
- 25
+ 360
+ 73
+ 70
+ 26
-
- 2904.5
- 102.5
+ 395
+ 86.333336
@@ -3905,71 +4022,32 @@
-
- - false
- - Rhino meshes of all tool models in the cell.
- - true
- - 6502b183-bd8e-480f-9d1a-d5de5c1a6a4f
- - tool_meshes
- - tool_meshes
- - false
- - 0
- - 2
- - true
- - 0
- - Rhino meshes of all tool models in the cell.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
-
-
-
- -
- 2855
- 115
- 99
- 25
-
- -
- 2904.5
- 127.5
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
- false
- - Rhino meshes of all rigid bodies in the cell.
- - 4e5f49ec-4d8c-4aed-b12d-1b7dd2b223df
- - rigid_body_meshes
- - rigid_body_meshes
+ - True if the client is currently connected.
+ - 59c3b947-6ae3-4172-8726-0967daa1ba6d
+ - is_connected
+ - is_connected
- false
- 0
- 2
- true
- 0
- - Rhino meshes of all rigid bodies in the cell.
+ - True if the client is currently connected.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2855
- 140
- 99
- 25
+ 360
+ 99
+ 70
+ 27
-
- 2904.5
- 152.5
+ 395
+ 113
@@ -3981,33 +4059,33 @@
-
+
- false
- - Rhino plane at the robot's base frame.
- - 29539e21-299b-4f8f-af94-2afad9c5a860
- - base_plane
- - base_plane
+ - Detected ROS distribution (e.g. 'noetic', 'jazzy').
+ - e987c8f1-282c-4982-8597-1cf3b2599a3b
+ - ros_distro
+ - ros_distro
- false
- 0
- 2
- true
- 0
- - Rhino plane at the robot's base frame.
+ - Detected ROS distribution (e.g. 'noetic', 'jazzy').
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2855
- 165
- 99
- 25
+ 360
+ 126
+ 70
+ 27
-
- 2904.5
- 177.5
+ 395
+ 139.66666
@@ -4026,8 +4104,8 @@
- true
- false
- true
- - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpEcmF3IGEgUm9ib3RDZWxsIGF0IHRoZSBjb25maWd1cmF0aW9uIGRlc2NyaWJlZCBieSBhIFJvYm90Q2VsbFN0YXRlLgoKSWYgbm8gYGNlbGxfc3RhdGVgIGlzIHdpcmVkLCB0aGUgY2VsbCdzIGRlZmF1bHQgc3RhdGUgaXMgdXNlZCwgc28gdGhlIGNlbGwgaXMKc3RpbGwgZHJhd24gKGluIGl0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gd2l0aCBub3RoaW5nIGF0dGFjaGVkKS4KClRoaXMgY29tcG9uZW50IHJldXNlcyBhIGNhY2hlZCBgUm9ib3RDZWxsT2JqZWN0YCBrZXllZCBvbiB0aGUgaW5wdXQgY2VsbCdzCmlkZW50aXR5LCBzbyBtZXNoZXMgYXJlIG9ubHkgYnVpbHQgb25jZSBwZXIgY2FudmFzIHNlc3Npb24gYW5kIHN1YnNlcXVlbnQKc3RhdGUgY2hhbmdlcyBvbmx5IHVwZGF0ZSB0cmFuc2Zvcm1zIChmYXN0KS4KClRoZSByb2JvdCBtb2RlbCwgdG9vbHMsIGFuZCByaWdpZCBib2RpZXMgYXJlIHJldHVybmVkIGFzIHNlcGFyYXRlIG91dHB1dHMgdG8KbWFrZSB3aXJpbmcgZG93bnN0cmVhbSBzdHlsaW5nL2ZpbHRlcmluZyBlYXN5LgoKQ09NUEFTIEZBQiB2Mi4wLjAKIiIiCgppbXBvcnQgR3Jhc3Nob3BwZXIKaW1wb3J0IFJoaW5vCmltcG9ydCBTeXN0ZW0KZnJvbSBjb21wYXMuc2NlbmUgaW1wb3J0IFNjZW5lT2JqZWN0CmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBjcmVhdGVfaWQKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IGZyYW1lX3RvX3JoaW5vX3BsYW5lCmZyb20gc2NyaXB0Y29udGV4dCBpbXBvcnQgc3RpY2t5IGFzIHN0Cgpmcm9tIGNvbXBhc19mYWIuZ2hweXRob24uc2NlbmUgaW1wb3J0IFJvYm90Q2VsbE9iamVjdAoKCmNsYXNzIFZpc3VhbGl6ZVJvYm90Q2VsbChHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLAogICAgICAgICAgICByb2JvdF9jZWxsLAogICAgICAgICAgICBjZWxsX3N0YXRlLAogICAgICAgICAgICBkcmF3X3Zpc3VhbDogYm9vbCwKICAgICAgICAgICAgZHJhd19jb2xsaXNpb246IGJvb2wsCiAgICAgICAgICAgIG5hdGl2ZV9zY2FsZTogZmxvYXQpOgogICAgICAgIGlmIHJvYm90X2NlbGwgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCBOb25lLCBOb25lKQoKICAgICAgICAjIEZhbGwgYmFjayB0byB0aGUgY2VsbCdzIGRlZmF1bHQgc3RhdGUgd2hlbiBub25lIGlzIHdpcmVkLiBUaGUgY2hpbGQKICAgICAgICAjIHNjZW5lIG9iamVjdHMgKHJvYm90IG1vZGVsLCB0b29scywgcmlnaWQgYm9kaWVzKSBhcmUgb25seSBidWlsdCB3aGVuIGEKICAgICAgICAjIHN0YXRlIGlzIGFwcGxpZWQsIHNvIHdpdGhvdXQgdGhpcyB0aGUgZHJhd3MgYmVsb3cgaGl0IGEgTm9uZSBvYmplY3QuCiAgICAgICAgaWYgY2VsbF9zdGF0ZSBpcyBOb25lOgogICAgICAgICAgICBjZWxsX3N0YXRlID0gcm9ib3RfY2VsbC5kZWZhdWx0X2NlbGxfc3RhdGUoKQoKICAgICAgICBkcmF3X3Zpc3VhbCA9IFRydWUgaWYgZHJhd192aXN1YWwgaXMgTm9uZSBlbHNlIGRyYXdfdmlzdWFsCiAgICAgICAgZHJhd19jb2xsaXNpb24gPSBGYWxzZSBpZiBkcmF3X2NvbGxpc2lvbiBpcyBOb25lIGVsc2UgZHJhd19jb2xsaXNpb24KICAgICAgICBuYXRpdmVfc2NhbGUgPSBuYXRpdmVfc2NhbGUgaWYgbmF0aXZlX3NjYWxlIGVsc2UgMS4wCgogICAgICAgIGtleSA9IGNyZWF0ZV9pZCggICMgbm9xYTogRjgyMQogICAgICAgICAgICBnaGVudi5Db21wb25lbnQsICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgInJvYm90X2NlbGxfb2JqZWN0X3t9X3t9X3t9X3t9Ii5mb3JtYXQoaWQocm9ib3RfY2VsbCksIGRyYXdfdmlzdWFsLCBkcmF3X2NvbGxpc2lvbiwgbmF0aXZlX3NjYWxlKSwKICAgICAgICApCiAgICAgICAgc2NlbmVfb2JqZWN0ID0gc3QuZ2V0KGtleSkKICAgICAgICBpZiBzY2VuZV9vYmplY3QgaXMgTm9uZToKICAgICAgICAgICAgc2NlbmVfb2JqZWN0ID0gU2NlbmVPYmplY3QoCiAgICAgICAgICAgICAgICBpdGVtPXJvYm90X2NlbGwsCiAgICAgICAgICAgICAgICBzY2VuZW9iamVjdF90eXBlPVJvYm90Q2VsbE9iamVjdCwKICAgICAgICAgICAgICAgIGRyYXdfdmlzdWFsPWRyYXdfdmlzdWFsLAogICAgICAgICAgICAgICAgZHJhd19jb2xsaXNpb249ZHJhd19jb2xsaXNpb24sCiAgICAgICAgICAgICAgICBuYXRpdmVfc2NhbGU9bmF0aXZlX3NjYWxlLAogICAgICAgICAgICApCiAgICAgICAgICAgIHN0W2tleV0gPSBzY2VuZV9vYmplY3QKCiAgICAgICAgc2NlbmVfb2JqZWN0LnVwZGF0ZShjZWxsX3N0YXRlKQoKICAgICAgICAjIENvbGxlY3Qgb3V0cHV0cyBmcm9tIHRoZSBjaGlsZCBzY2VuZSBvYmplY3RzIGRpcmVjdGx5IHNvIGVhY2ggb3V0cHV0CiAgICAgICAgIyBjYW4gYmUgd2lyZWQgc2VwYXJhdGVseSB3aXRob3V0IHJlLXJ1bm5pbmcgZHJhdygpLgogICAgICAgIHJvYm90X21lc2hlcyA9IHNjZW5lX29iamVjdC5fcm9ib3RfbW9kZWxfc2NlbmVfb2JqZWN0LmRyYXcoKQoKICAgICAgICB0b29sX21lc2hlcyA9IFtdCiAgICAgICAgZm9yIHRvb2xfc28gaW4gc2NlbmVfb2JqZWN0Ll90b29sX3NjZW5lX29iamVjdHMudmFsdWVzKCk6CiAgICAgICAgICAgIHRvb2xfbWVzaGVzLmV4dGVuZCh0b29sX3NvLmRyYXcoKSkKCiAgICAgICAgcmlnaWRfYm9keV9tZXNoZXMgPSBbXQogICAgICAgIGZvciByYl9zbyBpbiBzY2VuZV9vYmplY3QuX3JpZ2lkX2JvZHlfc2NlbmVfb2JqZWN0cy52YWx1ZXMoKToKICAgICAgICAgICAgcmlnaWRfYm9keV9tZXNoZXMuZXh0ZW5kKHJiX3NvLmRyYXcoKSkKCiAgICAgICAgYmFzZV9wbGFuZSA9IE5vbmUKICAgICAgICBpZiBjZWxsX3N0YXRlLnJvYm90X2Jhc2VfZnJhbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIGJhc2VfcGxhbmUgPSBmcmFtZV90b19yaGlub19wbGFuZShjZWxsX3N0YXRlLnJvYm90X2Jhc2VfZnJhbWUpCgogICAgICAgIHJldHVybiAocm9ib3RfbWVzaGVzLCB0b29sX21lc2hlcywgcmlnaWRfYm9keV9tZXNoZXMsIGJhc2VfcGxhbmUpCg==
- - COMPAS FAB: Visualize Robot Cell
+ - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDb25uZWN0IHRvIGEgUk9TIGJyaWRnZSAoUk9TIDEgb3IgUk9TIDIpLgoKVGhlIGNsaWVudCBpcyBjYWNoZWQgaW4gc3RpY2t5IGFuZCBzdXJ2aXZlcyBjYW52YXMgcmVmcmVzaGVzLiBUb2dnbGluZwpgY29ubmVjdGAgZnJvbSBUcnVlIHRvIEZhbHNlIGNsb3NlcyB0aGUgY29ubmVjdGlvbi4gVGhlIFJPUyBkaXN0cm8gaXMKYXV0by1kZXRlY3RlZCBhZnRlciBjb25uZWN0aW5nLgoKQ09NUEFTIEZBQiB2Mi4wLjAKIiIiCgppbXBvcnQgR3Jhc3Nob3BwZXIKaW1wb3J0IFJoaW5vCmltcG9ydCByb3NsaWJweQppbXBvcnQgU3lzdGVtCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBjcmVhdGVfaWQKZnJvbSBjb21wYXNfZ2hweXRob24gaW1wb3J0IHJlbWFyawpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgd2FybmluZwpmcm9tIHNjcmlwdGNvbnRleHQgaW1wb3J0IHN0aWNreSBhcyBzdAoKZnJvbSBjb21wYXNfZmFiLmJhY2tlbmRzIGltcG9ydCBSb3NDbGllbnQKZnJvbSBjb21wYXNfZmFiLmdocHl0aG9uIGltcG9ydCBlbnN1cmVfYm9vbGVhbl90b2dnbGUKCgpkZWYgX3Jvc2xpYnB5X3N1cHBvcnRzX3RyYW5zcG9ydCgpOgogICAgIiIiVGhlIGBgdHJhbnNwb3J0YGAgYXJndW1lbnQgd2FzIGludHJvZHVjZWQgaW4gcm9zbGlicHkgMi4xLiIiIgogICAgdHJ5OgogICAgICAgIG1ham9yLCBtaW5vciA9IChpbnQocGFydCkgZm9yIHBhcnQgaW4gcm9zbGlicHkuX192ZXJzaW9uX18uc3BsaXQoIi4iKVs6Ml0pCiAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpID49ICgyLCAxKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4gRmFsc2UKCgpjbGFzcyBSb3NDbGllbnRDb21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgaG9zdDogc3RyLCBwb3J0OiBpbnQsIGNvbm5lY3Q6IGJvb2wsIHRyYW5zcG9ydDogc3RyKToKICAgICAgICBlbnN1cmVfYm9vbGVhbl90b2dnbGUoZ2hlbnYuQ29tcG9uZW50LCAiY29ubmVjdCIsIGRlZmF1bHQ9RmFsc2UpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgaG9zdCA9IGhvc3Qgb3IgIjEyNy4wLjAuMSIKICAgICAgICBwb3J0ID0gcG9ydCBvciA5MDkwCiAgICAgICAgdHJhbnNwb3J0ID0gdHJhbnNwb3J0LnN0cmlwKCkgaWYgdHJhbnNwb3J0IGVsc2UgTm9uZQoKICAgICAgICBrZXkgPSBjcmVhdGVfaWQoZ2hlbnYuQ29tcG9uZW50LCAicm9zX2NsaWVudCIpICAjIG5vcWE6IEY4MjEKICAgICAgICByb3NfY2xpZW50ID0gc3QuZ2V0KGtleSwgTm9uZSkKCiAgICAgICAgaWYgcm9zX2NsaWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcm9zX2NsaWVudC5jbG9zZSgpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHdhcm5pbmcoZ2hlbnYuQ29tcG9uZW50LCAiRXJyb3IgY2xvc2luZyBwcmV2aW91cyBST1MgY2xpZW50OiB7fSIuZm9ybWF0KGUpKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIHN0LnBvcChrZXksIE5vbmUpCiAgICAgICAgICAgIHJvc19jbGllbnQgPSBOb25lCgogICAgICAgIGlmIHRyYW5zcG9ydCBhbmQgbm90IF9yb3NsaWJweV9zdXBwb3J0c190cmFuc3BvcnQoKToKICAgICAgICAgICAgd2FybmluZyhnaGVudi5Db21wb25lbnQsICJUaGUgJ3RyYW5zcG9ydCcgaW5wdXQgcmVxdWlyZXMgcm9zbGlicHkgPj0gMi4xOyBpZ25vcmluZyBpdC4iKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIHRyYW5zcG9ydCA9IE5vbmUKCiAgICAgICAgaWYgY29ubmVjdDoKICAgICAgICAgICAgaWYgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgcm9zX2NsaWVudCA9IFJvc0NsaWVudChob3N0LCBwb3J0LCB0cmFuc3BvcnQ9dHJhbnNwb3J0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcm9zX2NsaWVudCA9IFJvc0NsaWVudChob3N0LCBwb3J0KQogICAgICAgICAgICByb3NfY2xpZW50LnJ1big1KQogICAgICAgICAgICBzdFtrZXldID0gcm9zX2NsaWVudAoKICAgICAgICBpc19jb25uZWN0ZWQgPSBib29sKHJvc19jbGllbnQgYW5kIHJvc19jbGllbnQuaXNfY29ubmVjdGVkKQogICAgICAgIHJvc19kaXN0cm8gPSBOb25lCiAgICAgICAgaWYgaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByb3NfZGlzdHJvID0gcm9zX2NsaWVudC5yb3NfZGlzdHJvLnZhbHVlCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHJlbWFyayhnaGVudi5Db21wb25lbnQsICJDb3VsZCBub3QgZGV0ZWN0IFJPUyBkaXN0cm86IHt9Ii5mb3JtYXQoZSkpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgcmV0dXJuIChyb3NfY2xpZW50LCBpc19jb25uZWN0ZWQsIHJvc19kaXN0cm8pCg==
+ - COMPAS FAB: ROS Client
@@ -4041,10 +4119,10 @@
-
- 575
- 199
+ 469
+ 33
550
- 650
+ 850
@@ -4055,7 +4133,7 @@
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- - COMPAS FAB: ROS Client
+ - COMPAS FAB: MoveIt Planner
@@ -4064,14 +4142,14 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvElEQVRIDWNgoDFgRDb/////UUB+5uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYB48eP/1HapgTcgAoTuRkpZnAPqC24SDLYWbCgoiQg8iWZ0HXee/+A4bLV66BhXV1tBiUFBXQlaDwCalHsWDT5m0MS1esQjEgOiKMwc/XC0UMxiFGPdwCkEtAhouICDOEBgeCzVi9dj1YTAfqk70vP4DFncUFGIhRD1IMtwAWLCDDHexswAY9/cfI0Pn2D0Pk9VcMjHfeM3z8/Rcszs/KzPD/92+G70GJDOXCLED11mBxEDF95hxwEMOCln6RDIpQEAAFCwwcW7+eQfPNW4b2lgZwZKMHUWVNA8MxYJBKM/0Ha4HphZkFEgRntOs3boFVEBNpYJOgBCH1mhpqjCgWgPQRSnbIFhBSj9UCdAMo4YMsoHkkgy0AFUyUuBSbXpiZYAugNRE2dWSLwcyEBdF0sk3CrRFsJtgCUM0DquZwqyVNBlplgutlcDKFaadFpQ8zm2Y0AMLixEoY2NubAAAAAElFTkSuQmCC
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACUUlEQVRIDbVVPUgcURCeMxZ33C7EpFMvnWisNJhTUCHEJoiFJB6BNLaCgpZRAum0VVBIayPIabAIIYUJgUTIDyRpoid2mtiJgh634VbX9407z931iZo7B/bmvfn5vvdmuDdE1yyxIL7neX1qP7z1Z7s9n8+HfME40zqZTHqp2uoV5ZuKxWILEqNBFPh4bn1jVByl6Ib6uglFMgYMJsDJFXi2FNBoriLJ4CYVvmM4GlCGPWPyDTa3/h5JzQ8O8jQ3n6UfP39dieNecxM9e5ohy0pyHnpyJ1VTwTcQcHgA/v7DRyJPba7wIQe5IoJZKQbROHlV1U16NT0ppkvpgcER462lB7S6lqOF10vkOM7JyX3Y/q/rNLOxfYYENvhEXNflXGAERd8gu7jEJHAWi66O+bazT/ggg3XVrAE+HSEtqIOBBDi/V3P08sVzjtUEMID9zdt3VHlDmzkofdtmwPtKf1dkUXAE2ZZFzj+HerofUePdBs7DTwip73EvLUuDdQhR+pbNu/4vJyUBIWxRong8TsAIiu5B0GhaS3ngm22tN4UYbZog1GRDKE681t1Cs21mcPfwP5sc5ZJyRe2FgrnJ+gZocuZJLyUScUqoWoqg3iZBw4M+27Y4Fxj4RC5s8nn1xk3SkV6YmhwiACveFPztB4ZGQn84ORFr/cifWnd396jr4YNTg79iAjxM8nbgwYLwY2cA8vPOKIBLLpzAhGYINQ8+qXnQAUO5RM2Dz2oedEqTp8oFHMBhTCbA5MGYCzhLWvojk+dyqMrXMfRLOullko8BFYsFxtPMQ9sAAAAASUVORK5CYII=
- - d669cfde-80ea-4143-bcdc-260a09b8dd65
+ - 4393a904-1d39-422c-be8d-f07a18284b2f
- true
- false
- true
- - COMPAS FAB: ROS Client
- - COMPAS FAB: ROS Client
+ - COMPAS FAB: MoveIt Planner
+ - COMPAS FAB: MoveIt Planner
- 3
- false
@@ -4083,142 +4161,147 @@
-
- 281
- 71
- 151
- 84
+ 1159
+ 74
+ 191
+ 124
-
- 345
- 113
+ 1251
+ 136
-
- - 4
+
+ - 6
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 3
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 3
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
-
+
-
+
- true
- - ROS bridge host. Defaults to '127.0.0.1'.
- - c2f35edf-a776-4bfe-acc6-7426fe3408e6
- - host
- - host
+ - Connected RosClient (from the ROS Client component).
+ - de78af4c-b41c-4d0a-911a-5a4563ff8aa5
+ - ros_client
+ - ros_client
- true
- 0
- 2
- true
- - 0
- - ROS bridge host. Defaults to '127.0.0.1'.
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+ - 3cc3528f-e4c6-4289-aa09-ea2f4e282515
+ - 1
+ - Connected RosClient (from the ROS Client component).
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 283
- 73
- 47
+ 1161
+ 76
+ 75
20
-
- 308
- 83
+ 1200
+ 86
- System.Private.CoreLib
- - System.String
+ - System.Object
-
+
+ - 1
- true
- - ROS bridge port. Defaults to 9090.
- - 2652f473-4a38-4bd5-a19b-49dcd5e5d507
- - port
- - port
+ - Optional list of ToolModels to register into the cell. Each is keyed by its `.name`. Re-applied on every refresh without refetching.
+ - 1230f0c2-a82e-40f2-9d94-a077b31fd58a
+ - tools
+ - tools
- true
- - 0
+ - 1
- 2
- true
- - 7508753f-ee58-41f3-927d-759349106fed
+ - 3e1a6509-8a44-43de-bc75-d31a76526dbe
- 1
- - ROS bridge port. Defaults to 9090.
- - 48d01794-d3d8-4aef-990e-127168822244
+ - Optional list of ToolModels to register into the cell. Each is keyed by its `.name`. Re-applied on every refresh without refetching.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 283
- 93
- 47
+ 1161
+ 96
+ 75
20
-
- 308
- 103
+ 1200
+ 106
- System.Private.CoreLib
- - System.Int32
+ - System.Object
-
+
+ - 1
- true
- - If True, (re)connects. If False, disconnects. A Boolean Toggle (defaulting to False) is auto-created on this input when nothing is wired.
- - 4db7c716-8be5-41c0-8dd3-1c0a38d0885a
- - connect
- - connect
+ - Optional list of RigidBodies to register into the cell. Each is keyed by its `.name` (set it on the Rigid Body From… component).
+ - d31b266e-d72a-4537-a305-e2b50b497ec5
+ - rigid_bodies
+ - rigid_bodies
- true
- - 0
+ - 1
- 2
- true
- - cabb38ef-411b-4279-aa2d-497d7c31c5c7
+ - 758422be-0f15-43e4-8297-eef68a8e696c
- 1
- - If True, (re)connects. If False, disconnects. A Boolean Toggle (defaulting to False) is auto-created on this input when nothing is wired.
- - d60527f5-b5af-4ef6-8970-5f96fe412559
+ - Optional list of RigidBodies to register into the cell. Each is keyed by its `.name` (set it on the Rigid Body From… component).
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 283
- 113
- 47
+ 1161
+ 116
+ 75
20
-
- 308
- 123
+ 1200
+ 126
- System.Private.CoreLib
- - System.Boolean
+ - System.Object
@@ -4226,69 +4309,69 @@
- true
- - Optional roslibpy transport: 'twisted' (default on most platforms), 'asyncio' (opt-in, requires roslibpy[asyncio]), or 'cli' (IronPython). When empty the choice falls through to ROSLIBPY_TRANSPORT and roslibpy.set_default_transport.
- - 5a940e85-9726-4ead-81c1-3e2f8dfd9716
- - transport
- - transport
+ - If True (default when unwired), fetch mesh geometry. Set to False for faster loads when only kinematics are needed. A Boolean Toggle is auto-created on this input when nothing is wired.
+ - 73e57853-56d4-4afc-8f2d-ee8480bd03a3
+ - load_geometry
+ - load_geometry
- true
- 0
- 2
- true
- - 14c71912-2008-445b-9fc4-bc21691e2d07
+ - a8abae57-e5f5-463f-8566-8443a0edd81c
- 1
- - Optional roslibpy transport: 'twisted' (default on most platforms), 'asyncio' (opt-in, requires roslibpy[asyncio]), or 'cli' (IronPython). When empty the choice falls through to ROSLIBPY_TRANSPORT and roslibpy.set_default_transport.
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+ - If True (default when unwired), fetch mesh geometry. Set to False for faster loads when only kinematics are needed. A Boolean Toggle is auto-created on this input when nothing is wired.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 283
- 133
- 47
+ 1161
+ 136
+ 75
20
-
- 308
- 143
+ 1200
+ 146
- System.Private.CoreLib
- - System.String
+ - System.Object
-
+
- - false
- - Connected RosClient (or None if disconnected).
- - 3cc3528f-e4c6-4289-aa09-ea2f4e282515
- - ros_client
- - ros_client
- - false
+ - true
+ - Optional MoveItPlannerOptions (from the MoveIt Planner Options component) carrying advanced load parameters (URDF/SRDF names, HTTP file server URL). Not needed for standard ROS setups.
+ - 8dfd4718-345e-4071-9898-2c7dd2162c16
+ - options
+ - options
+ - true
- 0
- 2
- true
- 0
- - Connected RosClient (or None if disconnected).
+ - Optional MoveItPlannerOptions (from the MoveIt Planner Options component) carrying advanced load parameters (URDF/SRDF names, HTTP file server URL). Not needed for standard ROS setups.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 360
- 73
- 70
- 26
+ 1161
+ 156
+ 75
+ 20
-
- 395
- 86.333336
+ 1200
+ 166
@@ -4300,33 +4383,71 @@
-
+
+
+ - true
+ - Force a refetch from ROS (bypass the sticky cache). The cell is loaded automatically on the first run; flip this to re-fetch after the robot description or geometry changes. Defaults to False.
+ - 93e22e6e-be7b-4a4b-b638-c9972a2fc848
+ - reload
+ - reload
+ - true
+ - 0
+ - 2
+ - true
+ - 0
+ - Force a refetch from ROS (bypass the sticky cache). The cell is loaded automatically on the first run; flip this to re-fetch after the robot description or geometry changes. Defaults to False.
+ - d60527f5-b5af-4ef6-8970-5f96fe412559
+
+
+
+
+ -
+ 1161
+ 176
+ 75
+ 20
+
+ -
+ 1200
+ 186
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Boolean
+
+
+
+
+
- false
- - True if the client is currently connected.
- - 59c3b947-6ae3-4172-8726-0967daa1ba6d
- - is_connected
- - is_connected
+ - MoveItPlanner with the loaded cell uploaded to the planning scene. Wire it into the planning / IK / FK components.
+ - 65aad224-d3c1-4ad9-9987-0faf7c247fd8
+ - planner
+ - planner
- false
- 0
- 2
- true
- 0
- - True if the client is currently connected.
+ - MoveItPlanner with the loaded cell uploaded to the planning scene. Wire it into the planning / IK / FK components.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 360
- 99
- 70
- 27
+ 1266
+ 76
+ 82
+ 40
-
- 395
- 113
+ 1307
+ 96
@@ -4338,33 +4459,33 @@
-
+
- false
- - Detected ROS distribution (e.g. 'noetic', 'jazzy').
- - e987c8f1-282c-4982-8597-1cf3b2599a3b
- - ros_distro
- - ros_distro
+ - The loaded RobotCell (with any registered tools / rigid bodies). Handy for visualization or building cell states without a separate Deconstruct Planner component.
+ - b00151b7-e50e-4f3c-bf78-7ce14e07d00e
+ - robot_cell
+ - robot_cell
- false
- 0
- 2
- true
- 0
- - Detected ROS distribution (e.g. 'noetic', 'jazzy').
+ - The loaded RobotCell (with any registered tools / rigid bodies). Handy for visualization or building cell states without a separate Deconstruct Planner component.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 360
- 126
- 70
- 27
+ 1266
+ 116
+ 82
+ 40
-
- 395
- 139.66666
+ 1307
+ 136
@@ -4376,32 +4497,70 @@
-
-
-
-
- - true
- - false
- - true
- - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDb25uZWN0IHRvIGEgUk9TIGJyaWRnZSAoUk9TIDEgb3IgUk9TIDIpLgoKVGhlIGNsaWVudCBpcyBjYWNoZWQgaW4gc3RpY2t5IGFuZCBzdXJ2aXZlcyBjYW52YXMgcmVmcmVzaGVzLiBUb2dnbGluZwpgY29ubmVjdGAgZnJvbSBUcnVlIHRvIEZhbHNlIGNsb3NlcyB0aGUgY29ubmVjdGlvbi4gVGhlIFJPUyBkaXN0cm8gaXMKYXV0by1kZXRlY3RlZCBhZnRlciBjb25uZWN0aW5nLgoKQ09NUEFTIEZBQiB2Mi4wLjAKIiIiCgppbXBvcnQgR3Jhc3Nob3BwZXIKaW1wb3J0IFJoaW5vCmltcG9ydCByb3NsaWJweQppbXBvcnQgU3lzdGVtCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBjcmVhdGVfaWQKZnJvbSBjb21wYXNfZ2hweXRob24gaW1wb3J0IHJlbWFyawpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgd2FybmluZwpmcm9tIHNjcmlwdGNvbnRleHQgaW1wb3J0IHN0aWNreSBhcyBzdAoKZnJvbSBjb21wYXNfZmFiLmJhY2tlbmRzIGltcG9ydCBSb3NDbGllbnQKZnJvbSBjb21wYXNfZmFiLmdocHl0aG9uIGltcG9ydCBlbnN1cmVfYm9vbGVhbl90b2dnbGUKCgpkZWYgX3Jvc2xpYnB5X3N1cHBvcnRzX3RyYW5zcG9ydCgpOgogICAgIiIiVGhlIGBgdHJhbnNwb3J0YGAgYXJndW1lbnQgd2FzIGludHJvZHVjZWQgaW4gcm9zbGlicHkgMi4xLiIiIgogICAgdHJ5OgogICAgICAgIG1ham9yLCBtaW5vciA9IChpbnQocGFydCkgZm9yIHBhcnQgaW4gcm9zbGlicHkuX192ZXJzaW9uX18uc3BsaXQoIi4iKVs6Ml0pCiAgICAgICAgcmV0dXJuIChtYWpvciwgbWlub3IpID49ICgyLCAxKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4gRmFsc2UKCgpjbGFzcyBSb3NDbGllbnRDb21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgaG9zdDogc3RyLCBwb3J0OiBpbnQsIGNvbm5lY3Q6IGJvb2wsIHRyYW5zcG9ydDogc3RyKToKICAgICAgICBlbnN1cmVfYm9vbGVhbl90b2dnbGUoZ2hlbnYuQ29tcG9uZW50LCAiY29ubmVjdCIsIGRlZmF1bHQ9RmFsc2UpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgaG9zdCA9IGhvc3Qgb3IgIjEyNy4wLjAuMSIKICAgICAgICBwb3J0ID0gcG9ydCBvciA5MDkwCiAgICAgICAgdHJhbnNwb3J0ID0gdHJhbnNwb3J0LnN0cmlwKCkgaWYgdHJhbnNwb3J0IGVsc2UgTm9uZQoKICAgICAgICBrZXkgPSBjcmVhdGVfaWQoZ2hlbnYuQ29tcG9uZW50LCAicm9zX2NsaWVudCIpICAjIG5vcWE6IEY4MjEKICAgICAgICByb3NfY2xpZW50ID0gc3QuZ2V0KGtleSwgTm9uZSkKCiAgICAgICAgaWYgcm9zX2NsaWVudCBpcyBub3QgTm9uZToKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgcm9zX2NsaWVudC5jbG9zZSgpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHdhcm5pbmcoZ2hlbnYuQ29tcG9uZW50LCAiRXJyb3IgY2xvc2luZyBwcmV2aW91cyBST1MgY2xpZW50OiB7fSIuZm9ybWF0KGUpKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIHN0LnBvcChrZXksIE5vbmUpCiAgICAgICAgICAgIHJvc19jbGllbnQgPSBOb25lCgogICAgICAgIGlmIHRyYW5zcG9ydCBhbmQgbm90IF9yb3NsaWJweV9zdXBwb3J0c190cmFuc3BvcnQoKToKICAgICAgICAgICAgd2FybmluZyhnaGVudi5Db21wb25lbnQsICJUaGUgJ3RyYW5zcG9ydCcgaW5wdXQgcmVxdWlyZXMgcm9zbGlicHkgPj0gMi4xOyBpZ25vcmluZyBpdC4iKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIHRyYW5zcG9ydCA9IE5vbmUKCiAgICAgICAgaWYgY29ubmVjdDoKICAgICAgICAgICAgaWYgdHJhbnNwb3J0OgogICAgICAgICAgICAgICAgcm9zX2NsaWVudCA9IFJvc0NsaWVudChob3N0LCBwb3J0LCB0cmFuc3BvcnQ9dHJhbnNwb3J0KQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcm9zX2NsaWVudCA9IFJvc0NsaWVudChob3N0LCBwb3J0KQogICAgICAgICAgICByb3NfY2xpZW50LnJ1big1KQogICAgICAgICAgICBzdFtrZXldID0gcm9zX2NsaWVudAoKICAgICAgICBpc19jb25uZWN0ZWQgPSBib29sKHJvc19jbGllbnQgYW5kIHJvc19jbGllbnQuaXNfY29ubmVjdGVkKQogICAgICAgIHJvc19kaXN0cm8gPSBOb25lCiAgICAgICAgaWYgaXNfY29ubmVjdGVkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByb3NfZGlzdHJvID0gcm9zX2NsaWVudC5yb3NfZGlzdHJvLnZhbHVlCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHJlbWFyayhnaGVudi5Db21wb25lbnQsICJDb3VsZCBub3QgZGV0ZWN0IFJPUyBkaXN0cm86IHt9Ii5mb3JtYXQoZSkpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgcmV0dXJuIChyb3NfY2xpZW50LCBpc19jb25uZWN0ZWQsIHJvc19kaXN0cm8pCg==
- - COMPAS FAB: ROS Client
-
-
-
-
- - *.*.python
- - 3.*
-
-
-
-
-
-
+
+
+ - false
+ - ROS distribution detected by the client (e.g. 'noetic', 'jazzy'). Useful for diagnosing ROS 1 vs ROS 2 loader mismatches.
+ - 47efdb72-2efa-4bf8-811d-16b8c8d5c65f
+ - detected_distro
+ - detected_distro
+ - false
+ - 0
+ - 2
+ - true
+ - 0
+ - ROS distribution detected by the client (e.g. 'noetic', 'jazzy'). Useful for diagnosing ROS 1 vs ROS 2 loader mismatches.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 1266
+ 156
+ 82
+ 40
+
+ -
+ 1307
+ 176
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+
+
+ - true
+ - false
+ - true
+ - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDcmVhdGUgYSBNb3ZlSXRQbGFubmVyIGZyb20gYSBjb25uZWN0ZWQgUm9zQ2xpZW50LCBsb2FkaW5nIGl0cyByb2JvdCBjZWxsIGZyb20gUk9TLgoKTG9hZGluZyBhbmQgcGxhbm5lciBzZXR1cCBhcmUgb25lIHN0ZXA6IE1vdmVJdCdzIHBsYW5uaW5nIHNjZW5lIGlzIGRlZmluZWQgYnkgdGhlClVSREYvU1JERiBsb2FkZWQgaW50byBtb3ZlX2dyb3VwLCBzbyB0aGUgY2VsbCBjYW4gb25seSBjb21lIGZyb20gUk9TIC0gdGhlcmUgaXMKbm90aGluZyB0byBsb2FkIHNlcGFyYXRlbHkgYW5kIHdpcmUgaW4uIFRvb2xzIGFuZCByaWdpZCBib2RpZXMgd2lyZWQgaW50bwpgdG9vbHNgIC8gYHJpZ2lkX2JvZGllc2AgYXJlIHJlZ2lzdGVyZWQgaW50byB0aGUgY2VsbCBhbmQgdXBsb2FkZWQgYXMgY29sbGlzaW9uCm9iamVjdHMuCgpUaGUgYmFzZSBjZWxsIGlzIGZldGNoZWQgZnJvbSBST1Mgb25jZSBhbmQgY2FjaGVkIGluIHN0aWNreSAodGhlIG1lc2ggcGF5bG9hZCBjYW4KYmUgbGFyZ2UpOyBzZXQgYHJlbG9hZGAgdG8gcmUtZmV0Y2guIFRoZSBwbGFubmVyIGlzIGNhY2hlZCB0b28gYW5kIHJlYnVpbHQgaWYgdGhlCmNsaWVudCBjaGFuZ2VzIChlLmcuIGEgcmVjb25uZWN0KS4gQWR2YW5jZWQgbG9hZCBwYXJhbWV0ZXJzIGxpdmUgb24gdGhlIG9wdGlvbmFsCmBvcHRpb25zYCBpbnB1dCAoc2VlIHRoZSBNb3ZlSXQgUGxhbm5lciBPcHRpb25zIGNvbXBvbmVudCk7IHRoZSBkZWZhdWx0IGNhc2UgbmVlZHMKbm9uZSBvZiB0aGVtLgoKSWYgeW91IHNlZSBIVFRQIDQwNCBlcnJvcnMgd2hpbGUgbG9hZGluZyBnZW9tZXRyeSwgeW91ciBsb2NhbCBST1MgbWF5IGJlIFJPUyAxIGJ1dAptaXNzaW5nIHRoZSBgL3Jvc2FwaS9nZXRfcm9zX3ZlcnNpb25gIHNlcnZpY2UgQU5EIHRoZSBgL3Jvc2Rpc3Ryb2AgcGFyYW1ldGVyLCB3aGljaAptYWtlcyB0aGUgY2xpZW50IGZhbGwgYmFjayB0byBST1MgMiBkZWZhdWx0cy4gV29ya2Fyb3VuZHM6IHNldCB0aGUgYC9yb3NkaXN0cm9gIFJPUwpwYXJhbSwgaW5zdGFsbCB0aGUgcm9zYXBpIHNlcnZpY2UsIG9yIHNldCBgbG9hZF9nZW9tZXRyeWAgdG8gRmFsc2UuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IFN5c3RlbQpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgY3JlYXRlX2lkCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBlcnJvcgpmcm9tIHNjcmlwdGNvbnRleHQgaW1wb3J0IHN0aWNreSBhcyBzdAoKZnJvbSBjb21wYXNfZmFiLmJhY2tlbmRzIGltcG9ydCBNb3ZlSXRQbGFubmVyCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgZW5zdXJlX2Jvb2xlYW5fdG9nZ2xlCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgcmVnaXN0ZXJfbW9kZWxzX2ludG9fY2VsbAoKCmNsYXNzIE1vdmVJdFBsYW5uZXJDb21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgcm9zX2NsaWVudCwKICAgICAgICAgICAgdG9vbHM6IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Rbb2JqZWN0XSwKICAgICAgICAgICAgcmlnaWRfYm9kaWVzOiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W29iamVjdF0sCiAgICAgICAgICAgIGxvYWRfZ2VvbWV0cnksCiAgICAgICAgICAgIG9wdGlvbnMsCiAgICAgICAgICAgIHJlbG9hZDogYm9vbCk6CiAgICAgICAgZW5zdXJlX2Jvb2xlYW5fdG9nZ2xlKGdoZW52LkNvbXBvbmVudCwgImxvYWRfZ2VvbWV0cnkiLCBkZWZhdWx0PVRydWUpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgaWYgcm9zX2NsaWVudCBpcyBOb25lIG9yIG5vdCByb3NfY2xpZW50LmlzX2Nvbm5lY3RlZDoKICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCBOb25lKQoKICAgICAgICBsb2FkX2dlb21ldHJ5ID0gVHJ1ZSBpZiBsb2FkX2dlb21ldHJ5IGlzIE5vbmUgZWxzZSBsb2FkX2dlb21ldHJ5CiAgICAgICAgbG9hZF9rd2FyZ3MgPSBvcHRpb25zLnRvX2xvYWRfa3dhcmdzKCkgaWYgb3B0aW9ucyBpcyBub3QgTm9uZSBlbHNlIHt9CgogICAgICAgIHRyeToKICAgICAgICAgICAgZGV0ZWN0ZWRfZGlzdHJvID0gcm9zX2NsaWVudC5yb3NfZGlzdHJvLnZhbHVlCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgZGV0ZWN0ZWRfZGlzdHJvID0gTm9uZQoKICAgICAgICAjIENhY2hlIHRoZSBwbGFubmVyOyByZWJ1aWxkIGlmIHRoZSBjbGllbnQgY2hhbmdlZCAoZS5nLiB1c2VyIHJlY29ubmVjdGVkKS4KICAgICAgICBwbGFubmVyX2tleSA9IGNyZWF0ZV9pZChnaGVudi5Db21wb25lbnQsICJtb3ZlaXRfcGxhbm5lciIpICAjIG5vcWE6IEY4MjEKICAgICAgICBwbGFubmVyID0gc3QuZ2V0KHBsYW5uZXJfa2V5KQogICAgICAgIHBsYW5uZXJfcmVidWlsdCA9IEZhbHNlCiAgICAgICAgaWYgcGxhbm5lciBpcyBub3QgTm9uZSBhbmQgcGxhbm5lci5jbGllbnQgaXMgbm90IHJvc19jbGllbnQ6CiAgICAgICAgICAgIHBsYW5uZXIgPSBOb25lCiAgICAgICAgaWYgcGxhbm5lciBpcyBOb25lOgogICAgICAgICAgICBwbGFubmVyID0gTW92ZUl0UGxhbm5lcihyb3NfY2xpZW50KQogICAgICAgICAgICBzdFtwbGFubmVyX2tleV0gPSBwbGFubmVyCiAgICAgICAgICAgIHBsYW5uZXJfcmVidWlsdCA9IFRydWUKCiAgICAgICAgIyBDYWNoZSBvbmx5IHRoZSBiYXNlIGNlbGw7IHRvb2xzL3JpZ2lkIGJvZGllcyBhcmUgbWVyZ2VkIGZyZXNoIG9uIGV2ZXJ5IHJ1bgogICAgICAgICMgc28gZWRpdGluZyB0aGVtIGRvZXMgbm90IHJlcXVpcmUgcmUtZmV0Y2hpbmcgdGhlIChsYXJnZSkgbWVzaCBwYXlsb2FkLgogICAgICAgIHNpZyA9ICJ7fV97fV97fSIuZm9ybWF0KAogICAgICAgICAgICBsb2FkX2dlb21ldHJ5LAogICAgICAgICAgICBsb2FkX2t3YXJncy5nZXQoInVyZGZfcGFyYW1fbmFtZSIpLAogICAgICAgICAgICBsb2FkX2t3YXJncy5nZXQoInNyZGZfcGFyYW1fbmFtZSIpLAogICAgICAgICkKICAgICAgICBjZWxsX2tleSA9IGNyZWF0ZV9pZChnaGVudi5Db21wb25lbnQsICJyb3Nfcm9ib3RfY2VsbF8iICsgc2lnKSAgIyBub3FhOiBGODIxCiAgICAgICAgYmFzZV9jZWxsID0gc3QuZ2V0KGNlbGxfa2V5KQoKICAgICAgICBpZiByZWxvYWQgb3IgYmFzZV9jZWxsIGlzIE5vbmU6CiAgICAgICAgICAgIGt3YXJncyA9IGRpY3QobG9hZF9nZW9tZXRyeT1sb2FkX2dlb21ldHJ5KQogICAgICAgICAgICBrd2FyZ3MudXBkYXRlKGxvYWRfa3dhcmdzKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBiYXNlX2NlbGwgPSByb3NfY2xpZW50LmxvYWRfcm9ib3RfY2VsbCgqKmt3YXJncykKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgc3QucG9wKGNlbGxfa2V5LCBOb25lKSAgIyBkb24ndCBwb2lzb24gdGhlIGNhY2hlCiAgICAgICAgICAgICAgICBtc2cgPSBzdHIoZSkKICAgICAgICAgICAgICAgIGlmICI0MDQiIGluIG1zZyBvciAiTm90IEZvdW5kIiBpbiBtc2c6CiAgICAgICAgICAgICAgICAgICAgZXJyb3IoICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LCAgIyBub3FhOiBGODIxCiAgICAgICAgICAgICAgICAgICAgICAgIGYiUk9TIGxvYWQgZmFpbGVkIHdpdGggSFRUUCA0MDQuIERldGVjdGVkIFJPUyBkaXN0cm86ICd7ZGV0ZWN0ZWRfZGlzdHJvfScuIiwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGVycm9yKGdoZW52LkNvbXBvbmVudCwgIlJPUyBsb2FkIGZhaWxlZDoge30iLmZvcm1hdChlKSkgICMgbm9xYTogRjgyMQogICAgICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCBkZXRlY3RlZF9kaXN0cm8pCiAgICAgICAgICAgIHN0W2NlbGxfa2V5XSA9IGJhc2VfY2VsbAoKICAgICAgICBpZiBiYXNlX2NlbGwgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIChOb25lLCBkZXRlY3RlZF9kaXN0cm8pCgogICAgICAgIHJvYm90X2NlbGwgPSByZWdpc3Rlcl9tb2RlbHNfaW50b19jZWxsKGdoZW52LkNvbXBvbmVudCwgYmFzZV9jZWxsLCB0b29scywgcmlnaWRfYm9kaWVzKSAgIyBub3FhOiBGODIxCgogICAgICAgICMgVXBsb2FkIHRvIHRoZSBwbGFubmluZyBzY2VuZSBvbmx5IHdoZW4gdGhlIHNldCBvZiByZWdpc3RlcmVkIG1vZGVscwogICAgICAgICMgY2hhbmdlZCAoYSByZWJ1aWx0IHBsYW5uZXIsIG9yIHRvb2xzL3JpZ2lkIGJvZGllcyBhZGRlZC9yZW1vdmVkL3JlbmFtZWQpLAogICAgICAgICMgc28gYSBwbGFpbiByZWNvbXB1dGUgZG9lcyBub3QgcmUtdXBsb2FkIHRoZSBzY2VuZSB0byBNb3ZlSXQgb24gZXZlcnkgdGljay4KICAgICAgICAjIENvbnRlbnQtb25seSBlZGl0cyB0byBhIHNhbWUtbmFtZWQgbW9kZWwgYXJlIGNhdWdodCBieSBgcmVsb2FkYC4KICAgICAgICBjZWxsX3NpZyA9IHJvYm90X2NlbGwuc3RydWN0dXJhbF9zaWduYXR1cmUoKQogICAgICAgIHNpZ19rZXkgPSBjcmVhdGVfaWQoZ2hlbnYuQ29tcG9uZW50LCAibW92ZWl0X2NlbGxfc2lnIikgICMgbm9xYTogRjgyMQogICAgICAgIGlmIHBsYW5uZXJfcmVidWlsdCBvciByZWxvYWQgb3Igc3QuZ2V0KHNpZ19rZXkpICE9IGNlbGxfc2lnOgogICAgICAgICAgICBwbGFubmVyLnNldF9yb2JvdF9jZWxsKHJvYm90X2NlbGwpCiAgICAgICAgICAgIHN0W3NpZ19rZXldID0gY2VsbF9zaWcKCiAgICAgICAgcmV0dXJuIChwbGFubmVyLCByb2JvdF9jZWxsLCBkZXRlY3RlZF9kaXN0cm8pCg==
+ - COMPAS FAB: MoveIt Planner
+
+
+
+
+ - *.*.python
+ - 3.*
+
+
+
+
+
+
-
- 469
- 33
- 550
- 850
+ 135
+ 99
+ 932
+ 750
@@ -4412,7 +4571,7 @@
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- - COMPAS FAB: MoveIt Planner
+ - COMPAS FAB: Deconstruct Planner
@@ -4421,14 +4580,14 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACUklEQVRIDbVVTUhUURQ+Yy5mpvcgddfPtBLNlYpOQgVSmxhaSDkEbtwKBrq0CNzpNsGgrRshRsWFiIuKQIM0qDbpiCst3YmCNvPEV6/7Hd+5vve8kTbjgTfn3vPzffeew9xDdM4SC+J7ntep9n0b3zdvFQqFkC8YZ1onk0kvde3KB+UbicViExKjQRT4UH517ak4StH1dbXDiuQZMJgAJ1fguVJAo7mKJIubVPiOvmhAGfaMyTdY3/jxW2q+v/+Txl/n6POXr2fiaG5qpK7HWbKsi5yHnlxPXa3gGwg4PAB/++49kac2Z/iQg1wRwawUg2icvKrqEr0afSGmU+me3n7jraUHtLySp4mpaXIc5+jkPmz34iq9XNs6QQIbfCKu63IuMIKib5CbnGYSOA8PXR2ztL1H+CC9tZdZA3w0QlpUBwMJcL4t52nw+QDHagIYwD4zO0eVF7SZg9I1NgO2Kv1JkUXBEWRbFjkHDj3I3KeGG/Wch58QUufDDnojDdYhROlqm3fdH49KAkLYokTxeJyAERTdg6DRtJbywDd2s84UYrRpglCTDaE48UqmhcbazODur/9scpRLyhW1F4vmJusboMnZRx2USMQpoWopgnqbBA0P+mzb4lxg4BP5Z5P/Vm/cJB3phanJIQKw4k3B377nSX/oDycnYq0f+WPrzs4u3bvbfmzwV0yAh0neDjxYEH7sDEB+3gkFcMmFE5jQDKHmwbyaB7dhKJeoebCg5sEdafJIuYADOIzJBJg8GHMBZ0lLf2TyXA5V+TyGfkknPU3yHzc/Bck9uYAcAAAAAElFTkSuQmCC
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACU0lEQVRIDWNgoDFgRDb/////IUB+/uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB48eP/1HapjDHLDy0WswM1xOFCYEpkFxIicrzcQC4sEMf/L0GcPNm7dQFII46upqDDLSUhjiwUeuMVz79A0srsvPzaDFzwVXAzMTbAFI9Omz5wzFZeB4gStCZvR2taFYEn/yJthwcQ42BnU+ThTDkfXBLbhx4yZYPDU5AVkezJ49dwHYZzBfgAw/9fYzg5kwL8NCc3UM9cgCYAuuXb/BcPb8Bbi4i5MDnL1n3wE4G8QgxXCQerAFjS0dIDYYPH/+AsbEoHEZ/vz7LwZmRkYGMQ5WDD1gC0KDAxju3X/AcPbcBQZJSQkMRSCBbX/YwMECYoOCR3PbGRATBex11GOQ4mRDEQPnAy1NDRRBbJzb/5ixCaOIsQB9gQ6IDqJ8tu8Mi7glsUbuqx+/Gf7+/481iMA+AAWRsZEB2HJcQQSSBKUYUMoBBREoPmAAFPaSaEEDkwNbEBIEtMAQYgFIApRyYBimEEbjsgQmj06DgwgkCMqtIABK89gATB4kB7IElqJMdp1nMBbiYZhpoopNG6Q0vX7j1n+QLKlFRf3lhwyrHkPKorXWWhi5WVNDDRLttCzsYPXBYWB9YIPVj2QKAuuDI8D6wBZWH0wk0xx82sBmgi0A1Tygag6falLkoFUmuF5GyXq0qPRJcRhZagFJEuhmTItpkQAAAABJRU5ErkJggg==
- - 4393a904-1d39-422c-be8d-f07a18284b2f
+ - 4819d1cf-0141-4891-83b1-8dbe7d876737
- true
- false
- true
- - COMPAS FAB: MoveIt Planner
- - COMPAS FAB: MoveIt Planner
+ - COMPAS FAB: Deconstruct Planner
+ - COMPAS FAB: Deconstruct Planner
- 3
- false
@@ -4440,60 +4599,54 @@
-
- 1159
- 74
- 191
- 124
+ 2928
+ 776
+ 140
+ 44
-
- 1251
- 136
+ 2984
+ 798
-
- - 6
+
+ - 1
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 3
+ - 2
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
-
+
- true
- - Connected RosClient (from the ROS Client component).
- - de78af4c-b41c-4d0a-911a-5a4563ff8aa5
- - ros_client
- - ros_client
+ - A planner (MoveItPlanner, PyBulletPlanner, AnalyticalKinematicsPlanner, …) that has had a robot cell set on it.
+ - 24341190-e05c-4049-b6b3-e770f5565812
+ - planner
+ - planner
- true
- 0
- 2
- true
- - 3cc3528f-e4c6-4289-aa09-ea2f4e282515
+ - d0c4d7c9-a51c-49fd-b072-a7b8ba5d1f9e
- 1
- - Connected RosClient (from the ROS Client component).
+ - A planner (MoveItPlanner, PyBulletPlanner, AnalyticalKinematicsPlanner, …) that has had a robot cell set on it.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 1161
- 76
- 75
- 20
+ 2930
+ 778
+ 39
+ 40
-
- 1200
- 86
+ 2951
+ 798
@@ -4505,35 +4658,33 @@
-
-
- - 1
- - true
- - Optional list of ToolModels to register into the cell. Each is keyed by its `.name`. Re-applied on every refresh without refetching.
- - 1230f0c2-a82e-40f2-9d94-a077b31fd58a
- - tools
- - tools
- - true
- - 1
+
+
+ - false
+ - The RobotCell currently held by the planner's client. None if no cell has been loaded yet.
+ - 53164f03-75b0-4ed9-9b64-afb81bc02549
+ - robot_cell
+ - robot_cell
+ - false
+ - 0
- 2
- true
- - 6f0b279a-83bc-49d8-b291-d9861d788592
- - 1
- - Optional list of ToolModels to register into the cell. Each is keyed by its `.name`. Re-applied on every refresh without refetching.
+ - 0
+ - The RobotCell currently held by the planner's client. None if no cell has been loaded yet.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 1161
- 96
- 75
+ 2999
+ 778
+ 67
20
-
- 1200
- 106
+ 3032.5
+ 788
@@ -4545,35 +4696,33 @@
-
-
- - 1
- - true
- - Optional list of RigidBodies to register into the cell. Each is keyed by its `.name` (set it on the Rigid Body From… component).
- - d31b266e-d72a-4537-a305-e2b50b497ec5
- - rigid_bodies
- - rigid_bodies
- - true
- - 1
+
+
+ - false
+ - The cell's RobotModel (`robot_cell.robot_model`). None if no cell has been loaded yet.
+ - 54714e78-8232-4aea-b127-6592b1fcaf57
+ - robot_model
+ - robot_model
+ - false
+ - 0
- 2
- true
- - 758422be-0f15-43e4-8297-eef68a8e696c
- - 1
- - Optional list of RigidBodies to register into the cell. Each is keyed by its `.name` (set it on the Rigid Body From… component).
+ - 0
+ - The cell's RobotModel (`robot_cell.robot_model`). None if no cell has been loaded yet.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 1161
- 116
- 75
+ 2999
+ 798
+ 67
20
-
- 1200
- 126
+ 3032.5
+ 808
@@ -4585,72 +4734,127 @@
-
-
- - true
- - If True (default when unwired), fetch mesh geometry. Set to False for faster loads when only kinematics are needed. A Boolean Toggle is auto-created on this input when nothing is wired.
- - 73e57853-56d4-4afc-8f2d-ee8480bd03a3
- - load_geometry
- - load_geometry
- - true
- - 0
- - 2
- - true
- - a8abae57-e5f5-463f-8566-8443a0edd81c
- - 1
- - If True (default when unwired), fetch mesh geometry. Set to False for faster loads when only kinematics are needed. A Boolean Toggle is auto-created on this input when nothing is wired.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ - true
+ - false
+ - true
+ - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpEZWNvbnN0cnVjdCBhIHBsYW5uZXIgaW50byB0aGUgcm9ib3QgY2VsbCBpdCBjdXJyZW50bHkgaG9sZHM6IHRoZQpgcm9ib3RfY2VsbGAgYW5kIGl0cyBgcm9ib3RfbW9kZWxgLgoKVGhlc2UgYXJlIHJlYWQgZnJvbSB0aGUgcGxhbm5lcidzIGNsaWVudCAodGhlIGNlbGwgbGFzdCBzZXQgb24gaXQgdmlhIGEKTG9hZCBSb2JvdCBDZWxsICsgcGxhbm5lciBzZXR1cCkuIEVhY2ggb3V0cHV0IGlzIGBOb25lYCB1bnRpbCBhIGNlbGwgaGFzCmJlZW4gbG9hZGVkLiBSZWFkcyBvbmx5OyBuZXZlciBtdXRhdGVzIHRoZSBwbGFubmVyLgoKVGhlIGNlbGwgKnN0YXRlKiBpcyBpbnRlbnRpb25hbGx5IG5vdCBleHBvc2VkOiB0aGUgc3RhdGUgaGVsZCBieSB0aGUgY2xpZW50CmlzIHdoYXRldmVyIHdhcyBsYXN0IHNldCBpbnRlcm5hbGx5IGFuZCBpcyByYXJlbHkgdGhlIG9uZSB5b3Ugd2FudC4gQnVpbGQgdGhlCnN0YXRlIHlvdSBuZWVkIGZyb20gYERlZmF1bHQgQ2VsbCBTdGF0ZWAgLyB0aGUgYEF0dGFjaCpgIGNvbXBvbmVudHMgaW5zdGVhZC4KCldvcmtzIHdpdGggYW55IHBsYW5uZXIgKE1vdmVJdCwgUHlCdWxsZXQsIEFuYWx5dGljYWwsIOKApikuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IFN5c3RlbQoKCmNsYXNzIERlY29uc3RydWN0UGxhbm5lcihHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLCBwbGFubmVyKToKICAgICAgICBpZiBwbGFubmVyIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiAoTm9uZSwgTm9uZSkKCiAgICAgICAgcm9ib3RfY2VsbCA9IHBsYW5uZXIucm9ib3RfY2VsbAogICAgICAgIHJvYm90X21vZGVsID0gcm9ib3RfY2VsbC5yb2JvdF9tb2RlbCBpZiByb2JvdF9jZWxsIGlzIG5vdCBOb25lIGVsc2UgTm9uZQoKICAgICAgICByZXR1cm4gKHJvYm90X2NlbGwsIHJvYm90X21vZGVsKQo=
+ - COMPAS FAB: Deconstruct Planner
+
+
+
+
+ - *.*.python
+ - 3.*
-
-
-
- -
- 1161
- 136
- 75
- 20
-
- -
- 1200
- 146
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
- - true
- - Optional MoveItPlannerOptions (from the MoveIt Planner Options component) carrying advanced load parameters (URDF/SRDF names, HTTP file server URL). Not needed for standard ROS setups.
- - 8dfd4718-345e-4071-9898-2c7dd2162c16
- - options
- - options
- - true
- - 0
- - 2
- - true
- - 0
- - Optional MoveItPlannerOptions (from the MoveIt Planner Options component) carrying advanced load parameters (URDF/SRDF names, HTTP file server URL). Not needed for standard ROS setups.
+
+
+
+
+ -
+ 399
+ 199
+ 550
+ 650
+
+
+
+
+
+
+
+
+
+ - c9b2d725-6f87-4b07-af90-bd9aefef68eb
+ - COMPAS FAB: Plan Motion
+
+
+
+
+
+ - true
+ - 2
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACKUlEQVRIDWNgoDFgRDb/////IUB+/sNHT6y/f/+OIoesDhubk5Pzv7yczFGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYFK5KMrIJZ/9eM3huNvP4GVWwjzMujwc8O0gsxcA/bBg4eP/5Ea5iBT5tx7wdB74wnMQDBdrCHDkKIkwQCKEwV5WSawD8gx/MrHr2DDpTjZGHJUpcCGT7n9DCxmKczHoA0NflgQobgCF2fNug0MV6/dYLh2/QaDfm4xWBnzvu0M6hL+DFqaGmB+1aUH4CDT5ucC84myAGQgCKxeuwFMwwwDcaSkJOGGgyXRCIIWNLZ0gF0cGhzAUF9TATcMFLmLj15jeKxhwLD+yRuwsaAgAgFQZMMAXgtAQQJyPcjwkKAAmB4wDQoCUISCIhkULDAAEkNKSZB8cP3Grf8wBTAaZDAIg4IDOUhg8jAaFNkn3n4Gc8GRCw17kICmhhojVh+AXA4Kb5DL8RkOMgTkWmQXg8SQARMyhxZsnBZgC3dyHIBhASx4CAUNsZZhWHDj5i1i9RKlDsWCzVu3M1y+cg2s8dbtu0QZQEgR2AJQwQRS+PfvP7h6ZmYUu+HixDJgZsLqg8PA+sAGpBnkC5BFAX7exJqFVR2wPjgCrA9sYflgIlAV2AJfb0+sGsgQBJnJAA4HUM0DqubIMASrFmiVCa6X4XUySCUtKn2sLqCmIABQc8F4LvG3HgAAAABJRU5ErkJggg==
+
+ - 878ee4f3-dfc7-4c1e-ab8e-487124d32510
+ - true
+ - false
+ - true
+ - COMPAS FAB: Plan Motion
+ - COMPAS FAB: Plan Motion
+ - 3
+
+ - false
+ - false
+ - false
+ - false
+
+
+
+
+ -
+ 2663
+ 552
+ 214
+ 164
+
+ -
+ 2800
+ 634
+
+
+
+
+
+ - 8
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 4
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+
+
+
+
+ - true
+ - A planner that supports plan_motion (e.g. MoveItPlanner, PyBulletPlanner).
+ - 8e002351-10fa-451a-83f6-40a91c1deb68
+ - planner
+ - planner
+ - true
+ - 0
+ - 2
+ - true
+ - d0c4d7c9-a51c-49fd-b072-a7b8ba5d1f9e
+ - 1
+ - A planner that supports plan_motion (e.g. MoveItPlanner, PyBulletPlanner).
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 1161
- 156
- 75
+ 2665
+ 554
+ 120
20
-
- 1200
- 166
+ 2726.5
+ 564
@@ -4662,71 +4866,73 @@
-
-
+
+
- true
- - Force a refetch from ROS (bypass the sticky cache). The cell is loaded automatically on the first run; flip this to re-fetch after the robot description or geometry changes. Defaults to False.
- - 93e22e6e-be7b-4a4b-b638-c9972a2fc848
- - reload
- - reload
+ - Target to reach (FrameTarget, PointAxisTarget, ConfigurationTarget, ConstraintSetTarget).
+ - 8f0985c9-bfd3-4613-b402-a03b0404cb26
+ - target
+ - target
- true
- 0
- 2
- true
- - 0
- - Force a refetch from ROS (bypass the sticky cache). The cell is loaded automatically on the first run; flip this to re-fetch after the robot description or geometry changes. Defaults to False.
- - d60527f5-b5af-4ef6-8970-5f96fe412559
+ - 549998f3-80a1-4ada-9c82-ef9c0f3c9e43
+ - 1
+ - Target to reach (FrameTarget, PointAxisTarget, ConfigurationTarget, ConstraintSetTarget).
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 1161
- 176
- 75
+ 2665
+ 574
+ 120
20
-
- 1200
- 186
+ 2726.5
+ 584
- System.Private.CoreLib
- - System.Boolean
+ - System.Object
-
-
- - false
- - MoveItPlanner with the loaded cell uploaded to the planning scene. Wire it into the planning / IK / FK components.
- - 65aad224-d3c1-4ad9-9987-0faf7c247fd8
- - planner
- - planner
- - false
+
+
+ - true
+ - Starting RobotCellState. The robot's configuration in this state is used as the seed.
+ - 705c1aad-ac69-4405-ad94-59eeae7980d1
+ - start_state
+ - start_state
+ - true
- 0
- 2
- true
- - 0
- - MoveItPlanner with the loaded cell uploaded to the planning scene. Wire it into the planning / IK / FK components.
+ - 3466ce89-77e4-426b-a993-683e29db59a1
+ - 1
+ - Starting RobotCellState. The robot's configuration in this state is used as the seed.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 1266
- 76
- 82
- 40
+ 2665
+ 594
+ 120
+ 20
-
- 1307
- 96
+ 2726.5
+ 604
@@ -4738,201 +4944,193 @@
-
+
- - false
- - The loaded RobotCell (with any registered tools / rigid bodies). Handy for visualization or building cell states without a separate Deconstruct Planner component.
- - b00151b7-e50e-4f3c-bf78-7ce14e07d00e
- - robot_cell
- - robot_cell
- - false
+ - true
+ - Planning group name. Defaults to the cell's main planning group.
+ - 3044f4b7-874d-40c8-82f8-a61e0f89869b
+ - group
+ - group
+ - true
- 0
- 2
- true
- 0
- - The loaded RobotCell (with any registered tools / rigid bodies). Handy for visualization or building cell states without a separate Deconstruct Planner component.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+ - Planning group name. Defaults to the cell's main planning group.
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
-
- 1266
- 116
- 82
- 40
+ 2665
+ 614
+ 120
+ 20
-
- 1307
- 136
+ 2726.5
+ 624
- System.Private.CoreLib
- - System.Object
+ - System.String
-
+
- - false
- - ROS distribution detected by the client (e.g. 'noetic', 'jazzy'). Useful for diagnosing ROS 1 vs ROS 2 loader mismatches.
- - 47efdb72-2efa-4bf8-811d-16b8c8d5c65f
- - detected_distro
- - detected_distro
- - false
+ - true
+ - MoveIt planner algorithm name (e.g. 'RRTConnect', 'PRMstar'). Defaults to 'RRTConnect'.
+ - c630c1e8-050b-4e7b-b340-dfed3ebe4a15
+ - planner_id
+ - planner_id
+ - true
- 0
- 2
- true
- 0
- - ROS distribution detected by the client (e.g. 'noetic', 'jazzy'). Useful for diagnosing ROS 1 vs ROS 2 loader mismatches.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+ - MoveIt planner algorithm name (e.g. 'RRTConnect', 'PRMstar'). Defaults to 'RRTConnect'.
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
-
- 1266
- 156
- 82
- 40
+ 2665
+ 634
+ 120
+ 20
-
- 1307
- 176
+ 2726.5
+ 644
- System.Private.CoreLib
- - System.Object
+ - System.String
-
-
-
-
- - true
- - false
- - true
- - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDcmVhdGUgYSBNb3ZlSXRQbGFubmVyIGZyb20gYSBjb25uZWN0ZWQgUm9zQ2xpZW50LCBsb2FkaW5nIGl0cyByb2JvdCBjZWxsIGZyb20gUk9TLgoKTG9hZGluZyBhbmQgcGxhbm5lciBzZXR1cCBhcmUgb25lIHN0ZXA6IE1vdmVJdCdzIHBsYW5uaW5nIHNjZW5lIGlzIGRlZmluZWQgYnkgdGhlClVSREYvU1JERiBsb2FkZWQgaW50byBtb3ZlX2dyb3VwLCBzbyB0aGUgY2VsbCBjYW4gb25seSBjb21lIGZyb20gUk9TIC0gdGhlcmUgaXMKbm90aGluZyB0byBsb2FkIHNlcGFyYXRlbHkgYW5kIHdpcmUgaW4uIFRvb2xzIGFuZCByaWdpZCBib2RpZXMgd2lyZWQgaW50bwpgdG9vbHNgIC8gYHJpZ2lkX2JvZGllc2AgYXJlIHJlZ2lzdGVyZWQgaW50byB0aGUgY2VsbCBhbmQgdXBsb2FkZWQgYXMgY29sbGlzaW9uCm9iamVjdHMuCgpUaGUgYmFzZSBjZWxsIGlzIGZldGNoZWQgZnJvbSBST1Mgb25jZSBhbmQgY2FjaGVkIGluIHN0aWNreSAodGhlIG1lc2ggcGF5bG9hZCBjYW4KYmUgbGFyZ2UpOyBzZXQgYHJlbG9hZGAgdG8gcmUtZmV0Y2guIFRoZSBwbGFubmVyIGlzIGNhY2hlZCB0b28gYW5kIHJlYnVpbHQgaWYgdGhlCmNsaWVudCBjaGFuZ2VzIChlLmcuIGEgcmVjb25uZWN0KS4gQWR2YW5jZWQgbG9hZCBwYXJhbWV0ZXJzIGxpdmUgb24gdGhlIG9wdGlvbmFsCmBvcHRpb25zYCBpbnB1dCAoc2VlIHRoZSBNb3ZlSXQgUGxhbm5lciBPcHRpb25zIGNvbXBvbmVudCk7IHRoZSBkZWZhdWx0IGNhc2UgbmVlZHMKbm9uZSBvZiB0aGVtLgoKSWYgeW91IHNlZSBIVFRQIDQwNCBlcnJvcnMgd2hpbGUgbG9hZGluZyBnZW9tZXRyeSwgeW91ciBsb2NhbCBST1MgbWF5IGJlIFJPUyAxIGJ1dAptaXNzaW5nIHRoZSBgL3Jvc2FwaS9nZXRfcm9zX3ZlcnNpb25gIHNlcnZpY2UgQU5EIHRoZSBgL3Jvc2Rpc3Ryb2AgcGFyYW1ldGVyLCB3aGljaAptYWtlcyB0aGUgY2xpZW50IGZhbGwgYmFjayB0byBST1MgMiBkZWZhdWx0cy4gV29ya2Fyb3VuZHM6IHNldCB0aGUgYC9yb3NkaXN0cm9gIFJPUwpwYXJhbSwgaW5zdGFsbCB0aGUgcm9zYXBpIHNlcnZpY2UsIG9yIHNldCBgbG9hZF9nZW9tZXRyeWAgdG8gRmFsc2UuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IFN5c3RlbQpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgY3JlYXRlX2lkCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBlcnJvcgpmcm9tIHNjcmlwdGNvbnRleHQgaW1wb3J0IHN0aWNreSBhcyBzdAoKZnJvbSBjb21wYXNfZmFiLmJhY2tlbmRzIGltcG9ydCBNb3ZlSXRQbGFubmVyCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgZW5zdXJlX2Jvb2xlYW5fdG9nZ2xlCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgcmVnaXN0ZXJfbW9kZWxzX2ludG9fY2VsbAoKCmNsYXNzIE1vdmVJdFBsYW5uZXJDb21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgcm9zX2NsaWVudCwKICAgICAgICAgICAgdG9vbHM6IFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3Rbb2JqZWN0XSwKICAgICAgICAgICAgcmlnaWRfYm9kaWVzOiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W29iamVjdF0sCiAgICAgICAgICAgIGxvYWRfZ2VvbWV0cnksCiAgICAgICAgICAgIG9wdGlvbnMsCiAgICAgICAgICAgIHJlbG9hZDogYm9vbCk6CiAgICAgICAgZW5zdXJlX2Jvb2xlYW5fdG9nZ2xlKGdoZW52LkNvbXBvbmVudCwgImxvYWRfZ2VvbWV0cnkiLCBkZWZhdWx0PVRydWUpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgaWYgcm9zX2NsaWVudCBpcyBOb25lIG9yIG5vdCByb3NfY2xpZW50LmlzX2Nvbm5lY3RlZDoKICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCBOb25lKQoKICAgICAgICBsb2FkX2dlb21ldHJ5ID0gVHJ1ZSBpZiBsb2FkX2dlb21ldHJ5IGlzIE5vbmUgZWxzZSBsb2FkX2dlb21ldHJ5CiAgICAgICAgbG9hZF9rd2FyZ3MgPSBvcHRpb25zLnRvX2xvYWRfa3dhcmdzKCkgaWYgb3B0aW9ucyBpcyBub3QgTm9uZSBlbHNlIHt9CgogICAgICAgIHRyeToKICAgICAgICAgICAgZGV0ZWN0ZWRfZGlzdHJvID0gcm9zX2NsaWVudC5yb3NfZGlzdHJvLnZhbHVlCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgZGV0ZWN0ZWRfZGlzdHJvID0gTm9uZQoKICAgICAgICAjIENhY2hlIHRoZSBwbGFubmVyOyByZWJ1aWxkIGlmIHRoZSBjbGllbnQgY2hhbmdlZCAoZS5nLiB1c2VyIHJlY29ubmVjdGVkKS4KICAgICAgICBwbGFubmVyX2tleSA9IGNyZWF0ZV9pZChnaGVudi5Db21wb25lbnQsICJtb3ZlaXRfcGxhbm5lciIpICAjIG5vcWE6IEY4MjEKICAgICAgICBwbGFubmVyID0gc3QuZ2V0KHBsYW5uZXJfa2V5KQogICAgICAgIHBsYW5uZXJfcmVidWlsdCA9IEZhbHNlCiAgICAgICAgaWYgcGxhbm5lciBpcyBub3QgTm9uZSBhbmQgcGxhbm5lci5jbGllbnQgaXMgbm90IHJvc19jbGllbnQ6CiAgICAgICAgICAgIHBsYW5uZXIgPSBOb25lCiAgICAgICAgaWYgcGxhbm5lciBpcyBOb25lOgogICAgICAgICAgICBwbGFubmVyID0gTW92ZUl0UGxhbm5lcihyb3NfY2xpZW50KQogICAgICAgICAgICBzdFtwbGFubmVyX2tleV0gPSBwbGFubmVyCiAgICAgICAgICAgIHBsYW5uZXJfcmVidWlsdCA9IFRydWUKCiAgICAgICAgIyBDYWNoZSBvbmx5IHRoZSBiYXNlIGNlbGw7IHRvb2xzL3JpZ2lkIGJvZGllcyBhcmUgbWVyZ2VkIGZyZXNoIG9uIGV2ZXJ5IHJ1bgogICAgICAgICMgc28gZWRpdGluZyB0aGVtIGRvZXMgbm90IHJlcXVpcmUgcmUtZmV0Y2hpbmcgdGhlIChsYXJnZSkgbWVzaCBwYXlsb2FkLgogICAgICAgIHNpZyA9ICJ7fV97fV97fSIuZm9ybWF0KAogICAgICAgICAgICBsb2FkX2dlb21ldHJ5LAogICAgICAgICAgICBsb2FkX2t3YXJncy5nZXQoInVyZGZfcGFyYW1fbmFtZSIpLAogICAgICAgICAgICBsb2FkX2t3YXJncy5nZXQoInNyZGZfcGFyYW1fbmFtZSIpLAogICAgICAgICkKICAgICAgICBjZWxsX2tleSA9IGNyZWF0ZV9pZChnaGVudi5Db21wb25lbnQsICJyb3Nfcm9ib3RfY2VsbF8iICsgc2lnKSAgIyBub3FhOiBGODIxCiAgICAgICAgYmFzZV9jZWxsID0gc3QuZ2V0KGNlbGxfa2V5KQoKICAgICAgICBpZiByZWxvYWQgb3IgYmFzZV9jZWxsIGlzIE5vbmU6CiAgICAgICAgICAgIGt3YXJncyA9IGRpY3QobG9hZF9nZW9tZXRyeT1sb2FkX2dlb21ldHJ5KQogICAgICAgICAgICBrd2FyZ3MudXBkYXRlKGxvYWRfa3dhcmdzKQogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBiYXNlX2NlbGwgPSByb3NfY2xpZW50LmxvYWRfcm9ib3RfY2VsbCgqKmt3YXJncykKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgc3QucG9wKGNlbGxfa2V5LCBOb25lKSAgIyBkb24ndCBwb2lzb24gdGhlIGNhY2hlCiAgICAgICAgICAgICAgICBtc2cgPSBzdHIoZSkKICAgICAgICAgICAgICAgIGlmICI0MDQiIGluIG1zZyBvciAiTm90IEZvdW5kIiBpbiBtc2c6CiAgICAgICAgICAgICAgICAgICAgZXJyb3IoICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgICAgICAgICAgICAgZ2hlbnYuQ29tcG9uZW50LCAgIyBub3FhOiBGODIxCiAgICAgICAgICAgICAgICAgICAgICAgIGYiUk9TIGxvYWQgZmFpbGVkIHdpdGggSFRUUCA0MDQuIERldGVjdGVkIFJPUyBkaXN0cm86ICd7ZGV0ZWN0ZWRfZGlzdHJvfScuIiwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGVycm9yKGdoZW52LkNvbXBvbmVudCwgIlJPUyBsb2FkIGZhaWxlZDoge30iLmZvcm1hdChlKSkgICMgbm9xYTogRjgyMQogICAgICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCBkZXRlY3RlZF9kaXN0cm8pCiAgICAgICAgICAgIHN0W2NlbGxfa2V5XSA9IGJhc2VfY2VsbAoKICAgICAgICBpZiBiYXNlX2NlbGwgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIChOb25lLCBkZXRlY3RlZF9kaXN0cm8pCgogICAgICAgIHJvYm90X2NlbGwgPSByZWdpc3Rlcl9tb2RlbHNfaW50b19jZWxsKGdoZW52LkNvbXBvbmVudCwgYmFzZV9jZWxsLCB0b29scywgcmlnaWRfYm9kaWVzKSAgIyBub3FhOiBGODIxCgogICAgICAgICMgVXBsb2FkIHRvIHRoZSBwbGFubmluZyBzY2VuZSBvbmx5IHdoZW4gdGhlIHNldCBvZiByZWdpc3RlcmVkIG1vZGVscwogICAgICAgICMgY2hhbmdlZCAoYSByZWJ1aWx0IHBsYW5uZXIsIG9yIHRvb2xzL3JpZ2lkIGJvZGllcyBhZGRlZC9yZW1vdmVkL3JlbmFtZWQpLAogICAgICAgICMgc28gYSBwbGFpbiByZWNvbXB1dGUgZG9lcyBub3QgcmUtdXBsb2FkIHRoZSBzY2VuZSB0byBNb3ZlSXQgb24gZXZlcnkgdGljay4KICAgICAgICAjIENvbnRlbnQtb25seSBlZGl0cyB0byBhIHNhbWUtbmFtZWQgbW9kZWwgYXJlIGNhdWdodCBieSBgcmVsb2FkYC4KICAgICAgICBjZWxsX3NpZyA9IHJvYm90X2NlbGwuc3RydWN0dXJhbF9zaWduYXR1cmUoKQogICAgICAgIHNpZ19rZXkgPSBjcmVhdGVfaWQoZ2hlbnYuQ29tcG9uZW50LCAibW92ZWl0X2NlbGxfc2lnIikgICMgbm9xYTogRjgyMQogICAgICAgIGlmIHBsYW5uZXJfcmVidWlsdCBvciByZWxvYWQgb3Igc3QuZ2V0KHNpZ19rZXkpICE9IGNlbGxfc2lnOgogICAgICAgICAgICBwbGFubmVyLnNldF9yb2JvdF9jZWxsKHJvYm90X2NlbGwpCiAgICAgICAgICAgIHN0W3NpZ19rZXldID0gY2VsbF9zaWcKCiAgICAgICAgcmV0dXJuIChwbGFubmVyLCByb2JvdF9jZWxsLCBkZXRlY3RlZF9kaXN0cm8pCg==
- - COMPAS FAB: MoveIt Planner
-
-
-
-
- - *.*.python
- - 3.*
-
-
-
-
-
-
- -
- 135
- 99
- 932
- 750
-
-
-
-
-
-
-
-
-
- - c9b2d725-6f87-4b07-af90-bd9aefef68eb
- - COMPAS FAB: Deconstruct Planner
-
-
-
-
-
- - true
- - 2
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACU0lEQVRIDWNgoDFgRDb/////IUB+/qPHT62/ffuGIoesDhubi4vrv5ys9FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYBw8fPflHapjDHLDy0WswM1xOFCYEpkFxIi8nw8QC4sEMf/L0GcPNm7dQFII46upqDDLSUhjiwUeuMVz79A0srsvPzaDFzwVXAzMTbAFI9Omz5wzFZeB4gStCZvR2taFYEn/yJthwcQ42BnU+ThTDkfXBLbhx4yZYPDU5AVkezJ49dwHYZzBfgAw/9fYzg5kwL8NCc3UM9cgCYAuuXb/BcPb8Bbi4i5MDnL1n3wE4G8QgxXCQerAFjS0dIDYYPH/+AsbEoHEZ/vz7LwZmRkYGMQ5WDD1gC0KDAxju3X/AcPbcBQZJSQkMRSCBbX/YwMECYoOCR3PbGRATBex11GOQ4mRDEQPnAy1NDRRBbJzb/5ixCaOIsQB9gQ6IDqJ8tu8Mi7glsUbuqx+/Gf7+/481iMA+AAWRsZEB2HJcQQSSBKUYUMoBBREoPmAAFPaSaEEDkwNbEBIEtMAQYgFIApRyYBimEEbjsgQmj06DgwgkCMqtIABK89gATB4kB7IElqJMdp1nMBbiYZhpoopNG6Q0vX7j1n+QLKlFRf3lhwyrHkPKorXWWhi5WVNDDRLttCzsYPXBYWB9YIPVj2QKAuuDI8D6wBZWH0wk0xx82sBmgi0A1Tygag6falLkoFUmuF5GyXq0qPRJcRhZagFwfuhs3ElmqwAAAABJRU5ErkJggg==
-
- - 4819d1cf-0141-4891-83b1-8dbe7d876737
- - true
- - false
- - true
- - COMPAS FAB: Deconstruct Planner
- - COMPAS FAB: Deconstruct Planner
- - 3
-
- - false
- - false
- - false
- - false
-
-
-
-
- -
- 2928
- 776
- 140
- 44
-
- -
- 2984
- 798
-
-
-
-
-
- - 1
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 2
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
-
-
-
+
+
+ - true
+ - Number of randomized attempts to make. Defaults to 5 for MoveIt.
+ - 7cfa47f0-5878-47fe-b807-48088f6505f0
+ - num_planning_attempts
+ - num_planning_attempts
+ - true
+ - 0
+ - 2
+ - true
+ - 0
+ - Number of randomized attempts to make. Defaults to 5 for MoveIt.
+ - 48d01794-d3d8-4aef-990e-127168822244
+
+
+
+
+ -
+ 2665
+ 654
+ 120
+ 20
+
+ -
+ 2726.5
+ 664
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Int32
+
+
+
+
+
+
+ - true
+ - Planning timeout in seconds. Defaults to 1.0.
+ - 5812faf4-6133-43b2-b17b-2c55fa330237
+ - allowed_planning_time
+ - allowed_planning_time
+ - true
+ - 0
+ - 2
+ - true
+ - 0
+ - Planning timeout in seconds. Defaults to 1.0.
+ - 9d51e32e-c038-4352-9554-f4137ca91b9a
+
+
+
+
+ -
+ 2665
+ 674
+ 120
+ 20
+
+ -
+ 2726.5
+ 684
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Double
+
+
+
+
+
- true
- - A planner (MoveItPlanner, PyBulletPlanner, AnalyticalKinematicsPlanner, …) that has had a robot cell set on it.
- - 24341190-e05c-4049-b6b3-e770f5565812
- - planner
- - planner
+ - Trigger planning. Defaults to False so the canvas does not plan on every refresh.
+ - bc877669-87a5-40f0-9262-54b61aaf6bff
+ - compute
+ - compute
- true
- 0
- 2
- true
- - d0c4d7c9-a51c-49fd-b072-a7b8ba5d1f9e
+ - 8a25fcc1-f970-4f14-b174-b1c41b5328d9
- 1
- - A planner (MoveItPlanner, PyBulletPlanner, AnalyticalKinematicsPlanner, …) that has had a robot cell set on it.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+ - Trigger planning. Defaults to False so the canvas does not plan on every refresh.
+ - d60527f5-b5af-4ef6-8970-5f96fe412559
-
- 2930
- 778
- 39
- 40
+ 2665
+ 694
+ 120
+ 20
-
- 2951
- 798
+ 2726.5
+ 704
- System.Private.CoreLib
- - System.Object
+ - System.Boolean
@@ -4940,30 +5138,30 @@
- false
- - The RobotCell currently held by the planner's client. None if no cell has been loaded yet.
- - 53164f03-75b0-4ed9-9b64-afb81bc02549
- - robot_cell
- - robot_cell
+ - Resulting JointTrajectory, or a partial trajectory on planning failure. The component is flagged red (with the backend error) when planning fails outright.
+ - f73d3ab2-8697-4ff9-b443-87d7b13dafeb
+ - trajectory
+ - trajectory
- false
- 0
- 2
- true
- 0
- - The RobotCell currently held by the planner's client. None if no cell has been loaded yet.
+ - Resulting JointTrajectory, or a partial trajectory on planning failure. The component is flagged red (with the backend error) when planning fails outright.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2999
- 778
- 67
- 20
+ 2815
+ 554
+ 60
+ 40
-
- 3032.5
- 788
+ 2845
+ 574
@@ -4978,30 +5176,30 @@
- false
- - The cell's RobotModel (`robot_cell.robot_model`). None if no cell has been loaded yet.
- - 54714e78-8232-4aea-b127-6592b1fcaf57
- - robot_model
- - robot_model
+ - List of Rhino planes — one per trajectory point — at the planning group's end-effector frame (target_mode=ROBOT). Computed via FK on the planner with the start_state's attachments preserved.
+ - 7862377a-b0e8-4386-8873-fef9ac5884c7
+ - planes
+ - planes
- false
- 0
- 2
- true
- 0
- - The cell's RobotModel (`robot_cell.robot_model`). None if no cell has been loaded yet.
+ - List of Rhino planes — one per trajectory point — at the planning group's end-effector frame (target_mode=ROBOT). Computed via FK on the planner with the start_state's attachments preserved.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2999
- 798
- 67
- 20
+ 2815
+ 594
+ 60
+ 40
-
- 3032.5
- 808
+ 2845
+ 614
@@ -5013,21 +5211,97 @@
-
-
-
-
- - true
- - false
- - true
- - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpEZWNvbnN0cnVjdCBhIHBsYW5uZXIgaW50byB0aGUgcm9ib3QgY2VsbCBpdCBjdXJyZW50bHkgaG9sZHM6IHRoZQpgcm9ib3RfY2VsbGAgYW5kIGl0cyBgcm9ib3RfbW9kZWxgLgoKVGhlc2UgYXJlIHJlYWQgZnJvbSB0aGUgcGxhbm5lcidzIGNsaWVudCAodGhlIGNlbGwgbGFzdCBzZXQgb24gaXQgdmlhIGEKTG9hZCBSb2JvdCBDZWxsICsgcGxhbm5lciBzZXR1cCkuIEVhY2ggb3V0cHV0IGlzIGBOb25lYCB1bnRpbCBhIGNlbGwgaGFzCmJlZW4gbG9hZGVkLiBSZWFkcyBvbmx5OyBuZXZlciBtdXRhdGVzIHRoZSBwbGFubmVyLgoKVGhlIGNlbGwgKnN0YXRlKiBpcyBpbnRlbnRpb25hbGx5IG5vdCBleHBvc2VkOiB0aGUgc3RhdGUgaGVsZCBieSB0aGUgY2xpZW50CmlzIHdoYXRldmVyIHdhcyBsYXN0IHNldCBpbnRlcm5hbGx5IGFuZCBpcyByYXJlbHkgdGhlIG9uZSB5b3Ugd2FudC4gQnVpbGQgdGhlCnN0YXRlIHlvdSBuZWVkIGZyb20gYERlZmF1bHQgQ2VsbCBTdGF0ZWAgLyB0aGUgYEF0dGFjaCpgIGNvbXBvbmVudHMgaW5zdGVhZC4KCldvcmtzIHdpdGggYW55IHBsYW5uZXIgKE1vdmVJdCwgUHlCdWxsZXQsIEFuYWx5dGljYWwsIOKApikuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IFN5c3RlbQoKCmNsYXNzIERlY29uc3RydWN0UGxhbm5lcihHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLCBwbGFubmVyKToKICAgICAgICBpZiBwbGFubmVyIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybiAoTm9uZSwgTm9uZSkKCiAgICAgICAgcm9ib3RfY2VsbCA9IHBsYW5uZXIucm9ib3RfY2VsbAogICAgICAgIHJvYm90X21vZGVsID0gcm9ib3RfY2VsbC5yb2JvdF9tb2RlbCBpZiByb2JvdF9jZWxsIGlzIG5vdCBOb25lIGVsc2UgTm9uZQoKICAgICAgICByZXR1cm4gKHJvYm90X2NlbGwsIHJvYm90X21vZGVsKQo=
- - COMPAS FAB: Deconstruct Planner
-
-
-
-
- - *.*.python
- - 3.*
+
+
+ - false
+ - Polyline connecting the plane origins in trajectory order. None when the trajectory has fewer than two points.
+ - 4dd0ca5a-e703-4ea7-be36-d625defb901f
+ - polyline
+ - polyline
+ - false
+ - 0
+ - 2
+ - true
+ - 0
+ - Polyline connecting the plane origins in trajectory order. None when the trajectory has fewer than two points.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 2815
+ 634
+ 60
+ 40
+
+ -
+ 2845
+ 654
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+ - false
+ - The failure message (including a collision diagnostic on a full failure), as a single string. Wire a panel to read it; empty on success.
+ - f08254eb-d464-4f7e-98da-31516efa7c4b
+ - debug_info
+ - debug_info
+ - false
+ - 0
+ - 2
+ - true
+ - 0
+ - The failure message (including a collision diagnostic on a full failure), as a single string. Wire a panel to read it; empty on success.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 2815
+ 674
+ 60
+ 40
+
+ -
+ 2845
+ 694
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+
+
+ - true
+ - false
+ - true
+ - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpQbGFuIGEgZnJlZS1zcGFjZSAoam9pbnQtaW50ZXJwb2xhdGVkKSBtb3Rpb24gdG8gYSB0YXJnZXQuCgpDYWxscyBgcGxhbm5lci5wbGFuX21vdGlvbih0YXJnZXQsIHN0YXJ0X3N0YXRlKWAuIFRoZSByZXN1bHQgaXMgY2FjaGVkIGluCnN0aWNreSBzbyB0aGUgY2FudmFzIGRvZXMgbm90IHJlLXBsYW4gb24gZXZlcnkgcmVmcmVzaCAtIHNldCBgY29tcHV0ZWAgdG8KVHJ1ZSB0byAocmUpcGxhbi4KCkFueSBwbGFubmluZyBmYWlsdXJlIChubyBwbGFuIGZvdW5kLCBzdGFydC9nb2FsIGluIGNvbGxpc2lvbiwgdGltZWQgb3V0LCDigKYpCmZsYWdzIHRoZSBjb21wb25lbnQgcmVkIHdpdGggdGhlIGJhY2tlbmQgZXJyb3IgbWVzc2FnZS4gV2hlbiB0aGUgYmFja2VuZApyZXR1cm5zIGEgYHBhcnRpYWxfdHJhamVjdG9yeWAsIHRoZSBjb21wb25lbnQgaXMgZmxhZ2dlZCB3aXRoIGEgd2FybmluZwppbnN0ZWFkIGFuZCB0aGUgcGFydGlhbCB0cmFqZWN0b3J5IGlzIHN1cmZhY2VkLiBPbiBhIGZ1bGwgZmFpbHVyZSB0aGUgc3RhcnQKc3RhdGUgaXMgY29sbGlzaW9uLWNoZWNrZWQgKHdoZW4gdGhlIHBsYW5uZXIgc3VwcG9ydHMgaXQpIGFuZCBhIGNvbmNpc2UgaGludAphcHBlbmRlZC4gVGhlIG1lc3NhZ2UgaXMgYWxzbyBleHBvc2VkIG9uIHRoZSBgZGVidWdfaW5mb2Agb3V0cHV0IHNvIGl0IGNhbiBiZQpyZWFkIGluIGEgd2lyZWQgcGFuZWwuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IFN5c3RlbQpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgY3JlYXRlX2lkCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBlcnJvciBhcyBnaF9lcnJvcgpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgd2FybmluZyBhcyBnaF93YXJuaW5nCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBmcmFtZV90b19yaGlub19wbGFuZQpmcm9tIGNvbXBhc19yaGluby5jb252ZXJzaW9ucyBpbXBvcnQgcG9seWxpbmVfdG9fcmhpbm8KZnJvbSBzY3JpcHRjb250ZXh0IGltcG9ydCBzdGlja3kgYXMgc3QKCmZyb20gY29tcGFzX2ZhYi5iYWNrZW5kcyBpbXBvcnQgQmFja2VuZEVycm9yCmZyb20gY29tcGFzX2ZhYi5iYWNrZW5kcyBpbXBvcnQgTW90aW9uUGxhbm5pbmdFcnJvcgpmcm9tIGNvbXBhc19mYWIuZ2hweXRob24gaW1wb3J0IGNvbGxpc2lvbl9kaWFnbm9zdGljCgoKY2xhc3MgUGxhbk1vdGlvbihHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLAogICAgICAgICAgICBwbGFubmVyLAogICAgICAgICAgICB0YXJnZXQsCiAgICAgICAgICAgIHN0YXJ0X3N0YXRlLAogICAgICAgICAgICBncm91cDogc3RyLAogICAgICAgICAgICBwbGFubmVyX2lkOiBzdHIsCiAgICAgICAgICAgIG51bV9wbGFubmluZ19hdHRlbXB0czogaW50LAogICAgICAgICAgICBhbGxvd2VkX3BsYW5uaW5nX3RpbWU6IGZsb2F0LAogICAgICAgICAgICBjb21wdXRlOiBib29sKToKICAgICAgICBrZXkgPSBjcmVhdGVfaWQoZ2hlbnYuQ29tcG9uZW50LCAidHJhamVjdG9yeSIpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgZGVmIF92aXoodHJhamVjdG9yeSk6CiAgICAgICAgICAgIGlmIHRyYWplY3RvcnkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBbXSwgTm9uZQogICAgICAgICAgICBmcmFtZXMsIHBvbHlsaW5lID0gdHJhamVjdG9yeS50b19mcmFtZXNfYW5kX3BvbHlsaW5lKHBsYW5uZXIucm9ib3RfY2VsbCwgc3RhcnRfc3RhdGUsIGdyb3VwIG9yIE5vbmUpCiAgICAgICAgICAgIHBsYW5lcyA9IFtmcmFtZV90b19yaGlub19wbGFuZShmKSBmb3IgZiBpbiBmcmFtZXNdCiAgICAgICAgICAgIHBvbHlsaW5lID0gcG9seWxpbmVfdG9fcmhpbm8ocG9seWxpbmUpIGlmIHBvbHlsaW5lIGVsc2UgTm9uZQogICAgICAgICAgICByZXR1cm4gcGxhbmVzLCBwb2x5bGluZQoKICAgICAgICBkZWYgX2RpYWdub3NlKGVycm9yX21zZywgaGFzX3RyYWplY3RvcnkpOgogICAgICAgICAgICAiIiJGbGFnIHRoZSBjb21wb25lbnQgZm9yIGFuIGVycm9yIGFuZCByZXR1cm4gdGhlIG1lc3NhZ2Ugc2hvd24gKGZvciBkZWJ1Z19pbmZvKS4iIiIKICAgICAgICAgICAgaWYgbm90IGVycm9yX21zZzoKICAgICAgICAgICAgICAgIHJldHVybiAiIgogICAgICAgICAgICBpZiBoYXNfdHJhamVjdG9yeToKICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiTW90aW9uIHBsYW5uaW5nIGZhaWxlZCBidXQgYSBwYXJ0aWFsIHRyYWplY3Rvcnkgd2FzIHJldHVybmVkOiB7fSIuZm9ybWF0KGVycm9yX21zZykKICAgICAgICAgICAgICAgIGdoX3dhcm5pbmcoZ2hlbnYuQ29tcG9uZW50LCBtZXNzYWdlKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gIk1vdGlvbiBwbGFubmluZyBmYWlsZWQ6IHt9Ii5mb3JtYXQoZXJyb3JfbXNnKQogICAgICAgICAgICAgICAgZ2hfZXJyb3IoZ2hlbnYuQ29tcG9uZW50LCBtZXNzYWdlKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlCgogICAgICAgIGlmIG5vdCAocGxhbm5lciBhbmQgdGFyZ2V0IGFuZCBzdGFydF9zdGF0ZSBhbmQgY29tcHV0ZSk6CiAgICAgICAgICAgIGNhY2hlZCA9IHN0LmdldChrZXkpCiAgICAgICAgICAgIGlmIGNhY2hlZCBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIChOb25lLCBbXSwgTm9uZSwgIiIpCiAgICAgICAgICAgIHRyYWplY3RvcnksIGVycm9yX21zZyA9IGNhY2hlZAogICAgICAgICAgICBkZWJ1Z19pbmZvID0gX2RpYWdub3NlKGVycm9yX21zZywgdHJhamVjdG9yeSBpcyBub3QgTm9uZSkKICAgICAgICAgICAgcGxhbmVzLCBwb2x5bGluZSA9IF92aXoodHJhamVjdG9yeSkKICAgICAgICAgICAgcmV0dXJuICh0cmFqZWN0b3J5LCBwbGFuZXMsIHBvbHlsaW5lLCBkZWJ1Z19pbmZvKQoKICAgICAgICBvcHRpb25zID0ge30KICAgICAgICBpZiBwbGFubmVyX2lkOgogICAgICAgICAgICBvcHRpb25zWyJwbGFubmVyX2lkIl0gPSBwbGFubmVyX2lkCiAgICAgICAgaWYgbnVtX3BsYW5uaW5nX2F0dGVtcHRzOgogICAgICAgICAgICBvcHRpb25zWyJudW1fcGxhbm5pbmdfYXR0ZW1wdHMiXSA9IGludChudW1fcGxhbm5pbmdfYXR0ZW1wdHMpCiAgICAgICAgaWYgYWxsb3dlZF9wbGFubmluZ190aW1lOgogICAgICAgICAgICBvcHRpb25zWyJhbGxvd2VkX3BsYW5uaW5nX3RpbWUiXSA9IGZsb2F0KGFsbG93ZWRfcGxhbm5pbmdfdGltZSkKCiAgICAgICAgdHJhamVjdG9yeSA9IE5vbmUKICAgICAgICBlcnJvcl9tc2cgPSBOb25lCiAgICAgICAgIyB0cnk6CiAgICAgICAgdHJhamVjdG9yeSA9IHBsYW5uZXIucGxhbl9tb3Rpb24oCiAgICAgICAgICAgIHRhcmdldD10YXJnZXQsCiAgICAgICAgICAgIHN0YXJ0X3N0YXRlPXN0YXJ0X3N0YXRlLAogICAgICAgICAgICBncm91cD1ncm91cCBvciBOb25lLAogICAgICAgICAgICBvcHRpb25zPW9wdGlvbnMgb3IgTm9uZSwKICAgICAgICApCiAgICAgICAgIyBleGNlcHQgTW90aW9uUGxhbm5pbmdFcnJvciBhcyBlOgogICAgICAgICMgICAgIHRyYWplY3RvcnkgPSBnZXRhdHRyKGUsICJwYXJ0aWFsX3RyYWplY3RvcnkiLCBOb25lKQogICAgICAgICMgICAgIGVycm9yX21zZyA9IHN0cihlKQogICAgICAgICMgZXhjZXB0IEJhY2tlbmRFcnJvciBhcyBlOgogICAgICAgICMgICAgIGVycm9yX21zZyA9IHN0cihlKQoKICAgICAgICAjIE9uIGEgZnVsbCBmYWlsdXJlLCBhcHBlbmQgYSBjb25jaXNlIGNvbGxpc2lvbiBjaGVjayBvbiB0aGUgc3RhcnQgc3RhdGUKICAgICAgICAjIChhIGNvbW1vbiBjYXVzZSkuIENhY2hlZCB3aXRoIHRoZSBlcnJvciBzbyByZXBsYXlzIGRvbid0IHJlLXF1ZXJ5IHRoZSBiYWNrZW5kLgogICAgICAgIGlmIGVycm9yX21zZyBhbmQgdHJhamVjdG9yeSBpcyBOb25lOgogICAgICAgICAgICBoaW50ID0gY29sbGlzaW9uX2RpYWdub3N0aWMocGxhbm5lciwgc3RhcnRfc3RhdGUsIGdyb3VwIG9yIE5vbmUpCiAgICAgICAgICAgIGlmIGhpbnQ6CiAgICAgICAgICAgICAgICBlcnJvcl9tc2cgKz0gIlxuIiArIGhpbnQKCiAgICAgICAgZGVidWdfaW5mbyA9IF9kaWFnbm9zZShlcnJvcl9tc2csIHRyYWplY3RvcnkgaXMgbm90IE5vbmUpCiAgICAgICAgc3Rba2V5XSA9ICh0cmFqZWN0b3J5LCBlcnJvcl9tc2cpCiAgICAgICAgcGxhbmVzLCBwb2x5bGluZSA9IF92aXoodHJhamVjdG9yeSkKICAgICAgICByZXR1cm4gKHRyYWplY3RvcnksIHBsYW5lcywgcG9seWxpbmUsIGRlYnVnX2luZm8pCg==
+ - COMPAS FAB: Plan Motion
+
+
+
+
+ - *.*.python
+ - 3.*
@@ -5035,10 +5309,10 @@
-
- 399
- 199
+ 535
+ 149
550
- 650
+ 700
@@ -5049,7 +5323,7 @@
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- - COMPAS FAB: Plan Motion
+ - COMPAS FAB: Robot Configuration
@@ -5058,14 +5332,14 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACKUlEQVRIDWNgoDFgRDb/////IUB+/oOHj61//PiBIoesDhubg4Pjv4K87FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYFK5KMrIJZ/9eM3huNvP4GVWwjzMujwc8O0gsxcA/bB/QeP/pEa5iBT5tx7wdB74wnMQDBdrCHDkKIkwQCKE0UFOSawD8gx/MrHr2DDpTjZGHJUpcCGT7n9DCxmKczHoA0NflgQobgCF2fNug0MV6/dYLh2/QaDfm4xWBnzvu0M6hL+DFqaGmB+1aUH4CDT5ucC84myAGQgCKxeuwFMwwwDcaSkJOGGgyXRCIIWNLZ0gF0cGhzAUF9TATcMFLmLj15jeKxhwLD+yRuwsaAgAgFQZMMAXgtAQQJyPcjwkKAAmB4wDQoCUISCIhkULDAAEkNKSZB8cP3Grf8wBTAaZDAIg4IDOUhg8jAaFNkn3n4Gc8GRCw17kICmhhojVh+AXA4Kb5DL8RkOMgTkWmQXg8SQARMyhxZsnBZgC3dyHIBhASx4CAUNsZZhWHDj5i1i9RKlDsWCzVu3M1y+cg2s8dbtu0QZQEgR2AJQwQRS+PfvP7h6ZmYUu+HixDJgZsLqg8PA+sAGpBnkC5BFAX7exJqFVR2wPjgCrA9sYflgIlAV2AJfb0+sGsgQBJnJAA4HUM0DqubIMASrFmiVCa6X4XUySCUtKn2sLqCmIABYC8F1xJtFXwAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAAB4ElEQVRIDWNgoDFgRDb/////UUB+5u0796z//v2LIoesDhubmZn5v6qK0lGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYB7du3/2HK8wX3X8JtitOUZwkO0FxoqaqzMQC0gUz/NLlKwyvX7+BGzT9FwfD1X9gJQybbt5nyGT7AZfDxRAVFWHQ09WBmwnRDVU9beYchvfvP8D1Xo3OQbCBFs2auwDOx8UQFBRgmDFlAlwaxYKs9BQ0H/yB+0Cb6Q9DWnICXCMuBsgHyADFApDXkIEzkENuHMDMQbEAJohMo0fu+idvGBquPAQradCRZwiUQXUxsl4QG5yKrt+49R/Eae/qZXj46DGIiRMc9ohi+McESd1M//4x2O6AZ1qwHnk5WYbKMkh+1dRQY4TlA5wGUiqB4gNiDCMliEA+IBgHMEuRI5tQuMP0gGgUC9AzGkwhKRkOltFgelEsQM9oMEWkZDiSMhrMgum/iM9wWDMaqGAClUfoGQ1mATkZDmQmSD84FQHrg8PA+sAGZiA1aGB9cARYH9jC8sF0ahiKZgbYTLAFoJoHVM2hKSCbC60ywVkcHEQwk2hR6cPMphkNAHNawSqnZwBxAAAAAElFTkSuQmCC
- - 878ee4f3-dfc7-4c1e-ab8e-487124d32510
+ - 41a87a38-d6ed-4fa3-8ce0-56d36c64d779
- true
- false
- true
- - COMPAS FAB: Plan Motion
- - COMPAS FAB: Plan Motion
+ - COMPAS FAB: Robot Configuration
+ - COMPAS FAB: Robot Configuration
- 3
- false
@@ -5077,63 +5351,55 @@
-
- 2663
- 552
- 214
- 164
+ 2281
+ 242
+ 155
+ 44
-
- 2800
- 634
+ 2349
+ 264
-
- - 8
+
+ - 2
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 4
+ - 2
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
-
+
- true
- - A planner that supports plan_motion (e.g. MoveItPlanner, PyBulletPlanner).
- - 8e002351-10fa-451a-83f6-40a91c1deb68
- - planner
- - planner
+ - The RobotCell to derive joint metadata from. Wiring a new cell rebuilds the slider bank to match its configurable joints.
+ - c13b9e93-0236-4827-908f-9e3625b9c970
+ - robot_cell
+ - robot_cell
- true
- 0
- 2
- true
- - d0c4d7c9-a51c-49fd-b072-a7b8ba5d1f9e
+ - c4c3df53-0a94-4574-afc8-9e68cb15bc46
- 1
- - A planner that supports plan_motion (e.g. MoveItPlanner, PyBulletPlanner).
+ - The RobotCell to derive joint metadata from. Wiring a new cell rebuilds the slider bank to match its configurable joints.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2665
- 554
- 120
+ 2283
+ 244
+ 51
20
-
- 2726.5
- 564
+ 2310
+ 254
@@ -5146,72 +5412,77 @@
-
+
+ - 1
- true
- - Target to reach (FrameTarget, PointAxisTarget, ConfigurationTarget, ConstraintSetTarget).
- - 8f0985c9-bfd3-4613-b402-a03b0404cb26
- - target
- - target
+ - Joint values in canonical joint order. Auto-populated by the per-joint sliders the component creates; wire your own values to override.
+ - 352d1cbf-fc57-4fd2-afc5-b31c624b77c2
+ - joints
+ - joints
- true
- - 0
+ - 1
- 2
- true
- - 549998f3-80a1-4ada-9c82-ef9c0f3c9e43
- - 1
- - Target to reach (FrameTarget, PointAxisTarget, ConfigurationTarget, ConstraintSetTarget).
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+ - 6c63291c-1328-4b53-8824-3fabe85dcaea
+ - e1f2d3c9-448c-4325-9962-093ce24f4b6d
+ - 6908f732-c3c1-46cf-b28f-d05e55442514
+ - 7d720b2e-cb1b-4d13-8e07-b58ef0a2ca4e
+ - a16adbc8-88dd-44fa-85a8-ef79e4a1e8b0
+ - ba57b42f-a73d-48dc-9c86-b258615889b2
+ - 6
+ - Joint values in canonical joint order. Auto-populated by the per-joint sliders the component creates; wire your own values to override.
+ - 9d51e32e-c038-4352-9554-f4137ca91b9a
-
- 2665
- 574
- 120
+ 2283
+ 264
+ 51
20
-
- 2726.5
- 584
+ 2310
+ 274
- System.Private.CoreLib
- - System.Object
+ - System.Double
-
-
- - true
- - Starting RobotCellState. The robot's configuration in this state is used as the seed.
- - 705c1aad-ac69-4405-ad94-59eeae7980d1
- - start_state
- - start_state
- - true
+
+
+ - false
+ - Configuration with joint_names and joint_types extracted from the cell.
+ - e3aeb9d7-fd12-419f-82da-1a5c3e5fda0d
+ - configuration
+ - configuration
+ - false
- 0
- 2
- true
- - 3466ce89-77e4-426b-a993-683e29db59a1
- - 1
- - Starting RobotCellState. The robot's configuration in this state is used as the seed.
+ - 0
+ - Configuration with joint_names and joint_types extracted from the cell.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2665
- 594
- 120
+ 2364
+ 244
+ 70
20
-
- 2726.5
- 604
+ 2399
+ 254
@@ -5223,609 +5494,59 @@
-
+
- - true
- - Planning group name. Defaults to the cell's main planning group.
- - 3044f4b7-874d-40c8-82f8-a61e0f89869b
- - group
- - group
- - true
+ - false
+ - A copy of the default cell state with `robot_configuration` set to the selected configuration.
+ - e3d8b137-b6b2-491f-a175-53c88474afd2
+ - cell_state
+ - cell_state
+ - false
- 0
- 2
- true
- 0
- - Planning group name. Defaults to the cell's main planning group.
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+ - A copy of the default cell state with `robot_configuration` set to the selected configuration.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
- 2665
- 614
- 120
+ 2364
+ 264
+ 70
20
-
- 2726.5
- 624
+ 2399
+ 274
- System.Private.CoreLib
- - System.String
+ - System.Object
-
-
- - true
- - MoveIt planner algorithm name (e.g. 'RRTConnect', 'PRMstar'). Defaults to 'RRTConnect'.
- - c630c1e8-050b-4e7b-b340-dfed3ebe4a15
- - planner_id
- - planner_id
- - true
- - 0
- - 2
- - true
- - 0
- - MoveIt planner algorithm name (e.g. 'RRTConnect', 'PRMstar'). Defaults to 'RRTConnect'.
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
-
-
-
-
- -
- 2665
- 634
- 120
- 20
-
- -
- 2726.5
- 644
-
-
-
-
-
- - System.Private.CoreLib
- - System.String
-
-
-
-
-
-
- - true
- - Number of randomized attempts to make. Defaults to 5 for MoveIt.
- - 7cfa47f0-5878-47fe-b807-48088f6505f0
- - num_planning_attempts
- - num_planning_attempts
- - true
- - 0
- - 2
- - true
- - 0
- - Number of randomized attempts to make. Defaults to 5 for MoveIt.
- - 48d01794-d3d8-4aef-990e-127168822244
-
-
-
-
- -
- 2665
- 654
- 120
- 20
-
- -
- 2726.5
- 664
-
-
-
-
-
- - System.Private.CoreLib
- - System.Int32
-
-
-
-
-
-
- - true
- - Planning timeout in seconds. Defaults to 1.0.
- - 5812faf4-6133-43b2-b17b-2c55fa330237
- - allowed_planning_time
- - allowed_planning_time
- - true
- - 0
- - 2
- - true
- - 0
- - Planning timeout in seconds. Defaults to 1.0.
- - 9d51e32e-c038-4352-9554-f4137ca91b9a
-
-
-
-
- -
- 2665
- 674
- 120
- 20
-
- -
- 2726.5
- 684
-
-
-
-
-
- - System.Private.CoreLib
- - System.Double
-
-
-
-
-
-
- - true
- - Trigger planning. Defaults to False so the canvas does not plan on every refresh.
- - bc877669-87a5-40f0-9262-54b61aaf6bff
- - compute
- - compute
- - true
- - 0
- - 2
- - true
- - 8a25fcc1-f970-4f14-b174-b1c41b5328d9
- - 1
- - Trigger planning. Defaults to False so the canvas does not plan on every refresh.
- - d60527f5-b5af-4ef6-8970-5f96fe412559
-
-
-
-
- -
- 2665
- 694
- 120
- 20
-
- -
- 2726.5
- 704
-
-
-
-
-
- - System.Private.CoreLib
- - System.Boolean
-
-
-
-
-
-
- - false
- - Resulting JointTrajectory, or a partial trajectory on planning failure. The component is flagged red (with the backend error) when planning fails outright.
- - f73d3ab2-8697-4ff9-b443-87d7b13dafeb
- - trajectory
- - trajectory
- - false
- - 0
- - 2
- - true
- - 0
- - Resulting JointTrajectory, or a partial trajectory on planning failure. The component is flagged red (with the backend error) when planning fails outright.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
-
-
-
- -
- 2815
- 554
- 60
- 40
-
- -
- 2845
- 574
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
-
- - false
- - List of Rhino planes — one per trajectory point — at the planning group's end-effector frame (target_mode=ROBOT). Computed via FK on the planner with the start_state's attachments preserved.
- - 7862377a-b0e8-4386-8873-fef9ac5884c7
- - planes
- - planes
- - false
- - 0
- - 2
- - true
- - 0
- - List of Rhino planes — one per trajectory point — at the planning group's end-effector frame (target_mode=ROBOT). Computed via FK on the planner with the start_state's attachments preserved.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
-
-
-
- -
- 2815
- 594
- 60
- 40
-
- -
- 2845
- 614
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
-
- - false
- - Polyline connecting the plane origins in trajectory order. None when the trajectory has fewer than two points.
- - 4dd0ca5a-e703-4ea7-be36-d625defb901f
- - polyline
- - polyline
- - false
- - 0
- - 2
- - true
- - 0
- - Polyline connecting the plane origins in trajectory order. None when the trajectory has fewer than two points.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
-
-
-
- -
- 2815
- 634
- 60
- 40
-
- -
- 2845
- 654
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
-
- - false
- - The failure message (including a collision diagnostic on a full failure), as a single string. Wire a panel to read it; empty on success.
- - f08254eb-d464-4f7e-98da-31516efa7c4b
- - debug_info
- - debug_info
- - false
- - 0
- - 2
- - true
- - 0
- - The failure message (including a collision diagnostic on a full failure), as a single string. Wire a panel to read it; empty on success.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
-
-
-
- -
- 2815
- 674
- 60
- 40
-
- -
- 2845
- 694
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
-
-
-
- - true
- - false
- - true
- - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpQbGFuIGEgZnJlZS1zcGFjZSAoam9pbnQtaW50ZXJwb2xhdGVkKSBtb3Rpb24gdG8gYSB0YXJnZXQuCgpDYWxscyBgcGxhbm5lci5wbGFuX21vdGlvbih0YXJnZXQsIHN0YXJ0X3N0YXRlKWAuIFRoZSByZXN1bHQgaXMgY2FjaGVkIGluCnN0aWNreSBzbyB0aGUgY2FudmFzIGRvZXMgbm90IHJlLXBsYW4gb24gZXZlcnkgcmVmcmVzaCAtIHNldCBgY29tcHV0ZWAgdG8KVHJ1ZSB0byAocmUpcGxhbi4KCkFueSBwbGFubmluZyBmYWlsdXJlIChubyBwbGFuIGZvdW5kLCBzdGFydC9nb2FsIGluIGNvbGxpc2lvbiwgdGltZWQgb3V0LCDigKYpCmZsYWdzIHRoZSBjb21wb25lbnQgcmVkIHdpdGggdGhlIGJhY2tlbmQgZXJyb3IgbWVzc2FnZS4gV2hlbiB0aGUgYmFja2VuZApyZXR1cm5zIGEgYHBhcnRpYWxfdHJhamVjdG9yeWAsIHRoZSBjb21wb25lbnQgaXMgZmxhZ2dlZCB3aXRoIGEgd2FybmluZwppbnN0ZWFkIGFuZCB0aGUgcGFydGlhbCB0cmFqZWN0b3J5IGlzIHN1cmZhY2VkLiBPbiBhIGZ1bGwgZmFpbHVyZSB0aGUgc3RhcnQKc3RhdGUgaXMgY29sbGlzaW9uLWNoZWNrZWQgKHdoZW4gdGhlIHBsYW5uZXIgc3VwcG9ydHMgaXQpIGFuZCBhIGNvbmNpc2UgaGludAphcHBlbmRlZC4gVGhlIG1lc3NhZ2UgaXMgYWxzbyBleHBvc2VkIG9uIHRoZSBgZGVidWdfaW5mb2Agb3V0cHV0IHNvIGl0IGNhbiBiZQpyZWFkIGluIGEgd2lyZWQgcGFuZWwuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IFN5c3RlbQpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgY3JlYXRlX2lkCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBlcnJvciBhcyBnaF9lcnJvcgpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgd2FybmluZyBhcyBnaF93YXJuaW5nCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBmcmFtZV90b19yaGlub19wbGFuZQpmcm9tIGNvbXBhc19yaGluby5jb252ZXJzaW9ucyBpbXBvcnQgcG9seWxpbmVfdG9fcmhpbm8KZnJvbSBzY3JpcHRjb250ZXh0IGltcG9ydCBzdGlja3kgYXMgc3QKCmZyb20gY29tcGFzX2ZhYi5iYWNrZW5kcyBpbXBvcnQgQmFja2VuZEVycm9yCmZyb20gY29tcGFzX2ZhYi5iYWNrZW5kcyBpbXBvcnQgTW90aW9uUGxhbm5pbmdFcnJvcgpmcm9tIGNvbXBhc19mYWIuZ2hweXRob24gaW1wb3J0IGNvbGxpc2lvbl9kaWFnbm9zdGljCgoKY2xhc3MgUGxhbk1vdGlvbihHcmFzc2hvcHBlci5LZXJuZWwuR0hfU2NyaXB0SW5zdGFuY2UpOgogICAgZGVmIFJ1blNjcmlwdChzZWxmLAogICAgICAgICAgICBwbGFubmVyLAogICAgICAgICAgICB0YXJnZXQsCiAgICAgICAgICAgIHN0YXJ0X3N0YXRlLAogICAgICAgICAgICBncm91cDogc3RyLAogICAgICAgICAgICBwbGFubmVyX2lkOiBzdHIsCiAgICAgICAgICAgIG51bV9wbGFubmluZ19hdHRlbXB0czogaW50LAogICAgICAgICAgICBhbGxvd2VkX3BsYW5uaW5nX3RpbWU6IGZsb2F0LAogICAgICAgICAgICBjb21wdXRlOiBib29sKToKICAgICAgICBrZXkgPSBjcmVhdGVfaWQoZ2hlbnYuQ29tcG9uZW50LCAidHJhamVjdG9yeSIpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgZGVmIF92aXoodHJhamVjdG9yeSk6CiAgICAgICAgICAgIGlmIHRyYWplY3RvcnkgaXMgTm9uZToKICAgICAgICAgICAgICAgIHJldHVybiBbXSwgTm9uZQogICAgICAgICAgICBmcmFtZXMsIHBvbHlsaW5lID0gdHJhamVjdG9yeS50b19mcmFtZXNfYW5kX3BvbHlsaW5lKHBsYW5uZXIucm9ib3RfY2VsbCwgc3RhcnRfc3RhdGUsIGdyb3VwIG9yIE5vbmUpCiAgICAgICAgICAgIHBsYW5lcyA9IFtmcmFtZV90b19yaGlub19wbGFuZShmKSBmb3IgZiBpbiBmcmFtZXNdCiAgICAgICAgICAgIHBvbHlsaW5lID0gcG9seWxpbmVfdG9fcmhpbm8ocG9seWxpbmUpIGlmIHBvbHlsaW5lIGVsc2UgTm9uZQogICAgICAgICAgICByZXR1cm4gcGxhbmVzLCBwb2x5bGluZQoKICAgICAgICBkZWYgX2RpYWdub3NlKGVycm9yX21zZywgaGFzX3RyYWplY3RvcnkpOgogICAgICAgICAgICAiIiJGbGFnIHRoZSBjb21wb25lbnQgZm9yIGFuIGVycm9yIGFuZCByZXR1cm4gdGhlIG1lc3NhZ2Ugc2hvd24gKGZvciBkZWJ1Z19pbmZvKS4iIiIKICAgICAgICAgICAgaWYgbm90IGVycm9yX21zZzoKICAgICAgICAgICAgICAgIHJldHVybiAiIgogICAgICAgICAgICBpZiBoYXNfdHJhamVjdG9yeToKICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiTW90aW9uIHBsYW5uaW5nIGZhaWxlZCBidXQgYSBwYXJ0aWFsIHRyYWplY3Rvcnkgd2FzIHJldHVybmVkOiB7fSIuZm9ybWF0KGVycm9yX21zZykKICAgICAgICAgICAgICAgIGdoX3dhcm5pbmcoZ2hlbnYuQ29tcG9uZW50LCBtZXNzYWdlKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBtZXNzYWdlID0gIk1vdGlvbiBwbGFubmluZyBmYWlsZWQ6IHt9Ii5mb3JtYXQoZXJyb3JfbXNnKQogICAgICAgICAgICAgICAgZ2hfZXJyb3IoZ2hlbnYuQ29tcG9uZW50LCBtZXNzYWdlKSAgIyBub3FhOiBGODIxCiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlCgogICAgICAgIGlmIG5vdCAocGxhbm5lciBhbmQgdGFyZ2V0IGFuZCBzdGFydF9zdGF0ZSBhbmQgY29tcHV0ZSk6CiAgICAgICAgICAgIGNhY2hlZCA9IHN0LmdldChrZXkpCiAgICAgICAgICAgIGlmIGNhY2hlZCBpcyBOb25lOgogICAgICAgICAgICAgICAgcmV0dXJuIChOb25lLCBbXSwgTm9uZSwgIiIpCiAgICAgICAgICAgIHRyYWplY3RvcnksIGVycm9yX21zZyA9IGNhY2hlZAogICAgICAgICAgICBkZWJ1Z19pbmZvID0gX2RpYWdub3NlKGVycm9yX21zZywgdHJhamVjdG9yeSBpcyBub3QgTm9uZSkKICAgICAgICAgICAgcGxhbmVzLCBwb2x5bGluZSA9IF92aXoodHJhamVjdG9yeSkKICAgICAgICAgICAgcmV0dXJuICh0cmFqZWN0b3J5LCBwbGFuZXMsIHBvbHlsaW5lLCBkZWJ1Z19pbmZvKQoKICAgICAgICBvcHRpb25zID0ge30KICAgICAgICBpZiBwbGFubmVyX2lkOgogICAgICAgICAgICBvcHRpb25zWyJwbGFubmVyX2lkIl0gPSBwbGFubmVyX2lkCiAgICAgICAgaWYgbnVtX3BsYW5uaW5nX2F0dGVtcHRzOgogICAgICAgICAgICBvcHRpb25zWyJudW1fcGxhbm5pbmdfYXR0ZW1wdHMiXSA9IGludChudW1fcGxhbm5pbmdfYXR0ZW1wdHMpCiAgICAgICAgaWYgYWxsb3dlZF9wbGFubmluZ190aW1lOgogICAgICAgICAgICBvcHRpb25zWyJhbGxvd2VkX3BsYW5uaW5nX3RpbWUiXSA9IGZsb2F0KGFsbG93ZWRfcGxhbm5pbmdfdGltZSkKCiAgICAgICAgdHJhamVjdG9yeSA9IE5vbmUKICAgICAgICBlcnJvcl9tc2cgPSBOb25lCiAgICAgICAgIyB0cnk6CiAgICAgICAgdHJhamVjdG9yeSA9IHBsYW5uZXIucGxhbl9tb3Rpb24oCiAgICAgICAgICAgIHRhcmdldD10YXJnZXQsCiAgICAgICAgICAgIHN0YXJ0X3N0YXRlPXN0YXJ0X3N0YXRlLAogICAgICAgICAgICBncm91cD1ncm91cCBvciBOb25lLAogICAgICAgICAgICBvcHRpb25zPW9wdGlvbnMgb3IgTm9uZSwKICAgICAgICApCiAgICAgICAgIyBleGNlcHQgTW90aW9uUGxhbm5pbmdFcnJvciBhcyBlOgogICAgICAgICMgICAgIHRyYWplY3RvcnkgPSBnZXRhdHRyKGUsICJwYXJ0aWFsX3RyYWplY3RvcnkiLCBOb25lKQogICAgICAgICMgICAgIGVycm9yX21zZyA9IHN0cihlKQogICAgICAgICMgZXhjZXB0IEJhY2tlbmRFcnJvciBhcyBlOgogICAgICAgICMgICAgIGVycm9yX21zZyA9IHN0cihlKQoKICAgICAgICAjIE9uIGEgZnVsbCBmYWlsdXJlLCBhcHBlbmQgYSBjb25jaXNlIGNvbGxpc2lvbiBjaGVjayBvbiB0aGUgc3RhcnQgc3RhdGUKICAgICAgICAjIChhIGNvbW1vbiBjYXVzZSkuIENhY2hlZCB3aXRoIHRoZSBlcnJvciBzbyByZXBsYXlzIGRvbid0IHJlLXF1ZXJ5IHRoZSBiYWNrZW5kLgogICAgICAgIGlmIGVycm9yX21zZyBhbmQgdHJhamVjdG9yeSBpcyBOb25lOgogICAgICAgICAgICBoaW50ID0gY29sbGlzaW9uX2RpYWdub3N0aWMocGxhbm5lciwgc3RhcnRfc3RhdGUsIGdyb3VwIG9yIE5vbmUpCiAgICAgICAgICAgIGlmIGhpbnQ6CiAgICAgICAgICAgICAgICBlcnJvcl9tc2cgKz0gIlxuIiArIGhpbnQKCiAgICAgICAgZGVidWdfaW5mbyA9IF9kaWFnbm9zZShlcnJvcl9tc2csIHRyYWplY3RvcnkgaXMgbm90IE5vbmUpCiAgICAgICAgc3Rba2V5XSA9ICh0cmFqZWN0b3J5LCBlcnJvcl9tc2cpCiAgICAgICAgcGxhbmVzLCBwb2x5bGluZSA9IF92aXoodHJhamVjdG9yeSkKICAgICAgICByZXR1cm4gKHRyYWplY3RvcnksIHBsYW5lcywgcG9seWxpbmUsIGRlYnVnX2luZm8pCg==
- - COMPAS FAB: Plan Motion
-
-
-
-
- - *.*.python
- - 3.*
-
-
-
-
-
-
- -
- 535
- 149
- 550
- 700
-
-
-
-
-
-
-
-
-
- - c9b2d725-6f87-4b07-af90-bd9aefef68eb
- - COMPAS FAB: Robot Configuration
-
-
-
-
-
- - true
- - 2
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAAB4UlEQVRIDWNgoDFgRDb/////UUB+5q3bd63//fuHIoesDhubiYnpv5qq8lGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYBzdv3QEGOfYwX3T/JdiuOEVxkuwExYm6mgoTC0gXzPBLl68wvH79Bm7Q9F8cDFf/gZUwbLp5nyGT7QdcDhdDVFSEQU9XB24mRDdU9bSZcxjev/8A13s1OgfBBlo0a+4COB8XQ1BQgGHGlAlwaRQLstJT0HzwB+4DbaY/DGnJCXCNuBggHyADFAtAXkMGzkAOuXEAMwfFApggMo0eueufvGFouPIQrKRBR54hUAbVxch6QWxwKrp+49Z/EKe9q5fh4aPHICZOcNgjiuEfEyR1M/37x2C7A55pwXrk5WQZKssg+VVTQ40Rlg9wGkipBIoPiDGMlCAC+YBgHMAsRY5sQuEO0wOiUSxAz2gwhaRkOFhGg+lFsQA9o8EUkZLhSMpoMAum/yI+w2HNaKCCCVQeoWc0mAXkZDiQmSD94FQErA8OA+sDG5iB1KCB9cERYH1gC8sH06lhKJoZYDPBFoBqHlA1h6aAbC60ygRncXAQwUyiRaUPM5tmNACVDsEtgc8jGAAAAABJRU5ErkJggg==
-
- - 41a87a38-d6ed-4fa3-8ce0-56d36c64d779
- - true
- - false
- - true
- - COMPAS FAB: Robot Configuration
- - COMPAS FAB: Robot Configuration
- - 3
-
- - false
- - false
- - false
- - false
-
-
-
-
- -
- 2281
- 242
- 155
- 44
-
- -
- 2349
- 264
-
-
-
-
-
- - 2
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 2
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
-
-
-
-
- - true
- - The RobotCell to derive joint metadata from. Wiring a new cell rebuilds the slider bank to match its configurable joints.
- - c13b9e93-0236-4827-908f-9e3625b9c970
- - robot_cell
- - robot_cell
- - true
- - 0
- - 2
- - true
- - c4c3df53-0a94-4574-afc8-9e68cb15bc46
- - 1
- - The RobotCell to derive joint metadata from. Wiring a new cell rebuilds the slider bank to match its configurable joints.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
-
-
-
- -
- 2283
- 244
- 51
- 20
-
- -
- 2310
- 254
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
-
- - 1
- - true
- - Joint values in canonical joint order. Auto-populated by the per-joint sliders the component creates; wire your own values to override.
- - 352d1cbf-fc57-4fd2-afc5-b31c624b77c2
- - joints
- - joints
- - true
- - 1
- - 2
- - true
- - 6c63291c-1328-4b53-8824-3fabe85dcaea
- - e1f2d3c9-448c-4325-9962-093ce24f4b6d
- - 6908f732-c3c1-46cf-b28f-d05e55442514
- - 7d720b2e-cb1b-4d13-8e07-b58ef0a2ca4e
- - a16adbc8-88dd-44fa-85a8-ef79e4a1e8b0
- - ba57b42f-a73d-48dc-9c86-b258615889b2
- - 6
- - Joint values in canonical joint order. Auto-populated by the per-joint sliders the component creates; wire your own values to override.
- - 9d51e32e-c038-4352-9554-f4137ca91b9a
-
-
-
-
- -
- 2283
- 264
- 51
- 20
-
- -
- 2310
- 274
-
-
-
-
-
- - System.Private.CoreLib
- - System.Double
-
-
-
-
-
-
- - false
- - Configuration with joint_names and joint_types extracted from the cell.
- - e3aeb9d7-fd12-419f-82da-1a5c3e5fda0d
- - configuration
- - configuration
- - false
- - 0
- - 2
- - true
- - 0
- - Configuration with joint_names and joint_types extracted from the cell.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
-
-
-
- -
- 2364
- 244
- 70
- 20
-
- -
- 2399
- 254
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
-
- - false
- - A copy of the default cell state with `robot_configuration` set to the selected configuration.
- - e3d8b137-b6b2-491f-a175-53c88474afd2
- - cell_state
- - cell_state
- - false
- - 0
- - 2
- - true
- - 0
- - A copy of the default cell state with `robot_configuration` set to the selected configuration.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
-
-
-
- -
- 2364
- 264
- 70
- 20
-
- -
- 2399
- 274
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
-
-
-
- - true
- - false
- - true
- - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpCdWlsZCBhIENvbmZpZ3VyYXRpb24gZnJvbSBwZXItam9pbnQgc2xpZGVycyBhdXRvLWNyZWF0ZWQgZnJvbSBhIFJvYm90Q2VsbC4KCldpcmUgYSBgcm9ib3RfY2VsbGAgdG8gdGhpcyBjb21wb25lbnQgYW5kIG9uZSBgR0hfTnVtYmVyU2xpZGVyYCBwZXIKY29uZmlndXJhYmxlIGpvaW50IGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGFuZCB3aXJlZCB0byB0aGUgYGpvaW50c2AKbGlzdCBpbnB1dCwgd2l0aCBtaW4vbWF4IHNldCB0byB0aGUgam9pbnQncyBsaW1pdHMgKGFuZCDCsTLPgCBmYWxsYmFjayBmb3IKY29udGludW91cyBqb2ludHMgLyDCsTFtIGZvciBwcmlzbWF0aWMgd2hlbiBubyBsaW1pdCBpcyBkZWNsYXJlZCkuCgpSZS13aXJpbmcgYSBkaWZmZXJlbnQgYHJvYm90X2NlbGxgIHJlcGxhY2VzIHRoZSBzbGlkZXIgYmFuayB0byBtYXRjaCB0aGUKbmV3IGpvaW50IHNpZ25hdHVyZS4gV2lyaW5nIHlvdXIgb3duIHZhbHVlcyB0byBgam9pbnRzYCBvdmVycmlkZXMgdGhlCmF1dG8tc2xpZGVycy4KCkNPTVBBUyBGQUIgdjIuMC4wCiIiIgoKaW1wb3J0IEdyYXNzaG9wcGVyCmltcG9ydCBSaGlubwppbXBvcnQgU3lzdGVtCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBlcnJvcgpmcm9tIGNvbXBhc19yb2JvdHMgaW1wb3J0IENvbmZpZ3VyYXRpb24KCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgZW5zdXJlX2pvaW50X3NsaWRlcnMKCgpjbGFzcyBSb2JvdENvbmZpZ3VyYXRpb25Db21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgcm9ib3RfY2VsbCwgam9pbnRzOiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W2Zsb2F0XSk6CiAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJvYm90X21vZGVsID0gcm9ib3RfY2VsbC5yb2JvdF9tb2RlbAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgZXJyb3IoZ2hlbnYuQ29tcG9uZW50LCAicm9ib3RfY2VsbCBtdXN0IGJlIGEgUm9ib3RDZWxsIGluc3RhbmNlLiIpICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgbWV0YWRhdGEgPSBlbnN1cmVfam9pbnRfc2xpZGVycyhnaGVudi5Db21wb25lbnQsIHJvYm90X21vZGVsLCBpbnB1dF9uYW1lPSJqb2ludHMiKSAgIyBub3FhOiBGODIxCiAgICAgICAgaWYgbm90IG1ldGFkYXRhOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBuYW1lcyA9IFtuYW1lIGZvciBuYW1lLCBfLCBfIGluIG1ldGFkYXRhXQogICAgICAgIHR5cGVzID0gW2p0eXBlIGZvciBfLCBqdHlwZSwgXyBpbiBtZXRhZGF0YV0KICAgICAgICBkZWZhdWx0cyA9IFtkZWZhdWx0IGZvciBfLCBfLCBkZWZhdWx0IGluIG1ldGFkYXRhXQoKICAgICAgICAjIGBqb2ludHNgIG1heSBhcnJpdmUgZW1wdHkgb24gdGhlIHZlcnkgZmlyc3Qgc29sdmUgKHNsaWRlcnMgYXJlCiAgICAgICAgIyB3aXJlZCBpbiB0aGlzIHBhc3MgYnV0IHRoZWlyIHZhbHVlcyBvbmx5IGZsb3cgb24gdGhlIHNjaGVkdWxlZAogICAgICAgICMgZm9sbG93LXVwIHNvbHZlKS4gRmFsbCBiYWNrIHRvIHBlci1qb2ludCBkZWZhdWx0cyB0aGVuLgogICAgICAgIGlmIG5vdCBqb2ludHMgb3IgbGVuKGpvaW50cykgPCBsZW4obWV0YWRhdGEpOgogICAgICAgICAgICB2YWx1ZXMgPSBkZWZhdWx0cwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHZhbHVlcyA9IFtmbG9hdCh2KSBmb3IgdiBpbiBqb2ludHNdCgogICAgICAgIGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uKGpvaW50X3ZhbHVlcz12YWx1ZXMsIGpvaW50X3R5cGVzPXR5cGVzLCBqb2ludF9uYW1lcz1uYW1lcykKICAgICAgICBjZWxsX3N0YXRlID1yb2JvdF9jZWxsLmRlZmF1bHRfY2VsbF9zdGF0ZSgpCiAgICAgICAgY2VsbF9zdGF0ZS5yb2JvdF9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbgogICAgICAgIHJldHVybiAoY29uZmlndXJhdGlvbiwgY2VsbF9zdGF0ZSkKCg==
- - COMPAS FAB: Robot Configuration
-
-
-
-
- - *.*.python
- - 3.*
+
+
+
+
+ - true
+ - false
+ - true
+ - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpCdWlsZCBhIENvbmZpZ3VyYXRpb24gZnJvbSBwZXItam9pbnQgc2xpZGVycyBhdXRvLWNyZWF0ZWQgZnJvbSBhIFJvYm90Q2VsbC4KCldpcmUgYSBgcm9ib3RfY2VsbGAgdG8gdGhpcyBjb21wb25lbnQgYW5kIG9uZSBgR0hfTnVtYmVyU2xpZGVyYCBwZXIKY29uZmlndXJhYmxlIGpvaW50IGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGFuZCB3aXJlZCB0byB0aGUgYGpvaW50c2AKbGlzdCBpbnB1dCwgd2l0aCBtaW4vbWF4IHNldCB0byB0aGUgam9pbnQncyBsaW1pdHMgKGFuZCDCsTLPgCBmYWxsYmFjayBmb3IKY29udGludW91cyBqb2ludHMgLyDCsTFtIGZvciBwcmlzbWF0aWMgd2hlbiBubyBsaW1pdCBpcyBkZWNsYXJlZCkuCgpSZS13aXJpbmcgYSBkaWZmZXJlbnQgYHJvYm90X2NlbGxgIHJlcGxhY2VzIHRoZSBzbGlkZXIgYmFuayB0byBtYXRjaCB0aGUKbmV3IGpvaW50IHNpZ25hdHVyZS4gV2lyaW5nIHlvdXIgb3duIHZhbHVlcyB0byBgam9pbnRzYCBvdmVycmlkZXMgdGhlCmF1dG8tc2xpZGVycy4KCkNPTVBBUyBGQUIgdjIuMC4wCiIiIgoKaW1wb3J0IEdyYXNzaG9wcGVyCmltcG9ydCBSaGlubwppbXBvcnQgU3lzdGVtCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCBlcnJvcgpmcm9tIGNvbXBhc19yb2JvdHMgaW1wb3J0IENvbmZpZ3VyYXRpb24KCmZyb20gY29tcGFzX2ZhYi5naHB5dGhvbiBpbXBvcnQgZW5zdXJlX2pvaW50X3NsaWRlcnMKCgpjbGFzcyBSb2JvdENvbmZpZ3VyYXRpb25Db21wb25lbnQoR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgcm9ib3RfY2VsbCwgam9pbnRzOiBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W2Zsb2F0XSk6CiAgICAgICAgaWYgcm9ib3RfY2VsbCBpcyBOb25lOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJvYm90X21vZGVsID0gcm9ib3RfY2VsbC5yb2JvdF9tb2RlbAogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgZXJyb3IoZ2hlbnYuQ29tcG9uZW50LCAicm9ib3RfY2VsbCBtdXN0IGJlIGEgUm9ib3RDZWxsIGluc3RhbmNlLiIpICAjIG5vcWE6IEY4MjEKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgbWV0YWRhdGEgPSBlbnN1cmVfam9pbnRfc2xpZGVycyhnaGVudi5Db21wb25lbnQsIHJvYm90X21vZGVsLCBpbnB1dF9uYW1lPSJqb2ludHMiKSAgIyBub3FhOiBGODIxCiAgICAgICAgaWYgbm90IG1ldGFkYXRhOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgICAgICBuYW1lcyA9IFtuYW1lIGZvciBuYW1lLCBfLCBfIGluIG1ldGFkYXRhXQogICAgICAgIHR5cGVzID0gW2p0eXBlIGZvciBfLCBqdHlwZSwgXyBpbiBtZXRhZGF0YV0KICAgICAgICBkZWZhdWx0cyA9IFtkZWZhdWx0IGZvciBfLCBfLCBkZWZhdWx0IGluIG1ldGFkYXRhXQoKICAgICAgICAjIGBqb2ludHNgIG1heSBhcnJpdmUgZW1wdHkgb24gdGhlIHZlcnkgZmlyc3Qgc29sdmUgKHNsaWRlcnMgYXJlCiAgICAgICAgIyB3aXJlZCBpbiB0aGlzIHBhc3MgYnV0IHRoZWlyIHZhbHVlcyBvbmx5IGZsb3cgb24gdGhlIHNjaGVkdWxlZAogICAgICAgICMgZm9sbG93LXVwIHNvbHZlKS4gRmFsbCBiYWNrIHRvIHBlci1qb2ludCBkZWZhdWx0cyB0aGVuLgogICAgICAgIGlmIG5vdCBqb2ludHMgb3IgbGVuKGpvaW50cykgPCBsZW4obWV0YWRhdGEpOgogICAgICAgICAgICB2YWx1ZXMgPSBkZWZhdWx0cwogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHZhbHVlcyA9IFtmbG9hdCh2KSBmb3IgdiBpbiBqb2ludHNdCgogICAgICAgIGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0aW9uKGpvaW50X3ZhbHVlcz12YWx1ZXMsIGpvaW50X3R5cGVzPXR5cGVzLCBqb2ludF9uYW1lcz1uYW1lcykKICAgICAgICBjZWxsX3N0YXRlID1yb2JvdF9jZWxsLmRlZmF1bHRfY2VsbF9zdGF0ZSgpCiAgICAgICAgY2VsbF9zdGF0ZS5yb2JvdF9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbgogICAgICAgIHJldHVybiAoY29uZmlndXJhdGlvbiwgY2VsbF9zdGF0ZSkKCg==
+ - COMPAS FAB: Robot Configuration
+
+
+
+
+ - *.*.python
+ - 3.*
@@ -5844,7 +5565,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -5885,7 +5606,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -5926,7 +5647,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -5967,7 +5688,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -6008,7 +5729,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -6049,7 +5770,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -6090,7 +5811,7 @@
-
+
- ac2bc2cb-70fb-4dd5-9c78-7e1ea97fe278
- Geometry
@@ -6126,7 +5847,7 @@
-
+
- ac2bc2cb-70fb-4dd5-9c78-7e1ea97fe278
- Geometry
@@ -6143,21 +5864,330 @@
- a10405c9-71de-4f11-861b-bd07a05b37f3
- 1
-
+
+
+
+ -
+ 2999
+ 90
+ 50
+ 24
+
+ -
+ 3024.5435
+ 102
+
+
+
+
+
+
+
+
+
+ - c9b2d725-6f87-4b07-af90-bd9aefef68eb
+ - COMPAS FAB: Tool From Mesh
+
+
+
+
+ - Construct a ToolModel from a Rhino mesh and a TCP plane, both expressed in the coordinates the mesh was modelled in. Wire `base_plane` to say where the robot's flange takes hold of the geometry, so the tool can be modelled wherever is convenient. The same mesh is used for collision checking unless a separate `collision_mesh` is provided. Output feeds directly into a Load Robot Cell component's `tools` input.
+ - true
+ - 2
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABq0lEQVRIDbVVsU7DMBB1Ch+A1ArWDoUWZjaKBH+AoF35BLoCQkJICJiQ+gcsDKgB8Q/AxgwtdGNgAxYkWBruHZxlEjtx1PaG+Ox7996drdhKjdkCkz+KogbNW72n/hL5/2ImzuYHQRBV5yp3FGuTHwpGkxDhUbf3vCOBYcZadfaYRHbBwQKonMg7w5DGc0mkiU4Kf4FWHDCCOXNyB1T9IO+eZxWAM6EuCpMAxskPDk/Uw2M3i0PH9/e21cJ8Tc/hCKdskQ6COA+5TnQ4CQFUEq8GuaiyubGWoMGaDS/AhAACNiJsW+fyWvK8R6uA2YWtOllDIY31ZFemulUAALOLi/MzLLHBlzPKIkeCU0C6iB96ePW7TWYBrOz4OAWAFxJz78X3qR4cqQJmFwCLibDM08ZUASTayHyrRz7/yXBchi4gcvr6qSa+v9RWueiCWtczBZBVrK+o9/s+E5QWK1Yi1yIL4GKSu8MGXJ2eUpvlGfXy9qHg+xg4gZP34IZu1LpPoi+GbtJbElmWQ277JubAMScLkFKIZy5HcioUXOAESL/JmNA5jPzRB+9Y7Qe0HI6ecIyijwAAAABJRU5ErkJggg==
+
+ - 1f179f42-a302-4b46-a703-cf43ac8ec09f
+ - true
+ - false
+ - true
+ - COMPAS FAB: Tool From Mesh
+ - COMPAS FAB: Tool From Mesh
+ - 3
+
+ - false
+ - false
+ - false
+ - false
+
+
-
- 2999
- 90
- 50
- 24
+ 667
+ 116
+ 167
+ 104
-
- 3024.5435
- 102
+ 758
+ 168
+
+
+ - 5
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 1
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+
+
+
+
+ - true
+ - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`.
+ - 3600fb81-ca56-4008-a0c8-ce0d7dfbda77
+ - name
+ - name
+ - true
+ - 0
+ - 2
+ - true
+ - b1d6bdbb-bbbc-482e-9851-581e5580f4a9
+ - 1
+ - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`.
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+
+
+
+
+ -
+ 669
+ 118
+ 74
+ 20
+
+ -
+ 707.5
+ 128
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.String
+
+
+
+
+
+
+ - true
+ - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided).
+ - 0ef05760-9985-44e6-9fb4-0a0b0f4d84f7
+ - visual_mesh
+ - visual_mesh
+ - true
+ - 0
+ - 2
+ - true
+ - de7ea5f7-f04b-48c8-80ca-659046e21818
+ - 1
+ - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided).
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 669
+ 138
+ 74
+ 20
+
+ -
+ 707.5
+ 148
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+ - true
+ - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`.
+ - 56f882fb-6daf-4f6c-af1f-f4f991da3e98
+ - collision_mesh
+ - collision_mesh
+ - true
+ - 0
+ - 2
+ - true
+ - de7ea5f7-f04b-48c8-80ca-659046e21818
+ - 1
+ - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 669
+ 158
+ 74
+ 20
+
+ -
+ 707.5
+ 168
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+ - true
+ - Tool Coordinate Frame, as a Rhino Plane or COMPAS Frame, expressed in the coordinates the mesh was modelled in.
+ - 79e726f7-b446-4461-81b5-d88988f92338
+ - tcp_plane
+ - tcp_plane
+ - true
+ - 0
+ - 2
+ - true
+ - 3e07e26f-7364-466c-bf58-2608d206128a
+ - 1
+ - Tool Coordinate Frame, as a Rhino Plane or COMPAS Frame, expressed in the coordinates the mesh was modelled in.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 669
+ 178
+ 74
+ 20
+
+ -
+ 707.5
+ 188
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+ - true
+ - Optional plane, in the coordinates the mesh was modelled in, at which the robot's flange takes hold of the tool. Its Z axis points away from the robot: a tool drawn reaching along world Z needs none. For a tool drawn reaching along world X, wire the plane with Z = world X. Defaults to the world XY plane, i.e. the modelling coordinates are the tool's base frame.
+ - 7c1b078d-551b-4b71-8b7d-2b040373be5c
+ - base_plane
+ - base_plane
+ - true
+ - 0
+ - 2
+ - true
+ - 0
+ - Optional plane, in the coordinates the mesh was modelled in, at which the robot's flange takes hold of the tool. Its Z axis points away from the robot: a tool drawn reaching along world Z needs none. For a tool drawn reaching along world X, wire the plane with Z = world X. Defaults to the world XY plane, i.e. the modelling coordinates are the tool's base frame.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 669
+ 198
+ 74
+ 20
+
+ -
+ 707.5
+ 208
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+ - false
+ - ToolModel.
+ - 3e1a6509-8a44-43de-bc75-d31a76526dbe
+ - tool_model
+ - tool_model
+ - false
+ - 0
+ - 2
+ - true
+ - 0
+ - ToolModel.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 773
+ 118
+ 59
+ 100
+
+ -
+ 802.5
+ 168
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+
+
+ - true
+ - false
+ - true
+ - IyByOiBjb21wYXNfZmFiPj0yLjAuMQoiIiIKQ29uc3RydWN0IGEgVG9vbE1vZGVsIGZyb20gYSBSaGlubyBtZXNoIGFuZCBhIFRDUCBwbGFuZS4KCmB0Y3BfcGxhbmVgIG1heSBiZSBhIFJoaW5vIFBsYW5lIG9yIGEgY29tcGFzIEZyYW1lOyBpdCBpcyB0aGUgVG9vbApDb29yZGluYXRlIEZyYW1lLCBleHByZXNzZWQgaW4gdGhlIHNhbWUgY29vcmRpbmF0ZXMgeW91IG1vZGVsbGVkIHRoZSBtZXNoCmluLiBJZiBgY29sbGlzaW9uX21lc2hgIGlzIHVud2lyZWQsIGB2aXN1YWxfbWVzaGAgaXMgcmV1c2VkIGZvciBjb2xsaXNpb24KY2hlY2tzLgoKYGJhc2VfcGxhbmVgIGlzIHdoZXJlIHRoZSByb2JvdCdzIGZsYW5nZSB0YWtlcyBob2xkIG9mIHRoZSBnZW9tZXRyeSwgYWxzbwppbiB0aGUgY29vcmRpbmF0ZXMgeW91IG1vZGVsbGVkIGluLiBJdHMgWiBheGlzIHBvaW50cyBhd2F5IGZyb20gdGhlIHJvYm90LAptYXRjaGluZyB0aGUgcGxhbm5pbmcgZ3JvdXBzIG9mIHRoZSByb2JvdHMgaW4gdGhlIGxpYnJhcnksIHNvIGEgdG9vbCBkcmF3bgpyZWFjaGluZyBhbG9uZyB3b3JsZCBaIG5lZWRzIG5vIGBiYXNlX3BsYW5lYCBhdCBhbGwuIFdpcmUgb25lIHdoZW4gdGhlIHRvb2wKd2FzIGRyYXduIGFsb25nIGFub3RoZXIgYXhpczogZm9yIGEgdG9vbCByZWFjaGluZyBhbG9uZyB3b3JsZCBYLCB0aGF0IGlzCnRoZSBwbGFuZSB3aXRoIFogPSB3b3JsZCBYLiBOb3RoaW5nIGlzIGJha2VkIGludG8gdGhlIG1lc2gsIHNvIHRoZSBwbGFuZQpjYW4gYmUgcmUtd2lyZWQgYXQgYW55IHRpbWUuCgpBIHJlbWFyayBpcyBzdXJmYWNlZCB3aGVuIHRoZSBUQ1AgZG9lcyBub3Qgc2l0IHJvdWdobHkgb24gdGhlIHRvb2wncyArWiwKc2luY2UgdGhhdCBtZWFucyB0aGUgdG9vbCB3aWxsIHBvaW50IHNpZGV3YXlzIG9uY2UgYXR0YWNoZWQuCgpUaGUgcmVzdWx0IGlzIGEgc3RhdGljIChubyBqb2ludHMpIGBUb29sTW9kZWxgIHJlYWR5IHRvIGZlZWQgaW50byBhCmBMb2FkIFJvYm90IENlbGxgIGNvbXBvbmVudCdzIGB0b29sc2AgaW5wdXQuIEtpbmVtYXRpYyB0b29scyAod2l0aCB0aGVpcgpvd24gam9pbnRzKSBzaG91bGQgYmUgbG9hZGVkIGZyb20gVVJERiBpbnN0ZWFkLgoKQ09NUEFTIEZBQiB2Mi4wLjEgKGJ1aWx0IDIwMjYtMDgtMDMgMTU6MzAgVVRDKQoiIiIKCmZyb20gbWF0aCBpbXBvcnQgZGVncmVlcwoKaW1wb3J0IEdyYXNzaG9wcGVyCmltcG9ydCBSaGlubwppbXBvcnQgcmhpbm9zY3JpcHRzeW50YXggYXMgcnMKaW1wb3J0IFN5c3RlbQpmcm9tIGNvbXBhcy5nZW9tZXRyeSBpbXBvcnQgRnJhbWUKZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IFZlY3Rvcgpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgcmVtYXJrCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCB3YXJuaW5nIGFzIGdoX3dhcm5pbmcKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IG1lc2hfdG9fY29tcGFzCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKZnJvbSBjb21wYXNfcm9ib3RzIGltcG9ydCBUb29sTW9kZWwKCiMgQmV5b25kIHRoaXMgYW5nbGUgYmV0d2VlbiB0aGUgdG9vbCdzICtaIGFuZCBpdHMgVENQLCB0aGUgdG9vbCBpcyBjb25zaWRlcmVkCiMgdG8gYmUgcG9pbnRpbmcgc29tZXdoZXJlIG90aGVyIHRoYW4gYXdheSBmcm9tIHRoZSBmbGFuZ2UuCk1BWF9UQ1BfT0ZGX0FYSVNfQU5HTEUgPSAzMC4wCgoKZGVmIF9vZmZfYXhpc19yZW1hcmsodG9vbCk6CiAgICAiIiJUZXh0IGZvciB0aGUgbW91bnRpbmctYXhpcyByZW1hcmssIG9yIE5vbmUgd2hlbiB0aGUgdG9vbCBsb29rcyBmaW5lLgoKICAgIFRoZSBUQ1AgZGlyZWN0aW9uIGlzIG9ubHkgYSBoaW50OiBpdCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHJvbGwgb2YgdGhlIHRvb2wKICAgIGFuZCBpcyBtZWFuaW5nbGVzcyBmb3IgYSBUQ1Agc2l0dGluZyBvbiB0aGUgbW91bnQgaXRzZWxmLCBzbyBpdCBpcyByZXBvcnRlZAogICAgcmF0aGVyIHRoYW4gYXBwbGllZC4KICAgICIiIgogICAgdGNwX2RpcmVjdGlvbiA9IFZlY3RvcigqdG9vbC5mcmFtZS5wb2ludCkKICAgIGlmIHRjcF9kaXJlY3Rpb24ubGVuZ3RoIDwgMWUtNjoKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGFuZ2xlID0gZGVncmVlcyh0Y3BfZGlyZWN0aW9uLmFuZ2xlKFZlY3Rvci5aYXhpcygpKSkKICAgIGlmIGFuZ2xlIDwgTUFYX1RDUF9PRkZfQVhJU19BTkdMRToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIG1lc3NhZ2UgPSAoIlRDUCBzaXRzIHs6LjBmfSBkZWcgb2ZmIHRoZSB0b29sJ3MgK1ogYXhpcywgc28gdGhpcyB0b29sIHdpbGwgcG9pbnQgc2lkZXdheXMgb25jZSBhdHRhY2hlZDogdG9vbHMgbW91bnQgd2l0aCArWiBwb2ludGluZyBhd2F5IGZyb20gdGhlIGZsYW5nZS4gIikuZm9ybWF0KGFuZ2xlKQoKICAgIHVuaXRpemVkID0gdGNwX2RpcmVjdGlvbi51bml0aXplZCgpCiAgICBpZiBhYnModW5pdGl6ZWQueCkgPiAwLjk5OgogICAgICAgIG1lc3NhZ2UgKz0gIllvdXIgdG9vbCByZWFjaGVzIGFsb25nIFgsIHNvIHNldCBgYmFzZV9wbGFuZWAgdG8gYSBwbGFuZSB3aXRoIGl0cyBaIGF4aXMgYWxvbmcgd29ybGQgWCAob3JpZ2luLCB4PSgwLDEsMCksIHk9KDAsMCwxKSkuIgogICAgZWxpZiBhYnModW5pdGl6ZWQueSkgPiAwLjk5OgogICAgICAgIG1lc3NhZ2UgKz0gIllvdXIgdG9vbCByZWFjaGVzIGFsb25nIFksIHNvIHNldCBgYmFzZV9wbGFuZWAgdG8gYSBwbGFuZSB3aXRoIGl0cyBaIGF4aXMgYWxvbmcgd29ybGQgWSAob3JpZ2luLCB4PSgwLDAsMSksIHk9KDEsMCwwKSkuIgogICAgZWxzZToKICAgICAgICBtZXNzYWdlICs9ICJTZXQgYGJhc2VfcGxhbmVgIHRvIGEgcGxhbmUgd2hvc2UgWiBheGlzIHJ1bnMgYWxvbmcgeW91ciB0b29sLCB3aXRoIGl0cyBYIGF4aXMgcGlja2VkIHRvIGdpdmUgdGhlIHJvbGwgeW91IHdhbnQuIgogICAgcmV0dXJuIG1lc3NhZ2UKCgpjbGFzcyBUb29sRnJvbU1lc2goR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgbmFtZTogc3RyLAogICAgICAgICAgICB2aXN1YWxfbWVzaCwKICAgICAgICAgICAgY29sbGlzaW9uX21lc2gsCiAgICAgICAgICAgIHRjcF9wbGFuZSwKICAgICAgICAgICAgYmFzZV9wbGFuZSk6CiAgICAgICAgaWYgdmlzdWFsX21lc2ggaXMgTm9uZSBvciB0Y3BfcGxhbmUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZnJhbWUgPSB0Y3BfcGxhbmUgaWYgaXNpbnN0YW5jZSh0Y3BfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZSh0Y3BfcGxhbmUpCiAgICAgICAgYmFzZV9mcmFtZSA9IE5vbmUKICAgICAgICBpZiBiYXNlX3BsYW5lIGlzIG5vdCBOb25lOgogICAgICAgICAgICBiYXNlX2ZyYW1lID0gYmFzZV9wbGFuZSBpZiBpc2luc3RhbmNlKGJhc2VfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZShiYXNlX3BsYW5lKQogICAgICAgIGNfdmlzdWFsID0gbWVzaF90b19jb21wYXMocnMuY29lcmNlbWVzaCh2aXN1YWxfbWVzaCkpIGlmIHZpc3VhbF9tZXNoIGVsc2UgTm9uZQogICAgICAgIGNfY29sbGlzaW9uID0gbWVzaF90b19jb21wYXMocnMuY29lcmNlbWVzaChjb2xsaXNpb25fbWVzaCkpIGlmIGNvbGxpc2lvbl9tZXNoIGVsc2UgTm9uZQoKICAgICAgICBpZiBjb2xsaXNpb25fbWVzaCBpcyBOb25lOgogICAgICAgICAgICBnaF93YXJuaW5nKGdoZW52LkNvbXBvbmVudCwgIk5vIGNvbGxpc2lvbiBtZXNoIHByb3ZpZGVkOiB0aGUgdG9vbCB3aWxsIGJlIHZpc3VhbGl6ZWQgYnV0IGlnbm9yZWQgZm9yIGNvbGxpc2lvbiBjaGVja2luZy4iKSAgIyBub3FhOiBGODIxCgogICAgICAgICMgYGJhc2VfZnJhbWVgIGlzIG9ubHkgcGFzc2VkIHdoZW4gd2lyZWQsIHNvIGFuIG9sZGVyIGNvbXBhc19yb2JvdHMga2VlcHMKICAgICAgICAjIHdvcmtpbmcgZm9yIGRlZmluaXRpb25zIHRoYXQgZG9uJ3QgdXNlIGl0LgogICAgICAgIGt3YXJncyA9IHsiYmFzZV9mcmFtZSI6IGJhc2VfZnJhbWV9IGlmIGJhc2VfZnJhbWUgZWxzZSB7fQogICAgICAgIHRvb2wgPSBUb29sTW9kZWwoCiAgICAgICAgICAgIHZpc3VhbD1jX3Zpc3VhbCwKICAgICAgICAgICAgZnJhbWVfaW5fdG9vbDBfZnJhbWU9ZnJhbWUsCiAgICAgICAgICAgIGNvbGxpc2lvbj1jX2NvbGxpc2lvbiwKICAgICAgICAgICAgbmFtZT0obmFtZSBvciAiYXR0YWNoZWRfdG9vbCIpLnN0cmlwKCksCiAgICAgICAgICAgICoqa3dhcmdzLAogICAgICAgICkKCiAgICAgICAgbWVzc2FnZSA9IF9vZmZfYXhpc19yZW1hcmsodG9vbCkKICAgICAgICBpZiBtZXNzYWdlOgogICAgICAgICAgICByZW1hcmsoZ2hlbnYuQ29tcG9uZW50LCBtZXNzYWdlKSAgIyBub3FhOiBGODIxCgogICAgICAgIHJldHVybiB0b29sCg==
+ - COMPAS FAB: Tool From Mesh
+
+
+
+
+ - *.*.python
+ - 3.*
+
+
+
+
@@ -6169,7 +6199,7 @@
-
- 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
+ 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
diff --git a/docs/frontends/ghpython/files/05_kitchen_sink.ghx b/docs/frontends/ghpython/files/05_kitchen_sink.ghx
index b62a277c2..b19a088e8 100644
--- a/docs/frontends/ghpython/files/05_kitchen_sink.ghx
+++ b/docs/frontends/ghpython/files/05_kitchen_sink.ghx
@@ -21,9 +21,10 @@
-
+
- 17611819-bff5-48ff-80f8-ac42d6319de3
- Shaded
+ - Selection
- 1
-
100;150;0;0
@@ -49,10 +50,10 @@
-
- 133
- 234
+ 168
+ 177
- - 0.22059527
+ - 0.1745186
@@ -77,7 +78,7 @@
- Robert McNeel & Associates
- 00000000-0000-0000-0000-000000000000
- Grasshopper
- - 8.32.26160.13002
+ - 8.33.26188.13002
@@ -85,7 +86,7 @@
- Robert McNeel & Associates
- 00000000-0000-0000-0000-000000000000
- Grasshopper
- - 8.32.26160.13002
+ - 8.33.26188.13002
@@ -93,7 +94,7 @@
- Robert McNeel & Associates
- 00000000-0000-0000-0000-000000000000
- Grasshopper
- - 8.32.26160.13002
+ - 8.33.26188.13002
@@ -101,7 +102,7 @@
- Robert McNeel & Associates
- 00000000-0000-0000-0000-000000000000
- Grasshopper
- - 8.32.26160.13002
+ - 8.33.26188.13002
@@ -158,11 +159,11 @@
0.4937036997233545
0.056971871730282335
0.5034884601000649
- 1
- 0
+ 0.36964280868381477
+ -0.9291739309668243
0
- 0
- -1
+ -0.9291739309668243
+ -0.36964280868381477
0
@@ -308,7 +309,7 @@
- 100
- 0
- 0
- - 12
+ - 0
@@ -987,70 +988,6 @@
-
- - 4f8984c4-7c7a-4d69-b0a2-183cbb330d20
- - Plane
-
-
-
-
- - Contains a collection of three-dimensional axis-systems
- - c3986e21-f43e-45b1-99c4-13cd41951b9b
- - Plane
- - target plane (IK)
- - false
- - 0
-
-
-
-
- -
- 1991
- 969
- 50
- 24
-
- -
- 2016.6895
- 981.8627
-
-
-
-
-
- - 1
-
-
-
-
- - 1
- - {0}
-
-
-
-
- -
- 0.36353384210999135
- 0
- 0.354596250621197
- 1
- 0
- 0
- 0
- -1
- 0
-
-
-
-
-
-
-
-
-
-
-
-
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -1087,7 +1024,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -1124,14 +1061,14 @@
-
+
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
-
+
- 1
-
198;217;216;237
@@ -1193,7 +1130,8 @@
- 3e570305-eb5d-43c4-a5c6-9a5914fde9ed
- 00b4398a-522a-4426-bceb-c8b4eb2df50a
- d833948b-a8e4-440a-87e5-eb1fb8831e21
- - 56
+ - 03a3f0bd-ed2a-4964-bb43-3f73e45819ea
+ - 57
- 498dbb65-c5f7-4346-9421-b403afe1c0e1
- Group
- Inverse Kinematics to frame target
@@ -1204,7 +1142,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -1241,7 +1179,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -1277,7 +1215,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -1314,7 +1252,7 @@
-
+
- b6236720-8d88-4289-93c3-ac4c99f9b97b
- Relay
@@ -1350,7 +1288,7 @@
-
+
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
@@ -1438,7 +1376,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -1474,7 +1412,7 @@
-
+
- 59daf374-bc21-4a5e-8282-5504fb7ae9ae
- List Item
@@ -1667,7 +1605,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -1704,7 +1642,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -1741,7 +1679,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -1778,7 +1716,7 @@
-
+
- 719467e6-7cf5-4848-99b0-c5dd57e5442c
- Python 3 Script
@@ -2173,7 +2111,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -2218,7 +2156,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -2263,7 +2201,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -2308,7 +2246,7 @@
-
+
- 2e78987b-9dfb-42a2-8b76-3923ac8bd91a
- Boolean Toggle
@@ -2339,7 +2277,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -2384,7 +2322,7 @@
-
+
- 59daf374-bc21-4a5e-8282-5504fb7ae9ae
- List Item
@@ -2577,7 +2515,7 @@
-
+
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
@@ -2663,7 +2601,7 @@
-
+
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
@@ -2715,7 +2653,7 @@
-
+
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
@@ -2767,7 +2705,7 @@
-
+
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
@@ -2819,7 +2757,7 @@
-
+
- 3cadddef-1e2b-4c09-9390-0e8f78f7609f
- Merge
@@ -2977,7 +2915,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -3014,7 +2952,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -3050,7 +2988,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -3087,7 +3025,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -3124,7 +3062,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -3160,7 +3098,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -3197,7 +3135,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -3242,7 +3180,7 @@
-
+
- 59daf374-bc21-4a5e-8282-5504fb7ae9ae
- List Item
@@ -3435,7 +3373,7 @@
-
+
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
@@ -3514,7 +3452,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -3550,7 +3488,7 @@
-
+
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
@@ -3602,7 +3540,7 @@
-
+
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
@@ -3654,7 +3592,7 @@
-
+
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
@@ -3706,7 +3644,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -3743,7 +3681,7 @@
-
+
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
@@ -3860,7 +3798,7 @@
-
+
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
@@ -3882,7 +3820,7 @@
-
528
- 223
+ 241
50
20
@@ -3890,8 +3828,8 @@
- 0
- 0
-
- 528.39716
- 223.43997
+ 528.3352
+ 241.43997
@@ -3912,7 +3850,7 @@
-
+
- 1e936df3-0eea-4246-8549-514cb8862b7a
- Mesh
@@ -3956,7 +3894,7 @@
-
- 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
+ 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
- 6
- 00000000-0000-0000-0000-000000000000
@@ -3970,7 +3908,7 @@
-
+
- 17b7152b-d30d-4d50-b9ef-c9fe25576fc2
- XY Plane
@@ -4079,7 +4017,7 @@
-
+
- 00027467-0d24-4fa7-b178-8dc0ac5f42ec
- Value List
@@ -4136,7 +4074,7 @@
-
+
- 00027467-0d24-4fa7-b178-8dc0ac5f42ec
- Value List
@@ -4179,7 +4117,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -4215,14 +4153,14 @@
-
+
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
-
+
- 1
-
198;217;216;237
@@ -4254,7 +4192,8 @@
- 0855e543-9f77-4823-8f21-2b134bc4fca3
- 9c92c74a-5e86-436d-874f-a0030c6dab03
- 14762c92-f1ae-4fe4-98ab-802dc2b518e2
- - 26
+ - 731b0e88-d4e4-4632-bf0c-a84ce6be437d
+ - 27
- 1ca67453-7fdd-4978-814c-31ac691a83ba
- Group
- Prepare robot cell elements
@@ -4265,7 +4204,7 @@
-
+
- 59e0b89a-e487-49f8-bab8-b5bab16be14c
- Panel
@@ -4317,7 +4256,7 @@
-
+
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
@@ -4362,7 +4301,7 @@
-
+
- 00027467-0d24-4fa7-b178-8dc0ac5f42ec
- Value List
@@ -4419,7 +4358,7 @@
-
+
- 00027467-0d24-4fa7-b178-8dc0ac5f42ec
- Value List
@@ -4476,7 +4415,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -4513,7 +4452,7 @@
-
+
- 2e78987b-9dfb-42a2-8b76-3923ac8bd91a
- Boolean Toggle
@@ -4544,7 +4483,7 @@
-
+
- 2e78987b-9dfb-42a2-8b76-3923ac8bd91a
- Boolean Toggle
@@ -4575,7 +4514,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -4612,7 +4551,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -4649,7 +4588,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -4686,7 +4625,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -4723,7 +4662,7 @@
-
+
- 00027467-0d24-4fa7-b178-8dc0ac5f42ec
- Value List
@@ -4780,7 +4719,7 @@
-
+
- 8ec86459-bf01-4409-baee-174d0d2b13d0
- Data
@@ -4817,7 +4756,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Visualize Robot Cell
@@ -4830,7 +4769,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg==
- 3395d76e-3f13-4b26-ba34-d20894cd52cc
- true
@@ -5252,7 +5191,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Visualize Robot Cell
@@ -5265,7 +5204,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg==
- 879f838f-40fa-475b-a82f-c6514e3d7044
- true
@@ -5687,7 +5626,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Deconstruct Trajectory
@@ -5699,7 +5638,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvklEQVRIDb1VvU4CQRDeI1Y8gj9oAxz4CPoEVkShM6E10QQLE5WYGBODmtiY6FOAhpcwUUoT4Q4q8afTxoTSc7/xhuwee/EAcZvZmfnm+2bvZ0eICS9L5fc8Ly/9Uvf5danX62k5FWfax+NxLzE3cytzF5Zl1RjTJ5HkFcft7HNiHGunkydSpAwOEkDnkrw6DmmwVooUcJKYnygFAX/gEyed4Kn78jXsM+cGmi2HttmMzSGyeCfzidnYFLww8rBiZqrd1EX1us6uKKzlRH41Rz5z0glaTtvro+QGxChkAeTUYjWPzheztiZ0eLAnEM/YKUsTCHZkKkaMhVVRNIH6x6YjIIClCaDo6PiUEiBBMSwvVdyUZ5xqNQEkIKKSqmDeR8EwdkCAE8Paq84blWwmp7VSCNBXpEUNThgBQy9DBJDnH42xRgsCJgGg8fFpxJmCRoHfCIp3rijeuya+gZhRIApB4z3aKYwCaCMqwUDLgUCoQAA3sktfES6mytm55bjtH6KVdbIbW9sj+XY6Jcq7O3T9kIA/iZa5zYXOA2/JDuujyOf8p4GDyYMxp7U9huOPTJrLdJsy1ySGPnNPzH4DnVnW4pC0cHgAAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvElEQVRIDb1VvU4CQRDeI3a8AYqxAQ58BH0CK6LQmdCaaIKNCf4kxsQfEisTfQrQ8BImSmki3EEnSqeNofXcb7whu8dePEDcZnZmvvm+2fvZEWLGy1L5Pc8rSL/ce+2vDAYDLafiTPt4PO4lFxL3MndlWVadMUMSSX7uuN19Tkxj7UzqQoocgIME0Lkkr01DGqyVIkWcJOYnykHAH/jESSd46b19jfvMuYFW26FtLmtziCzeyWJyPjYHL4w8rJiZ6ncNUbttsCuKG3lRWM+Tz5x0grbT8YYouQExClkAObVYzaPz5ZytCR0fVQTiWTttaQLBjkzFiLGwKoomUP/ccgQEsDQBFJ2cVikBEhTD8lLFTXnGqVYTQAIiKqkK5n0UDGNHBDgxrr3p9qlkO5XQSiFAX5EWNThhBAy9DhFAnn80xhotCJgEgObHpxFnChoFfiMoPbii9Oia+EZiRoEoBM33aKcwCqCNqAQjLQcCoQIB3MQufUW4mM6ql5bjdn6I1jbJbu3sTuTbmbQ4rOzR9UMC/iRa5TaXuk+8JTuujyKf858GDiYPxpzW9hSOPzJpLtNtylyzGPrMPTP7DXFn1tne6IQrAAAAAElFTkSuQmCC
- 282367d0-3f19-41d2-8c3e-903cdb22e13b
- true
@@ -6003,7 +5942,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Visualize Robot Cell
@@ -6016,7 +5955,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg==
- 3e570305-eb5d-43c4-a5c6-9a5914fde9ed
- true
@@ -6438,7 +6377,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Deconstruct Trajectory
@@ -6450,7 +6389,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvklEQVRIDb1VvU4CQRDeI1Y8gj9oAxz4CPoEVkShM6E10QQLE5WYGBODmtiY6FOAhpcwUUoT4Q4q8afTxoTSc7/xhuwee/EAcZvZmfnm+2bvZ0eICS9L5fc8Ly/9Uvf5danX62k5FWfax+NxLzE3cytzF5Zl1RjTJ5HkFcft7HNiHGunkydSpAwOEkDnkrw6DmmwVooUcJKYnygFAX/gEyed4Kn78jXsM+cGmi2HttmMzSGyeCfzidnYFLww8rBiZqrd1EX1us6uKKzlRH41Rz5z0glaTtvro+QGxChkAeTUYjWPzheztiZ0eLAnEM/YKUsTCHZkKkaMhVVRNIH6x6YjIIClCaDo6PiUEiBBMSwvVdyUZ5xqNQEkIKKSqmDeR8EwdkCAE8Paq84blWwmp7VSCNBXpEUNThgBQy9DBJDnH42xRgsCJgGg8fFpxJmCRoHfCIp3rijeuya+gZhRIApB4z3aKYwCaCMqwUDLgUCoQAA3sktfES6mytm55bjtH6KVdbIbW9sj+XY6Jcq7O3T9kIA/iZa5zYXOA2/JDuujyOf8p4GDyYMxp7U9huOPTJrLdJsy1ySGPnNPzH4DnVnW4pC0cHgAAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvElEQVRIDb1VvU4CQRDeI3a8AYqxAQ58BH0CK6LQmdCaaIKNCf4kxsQfEisTfQrQ8BImSmki3EEnSqeNofXcb7whu8dePEDcZnZmvvm+2fvZEWLGy1L5Pc8rSL/ce+2vDAYDLafiTPt4PO4lFxL3MndlWVadMUMSSX7uuN19Tkxj7UzqQoocgIME0Lkkr01DGqyVIkWcJOYnykHAH/jESSd46b19jfvMuYFW26FtLmtziCzeyWJyPjYHL4w8rJiZ6ncNUbttsCuKG3lRWM+Tz5x0grbT8YYouQExClkAObVYzaPz5ZytCR0fVQTiWTttaQLBjkzFiLGwKoomUP/ccgQEsDQBFJ2cVikBEhTD8lLFTXnGqVYTQAIiKqkK5n0UDGNHBDgxrr3p9qlkO5XQSiFAX5EWNThhBAy9DhFAnn80xhotCJgEgObHpxFnChoFfiMoPbii9Oia+EZiRoEoBM33aKcwCqCNqAQjLQcCoQIB3MQufUW4mM6ql5bjdn6I1jbJbu3sTuTbmbQ4rOzR9UMC/iRa5TaXuk+8JTuujyKf858GDiYPxpzW9hSOPzJpLtNtylyzGPrMPTP7DXFn1tne6IQrAAAAAElFTkSuQmCC
- ca756bd4-082c-4396-bc07-2044a7451bd3
- true
@@ -6754,7 +6693,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Visualize Robot Cell
@@ -6767,7 +6706,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VCx5BQSUpZCUlQ2egKmC8hQgdaUICSEhYK0ET0FBnXgDNsRIA10ooL5CNsJ9Jo7uDqdpWmrp6jv/fD7bzVmpOZNn4idJ0tTn1vDjayuOY0tn2kl73/eT6srSo9Z1PM/rsk0GosEvotdBmxWz8GC9dqmDHANjAT+4OcBvBiN1rZdJh7VFdaCXRLn2SrU15jMyqaSOLXAXXAItkhkYhEkleh9+fqPm4cMT+fd3NotwRL3pj56sVpcrlEHZhorojpAxqQeOTjy+9CN1e9dTG/VA1cPfJRo6QisAGirR2fmVQgAQ8/29hmruNixzyZ960I/eEsvSOHTve3RziE5PjigAMgEhE8jyKAzWPCsDyZDBoEMmAGXibPgscf6bSjpLhpKAAMp7yyDnMHEAs97mPgc3ExcG4JKgF0woFYh1LJd4YZPhZDaaQQCOUo0L8qfJeFtA7tvDJUHDxwFL/lYG5qfONy3DXX9kUNiDMgEkWwqAh0lSziJjTPrQMIn0PNhmQE4V57LzgDHS6aa4RB0GY4NpufEeESY1GWDzGplZgDTIvw/9aSsxsd8P9Yi8NKAab6MAAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII=
- 59be7153-6043-422c-9ddf-fbb55010bd2a
- true
@@ -7189,7 +7128,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Visualize Robot Cell
@@ -7201,7 +7140,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg==
- 2e1e8ed9-3cc8-4018-a772-130af7b9c80f
- true
@@ -7218,7 +7157,7 @@
-
+
-
3278
2538
@@ -7229,7 +7168,6 @@
3365
2590
- - true
@@ -7265,7 +7203,7 @@
-
+
-
3280
2540
@@ -7276,7 +7214,6 @@
3316.5
2550
- - true
@@ -7305,7 +7242,7 @@
-
+
-
3280
2560
@@ -7316,7 +7253,6 @@
3316.5
2570
- - true
@@ -7344,7 +7280,7 @@
-
+
-
3280
2580
@@ -7355,7 +7291,6 @@
3316.5
2590
- - true
@@ -7383,7 +7318,7 @@
-
+
-
3280
2600
@@ -7394,7 +7329,6 @@
3316.5
2610
- - true
@@ -7422,7 +7356,7 @@
-
+
-
3280
2620
@@ -7433,7 +7367,6 @@
3316.5
2630
- - true
@@ -7461,7 +7394,7 @@
-
+
-
3380
2540
@@ -7472,7 +7405,6 @@
3429.5
2552.5
- - true
@@ -7500,7 +7432,7 @@
-
+
-
3380
2565
@@ -7511,7 +7443,6 @@
3429.5
2577.5
- - true
@@ -7539,7 +7470,7 @@
-
+
-
3380
2590
@@ -7550,7 +7481,6 @@
3429.5
2602.5
- - true
@@ -7578,7 +7508,7 @@
-
+
-
3380
2615
@@ -7589,7 +7519,6 @@
3429.5
2627.5
- - true
@@ -7633,7 +7562,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Trajectory Action
@@ -7645,7 +7574,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACHUlEQVRIDbWVzy8DQRTHXxuJpBd6wfpRNClF4nfigItI0zgIWhLxLxBnjg6cuYtEIhJKG5FGXOnFHUXiR/3oxblurfm+diZrbWWbrpfs7sy8N5/vvLc7O0T/bA49P5fLhUV/OfX6PpzJZH749HFmbZfLlfM0NSSEb9PhcERkjIII+Hry7mFFOsp5+tt9G0JkFQwWwMoF/LAcqHGuEJlFJs6CY9kYYEOfmZzBS+otK2v+/JKix8cnElmVpCFWS15vK7U0e3ge3kmzp9FZgZ6EH0VP6CByXBLYGDwXnqHQ9KRisgCCsHLANa2OJoIBcjpl9YwI8342m6X42TkzBvp7VSZKAGWBAR4YHzOnGEbXrq7J7XbTkq9eebZ3drnEslRKQNbc6sq3onHar6wh+vyisZpq6qpyqawlC6pKQC3B0Igcx+j6JkldnX4Kz0yxF2OJoxjVdg9Rb083ww3TVPdPAYAOBQh2c5vkdr2m0Uc6zWOLPo3CwWFuF7sVfZN6+GxoinDBJBx9mVExOMZNM9jbP6CT0zjP04MAhA9mBY44UwE4YIMDfb9AC/NzeafFuxLAToThewakVJCci6dkoa0EsM1h2Cwwq58rB4ub3GjoSxbavOzb5D3/eOz8VQDe4W/L1+U/f3acgdh5F+I8GIGqXSbOg0vxLkblPti0C6zjMJMFhFIEx5zOWVazcGTyuZz/Ngs4USrbD/2yVmpl8jdy39R+b7UCBQAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACHUlEQVRIDbWVu0sDQRDGJ0EQTKFpohffQjQa8A0WaiMiYiHRJIL4LyjWWlporb0IgggaH4gEsVUbezUq+DZpbINd4n6T7HKeF7mQy8Dd7e7M/r6dudtbohKbQ8/PZDJh0V98/0gMplKpXz59nFnb5XJl6uu8V8K37nA4ojJGQQR8NX7/uCQdxTz9bb41IbIMBgtg5QK+XwzUOFeIRJCJM+dYNAbY0GcmZ/D2/pmWNX95faOnp2cSWRWkIVZLLS3N1NTYwPPwThrqa51l6En4wdEJ7UUPCwIbg2fC0xSamlRMFkAQVg64ptXQxPgYOZ2yekaEeT+dTlPs7JwZfb3dKhMlgLLAAB8bHTGnGEZXrm/I7XbTgs+rPJtb21xiWSolIGtudeUbRzHaLfcQfX3TiKeKApUVKmvJgqoSUEswNKKHx3RzG6dAh5/C00H2Yuzq4JiqOweou6uT4YZpqvuvAED7AgS7vYtz26tplEgmeWzep1F4fJDb+W5536QeHgkFCRdMwtGXGeWDY9w0g53dPTo5jfE8PQhA+GBW4IgzFYAD1t/X8wc0NzuTdVq8KwHsRBi+Z0AKBcm5eEoW2koA2xyGzQKz+rlysLjJjYa+ZKHNy76LP/CPx85fBeDt/tZsXUr5s+MMxM67EOfBEFTtMnEeXIp3MSz3wbpdYB2HmSwglKI45nTOopq5I5PP5ey3mcOJUtl+6Be1UiuTfwBLc9R4U4cQPwAAAABJRU5ErkJggg==
- 9e8af65d-2825-4065-bd44-35ba37b85d94
- true
@@ -7911,7 +7840,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Trajectory Action
@@ -7923,7 +7852,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACHUlEQVRIDbWVzy8DQRTHXxuJpBd6wfpRNClF4nfigItI0zgIWhLxLxBnjg6cuYtEIhJKG5FGXOnFHUXiR/3oxblurfm+diZrbWWbrpfs7sy8N5/vvLc7O0T/bA49P5fLhUV/OfX6PpzJZH749HFmbZfLlfM0NSSEb9PhcERkjIII+Hry7mFFOsp5+tt9G0JkFQwWwMoF/LAcqHGuEJlFJs6CY9kYYEOfmZzBS+otK2v+/JKix8cnElmVpCFWS15vK7U0e3ge3kmzp9FZgZ6EH0VP6CByXBLYGDwXnqHQ9KRisgCCsHLANa2OJoIBcjpl9YwI8342m6X42TkzBvp7VSZKAGWBAR4YHzOnGEbXrq7J7XbTkq9eebZ3drnEslRKQNbc6sq3onHar6wh+vyisZpq6qpyqawlC6pKQC3B0Igcx+j6JkldnX4Kz0yxF2OJoxjVdg9Rb083ww3TVPdPAYAOBQh2c5vkdr2m0Uc6zWOLPo3CwWFuF7sVfZN6+GxoinDBJBx9mVExOMZNM9jbP6CT0zjP04MAhA9mBY44UwE4YIMDfb9AC/NzeafFuxLAToThewakVJCci6dkoa0EsM1h2Cwwq58rB4ub3GjoSxbavOzb5D3/eOz8VQDe4W/L1+U/f3acgdh5F+I8GIGqXSbOg0vxLkblPti0C6zjMJMFhFIEx5zOWVazcGTyuZz/Ngs4USrbD/2yVmpl8jdy39R+b7UCBQAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACHUlEQVRIDbWVu0sDQRDGJ0EQTKFpohffQjQa8A0WaiMiYiHRJIL4LyjWWlporb0IgggaH4gEsVUbezUq+DZpbINd4n6T7HKeF7mQy8Dd7e7M/r6dudtbohKbQ8/PZDJh0V98/0gMplKpXz59nFnb5XJl6uu8V8K37nA4ojJGQQR8NX7/uCQdxTz9bb41IbIMBgtg5QK+XwzUOFeIRJCJM+dYNAbY0GcmZ/D2/pmWNX95faOnp2cSWRWkIVZLLS3N1NTYwPPwThrqa51l6En4wdEJ7UUPCwIbg2fC0xSamlRMFkAQVg64ptXQxPgYOZ2yekaEeT+dTlPs7JwZfb3dKhMlgLLAAB8bHTGnGEZXrm/I7XbTgs+rPJtb21xiWSolIGtudeUbRzHaLfcQfX3TiKeKApUVKmvJgqoSUEswNKKHx3RzG6dAh5/C00H2Yuzq4JiqOweou6uT4YZpqvuvAED7AgS7vYtz26tplEgmeWzep1F4fJDb+W5536QeHgkFCRdMwtGXGeWDY9w0g53dPTo5jfE8PQhA+GBW4IgzFYAD1t/X8wc0NzuTdVq8KwHsRBi+Z0AKBcm5eEoW2koA2xyGzQKz+rlysLjJjYa+ZKHNy76LP/CPx85fBeDt/tZsXUr5s+MMxM67EOfBEFTtMnEeXIp3MSz3wbpdYB2HmSwglKI45nTOopq5I5PP5ey3mcOJUtl+6Be1UiuTfwBLc9R4U4cQPwAAAABJRU5ErkJggg==
- b479ed8a-fea5-463f-8a86-5870ac4ac61e
- true
@@ -8189,7 +8118,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Action Chain
@@ -8201,7 +8130,7 @@
- true
- 2
-
- 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
+ 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
- 8ba50487-6869-4a3d-837f-9901d0919a25
- true
@@ -8743,7 +8672,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Visualize Robot Cell
@@ -8756,7 +8685,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg==
- 3b93c86c-12a5-40e1-9966-bb3ebf00d929
- true
@@ -9178,7 +9107,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Robot Configuration
@@ -9190,7 +9119,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAAB3UlEQVRIDWNgoDFgRDb/////UUB+5qPHT62/ffuGIoesDhubi4vrv5ys9FGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYBw8fPfmHK8wX3X8JtitOUZwkO0FxIi8nw8QC0gUz/NLlKwyvX7+BGzT9FwfD1X9gJQybbt5nyGT7AZfDxRAVFWHQ09WBmwnRDVU9beYchvfvP8D1Xo3OQbCBFs2auwDOx8UQFBRgmDFlAlwaxYKs9BQ0H/yB+0Cb6Q9DWnICXCMuBsgHyADFApDXkIEzkENuHMDMQbEAJohMo0fu+idvGBquPAQradCRZwiUQXUxsl4QG5yKrt+49R/Eae/qZXj46DGIiRMc9ohi+McESd1M//4x2O6AZ1qwHnk5WYbKMkh+1dRQY4TlA5wGUiqB4gNiDCMliEA+IBgHMEuRI5tQuMP0gGgUC9AzGkwhKRkOltFgelEsQM9oMEWkZDiSMhrMgum/iM9w6BmNYGEHswQ5DmBi+GhYYQe2AFgfHAbWBzb4NJAqB6wPjgDrA1tYPphOqgFEqAebCbYAVPOAqjkiNBGlBFplgrM4OIhgumhR6cPMphkNACYhwys18M2RAAAAAElFTkSuQmCC
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAAB3UlEQVRIDWNgoDFgRDb/////UUB+5uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYB48eP/2HK8wX3X8JtitOUZwkO0FxIicrzcQC0gUz/NLlKwyvX7+BGzT9FwfD1X9gJQybbt5nyGT7AZfDxRAVFWHQ09WBmwnRDVU9beYchvfvP8D1Xo3OQbCBFs2auwDOx8UQFBRgmDFlAlwaxYKs9BQ0H/yB+0Cb6Q9DWnICXCMuBsgHyADFApDXkIEzkENuHMDMQbEAJohMo0fu+idvGBquPAQradCRZwiUQXUxsl4QG5yKrt+49R/Eae/qZXj46DGIiRMc9ohi+McESd1M//4x2O6AZ1qwHnk5WYbKMkh+1dRQY4TlA5wGUiqB4gNiDCMliEA+IBgHMEuRI5tQuMP0gGgUC9AzGkwhKRkOltFgelEsQM9oMEWkZDiSMhrMgum/iM9w6BmNYGEHswQ5DmBi+GhYYQe2AFgfHAbWBzb4NJAqB6wPjgDrA1tYPphOqgFEqAebCbYAVPOAqjkiNBGlBFplgrM4OIhgumhR6cPMphkNAP6mwyUXpxX+AAAAAElFTkSuQmCC
- 086f7395-0fe4-4910-b486-d371d72a525f
- true
@@ -9281,12 +9210,12 @@
- 1
- 2
- true
- - bdce4754-a6b0-47dc-ba0c-8fef4b701886
- - 1f5db91c-2547-4781-939e-e813733713e9
- - f3e86788-4a7f-40b7-a645-f63aa093cd29
- - bceb6ccc-7107-4426-adca-c7aac74a5c46
- - b23ab536-0229-4863-88bd-2042b8311bb5
- - bef9677b-8a97-4c70-8d77-7a840d3a73fb
+ - 32aa6709-f6d9-4157-b5ec-2fb5aace4072
+ - fbadd3c0-df5f-400f-9243-96f261d44776
+ - 2cc39827-4ec2-4307-995b-f62969026b73
+ - c1c866e6-fe5c-40c7-8145-028dcead736d
+ - 5a2a0bf4-4661-4a9a-8313-f67db0550f4b
+ - c395212b-f5d4-4312-b650-266e1bc7734f
- 6
- Joint values in canonical joint order. Auto-populated by the per-joint sliders the component creates; wire your own values to override.
- 9d51e32e-c038-4352-9554-f4137ca91b9a
@@ -9423,7 +9352,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Rigid Body From Library
@@ -9435,7 +9364,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACEUlEQVRIDdVVyytEYRQ/d3A1M81kyMZ4bRhrjHeS7CQSJX+BhZIlfwBLKTZKsfGIRLIkCQskO49ZeEuUxzCGqOs7H+d279zvoysWTs2c853fOb/fd7/7OAB/bIqRX9O0JrbuOD27KI9EIibMWCeK3W63lpGetsawfkVRpqlGJ2HkPXv7oS4C0G9ubUM4HDam9NjlckFpSZG+NgZ5gZxeJtKNuXj8w53Hko9NTMHc/ALCUjs8OobWlmYLjlyMcxuvhAuwio7YqpXVNfD5kqCpsSEW4uvpmVnAGpHAZwNyfgjgmQtZWLKmukoIocBXRpwOLLJ7Q78iJow4uQAl/8L/fwF6iqSns7i0DJoU/R6QClRWlPP3YGh4RMpSX1crxQiQCuDznZ2VCdFolGpN3uv1QrAw35QTLaQCWFxWWizqsZUTCgyGLmyRYHEwxQNFyR5Ln0Vg4+YBBn4g0A5p3wvshp9g5/aR7yLX44SDh4/z7wz4LTujxOXzK4wfX9HS4k1X0LYVgivWgEbkGPftn6MTmk81UVhqOIrDgr4dqYkJoDoccB59Ab8zkZ+t36maGmmITJ5cg8IWoyUBy/EgJzZxAZxE7BteQSx3r288RL9+fU9p3ce+eKKb+zndgL5F/dhd4PMA7k5l21IdCrjjCNa5eYA19MMeiXFOrOMmGpmE2fXGkakLIAmOTuZ+dejb3Zzt+ne5RKuqd5c7kwAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACEklEQVRIDdVVyytEYRQ/d3A1Y2YyZMEIG8ba+5UkO4lEyV9goWTJH8BSio1SbDwikSxJwgLJzmMWHhlEeYzJEHV95+Pc7p37fXTFwqmZc77zO+f3++53Hwfgj00x8mua1sLWXeehy8pIJGLCjHWi2O12a5n+9A2GDSqKMks1Ogkj7zs4DPYQgH57ZxfC4bAxpcculwvKy0r0tTHID+T2M5FezMXjH+48lnxiagYWFpcQltrxySm0t7VacORinLt4JVyAVXTFVq2tb4DPlwwtzU2xEF/Pzs0D1ogEPhuQ80MAz1zIwpJ1tTVCCAW+MuJ0YJHdG/oVMWHEyQUo+Rf+/wvQUyQ9neWVVdCk6PeAVKC6qpK/ByOjY1KWxoZ6KUaAVACf75zsLIhGo1Rr8l6vF4qLCkw50UIqgMUV5aWiHls5ocBw8MIWCRYXp3qgJMVj6bMIbN0+wtAPBDoh43uB/fAT7N1F+C7yPE44evw4/+6A37IzSlw9v8Lk6TUtLd50BR07QbhmDWhEjvHAYQid0HyqicJSw1EcFvTtSEtMANXhgFD0BfzORH62fqdqaqQhMn12AwpbjJcFLMeDnNjEBXASsW94FbHcv77xEP3mzQOldR/74olu7ud0A/oWDWJ3oc8DuDuVbUt1KJAUR7DOzQOsoR/2SIxzYh030cgkzK43jkxdAElwdDL3q0Pf7uZs178Dt0yrp/1lc7YAAAAASUVORK5CYII=
- 9c92c74a-5e86-436d-874f-a0030c6dab03
- true
@@ -9455,13 +9384,13 @@
-
675
- 219
+ 239
159
64
-
760
- 251
+ 271
@@ -9497,13 +9426,13 @@
-
677
- 221
+ 241
68
20
-
712.5
- 231
+ 251
@@ -9535,13 +9464,13 @@
-
677
- 241
+ 261
68
20
-
712.5
- 251
+ 271
@@ -9573,13 +9502,13 @@
-
677
- 261
+ 281
68
20
-
712.5
- 271
+ 291
@@ -9611,13 +9540,13 @@
-
775
- 221
+ 241
57
30
-
803.5
- 236
+ 256
@@ -9649,13 +9578,13 @@
-
775
- 251
+ 271
57
30
-
803.5
- 266
+ 286
@@ -9700,10 +9629,10 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- - COMPAS FAB: Tool From Mesh
+ - COMPAS FAB: Frame Waypoints
@@ -9712,294 +9641,14 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVPUsDQRDdi4LFgQgRBTWSQjFa2xnB/APRpPUnmFZFEEHUSsg/sLGQRPE/qJ21RrQyfpRWB9p47hszx7q3e3dJLltkZ2fevDezy2WE6PNyVH7f98vyXG29vi95nvcvpuJMtuu6fm5q4lbGao7jNBgTkEjyw+bj0zYHetkLc7NHUmQHHCSAyiV5vRdSPVeKVNBJph2o6oAUzsRJHby03n46vfO4AvAm07nJzCCAOvn+wbG4f2jGcQTxvd0tsTBfCM4wmJOvKAiCuBPyINFihARQiV4NclFlZX01RAOfCc/AkAACJiJcW/3iivMS70YBtQtTdexDIeW1cFequlEAALWL87NTuGjB5jeKI0eCVYC70B+9cfl3TWoBpGz5sQoAzyTq3bOdpHpwRAqoXQDMi4X5HLVHCiDRRJa0euTTlwzDttAFRE4+PDHw/SU281kb1OiPFUBWtrgiPu+eiWB0ccZIZHPSFeGPyQaAvzQ2Ijby46I0PER2FJZjzMnz4FrOgyIH09jlPLiR82CZH7mWBqnGQZwkgMmDMacBuj62RybN5WAmg60fQ7/rKpMm/gLhhokzxSFCzgAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABxklEQVRIDbVVPUsDQRDdE7v7AYGoZfCMWFrZ+gP8SLCw8QcIaVUEEcSPUtBekRSSKPkDgo1N7DUhIIgSsNDCePW5b3Kzbo69I3s5By43m5l7b+bNwgjxz+bo+EEQlOS58vbeXfB9fyCm55l813WDqcn8g4ydOo5T5xwFIsEPW+3ONgdGeXvThSNJsgOMMfyg8rTgza+eOO90AaMMWKEafQIZqaiopfP42RNnEYIQgjCpA2huiavS0YFu+wfH4um5JRiTCGwHqgOyD9C19Q0Ch8+Y45wwzBsfFmc8Y+rJtyNeFpcp9jE3r3KoA3VKcACO9uu3DZWF/17v7+jclLP4yU3QoxKkY9WB/iH82k1D5CTJZiEvSitL0TCdUxHwICHX3u5WrGxgsCZA1WyzRS8RHHnGGUBnVKkb9I4ayPSZROM4GzvQq0QSSwK/vPqnNSSKu1XIhRkJ+iFBdxo+X0/obWuJBKh8mEEmkRpnoH/A9z86Ez0nyR/oAAOD/iZdcWPSGBFgWVxeVR0eLgZpIrEhACbySaJwExHodfViZHAAMyZttHDh1BDIyuRWK2N1UgdwsOYyBMfKpL2sdjLAwzWX6dLPquhYnF+Vrbqn8SLkqgAAAABJRU5ErkJggg==
- - 14762c92-f1ae-4fe4-98ab-802dc2b518e2
+ - 7f6fe63e-ecc6-4baf-a39e-b57f06f02f22
- true
- false
- true
- - COMPAS FAB: Tool From Mesh
- - COMPAS FAB: Tool From Mesh
- - 3
-
- - false
- - false
- - false
- - false
-
-
-
-
- -
- 673
- 116
- 167
- 84
-
- -
- 764
- 158
-
-
-
-
-
- - 4
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
- - 1
- - 08908df5-fa14-4982-9ab2-1aa0927566aa
-
-
-
-
- - true
- - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`.
- - da2ca3e1-ada7-4121-93b6-7b421382aab4
- - name
- - name
- - true
- - 0
- - 2
- - true
- - b1d6bdbb-bbbc-482e-9851-581e5580f4a9
- - 1
- - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`.
- - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
-
-
-
-
- -
- 675
- 118
- 74
- 20
-
- -
- 713.5
- 128
-
-
-
-
-
- - System.Private.CoreLib
- - System.String
-
-
-
-
-
-
- - true
- - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided).
- - f2ed7ea7-33d7-441d-8089-38c02ce07c76
- - visual_mesh
- - visual_mesh
- - true
- - 0
- - 2
- - true
- - de7ea5f7-f04b-48c8-80ca-659046e21818
- - 1
- - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided).
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
-
-
-
- -
- 675
- 138
- 74
- 20
-
- -
- 713.5
- 148
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
-
- - true
- - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`.
- - 845901a6-5ddb-4f5f-9663-353bb0d7d2b1
- - collision_mesh
- - collision_mesh
- - true
- - 0
- - 2
- - true
- - de7ea5f7-f04b-48c8-80ca-659046e21818
- - 1
- - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
-
-
-
- -
- 675
- 158
- 74
- 20
-
- -
- 713.5
- 168
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
-
- - true
- - Tool Coordinate Frame in the robot's `tool0` link frame, as a Rhino Plane or COMPAS Frame.
- - 10f1a94a-a2c7-4f77-a6f5-0047b6ca053a
- - tcp_plane
- - tcp_plane
- - true
- - 0
- - 2
- - true
- - 3e07e26f-7364-466c-bf58-2608d206128a
- - 1
- - Tool Coordinate Frame in the robot's `tool0` link frame, as a Rhino Plane or COMPAS Frame.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
-
-
-
- -
- 675
- 178
- 74
- 20
-
- -
- 713.5
- 188
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
-
- - false
- - ToolModel.
- - 6f0b279a-83bc-49d8-b291-d9861d788592
- - tool_model
- - tool_model
- - false
- - 0
- - 2
- - true
- - 0
- - ToolModel.
- - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
-
-
-
-
- -
- 779
- 118
- 59
- 80
-
- -
- 808.5
- 158
-
-
-
-
-
- - System.Private.CoreLib
- - System.Object
-
-
-
-
-
-
-
-
- - true
- - false
- - true
- - IyByOiBjb21wYXNfZmFiPj0yCiIiIgpDb25zdHJ1Y3QgYSBUb29sTW9kZWwgZnJvbSBhIFJoaW5vIG1lc2ggYW5kIGEgVENQIHBsYW5lLgoKYHRjcF9wbGFuZWAgbWF5IGJlIGEgUmhpbm8gUGxhbmUgb3IgYSBjb21wYXMgRnJhbWU7IGl0IGlzIHRoZSBUb29sCkNvb3JkaW5hdGUgRnJhbWUgZXhwcmVzc2VkIGluIHRoZSByb2JvdCdzIGB0b29sMGAgbGluayBmcmFtZS4gSWYKYGNvbGxpc2lvbl9tZXNoYCBpcyB1bndpcmVkLCBgdmlzdWFsX21lc2hgIGlzIHJldXNlZCBmb3IgY29sbGlzaW9uCmNoZWNrcy4KClRoZSByZXN1bHQgaXMgYSBzdGF0aWMgKG5vIGpvaW50cykgYFRvb2xNb2RlbGAgcmVhZHkgdG8gZmVlZCBpbnRvIGEKYExvYWQgUm9ib3QgQ2VsbGAgY29tcG9uZW50J3MgYHRvb2xzYCBpbnB1dC4gS2luZW1hdGljIHRvb2xzICh3aXRoIHRoZWlyCm93biBqb2ludHMpIHNob3VsZCBiZSBsb2FkZWQgZnJvbSBVUkRGIGluc3RlYWQuCgpDT01QQVMgRkFCIHYyLjAuMAoiIiIKCmltcG9ydCBHcmFzc2hvcHBlcgppbXBvcnQgUmhpbm8KaW1wb3J0IHJoaW5vc2NyaXB0c3ludGF4IGFzIHJzCmltcG9ydCBTeXN0ZW0KZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IEZyYW1lCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCB3YXJuaW5nIGFzIGdoX3dhcm5pbmcKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IG1lc2hfdG9fY29tcGFzCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKZnJvbSBjb21wYXNfcm9ib3RzIGltcG9ydCBUb29sTW9kZWwKCgpjbGFzcyBUb29sRnJvbU1lc2goR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwgbmFtZTogc3RyLCB2aXN1YWxfbWVzaCwgY29sbGlzaW9uX21lc2gsIHRjcF9wbGFuZSk6CiAgICAgICAgaWYgdmlzdWFsX21lc2ggaXMgTm9uZSBvciB0Y3BfcGxhbmUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZnJhbWUgPSB0Y3BfcGxhbmUgaWYgaXNpbnN0YW5jZSh0Y3BfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZSh0Y3BfcGxhbmUpCiAgICAgICAgY192aXN1YWwgPSBtZXNoX3RvX2NvbXBhcyhycy5jb2VyY2VtZXNoKHZpc3VhbF9tZXNoKSkgaWYgdmlzdWFsX21lc2ggZWxzZSBOb25lCiAgICAgICAgY19jb2xsaXNpb24gPSBtZXNoX3RvX2NvbXBhcyhycy5jb2VyY2VtZXNoKGNvbGxpc2lvbl9tZXNoKSkgaWYgY29sbGlzaW9uX21lc2ggZWxzZSBOb25lCgogICAgICAgIGlmIGNvbGxpc2lvbl9tZXNoIGlzIE5vbmU6CiAgICAgICAgICAgIGdoX3dhcm5pbmcoZ2hlbnYuQ29tcG9uZW50LCAiTm8gY29sbGlzaW9uIG1lc2ggcHJvdmlkZWQ6IHRoZSB0b29sIHdpbGwgYmUgdmlzdWFsaXplZCBidXQgaWdub3JlZCBmb3IgY29sbGlzaW9uIGNoZWNraW5nLiIpICAjIG5vcWE6IEY4MjEKCiAgICAgICAgcmV0dXJuIFRvb2xNb2RlbCgKICAgICAgICAgICAgdmlzdWFsPWNfdmlzdWFsLAogICAgICAgICAgICBmcmFtZV9pbl90b29sMF9mcmFtZT1mcmFtZSwKICAgICAgICAgICAgY29sbGlzaW9uPWNfY29sbGlzaW9uLAogICAgICAgICAgICBuYW1lPShuYW1lIG9yICJhdHRhY2hlZF90b29sIikuc3RyaXAoKSwKICAgICAgICApCg==
- - COMPAS FAB: Tool From Mesh
-
-
-
-
- - *.*.python
- - 3.*
-
-
-
-
-
-
- -
- 368
- 149
- 550
- 700
-
-
-
-
-
-
-
-
-
- - c9b2d725-6f87-4b07-af90-bd9aefef68eb
- - COMPAS FAB: Frame Waypoints
-
-
-
-
-
- - true
- - 2
- -
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABx0lEQVRIDbVVPUsDQRDdE6v7AwGDdsEzYmll6w/wI8HCxh8gpFURRBA/SkF7ERUkUfIHBBub2GtCQFBRsNDCyLXnvsnNujn2juzlHLjcbGbuvZk3CyPEP5uj4wdBUJLnysvr24zv+z0xPc/ku64bjI3m72Ts0HGcGucoEAm+22y11zkwyNsbL+xJkg1gDOEHlacFb3x1xHH7HTDKgBWq0SWQkYqKWjr3nx1xFCEIIQiTOoDmlrgqHR3otr2zLx4em4IxicB2oDog+wBdWl4hcPiMOcwJ/bzxYXHCM6YefDviaXaeYh9T0yqHOlCnBAfgaL92XVdZ+O/59obODTmLn1yeHpUgHasO9A/hV6/qIidJVgsjorQwFw3TORUBDxJybW2uxcoGBmsCVM02WfQSwZFnnAF0RpW6Qe+ogUyfSTSOs7EDvUoksSTwy4t/WkOiuFuFXJiRoBsSdKfh8/WE3raWSIDK+xlkEqlxBvoHfP+jM9FzkvyeDjAw6G/SFTcmjREBlsXp2YXDw8UgTSQ2BMBEPkkUbiICvTw/GRgcwIxJGy1cOFUEsjK51cpYndQBHKy5DMGxMmkvq50M8HDNZbr0syo6FucXl6W6qmWOrGsAAAAASUVORK5CYII=
-
- - 7f6fe63e-ecc6-4baf-a39e-b57f06f02f22
- - true
- - false
- - true
- - COMPAS FAB: Frame Waypoints
- - Frame Waypoints
+ - COMPAS FAB: Frame Waypoints
+ - Frame Waypoints
- 3
- false
@@ -10298,7 +9947,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Frame Target
@@ -10310,7 +9959,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDWNgoDFgRDb/////IUB+/uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB48eP/1HapgTcgAoTuRkpZnAPiBk+Jp1GxhAmBQAM5OFGE2r10IMDwkKIEY5ihpYHKAIUpNDcwuICqK/bBxkewqciq7fuPUfmwn7X31gmHLrGcO1T9/A0lp8XAw5alIMjmIC2JRjiGlqqDHiDCKQ4Vln7oAN53nxhAGEQRaBxEByxAKcFoBcDgJTjFUYZE7sZZA9thvMBotB5cAKCBBY4+Dj7z9g11qK8DHo8nMz3AiIBxszpbaWgcfCmeEagwxDSGIGA/OvH3DjQ4MDGLAlY5w+gOn8+x8RPYz//8GEiaax+oCflYUBFKHH33wC++Sgkz7D5h27GNYIiTN8kZBhUGJjYlgzfwZRluD0ASi1gEDO2TsMFZfuMxyVUmV4YO8FFvu3ezPDtes3wGxCBNgHoIIJVnbANICS4jQTFXAyBfkEBEC+MnzziOEvLzuDlqYGTClWGmQmSAJWHxwG1gc2WFUCBUGRDgKgoCMWAOuDI8D6wBYWRBPxaQQZTIrhULPAZoItANU8oGoOnyWkyEGrTHC9DA4imGZaVPows2lGAwBpPLdAuMVd1AAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDWNgoDFgRDb/////IUB+/pOnz62/fPmCIoesDhubh4fnv4y05FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB4+fPPtHapgTcgAoTmRlpJjAPiBk+Jp1GxhAmBQAM5OFGE2r10IMDwkKIEY5ihpYHKAIUpNDcwuICqK/bBxkewqciq7fuPUfmwn7X31gmHLrGcO1T9/A0lp8XAw5alIMjmIC2JRjiGlqqDHiDCKQ4Vln7oAN53nxhAGEQRaBxEByxAKcFoBcDgJTjFUYZE7sZZA9thvMBotB5cAKCBBY4+Dj7z9g11qK8DHo8nMz3AiIBxszpbaWgcfCmeEagwxDSGIGA/OvH3DjQ4MDGLAlY5w+gOn8+x8RPYz//8GEiaax+oCflYUBFKHH33wC++Sgkz7D5h27GNYIiTN8kZBhUGJjYlgzfwZRluD0ASi1gEDO2TsMFZfuMxyVUmV4YO8FFvu3ezPDtes3wGxCBNgHoIIJVnbANICS4jQTFXAyBfkEBEC+MnzziOEvLzuDlqYGTClWGmQmSAJWHxwG1gc2WFUCBUGRDgKgoCMWAOuDI8D6wBYWRBPxaQQZTIrhULPAZoItANU8oGoOnyWkyEGrTHC9DA4imGZaVPows2lGAwBHiLc94c9LygAAAABJRU5ErkJggg==
- 2c3deda5-7a78-4902-bb79-4796273ba3ff
- true
@@ -10615,7 +10264,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Frame Target
@@ -10627,7 +10276,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDWNgoDFgRDb/////IUB+/qPHT62/ffuGIoesDhubi4vrv5ys9FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYBw8fPflHapgTcgAoTuTlZJjAPiBk+Jp1GxhAmBQAM5OFGE2r10IMDwkKIEY5ihpYHKAIUpNDcwuICqK/bBxkewqciq7fuPUfmwn7X31gmHLrGcO1T9/A0lp8XAw5alIMjmIC2JRjiGlqqDHiDCKQ4Vln7oAN53nxhAGEQRaBxEByxAKcFoBcDgJTjFUYZE7sZZA9thvMBotB5cAKCBBY4+Dj7z9g11qK8DHo8nMz3AiIBxszpbaWgcfCmeEagwxDSGIGA/OvH3DjQ4MDGLAlY5w+gOn8+x8RPYz//8GEiaax+oCflYUBFKHH33wC++Sgkz7D5h27GNYIiTN8kZBhUGJjYlgzfwZRluD0ASi1gEDO2TsMFZfuMxyVUmV4YO8FFvu3ezPDtes3wGxCBNgHoIIJVnbANICS4jQTFXAyBfkEBEC+MnzziOEvLzuDlqYGTClWGmQmSAJWHxwG1gc2WFUCBUGRDgKgoCMWAOuDI8D6wBYWRBPxaQQZTIrhULPAZoItANU8oGoOnyWkyEGrTHC9DA4imGZaVPows2lGAwCK8LdD37XD/QAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACCElEQVRIDWNgoDFgRDb/////IUB+/uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB48eP/1HapgTcgAoTuRkpZnAPiBk+Jp1GxhAmBQAM5OFGE2r10IMDwkKIEY5ihpYHKAIUpNDcwuICqK/bBxkewqciq7fuPUfmwn7X31gmHLrGcO1T9/A0lp8XAw5alIMjmIC2JRjiGlqqDHiDCKQ4Vln7oAN53nxhAGEQRaBxEByxAKcFoBcDgJTjFUYZE7sZZA9thvMBotB5cAKCBBY4+Dj7z9g11qK8DHo8nMz3AiIBxszpbaWgcfCmeEagwxDSGIGA/OvH3DjQ4MDGLAlY5w+gOn8+x8RPYz//8GEiaax+oCflYUBFKHH33wC++Sgkz7D5h27GNYIiTN8kZBhUGJjYlgzfwZRluD0ASi1gEDO2TsMFZfuMxyVUmV4YO8FFvu3ezPDtes3wGxCBNgHoIIJVnbANICS4jQTFXAyBfkEBEC+MnzziOEvLzuDlqYGTClWGmQmSAJWHxwG1gc2WFUCBUGRDgKgoCMWAOuDI8D6wBYWRBPxaQQZTIrhULPAZoItANU8oGoOnyWkyEGrTHC9DA4imGZaVPows2lGAwBpPLdAuMVd1AAAAABJRU5ErkJggg==
- 00b4398a-522a-4426-bceb-c8b4eb2df50a
- true
@@ -10680,7 +10329,7 @@
- 0
- 2
- true
- - c3986e21-f43e-45b1-99c4-13cd41951b9b
+ - 03a3f0bd-ed2a-4964-bb43-3f73e45819ea
- 1
- Rhino plane or COMPAS Frame describing the target pose (in WCF).
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
@@ -10932,7 +10581,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Forward Kinematics
@@ -10944,7 +10593,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACAUlEQVRIDbWVS0sCURTH70QroZWQ0HOTqUXUqqAs6htI6bpdEAZtK4IIotoGRdCugiK0cNUX6AFF21KzRdoDClwFrqrp/k9zhmujaI5eGOY+zvmde87/zlwhatw0la/relCOZzNPL0O5XC5vTbUr1Hc4HHpba/OFXNvQNC3KNiZEwlcTydQ8L9h5ez3uNRlkAQwKgJ1LeMQO9K+vDBJCJnXGwuxfgyqMiUkZpDPP36j5bTxB3G6f1zYfmrS3tdTVgwT45vaOODu/JPCwf1DMTE/ZCsKHhEqEnQPucjXSgz5nYyuKdKYMGPL5+SWy2SwPq/KmDFBzlEWFp1IPVcmCRI4n7nVsF2UB+PDI/E4oMOtxZxyCrjIPgc/bqfExpXIgE7e7wyyN0+kkbViPyHFMLK+si+hJzLTZSr0KPMVangaqEQTntrd/IB7TGR4KBEILjgfEpgEPu5vMdbWTlwEWWI+3t3eBp6+3Jw+uOpfTL5gBaj42OkL+6keH8kCH0ESAdl9xADiqYAYtLc5RgHJFhl/BDBhY6F0M7ju9Mc1npB6siUUD06qMzuRVsqQVZYAfE/87SnoYBjia19kP0e9sELsDHosbmJikDIybyGJUaqIYHH7MZA025Jy/FFBdR43D6oS1D+ZvBrh5cM1ZbSqbMa5M+t+YdzJQtbj0K9viP7x+APKst1ZZrG60AAAAAElFTkSuQmCC
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACAElEQVRIDbWVO0sDQRDH94JdsAoYiI/K00QRrRR8od8gqKntBEkgrYoggqitoAh2Kijig1R+AR+g2KrRWKjRgEIqSaee+x9vjo13ITGXLBy3j5nf7Mx/71aIKjdN5RuGMSbH8fRLpi+Xy+WtqXZOfa/XazQ2BM7k2oqmaQdsY0EkfDF5l5rmBTfvYKu+JIPMgEEBsHMJ33cD/esrg0SQicdciP81qMCYmJTBc/r1GzW/vk0Stz0UdM2HJk2N9Z4akABfXd8QJ6fnBB7o7xWxyQlXQfiQUImwc8D9/jp60OdsXEWRzpQBQz4/v0Q2m+VhRd6UAWqOsqjwVOqhIlmQyLfJewPbRVkA3t2zvhMKzHrcmIegrcRDEAq2aHxMqRzIRNebrdL4fD7ShvXYP0yI+YVlcXCUsGzWUhmBp1DL00A1guDctrZ3xOPTMw8FAqGNjYTFqgmP6gFrXe3kZYAF1uPt7V3g6ersyIOrzqX0HTNAzYeHBslf/ehQHugQGQ3T7ssOAEcVzKC52SkKUKrI8HPMgIFO70Lw0PGVZR6TerAmNg0sqxI64xd3Ra0oA/yY+N9R1MM0wNG8zH6Ibl+t2OxptbmBiUnKwLyJbEbFJgrB4cdM1mBFzvUXA6rrqHFUnbD3wfzNADcPrjm7TXkz5pVJ/xvrTgaqGpd+eVv8h9cPxrq3TcqixRUAAAAASUVORK5CYII=
- 36d4fb80-9142-4c73-81a0-e837a9435e26
- true
@@ -11250,7 +10899,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Forward Kinematics
@@ -11262,7 +10911,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACAUlEQVRIDbWVS0sCURTH70QroZWQ0HOTqUXUqqAs6htI6bpdEAZtK4IIotoGRdCugiK0cNUX6AFF21KzRdoDClwFrqrp/k9zhmujaI5eGOY+zvmde87/zlwhatw0la/relCOZzNPL0O5XC5vTbUr1Hc4HHpba/OFXNvQNC3KNiZEwlcTydQ8L9h5ez3uNRlkAQwKgJ1LeMQO9K+vDBJCJnXGwuxfgyqMiUkZpDPP36j5bTxB3G6f1zYfmrS3tdTVgwT45vaOODu/JPCwf1DMTE/ZCsKHhEqEnQPucjXSgz5nYyuKdKYMGPL5+SWy2SwPq/KmDFBzlEWFp1IPVcmCRI4n7nVsF2UB+PDI/E4oMOtxZxyCrjIPgc/bqfExpXIgE7e7wyyN0+kkbViPyHFMLK+si+hJzLTZSr0KPMVangaqEQTntrd/IB7TGR4KBEILjgfEpgEPu5vMdbWTlwEWWI+3t3eBp6+3Jw+uOpfTL5gBaj42OkL+6keH8kCH0ESAdl9xADiqYAYtLc5RgHJFhl/BDBhY6F0M7ju9Mc1npB6siUUD06qMzuRVsqQVZYAfE/87SnoYBjia19kP0e9sELsDHosbmJikDIybyGJUaqIYHH7MZA025Jy/FFBdR43D6oS1D+ZvBrh5cM1ZbSqbMa5M+t+YdzJQtbj0K9viP7x+APKst1ZZrG60AAAAAElFTkSuQmCC
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACAElEQVRIDbWVO0sDQRDH94JdsAoYiI/K00QRrRR8od8gqKntBEkgrYoggqitoAh2Kijig1R+AR+g2KrRWKjRgEIqSaee+x9vjo13ITGXLBy3j5nf7Mx/71aIKjdN5RuGMSbH8fRLpi+Xy+WtqXZOfa/XazQ2BM7k2oqmaQdsY0EkfDF5l5rmBTfvYKu+JIPMgEEBsHMJ33cD/esrg0SQicdciP81qMCYmJTBc/r1GzW/vk0Stz0UdM2HJk2N9Z4akABfXd8QJ6fnBB7o7xWxyQlXQfiQUImwc8D9/jp60OdsXEWRzpQBQz4/v0Q2m+VhRd6UAWqOsqjwVOqhIlmQyLfJewPbRVkA3t2zvhMKzHrcmIegrcRDEAq2aHxMqRzIRNebrdL4fD7ShvXYP0yI+YVlcXCUsGzWUhmBp1DL00A1guDctrZ3xOPTMw8FAqGNjYTFqgmP6gFrXe3kZYAF1uPt7V3g6ersyIOrzqX0HTNAzYeHBslf/ehQHugQGQ3T7ssOAEcVzKC52SkKUKrI8HPMgIFO70Lw0PGVZR6TerAmNg0sqxI64xd3Ra0oA/yY+N9R1MM0wNG8zH6Ibl+t2OxptbmBiUnKwLyJbEbFJgrB4cdM1mBFzvUXA6rrqHFUnbD3wfzNADcPrjm7TXkz5pVJ/xvrTgaqGpd+eVv8h9cPxrq3TcqixRUAAAAASUVORK5CYII=
- 506100f6-29bc-4721-8251-b473cc6ca5f1
- true
@@ -11568,7 +11217,7 @@
-
+
- 00027467-0d24-4fa7-b178-8dc0ac5f42ec
- Value List
@@ -11625,7 +11274,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Attach Tool To Robot
@@ -11637,7 +11286,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACA0lEQVRIDbWVTS9DQRSGT8WuGwvcEmUlbdVHhEgFf0GaamNrIRIrO1EhFhISOyuJ+AO0RPwFhFjST1ZUBLVoF13XvKedm2kzt1zSk8ydM3POfd4759xkiJpsDpVfLpfDYr2Se32bKpVKNTE1T+c7nc6yu6f7WsT2HQ5HXOaYEAHfyWSfojLwn9nr6d8VIutgsAC+XMBj9dCb2zu6f0jw9ujoCE2Mj9WnWK6FSAQnkQKXQmBazT47v6Dj2Jm6RfOREIWCszV7VgshcCUEZlqQgJqriaL+DHcZBu3tbvOAD0HEfmOSyQL1Df34zDNj0O+jvl43D/gwGeNFg4dktupyjM4O3k4k0/T8kjN9ODLGm794aAXEL8f1RklWo5smBj1AzI5pBQBAM7tcLjo4PGLe8tIiTQYm7LA5l3tg9RaARc8wFbwjf4KDa3kCBE9e8vQ4FIBL8dwXhd3t7Nt5aAVS6QxhJAslMvJF5j28Z4nanBQOBe3w9SeInZ6zAEhGFZcRM0YylaGtjbXq7s+Ttgf+Aa/5ZmQuSBgDvsqeGjOTGjjaEkkYZlmS2OkCY+S6AbMmZCkAuOwFZhhOYte0JVJh6AcGzO7X4x0WwGWBhWo4gTwF9u1+vWSyQPUmUvns24WqAMmUPdgXwZr7AMk4gRT5Q3nArNxocJp6ZUIA1oxLv0Ju4vMbbXfAeMEPB5cAAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACBUlEQVRIDbWVTS9DQRSGT8WuXVjgtvG1EvXZCGkI/oI01cbWQiRWdoIQCwmJnZVE/AGKiL+AEEttuVhpiY9akLTrmve0czNt5pZLepKZOXPOuc97Z85iiKpsLpWfz+cjYj/39Pwyks1mS3Jqnc73eDz55ibfuchtuVyuA1ljQQR83bx7WJSJ/6z+jvYNIbIEBgvgzwU8Vg69uLyi63iCw/39AQoODpSX2O6FSBQnkQKnQmBUrT46PqG92JEaoslomMKh8ZKY3UYInAmBsRoU4M7Vwlwux3CvYdDmxhoP+BBE7jcmmSxQ3tC39wwzero7qa21hQd8mMzxpsIkmbW6GqOxgcOJ5C09ptKWD0fmOPiLSSvgdrv5vnEl84srFgY9QM6JaQUAQDN9Xi9t7+wyb3ZmmoaHgk7YXMs9sPsKwK+OPvr0B/4EB9f2BEjupzJ03zsElw7SHxRpqWffyaQVuLk1CSP5mSMj88W8+OsdUZ2bIuGQE77+BLHDYxYAySjiTLFiJG9MWl1eKEZ/XrQ96O7yW19GJ0KE0dVZiKk5q6iCo70iCcMqryR2OMUYua/ALEnZCgAue4EVhpM4Ne0VqTD0AwPm9O/xDQvgscBGNZxAngJxp38vmSxQfIlUPvtOoSpAMmUPtkSy5D1AMU4gRf5wPWAWXjQ4VX0yIQCrxqNfIFdx/gZyM8B488sZSgAAAABJRU5ErkJggg==
- a0b7288b-d4f9-4c4c-88eb-9a4e1b20e889
- true
@@ -11982,7 +11631,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Visualize Robot Cell
@@ -11995,7 +11644,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDbVVvU7DQAy+VEx5BH7KVEjKygZPwFRBeQqQulKEhJAQsFaCp6CgTrwBG2KkgU4U6CNkJNxn4ujucJqmpZauvvPP57PdnJWaM3kmfpIkTX1uDT++tuI4tnSmnbT3fT+priw9al3H87wu22QgGvwieh20WTELD9ZrlzrIMTAW8IObA/xmMFLXepl0WFtUB3pJlGuvVFtjPiOTSurYAnfBJdAimYFBmFSi9+HnN2oePjyRf39nswhH1Jv+6MlqdblCGZRtqIjuCBmTeuDoxONLP1K3dz21UQ9UPfxdoqEjtAKgoRKdnV8pBAAx399rqOZuwzKX/KkH/egtsSyNQ/e+RzeH6PTkiAIgExAygSyPwmDNszKQDBkMOmQCUCbOhs8S57+ppLNkKAkIoLy3DHIOEwcw623uc3AzcWEALgl6wYRSgVjHcokXNhlOZqMZBOAo1bggf5qMtwXkvj1cEjR8HLDkb2Vgfup80zLc9UcGhT0oE0CypQB4mCTlLDLGpA8Nk0jPg20G5FRxLjsPGCOdbopL1GEwNpiWG+8RYVKTATavkZkFSIP8+9CfthIT+/0A0Eq8LlpvRl4AAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtElEQVRIDbVVzU7CQBCeEm99AxRvaMGrN30CT0TxKTThKsbEmBj1SqJPIRpOvoE349FWuYnyBr1S91s7ze46pRRkkmV25+ebnRm6Q7Rk8kz8JEna6twZfY134ji2dKadtPd9P6mtVZ+Vrud5Xp9tMhAFfhW9D7usWIQHm/VrFeQUGCv4wc0Bfjcc061aJh3Xq3SklkS59kRdhfmKTCqpYwfcBZdAi2QGhsbUJfocfU9Q88bTi/YP97aLcES96Y+erNdWKzqDsg0V0R0hY+oeODrx+BZGdP8woK1mQM3G7xINHaEVAA2V6OLyhhAAxPzwoEXt/ZZlLvnrHoTRR2JZGof+40DfHKLzsxMdAJmAkAlkedQINjwrA8mQwaBDJgBl4mz4LHH+m0o6S4aSgADKe8sg5zBzALPe5j4HNxMXBuCSoBdMKBWIdSyXeGGT4WQ2mkEAjlJNC/KnyXhbQO7bwyVBw6cBS/5WBuanzjctw11/ZFDYgzIBJFsdAA+TpFxExpj6Q8MkUvNglwE5VZzLzgPGSKcbcYl6DMYG83LjPdKYuskAW9bIzAKkQf596M9biZn9fgCrDLwo6wgHKQAAAABJRU5ErkJggg==
- c300a51d-ea1d-4a6f-aac8-a4d4a36ca3fd
- true
@@ -12417,7 +12066,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: ROS Client
@@ -12429,7 +12078,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvElEQVRIDWNgoDFgRDb/////UUB+5uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYB48eP/1HapgTcgAoTuRkpZnAPqC24SDLYWbCgoiQg8iWZ0HXee/+A4bLV66BhXV1tBiUFBXQlaDwCalHsWDT5m0MS1esQjEgOiKMwc/XC0UMxiFGPdwCkEtAhouICDOEBgeCzVi9dj1YTAfqk70vP4DFncUFGIhRD1IMtwAWLCDDHexswAY9/cfI0Pn2D0Pk9VcMjHfeM3z8/Rcszs/KzPD/92+G70GJDOXCLED11mBxEDF95hxwEMOCln6RDIpQEAAFCwwcW7+eQfPNW4b2lgZwZKMHUWVNA8MxYJBKM/0Ha4HphZkFEgRntOs3boFVEBNpYJOgBCH1mhpqjCgWgPQRSnbIFhBSj9UCdAMo4YMsoHkkgy0AFUyUuBSbXpiZYAugNRE2dWSLwcyEBdF0sk3CrRFsJtgCUM0DquZwqyVNBlplgutlcDKFaadFpQ8zm2Y0AMLixEoY2NubAAAAAElFTkSuQmCC
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABvElEQVRIDWNgoDFgRDb/////UUB+5pOnz62/fPmCIoesDhubh4fnv4y05FGg3HRGRsZlMDVwQ4CG99y4ebsYJkEJraGu2gu0pARkBtgCkMuBhi+lxFB0vUBLokE+YYJKZKIroAIfbCbYB4+fPPtHapgTcgAoTmRlpJjAPqC24SDLYWbCgoiQg8iWZ0HXee/+A4bLV66BhXV1tBiUFBXQlaDwCalHsWDT5m0MS1esQjEgOiKMwc/XC0UMxiFGPdwCkEtAhouICDOEBgeCzVi9dj1YTAfqk70vP4DFncUFGIhRD1IMtwAWLCDDHexswAY9/cfI0Pn2D0Pk9VcMjHfeM3z8/Rcszs/KzPD/92+G70GJDOXCLED11mBxEDF95hxwEMOCln6RDIpQEAAFCwwcW7+eQfPNW4b2lgZwZKMHUWVNA8MxYJBKM/0Ha4HphZkFEgRntOs3boFVEBNpYJOgBCH1mhpqjCgWgPQRSnbIFhBSj9UCdAMo4YMsoHkkgy0AFUyUuBSbXpiZYAugNRE2dWSLwcyEBdF0sk3CrRFsJtgCUM0DquZwqyVNBlplgutlcDKFaadFpQ8zm2Y0AJ2kxEQg2Zf8AAAAAElFTkSuQmCC
- d669cfde-80ea-4143-bcdc-260a09b8dd65
- true
@@ -12774,7 +12423,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: MoveIt Planner
@@ -12786,7 +12435,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACUklEQVRIDbVVTUhUURQ+Yy5mpvcgddfPtBLNlYpOQgVSmxhaSDkEbtwKBrq0CNzpNsGgrRshRsWFiIuKQIM0qDbpiCst3YmCNvPEV6/7Hd+5vve8kTbjgTfn3vPzffeew9xDdM4SC+J7ntep9n0b3zdvFQqFkC8YZ1onk0kvde3KB+UbicViExKjQRT4UH517ak4StH1dbXDiuQZMJgAJ1fguVJAo7mKJIubVPiOvmhAGfaMyTdY3/jxW2q+v/+Txl/n6POXr2fiaG5qpK7HWbKsi5yHnlxPXa3gGwg4PAB/++49kac2Z/iQg1wRwawUg2icvKrqEr0afSGmU+me3n7jraUHtLySp4mpaXIc5+jkPmz34iq9XNs6QQIbfCKu63IuMIKib5CbnGYSOA8PXR2ztL1H+CC9tZdZA3w0QlpUBwMJcL4t52nw+QDHagIYwD4zO0eVF7SZg9I1NgO2Kv1JkUXBEWRbFjkHDj3I3KeGG/Wch58QUufDDnojDdYhROlqm3fdH49KAkLYokTxeJyAERTdg6DRtJbywDd2s84UYrRpglCTDaE48UqmhcbazODur/9scpRLyhW1F4vmJusboMnZRx2USMQpoWopgnqbBA0P+mzb4lxg4BP5Z5P/Vm/cJB3phanJIQKw4k3B377nSX/oDycnYq0f+WPrzs4u3bvbfmzwV0yAh0neDjxYEH7sDEB+3gkFcMmFE5jQDKHmwbyaB7dhKJeoebCg5sEdafJIuYADOIzJBJg8GHMBZ0lLf2TyXA5V+TyGfkknPU3yHzc/Bck9uYAcAAAAAElFTkSuQmCC
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACUUlEQVRIDbVVPUgcURCeMxZ33C7EpFMvnWisNJhTUCHEJoiFJB6BNLaCgpZRAum0VVBIayPIabAIIYUJgUTIDyRpoid2mtiJgh634VbX9407z931iZo7B/bmvfn5vvdmuDdE1yyxIL7neX1qP7z1Z7s9n8+HfME40zqZTHqp2uoV5ZuKxWILEqNBFPh4bn1jVByl6Ib6uglFMgYMJsDJFXi2FNBoriLJ4CYVvmM4GlCGPWPyDTa3/h5JzQ8O8jQ3n6UfP39dieNecxM9e5ohy0pyHnpyJ1VTwTcQcHgA/v7DRyJPba7wIQe5IoJZKQbROHlV1U16NT0ppkvpgcER462lB7S6lqOF10vkOM7JyX3Y/q/rNLOxfYYENvhEXNflXGAERd8gu7jEJHAWi66O+bazT/ggg3XVrAE+HSEtqIOBBDi/V3P08sVzjtUEMID9zdt3VHlDmzkofdtmwPtKf1dkUXAE2ZZFzj+HerofUePdBs7DTwip73EvLUuDdQhR+pbNu/4vJyUBIWxRong8TsAIiu5B0GhaS3ngm22tN4UYbZog1GRDKE681t1Cs21mcPfwP5sc5ZJyRe2FgrnJ+gZocuZJLyUScUqoWoqg3iZBw4M+27Y4Fxj4RC5s8nn1xk3SkV6YmhwiACveFPztB4ZGQn84ORFr/cifWnd396jr4YNTg79iAjxM8nbgwYLwY2cA8vPOKIBLLpzAhGYINQ8+qXnQAUO5RM2Dz2oedEqTp8oFHMBhTCbA5MGYCzhLWvojk+dyqMrXMfRLOullko8BFYsFxtPMQ9sAAAAASUVORK5CYII=
- 4393a904-1d39-422c-be8d-f07a18284b2f
- true
@@ -12882,7 +12531,7 @@
- 1
- 2
- true
- - 6f0b279a-83bc-49d8-b291-d9861d788592
+ - b23784e4-ff43-4dfc-a4d1-22ca6bfbf351
- 1
- Optional list of ToolModels to register into the cell. Each is keyed by its `.name`. Re-applied on every refresh without refetching.
- 1c282eeb-dd16-439f-94e4-7d92b542fe8b
@@ -13212,7 +12861,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Inverse Kinematics
@@ -13224,7 +12873,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDWNgoDFgRDb/////IUB+/qPHT62/ffuGIoesDhubi4vrv5ys9FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5IPoNes2gDG6YjL5YDNZQJpBYQ6iV6/dAKIYQoICwDQlBMxMsA/QI7SxpYNin8DMhAURimOvXb+BwsfH2f3iPQMI4wJYLQApBgVXeHQCXp+ADM47dxeMcVmCYkFoMPlhv/35O6yeACfT6zdu/ccqi0UQFHxamhpwmbWP3zB03XjM8On3X4ZpJioMjmICcDlNDTVGFB/AZXAwQIaDEgAIw+IpWFaEoUNfEayj4uJ9hjVAC5EBUT4A5Q9YEkbWXF9TAfdN4fl7DDugwTTJSJnBVUKQgWQfIBsOYiMHlZekILo0mE+UD2A6YUEEMhiUIJAtAKmBpSSQ60EA5AOSLABpQo9kkBguQFYQobsal+EwcZJSEUwTKTTYAlBlQYomYtTCzARbAK2JiNFHtBqYmbAgmki0TuIVgs0EWwCqeUDVHPF68auEVpngehmcTGHKaVHpw8ymGQ0AU/+nWEJiEbQAAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDWNgoDFgRDb/////IUB+/uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5IPoNes2gDG6YjL5YDNZQJpBYQ6iV6/dAKIYQoICwDQlBMxMsA/QI7SxpYNin8DMhAURimOvXb+BwsfH2f3iPQMI4wJYLQApBgVXeHQCXp+ADM47dxeMcVmCYkFoMPlhv/35O6yeACfT6zdu/ccqi0UQFHxamhpwmbWP3zB03XjM8On3X4ZpJioMjmICcDlNDTVGFB/AZXAwQIaDEgAIw+IpWFaEoUNfEayj4uJ9hjVAC5EBUT4A5Q9YEkbWXF9TAfdN4fl7DDugwTTJSJnBVUKQgWQfIBsOYiMHlZekILo0mE+UD2A6YUEEMhiUIJAtAKmBpSSQ60EA5AOSLABpQo9kkBguQFYQobsal+EwcZJSEUwTKTTYAlBlQYomYtTCzARbAK2JiNFHtBqYmbAgmki0TuIVgs0EWwCqeUDVHPF68auEVpngehmcTGHKaVHpw8ymGQ0AWLunWInieVcAAAAASUVORK5CYII=
- 8c40b20d-5907-473b-8192-ee9a7a063d58
- true
@@ -13569,7 +13218,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Inverse Kinematics
@@ -13581,7 +13230,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDWNgoDFgRDb/////IUB+/qPHT62/ffuGIoesDhubi4vrv5ys9FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5IPoNes2gDG6YjL5YDNZQJpBYQ6iV6/dAKIYQoICwDQlBMxMsA/QI7SxpYNin8DMhAURimOvXb+BwsfH2f3iPQMI4wJYLQApBgVXeHQCXp+ADM47dxeMcVmCYkFoMPlhv/35O6yeACfT6zdu/ccqi0UQFHxamhpwmbWP3zB03XjM8On3X4ZpJioMjmICcDlNDTVGFB/AZXAwQIaDEgAIw+IpWFaEoUNfEayj4uJ9hjVAC5EBUT4A5Q9YEkbWXF9TAfdN4fl7DDugwTTJSJnBVUKQgWQfIBsOYiMHlZekILo0mE+UD2A6YUEEMhiUIJAtAKmBpSSQ60EA5AOSLABpQo9kkBguQFYQobsal+EwcZJSEUwTKTTYAlBlQYomYtTCzARbAK2JiNFHtBqYmbAgmki0TuIVgs0EWwCqeUDVHPF68auEVpngehmcTGHKaVHpw8ymGQ0AU/+nWEJiEbQAAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABtUlEQVRIDWNgoDFgRDb/////IUB+/uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5IPoNes2gDG6YjL5YDNZQJpBYQ6iV6/dAKIYQoICwDQlBMxMsA/QI7SxpYNin8DMhAURimOvXb+BwsfH2f3iPQMI4wJYLQApBgVXeHQCXp+ADM47dxeMcVmCYkFoMPlhv/35O6yeACfT6zdu/ccqi0UQFHxamhpwmbWP3zB03XjM8On3X4ZpJioMjmICcDlNDTVGFB/AZXAwQIaDEgAIw+IpWFaEoUNfEayj4uJ9hjVAC5EBUT4A5Q9YEkbWXF9TAfdN4fl7DDugwTTJSJnBVUKQgWQfIBsOYiMHlZekILo0mE+UD2A6YUEEMhiUIJAtAKmBpSSQ60EA5AOSLABpQo9kkBguQFYQobsal+EwcZJSEUwTKTTYAlBlQYomYtTCzARbAK2JiNFHtBqYmbAgmki0TuIVgs0EWwCqeUDVHPF68auEVpngehmcTGHKaVHpw8ymGQ0AWLunWInieVcAAAAASUVORK5CYII=
- d833948b-a8e4-440a-87e5-eb1fb8831e21
- true
@@ -13926,7 +13575,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Deconstruct Planner
@@ -13938,7 +13587,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACU0lEQVRIDWNgoDFgRDb/////IUB+/qPHT62/ffuGIoesDhubi4vrv5ys9FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYBw8fPflHapjDHLDy0WswM1xOFCYEpkFxIi8nw8QC4sEMf/L0GcPNm7dQFII46upqDDLSUhjiwUeuMVz79A0srsvPzaDFzwVXAzMTbAFI9Omz5wzFZeB4gStCZvR2taFYEn/yJthwcQ42BnU+ThTDkfXBLbhx4yZYPDU5AVkezJ49dwHYZzBfgAw/9fYzg5kwL8NCc3UM9cgCYAuuXb/BcPb8Bbi4i5MDnL1n3wE4G8QgxXCQerAFjS0dIDYYPH/+AsbEoHEZ/vz7LwZmRkYGMQ5WDD1gC0KDAxju3X/AcPbcBQZJSQkMRSCBbX/YwMECYoOCR3PbGRATBex11GOQ4mRDEQPnAy1NDRRBbJzb/5ixCaOIsQB9gQ6IDqJ8tu8Mi7glsUbuqx+/Gf7+/481iMA+AAWRsZEB2HJcQQSSBKUYUMoBBREoPmAAFPaSaEEDkwNbEBIEtMAQYgFIApRyYBimEEbjsgQmj06DgwgkCMqtIABK89gATB4kB7IElqJMdp1nMBbiYZhpoopNG6Q0vX7j1n+QLKlFRf3lhwyrHkPKorXWWhi5WVNDDRLttCzsYPXBYWB9YIPVj2QKAuuDI8D6wBZWH0wk0xx82sBmgi0A1Tygag6falLkoFUmuF5GyXq0qPRJcRhZagFwfuhs3ElmqwAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACU0lEQVRIDWNgoDFgRDb/////IUB+/uMnz6y/fv2KIoesDhubm5v7v6yM1FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYJK5KMroAIfbCbYB48eP/1HapjDHLDy0WswM1xOFCYEpkFxIicrzcQC4sEMf/L0GcPNm7dQFII46upqDDLSUhjiwUeuMVz79A0srsvPzaDFzwVXAzMTbAFI9Omz5wzFZeB4gStCZvR2taFYEn/yJthwcQ42BnU+ThTDkfXBLbhx4yZYPDU5AVkezJ49dwHYZzBfgAw/9fYzg5kwL8NCc3UM9cgCYAuuXb/BcPb8Bbi4i5MDnL1n3wE4G8QgxXCQerAFjS0dIDYYPH/+AsbEoHEZ/vz7LwZmRkYGMQ5WDD1gC0KDAxju3X/AcPbcBQZJSQkMRSCBbX/YwMECYoOCR3PbGRATBex11GOQ4mRDEQPnAy1NDRRBbJzb/5ixCaOIsQB9gQ6IDqJ8tu8Mi7glsUbuqx+/Gf7+/481iMA+AAWRsZEB2HJcQQSSBKUYUMoBBREoPmAAFPaSaEEDkwNbEBIEtMAQYgFIApRyYBimEEbjsgQmj06DgwgkCMqtIABK89gATB4kB7IElqJMdp1nMBbiYZhpoopNG6Q0vX7j1n+QLKlFRf3lhwyrHkPKorXWWhi5WVNDDRLttCzsYPXBYWB9YIPVj2QKAuuDI8D6wBZWH0wk0xx82sBmgi0A1Tygag6falLkoFUmuF5GyXq0qPRJcRhZagFJEuhmTItpkQAAAABJRU5ErkJggg==
- 4819d1cf-0141-4891-83b1-8dbe7d876737
- true
@@ -14125,7 +13774,7 @@
-
+
- c552a431-af5b-46a9-a8a4-0fcbc27ef596
- Group
@@ -14156,7 +13805,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Plan Cartesian Motion
@@ -14168,7 +13817,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAAB3ElEQVRIDWNgoDFgRDb/////IUB+/oOHj61//PiBIoesDhubg4Pjv4K87FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYFK5KMrIMQ/9e4zw+m3n8HKTIV5GcyEeNG1gMyEWAAKc3RZYvhTbj+DKLsNoXJUpRiygRgEYGYygTikRihID8jF171MGBz/fGIQv3wKJMQAtxDIhpkJtgAsSwZx7foNhrcrFzGIX4JYYAYMKnQAiwN0cbz823fuMuw/cIhh7/6DYHUv9czANJZ4YCDZApDhNfXNcAfU11Qw7GfhAwcPKLLRAUkWgIJk0dIVcDNaGmsZVFWUGb4AU5TZO6wpiXgfrFm3gWH12g1gw50d7RkcHezAhoMEQEFjZq4OtxiZQdAH6OEdGhzAEBIUgGwGXjZeC5DDW1FRgSEuOoJBS1MDr4HokjgtQA/v5IRYeJCgG4KPj9UC9PB2sLcly3CQxSgWUBre2HwCt4Aa4Y3TAlBlAZSE1w3khjeyBVAz4fXBYWB9YAPyBQiAMg+lAFgfHAHWB7awIJoINNCGGgYjOQxkJgO4NAXVPKBqDkmSIia0ygTXy/BwB5lIi0qfIpcSoxkASu6xu5pSL+4AAAAASUVORK5CYII=
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAAB3ElEQVRIDWNgoDFgRDb/////IUB+/sNHT6y/f/+OIoesDhubk5Pzv7yczFGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYFK5KMrIMQ/9e4zw+m3n8HKTIV5GcyEeNG1gMyEWAAKc3RZYvhTbj+DKLsNoXJUpRiygRgEYGYygTikRihID8jF171MGBz/fGIQv3wKJMQAtxDIhpkJtgAsSwZx7foNhrcrFzGIX4JYYAYMKnQAiwN0cbz823fuMuw/cIhh7/6DYHUv9czANJZ4YCDZApDhNfXNcAfU11Qw7GfhAwcPKLLRAUkWgIJk0dIVcDNaGmsZVFWUGb4AU5TZO6wpiXgfrFm3gWH12g1gw50d7RkcHezAhoMEQEFjZq4OtxiZQdAH6OEdGhzAEBIUgGwGXjZeC5DDW1FRgSEuOoJBS1MDr4HokjgtQA/v5IRYeJCgG4KPj9UC9PB2sLcly3CQxSgWUBre2HwCt4Aa4Y3TAlBlAZSE1w3khjeyBVAz4fXBYWB9YAPyBQiAMg+lAFgfHAHWB7awIJoINNCGGgYjOQxkJgO4NAXVPKBqDkmSIia0ygTXy/BwB5lIi0qfIpcSoxkAWeixwUBUDFEAAAAASUVORK5CYII=
- 73660c5f-e6df-4df6-932b-946df58cce1c
- true
@@ -14709,7 +14358,7 @@
-
+
- b6236720-8d88-4289-93c3-ac4c99f9b97b
- Relay
@@ -14745,7 +14394,7 @@
-
+
- c9b2d725-6f87-4b07-af90-bd9aefef68eb
- COMPAS FAB: Plan Motion
@@ -14757,7 +14406,7 @@
- true
- 2
-
- iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACKUlEQVRIDWNgoDFgRDb/////IUB+/oOHj61//PiBIoesDhubg4Pjv4K87FGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYFK5KMrIJZ/9eM3huNvP4GVWwjzMujwc8O0gsxcA/bB/QeP/pEa5iBT5tx7wdB74wnMQDBdrCHDkKIkwQCKE0UFOSawD8gx/MrHr2DDpTjZGHJUpcCGT7n9DCxmKczHoA0NflgQobgCF2fNug0MV6/dYLh2/QaDfm4xWBnzvu0M6hL+DFqaGmB+1aUH4CDT5ucC84myAGQgCKxeuwFMwwwDcaSkJOGGgyXRCIIWNLZ0gF0cGhzAUF9TATcMFLmLj15jeKxhwLD+yRuwsaAgAgFQZMMAXgtAQQJyPcjwkKAAmB4wDQoCUISCIhkULDAAEkNKSZB8cP3Grf8wBTAaZDAIg4IDOUhg8jAaFNkn3n4Gc8GRCw17kICmhhojVh+AXA4Kb5DL8RkOMgTkWmQXg8SQARMyhxZsnBZgC3dyHIBhASx4CAUNsZZhWHDj5i1i9RKlDsWCzVu3M1y+cg2s8dbtu0QZQEgR2AJQwQRS+PfvP7h6ZmYUu+HixDJgZsLqg8PA+sAGpBnkC5BFAX7exJqFVR2wPjgCrA9sYflgIlAV2AJfb0+sGsgQBJnJAA4HUM0DqubIMASrFmiVCa6X4XUySCUtKn2sLqCmIABYC8F1xJtFXwAAAABJRU5ErkJggg==
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAACKUlEQVRIDWNgoDFgRDb/////IUB+/sNHT6y/f/+OIoesDhubk5Pzv7yczFGg3ERGRsY1MDVwQ4CGt924ebsSJkEJraGu2g60pApkBtgCkMuBhq+mxFB0vUBLQkE+YYFK5KMrIJZ/9eM3huNvP4GVWwjzMujwc8O0gsxcA/bBg4eP/5Ea5iBT5tx7wdB74wnMQDBdrCHDkKIkwQCKEwV5WSawD8gx/MrHr2DDpTjZGHJUpcCGT7n9DCxmKczHoA0NflgQobgCF2fNug0MV6/dYLh2/QaDfm4xWBnzvu0M6hL+DFqaGmB+1aUH4CDT5ucC84myAGQgCKxeuwFMwwwDcaSkJOGGgyXRCIIWNLZ0gF0cGhzAUF9TATcMFLmLj15jeKxhwLD+yRuwsaAgAgFQZMMAXgtAQQJyPcjwkKAAmB4wDQoCUISCIhkULDAAEkNKSZB8cP3Grf8wBTAaZDAIg4IDOUhg8jAaFNkn3n4Gc8GRCw17kICmhhojVh+AXA4Kb5DL8RkOMgTkWmQXg8SQARMyhxZsnBZgC3dyHIBhASx4CAUNsZZhWHDj5i1i9RKlDsWCzVu3M1y+cg2s8dbtu0QZQEgR2AJQwQRS+PfvP7h6ZmYUu+HixDJgZsLqg8PA+sAGpBnkC5BFAX7exJqFVR2wPjgCrA9sYflgIlAV2AJfb0+sGsgQBJnJAA4HUM0DqubIMASrFmiVCa6X4XUySCUtKn2sLqCmIABQc8F4LvG3HgAAAABJRU5ErkJggg==
- 878ee4f3-dfc7-4c1e-ab8e-487124d32510
- true
@@ -15298,7 +14947,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -15307,7 +14956,7 @@
- Numeric slider for single values
- - bdce4754-a6b0-47dc-ba0c-8fef4b701886
+ - 32aa6709-f6d9-4157-b5ec-2fb5aace4072
- Number Slider
- shoulder_pan_joint
- false
@@ -15339,7 +14988,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -15348,7 +14997,7 @@
- Numeric slider for single values
- - 1f5db91c-2547-4781-939e-e813733713e9
+ - fbadd3c0-df5f-400f-9243-96f261d44776
- Number Slider
- shoulder_lift_joint
- false
@@ -15380,7 +15029,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -15389,7 +15038,7 @@
- Numeric slider for single values
- - f3e86788-4a7f-40b7-a645-f63aa093cd29
+ - 2cc39827-4ec2-4307-995b-f62969026b73
- Number Slider
- elbow_joint
- false
@@ -15421,7 +15070,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -15430,7 +15079,7 @@
- Numeric slider for single values
- - bceb6ccc-7107-4426-adca-c7aac74a5c46
+ - c1c866e6-fe5c-40c7-8145-028dcead736d
- Number Slider
- wrist_1_joint
- false
@@ -15462,7 +15111,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -15471,7 +15120,7 @@
- Numeric slider for single values
- - b23ab536-0229-4863-88bd-2042b8311bb5
+ - 5a2a0bf4-4661-4a9a-8313-f67db0550f4b
- Number Slider
- wrist_2_joint
- false
@@ -15503,7 +15152,7 @@
-
+
- 57da07bd-ecab-415d-9d86-af36d7073abc
- Number Slider
@@ -15512,7 +15161,7 @@
- Numeric slider for single values
- - bef9677b-8a97-4c70-8d77-7a840d3a73fb
+ - c395212b-f5d4-4312-b650-266e1bc7734f
- Number Slider
- wrist_3_joint
- false
@@ -15544,6 +15193,379 @@
+
+
+ - 4f8984c4-7c7a-4d69-b0a2-183cbb330d20
+ - Plane
+
+
+
+
+ - Contains a collection of three-dimensional axis-systems
+ - 03a3f0bd-ed2a-4964-bb43-3f73e45819ea
+ - Plane
+ - target plane (IK)
+ - false
+ - 0
+
+
+
+
+ -
+ 1991
+ 969
+ 50
+ 24
+
+ -
+ 2016.4023
+ 981.9662
+
+
+
+
+
+ - 1
+
+
+
+
+ - 1
+ - {0}
+
+
+
+
+ -
+ 0.4937036997233545
+ 0.056971871730282335
+ 0.5034884601000649
+ 0.36964280868381477
+ -0.9291739309668243
+ 0
+ -0.9291739309668243
+ -0.36964280868381477
+ 0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ - c9b2d725-6f87-4b07-af90-bd9aefef68eb
+ - COMPAS FAB: Tool From Mesh
+
+
+
+
+ - Construct a ToolModel from a Rhino mesh and a TCP plane, both expressed in the coordinates the mesh was modelled in. Wire `base_plane` to say where the robot's flange takes hold of the geometry, so the tool can be modelled wherever is convenient. The same mesh is used for collision checking unless a separate `collision_mesh` is provided. Output feeds directly into a Load Robot Cell component's `tools` input.
+ - true
+ - 2
+ -
+ iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAGKADAAQAAAABAAAAGAAAAADB/VeXAAABq0lEQVRIDbVVsU7DMBB1Ch+A1ArWDoUWZjaKBH+AoF35BLoCQkJICJiQ+gcsDKgB8Q/AxgwtdGNgAxYkWBruHZxlEjtx1PaG+Ox7996drdhKjdkCkz+KogbNW72n/hL5/2ImzuYHQRBV5yp3FGuTHwpGkxDhUbf3vCOBYcZadfaYRHbBwQKonMg7w5DGc0mkiU4Kf4FWHDCCOXNyB1T9IO+eZxWAM6EuCpMAxskPDk/Uw2M3i0PH9/e21cJ8Tc/hCKdskQ6COA+5TnQ4CQFUEq8GuaiyubGWoMGaDS/AhAACNiJsW+fyWvK8R6uA2YWtOllDIY31ZFemulUAALOLi/MzLLHBlzPKIkeCU0C6iB96ePW7TWYBrOz4OAWAFxJz78X3qR4cqQJmFwCLibDM08ZUASTayHyrRz7/yXBchi4gcvr6qSa+v9RWueiCWtczBZBVrK+o9/s+E5QWK1Yi1yIL4GKSu8MGXJ2eUpvlGfXy9qHg+xg4gZP34IZu1LpPoi+GbtJbElmWQ277JubAMScLkFKIZy5HcioUXOAESL/JmNA5jPzRB+9Y7Qe0HI6ecIyijwAAAABJRU5ErkJggg==
+
+ - 731b0e88-d4e4-4632-bf0c-a84ce6be437d
+ - true
+ - false
+ - true
+ - COMPAS FAB: Tool From Mesh
+ - COMPAS FAB: Tool From Mesh
+ - 3
+
+ - false
+ - false
+ - false
+ - false
+
+
+
+
+ -
+ 667
+ 118
+ 167
+ 104
+
+ -
+ 758
+ 170
+
+
+
+
+
+ - 5
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+ - 1
+ - 08908df5-fa14-4982-9ab2-1aa0927566aa
+
+
+
+
+ - true
+ - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`.
+ - 045a2633-621c-4819-b494-b09d62548fb5
+ - name
+ - name
+ - true
+ - 0
+ - 2
+ - true
+ - b1d6bdbb-bbbc-482e-9851-581e5580f4a9
+ - 1
+ - Tool identifier (used as the tool id when added to a cell). Defaults to `attached_tool`.
+ - 3aceb454-6dbd-4c5b-9b6b-e71f8c1cdf88
+
+
+
+
+ -
+ 669
+ 120
+ 74
+ 20
+
+ -
+ 707.5
+ 130
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.String
+
+
+
+
+
+
+ - true
+ - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided).
+ - 0e773e40-740a-4447-9531-89c08243fa3b
+ - visual_mesh
+ - visual_mesh
+ - true
+ - 0
+ - 2
+ - true
+ - de7ea5f7-f04b-48c8-80ca-659046e21818
+ - 1
+ - Rhino mesh for visualization (and collision checking if no separate collision mesh is provided).
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 669
+ 140
+ 74
+ 20
+
+ -
+ 707.5
+ 150
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+ - true
+ - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`.
+ - 30ad922e-40df-4bc0-a731-ae3178b76568
+ - collision_mesh
+ - collision_mesh
+ - true
+ - 0
+ - 2
+ - true
+ - de7ea5f7-f04b-48c8-80ca-659046e21818
+ - 1
+ - Optional Rhino mesh used only for collision checking. Defaults to `visual_mesh`.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 669
+ 160
+ 74
+ 20
+
+ -
+ 707.5
+ 170
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+ - true
+ - Tool Coordinate Frame, as a Rhino Plane or COMPAS Frame, expressed in the coordinates the mesh was modelled in.
+ - 2a75d3f7-56fc-42ac-b070-ec7e16704258
+ - tcp_plane
+ - tcp_plane
+ - true
+ - 0
+ - 2
+ - true
+ - 3e07e26f-7364-466c-bf58-2608d206128a
+ - 1
+ - Tool Coordinate Frame, as a Rhino Plane or COMPAS Frame, expressed in the coordinates the mesh was modelled in.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 669
+ 180
+ 74
+ 20
+
+ -
+ 707.5
+ 190
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+ - true
+ - Optional plane, in the coordinates the mesh was modelled in, at which the robot's flange takes hold of the tool. Its Z axis points away from the robot: a tool drawn reaching along world Z needs none. For a tool drawn reaching along world X, wire the plane with Z = world X. Defaults to the world XY plane, i.e. the modelling coordinates are the tool's base frame.
+ - 34dcf91f-95c7-4901-b1d9-db935d767bf1
+ - base_plane
+ - base_plane
+ - true
+ - 0
+ - 2
+ - true
+ - 0
+ - Optional plane, in the coordinates the mesh was modelled in, at which the robot's flange takes hold of the tool. Its Z axis points away from the robot: a tool drawn reaching along world Z needs none. For a tool drawn reaching along world X, wire the plane with Z = world X. Defaults to the world XY plane, i.e. the modelling coordinates are the tool's base frame.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 669
+ 200
+ 74
+ 20
+
+ -
+ 707.5
+ 210
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+ - false
+ - ToolModel.
+ - b23784e4-ff43-4dfc-a4d1-22ca6bfbf351
+ - tool_model
+ - tool_model
+ - false
+ - 0
+ - 2
+ - true
+ - 0
+ - ToolModel.
+ - 1c282eeb-dd16-439f-94e4-7d92b542fe8b
+
+
+
+
+ -
+ 773
+ 120
+ 59
+ 100
+
+ -
+ 802.5
+ 170
+
+
+
+
+
+ - System.Private.CoreLib
+ - System.Object
+
+
+
+
+
+
+
+
+ - true
+ - false
+ - true
+ - IyByOiBjb21wYXNfZmFiPj0yLjAuMQoiIiIKQ29uc3RydWN0IGEgVG9vbE1vZGVsIGZyb20gYSBSaGlubyBtZXNoIGFuZCBhIFRDUCBwbGFuZS4KCmB0Y3BfcGxhbmVgIG1heSBiZSBhIFJoaW5vIFBsYW5lIG9yIGEgY29tcGFzIEZyYW1lOyBpdCBpcyB0aGUgVG9vbApDb29yZGluYXRlIEZyYW1lLCBleHByZXNzZWQgaW4gdGhlIHNhbWUgY29vcmRpbmF0ZXMgeW91IG1vZGVsbGVkIHRoZSBtZXNoCmluLiBJZiBgY29sbGlzaW9uX21lc2hgIGlzIHVud2lyZWQsIGB2aXN1YWxfbWVzaGAgaXMgcmV1c2VkIGZvciBjb2xsaXNpb24KY2hlY2tzLgoKYGJhc2VfcGxhbmVgIGlzIHdoZXJlIHRoZSByb2JvdCdzIGZsYW5nZSB0YWtlcyBob2xkIG9mIHRoZSBnZW9tZXRyeSwgYWxzbwppbiB0aGUgY29vcmRpbmF0ZXMgeW91IG1vZGVsbGVkIGluLiBJdHMgWiBheGlzIHBvaW50cyBhd2F5IGZyb20gdGhlIHJvYm90LAptYXRjaGluZyB0aGUgcGxhbm5pbmcgZ3JvdXBzIG9mIHRoZSByb2JvdHMgaW4gdGhlIGxpYnJhcnksIHNvIGEgdG9vbCBkcmF3bgpyZWFjaGluZyBhbG9uZyB3b3JsZCBaIG5lZWRzIG5vIGBiYXNlX3BsYW5lYCBhdCBhbGwuIFdpcmUgb25lIHdoZW4gdGhlIHRvb2wKd2FzIGRyYXduIGFsb25nIGFub3RoZXIgYXhpczogZm9yIGEgdG9vbCByZWFjaGluZyBhbG9uZyB3b3JsZCBYLCB0aGF0IGlzCnRoZSBwbGFuZSB3aXRoIFogPSB3b3JsZCBYLiBOb3RoaW5nIGlzIGJha2VkIGludG8gdGhlIG1lc2gsIHNvIHRoZSBwbGFuZQpjYW4gYmUgcmUtd2lyZWQgYXQgYW55IHRpbWUuCgpBIHJlbWFyayBpcyBzdXJmYWNlZCB3aGVuIHRoZSBUQ1AgZG9lcyBub3Qgc2l0IHJvdWdobHkgb24gdGhlIHRvb2wncyArWiwKc2luY2UgdGhhdCBtZWFucyB0aGUgdG9vbCB3aWxsIHBvaW50IHNpZGV3YXlzIG9uY2UgYXR0YWNoZWQuCgpUaGUgcmVzdWx0IGlzIGEgc3RhdGljIChubyBqb2ludHMpIGBUb29sTW9kZWxgIHJlYWR5IHRvIGZlZWQgaW50byBhCmBMb2FkIFJvYm90IENlbGxgIGNvbXBvbmVudCdzIGB0b29sc2AgaW5wdXQuIEtpbmVtYXRpYyB0b29scyAod2l0aCB0aGVpcgpvd24gam9pbnRzKSBzaG91bGQgYmUgbG9hZGVkIGZyb20gVVJERiBpbnN0ZWFkLgoKQ09NUEFTIEZBQiB2Mi4wLjEgKGJ1aWx0IDIwMjYtMDgtMDMgMTU6MzAgVVRDKQoiIiIKCmZyb20gbWF0aCBpbXBvcnQgZGVncmVlcwoKaW1wb3J0IEdyYXNzaG9wcGVyCmltcG9ydCBSaGlubwppbXBvcnQgcmhpbm9zY3JpcHRzeW50YXggYXMgcnMKaW1wb3J0IFN5c3RlbQpmcm9tIGNvbXBhcy5nZW9tZXRyeSBpbXBvcnQgRnJhbWUKZnJvbSBjb21wYXMuZ2VvbWV0cnkgaW1wb3J0IFZlY3Rvcgpmcm9tIGNvbXBhc19naHB5dGhvbiBpbXBvcnQgcmVtYXJrCmZyb20gY29tcGFzX2docHl0aG9uIGltcG9ydCB3YXJuaW5nIGFzIGdoX3dhcm5pbmcKZnJvbSBjb21wYXNfcmhpbm8uY29udmVyc2lvbnMgaW1wb3J0IG1lc2hfdG9fY29tcGFzCmZyb20gY29tcGFzX3JoaW5vLmNvbnZlcnNpb25zIGltcG9ydCBwbGFuZV90b19jb21wYXNfZnJhbWUKZnJvbSBjb21wYXNfcm9ib3RzIGltcG9ydCBUb29sTW9kZWwKCiMgQmV5b25kIHRoaXMgYW5nbGUgYmV0d2VlbiB0aGUgdG9vbCdzICtaIGFuZCBpdHMgVENQLCB0aGUgdG9vbCBpcyBjb25zaWRlcmVkCiMgdG8gYmUgcG9pbnRpbmcgc29tZXdoZXJlIG90aGVyIHRoYW4gYXdheSBmcm9tIHRoZSBmbGFuZ2UuCk1BWF9UQ1BfT0ZGX0FYSVNfQU5HTEUgPSAzMC4wCgoKZGVmIF9vZmZfYXhpc19yZW1hcmsodG9vbCk6CiAgICAiIiJUZXh0IGZvciB0aGUgbW91bnRpbmctYXhpcyByZW1hcmssIG9yIE5vbmUgd2hlbiB0aGUgdG9vbCBsb29rcyBmaW5lLgoKICAgIFRoZSBUQ1AgZGlyZWN0aW9uIGlzIG9ubHkgYSBoaW50OiBpdCBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHJvbGwgb2YgdGhlIHRvb2wKICAgIGFuZCBpcyBtZWFuaW5nbGVzcyBmb3IgYSBUQ1Agc2l0dGluZyBvbiB0aGUgbW91bnQgaXRzZWxmLCBzbyBpdCBpcyByZXBvcnRlZAogICAgcmF0aGVyIHRoYW4gYXBwbGllZC4KICAgICIiIgogICAgdGNwX2RpcmVjdGlvbiA9IFZlY3RvcigqdG9vbC5mcmFtZS5wb2ludCkKICAgIGlmIHRjcF9kaXJlY3Rpb24ubGVuZ3RoIDwgMWUtNjoKICAgICAgICByZXR1cm4gTm9uZQoKICAgIGFuZ2xlID0gZGVncmVlcyh0Y3BfZGlyZWN0aW9uLmFuZ2xlKFZlY3Rvci5aYXhpcygpKSkKICAgIGlmIGFuZ2xlIDwgTUFYX1RDUF9PRkZfQVhJU19BTkdMRToKICAgICAgICByZXR1cm4gTm9uZQoKICAgIG1lc3NhZ2UgPSAoIlRDUCBzaXRzIHs6LjBmfSBkZWcgb2ZmIHRoZSB0b29sJ3MgK1ogYXhpcywgc28gdGhpcyB0b29sIHdpbGwgcG9pbnQgc2lkZXdheXMgb25jZSBhdHRhY2hlZDogdG9vbHMgbW91bnQgd2l0aCArWiBwb2ludGluZyBhd2F5IGZyb20gdGhlIGZsYW5nZS4gIikuZm9ybWF0KGFuZ2xlKQoKICAgIHVuaXRpemVkID0gdGNwX2RpcmVjdGlvbi51bml0aXplZCgpCiAgICBpZiBhYnModW5pdGl6ZWQueCkgPiAwLjk5OgogICAgICAgIG1lc3NhZ2UgKz0gIllvdXIgdG9vbCByZWFjaGVzIGFsb25nIFgsIHNvIHNldCBgYmFzZV9wbGFuZWAgdG8gYSBwbGFuZSB3aXRoIGl0cyBaIGF4aXMgYWxvbmcgd29ybGQgWCAob3JpZ2luLCB4PSgwLDEsMCksIHk9KDAsMCwxKSkuIgogICAgZWxpZiBhYnModW5pdGl6ZWQueSkgPiAwLjk5OgogICAgICAgIG1lc3NhZ2UgKz0gIllvdXIgdG9vbCByZWFjaGVzIGFsb25nIFksIHNvIHNldCBgYmFzZV9wbGFuZWAgdG8gYSBwbGFuZSB3aXRoIGl0cyBaIGF4aXMgYWxvbmcgd29ybGQgWSAob3JpZ2luLCB4PSgwLDAsMSksIHk9KDEsMCwwKSkuIgogICAgZWxzZToKICAgICAgICBtZXNzYWdlICs9ICJTZXQgYGJhc2VfcGxhbmVgIHRvIGEgcGxhbmUgd2hvc2UgWiBheGlzIHJ1bnMgYWxvbmcgeW91ciB0b29sLCB3aXRoIGl0cyBYIGF4aXMgcGlja2VkIHRvIGdpdmUgdGhlIHJvbGwgeW91IHdhbnQuIgogICAgcmV0dXJuIG1lc3NhZ2UKCgpjbGFzcyBUb29sRnJvbU1lc2goR3Jhc3Nob3BwZXIuS2VybmVsLkdIX1NjcmlwdEluc3RhbmNlKToKICAgIGRlZiBSdW5TY3JpcHQoc2VsZiwKICAgICAgICAgICAgbmFtZTogc3RyLAogICAgICAgICAgICB2aXN1YWxfbWVzaCwKICAgICAgICAgICAgY29sbGlzaW9uX21lc2gsCiAgICAgICAgICAgIHRjcF9wbGFuZSwKICAgICAgICAgICAgYmFzZV9wbGFuZSk6CiAgICAgICAgaWYgdmlzdWFsX21lc2ggaXMgTm9uZSBvciB0Y3BfcGxhbmUgaXMgTm9uZToKICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgZnJhbWUgPSB0Y3BfcGxhbmUgaWYgaXNpbnN0YW5jZSh0Y3BfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZSh0Y3BfcGxhbmUpCiAgICAgICAgYmFzZV9mcmFtZSA9IE5vbmUKICAgICAgICBpZiBiYXNlX3BsYW5lIGlzIG5vdCBOb25lOgogICAgICAgICAgICBiYXNlX2ZyYW1lID0gYmFzZV9wbGFuZSBpZiBpc2luc3RhbmNlKGJhc2VfcGxhbmUsIEZyYW1lKSBlbHNlIHBsYW5lX3RvX2NvbXBhc19mcmFtZShiYXNlX3BsYW5lKQogICAgICAgIGNfdmlzdWFsID0gbWVzaF90b19jb21wYXMocnMuY29lcmNlbWVzaCh2aXN1YWxfbWVzaCkpIGlmIHZpc3VhbF9tZXNoIGVsc2UgTm9uZQogICAgICAgIGNfY29sbGlzaW9uID0gbWVzaF90b19jb21wYXMocnMuY29lcmNlbWVzaChjb2xsaXNpb25fbWVzaCkpIGlmIGNvbGxpc2lvbl9tZXNoIGVsc2UgTm9uZQoKICAgICAgICBpZiBjb2xsaXNpb25fbWVzaCBpcyBOb25lOgogICAgICAgICAgICBnaF93YXJuaW5nKGdoZW52LkNvbXBvbmVudCwgIk5vIGNvbGxpc2lvbiBtZXNoIHByb3ZpZGVkOiB0aGUgdG9vbCB3aWxsIGJlIHZpc3VhbGl6ZWQgYnV0IGlnbm9yZWQgZm9yIGNvbGxpc2lvbiBjaGVja2luZy4iKSAgIyBub3FhOiBGODIxCgogICAgICAgICMgYGJhc2VfZnJhbWVgIGlzIG9ubHkgcGFzc2VkIHdoZW4gd2lyZWQsIHNvIGFuIG9sZGVyIGNvbXBhc19yb2JvdHMga2VlcHMKICAgICAgICAjIHdvcmtpbmcgZm9yIGRlZmluaXRpb25zIHRoYXQgZG9uJ3QgdXNlIGl0LgogICAgICAgIGt3YXJncyA9IHsiYmFzZV9mcmFtZSI6IGJhc2VfZnJhbWV9IGlmIGJhc2VfZnJhbWUgZWxzZSB7fQogICAgICAgIHRvb2wgPSBUb29sTW9kZWwoCiAgICAgICAgICAgIHZpc3VhbD1jX3Zpc3VhbCwKICAgICAgICAgICAgZnJhbWVfaW5fdG9vbDBfZnJhbWU9ZnJhbWUsCiAgICAgICAgICAgIGNvbGxpc2lvbj1jX2NvbGxpc2lvbiwKICAgICAgICAgICAgbmFtZT0obmFtZSBvciAiYXR0YWNoZWRfdG9vbCIpLnN0cmlwKCksCiAgICAgICAgICAgICoqa3dhcmdzLAogICAgICAgICkKCiAgICAgICAgbWVzc2FnZSA9IF9vZmZfYXhpc19yZW1hcmsodG9vbCkKICAgICAgICBpZiBtZXNzYWdlOgogICAgICAgICAgICByZW1hcmsoZ2hlbnYuQ29tcG9uZW50LCBtZXNzYWdlKSAgIyBub3FhOiBGODIxCgogICAgICAgIHJldHVybiB0b29sCg==
+ - COMPAS FAB: Tool From Mesh
+
+
+
+
+ - *.*.python
+ - 3.*
+
+
+
+
+
+
+
+
@@ -15551,7 +15573,7 @@
-
- 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
+ iVBORw0KGgoAAAANSUhEUgAAAJYAAABkCAYAAABkW8nwAAAAAXNSR0IArs4c6QAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAlqADAAQAAAABAAAAZAAAAAAGd2knAAAZcUlEQVR4Ae2dW29cR3LHe+4zHN5ESbSuttdeGBvYVnYTr715sGMgQGAkeVjkIfl0+xn2KU95SgIsEicwsImD9WVla2WvbMuSKImc+y3/X9c0z5nDITnDGYpU3A3MnFvfpuo/VdXV1X1yzrmRPjFFCiyVAkVqG40itpZK1R94ZblcznlgQYf79+//wMkRf/4yKLC9ve2ryS+jslhHpECWAhFYWYrE66VQIAJrKWSMlWQpEIGVpUi8XgoFIrCWQsZYSZYCEVhZisTrpVAgAmspZIyVZCkQgZWlSLxeCgUisJZCxlhJlgIRWFmKxOulUCACaylkjJVkKRCBlaVIvF4KBSKwlkLGWEmWAhFYWYrE66VQYD9sZim1LVCJQngm0rJDxLL109iy25j4AT/wizMB1nCYE1NLLpcbwF7PgsGgPxFwmM8rWKw4v0AFLMPhQa6ORsMDQMrn8+pDBtEHi+73q1CY8tDlVMe0+ye7R5+yaagf9LwFY54BsPJuMHjqhr3PXaP1imC14kqloms0Ho2BZpKkWCy5er3iwTAaGbFzOQNhVtKE+zAEUPX7ZdWV1zkIG7lut6vzhgOsIcGoYpG2V3we7mfrNdDnXK/XcoVCzm1trR4A0e5uW8+7qrvi27QyoZXZjwC83++5b775dgJE9PPSpQvu+vWL+g3PT6TvMwcWBOx0mu7rO791v/34Y7F93b377vsiWk9MDowfuXK57FZX15S34Ua9f3Gd3mXX6r4pTnX9J0gaCL+ysuLW1lY8Q3q9gaJh9wTUhmu3W25n55F7+eVXVPdoAhSAsdPpCBBlffIeVJOSh77wGekZkvWguAKI+XxJdZd05Hnov07nTPyebnfg7ty5qz9eInIHg4H6nXM3blxSjRFYh5IVlVSrrrtXX/tLd/PlSyJVzTO83y/qaIQDLACL43BQcg92XhexUZ9PveQoFrue2DQCc5vNkRirvF5C5TygWq2WrgdiVsetr68LRDtjgFjX6AdtwMRaDak1LQEqJ8lWUP3TnvOsrAcHQTc99+F3AU+x+Mz/54d3aMEnZ/BLRq5QrIkVP3bliqkq+w2lzE8BZJIy4mipdMlVKn0R3iRDo/FAz4J0MBDWagbQTqfvLlzYcteu3RhLkrxXhYNBR2USSQBoa7U1gQ9V1xPIaN+ArROlnMBk5MnlSgIYZXv+SfhCwhUKSLOD9lvIM+uRuqrVnHvjjdfUFv2w38f5xsaq+pnu26y1nl2+MwAWPxYiDbw0SH76NMLB3L7b2vzcdXsvq1Rddgjqq+qlnK/JM8HAg40CUGq1dT3PK29/v/q1ta39c5gVjHkkXbvdlcr8XiBRz8bdoPz6+lXdO1oaDYd9z3QzugHDtN+x33TmJDH8EbbYcTduXPd1IG1DAnQGtnDn/B/PCFizEkZMGhVcfyCVOZJqVDEYPhi0vWoyEIwkcXKys8r6xyO1ClJ7BxkcGIPKwdhuNHY8OKmjXt+UVEPXDf290Lt+v+v29vb8PWyocrkeHo2POT1vq722nq2pT9NHmaHtycKodkBJmyadeI5k6nRaqovfyABkpN+14i5e3HiuwHXOgSUgSR3lCy9JfQIrJE1BnzV/DiMARrVa8fYSDDxOZZCnVCpLvbxAcZ8wzo3BtBGSVHaBkenm+Ia1H56GI8wHdN1u2/eF+5VKZay2895uQuoBnjTAuN7be6J2WyqB5GJQY9IYW8t+B6Cb3m5o/7wezz2wCgUYPGnbVCoAK50AnIGCPz/qM9go6Vzpc/IlSUq2vqrLNLAwpielSZLfzmizVlvVZ2MfOKjfVqspqdpXP0pSs20PWgYA5XJlX7UC5JUVfgcfk6IMShgJMxLsdCq+EX5WqcSoNd03a/88f597YE0j3lFEBjDlMkyYjxGVCsCaTNbObPWQ11Razn399dcaqbbUj6L8T5e9Sms2+XMU5RbZ9OCygQiqE6mLr63jQUUdSKxSKUhKnlMWN8vEv2Gys+fs6rkE1mnQ8Ciwztee+ccYHDBzYC6PrgYSA12PdGxIooVrVGZVUq0p6VWXatyd4iAdjh2kF8bqcb7enFXuCKxToDx2F+6LF17Y8lIMGwwDfzTq6lOSxMrpU/RgQ1JVKlXfi2az6b788kuvOkO3zEH6I40WGdXOJj1D2bM8RmAtmfqYQthP2Fj4x4LTE2fspUsv+IFDkI6oPVOfpkYZLAR1Otmt50cFhn5HYAVKnPCYz5uLIthYhULf203YToCE+UmelcvYTgNJqsnJ9tAs+asSXG++GRykVh6g4iClrkLB3P/pKZ9Q/rwd+Svod4/ibjMn5Ey73feefZM2Nnrb3W342ioVk0CAA1AE6ZVuaqSRo6bDYcMYiHJNDDsy04caADRlj+GOMP+W5clLxW6qrqMdt77QGXyx2wx/giixFiA+BGT09/TpE7kcNiWdjJylktlMg0FiE/X7GPXmNsGgx7jPFaqu9uCf3cruRxJPY1bIk9+++reut/G6++STL9x3393fl1QIAMD5/vs/l0otekm4QPdPtWgE1oLkRVJVKitSdURJ4Lw9ukLA2Gg8lpRruaIcu5d3/tVd+f5Xcr4ZGJ1mFe5vveYeF37qHb829WQ2FsDi8zykCKwFuAST8eKvrBQkVSwGbJaR28YGITDKSTxYuSY9h0E2Dp9Q7Fmr1ZFkKin+i6ksHL72jPYA73Hzlwv8pKUVjTbWgqTs9zHOYfwJJInmNfM7/+2Ke58nqlDTS73NP3OjtZe9ncXcaLbuXA6v/oIdP6XiwcaKwDolAs9WLeJIxnuwr8aFcgp6dJqgFtpmq+Yc5QrAiqpwCUzBbspKldmqVTkBKOdBlCnh6wx+rvSz4yfa07nP6jwCa0HK93pDGeI9DbGJMl2efgKseOtxsqYT9zc2VvZHiuln5+k8AmsBbsDkXm8kl0PXG+/4qtKDNi90Zqg/XSZkJ4Dws89uy79IAKIBFuMdd8N77/25ojFq53qEGIEVOHmiI05NG7UxWiOFuP2sfZSAbNJu6vWaKpWETFNHVWsCCH7FhYHPK5QFWEwXPQ8pAmtBLsHsEHtlIziZTX6AGEaJHOVHz8SsU67R2NMzwmsSScf9QoG4LYIR1zW/eNG7GOimPVuuyqXe00gRWAtR1dYCtlq7Ag7TNqzYQYolthYg6/dbKUmGVLMwZ1YHEb1g8VZBko3ckyePfdzWzZsvOj7ZVCh0zrUapL8RWFmuzXltITJEe/Y9SAAWiz3wyHNunnNCjpOKRyMAaesmWfaWXjhBro2Nqg+pQaIR2Yqket5SBNYCHIPhTOeUSuuqJWG+uR+sYmyix493BY6w6gaHqvOBfYCS8tlEvXjeCXEmDp4Y+ucNXBFYWa6e6DoBFcWzIKjVLuhu2ugm0sGM/Wze0Dz3WXVEVCkjwedhGif0nWMEVpoap3CO9KpWLZ4qVG9gmgRjeDZ5ZI1k3W8XALjYhoC0tsbC3elLzSbLn91VBNaCtLdAv7Q0WrDCTHHCmAnDwVGKoU9iZTYuCNQswE2r3kzxM7uMwFqQ9CxPO91k9bPiRwvBfFNIvKBCzyOo6GQElmfV+f/C4LdRpoEKQC1zCmnZFIjAWjZFT6G+rIQ6z4AKPz8CK1DiHB6zgFpE7WGTpZNJwPSd5Z5HYC1IT3a3WWY6CKYwAY0bY7Kl7HUWPOncTDvRU2aWyIe746j86bInOY/AOgnVUmU6HSaGYTqjMx7YKA3pEiQMYAnnVtSWhaHSGNkFMJkHftKNQLlpqo8daWx7TQM2dbCgA/cEiWsS5dkq88P//C/36fdNd3Oj4nYU+vxXf/Ezd/PqlhvQ+VNIEVgLENWYxhKttlwBAALpkkQgAAj8T3w4TyTMSPtx7cgjv6NJ5styJ5j7wLl2BoC4FJiDNO889eMo5dPtEhWBXwtg4c0fugcP7us87zeeC+35PvY6rnXvoRv+z2PXvll37SfaU/VtrW80TKrM8lME1gloGiQMTENSES9FiAtRCSR7PpTvidXQXYGA3QRzfmqGpfXNZsOD6fLly3KeGmgGg57K2X6jvpLUF4BSU5o/ZCebJ2rLAv1MStIHpFNO6w2vyFPPJr4F1Vv19+mjMO1uf7vrrt264G5/sed+9FLd5fH8Z1RrqsmFTyOwTkBCGIlEgGlwh5XJvR57MyBFLLHGEDuGrYlIgIIlX0gftjPa3LTdZAwU2t9QNtDTpyxOzXIb4FJP0ZeTcBMoa5JkFqLMFpk8ox4mvkejPQ9yiw8zwFUqNfd3//jXrqAyP3tX9pVur66t+zK+c6fwFYE1J1GxiQAVCWZWq3V92N25KWbjGTewERqDBGJPVCSO7VnPbjOEMZe81GIzEEATwMUxCRT0TXjwAhzapX7K44lnHy12qGF3aLpTLrMuEZBbnn6/rWvbEZBFtfWSSVPrndV9EMTh/uLHCKwFaWhSKy+jec0DRNjwiT0bms2nupc0AHBWVlYFigtePRK9AEiRYCynR5UCrKSMrSMkusHULs+kxlRmd3fX3b17VzbahhpgyyR2r0EyDt3Dh99J7fIHKCtf3/3ud5/oHEhZQsK+/fYt9WPbS9twf5nHCKwFqQlYMJxJMN+AlkizMgtSUwnpRX7AgsTifHf3qYDW1Wa6FwQAjPOgZpOCQaoFgGFDvfTSi2OJN/TRqLu7T7Rb9E0Pzm53T5KtIonZ8NIO6RWS9TmF+PBgiccIrBMQc5IxNhr05lamrjCKS99Gcjx69Mh9++233q66fftT7TDzU+1/dVMgY38HbDWLpU8Dtd1+omoMDDwvlVYFQqQUi1cLCg7cktRi3/qBpGfNq2jKt9tD7Sp4TWBLA2uo56e7GCMCK831Y85haLCxAtM5Hp0mJYOqkDpckWS55gG0sbGhpfQXvTqknhDUF9riyMdeVGCSkdEgYc2MMLHp6AL1+rdsSNo9fvzQS0PAs7W1pR2XL/o6zP6z3uZyHW+z2dXyv70tR8fv38cHElOWAoGx3AdEXAfjnXudDgF7FrTH9SzJwGiARIIFJ+n0spYvi1/6kSSk0RNXGP27a7TfdI0mAOxIepUFsFWvLukz8VzDIe8VGvlXxNRqFi1BPcf/Qch1fIoroY+hUQAUBA8fikwy1N/hLiczp3Qd4xCrI8pa3RM4OpCb0WhNr2R4y1V524ZcDoMBG+TWvBQjliu86IC9UBkxDvQqmdHIRptUx+h0WeCivqgKoUIqpQGVlkypLBOn5TLSwVTUxIMzuWDnZwYGTOvUBRw6wRerh+xPMRoljlOAlHZ3+ExL+orAShESlUQCUOl/b5AwPE/fJ29WRXHv7JLZY9ZfzpOe0G/6mv2zhN+U/V1JyZOdRWCl6AZxg8RidQy+JebxGGWRjDlm86SKPfPTAHQaTp9zHQDCKPAw0IffGPKHMlwvK0VgpSiZBg6AWl21RRDpfzn/8PR1qvjCpwAhLWVMjRmQswAKjZnjczawB0CZ5KLMbOVCW/McI7AOoRbgOQxAaXD1+4zIEh9RUt2kKkruZ8+SfFnwMHrj7a4ALC1V8F/ZFE62roPXAUw8Sf44xwOK1+WJBCdOEVhzkg7mJABg2oa3f7G1Y1WMMLdDYGAApwEUZgYbiEaDAWSSY2/vkUZqzCPaKLTbxfFZ0WiuqbqJ2QpgwN1RkUO0foSqm/xRoc40yNI56F+OvjPtM36762g0bUI8Xero8wiso+kz9WkAFyqFFcu2NxakTGw0pBpecY5B4uDQRMXa0J6pnQAuRRusbu5fc79QaMvXtC5nJ++IJk4r6QqT0SxkDao6PAnAoX+8Eo/pHM5D4mVSIRIi3ANUd+5od+Z7f3DF7/Tm2uta1a19Vd94/VUt77cRZMg7zzECax5qpfIGfgEW84AbSMAKzxKGwljz2FvojG3oASADyAxICSu4zudtcSqRDAQRAlpLLOsnKqIiNcmbYdnqKHF30C5gIUSn232qfpg+Iw/v8OGNY4ArSEz68eXvP3Gf/NOvXWGz4F789BXXVPuvvXbTreZOPu2T/Jpxt+PheArAJBgIgFqtxnh+D7uHYL/D918PgAM4BPvZPB8hNSXPbAOjAZTnBrCyAGghL4CLOrhP+AwhM4XCUB/KGPB41usBJu7zW+wZACOokMBD3vOjbJb0Iqn+Vw3NVb7jqm/dVFBqwQ3+7X/dYLwn/TjX3IcIrDlJBuP4BIlk78xh4jgntfVI6mnDuycsT6g8bZfZPQNTSdKo7220dpsgQCIbUJe8eJ2pHosoJQLC2qWsAYXRIBEOTE7z+uGQyLexse3rIS6esrzdAumYACvZZCQvwP3kvZ+7xwrx8bag8Hn177fdSh0Ha1JvqH/WIzBX+ThXOCvBArFhPHTv6R/Oq01IXD948EDqpiZG2m58QZJUKuWxCgogS5hGfBQAYLoF9dbtDiTR9IIBqSykIG0hcbiG+UhMohi43tt7qHP230okVrm8oXyAtiM7ifOiwNX0EpJ+1gWaIHX5PVa/lee5briSIl9N4vk7M3/FucKZSTWZMTDC7hK+UhCQUH+eH5JW2woxfqoYqwcCicW6k/fKlasKwHvkAVOrMTmsd1yrEOAgVAZAfvjhf7gPPvgbAaHuJQyOWeolH58vvrgt0PUU4Pel++qrO+6Xv/wHYaCrOhKXBS4K8qAeibW/d+8zSVGiXMv+mlEs+5cqHExlq3qlyo7y3FP+xLcAiN95503Fh60IgMkfYJISR19FVXg0faY+DdKBI1IGUMB41BQHQmGwn1BvSBjyEUb8m998pPcRfu1effWau3r1kpcaa2trXrqhrv74x3tiflcgWPUjQq+aUj0AnEiqy5cvuVu3/tSHxBD+jLRLJwx+1Cp9Yzq4Wi15u4rXBF+8mJdt9lTPmgJcxfePtskfEu3a7wl35j9GYM1Ps/0SEB+GbG/f2L8XToirsgUTZnBj49y69Scykq+KqT0/smNLyHa766UTdaGesJ0sJiuozFCjkwRZ9yDlDmAFZMTPZ1O6LlSTx7y3zSwnwGO6SrX4G6juZGRro8rw58nWPet1BNaslFI+GJYlOKqi2UTlZROe+zCa04pBvX5ue/uK1NC6+/TT33s1effuNwLfuiTP61oLuO1+8Yt3pdZWxkDI1peoxPQT+nRUAqzTEnYWUvXKlSteAuLcRVKFZWiMHNPvRcz+7ml1pu9F4z1NjWPOTaIktgjZxRtJmmkFgzFsjAcAfGAeUk4CR+e2QgeVhaQy9TX9RZnTWlj0HmChH/w5GIFyHAwIBBz4AQh2V+g3ebOqeVr70XifRpUT3JPtfUhKXAQwz/7xAZTYPiRUGesE7Yrrw+sLeZZ5NNCbeRX6ZpEcwcVh4AOA6ugc6VCyzFFHzJqiQPiHc8v+5fMxJFXVqZ7ST1I4hsYCgBgZzomlUIU/RmBNkGP+i0B8G5bDrGD8JnUdYwYlGQ85C22Ex4fVl86X5LGR6uEAml8ahX4cdYzAOoo6mWf8m7N2FiudzUbCbkKdAC6TBjDaJIAxL814ADg9UTYYbeQxh2iokzKhTs6TlPiyQt4ALpl1st9OB0BJ+5NnEViT9DjyKqgJwIUE4LrV6vkFpyxM4M0UwTYJedKSgvwY6DYCg9GMHAPDOaqO3B9cufSxf9Zo/cT1+tdVJ3OC1jVrtyJbDFvIBgTcox4Dq0lNcvNGDAzx9fW6fFYnj1SgrnlTBNacFAMcxkiJAZ2zJ0O9TugMwGIxg0m1IDWsesqw90LywQfF0D4kA63eXp+75Bqtd72XvNdjpPZA3nzaCRPHTP0wWsvLY98VoIhw0ERynxEmQLWYLuo1kPMnmFyNHdo8zWME1gLUlTWl2LjvXa38kZhXd3vNtyRDmCO0jToAF76s9fVt2OxbMgDB9ETaBOnGkTk9wLm2xoJUW5LVbj9SftwQSCW14OcPLewGD/poRKAhK3GKAisBejbCE+7Bvi/D97NMEVgnoHaY8mA6ZTi6KunygRioPalq5pdiygSQkPr9kQ/KwyFpNg8AM1AFkDFfyOQzIS2scMbzHiQjdQyHbX3kMFMCkOxww+YfrKgG0LQFCNnxRpE0E8nanLj1TC4isE5I5gAKpAfTNQEsMH4w2BDDDVhIElQUEZ/BTsLGsnfoEFc18GEtlLdl8wZO6gmpXt8Kp2MJBGD3PKCCw5UMLFBdX7+6nzeclEoG5HD9LI4RWAtQGeab19pGg7mcxU/V67apmoHP5gB3dhqa1iHmCRsMm+iibxlgWEgNNtRhAEhABt6oFykX5hwDCA1kyTRS+GlEQADcZ5kisOakdpr5qL+ce+jKxbsCRdm1Oj/WsSTgYISb2kJioQ7t3YQBgEUf7UDTQeUFcMzSHfJizBM9QfhLOk2rx+ysdK7TP4/AmpPGk4zTtkNdbRMpXxaGc0+GM4b0YJCoveGQ/UAvaLjPiNH2G6XJUE84cu+wFGy69HNsKqTXLOXT5Z7VeQTWnJSGyelULm9Lelz3kieXM//WkyeoHuYDkSwVuSNO+jJL4r36ss92BE4LDKRtbDTGBtYXGyly/zylCKwFuWELOyftl81NjG27h6rL5RJ/1bzNUXYwwAXBYCC0Eza6ZdBwfN3ZfU3n7cNJ8kdgnYRqqTIWjWAjwNRtnXoH0vjWtOeTuQ+7KpcLUqMvTFF5GPonr/ew9pZ1PwJrWZQ8pXrMjjq/ADrsZ08aDIflivcjBeakgLf8zuvIYs7fErOfEwp4u1J9CRbhOelW7Mb/Bwr8H3Tniqifp8RMAAAAAElFTkSuQmCC
diff --git a/requirements.txt b/requirements.txt
index 545fefe78..9f8c34307 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,3 +1,3 @@
compas >= 2.3, < 3
-compas_robots >= 1, < 2
+compas_robots @ git+https://github.com/compas-dev/compas_robots.git@tool-base-frame
roslibpy >=2
diff --git a/scripts/generate_robot_cell_gltf_snapshots.py b/scripts/generate_robot_cell_gltf_snapshots.py
new file mode 100644
index 000000000..91f7e207c
--- /dev/null
+++ b/scripts/generate_robot_cell_gltf_snapshots.py
@@ -0,0 +1,656 @@
+#!/usr/bin/env python3
+"""Generate headless glTF snapshots of solved robot-cell states.
+
+By default this creates four snapshots of the built-in UR10e cell: analytical
+and PyBullet IK, each with equivalent cones authored along positive Z and
+positive X. Their matching base frames normalize both source orientations to
+the same flange-relative tool. The cone includes a one-sided perpendicular
+marker that makes this normalization visible.
+
+Examples
+--------
+Generate the four local snapshots as single-file binary glTF artifacts::
+
+ python scripts/generate_robot_cell_gltf_snapshots.py
+
+Generate embedded JSON glTF files instead::
+
+ python scripts/generate_robot_cell_gltf_snapshots.py --format gltf
+
+Generate every requested local RobotCellLibrary scenario::
+
+ python scripts/generate_robot_cell_gltf_snapshots.py --cells all
+
+Select only cells that already contain an end effector::
+
+ python scripts/generate_robot_cell_gltf_snapshots.py \
+ --cells built-in-end-effectors --solvers pybullet
+
+Load the robot description and geometry from ROS and solve with MoveIt::
+
+ python scripts/generate_robot_cell_gltf_snapshots.py \
+ --solvers ros --ros-host localhost --ros-port 9090
+
+The ROS instance is expected to expose a robot description, semantic
+description, geometry, MoveIt planning scene, and IK service.
+"""
+
+from __future__ import annotations
+
+import argparse
+import json
+import math
+from dataclasses import dataclass
+from pathlib import Path
+from typing import Iterable
+from typing import Optional
+
+import compas
+import compas_robots
+from compas.colors import Color
+from compas.datastructures import Mesh
+from compas.files import GLTF
+from compas.files import GLTFContent
+from compas.geometry import Cone
+from compas.geometry import Cylinder
+from compas.geometry import Frame
+from compas.geometry import Plane
+from compas.geometry import Rotation
+from compas.geometry import Sphere
+from compas.geometry import Transformation
+from compas.geometry import angle_vectors
+from compas.geometry import distance_point_point
+from compas_robots import Configuration
+from compas_robots import ToolModel
+from compas_robots.model import LinkGeometry
+
+import compas_fab
+from compas_fab.backends import ABB_IRB4600_40_255Kinematics
+from compas_fab.backends import AnalyticalKinematicsPlanner
+from compas_fab.backends import MoveItPlanner
+from compas_fab.backends import PyBulletClient
+from compas_fab.backends import PyBulletPlanner
+from compas_fab.backends import RosClient
+from compas_fab.backends import UR5Kinematics
+from compas_fab.backends import UR10eKinematics
+from compas_fab.robots import FrameTarget
+from compas_fab.robots import RobotCell
+from compas_fab.robots import RobotCellLibrary
+from compas_fab.robots import RobotCellState
+from compas_fab.robots import TargetMode
+
+TOOL_ID = "snapshot_cone"
+TOOL_LENGTH = 0.15
+TOOL_RADIUS = 0.03
+MARKER_LENGTH = 0.06
+MARKER_RADIUS = 0.006
+TARGET_AXIS_LENGTH = 0.08
+TARGET_AXIS_RADIUS = 0.003
+TARGET_ORIGIN_RADIUS = 0.007
+ROBOT_COLOR = Color(0.72, 0.76, 0.82)
+TOOL_COLOR = Color(1.0, 0.36, 0.05)
+MARKER_COLOR = Color(0.0, 0.72, 0.82)
+RIGID_BODY_COLOR = Color(0.55, 0.58, 0.62)
+TARGET_ORIGIN_COLOR = Color(1.0, 0.85, 0.0)
+TARGET_AXIS_COLORS = (Color(1.0, 0.1, 0.1), Color(0.1, 0.8, 0.1), Color(0.1, 0.3, 1.0))
+REFERENCE_DELTAS = (0.35, -0.65, 0.8, -0.55, 0.45, 0.25, -0.3)
+
+
+@dataclass(frozen=True)
+class LocalCellSpec:
+ """Describe how a RobotCellLibrary scenario supplies its end effector."""
+
+ end_effector: str
+ analytical_solver: object = None
+
+
+LOCAL_CELL_SPECS = {
+ "ur5": LocalCellSpec("generated_cone", UR5Kinematics),
+ "ur10e": LocalCellSpec("generated_cone", UR10eKinematics),
+ "ur5_cone_tool": LocalCellSpec("built_in_tool", UR5Kinematics),
+ "ur5_gripper_one_beam": LocalCellSpec("built_in_tool", UR5Kinematics),
+ "ur10e_gripper_one_beam": LocalCellSpec("built_in_tool", UR10eKinematics),
+ "abb_irb4600_40_255": LocalCellSpec("generated_cone", ABB_IRB4600_40_255Kinematics),
+ "abb_irb4600_40_255_gripper_one_beam": LocalCellSpec("built_in_tool", ABB_IRB4600_40_255Kinematics),
+ "abb_irb4600_40_255_printing_tool": LocalCellSpec("built_in_tool", ABB_IRB4600_40_255Kinematics),
+ "panda": LocalCellSpec("robot"),
+}
+GENERATED_CONE_CELLS = tuple(name for name, spec in LOCAL_CELL_SPECS.items() if spec.end_effector == "generated_cone")
+BUILT_IN_END_EFFECTOR_CELLS = tuple(name for name, spec in LOCAL_CELL_SPECS.items() if spec.end_effector != "generated_cone")
+CELL_PRESETS = {
+ "all": tuple(LOCAL_CELL_SPECS),
+ "generated-cones": GENERATED_CONE_CELLS,
+ "built-in-end-effectors": BUILT_IN_END_EFFECTOR_CELLS,
+}
+
+
+def create_cone_tool(axis: str) -> ToolModel:
+ """Create equivalent tools authored along +Z or +X before base reframing."""
+ if axis == "z":
+ authored_frame = Frame.worldXY()
+ authored_tcf = Frame([0.0, 0.0, TOOL_LENGTH], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0])
+ marker_frame = Frame([MARKER_LENGTH / 2.0, 0.0, TOOL_LENGTH * 0.75], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0])
+ base_frame = Frame.worldXY()
+ elif axis == "x":
+ authored_frame = Frame.worldYZ()
+ authored_tcf = Frame([TOOL_LENGTH, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0])
+ # The +X-authored equivalent of the +Z tool's one-sided +X marker is
+ # +Y in source coordinates. Both normalize to tool-base +X.
+ marker_frame = Frame([TOOL_LENGTH * 0.75, MARKER_LENGTH / 2.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0])
+ base_frame = Frame.worldYZ()
+ else:
+ raise ValueError("Cone axis must be 'x' or 'z'.")
+
+ cone_mesh = Mesh.from_shape(Cone(TOOL_RADIUS, TOOL_LENGTH, authored_frame), u=24)
+ marker_mesh = Mesh.from_shape(Cylinder(MARKER_RADIUS, MARKER_LENGTH, marker_frame), u=16)
+ cone_mesh.vertices_attribute("vertex_color", list(TOOL_COLOR.rgba))
+ marker_mesh.vertices_attribute("vertex_color", list(MARKER_COLOR.rgba))
+ cone_mesh.join(marker_mesh)
+
+ return ToolModel(cone_mesh, authored_tcf, name="cone_{}".format(axis), base_frame=base_frame)
+
+
+def add_and_attach_tool(robot_cell: RobotCell, axis: str) -> RobotCellState:
+ """Add the requested cone and return a complete state with it attached."""
+ robot_cell.tool_models[TOOL_ID] = create_cone_tool(axis)
+ state = robot_cell.default_cell_state()
+ state.set_tool_attached_to_group(TOOL_ID, robot_cell.main_group_name)
+ return state
+
+
+def target_mode_for_spec(spec: LocalCellSpec) -> TargetMode:
+ return TargetMode.ROBOT if spec.end_effector == "robot" else TargetMode.TOOL
+
+
+def reachable_target_frame(robot_cell: RobotCell, state: RobotCellState, target_mode: TargetMode) -> Frame:
+ """Create a deterministic, reachable target from a non-singular reference state."""
+ reference_state = state.copy()
+ reference_configuration = reference_state.robot_configuration
+ joints = robot_cell.get_configurable_joints(robot_cell.main_group_name)
+
+ for index, joint in enumerate(joints):
+ value = float(reference_configuration[joint.name]) + REFERENCE_DELTAS[index % len(REFERENCE_DELTAS)]
+ if joint.limit:
+ span = float(joint.limit.upper) - float(joint.limit.lower)
+ margin = min(0.05, max(1e-6, span * 0.01))
+ value = max(float(joint.limit.lower) + margin, min(float(joint.limit.upper) - margin, value))
+ reference_configuration[joint.name] = value
+
+ return robot_cell.forward_kinematics_target_frame(reference_state, target_mode)
+
+
+def cyclic_distance_from_start(configuration: Configuration, start: Configuration) -> float:
+ """Score a revolute configuration by its shortest angular distance from start."""
+ start_by_name = dict(zip(start.joint_names, start.joint_values))
+ score = 0.0
+ for name, value in zip(configuration.joint_names, configuration.joint_values):
+ delta = value - start_by_name.get(name, 0.0)
+ shortest_delta = math.atan2(math.sin(delta), math.cos(delta))
+ score += shortest_delta * shortest_delta
+ return score
+
+
+def solve_analytical(robot_cell: RobotCell, state: RobotCellState, target: FrameTarget, solver_class) -> RobotCellState:
+ """Solve with the cell's analytical IK implementation and update the state."""
+ planner = AnalyticalKinematicsPlanner(solver_class())
+ planner.set_robot_cell(robot_cell)
+ solutions = list(planner.iter_inverse_kinematics(target, state))
+ if not solutions:
+ raise RuntimeError("Analytical IK returned no solution.")
+ state.robot_configuration = min(solutions, key=lambda solution: cyclic_distance_from_start(solution, state.robot_configuration))
+ planner.set_robot_cell_state(state)
+ return state
+
+
+def solve_pybullet(robot_cell: RobotCell, state: RobotCellState, target: FrameTarget) -> tuple[RobotCellState, Frame]:
+ """Solve with PyBullet IK and return both the state and backend FK frame."""
+ with PyBulletClient(connection_type="direct") as client:
+ planner = PyBulletPlanner(client)
+ planner.set_robot_cell(robot_cell, state)
+ state.robot_configuration = planner.inverse_kinematics(
+ target,
+ state,
+ options={
+ "check_collision": False,
+ "max_descend_iterations": 200,
+ "max_results": 10,
+ },
+ )
+ planner.set_robot_cell_state(state)
+ backend_frame = planner.forward_kinematics(state, target.target_mode)
+ return state, backend_frame
+
+
+def solve_moveit(planner: MoveItPlanner, robot_cell: RobotCell, state: RobotCellState, target: FrameTarget) -> RobotCellState:
+ """Synchronize the ROS planning scene, solve with MoveIt, and update it."""
+ planner.set_robot_cell(robot_cell, state)
+ state.robot_configuration = planner.inverse_kinematics(
+ target,
+ state,
+ options={"check_collision": False, "max_results": 1},
+ )
+ planner.set_robot_cell_state(state)
+ return state
+
+
+def frame_data(frame: Frame) -> dict:
+ """Return a JSON-safe representation of a frame."""
+ return {
+ "point": list(frame.point),
+ "xaxis": list(frame.xaxis),
+ "yaxis": list(frame.yaxis),
+ "zaxis": list(frame.zaxis),
+ }
+
+
+def validate_solution(
+ robot_cell: RobotCell,
+ state: RobotCellState,
+ target_frame: Frame,
+ target_mode: TargetMode,
+ backend_frame: Optional[Frame] = None,
+ tolerance: float = 2e-3,
+) -> dict:
+ """Validate the solved end-effector frame and return error metrics."""
+ model_frame = robot_cell.forward_kinematics_target_frame(state, target_mode)
+ solver_frame = backend_frame or model_frame
+ solver_position_error = distance_point_point(solver_frame.point, target_frame.point)
+ solver_orientation_error = max(
+ angle_vectors(solver_frame.xaxis, target_frame.xaxis),
+ angle_vectors(solver_frame.yaxis, target_frame.yaxis),
+ angle_vectors(solver_frame.zaxis, target_frame.zaxis),
+ )
+ if solver_position_error > tolerance or solver_orientation_error > tolerance:
+ raise RuntimeError("Solver FK misses target: position error={:.6g} m, orientation error={:.6g} rad".format(solver_position_error, solver_orientation_error))
+
+ model_position_error = distance_point_point(model_frame.point, target_frame.point)
+ model_orientation_error = max(
+ angle_vectors(model_frame.xaxis, target_frame.xaxis),
+ angle_vectors(model_frame.yaxis, target_frame.yaxis),
+ angle_vectors(model_frame.zaxis, target_frame.zaxis),
+ )
+ return {
+ "solver_frame": frame_data(solver_frame),
+ "solver_position_error_m": solver_position_error,
+ "solver_orientation_error_rad": solver_orientation_error,
+ "model_frame": frame_data(model_frame),
+ "model_position_error_m": model_position_error,
+ "model_orientation_error_rad": model_orientation_error,
+ "backend_model_position_delta_m": distance_point_point(model_frame.point, solver_frame.point),
+ "model_matches_target": model_position_error <= tolerance and model_orientation_error <= tolerance,
+ }
+
+
+def color_rgba(mesh: Mesh, item, fallback: Color) -> list[float]:
+ """Resolve an imported mesh/URDF material color with a stable fallback."""
+ diffuse = mesh.attributes.get("mesh_color.diffuse")
+ if diffuse:
+ rgba = list(diffuse)
+ else:
+ item_color = item.get_color() if hasattr(item, "get_color") else None
+ rgba = list(item_color.rgba if item_color else fallback.rgba)
+ if len(rgba) == 3:
+ rgba.append(1.0)
+ return rgba[:4]
+
+
+def prepared_mesh(mesh: Mesh, transformation: Transformation, rgba: Iterable[float]) -> Mesh:
+ """Bake a pose into a triangulated mesh and add glTF color and normal data."""
+ posed = mesh.transformed(transformation)
+ source_colors = posed.vertices_attribute("vertex_color")
+ vertices, faces = posed.to_vertices_and_faces(triangulated=True)
+ result = Mesh.from_vertices_and_faces(vertices, faces)
+ fallback_color = list(rgba)
+ for index, vertex in enumerate(result.vertices()):
+ vertex_color = source_colors[index] if source_colors[index] is not None else fallback_color
+ result.vertex_attribute(vertex, "vertex_color", list(vertex_color))
+ if any(face is not None for face in result.vertex_faces(vertex)):
+ normal = list(result.vertex_normal(vertex))
+ else:
+ # Some imported CAD meshes retain vertices that no face references.
+ normal = [0.0, 0.0, 1.0]
+ result.vertex_attribute(vertex, "vertex_normal", normal)
+ return result
+
+
+def link_transformations(model, configuration: Optional[Configuration]) -> dict[str, Transformation]:
+ """Return each model link's transform relative to its model base."""
+ configuration = configuration or model.zero_configuration()
+ transformations = {model.root.name: Transformation()}
+ frames = model.transformed_frames(configuration)
+ for joint, frame in zip(model.iter_joints(), frames):
+ transformations[joint.child_link.name] = Transformation.from_frame(frame)
+ return transformations
+
+
+def add_model_to_gltf(parent, model, configuration: Optional[Configuration], base_frame: Frame, fallback_color: Color) -> dict:
+ """Add a posed RobotModel or ToolModel below a glTF node."""
+ counts = {"links": 0, "meshes": 0, "vertices": 0, "faces": 0}
+ world_from_model = Transformation.from_frame(base_frame)
+ transforms = link_transformations(model, configuration)
+
+ for link in model.iter_links():
+ link_node = parent.add_child(link.name, {"kind": "link"})
+ counts["links"] += 1
+ world_from_link = world_from_model * transforms[link.name]
+ for item_index, item in enumerate(link.visual):
+ meshes = LinkGeometry._get_item_meshes(item) or []
+ world_from_geometry = world_from_link
+ if item.origin:
+ world_from_geometry = world_from_geometry * Transformation.from_frame(item.origin)
+ for mesh_index, mesh in enumerate(meshes):
+ name = item.name or "visual_{}".format(item_index)
+ mesh_name = "{}.{}.{}".format(link.name, name, mesh_index)
+ mesh_node = link_node.add_child(mesh_name, {"kind": "visual_mesh"})
+ gltf_mesh = prepared_mesh(mesh, world_from_geometry, color_rgba(mesh, item, fallback_color))
+ mesh_data = mesh_node.add_mesh(gltf_mesh)
+ mesh_data.mesh_name = mesh_name
+ counts["meshes"] += 1
+ counts["vertices"] += gltf_mesh.number_of_vertices()
+ counts["faces"] += gltf_mesh.number_of_faces()
+ return counts
+
+
+def merge_counts(total: dict, addition: dict) -> None:
+ for key, value in addition.items():
+ total[key] = total.get(key, 0) + value
+
+
+def add_target_frame_to_gltf(parent, target_frame: Frame) -> dict:
+ """Add a yellow origin and RGB positive axes at the requested target frame."""
+ counts = {"links": 0, "meshes": 0, "vertices": 0, "faces": 0}
+ target_node = parent.add_child("target_frame", {"kind": "target_frame", "frame": frame_data(target_frame)})
+ marker_meshes = [("origin", Mesh.from_shape(Sphere(TARGET_ORIGIN_RADIUS, point=target_frame.point), u=12, v=8), TARGET_ORIGIN_COLOR)]
+
+ for name, axis, color in zip(("x_axis", "y_axis", "z_axis"), (target_frame.xaxis, target_frame.yaxis, target_frame.zaxis), TARGET_AXIS_COLORS):
+ center = target_frame.point + axis * (TARGET_AXIS_LENGTH / 2.0)
+ axis_frame = Frame.from_plane(Plane(center, axis))
+ axis_mesh = Mesh.from_shape(Cylinder(TARGET_AXIS_RADIUS, TARGET_AXIS_LENGTH, axis_frame), u=12)
+ marker_meshes.append((name, axis_mesh, color))
+
+ for name, mesh, color in marker_meshes:
+ mesh_node = target_node.add_child(name, {"kind": "target_marker"})
+ gltf_mesh = prepared_mesh(mesh, Transformation(), color.rgba)
+ mesh_data = mesh_node.add_mesh(gltf_mesh)
+ mesh_data.mesh_name = "target_frame.{}".format(name)
+ counts["meshes"] += 1
+ counts["vertices"] += gltf_mesh.number_of_vertices()
+ counts["faces"] += gltf_mesh.number_of_faces()
+ return counts
+
+
+def export_snapshot(filepath: Path, scenario: str, robot_cell: RobotCell, state: RobotCellState, target_frame: Frame, metadata: dict) -> dict:
+ """Bake a RobotCellState into a colored, hierarchical glTF artifact."""
+ state = robot_cell.compute_attach_objects_frames(state)
+ content = GLTFContent()
+ scene = content.add_scene(scenario, {"generator": "compas_fab robot-cell snapshot"})
+ root = scene.add_child(scenario, metadata)
+
+ # glTF viewers assume Y-up; COMPAS robot cells are Z-up.
+ root.matrix = Rotation.from_axis_and_angle([1.0, 0.0, 0.0], -math.pi / 2.0).matrix
+
+ counts = {"links": 0, "meshes": 0, "vertices": 0, "faces": 0}
+ robot_node = root.add_child(robot_cell.robot_model.name, {"kind": "robot"})
+ merge_counts(
+ counts,
+ add_model_to_gltf(robot_node, robot_cell.robot_model, state.robot_configuration, state.robot_base_frame, ROBOT_COLOR),
+ )
+ merge_counts(counts, add_target_frame_to_gltf(root, target_frame))
+
+ tools_node = root.add_child("tools", {"kind": "tool_collection"})
+ for tool_id, tool_model in robot_cell.tool_models.items():
+ tool_state = state.tool_states[tool_id]
+ if tool_state.is_hidden:
+ continue
+ tool_node = tools_node.add_child(tool_id, {"kind": "tool", "attached_to_group": tool_state.attached_to_group})
+ merge_counts(counts, add_model_to_gltf(tool_node, tool_model, tool_state.configuration, tool_state.frame, TOOL_COLOR))
+
+ bodies_node = root.add_child("rigid_bodies", {"kind": "rigid_body_collection"})
+ for body_id, body in robot_cell.rigid_body_models.items():
+ body_state = state.rigid_body_states[body_id]
+ if body_state.is_hidden:
+ continue
+ body_node = bodies_node.add_child(body_id, {"kind": "rigid_body"})
+ transformation = Transformation.from_frame(body_state.frame)
+ for index, mesh in enumerate(body.visual_meshes_in_meters):
+ mesh_name = "{}.visual.{}".format(body_id, index)
+ mesh_node = body_node.add_child(mesh_name, {"kind": "visual_mesh"})
+ gltf_mesh = prepared_mesh(mesh, transformation, RIGID_BODY_COLOR.rgba)
+ mesh_data = mesh_node.add_mesh(gltf_mesh)
+ mesh_data.mesh_name = mesh_name
+ counts["meshes"] += 1
+ counts["vertices"] += gltf_mesh.number_of_vertices()
+ counts["faces"] += gltf_mesh.number_of_faces()
+
+ filepath.parent.mkdir(parents=True, exist_ok=True)
+ gltf = GLTF(str(filepath))
+ gltf.content = content
+ gltf.export(embed_data=True)
+
+ # Parse the artifact again so a corrupt or unsupported export fails the run.
+ exported = GLTF(str(filepath))
+ exported.read()
+ if len(exported.content.meshes) != counts["meshes"]:
+ raise RuntimeError("glTF round-trip mesh count does not match the exported cell.")
+
+ counts["nodes"] = len(exported.content.nodes)
+ counts["bytes"] = filepath.stat().st_size
+ return counts
+
+
+def scenario_metadata(
+ scenario: str,
+ solver: str,
+ cell_factory: str,
+ axis: Optional[str],
+ end_effector: str,
+ target_mode: TargetMode,
+ target_frame: Frame,
+ robot_cell: RobotCell,
+ state: RobotCellState,
+ validation: dict,
+) -> dict:
+ configuration = state.robot_configuration
+ return {
+ "scenario": scenario,
+ "solver": solver,
+ "cell_factory": cell_factory,
+ "end_effector": end_effector,
+ "cone_axis": "+{}".format(axis.upper()) if axis else None,
+ "authored_cone_axis": "+{}".format(axis.upper()) if axis else None,
+ "mounted_cone_axis": "+Z" if axis else None,
+ "robot": robot_cell.robot_model.name,
+ "group": robot_cell.main_group_name,
+ "target_mode": target_mode.name,
+ "target_frame": frame_data(target_frame),
+ "attached_tool": state.get_attached_tool_id(robot_cell.main_group_name),
+ "joint_names": list(configuration.joint_names),
+ "joint_values": list(configuration.joint_values),
+ "validation": validation,
+ "coordinate_system": {"source_up_axis": "+Z", "gltf_up_axis": "+Y"},
+ }
+
+
+def generate_local_scenario(cell_factory: str, solver: str, axis: Optional[str], output_dir: Path, extension: str) -> dict:
+ spec = LOCAL_CELL_SPECS[cell_factory]
+ robot_cell, state = getattr(RobotCellLibrary, cell_factory)(load_geometry=True)
+
+ if spec.end_effector == "generated_cone":
+ if not axis:
+ raise ValueError("Generated-cone scenarios require an axis.")
+ state = add_and_attach_tool(robot_cell, axis)
+ scenario_suffix = "cone_{}".format(axis)
+ elif spec.end_effector == "built_in_tool":
+ tool_id = state.get_attached_tool_id(robot_cell.main_group_name)
+ if not tool_id:
+ raise RuntimeError("RobotCellLibrary.{} did not return its built-in tool attached.".format(cell_factory))
+ scenario_suffix = "built_in_{}".format(tool_id)
+ else:
+ scenario_suffix = "robot_end_effector"
+
+ target_mode = target_mode_for_spec(spec)
+ target_frame = reachable_target_frame(robot_cell, state, target_mode)
+ target = FrameTarget(target_frame, target_mode)
+ backend_frame = None
+ if solver == "analytical":
+ state = solve_analytical(robot_cell, state, target, spec.analytical_solver)
+ elif solver == "pybullet":
+ state, backend_frame = solve_pybullet(robot_cell, state, target)
+ else:
+ raise ValueError("Unknown local solver: {}".format(solver))
+
+ validation = validate_solution(robot_cell, state, target_frame, target_mode, backend_frame=backend_frame)
+ scenario = "{}_{}_{}".format(cell_factory, solver, scenario_suffix)
+ metadata = scenario_metadata(
+ scenario,
+ solver,
+ cell_factory,
+ axis,
+ spec.end_effector,
+ target_mode,
+ target_frame,
+ robot_cell,
+ state,
+ validation,
+ )
+ filepath = output_dir / "{}.{}".format(scenario, extension)
+ counts = export_snapshot(filepath, scenario, robot_cell, state, target_frame, metadata)
+ return {"artifact": filepath.name, "metadata": metadata, "geometry": counts}
+
+
+def generate_ros_scenarios(args, output_dir: Path, extension: str) -> list[dict]:
+ client_kwargs = {"host": args.ros_host, "port": args.ros_port, "is_secure": args.ros_secure}
+ with RosClient(**client_kwargs) as client:
+ robot_cell = client.load_robot_cell(
+ load_geometry=True,
+ local_cache_directory=args.ros_cache,
+ http_file_server_base_url=args.ros_http_file_server,
+ )
+ planner = MoveItPlanner(client)
+ results = []
+ for axis in args.axes:
+ state = add_and_attach_tool(robot_cell, axis)
+ target_frame = reachable_target_frame(robot_cell, state, TargetMode.TOOL)
+ target = FrameTarget(target_frame, TargetMode.TOOL)
+ state = solve_moveit(planner, robot_cell, state, target)
+ validation = validate_solution(robot_cell, state, target_frame, TargetMode.TOOL)
+ safe_robot_name = robot_cell.robot_model.name.replace("/", "_").replace(" ", "_")
+ scenario = "{}_ros_moveit_cone_{}".format(safe_robot_name, axis)
+ metadata = scenario_metadata(
+ scenario,
+ "ros_moveit",
+ "ros",
+ axis,
+ "generated_cone",
+ TargetMode.TOOL,
+ target_frame,
+ robot_cell,
+ state,
+ validation,
+ )
+ filepath = output_dir / "{}.{}".format(scenario, extension)
+ counts = export_snapshot(filepath, scenario, robot_cell, state, target_frame, metadata)
+ results.append({"artifact": filepath.name, "metadata": metadata, "geometry": counts})
+ return results
+
+
+def parse_args() -> argparse.Namespace:
+ parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
+ parser.add_argument(
+ "--solvers",
+ nargs="+",
+ choices=("analytical", "pybullet", "ros"),
+ default=("analytical", "pybullet"),
+ help="IK backends to snapshot (default: analytical pybullet). 'ros' uses MoveIt.",
+ )
+ parser.add_argument(
+ "--cells",
+ nargs="+",
+ choices=tuple(LOCAL_CELL_SPECS) + tuple(CELL_PRESETS),
+ default=("ur10e",),
+ help="Local RobotCellLibrary factories or presets (default: ur10e). Ignored by ROS scenarios.",
+ )
+ parser.add_argument("--axes", nargs="+", choices=("z", "x"), default=("z", "x"), help="Cone mounting axes (default: z x).")
+ parser.add_argument("--format", choices=("glb", "gltf"), default="glb", help="Single-file glTF format (default: glb).")
+ parser.add_argument("--output-dir", type=Path, default=Path("temp/robot_cell_snapshots"), help="Artifact directory.")
+ parser.add_argument("--ros-host", default="localhost", help="rosbridge host (ROS scenarios only).")
+ parser.add_argument("--ros-port", type=int, default=9090, help="rosbridge port (ROS scenarios only).")
+ parser.add_argument("--ros-secure", action="store_true", help="Use a secure rosbridge WebSocket.")
+ parser.add_argument("--ros-cache", help="Robot-specific local geometry cache directory.")
+ parser.add_argument("--ros-http-file-server", help="ROS 2 HTTP file-server base URL used to resolve package meshes.")
+ return parser.parse_args()
+
+
+def expand_cells(values: Iterable[str]) -> list[str]:
+ """Expand cell presets while retaining order and removing duplicates."""
+ expanded = []
+ for value in values:
+ names = CELL_PRESETS.get(value, (value,))
+ for name in names:
+ if name not in expanded:
+ expanded.append(name)
+ return expanded
+
+
+def print_result(output_dir: Path, result: dict) -> None:
+ geometry = result["geometry"]
+ print(
+ "Generated {} ({} meshes, {} vertices, {:.1f} KiB)".format(
+ output_dir / result["artifact"],
+ geometry["meshes"],
+ geometry["vertices"],
+ geometry["bytes"] / 1024.0,
+ )
+ )
+ validation = result["metadata"]["validation"]
+ if not validation["model_matches_target"]:
+ print(" Warning: RobotModel FK differs from solver FK by {:.3f} mm at the target.".format(validation["backend_model_position_delta_m"] * 1000.0))
+
+
+def main() -> None:
+ args = parse_args()
+ output_dir = args.output_dir.resolve()
+ results = []
+ skipped = []
+ local_cells = expand_cells(args.cells)
+
+ for solver in args.solvers:
+ if solver == "ros":
+ solver_results = generate_ros_scenarios(args, output_dir, args.format)
+ results.extend(solver_results)
+ for result in solver_results:
+ print_result(output_dir, result)
+ continue
+ for cell_factory in local_cells:
+ spec = LOCAL_CELL_SPECS[cell_factory]
+ if solver == "analytical" and not spec.analytical_solver:
+ skip = {
+ "cell_factory": cell_factory,
+ "solver": solver,
+ "reason": "No analytical kinematics solver is available for this robot.",
+ }
+ skipped.append(skip)
+ print("Skipped {} with {}: {}".format(cell_factory, solver, skip["reason"]))
+ continue
+ axes = args.axes if spec.end_effector == "generated_cone" else (None,)
+ for axis in axes:
+ result = generate_local_scenario(cell_factory, solver, axis, output_dir, args.format)
+ results.append(result)
+ print_result(output_dir, result)
+
+ manifest = {
+ "versions": {
+ "compas": compas.__version__,
+ "compas_fab": compas_fab.__version__,
+ "compas_robots": compas_robots.__version__,
+ },
+ "results": results,
+ "skipped": skipped,
+ }
+ manifest_path = output_dir / "manifest.json"
+ manifest_path.write_text(json.dumps(manifest, indent=2, sort_keys=True) + "\n")
+ print("Generated manifest {}".format(manifest_path))
+
+
+if __name__ == "__main__":
+ main()
diff --git a/src/compas_fab/backends/kinematics/backend_features/analytical_forward_kinematics.py b/src/compas_fab/backends/kinematics/backend_features/analytical_forward_kinematics.py
index 867bf279e..b188696b4 100644
--- a/src/compas_fab/backends/kinematics/backend_features/analytical_forward_kinematics.py
+++ b/src/compas_fab/backends/kinematics/backend_features/analytical_forward_kinematics.py
@@ -2,6 +2,7 @@
from typing import Optional
from compas.geometry import Frame
+from compas.geometry import Transformation
from compas_fab.backends.interfaces import ForwardKinematics
from compas_fab.robots import RobotCell
@@ -44,6 +45,13 @@ def forward_kinematics(
joint_values = robot_cell_state.robot_configuration.joint_values
pcf_frame = planner.kinematics_solver.forward(joint_values)
+ # The solver's own end frame is not necessarily the end effector link of the URDF
+ # model: the UR solvers, for one, end at the flange while the planning group ends
+ # at `tool0`. `flange_frame` states that offset, so apply it to land on the PCF.
+ flange_frame = planner.kinematics_solver.flange_frame
+ if flange_frame is not None:
+ pcf_frame = Frame.from_transformation(Transformation.from_frame(pcf_frame) * Transformation.from_frame(flange_frame))
+
target_frame = robot_cell.pcf_to_target_frames(robot_cell_state, pcf_frame, target_mode, robot_cell.main_group_name)
# Scale the frame to user units
diff --git a/src/compas_fab/backends/kinematics/backend_features/analytical_inverse_kinematics.py b/src/compas_fab/backends/kinematics/backend_features/analytical_inverse_kinematics.py
index 5f131f460..bada64408 100644
--- a/src/compas_fab/backends/kinematics/backend_features/analytical_inverse_kinematics.py
+++ b/src/compas_fab/backends/kinematics/backend_features/analytical_inverse_kinematics.py
@@ -3,6 +3,7 @@
from typing import Optional
from compas.geometry import Frame
+from compas.geometry import Transformation
from compas_robots import Configuration
from compas_fab.backends.exceptions import BackendTargetNotSupportedError
@@ -139,6 +140,12 @@ def inverse_kinematics_ordered(self, frame_WCF: Frame, group: Optional[str] = No
keep_order = options.get("keep_order", False)
+ # The target is a PCF, i.e. at the end effector link of the URDF model, but the
+ # solver ends at its own frame -- the UR solvers, for one, end at the flange while
+ # the planning group ends at `tool0`. Take that offset back out before solving.
+ if solver.flange_frame is not None:
+ frame_WCF = Frame.from_transformation(Transformation.from_frame(frame_WCF) * Transformation.from_frame(solver.flange_frame).inverted())
+
# convert the frame WCF to RCF
if solver.base_frame is not None:
frame_RCF = solver.base_frame.to_local_coordinates(frame_WCF)
diff --git a/src/compas_fab/backends/kinematics/solvers/offset_wrist_kinematics.py b/src/compas_fab/backends/kinematics/solvers/offset_wrist_kinematics.py
index 6ece5e979..be4d14e63 100644
--- a/src/compas_fab/backends/kinematics/solvers/offset_wrist_kinematics.py
+++ b/src/compas_fab/backends/kinematics/solvers/offset_wrist_kinematics.py
@@ -66,8 +66,15 @@
class OffsetWristKinematics(AnalyticalKinematics):
""" """
- def __init__(self, params):
- super(OffsetWristKinematics, self).__init__()
+ def __init__(self, params, flange_frame=None):
+ # The DH chain of an offset wrist ends at the robot's flange, whose x+ points away
+ # from the last link (ROS REP 199). The UR models this solver is used with end their
+ # planning group at `tool0` instead, whose z+ does. Without stating that fixed
+ # rotation, the solver and the URDF model disagree on the orientation of the end
+ # effector, and every target is interpreted rotated.
+ if flange_frame is None:
+ flange_frame = Frame([0.0, 0.0, 0.0], [0.0, -1.0, 0.0], [0.0, 0.0, -1.0])
+ super(OffsetWristKinematics, self).__init__(flange_frame=flange_frame)
self.params = params
def forward(self, joint_values: list[float]) -> Frame:
diff --git a/src/compas_fab/backends/pybullet/backend_features/pybullet_set_robot_cell_state.py b/src/compas_fab/backends/pybullet/backend_features/pybullet_set_robot_cell_state.py
index 544565a9d..95b40ea63 100644
--- a/src/compas_fab/backends/pybullet/backend_features/pybullet_set_robot_cell_state.py
+++ b/src/compas_fab/backends/pybullet/backend_features/pybullet_set_robot_cell_state.py
@@ -89,7 +89,7 @@ def set_robot_cell_state(self, robot_cell_state: RobotCellState):
if not robot_cell_state.robot_configuration:
continue
# If tool is attached to a group, update the tool's base frame using the group's FK frame
- link_name = client.robot_cell.get_link_names(tool_state.attached_to_group)[-1]
+ link_name = client.robot_cell.get_end_effector_link_name(tool_state.attached_to_group)
_robot_configuration = robot_cell_state.robot_configuration
# Get PCF of the Robot
pcf_link_id = client.robot_link_puids[link_name]
diff --git a/src/compas_fab/backends/ros/backend_features/move_it_inverse_kinematics.py b/src/compas_fab/backends/ros/backend_features/move_it_inverse_kinematics.py
index ad4bacac9..a473d7b49 100644
--- a/src/compas_fab/backends/ros/backend_features/move_it_inverse_kinematics.py
+++ b/src/compas_fab/backends/ros/backend_features/move_it_inverse_kinematics.py
@@ -165,6 +165,9 @@ def iter_inverse_kinematics(
- ``"constraints"``: (:obj:`list` of :class:`compas_fab.robots.Constraint`, optional)
An extra set of MoveIt constraints where the final link of the planning group must satisfy.
Defaults to ``None``.
+ - ``"link"``: (:obj:`str`, optional) The name of the link the target pose refers to.
+ Defaults to the end effector link of the planning group, see
+ :meth:`compas_fab.robots.RobotCell.get_end_effector_link_name`.
- ``"timeout"``: (:obj:`int`, optional) Maximum allowed time for one inverse kinematic
calculation by the backend. If ``max_results`` is greater than 1, this timeout is
applied to each calculation.
@@ -245,6 +248,11 @@ def _iter_inverse_kinematics_frame_target(self, target: FrameTarget, robot_cell_
options["base_link"] = options.get("base_link", robot_cell.root_name)
# The exposed "base_link" option is removed from documentation because I don't know what it does.
+ # The link the target pose refers to. This must be stated explicitly because the
+ # Planner Coordinate Frame (e.g. the 'flange' link) is not necessarily the default
+ # tip link that MoveIt would otherwise assume for the planning group (e.g. 'tool0').
+ options["link"] = options.get("link") or robot_cell.get_end_effector_link_name(group)
+
# Setting the entire robot cell state, including the robot configuration
planner.set_robot_cell_state(robot_cell_state)
@@ -351,6 +359,7 @@ def _inverse_kinematics_async(
group_name=group,
robot_state=robot_state,
constraints=constraints,
+ ik_link_name=options["link"],
pose_stamped=pose_stamped,
avoid_collisions=bool(check_collision),
attempts=options.get("attempts", 8),
diff --git a/src/compas_fab/backends/ros/messages/moveit_msgs.py b/src/compas_fab/backends/ros/messages/moveit_msgs.py
index 6e59c3ddb..2bfaa560f 100644
--- a/src/compas_fab/backends/ros/messages/moveit_msgs.py
+++ b/src/compas_fab/backends/ros/messages/moveit_msgs.py
@@ -192,11 +192,15 @@ def __init__(
timeout=None,
attempts=8,
avoid_collisions=True,
+ ik_link_name="",
):
self.group_name = group_name
self.robot_state = robot_state if robot_state else RobotState()
self.constraints = constraints if constraints else Constraints()
self.avoid_collisions = avoid_collisions
+ # The link the `pose_stamped` refers to. An empty string lets MoveIt
+ # fall back to the default tip link of the planning group.
+ self.ik_link_name = ik_link_name
self.pose_stamped = pose_stamped if pose_stamped else PoseStamped()
self.timeout = timeout
self.attempts = attempts
diff --git a/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/code.py b/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/code.py
index 4b589be2f..c99086ca3 100644
--- a/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/code.py
+++ b/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/code.py
@@ -3,10 +3,21 @@
Construct a ToolModel from a Rhino mesh and a TCP plane.
`tcp_plane` may be a Rhino Plane or a compas Frame; it is the Tool
-Coordinate Frame expressed in the robot's `tool0` link frame. If
-`collision_mesh` is unwired, `visual_mesh` is reused for collision
+Coordinate Frame, expressed in the same coordinates you modelled the mesh
+in. If `collision_mesh` is unwired, `visual_mesh` is reused for collision
checks.
+`base_plane` is where the robot's flange takes hold of the geometry, also
+in the coordinates you modelled in. Its Z axis points away from the robot,
+matching the planning groups of the robots in the library, so a tool drawn
+reaching along world Z needs no `base_plane` at all. Wire one when the tool
+was drawn along another axis: for a tool reaching along world X, that is
+the plane with Z = world X. Nothing is baked into the mesh, so the plane
+can be re-wired at any time.
+
+A remark is surfaced when the TCP does not sit roughly on the tool's +Z,
+since that means the tool will point sideways once attached.
+
The result is a static (no joints) `ToolModel` ready to feed into a
`Load Robot Cell` component's `tools` input. Kinematic tools (with their
own joints) should be loaded from URDF instead.
@@ -14,32 +25,80 @@
COMPAS FAB v2.0.1
"""
+from math import degrees
+
import Grasshopper
import Rhino
import rhinoscriptsyntax as rs
import System
from compas.geometry import Frame
+from compas.geometry import Vector
+from compas_ghpython import remark
from compas_ghpython import warning as gh_warning
from compas_rhino.conversions import mesh_to_compas
from compas_rhino.conversions import plane_to_compas_frame
from compas_robots import ToolModel
+# Beyond this angle between the tool's +Z and its TCP, the tool is considered
+# to be pointing somewhere other than away from the flange.
+MAX_TCP_OFF_AXIS_ANGLE = 30.0
+
+
+def _off_axis_remark(tool):
+ """Text for the mounting-axis remark, or None when the tool looks fine.
+
+ The TCP direction is only a hint: it says nothing about the roll of the tool
+ and is meaningless for a TCP sitting on the mount itself, so it is reported
+ rather than applied.
+ """
+ tcp_direction = Vector(*tool.frame.point)
+ if tcp_direction.length < 1e-6:
+ return None
+
+ angle = degrees(tcp_direction.angle(Vector.Zaxis()))
+ if angle < MAX_TCP_OFF_AXIS_ANGLE:
+ return None
+
+ message = ("TCP sits {:.0f} deg off the tool's +Z axis, so this tool will point sideways once attached: tools mount with +Z pointing away from the flange. ").format(angle)
+
+ unitized = tcp_direction.unitized()
+ if abs(unitized.x) > 0.99:
+ message += "Your tool reaches along X, so set `base_plane` to a plane with its Z axis along world X (origin, x=(0,1,0), y=(0,0,1))."
+ elif abs(unitized.y) > 0.99:
+ message += "Your tool reaches along Y, so set `base_plane` to a plane with its Z axis along world Y (origin, x=(0,0,1), y=(1,0,0))."
+ else:
+ message += "Set `base_plane` to a plane whose Z axis runs along your tool, with its X axis picked to give the roll you want."
+ return message
+
class ToolFromMesh(Grasshopper.Kernel.GH_ScriptInstance):
- def RunScript(self, name: str, visual_mesh, collision_mesh, tcp_plane):
+ def RunScript(self, name: str, visual_mesh, collision_mesh, tcp_plane, base_plane):
if visual_mesh is None or tcp_plane is None:
return None
frame = tcp_plane if isinstance(tcp_plane, Frame) else plane_to_compas_frame(tcp_plane)
+ base_frame = None
+ if base_plane is not None:
+ base_frame = base_plane if isinstance(base_plane, Frame) else plane_to_compas_frame(base_plane)
c_visual = mesh_to_compas(rs.coercemesh(visual_mesh)) if visual_mesh else None
c_collision = mesh_to_compas(rs.coercemesh(collision_mesh)) if collision_mesh else None
if collision_mesh is None:
gh_warning(ghenv.Component, "No collision mesh provided: the tool will be visualized but ignored for collision checking.") # noqa: F821
- return ToolModel(
+ # `base_frame` is only passed when wired, so an older compas_robots keeps
+ # working for definitions that don't use it.
+ kwargs = {"base_frame": base_frame} if base_frame else {}
+ tool = ToolModel(
visual=c_visual,
frame_in_tool0_frame=frame,
collision=c_collision,
name=(name or "attached_tool").strip(),
+ **kwargs,
)
+
+ message = _off_axis_remark(tool)
+ if message:
+ remark(ghenv.Component, message) # noqa: F821
+
+ return tool
diff --git a/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/metadata.json b/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/metadata.json
index e847c73ba..b0d1db003 100644
--- a/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/metadata.json
+++ b/src/compas_fab/ghpython/components_cpython/Cf_ToolFromMesh/metadata.json
@@ -3,7 +3,7 @@
"nickname": "Tool From Mesh",
"category": "COMPAS FAB",
"subcategory": "Robot Cell",
- "description": "Construct a ToolModel from a Rhino mesh and a TCP plane. The TCP is expressed in the robot's `tool0` link frame. The same mesh is used for collision checking unless a separate `collision_mesh` is provided. Output feeds directly into a Load Robot Cell component's `tools` input.",
+ "description": "Construct a ToolModel from a Rhino mesh and a TCP plane, both expressed in the coordinates the mesh was modelled in. Wire `base_plane` to say where the robot's flange takes hold of the geometry, so the tool can be modelled wherever is convenient. The same mesh is used for collision checking unless a separate `collision_mesh` is provided. Output feeds directly into a Load Robot Cell component's `tools` input.",
"exposure": 4,
"ghpython": {
"isAdvancedMode": true,
@@ -24,7 +24,11 @@
},
{
"name": "tcp_plane",
- "description": "Tool Coordinate Frame in the robot's `tool0` link frame, as a Rhino Plane or COMPAS Frame."
+ "description": "Tool Coordinate Frame, as a Rhino Plane or COMPAS Frame, expressed in the coordinates the mesh was modelled in."
+ },
+ {
+ "name": "base_plane",
+ "description": "Optional plane, in the coordinates the mesh was modelled in, at which the robot's flange takes hold of the tool. Its Z axis points away from the robot: a tool drawn reaching along world Z needs none. For a tool drawn reaching along world X, wire the plane with Z = world X. Defaults to the world XY plane, i.e. the modelling coordinates are the tool's base frame."
}
],
"outputParameters": [
diff --git a/src/compas_fab/robots/robot_library.py b/src/compas_fab/robots/robot_library.py
index daa8d5f98..54d53921f 100644
--- a/src/compas_fab/robots/robot_library.py
+++ b/src/compas_fab/robots/robot_library.py
@@ -33,15 +33,23 @@ class ToolLibrary:
The kinematic chain is represented similar to a RobotModel. The configuration of the kinematic chain can be described
in the context of a RobotCell using [`ToolState`][compas_fab.robots.ToolState] objects in [`RobotCellState`][compas_fab.robots.RobotCellState].tool_states.
- All the tools are modelled following [ROS REP 199](https://gavanderhoorn.github.io/rep/rep-0199.html) recommendations,
- where the tool's base frame is attached to the link named 'flange' in the RobotModel.
- The 'flange' link frame must have its Positive X (x+) point away from the last link.
-
- Note that this convention is present in many of Robots loaded from URDF files, but not all.
- Be aware that the 'flange' link is not necessary equal to the 'tool0' frame displayed on the robot controller,
- the orientation of the 'tool0' frame is robot-brand-dependent.
- The rationale of using a consistent 'flange' frame is that any tool can be attached to any robot interchangeably
- without additional rotations to align the tool model and the robot flange.
+ All the tools are modelled to reach along the Positive Z (z+) axis of their base frame,
+ which is the frame the robot's flange takes hold of them at.
+ This matches the planning groups of the robots in [`RobotCellLibrary`][compas_fab.robots.RobotCellLibrary],
+ which all end at a link whose z+ points away from the last link — `tool0` for the industrial
+ robots, `panda_hand_tcp` for the Panda. Any tool can therefore be attached to any of these
+ robots interchangeably, with no rotation in the attachment frame.
+
+ Note that a `flange` link, where a robot model has one, follows the opposite convention:
+ [ROS REP 199](https://gavanderhoorn.github.io/rep/rep-0199.html) puts its x+ away from the
+ last link. Only some robot models ship one, which is why the z+ convention is used here.
+ Be aware also that the 'tool0' link is not necessary equal to the tool frame displayed on
+ the robot controller, though for the robots in this library it is.
+
+ When modelling your own tool, you do not have to draw it along its Z axis to comply:
+ pass the `base_frame` of [`ToolModel`][compas_robots.ToolModel] (the `base_plane` input of the
+ `Tool From Mesh` Grasshopper component) to state where the flange takes hold of the geometry,
+ in the coordinate system you modelled in.
Examples
--------
@@ -50,17 +58,40 @@ class ToolLibrary:
>>> tool = ToolLibrary.cone()
>>> tool.name
'cone'
+ >>> tool.frame.point # the TCF reaches along z+ of the tool's base frame
+ Point(x=0.000, y=0.000, z=0.100)
"""
+ # The tools below are modelled reaching along their own x+, following REP 199, and are
+ # re-framed onto the z+ convention of this library on the way out. Expressed the other
+ # way round: the flange takes hold of them at the plane whose z+ runs along their x+.
+ REP199_MOUNTING_PLANE = Frame([0.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0])
+
+ @classmethod
+ def _mount_along_z(cls, tool_model: ToolModel, align_tcf: bool = True) -> ToolModel:
+ """Re-frame a tool modelled along x+ onto the z+ mounting convention of this library.
+
+ The TCF's Z axis states the direction the tool works in, which is the axis a
+ `TargetMode.TOOL` target aligns the tool to. For a tool that works along the axis
+ it is mounted on — a cone drawing, a gripper approaching — that is the mounting
+ axis itself, so the TCF keeps its position and takes the orientation of the base
+ frame. Pass `align_tcf=False` for a tool that works in some other direction, and
+ the TCF is carried along with the geometry instead.
+ """
+ tool_model.reframe_base(cls.REP199_MOUNTING_PLANE)
+ if align_tcf:
+ tool_model.frame = Frame(tool_model.frame.point, [1.0, 0.0, 0.0], [0.0, 1.0, 0.0])
+ return tool_model
+
@classmethod
def cone(cls, load_geometry: bool = True, radius: float = 0.02, length: float = 0.1) -> ToolModel:
"""Create and return a cone as ToolModel, useful for simulating a drawing tool.
- The cone points towards the positive X-axis of the tool frame.
+ The cone points towards the positive Z-axis of the tool's base frame.
The tool has only one visual mesh, which is also used for collision mesh.
The tool TCF is located at the tip of the cone,
- it is a translation offset from T0CF by its length (default 0.1) along the X-axis of the T0CF.
+ it is a translation offset from the base frame by its length (default 0.1) along its Z-axis.
The tool name is 'cone'.
Parameters
@@ -89,22 +120,21 @@ def cone(cls, load_geometry: bool = True, radius: float = 0.02, length: float =
# tool_mesh = Mesh.from_stl(compas_fab.get("planning_scene/cone.stl"))
tool_model.add_link("cone_link", visual_meshes=meshes, collision_meshes=meshes)
- return tool_model
+ return cls._mount_along_z(tool_model)
@classmethod
def printing_tool(cls, load_geometry: bool = True, tool_size: float = 1.0) -> ToolModel:
"""Create and return a printing tool as ToolModel, useful for simulating a 3D printing tool.
The Tool Frame is located at the tip of the tool,
- equal to `Frame([0.2, 0.0, 1.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0])`.
- It has the same orientation as its base frame.
+ equal to `Frame([0.0, 1.0, 0.2], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0])`.
Its Z-axis points out of the printing nozzle into the material being printed.
Therefor, the printing targets should be defined with the Z-axis pointing towards the object being printed.
The tool name is 'printing_tool'.
Changing the `tool_size` parameter will scale the tool.
- The default size is 1.0, corresponding to the tool tip being 1m away (Z-direction) from the base frame.
+ The default size is 1.0, corresponding to the tool tip being 1m away from the base frame.
Parameters
----------
@@ -128,7 +158,9 @@ def printing_tool(cls, load_geometry: bool = True, tool_size: float = 1.0) -> To
tool_model.add_link("printing_tool_link", visual_meshes=meshes, collision_meshes=meshes)
- return tool_model
+ # The nozzle points across the mounting axis rather than along it, so the TCF is
+ # carried along with the geometry to keep its Z axis pointing out of the nozzle.
+ return cls._mount_along_z(tool_model, align_tcf=False)
@classmethod
def static_gripper(cls, load_geometry: bool = True) -> ToolModel:
@@ -139,9 +171,9 @@ def static_gripper(cls, load_geometry: bool = True) -> ToolModel:
The tool has three visual meshes representing the gripper body and the jaws.
The visual mesh is also used for collision mesh.
The tool TCF is located at the gripper face of the gripper,
- it is a translation offset from T0CF by +0.1 along the X-axis of the T0CF.
+ it is a translation offset from the base frame by +0.1 along its Z-axis.
The tool name is 'gripper'.
- Bar material can be held with the gripper with the long axis matching the Z axis of the TCF.
+ Bar material can be held with the gripper with the long axis matching the Y axis of the TCF.
Parameters
----------
@@ -177,7 +209,7 @@ def static_gripper(cls, load_geometry: bool = True) -> ToolModel:
meshes.append(Mesh.from_shape(shape).transformed(t))
tool_model.add_link("gripper_body", visual_meshes=meshes, collision_meshes=meshes)
- return tool_model
+ return cls._mount_along_z(tool_model)
@classmethod
def static_gripper_small(cls, load_geometry: bool = True) -> ToolModel:
@@ -188,9 +220,9 @@ def static_gripper_small(cls, load_geometry: bool = True) -> ToolModel:
The tool has three visual meshes representing the gripper body and the jaws.
The visual mesh is also used for collision mesh.
The tool TCF is located at the gripper face of the gripper,
- it is a translation offset from T0CF by +0.1 along the X-axis of the T0CF.
+ it is a translation offset from the base frame by +0.1 along its Z-axis.
The tool name is 'gripper'.
- Bar material can be held with the gripper with the long axis matching the Z axis of the TCF.
+ Bar material can be held with the gripper with the long axis matching the Y axis of the TCF.
Parameters
----------
@@ -226,7 +258,7 @@ def static_gripper_small(cls, load_geometry: bool = True) -> ToolModel:
meshes.append(Mesh.from_shape(shape).transformed(t))
tool_model.add_link("gripper_body", visual_meshes=meshes, collision_meshes=meshes)
- return tool_model
+ return cls._mount_along_z(tool_model)
@classmethod
def kinematic_gripper(cls, load_geometry: bool = True) -> ToolModel:
@@ -244,9 +276,9 @@ def kinematic_gripper(cls, load_geometry: bool = True) -> ToolModel:
The tool has the same visual and collision mesh.
The tool's TCF is located at the tip of the gripper fingers,
- which is a translation offset from T0CF by +0.15 along the X-axis of the T0CF.
+ which is a translation offset from the base frame by +0.15 along its Z-axis.
The tool name is 'gripper'.
- Bar material can be held with the gripper if the long axis of the bar matches the Z axis of the TCF.
+ Bar material can be held with the gripper if the long axis of the bar matches the Y axis of the TCF.
Parameters
----------
@@ -262,7 +294,9 @@ def kinematic_gripper(cls, load_geometry: bool = True) -> ToolModel:
tool_model = json_load(compas_fab.get("tool_library/kinematic_gripper/gripper.json"))
assert isinstance(tool_model, ToolModel)
- return tool_model
+
+ # The serialized model is modelled along x+, like the programmatic tools above
+ return cls._mount_along_z(tool_model)
class RigidBodyLibrary:
@@ -597,10 +631,9 @@ def ur5_cone_tool(cls, load_geometry: bool = True) -> tuple[RobotCell, RobotCell
# Attach the tool to the robot's main group
touch_links = ["wrist_3_link"]
- # UR5 has the last planning link as 'tool0' not 'flange', therefore the cone tool
- # that is REP 199 compliant is attached with the following rotation to match.
- attachment_frame = Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0])
- robot_cell_state.set_tool_attached_to_group("cone", robot_cell.main_group_name, attachment_frame=attachment_frame, touch_links=touch_links)
+ # The cone of the ToolLibrary mounts along z+, same as the planning group's last
+ # link ('tool0'), so no rotation is needed in the attachment frame.
+ robot_cell_state.set_tool_attached_to_group("cone", robot_cell.main_group_name, touch_links=touch_links)
# ------------------------------------------------------------------------
# Static Rigid Body Touch Links
@@ -649,9 +682,9 @@ def ur5_gripper_one_beam(cls, load_geometry: bool = True) -> tuple[RobotCell, Ro
# Load Rigid Bodies
# ---------------------------------------------------------------------
- # Z axis is the length of the beam, X axis points away from the robot
+ # Authored in the gripper's TCF: Y axis is the length of the beam, Z axis points away from the robot
beam_length = 0.4
- beam = Box.from_corner_corner_height([0.0, -0.05, -beam_length * 0.5], [0.1, 0.05, -beam_length * 0.5], beam_length)
+ beam = Box.from_corner_corner_height([-0.05, -beam_length * 0.5, 0.0], [0.05, beam_length * 0.5, 0.0], 0.1)
beam_mesh = Mesh.from_shape(beam)
robot_cell.rigid_body_models["beam"] = RigidBody.from_mesh(beam_mesh)
@@ -668,22 +701,20 @@ def ur5_gripper_one_beam(cls, load_geometry: bool = True) -> tuple[RobotCell, Ro
# Tool Attachment
# ------------------------------------------------------------------------
- # Attach the tool to the robot's main group
- attachment_frame = Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0])
+ # Attach the tool to the robot's main group.
+ # The gripper of the ToolLibrary mounts along z+, same as the planning group's last
+ # link ('tool0'), so no rotation is needed in the attachment frame.
# Gripper is allowed to touch the last link of the robot.
- # However, do not use the following line to get the end effector link name,
+ # However, do not use the end effector link name as touch link,
# because it is not guaranteed to be the last link that has geometry in the robot chain.
- # ee_link_name = robot.get_end_effector_link_name(robot_cell.main_group_name)
-
- # Instead, check the robot model and hard code the actual link name.
+ # Instead, check the robot model and hard code the actual link name,
+ # or use `robot_cell.default_touch_links()`.
touch_links = ["wrist_3_link"]
- # For UR10e, the last logical link is `tool0` (from robot.get_end_effector_link_name)
- # However the last link with geometry attached is `wrist_3_link`.
+ # For UR5, the end effector link is `tool0`, which has no geometry.
+ # The last link with geometry attached is `wrist_3_link`.
- robot_cell_state.set_tool_attached_to_group("gripper", robot_cell.main_group_name, attachment_frame, touch_links)
- # Note: There is a rotation to match the gripper's orientation because the last link in the abb robot
- # does not follow the REP 199 convention.
+ robot_cell_state.set_tool_attached_to_group("gripper", robot_cell.main_group_name, touch_links=touch_links)
# ------------------------------------------------------------------------
# Workpiece Attachment
@@ -740,9 +771,9 @@ def abb_irb4600_40_255_gripper_one_beam(cls, load_geometry: bool = True) -> tupl
# Load Rigid Bodies
# ---------------------------------------------------------------------
- # Z axis is the length of the beam, X axis points away from the robot
+ # Authored in the gripper's TCF: Y axis is the length of the beam, Z axis points away from the robot
beam_length = 1.0
- beam = Box.from_corner_corner_height([0.0, -0.1, -beam_length * 0.5], [0.2, 0.1, -beam_length * 0.5], beam_length)
+ beam = Box.from_corner_corner_height([-0.1, -beam_length * 0.5, 0.0], [0.1, beam_length * 0.5, 0.0], 0.2)
beam_mesh = Mesh.from_shape(beam)
robot_cell.rigid_body_models["beam"] = RigidBody.from_mesh(beam_mesh)
@@ -756,10 +787,9 @@ def abb_irb4600_40_255_gripper_one_beam(cls, load_geometry: bool = True) -> tupl
robot_cell_state = robot_cell.default_cell_state()
# Attach the tool to the robot's main group
- attachment_frame = Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0])
- robot_cell_state.set_tool_attached_to_group("gripper", robot_cell.main_group_name, attachment_frame)
- # Note: There is a rotation to match the gripper's orientation because the last link in the abb robot
- # does not follow the REP 199 convention.
+ # The tools of the ToolLibrary mount along z+, same as the planning group's last link,
+ # so no rotation is needed in the attachment frame.
+ robot_cell_state.set_tool_attached_to_group("gripper", robot_cell.main_group_name)
# Attach the beam to the gripper
robot_cell_state.set_rigid_body_attached_to_tool("beam", "gripper")
@@ -804,9 +834,9 @@ def ur10e_gripper_one_beam(cls, load_geometry: bool = True) -> tuple[RobotCell,
# Load Rigid Bodies
# ---------------------------------------------------------------------
- # Z axis is the length of the beam, X axis points away from the robot
+ # Authored in the gripper's TCF: Y axis is the length of the beam, Z axis points away from the robot
beam_length = 0.4
- beam = Box.from_corner_corner_height([0.0, -0.05, -beam_length * 0.5], [0.1, 0.05, -beam_length * 0.5], beam_length)
+ beam = Box.from_corner_corner_height([-0.05, -beam_length * 0.5, 0.0], [0.05, beam_length * 0.5, 0.0], 0.1)
beam_mesh = Mesh.from_shape(beam)
robot_cell.rigid_body_models["beam"] = RigidBody.from_mesh(beam_mesh)
@@ -823,22 +853,20 @@ def ur10e_gripper_one_beam(cls, load_geometry: bool = True) -> tuple[RobotCell,
# Tool Attachment
# ------------------------------------------------------------------------
- # Attach the tool to the robot's main group
- attachment_frame = Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0])
+ # Attach the tool to the robot's main group.
+ # The gripper of the ToolLibrary mounts along z+, same as the planning group's last
+ # link ('tool0'), so no rotation is needed in the attachment frame.
# Gripper is allowed to touch the last link of the robot.
- # However, do not use the following line to get the end effector link name,
+ # However, do not use the end effector link name as touch link,
# because it is not guaranteed to be the last link that has geometry in the robot chain.
- # ee_link_name = robot.get_end_effector_link_name(robot_cell.main_group_name)
-
- # Instead, check the robot model and hard code the actual link name.
+ # Instead, check the robot model and hard code the actual link name,
+ # or use `robot_cell.default_touch_links()`.
touch_links = ["wrist_3_link"]
- # For UR10e, the last logical link is `tool0` (from robot.get_end_effector_link_name)
- # However the last link with geometry attached is `wrist_3_link`.
+ # For UR10e, the end effector link is `tool0`, which has no geometry.
+ # The last link with geometry attached is `wrist_3_link`.
- robot_cell_state.set_tool_attached_to_group("gripper", robot_cell.main_group_name, attachment_frame, touch_links)
- # Note: There is a rotation to match the gripper's orientation because the last link in the abb robot
- # does not follow the REP 199 convention.
+ robot_cell_state.set_tool_attached_to_group("gripper", robot_cell.main_group_name, touch_links=touch_links)
# ------------------------------------------------------------------------
# Workpiece Attachment
@@ -908,9 +936,10 @@ def abb_irb4600_40_255_printing_tool(cls, load_geometry: bool = True) -> tuple[R
# ------------------------------------------------------------------------
# Attach the tool to the robot's main group
- attachment_frame = Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0])
+ # The tools of the ToolLibrary mount along z+, same as the planning group's last link,
+ # so no rotation is needed in the attachment frame.
touch_links = ["link_6"]
- robot_cell_state.set_tool_attached_to_group("printing_tool", robot_cell.main_group_name, attachment_frame, touch_links=touch_links)
+ robot_cell_state.set_tool_attached_to_group("printing_tool", robot_cell.main_group_name, touch_links=touch_links)
# ------------------------------------------------------------------------
# Static Rigid Body Touch Links
diff --git a/src/compas_fab/robots/semantics.py b/src/compas_fab/robots/semantics.py
index 4999d4e5d..c811782f0 100644
--- a/src/compas_fab/robots/semantics.py
+++ b/src/compas_fab/robots/semantics.py
@@ -194,6 +194,25 @@ def from_xml(cls, xml: XML, robot_model: RobotModel) -> "RobotSemantics":
def get_end_effector_link_name(self, group: Optional[str] = None) -> str:
"""Get the name of the last link (end effector link) in a planning group.
+ The frame of this link is the robot's Planner Coordinate Frame (PCF),
+ where tools are attached.
+
+ Planning groups conventionally end at the robot's `tool0` link, whose
+ positive Z axis points away from the last link. That holds across brands
+ — it is what ROS Industrial support packages ship — and robots without a
+ `tool0` tend to end at an equivalent frame anyway (e.g. Panda's
+ `panda_hand_tcp`). The tools in [`ToolLibrary`][compas_fab.robots.ToolLibrary]
+ are modelled to mount along that same positive Z axis, so they attach to
+ any of these robots without a compensating rotation.
+
+ Note that a `flange` link, where a robot model has one, follows the
+ opposite convention: [ROS REP 199](https://gavanderhoorn.github.io/rep/rep-0199.html)
+ puts its positive X axis away from the last link. Since only some robot
+ models ship one, chaining a planning group to it would leave the cell with
+ two mounting conventions depending on the robot. If your group does end at
+ a flange, state the tool's mounting plane on the tool itself, see
+ [`ToolModel.reframe_base`][compas_robots.ToolModel.reframe_base].
+
Parameters
----------
group
@@ -203,6 +222,12 @@ def get_end_effector_link_name(self, group: Optional[str] = None) -> str:
-------
`str`
The name of the end effector link.
+
+ Examples
+ --------
+ >>> robot_cell, robot_cell_state = RobotCellLibrary.ur5()
+ >>> robot_cell.robot_semantics.get_end_effector_link_name()
+ 'tool0'
"""
if not group:
diff --git a/src/compas_fab/robots/state.py b/src/compas_fab/robots/state.py
index 8f347955b..000f5bbb4 100644
--- a/src/compas_fab/robots/state.py
+++ b/src/compas_fab/robots/state.py
@@ -211,6 +211,10 @@ def set_tool_attached_to_group(
attachment_frame
The frame of the tool relative to the end frame of the planning group.
Defaults to None, which means that the tool's frame coincides with the end frame of the planning group.
+ The tools in [`ToolLibrary`][compas_fab.robots.ToolLibrary] are authored to mount that way, so leave this
+ out for them; pass a frame only for a tool that is deliberately mounted somewhere else on the
+ flange, or at an angle to it. Note that a tool modelled for an earlier release of this library may
+ carry its mounting rotation here — see the migration notes of version 2.1.
touch_links
The names of the robot links that are allowed to collide with the tool.
diff --git a/tests/backends/kinematics/test_analytical_kinematics_planner.py b/tests/backends/kinematics/test_analytical_kinematics_planner.py
index d703c8e89..4ba3f26a3 100644
--- a/tests/backends/kinematics/test_analytical_kinematics_planner.py
+++ b/tests/backends/kinematics/test_analytical_kinematics_planner.py
@@ -5,7 +5,6 @@
from compas.geometry import Point
from compas.geometry import Vector
from compas.tolerance import Tolerance
-from compas_robots import Configuration
import compas_fab
from compas_fab.backends import AnalyticalKinematicsPlanner
@@ -47,14 +46,23 @@ def test_forward_kinematics(ur5_planner_robot_only):
start_state = planner.robot_cell.default_cell_state()
frame = planner.forward_kinematics(start_state, TargetMode.ROBOT, group=None)
+ # The frame of the `tool0` link at the zero configuration, i.e. the same answer the
+ # URDF model gives. The solver's own chain ends at the flange, one fixed rotation
+ # earlier, which is what `flange_frame` accounts for.
correct = Frame(
Point(x=0.81725, y=0.19145, z=-0.00549),
- Vector(x=0.0, y=1.0, z=-0.0),
- Vector(x=1.0, y=-0.0, z=-0.0),
+ Vector(x=-1.0, y=0.0, z=0.0),
+ Vector(x=0.0, y=0.0, z=1.0),
)
assert TOL.is_allclose(frame.point, correct.point)
assert TOL.is_allclose(frame.quaternion, correct.quaternion)
+ # ...and it agrees with the robot model, which is what the scene objects draw
+ robot_cell = planner.robot_cell
+ model_frame = robot_cell.robot_model.forward_kinematics(start_state.robot_configuration, robot_cell.get_end_effector_link_name())
+ assert TOL.is_allclose(frame.point, model_frame.point)
+ assert TOL.is_allclose(frame.quaternion, model_frame.quaternion)
+
def test_iter_inverse_kinematics(ur5_planner_robot_only):
planner = ur5_planner_robot_only # type: AnalyticalKinematicsPlanner
@@ -65,9 +73,14 @@ def test_iter_inverse_kinematics(ur5_planner_robot_only):
start_state = planner.robot_cell.default_cell_state()
solutions = list(planner.iter_inverse_kinematics(target, start_state, group=None))
assert len(solutions) == 8
- configuration = solutions[0]
- correct = Configuration.from_revolute_values((0.022, 4.827, 1.508, 1.126, 1.876, 3.163))
- assert correct.close_to(configuration)
+ # Every solution must actually reach the target, read through the robot model
+ robot_cell = planner.robot_cell
+ for configuration in solutions:
+ state = start_state.copy()
+ state.robot_configuration = configuration
+ reached = robot_cell.forward_kinematics_target_frame(state, TargetMode.ROBOT)
+ assert TOL.is_allclose(reached.point, target.target_frame.point)
+ assert TOL.is_allclose(reached.quaternion, target.target_frame.quaternion)
def test_inverse_kinematics(ur5_planner_robot_only):
@@ -80,10 +93,13 @@ def test_inverse_kinematics(ur5_planner_robot_only):
for i in range(8):
solutions.append(planner.inverse_kinematics(target, start_state, group=None))
- # Check First Solution Correctness
- first_configuration = solutions[0]
- correct = Configuration.from_revolute_values((0.022, 4.827, 1.508, 1.126, 1.876, 3.163))
- assert correct.close_to(first_configuration)
+ # Check First Solution Correctness by reading it back through the robot model
+ robot_cell = planner.robot_cell
+ state = start_state.copy()
+ state.robot_configuration = solutions[0]
+ reached = robot_cell.forward_kinematics_target_frame(state, TargetMode.ROBOT)
+ assert TOL.is_allclose(reached.point, target.target_frame.point)
+ assert TOL.is_allclose(reached.quaternion, target.target_frame.quaternion)
# Check that all solutions are different
for a, b in combinations(solutions, 2):
diff --git a/tests/backends/ros/test_doc_examples_integration.py b/tests/backends/ros/test_doc_examples_integration.py
index 12c84a04a..aab32a8b6 100644
--- a/tests/backends/ros/test_doc_examples_integration.py
+++ b/tests/backends/ros/test_doc_examples_integration.py
@@ -75,7 +75,7 @@ def test_02_set_robot_cell_state_with_attached_objects_example(ur5_robot_cell, p
robot_cell_state.rigid_body_states["beam"].frame = Frame([1.2, 0, 0], [0, 0, 1], [1, 0, 0])
robot_cell_state.tool_states["gripper"].attached_to_group = robot_cell.main_group_name
- robot_cell_state.tool_states["gripper"].attachment_frame = Frame([0, 0, 0], [0, 0, 1], [1, 0, 0])
+ robot_cell_state.tool_states["gripper"].attachment_frame = Frame.worldXY()
planner.set_robot_cell_state(robot_cell_state)
robot_cell_state.rigid_body_states["beam"].attached_to_tool = "gripper"
@@ -95,7 +95,6 @@ def test_02_set_robot_cell_state_with_kinematic_tool_example(ur5_robot_cell, pla
robot_cell_state.set_tool_attached_to_group(
gripper.name,
ur5_robot_cell.main_group_name,
- attachment_frame=Frame([0.0, 0.0, 0.0], [0.0, 0.0, 1.0], [1.0, 0.0, 0.0]),
touch_links=["wrist_3_link"],
)
robot_cell_state.robot_configuration.joint_values[1] = -1.0
@@ -134,7 +133,8 @@ def test_03_forward_kinematics_target_mode_example(ros2_client, ur5_robot_cell,
planner.set_robot_cell(robot_cell)
robot_cell_state.robot_configuration.joint_values = [-2.238, -1.153, -2.174, 0.185, 0.667, 0.0]
- robot_cell_state.rigid_body_states["beam"].attachment_frame = Frame([0.0, 0.0, -0.1], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0])
+ # Offset across the tool axis: the TCF's Y, since its Z now runs along the tool
+ robot_cell_state.rigid_body_states["beam"].attachment_frame = Frame([0.0, -0.1, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0])
robot_frame = planner.forward_kinematics(robot_cell_state, TargetMode.ROBOT)
tool_frame = planner.forward_kinematics(robot_cell_state, TargetMode.TOOL)
diff --git a/tests/robots/test_robot_library.py b/tests/robots/test_robot_library.py
index 46b7cabe2..3288ba3ca 100644
--- a/tests/robots/test_robot_library.py
+++ b/tests/robots/test_robot_library.py
@@ -1,6 +1,24 @@
+from compas.geometry import Point
+from compas.geometry import Vector
+
from compas_fab.robots import RobotCellLibrary
+from compas_fab.robots import ToolLibrary
import pytest
+# Every cell of the library, with the tool attached to its main planning group
+CELLS_WITH_TOOLS = [
+ ("ur5_cone_tool", "cone"),
+ ("ur5_gripper_one_beam", "gripper"),
+ ("ur10e_gripper_one_beam", "gripper"),
+ ("abb_irb4600_40_255_gripper_one_beam", "gripper"),
+ ("abb_irb4600_40_255_printing_tool", "printing_tool"),
+]
+
+# `printing_tool` is deliberately absent: it is an L-shaped tool whose tip sits a metre
+# off to the side of its mount (it reaches along +Y of its base frame), which is how it
+# has always been modelled. It still mounts by its base frame like every other tool.
+TOOLS_REACHING_ALONG_Z = ["cone", "static_gripper", "static_gripper_small", "kinematic_gripper"]
+
@pytest.fixture
def all_robots_cells_and_states():
@@ -18,3 +36,69 @@ def test_robot_semantics_and_geometry(all_robots_cells_and_states):
robot_cell.ensure_geometry()
assert robot_cell.robot_model.name
robot_cell.print_info()
+
+
+@pytest.mark.parametrize("tool_name", TOOLS_REACHING_ALONG_Z)
+def test_tools_mount_along_their_z_axis(tool_name):
+ """The mounting convention of the library: a tool reaches along the +Z axis of
+ its base frame, which is the frame the robot's flange takes hold of it at.
+
+ This is what lets the same tool be attached to any robot of the library without
+ a rotation, and it is only true because every planning group there ends at a
+ link whose +Z points away from the arm.
+ """
+ tool = getattr(ToolLibrary, tool_name)(load_geometry=True)
+
+ tcf_direction = Vector(*tool.frame.point).unitized()
+ assert tcf_direction.dot(Vector.Zaxis()) > 0.9, "{} does not reach along +Z".format(tool_name)
+
+ # ...and the TCF states the working direction with its own Z axis, which is the axis
+ # a TargetMode.TOOL target aligns the tool to. A TCF left pointing along X mounts the
+ # tool correctly but sends every tool-mode target off at 90 degrees.
+ assert Vector(*tool.frame.zaxis).dot(Vector.Zaxis()) > 0.99, "{} works along its TCF X, not its TCF Z".format(tool_name)
+
+ # The body of the tool sits on the +Z side of its mounting plane, i.e. it does not
+ # reach back into the robot it is attached to. Only the base link is checked, the
+ # geometry of any child link is expressed in that link's own frame, not this one.
+ for mesh in tool.get_link_collision_meshes(tool.root) or []:
+ zs = [mesh.vertex_coordinates(v)[2] for v in mesh.vertices()]
+ assert min(zs) > -1e-6, "{} has geometry behind its mounting plane".format(tool_name)
+
+
+@pytest.mark.parametrize("cell_name, tool_id", CELLS_WITH_TOOLS)
+def test_cells_attach_their_tool_without_a_rotation(cell_name, tool_id):
+ """Because tools and end effector links agree on the convention, every cell of
+ the library attaches its tool with an identity attachment frame, on UR and ABB
+ alike. A rotation creeping back in means the two conventions have drifted apart.
+ """
+ robot_cell, robot_cell_state = getattr(RobotCellLibrary, cell_name)(load_geometry=False)
+ attachment_frame = robot_cell_state.tool_states[tool_id].attachment_frame
+
+ assert attachment_frame.point.distance_to_point(Point(0, 0, 0)) == pytest.approx(0.0, abs=1e-9)
+ assert Vector(*attachment_frame.xaxis).dot(Vector.Xaxis()) == pytest.approx(1.0, abs=1e-9)
+ assert Vector(*attachment_frame.yaxis).dot(Vector.Yaxis()) == pytest.approx(1.0, abs=1e-9)
+
+
+@pytest.mark.parametrize("cell_name, tool_id", CELLS_WITH_TOOLS)
+def test_attached_tool_sits_where_the_tool_says_it_does(cell_name, tool_id):
+ """With the conventions agreeing, the TCP relative to the end effector link is
+ simply the tool's own TCF — no rotation, no offset introduced by the attachment.
+
+ This is the pose the scene objects draw, `RobotCell.compute_attach_objects_frames`
+ is what `BaseRobotCellObject.update` calls, so this is the "tool looks wrong in
+ Rhino" regression.
+ """
+ robot_cell, robot_cell_state = getattr(RobotCellLibrary, cell_name)(load_geometry=False)
+ robot_cell_state.robot_configuration.joint_values = [-2.238, -1.153, -2.174, 0.185, 0.667, 0.5]
+
+ tcf_in_pcf = Point(0, 0, 0).transformed(robot_cell.t_pcf_tcf(robot_cell_state, tool_id))
+ assert tcf_in_pcf.distance_to_point(Point(*robot_cell.tool_models[tool_id].frame.point)) < 1e-9
+
+ # ...and in the world it lands on the frame of the end effector link
+ ee_frame = robot_cell.robot_model.forward_kinematics(robot_cell_state.robot_configuration, robot_cell.get_end_effector_link_name())
+ assert (
+ ee_frame.to_world_coordinates(tcf_in_pcf).distance_to_point(
+ robot_cell.compute_attach_objects_frames(robot_cell_state).tool_states[tool_id].frame.to_world_coordinates(Point(*robot_cell.tool_models[tool_id].frame.point))
+ )
+ < 1e-9
+ )
diff --git a/uv.lock b/uv.lock
index d619e227e..f0be94418 100644
--- a/uv.lock
+++ b/uv.lock
@@ -693,7 +693,7 @@ requires-dist = [
{ name = "bump-my-version", marker = "extra == 'dev'" },
{ name = "compas", specifier = ">=2.3,<3" },
{ name = "compas-invocations2", extras = ["mkdocs"], marker = "extra == 'dev'" },
- { name = "compas-robots", specifier = ">=1,<2" },
+ { name = "compas-robots", git = "https://github.com/compas-dev/compas_robots.git?rev=tool-base-frame" },
{ name = "invoke", marker = "extra == 'dev'", specifier = ">=0.14" },
{ name = "mkdocs-print-site-plugin", marker = "extra == 'dev'" },
{ name = "pybullet", marker = "extra == 'dev'" },
@@ -750,14 +750,10 @@ mkdocs = [
[[package]]
name = "compas-robots"
version = "1.0.1"
-source = { registry = "https://pypi.org/simple" }
+source = { git = "https://github.com/compas-dev/compas_robots.git?rev=tool-base-frame#b5a1c676ddbaf7bac188695cdbcacd3c7832c693" }
dependencies = [
{ name = "compas" },
]
-sdist = { url = "https://files.pythonhosted.org/packages/ba/f7/97b7e5b87b25931dc6d3e603c0af50ffd19fbaa2074b73b7bfca88aca853/compas_robots-1.0.1.tar.gz", hash = "sha256:5e3cdfc2f3e0ab00789f782ab9192b75dabbc031c542347958e6a96b17ca858b", size = 6043059, upload-time = "2026-05-15T11:05:09.738Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/1b/90/6331e22189043fff683d883c587acc4187fe84319786a2ae7858dc9f796b/compas_robots-1.0.1-py3-none-any.whl", hash = "sha256:d9fe956d5fabccc1760be356e99a6019929326af23598d6312dca907e8677c20", size = 6077053, upload-time = "2026-05-15T11:05:07.211Z" },
-]
[[package]]
name = "constantly"