diff --git a/lecture_05/assignment_04/lytle/hello.txt b/lecture_05/assignment_04/lytle/hello.txt new file mode 100644 index 0000000..5dd01c1 --- /dev/null +++ b/lecture_05/assignment_04/lytle/hello.txt @@ -0,0 +1 @@ +Hello, world! \ No newline at end of file diff --git a/lecture_06/assignment_05/Guillaume Jami/Assignment_04_pickandplace_GJ.png b/lecture_06/assignment_05/Guillaume Jami/Assignment_04_pickandplace_GJ.png new file mode 100644 index 0000000..8d8c710 Binary files /dev/null and b/lecture_06/assignment_05/Guillaume Jami/Assignment_04_pickandplace_GJ.png differ diff --git a/lecture_06/assignment_05/Guillaume Jami/assembly.py b/lecture_06/assignment_05/Guillaume Jami/assembly.py new file mode 100644 index 0000000..793aec5 --- /dev/null +++ b/lecture_06/assignment_05/Guillaume Jami/assembly.py @@ -0,0 +1,81 @@ +from compas.datastructures import Datastructure +from compas.datastructures import Network +from compas.geometry import Transformation +from compas.geometry import Translation + + +class Assembly(Network): + def __init__(self): + super(Assembly, self).__init__() + + @property + def approach_offset(self): + return self.attributes['approach_offset'] + + @approach_offset.setter + def approach_offset(self, value): + self.attributes['approach_offset'] = value + + @property + def pick_t0cf_frame(self): + return self.attributes['pick_t0cf_frame'] + + @pick_t0cf_frame.setter + def pick_t0cf_frame(self, frame): + self.attributes['pick_t0cf_frame'] = frame.copy() + + def pick_t0cf_frames(self): + if self.approach_offset: + approach_frame = self.pick_t0cf_frame.copy() + approach_frame.transform(Translation.from_vector([0, 0, self.approach_offset])) + return [approach_frame, self.pick_t0cf_frame, approach_frame] + + return [self.pick_t0cf_frame] + + @property + def pick_trajectory(self): + return self.attributes['pick_trajectory'] + + @pick_trajectory.setter + def pick_trajectory(self, trajectory): + self.attributes['pick_trajectory'] = trajectory + + def add_element(self, element, key=None, attr_dict={}, **kwattr): + attr_dict.update(kwattr) + x, y, z = element.frame.point + key = self.add_node(key=key, attr_dict=attr_dict, + x=x, y=y, z=z, element=element) + return key + + def element(self, key): + return self.node[key]['element'] + +class Element(Datastructure): + def __init__(self, frame=None, approach_frame=None, geometry_at_origin=None): + super(Element, self).__init__() + self.frame = frame + self.approach_frame = approach_frame + self.geometry_at_origin = geometry_at_origin + self.trajectory = None + + @property + def data(self): + return dict( + frame=self.frame, + approach_frame=self.approach_frame, + geometry_at_origin=self.geometry_at_origin, + trajectory=self.trajectory, + ) + + @data.setter + def data(self, data): + self.frame = data['frame'] + self.approach_frame = data['approach_frame'] + self.geometry_at_origin = data['geometry_at_origin'] + self.trajectory = data['trajectory'] + + @property + def geometry_at_placement(self): + T = Transformation.from_frame(self.frame) + return self.geometry_at_origin.transformed(T) + diff --git a/lecture_06/assignment_05/Guillaume Jami/assembly_GJ.json b/lecture_06/assignment_05/Guillaume Jami/assembly_GJ.json new file mode 100644 index 0000000..4f8f36c --- /dev/null +++ b/lecture_06/assignment_05/Guillaume Jami/assembly_GJ.json @@ -0,0 +1,11859 @@ +{ + "dtype": "assembly/Assembly", + "value": { + "compas": "1.1.0", + "data": { + "adjacency": { + "0": {}, + "1": {}, + "10": {}, + "11": {}, + "12": {}, + "13": {}, + "14": {}, + "15": {}, + "16": {}, + "17": {}, + "18": {}, + "19": {}, + "2": {}, + "20": {}, + "21": {}, + "22": {}, + "23": {}, + "24": {}, + "25": {}, + "26": {}, + "27": {}, + "28": {}, + "29": {}, + "3": {}, + "30": {}, + "31": {}, + "32": {}, + "33": {}, + "34": {}, + "35": {}, + "36": {}, + "37": {}, + "38": {}, + "39": {}, + "4": {}, + "40": {}, + "41": {}, + "42": {}, + "43": {}, + "44": {}, + "45": {}, + "46": {}, + "47": {}, + "48": {}, + "49": {}, + "5": {}, + "50": {}, + "51": {}, + "52": {}, + "53": {}, + "54": {}, + "55": {}, + "56": {}, + "57": {}, + "58": {}, + "59": {}, + "6": {}, + "7": {}, + "8": {}, + "9": {} + }, + "attributes": { + "approach_offset": 0.050000000000000003, + "element": { + "dtype": "compas.geometry/Box", + "value": { + "frame": { + "point": [ + 0.0, + 0.0, + 0.0 + ], + "xaxis": [ + 1.0, + 0.0, + 0.0 + ], + "yaxis": [ + 0.0, + 1.0, + 0.0 + ] + }, + "xsize": 0.016, + "ysize": 0.031, + "zsize": 0.012 + } + }, + "home_config": { + "dtype": "compas_fab.robots/Configuration", + "value": { + "joint_names": [], + "types": [ + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 1.5700000000000001, + -1.5700000000000001, + 1.5700000000000001, + -1.5700000000000001, + -1.5700000000000001, + 3.1400000000000001 + ] + } + }, + "name": "Network", + "pick_t0cf_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + -0.064326905625918904, + 0.66851245126104597, + 0.1517357251225426 + ], + "xaxis": [ + 0.00079632671073326345, + 0.0, + -0.99999968293183472 + ], + "yaxis": [ + 0.99999968293183472, + 0.0, + 0.00079632671073326345 + ] + } + }, + "pick_trajectory": { + "dtype": "compas_fab.robots/JointTrajectory", + "value": { + "attached_collision_meshes": [ + { + "collision_mesh": { + "frame": { + "point": [ + 0.0, + 0.0, + 0.0 + ], + "xaxis": [ + 1.0, + 0.0, + 0.0 + ], + "yaxis": [ + 0.0, + 1.0, + 0.0 + ] + }, + "id": "attached_tool_link_collision_0", + "mesh": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Mesh" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2 + ], + "1": [ + 1, + 3, + 2 + ], + "10": [ + 9, + 11, + 10 + ], + "100": [ + 52, + 70, + 35 + ], + "101": [ + 52, + 35, + 13 + ], + "102": [ + 1, + 52, + 13 + ], + "103": [ + 1, + 13, + 15 + ], + "104": [ + 83, + 1, + 15 + ], + "105": [ + 83, + 15, + 49 + ], + "106": [ + 82, + 83, + 49 + ], + "107": [ + 82, + 49, + 48 + ], + "108": [ + 79, + 82, + 48 + ], + "109": [ + 79, + 48, + 45 + ], + "11": [ + 10, + 12, + 1 + ], + "110": [ + 80, + 79, + 45 + ], + "111": [ + 80, + 45, + 47 + ], + "112": [ + 81, + 80, + 47 + ], + "113": [ + 81, + 47, + 46 + ], + "114": [ + 85, + 81, + 46 + ], + "115": [ + 85, + 46, + 51 + ], + "116": [ + 10, + 85, + 51 + ], + "117": [ + 10, + 51, + 37 + ], + "118": [ + 84, + 10, + 37 + ], + "119": [ + 84, + 37, + 50 + ], + "12": [ + 6, + 1, + 12 + ], + "120": [ + 75, + 84, + 50 + ], + "121": [ + 75, + 50, + 41 + ], + "122": [ + 71, + 75, + 41 + ], + "123": [ + 71, + 41, + 36 + ], + "124": [ + 78, + 71, + 36 + ], + "125": [ + 78, + 36, + 44 + ], + "126": [ + 76, + 78, + 44 + ], + "127": [ + 76, + 44, + 43 + ], + "128": [ + 77, + 76, + 43 + ], + "129": [ + 77, + 43, + 42 + ], + "13": [ + 13, + 14, + 15 + ], + "130": [ + 72, + 77, + 42 + ], + "131": [ + 72, + 42, + 38 + ], + "132": [ + 74, + 72, + 38 + ], + "133": [ + 74, + 38, + 40 + ], + "134": [ + 9, + 74, + 40 + ], + "135": [ + 9, + 40, + 19 + ], + "136": [ + 73, + 9, + 19 + ], + "137": [ + 73, + 19, + 39 + ], + "138": [ + 58, + 73, + 39 + ], + "139": [ + 58, + 39, + 23 + ], + "14": [ + 16, + 15, + 17 + ], + "140": [ + 59, + 58, + 23 + ], + "141": [ + 59, + 23, + 25 + ], + "142": [ + 60, + 59, + 25 + ], + "143": [ + 60, + 25, + 24 + ], + "144": [ + 61, + 60, + 24 + ], + "145": [ + 61, + 24, + 26 + ], + "146": [ + 54, + 61, + 26 + ], + "147": [ + 54, + 26, + 18 + ], + "148": [ + 62, + 54, + 18 + ], + "149": [ + 62, + 18, + 27 + ], + "15": [ + 18, + 19, + 16 + ], + "150": [ + 57, + 62, + 27 + ], + "151": [ + 57, + 27, + 22 + ], + "152": [ + 5, + 57, + 22 + ], + "153": [ + 5, + 22, + 16 + ], + "154": [ + 55, + 5, + 16 + ], + "155": [ + 55, + 16, + 20 + ], + "156": [ + 56, + 55, + 20 + ], + "157": [ + 56, + 20, + 21 + ], + "158": [ + 0, + 56, + 21 + ], + "159": [ + 0, + 21, + 17 + ], + "16": [ + 20, + 16, + 21 + ], + "160": [ + 64, + 0, + 17 + ], + "161": [ + 64, + 17, + 29 + ], + "162": [ + 7, + 86, + 8 + ], + "163": [ + 8, + 86, + 87 + ], + "164": [ + 87, + 11, + 8 + ], + "165": [ + 88, + 7, + 4 + ], + "166": [ + 4, + 2, + 88 + ], + "167": [ + 12, + 89, + 6 + ], + "168": [ + 6, + 89, + 90 + ], + "169": [ + 6, + 90, + 3 + ], + "17": [ + 18, + 16, + 22 + ], + "170": [ + 3, + 90, + 2 + ], + "171": [ + 91, + 12, + 11 + ], + "172": [ + 7, + 88, + 86 + ], + "173": [ + 2, + 90, + 88 + ], + "174": [ + 89, + 12, + 91 + ], + "175": [ + 87, + 91, + 11 + ], + "176": [ + 92, + 93, + 94 + ], + "177": [ + 92, + 94, + 95 + ], + "178": [ + 93, + 96, + 97 + ], + "179": [ + 93, + 97, + 94 + ], + "18": [ + 16, + 17, + 21 + ], + "180": [ + 96, + 98, + 99 + ], + "181": [ + 96, + 99, + 97 + ], + "182": [ + 98, + 92, + 95 + ], + "183": [ + 98, + 95, + 99 + ], + "184": [ + 94, + 99, + 95 + ], + "185": [ + 99, + 94, + 97 + ], + "186": [ + 88, + 93, + 86 + ], + "187": [ + 92, + 86, + 93 + ], + "188": [ + 91, + 87, + 92 + ], + "189": [ + 86, + 92, + 87 + ], + "19": [ + 23, + 24, + 25 + ], + "190": [ + 92, + 98, + 91 + ], + "191": [ + 91, + 98, + 89 + ], + "192": [ + 96, + 89, + 98 + ], + "193": [ + 88, + 90, + 96 + ], + "194": [ + 89, + 96, + 90 + ], + "195": [ + 96, + 93, + 88 + ], + "2": [ + 2, + 4, + 0 + ], + "20": [ + 26, + 24, + 18 + ], + "21": [ + 18, + 24, + 19 + ], + "22": [ + 18, + 22, + 27 + ], + "23": [ + 28, + 29, + 17 + ], + "24": [ + 30, + 15, + 31 + ], + "25": [ + 32, + 28, + 30 + ], + "26": [ + 17, + 30, + 28 + ], + "27": [ + 15, + 30, + 17 + ], + "28": [ + 33, + 34, + 31 + ], + "29": [ + 15, + 14, + 31 + ], + "3": [ + 4, + 5, + 0 + ], + "30": [ + 33, + 31, + 14 + ], + "31": [ + 14, + 13, + 35 + ], + "32": [ + 16, + 19, + 15 + ], + "33": [ + 19, + 24, + 23 + ], + "34": [ + 36, + 37, + 19 + ], + "35": [ + 36, + 19, + 38 + ], + "36": [ + 39, + 19, + 23 + ], + "37": [ + 19, + 40, + 38 + ], + "38": [ + 36, + 41, + 37 + ], + "39": [ + 38, + 42, + 43 + ], + "4": [ + 1, + 6, + 3 + ], + "40": [ + 44, + 36, + 43 + ], + "41": [ + 36, + 38, + 43 + ], + "42": [ + 15, + 19, + 37 + ], + "43": [ + 45, + 46, + 47 + ], + "44": [ + 45, + 15, + 37 + ], + "45": [ + 15, + 45, + 48 + ], + "46": [ + 48, + 49, + 15 + ], + "47": [ + 45, + 37, + 46 + ], + "48": [ + 50, + 37, + 41 + ], + "49": [ + 37, + 51, + 46 + ], + "5": [ + 7, + 8, + 9 + ], + "50": [ + 52, + 1, + 53 + ], + "51": [ + 54, + 5, + 9 + ], + "52": [ + 55, + 56, + 5 + ], + "53": [ + 54, + 57, + 5 + ], + "54": [ + 5, + 56, + 0 + ], + "55": [ + 58, + 59, + 60 + ], + "56": [ + 61, + 54, + 60 + ], + "57": [ + 54, + 9, + 60 + ], + "58": [ + 54, + 62, + 57 + ], + "59": [ + 63, + 0, + 64 + ], + "6": [ + 4, + 7, + 5 + ], + "60": [ + 65, + 66, + 1 + ], + "61": [ + 67, + 65, + 63 + ], + "62": [ + 0, + 63, + 65 + ], + "63": [ + 1, + 0, + 65 + ], + "64": [ + 68, + 66, + 69 + ], + "65": [ + 1, + 66, + 53 + ], + "66": [ + 68, + 53, + 66 + ], + "67": [ + 53, + 70, + 52 + ], + "68": [ + 9, + 58, + 60 + ], + "69": [ + 71, + 9, + 10 + ], + "7": [ + 9, + 5, + 7 + ], + "70": [ + 71, + 72, + 9 + ], + "71": [ + 73, + 58, + 9 + ], + "72": [ + 9, + 72, + 74 + ], + "73": [ + 71, + 10, + 75 + ], + "74": [ + 72, + 76, + 77 + ], + "75": [ + 78, + 76, + 71 + ], + "76": [ + 71, + 76, + 72 + ], + "77": [ + 79, + 80, + 81 + ], + "78": [ + 79, + 10, + 1 + ], + "79": [ + 1, + 82, + 79 + ], + "8": [ + 10, + 11, + 12 + ], + "80": [ + 82, + 1, + 83 + ], + "81": [ + 79, + 81, + 10 + ], + "82": [ + 84, + 75, + 10 + ], + "83": [ + 10, + 81, + 85 + ], + "84": [ + 63, + 64, + 29 + ], + "85": [ + 63, + 29, + 28 + ], + "86": [ + 67, + 63, + 28 + ], + "87": [ + 67, + 28, + 32 + ], + "88": [ + 65, + 67, + 32 + ], + "89": [ + 65, + 32, + 30 + ], + "9": [ + 11, + 9, + 8 + ], + "90": [ + 66, + 65, + 30 + ], + "91": [ + 66, + 30, + 31 + ], + "92": [ + 69, + 66, + 31 + ], + "93": [ + 69, + 31, + 34 + ], + "94": [ + 68, + 69, + 34 + ], + "95": [ + 68, + 34, + 33 + ], + "96": [ + 53, + 68, + 33 + ], + "97": [ + 53, + 33, + 14 + ], + "98": [ + 70, + 53, + 14 + ], + "99": [ + 70, + 14, + 35 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "10": {}, + "100": {}, + "101": {}, + "102": {}, + "103": {}, + "104": {}, + "105": {}, + "106": {}, + "107": {}, + "108": {}, + "109": {}, + "11": {}, + "110": {}, + "111": {}, + "112": {}, + "113": {}, + "114": {}, + "115": {}, + "116": {}, + "117": {}, + "118": {}, + "119": {}, + "12": {}, + "120": {}, + "121": {}, + "122": {}, + "123": {}, + "124": {}, + "125": {}, + "126": {}, + "127": {}, + "128": {}, + "129": {}, + "13": {}, + "130": {}, + "131": {}, + "132": {}, + "133": {}, + "134": {}, + "135": {}, + "136": {}, + "137": {}, + "138": {}, + "139": {}, + "14": {}, + "140": {}, + "141": {}, + "142": {}, + "143": {}, + "144": {}, + "145": {}, + "146": {}, + "147": {}, + "148": {}, + "149": {}, + "15": {}, + "150": {}, + "151": {}, + "152": {}, + "153": {}, + "154": {}, + "155": {}, + "156": {}, + "157": {}, + "158": {}, + "159": {}, + "16": {}, + "160": {}, + "161": {}, + "162": {}, + "163": {}, + "164": {}, + "165": {}, + "166": {}, + "167": {}, + "168": {}, + "169": {}, + "17": {}, + "170": {}, + "171": {}, + "172": {}, + "173": {}, + "174": {}, + "175": {}, + "176": {}, + "177": {}, + "178": {}, + "179": {}, + "18": {}, + "180": {}, + "181": {}, + "182": {}, + "183": {}, + "184": {}, + "185": {}, + "186": {}, + "187": {}, + "188": {}, + "189": {}, + "19": {}, + "190": {}, + "191": {}, + "192": {}, + "193": {}, + "194": {}, + "195": {}, + "2": {}, + "20": {}, + "21": {}, + "22": {}, + "23": {}, + "24": {}, + "25": {}, + "26": {}, + "27": {}, + "28": {}, + "29": {}, + "3": {}, + "30": {}, + "31": {}, + "32": {}, + "33": {}, + "34": {}, + "35": {}, + "36": {}, + "37": {}, + "38": {}, + "39": {}, + "4": {}, + "40": {}, + "41": {}, + "42": {}, + "43": {}, + "44": {}, + "45": {}, + "46": {}, + "47": {}, + "48": {}, + "49": {}, + "5": {}, + "50": {}, + "51": {}, + "52": {}, + "53": {}, + "54": {}, + "55": {}, + "56": {}, + "57": {}, + "58": {}, + "59": {}, + "6": {}, + "60": {}, + "61": {}, + "62": {}, + "63": {}, + "64": {}, + "65": {}, + "66": {}, + "67": {}, + "68": {}, + "69": {}, + "7": {}, + "70": {}, + "71": {}, + "72": {}, + "73": {}, + "74": {}, + "75": {}, + "76": {}, + "77": {}, + "78": {}, + "79": {}, + "8": {}, + "80": {}, + "81": {}, + "82": {}, + "83": {}, + "84": {}, + "85": {}, + "86": {}, + "87": {}, + "88": {}, + "89": {}, + "9": {}, + "90": {}, + "91": {}, + "92": {}, + "93": {}, + "94": {}, + "95": {}, + "96": {}, + "97": {}, + "98": {}, + "99": {} + }, + "max_face": 195, + "max_vertex": 99, + "vertex": { + "0": { + "x": 0.014816462062299252, + "y": -0.0047768764197826385, + "z": -0.029393302276730537 + }, + "1": { + "x": 0.014816462062299252, + "y": 0.029754780232906342, + "z": 0.0011990766506642103 + }, + "10": { + "x": 0.014816462062299252, + "y": 0.011672346852719784, + "z": 0.027396004647016525 + }, + "11": { + "x": 0.014816462062299252, + "y": -0.010380548425018787, + "z": 0.011409667320549488 + }, + "12": { + "x": 0.014816462062299252, + "y": 0.010380548425018787, + "z": 0.011409667320549488 + }, + "13": { + "x": 0.0, + "y": 0.029561810195446014, + "z": -0.0035894536413252354 + }, + "14": { + "x": 0.0, + "y": 0.026903789490461349, + "z": -0.012766006402671337 + }, + "15": { + "x": 0.0, + "y": 0.029754780232906342, + "z": 0.0011990766506642103 + }, + "16": { + "x": 0.0, + "y": -0.017889462411403656, + "z": -0.023806551471352577 + }, + "17": { + "x": 0.0, + "y": -0.0047768764197826385, + "z": -0.029393302276730537 + }, + "18": { + "x": 0.0, + "y": -0.026903789490461349, + "z": -0.012766006402671337 + }, + "19": { + "x": 0.0, + "y": -0.025789311155676842, + "z": 0.014889465644955635 + }, + "2": { + "x": 0.014816462062299252, + "y": 0.010380548425018787, + "z": -0.011409667320549488 + }, + "20": { + "x": 0.0, + "y": -0.01383895892649889, + "z": -0.026367934420704842 + }, + "21": { + "x": 0.0, + "y": -0.0094300340861082077, + "z": -0.028246402740478516 + }, + "22": { + "x": 0.0, + "y": -0.021476637572050095, + "z": -0.020628591999411583 + }, + "23": { + "x": 0.0, + "y": -0.029177118092775345, + "z": 0.0059565515257418156 + }, + "24": { + "x": 0.0, + "y": -0.029561810195446014, + "z": -0.0035894536413252354 + }, + "25": { + "x": 0.0, + "y": -0.029754780232906342, + "z": 0.0011990766506642103 + }, + "26": { + "x": 0.0, + "y": -0.028603203594684601, + "z": -0.008285018615424633 + }, + "27": { + "x": 0.0, + "y": -0.024507580325007439, + "z": -0.016916360706090927 + }, + "28": { + "x": 0.0, + "y": 0.0047768764197826385, + "z": -0.029393302276730537 + }, + "29": { + "x": 0.0, + "y": -2.045294925157771e-19, + "z": -0.02977893128991127 + }, + "3": { + "x": 0.014816462062299252, + "y": 0.010380548425018787, + "z": -0.008969305083155632 + }, + "30": { + "x": 0.0, + "y": 0.01383895892649889, + "z": -0.026367934420704842 + }, + "31": { + "x": 0.0, + "y": 0.017889462411403656, + "z": -0.023806551471352577 + }, + "32": { + "x": 0.0, + "y": 0.0094300340861082077, + "z": -0.028246402740478516 + }, + "33": { + "x": 0.0, + "y": 0.024507580325007439, + "z": -0.016916360706090927 + }, + "34": { + "x": 0.0, + "y": 0.021476637572050095, + "z": -0.020628591999411583 + }, + "35": { + "x": 0.0, + "y": 0.028603203594684601, + "z": -0.008285018615424633 + }, + "36": { + "x": 0.0, + "y": -0.0023962082341313362, + "z": 0.029682368040084839 + }, + "37": { + "x": 0.0, + "y": 0.011672346852719784, + "z": 0.027396004647016525 + }, + "38": { + "x": 0.0, + "y": -0.019747084006667137, + "z": 0.022289849817752838 + }, + "39": { + "x": 0.0, + "y": -0.027843784540891647, + "z": 0.010559754446148872 + }, + "4": { + "x": 0.014816462062299252, + "y": 0.0057308273389935493, + "z": -0.011409667320549488 + }, + "40": { + "x": 0.0, + "y": -0.023066908121109009, + "z": 0.018833547830581665 + }, + "41": { + "x": 0.0, + "y": 0.0023962082341313362, + "z": 0.029682368040084839 + }, + "42": { + "x": 0.0, + "y": -0.015915822237730026, + "z": 0.025168856605887413 + }, + "43": { + "x": 0.0, + "y": -0.011672346852719784, + "z": 0.027396004647016525 + }, + "44": { + "x": 0.0, + "y": -0.0071265646256506443, + "z": 0.028913609683513641 + }, + "45": { + "x": 0.0, + "y": 0.025789311155676842, + "z": 0.014889465644955635 + }, + "46": { + "x": 0.0, + "y": 0.019747084006667137, + "z": 0.022289849817752838 + }, + "47": { + "x": 0.0, + "y": 0.023066908121109009, + "z": 0.018833547830581665 + }, + "48": { + "x": 0.0, + "y": 0.027843784540891647, + "z": 0.010559754446148872 + }, + "49": { + "x": 0.0, + "y": 0.029177118092775345, + "z": 0.0059565515257418156 + }, + "5": { + "x": 0.014816462062299252, + "y": -0.017889462411403656, + "z": -0.023806551471352577 + }, + "50": { + "x": 0.0, + "y": 0.0071265646256506443, + "z": 0.028913609683513641 + }, + "51": { + "x": 0.0, + "y": 0.015915822237730026, + "z": 0.025168856605887413 + }, + "52": { + "x": 0.014816462062299252, + "y": 0.029561810195446014, + "z": -0.0035894536413252354 + }, + "53": { + "x": 0.014816462062299252, + "y": 0.026903789490461349, + "z": -0.012766006402671337 + }, + "54": { + "x": 0.014816462062299252, + "y": -0.026903789490461349, + "z": -0.012766006402671337 + }, + "55": { + "x": 0.014816462062299252, + "y": -0.01383895892649889, + "z": -0.026367934420704842 + }, + "56": { + "x": 0.014816462062299252, + "y": -0.0094300340861082077, + "z": -0.028246402740478516 + }, + "57": { + "x": 0.014816462062299252, + "y": -0.021476637572050095, + "z": -0.020628591999411583 + }, + "58": { + "x": 0.014816462062299252, + "y": -0.029177118092775345, + "z": 0.0059565515257418156 + }, + "59": { + "x": 0.014816462062299252, + "y": -0.029754780232906342, + "z": 0.0011990766506642103 + }, + "6": { + "x": 0.014816462062299252, + "y": 0.010380548425018787, + "z": 0.0059743961319327354 + }, + "60": { + "x": 0.014816462062299252, + "y": -0.029561810195446014, + "z": -0.0035894536413252354 + }, + "61": { + "x": 0.014816462062299252, + "y": -0.028603203594684601, + "z": -0.008285018615424633 + }, + "62": { + "x": 0.014816462062299252, + "y": -0.024507580325007439, + "z": -0.016916360706090927 + }, + "63": { + "x": 0.014816462062299252, + "y": 0.0047768764197826385, + "z": -0.029393302276730537 + }, + "64": { + "x": 0.014816462062299252, + "y": -2.045294925157771e-19, + "z": -0.02977893128991127 + }, + "65": { + "x": 0.014816462062299252, + "y": 0.01383895892649889, + "z": -0.026367934420704842 + }, + "66": { + "x": 0.014816462062299252, + "y": 0.017889462411403656, + "z": -0.023806551471352577 + }, + "67": { + "x": 0.014816462062299252, + "y": 0.0094300340861082077, + "z": -0.028246402740478516 + }, + "68": { + "x": 0.014816462062299252, + "y": 0.024507580325007439, + "z": -0.016916360706090927 + }, + "69": { + "x": 0.014816462062299252, + "y": 0.021476637572050095, + "z": -0.020628591999411583 + }, + "7": { + "x": 0.014816462062299252, + "y": -0.010380548425018787, + "z": -0.011409667320549488 + }, + "70": { + "x": 0.014816462062299252, + "y": 0.028603203594684601, + "z": -0.008285018615424633 + }, + "71": { + "x": 0.014816462062299252, + "y": -0.0023962082341313362, + "z": 0.029682368040084839 + }, + "72": { + "x": 0.014816462062299252, + "y": -0.019747084006667137, + "z": 0.022289849817752838 + }, + "73": { + "x": 0.014816462062299252, + "y": -0.027843784540891647, + "z": 0.010559754446148872 + }, + "74": { + "x": 0.014816462062299252, + "y": -0.023066908121109009, + "z": 0.018833547830581665 + }, + "75": { + "x": 0.014816462062299252, + "y": 0.0023962082341313362, + "z": 0.029682368040084839 + }, + "76": { + "x": 0.014816462062299252, + "y": -0.011672346852719784, + "z": 0.027396004647016525 + }, + "77": { + "x": 0.014816462062299252, + "y": -0.015915822237730026, + "z": 0.025168856605887413 + }, + "78": { + "x": 0.014816462062299252, + "y": -0.0071265646256506443, + "z": 0.028913609683513641 + }, + "79": { + "x": 0.014816462062299252, + "y": 0.025789311155676842, + "z": 0.014889465644955635 + }, + "8": { + "x": 0.014816462062299252, + "y": -0.010380548425018787, + "z": 0.011091546155512333 + }, + "80": { + "x": 0.014816462062299252, + "y": 0.023066908121109009, + "z": 0.018833547830581665 + }, + "81": { + "x": 0.014816462062299252, + "y": 0.019747084006667137, + "z": 0.022289849817752838 + }, + "82": { + "x": 0.014816462062299252, + "y": 0.027843784540891647, + "z": 0.010559754446148872 + }, + "83": { + "x": 0.014816462062299252, + "y": 0.029177118092775345, + "z": 0.0059565515257418156 + }, + "84": { + "x": 0.014816462062299252, + "y": 0.0071265646256506443, + "z": 0.028913609683513641 + }, + "85": { + "x": 0.014816462062299252, + "y": 0.015915822237730026, + "z": 0.025168856605887413 + }, + "86": { + "x": 0.05451495572924614, + "y": -0.010380548425018787, + "z": -0.011409667320549488 + }, + "87": { + "x": 0.05451495572924614, + "y": -0.010380548425018787, + "z": 0.011409667320549488 + }, + "88": { + "x": 0.05451495572924614, + "y": -0.0068432968109846115, + "z": -0.011409667320549488 + }, + "89": { + "x": 0.05451495572924614, + "y": 0.010380548425018787, + "z": 0.011409667320549488 + }, + "9": { + "x": 0.014816462062299252, + "y": -0.025789311155676842, + "z": 0.014889465644955635 + }, + "90": { + "x": 0.05451495572924614, + "y": 0.010380548425018787, + "z": -0.011409667320549488 + }, + "91": { + "x": 0.05451495572924614, + "y": 0.0068432968109846115, + "z": 0.011409667320549488 + }, + "92": { + "x": 0.05451495572924614, + "y": -0.017271781340241432, + "z": 0.028796831145882607 + }, + "93": { + "x": 0.05451495572924614, + "y": -0.017271781340241432, + "z": -0.028796831145882607 + }, + "94": { + "x": 0.070000000298023224, + "y": -0.017271781340241432, + "z": -0.028796831145882607 + }, + "95": { + "x": 0.070000000298023224, + "y": -0.017271781340241432, + "z": 0.028796831145882607 + }, + "96": { + "x": 0.05451495572924614, + "y": 0.017271781340241432, + "z": -0.028796831145882607 + }, + "97": { + "x": 0.070000000298023224, + "y": 0.017271781340241432, + "z": -0.028796831145882607 + }, + "98": { + "x": 0.05451495572924614, + "y": 0.017271781340241432, + "z": 0.028796831145882607 + }, + "99": { + "x": 0.070000000298023224, + "y": 0.017271781340241432, + "z": 0.028796831145882607 + } + } + }, + "datatype": "compas.datastructures/Mesh" + }, + "root_name": "ee_link" + }, + "link_name": "ee_link", + "touch_links": [ + "ee_link" + ], + "weight": 0.0 + }, + { + "collision_mesh": { + "frame": { + "point": [ + 0.076000000000000012, + 0.0, + 0.0 + ], + "xaxis": [ + 0.0, + 0.0, + 1.0 + ], + "yaxis": [ + 0.0, + 1.0, + -0.0 + ] + }, + "id": "brick", + "mesh": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Mesh" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 1, + 2, + 3 + ], + "1": [ + 3, + 0, + 1 + ], + "10": [ + 5, + 6, + 7 + ], + "11": [ + 7, + 4, + 5 + ], + "2": [ + 3, + 5, + 4 + ], + "3": [ + 4, + 0, + 3 + ], + "4": [ + 2, + 6, + 5 + ], + "5": [ + 5, + 3, + 2 + ], + "6": [ + 1, + 7, + 6 + ], + "7": [ + 6, + 2, + 1 + ], + "8": [ + 0, + 4, + 7 + ], + "9": [ + 7, + 1, + 0 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "10": {}, + "11": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {}, + "6": {}, + "7": {}, + "8": {}, + "9": {} + }, + "max_face": 11, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + }, + "root_name": "ee_link" + }, + "link_name": "ee_link", + "touch_links": [ + "ee_link" + ], + "weight": 0.0 + } + ], + "fraction": 0.0, + "joint_names": [ + "shoulder_pan_joint", + "shoulder_lift_joint", + "elbow_joint", + "wrist_1_joint", + "wrist_2_joint", + "wrist_3_joint" + ], + "points": [ + { + "accelerations": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "effort": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + "joint_names": [], + "time_from_start": { + "nsecs": 0, + "secs": 0 + }, + "types": [ + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + 1.2508678154001351, + -0.96338774666025073, + 1.5959014339362707, + -2.2038257140069684, + -1.5714037604374487, + 2.437691549934538 + ], + "velocities": [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ] + } + ], + "start_configuration": { + "joint_names": [ + "shoulder_pan_joint", + "shoulder_lift_joint", + "elbow_joint", + "wrist_1_joint", + "wrist_2_joint", + "wrist_3_joint" + ], + "types": [ + 0, + 0, + 0, + 0, + 0, + 0 + ], + "values": [ + -5.0192242581509605, + 0.54270752820404777, + -1.5949343136256129, + 5.764117048539835, + 4.7117687243612192, + -3.8121901801326201 + ] + } + } + }, + "place_tolerance": 0.0080000000000000002 + }, + "edge": { + "0": {}, + "1": {}, + "10": {}, + "11": {}, + "12": {}, + "13": {}, + "14": {}, + "15": {}, + "16": {}, + "17": {}, + "18": {}, + "19": {}, + "2": {}, + "20": {}, + "21": {}, + "22": {}, + "23": {}, + "24": {}, + "25": {}, + "26": {}, + "27": {}, + "28": {}, + "29": {}, + "3": {}, + "30": {}, + "31": {}, + "32": {}, + "33": {}, + "34": {}, + "35": {}, + "36": {}, + "37": {}, + "38": {}, + "39": {}, + "4": {}, + "40": {}, + "41": {}, + "42": {}, + "43": {}, + "44": {}, + "45": {}, + "46": {}, + "47": {}, + "48": {}, + "49": {}, + "5": {}, + "50": {}, + "51": {}, + "52": {}, + "53": {}, + "54": {}, + "55": {}, + "56": {}, + "57": {}, + "58": {}, + "59": {}, + "6": {}, + "7": {}, + "8": {}, + "9": {} + }, + "edge_attributes": {}, + "max_int_key": 59, + "node": { + "0": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306254295e-05, + 0.60000967964775032, + 0.056000022194771577 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559729e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320935 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306254295e-05, + 0.60000967964775032, + 0.0060000221947715763 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559725e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320968 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 5.4896010306254295e-05, + "y": 0.60000967964775032, + "z": 0.0060000221947715763 + }, + "1": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306261938e-05, + 0.62514467964775022, + 0.056000022194771577 + ], + "xaxis": [ + 0.17364817766693022, + -0.98480775301220813, + 2.2497195079074213e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862111, + 0.0007963267107333207 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306261938e-05, + 0.62514467964775022, + 0.0060000221947715763 + ], + "xaxis": [ + 0.17364817766693022, + -0.98480775301220813, + 2.2497195079074213e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862111, + 0.00079632671073332081 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 5.4896010306261938e-05, + "y": 0.62514467964775022, + "z": 0.0060000221947715763 + }, + "10": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884063, + 0.62740588164654476, + 0.056000022194771577 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -5.7625345467604548e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.0007963267107333568 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884063, + 0.62740588164654476, + 0.0060000221947715763 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -5.7625345467604548e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.0007963267107333568 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.10205168388884063, + "y": 0.62740588164654476, + "z": 0.0060000221947715763 + }, + "11": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884067, + 0.65479088164654464, + 0.056000022194771577 + ], + "xaxis": [ + 0.37460659341591218, + -0.92718385456678731, + 5.5890621991627741e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.3746064746400869, + 0.00079632671073311882 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884067, + 0.65479088164654464, + 0.0060000221947715763 + ], + "xaxis": [ + 0.37460659341591218, + -0.92718385456678731, + 5.5890621991627741e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.3746064746400869, + 0.00079632671073311904 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.10205168388884067, + "y": 0.65479088164654464, + "z": 0.0060000221947715763 + }, + "12": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.015554896010306254, + 0.6000096796477502, + 0.065000022194771592 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559729e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320935 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.015554896010306254, + 0.6000096796477502, + 0.015000022194771584 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559725e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320968 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.015554896010306254, + "y": 0.6000096796477502, + "z": 0.015000022194771584 + }, + "13": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.015554896010306261, + 0.62514467964775022, + 0.065000022194771592 + ], + "xaxis": [ + 0.17364817766693022, + -0.98480775301220813, + 2.2497195079074213e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862111, + 0.0007963267107333207 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.015554896010306261, + 0.62514467964775022, + 0.015000022194771584 + ], + "xaxis": [ + 0.17364817766693022, + -0.98480775301220813, + 2.2497195079074213e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862111, + 0.00079632671073332081 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.015554896010306261, + "y": 0.62514467964775022, + "z": 0.015000022194771584 + }, + "14": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.015554896010306254, + 0.65027967964775024, + 0.065000022194771592 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559729e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320935 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.015554896010306254, + 0.65027967964775024, + 0.015000022194771584 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559725e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320968 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.015554896010306254, + "y": 0.65027967964775024, + "z": 0.015000022194771584 + }, + "15": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.049554087068290092, + 0.60001348542071642, + 0.065000022194771592 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.4965520062657518e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073334824 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.049554087068290092, + 0.60001348542071642, + 0.015000022194771584 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.4965520062657518e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073334824 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.049554087068290092, + "y": 0.60001348542071642, + "z": 0.015000022194771584 + }, + "16": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.049554087068290058, + 0.62589848542071658, + 0.065000022194771592 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.3881317890172014e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073323711 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.049554087068290058, + 0.62589848542071658, + 0.015000022194771584 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.3881317890172014e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073323711 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.049554087068290058, + "y": 0.62589848542071658, + "z": 0.015000022194771584 + }, + "17": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.049554087068290086, + 0.65178348542071651, + 0.065000022194771592 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.3881317890172014e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073323711 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.049554087068290086, + 0.65178348542071651, + 0.015000022194771584 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.3881317890172014e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073323711 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.049554087068290086, + "y": 0.65178348542071651, + "z": 0.015000022194771584 + }, + "18": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.083553014619514004, + 0.60001722549406833, + 0.065000022194771592 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + 3.7947076036992646e-19 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073320881 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.083553014619514004, + 0.60001722549406833, + 0.015000022194771584 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + 3.7947076036992646e-19 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073320881 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.083553014619514004, + "y": 0.60001722549406833, + "z": 0.015000022194771584 + }, + "19": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.083553014619514004, + 0.62665222549406829, + 0.065000022194771592 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + 3.7947076036992646e-19 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073320881 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.083553014619514004, + 0.62665222549406829, + 0.015000022194771584 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + 3.7947076036992646e-19 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073320881 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.083553014619514004, + "y": 0.62665222549406829, + "z": 0.015000022194771584 + }, + "2": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306254295e-05, + 0.65027967964775035, + 0.056000022194771577 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559729e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320935 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306254295e-05, + 0.65027967964775035, + 0.0060000221947715763 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559725e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320968 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 5.4896010306254295e-05, + "y": 0.65027967964775035, + "z": 0.0060000221947715763 + }, + "20": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.083553014619513977, + 0.65328722549406826, + 0.065000022194771592 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + 3.7947076036992646e-19 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073320881 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.083553014619513977, + 0.65328722549406826, + 0.015000022194771584 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + 3.7947076036992646e-19 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073320881 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.083553014619513977, + "y": 0.65328722549406826, + "z": 0.015000022194771584 + }, + "21": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.1175516838888407, + 0.60002088164654477, + 0.065000022194771592 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -6.1257422745430985e-18 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.00079632671073322529 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.1175516838888407, + 0.60002088164654477, + 0.015000022194771584 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -6.1257422745430985e-18 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.00079632671073322529 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.1175516838888407, + "y": 0.60002088164654477, + "z": 0.015000022194771584 + }, + "22": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.11755168388884067, + 0.62740588164654476, + 0.065000022194771592 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -5.7625345467604548e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.0007963267107333568 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.11755168388884067, + 0.62740588164654476, + 0.015000022194771584 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -5.7625345467604548e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.0007963267107333568 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.11755168388884067, + "y": 0.62740588164654476, + "z": 0.015000022194771584 + }, + "23": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.11755168388884066, + 0.65479088164654475, + 0.065000022194771592 + ], + "xaxis": [ + 0.37460659341591218, + -0.92718385456678731, + 5.5890621991627741e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.3746064746400869, + 0.00079632671073311882 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.11755168388884066, + 0.65479088164654475, + 0.015000022194771584 + ], + "xaxis": [ + 0.37460659341591218, + -0.92718385456678731, + 5.5890621991627741e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.3746064746400869, + 0.00079632671073311904 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.11755168388884066, + "y": 0.65479088164654475, + "z": 0.015000022194771584 + }, + "24": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306254295e-05, + 0.60000967964775032, + 0.074000022194771586 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559729e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320935 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306254295e-05, + 0.60000967964775032, + 0.024000022194771591 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559725e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320968 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 5.4896010306254295e-05, + "y": 0.60000967964775032, + "z": 0.024000022194771591 + }, + "25": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306261938e-05, + 0.62514467964775033, + 0.074000022194771586 + ], + "xaxis": [ + 0.17364817766693022, + -0.98480775301220813, + 2.2497195079074213e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862111, + 0.0007963267107333207 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306261938e-05, + 0.62514467964775033, + 0.024000022194771591 + ], + "xaxis": [ + 0.17364817766693022, + -0.98480775301220813, + 2.2497195079074213e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862111, + 0.00079632671073332081 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 5.4896010306261938e-05, + "y": 0.62514467964775033, + "z": 0.024000022194771591 + }, + "26": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306254295e-05, + 0.65027967964775035, + 0.074000022194771586 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559729e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320935 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306254295e-05, + 0.65027967964775035, + 0.024000022194771591 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559725e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320968 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 5.4896010306254295e-05, + "y": 0.65027967964775035, + "z": 0.024000022194771591 + }, + "27": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290079, + 0.60001348542071631, + 0.074000022194771586 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.4694469519536142e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073332016 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290079, + 0.60001348542071631, + 0.024000022194771591 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.4694469519536142e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073332016 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.034054087068290079, + "y": 0.60001348542071631, + "z": 0.024000022194771591 + }, + "28": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290072, + 0.62589848542071647, + 0.074000022194771586 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.415236843329339e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073320924 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290072, + 0.62589848542071647, + 0.024000022194771591 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.415236843329339e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073320924 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.034054087068290072, + "y": 0.62589848542071647, + "z": 0.024000022194771591 + }, + "29": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290072, + 0.65178348542071629, + 0.074000022194771586 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.415236843329339e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073320924 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290072, + 0.65178348542071629, + 0.024000022194771591 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.415236843329339e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073320924 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.034054087068290072, + "y": 0.65178348542071629, + "z": 0.024000022194771591 + }, + "3": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290079, + 0.60001348542071631, + 0.056000022194771577 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.4694469519536142e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073332016 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290079, + 0.60001348542071631, + 0.0060000221947715763 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.4694469519536142e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073332016 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.034054087068290079, + "y": 0.60001348542071631, + "z": 0.0060000221947715763 + }, + "30": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619513991, + 0.60001722549406844, + 0.074000022194771586 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325174 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619513991, + 0.60001722549406844, + 0.024000022194771591 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325153 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.068053014619513991, + "y": 0.60001722549406844, + "z": 0.024000022194771591 + }, + "31": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619513991, + 0.62665222549406829, + 0.074000022194771586 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325174 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619513991, + 0.62665222549406829, + 0.024000022194771591 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325153 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.068053014619513991, + "y": 0.62665222549406829, + "z": 0.024000022194771591 + }, + "32": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619514018, + 0.65328722549406848, + 0.074000022194771586 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325174 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619514018, + 0.65328722549406848, + 0.024000022194771591 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325153 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.068053014619514018, + "y": 0.65328722549406848, + "z": 0.024000022194771591 + }, + "33": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884066, + 0.60002088164654488, + 0.074000022194771586 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -6.1257422745430985e-18 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.00079632671073322529 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884066, + 0.60002088164654488, + 0.024000022194771591 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -6.1257422745430985e-18 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.00079632671073322529 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.10205168388884066, + "y": 0.60002088164654488, + "z": 0.024000022194771591 + }, + "34": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884063, + 0.62740588164654476, + 0.074000022194771586 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -5.7625345467604548e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.0007963267107333568 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884063, + 0.62740588164654476, + 0.024000022194771591 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -5.7625345467604548e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.0007963267107333568 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.10205168388884063, + "y": 0.62740588164654476, + "z": 0.024000022194771591 + }, + "35": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884067, + 0.65479088164654464, + 0.074000022194771586 + ], + "xaxis": [ + 0.37460659341591218, + -0.92718385456678731, + 5.5890621991627741e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.3746064746400869, + 0.00079632671073311882 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884067, + 0.65479088164654464, + 0.024000022194771591 + ], + "xaxis": [ + 0.37460659341591218, + -0.92718385456678731, + 5.5890621991627741e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.3746064746400869, + 0.00079632671073311904 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.10205168388884067, + "y": 0.65479088164654464, + "z": 0.024000022194771591 + }, + "36": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.015554896010306254, + 0.6000096796477502, + 0.083000022194771594 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559729e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320935 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.015554896010306254, + 0.6000096796477502, + 0.033000022194771599 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559725e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320968 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.015554896010306254, + "y": 0.6000096796477502, + "z": 0.033000022194771599 + }, + "37": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.015554896010306275, + 0.62514467964775022, + 0.083000022194771594 + ], + "xaxis": [ + 0.17364817766693022, + -0.98480775301220813, + 2.2497195079074213e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862111, + 0.0007963267107333207 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.015554896010306275, + 0.62514467964775022, + 0.033000022194771599 + ], + "xaxis": [ + 0.17364817766693022, + -0.98480775301220813, + 2.2497195079074213e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862111, + 0.00079632671073332081 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.015554896010306275, + "y": 0.62514467964775022, + "z": 0.033000022194771599 + }, + "38": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.015554896010306254, + 0.65027967964775024, + 0.083000022194771594 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559729e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320935 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.015554896010306254, + 0.65027967964775024, + 0.033000022194771599 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559725e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320968 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.015554896010306254, + "y": 0.65027967964775024, + "z": 0.033000022194771599 + }, + "39": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.049554087068290092, + 0.60001348542071642, + 0.083000022194771594 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.4965520062657518e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073334824 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.049554087068290092, + 0.60001348542071642, + 0.033000022194771599 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.4965520062657518e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073334824 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.049554087068290092, + "y": 0.60001348542071642, + "z": 0.033000022194771599 + }, + "4": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290072, + 0.62589848542071647, + 0.056000022194771577 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.415236843329339e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073320924 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290072, + 0.62589848542071647, + 0.0060000221947715763 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.415236843329339e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073320924 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.034054087068290072, + "y": 0.62589848542071647, + "z": 0.0060000221947715763 + }, + "40": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.049554087068290058, + 0.62589848542071647, + 0.083000022194771594 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.3881317890172014e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073323711 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.049554087068290058, + 0.62589848542071647, + 0.033000022194771599 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.3881317890172014e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073323711 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.049554087068290058, + "y": 0.62589848542071647, + "z": 0.033000022194771599 + }, + "41": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.049554087068290086, + 0.6517834854207164, + 0.083000022194771594 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.3881317890172014e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073323711 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.049554087068290086, + 0.6517834854207164, + 0.033000022194771599 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.3881317890172014e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073323711 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.049554087068290086, + "y": 0.6517834854207164, + "z": 0.033000022194771599 + }, + "42": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.083553014619514004, + 0.60001722549406833, + 0.083000022194771594 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + 3.7947076036992646e-19 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073320881 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.083553014619514004, + 0.60001722549406833, + 0.033000022194771599 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + 3.7947076036992646e-19 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073320881 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.083553014619514004, + "y": 0.60001722549406833, + "z": 0.033000022194771599 + }, + "43": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.083553014619514004, + 0.62665222549406829, + 0.083000022194771594 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + 3.7947076036992646e-19 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073320881 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.083553014619514004, + 0.62665222549406829, + 0.033000022194771599 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + 3.7947076036992646e-19 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073320881 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.083553014619514004, + "y": 0.62665222549406829, + "z": 0.033000022194771599 + }, + "44": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.083553014619514004, + 0.65328722549406826, + 0.083000022194771594 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + 3.7947076036992646e-19 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073320881 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.083553014619514004, + 0.65328722549406826, + 0.033000022194771599 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + 3.7947076036992646e-19 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073320881 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.083553014619514004, + "y": 0.65328722549406826, + "z": 0.033000022194771599 + }, + "45": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.1175516838888407, + 0.60002088164654488, + 0.083000022194771594 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -6.1257422745430985e-18 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.00079632671073322529 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.1175516838888407, + 0.60002088164654488, + 0.033000022194771599 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -6.1257422745430985e-18 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.00079632671073322529 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.1175516838888407, + "y": 0.60002088164654488, + "z": 0.033000022194771599 + }, + "46": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.11755168388884067, + 0.62740588164654476, + 0.083000022194771594 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -5.7625345467604548e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.0007963267107333568 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.11755168388884067, + 0.62740588164654476, + 0.033000022194771599 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -5.7625345467604548e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.0007963267107333568 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.11755168388884067, + "y": 0.62740588164654476, + "z": 0.033000022194771599 + }, + "47": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.11755168388884066, + 0.65479088164654475, + 0.083000022194771594 + ], + "xaxis": [ + 0.37460659341591218, + -0.92718385456678731, + 5.5890621991627741e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.3746064746400869, + 0.00079632671073311882 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.11755168388884066, + 0.65479088164654475, + 0.033000022194771599 + ], + "xaxis": [ + 0.37460659341591218, + -0.92718385456678731, + 5.5890621991627741e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.3746064746400869, + 0.00079632671073311904 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.11755168388884066, + "y": 0.65479088164654475, + "z": 0.033000022194771599 + }, + "48": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306254295e-05, + 0.60000967964775032, + 0.092000022194771602 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559729e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320935 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306254295e-05, + 0.60000967964775032, + 0.042000022194771607 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559725e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320968 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 5.4896010306254295e-05, + "y": 0.60000967964775032, + "z": 0.042000022194771607 + }, + "49": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306261938e-05, + 0.62514467964775033, + 0.092000022194771602 + ], + "xaxis": [ + 0.17364817766693022, + -0.98480775301220813, + 2.2497195079074213e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862111, + 0.0007963267107333207 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306261938e-05, + 0.62514467964775033, + 0.042000022194771607 + ], + "xaxis": [ + 0.17364817766693022, + -0.98480775301220813, + 2.2497195079074213e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862111, + 0.00079632671073332081 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 5.4896010306261938e-05, + "y": 0.62514467964775033, + "z": 0.042000022194771607 + }, + "5": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290072, + 0.65178348542071629, + 0.056000022194771577 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.415236843329339e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073320924 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290072, + 0.65178348542071629, + 0.0060000221947715763 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.415236843329339e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073320924 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.034054087068290072, + "y": 0.65178348542071629, + "z": 0.0060000221947715763 + }, + "50": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306254295e-05, + 0.65027967964775035, + 0.092000022194771602 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559729e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320935 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 5.4896010306254295e-05, + 0.65027967964775035, + 0.042000022194771607 + ], + "xaxis": [ + 0.17364817766693044, + -0.98480775301220813, + 2.3581397251559725e-18 + ], + "yaxis": [ + 0.98480744076102078, + 0.17364812260862134, + 0.00079632671073320968 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 5.4896010306254295e-05, + "y": 0.65027967964775035, + "z": 0.042000022194771607 + }, + "51": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290079, + 0.60001348542071631, + 0.092000022194771602 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.4694469519536142e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073332016 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290079, + 0.60001348542071631, + 0.042000022194771607 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.4694469519536142e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073332016 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.034054087068290079, + "y": 0.60001348542071631, + "z": 0.042000022194771607 + }, + "52": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290072, + 0.62589848542071647, + 0.092000022194771602 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.415236843329339e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073320924 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290072, + 0.62589848542071647, + 0.042000022194771607 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.415236843329339e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073320924 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.034054087068290072, + "y": 0.62589848542071647, + "z": 0.042000022194771607 + }, + "53": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290072, + 0.65178348542071629, + 0.092000022194771602 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.415236843329339e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073320924 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.034054087068290072, + 0.65178348542071629, + 0.042000022194771607 + ], + "xaxis": [ + 0.24192189559966767, + -0.97029572627599647, + -3.415236843329339e-18 + ], + "yaxis": [ + 0.97029541862611068, + 0.24192181889393607, + 0.00079632671073320924 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.034054087068290072, + "y": 0.65178348542071629, + "z": 0.042000022194771607 + }, + "54": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619513991, + 0.60001722549406844, + 0.092000022194771602 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325174 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619513991, + 0.60001722549406844, + 0.042000022194771607 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325153 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.068053014619513991, + "y": 0.60001722549406844, + "z": 0.042000022194771607 + }, + "55": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619514018, + 0.62665222549406829, + 0.092000022194771602 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325174 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619514018, + 0.62665222549406829, + 0.042000022194771607 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325153 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.068053014619514018, + "y": 0.62665222549406829, + "z": 0.042000022194771607 + }, + "56": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619514046, + 0.65328722549406848, + 0.092000022194771602 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325174 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619514046, + 0.65328722549406848, + 0.042000022194771607 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325153 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.068053014619514046, + "y": 0.65328722549406848, + "z": 0.042000022194771607 + }, + "57": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884063, + 0.60002088164654477, + 0.092000022194771602 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -6.1257422745430985e-18 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.00079632671073322529 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884063, + 0.60002088164654477, + 0.042000022194771607 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -6.1257422745430985e-18 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.00079632671073322529 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.10205168388884063, + "y": 0.60002088164654477, + "z": 0.042000022194771607 + }, + "58": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884063, + 0.62740588164654476, + 0.092000022194771602 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -5.7625345467604548e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.0007963267107333568 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884063, + 0.62740588164654476, + 0.042000022194771607 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -5.7625345467604548e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.0007963267107333568 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.10205168388884063, + "y": 0.62740588164654476, + "z": 0.042000022194771607 + }, + "59": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884064, + 0.65479088164654464, + 0.092000022194771602 + ], + "xaxis": [ + 0.37460659341591218, + -0.92718385456678731, + 5.5890621991627741e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.3746064746400869, + 0.00079632671073311882 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884064, + 0.65479088164654464, + 0.042000022194771607 + ], + "xaxis": [ + 0.37460659341591218, + -0.92718385456678731, + 5.5890621991627741e-17 + ], + "yaxis": [ + 0.92718356058630369, + 0.3746064746400869, + 0.00079632671073311904 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.10205168388884064, + "y": 0.65479088164654464, + "z": 0.042000022194771607 + }, + "6": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619513991, + 0.60001722549406844, + 0.056000022194771577 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325174 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619513991, + 0.60001722549406844, + 0.0060000221947715763 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325153 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.068053014619513991, + "y": 0.60001722549406844, + "z": 0.0060000221947715763 + }, + "7": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619513991, + 0.62665222549406829, + 0.056000022194771577 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325174 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619513991, + 0.62665222549406829, + 0.0060000221947715763 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325153 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.068053014619513991, + "y": 0.62665222549406829, + "z": 0.0060000221947715763 + }, + "8": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619514018, + 0.65328722549406837, + 0.056000022194771577 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325174 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.068053014619514018, + 0.65328722549406837, + 0.0060000221947715763 + ], + "xaxis": [ + 0.30901699437494767, + -0.95105651629515353, + -3.8760227666356784e-18 + ], + "yaxis": [ + 0.95105621474540869, + 0.30901689639549618, + 0.00079632671073325153 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.068053014619514018, + "y": 0.65328722549406837, + "z": 0.0060000221947715763 + }, + "9": { + "element": { + "dtype": "assembly/Element", + "value": { + "approach_frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884066, + 0.60002088164654477, + 0.056000022194771577 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -6.1257422745430985e-18 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.00079632671073322529 + ] + } + }, + "frame": { + "dtype": "compas.geometry/Frame", + "value": { + "point": [ + 0.10205168388884066, + 0.60002088164654477, + 0.0060000221947715763 + ], + "xaxis": [ + 0.37460659341591196, + -0.92718385456678742, + -6.1257422745430985e-18 + ], + "yaxis": [ + 0.92718356058630369, + 0.37460647464008662, + 0.00079632671073322529 + ] + } + }, + "geometry_at_origin": { + "dtype": "compas.datastructures/Mesh", + "value": { + "compas": "1.1.0", + "data": { + "attributes": { + "name": "Box" + }, + "dea": {}, + "dfa": {}, + "dva": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "edgedata": {}, + "face": { + "0": [ + 0, + 1, + 2, + 3 + ], + "1": [ + 0, + 3, + 5, + 4 + ], + "2": [ + 3, + 2, + 6, + 5 + ], + "3": [ + 2, + 1, + 7, + 6 + ], + "4": [ + 1, + 0, + 4, + 7 + ], + "5": [ + 4, + 5, + 6, + 7 + ] + }, + "facedata": { + "0": {}, + "1": {}, + "2": {}, + "3": {}, + "4": {}, + "5": {} + }, + "max_face": 5, + "max_vertex": 7, + "vertex": { + "0": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "1": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "2": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": -0.0060000000000000001 + }, + "3": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": -0.0060000000000000001 + }, + "4": { + "x": -0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "5": { + "x": 0.0080000000000000002, + "y": -0.0155, + "z": 0.0060000000000000001 + }, + "6": { + "x": 0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + }, + "7": { + "x": -0.0080000000000000002, + "y": 0.0155, + "z": 0.0060000000000000001 + } + } + }, + "datatype": "compas.datastructures/Mesh" + } + }, + "trajectory": null + } + }, + "x": 0.10205168388884066, + "y": 0.60002088164654477, + "z": 0.0060000221947715763 + } + }, + "node_attributes": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + } + }, + "datatype": "assembly/Assembly" + } +} \ No newline at end of file diff --git a/lecture_06/assignment_05/Guillaume Jami/assignment_04.py b/lecture_06/assignment_05/Guillaume Jami/assignment_04.py new file mode 100644 index 0000000..78be362 --- /dev/null +++ b/lecture_06/assignment_05/Guillaume Jami/assignment_04.py @@ -0,0 +1,7 @@ +import os + +def test_directory(filename): + HERE = os.path.dirname(__file__) + filepath = os.path.join(HERE, filename) + print(filepath) + return filepath \ No newline at end of file diff --git a/lecture_06/assignment_05/Guillaume Jami/assignment_05_GJ.ghx b/lecture_06/assignment_05/Guillaume Jami/assignment_05_GJ.ghx new file mode 100644 index 0000000..ae6ccb5 --- /dev/null +++ b/lecture_06/assignment_05/Guillaume Jami/assignment_05_GJ.ghx @@ -0,0 +1,11653 @@ + + + + + + + + 0 + 2 + 2 + + + + + + + 1 + 0 + 7 + + + + + + c4f913db-409d-41a9-88e1-f6f90989047d + Shaded + 1 + + 100;150;0;0 + + + 100;0;150;0 + + + + + + 637527254194888879 + + assignment_05_GJ.ghx + + + + + 0 + + + + + + -649 + -36 + + 0.869564235 + + + + + 0 + + + + + + + 0 + + + + + 1 + + + + + GhPython, Version=6.29.20238.11501, Culture=neutral, PublicKeyToken=null + 6.29.20238.11501 + + 00000000-0000-0000-0000-000000000000 + + + + + + + + + 105 + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + 5937d47f-10eb-43c2-b0f8-c788d579c8db + 76c149ba-07e7-470c-8952-7038c2cb9b2d + 2 + d2f1c6ac-f289-4bf1-8d1a-fe567b650ce6 + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + a003596c-fc8d-4ac5-a6f1-fd7555dd239b + 781902aa-fb33-4d03-bad8-fce4aafa0416 + 2c6392f9-9507-48f4-b75d-443af7101485 + 3 + c449f738-48e0-463f-84c2-3de642e2c783 + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + 19ea3000-8a91-4bca-8866-792502605bcd + d3765dd9-51b9-48b1-8583-25508339aed8 + 2 + f0abb7d1-5703-409d-aeeb-f17578617f22 + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + 7ab9dd8f-ef96-4fa7-83c6-73bbfa8256ad + e65f93ac-4a14-4fef-afc6-44d78530e45e + 38da7932-bace-4722-99e8-41530a8b7e79 + d87fb28a-1fe7-43f1-9815-d869f233b385 + 4 + 91dc31bc-730d-43e4-993d-d12c2e540cdb + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + 04b7fd46-609e-48b8-a151-5e9495abbd13 + af35f706-7af8-4260-b588-358a993d1352 + fbd9e873-ec49-47bc-8d5c-258d8036b745 + 3 + 561e86fd-5bc2-413d-b114-88ab13b1e128 + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + ebe99570-fddf-41df-aa4c-5d4202f08c7f + 475fa148-99eb-4bdd-ad50-28959a3b193d + b626a1f5-5bd9-42c3-96da-26f221b1048e + 3 + 2eab66a4-9eb5-4f2b-a1ca-56352e95fd8b + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + fd9b00a1-4fa2-4250-bf75-9a5d0a375bee + 32a47c5f-6e9f-4fd4-af69-5f33be3c44e4 + 2 + 70cc3701-891d-4c67-962c-3ad2a8b089da + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + 54ebcc2c-2159-48d1-88c8-9c12b4311847 + 9baf9b45-b983-48be-a3c4-ff13530c72c6 + a5f3f98d-e1af-45fc-a57c-8f01a829d2a3 + 314e45dc-6256-4dcc-90c3-aaa1e08b613a + 7e727ff6-4118-4fcc-8d61-a780f76ab28c + d3497764-72f4-4b96-9c43-e4b12c91e0f7 + 6 + 593256e2-b0be-41aa-a66a-aea94d736564 + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + d59210ff-fb0c-47ac-88e4-bfb3bdd17472 + 8c731948-abe8-4e50-a551-e6a07b85d9c4 + de944dfd-0524-4e32-847a-6d55172e6a96 + 3 + 7b3054d7-6661-482c-9932-e8494405a0cc + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + e4f9217d-c7c3-49af-9a83-834638eb0d4d + d42341b5-06d6-414d-8a72-d1a48effb96f + c6ffa12e-83a0-4af7-8681-e213e9c0ba9f + 87380de2-badc-4b2b-a438-aac8de443f24 + e37b5872-2136-4007-9701-3851c1cc4a87 + 5 + 5f5ad0a5-fe97-4e7a-8035-d77c5fc1da31 + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + 9bde434b-367e-491f-9f01-040b116c4562 + 6a7e4d1a-ceb2-4c60-bd73-b1fd7e57a88d + 453254b0-f451-4808-a6c8-f678281679fd + c789e886-ac48-44a7-8696-71249b62e335 + ffdf9a6f-f4a6-417e-96df-c38d59b6a4da + 4bbbdf99-354b-448e-8eb7-59249cc4e3d0 + b6ce1f01-cf45-408d-b8ba-45a08f564742 + 562c0dcf-a89c-4f0e-9470-6e8b91f11f7e + ca6f4492-c165-4b33-8d01-a55901efe6bd + 9 + 782b7b56-87b9-46aa-9921-048dc9501c7f + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + 726245b8-cd81-4793-93c4-5a74c6fadea6 + a17a3498-e042-4db0-b3e7-eca2f875e5b8 + fa81c62e-402f-4a98-b743-073a361974d6 + 3 + 1ab81cb5-14e4-4818-a0f6-6452a5a799cd + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + 49e35091-c6e9-4be6-af3b-1d3bc207a03a + ecee5b24-b1ed-418d-a4bd-6e0b750fcf1f + b7e20f86-efa7-4972-ae82-910348246785 + 97712fde-30f8-43e4-82bf-959e99216762 + ee91ac60-35dc-4d05-9b63-3e908d900c4e + 54e72725-6aae-4d4b-90ac-7db02740a14e + 60acdc37-fc82-478a-b966-1c2238e744fd + 285d8023-3187-4a8b-b033-5ca8221d7e7c + 0a375a78-f249-4c35-8278-385aecd42907 + a909b265-17c3-49bf-a1cd-31e1a3085e6f + ba4adbea-a1b3-4423-869a-5f5efc4db8fe + 11 + 3783e052-7b8c-43ea-9383-9d6be217070b + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + 5d32bed8-8ecb-420b-94ff-7e259c6e0271 + 34e985cd-859f-4d13-a639-0f4a1845fc21 + c6af1eaf-f143-4a51-80ae-4c170fc22b7e + 2662160f-5d25-46cc-b2fb-037617fa9fc1 + 4 + 13bd7bcd-1021-4f64-b7b2-2956533b3916 + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + 67e77c02-1764-4e11-bf1d-4203f550692e + d366a040-055c-47c4-93f0-6e444f072d66 + cec5af33-7de8-45a7-8a88-c746edfb38bd + 3 + a3e1344f-fdf4-4bf0-b837-3cd1331dc4b0 + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + bfe572e7-d997-4c3c-8488-4e03d01804ea + b278407c-79b3-49ef-a2c8-ee682b33d9ef + 6fe2e9d2-130c-4a02-b347-a1c6b831fc5a + 9a4be73c-3082-4c74-be27-41c7c1688c53 + 4 + bc1e7118-1698-4047-b398-98179fee3923 + Group + + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;148 + + A group of Grasshopper objects + 47c152bc-c823-4835-aad3-3bf5c281e892 + d19cf29a-0512-4632-b4e0-ecc00c5b8487 + 3ed3a5e2-d78a-43c5-99e3-a602e5221e79 + 1cb74eb0-a053-4919-a55e-3175350e261c + 052e844a-59bc-4346-a9d3-a1965fe01a5c + 5 + 809c1f85-d57b-457b-9d16-fe468d3bd119 + Group + + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + 47c152bc-c823-4835-aad3-3bf5c281e892 + Boolean Toggle + Connect + false + 0 + true + + + + + + 44 + 195 + 110 + 22 + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + d19cf29a-0512-4632-b4e0-ecc00c5b8487 + Boolean Toggle + Load robot + false + 0 + false + + + + + + 18 + 156 + 124 + 22 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + import Grasshopper +import System +from ghpythonlib.componentbase import executingcomponent as component +from scriptcontext import sticky as st + +from compas_fab.backends import RosClient +from compas_fab.ghpython.components import create_id + + +class ROSConnect(component): + def SetUpParam(self, p, name, nickname, description): + p.Name = name + p.NickName = nickname + p.Description = description + p.Optional = True + + def RegisterInputParams(self, pManager): + + p = Grasshopper.Kernel.Parameters.Param_String() + self.SetUpParam(p, "ip", "ip", "The ip address of ROS master. Defaults to 127.0.0.1") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Integer() + self.SetUpParam(p, "port", "port", "The port of ROS master. Defaults to 9090.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Boolean() + self.SetUpParam(p, "connect", "connect", "If `True`, connect to ROS. If `False`, disconnect from ROS. Defaults to False.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + def RegisterOutputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "ros_client", "ros_client", "The ROS client.") + self.Params.Output.Add(p) + + def SolveInstance(self, DA): + p0 = self.marshal.GetInput(DA, 0) + p1 = self.marshal.GetInput(DA, 1) + p2 = self.marshal.GetInput(DA, 2) + result = self.RunScript(p0, p1, p2) + + if result is not None: + self.marshal.SetOutput(result, DA, 0, True) + + def RunScript(self, ip, port, connect): + ros_client = None + + ip = ip or '127.0.0.1' + port = port or 9090 + + key = create_id(self, 'ros_client') + ros_client = st.get(key, None) + + if ros_client: + st[key].close() + if connect: + st[key] = RosClient(ip, port) + st[key].run(5) + + ros_client = st.get(key, None) + self.Message = 'Connected' if ros_client and ros_client.is_connected else 'Not connected' + return ros_client + + GhPython provides a Python script component + + 223 + 78 + + + 1764 + 967 + + true + true + true + 1 + 3ed3a5e2-d78a-43c5-99e3-a602e5221e79 + true + true + GhPython Script + ROS Connect + + + + + + 205 + 90 + 136 + 98 + + + 268 + 139 + + + + + + 3 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + 39f76aa4-b4b1-4eff-8540-c659df1e991b + ip + ip + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 207 + 92 + 46 + 31 + + + 231.5 + 107.6667 + + + + + + + + true + Script input port. + 745e0055-1456-4b6f-8e8f-d5f74af38e8d + port + port + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 207 + 123 + 46 + 31 + + + 231.5 + 139 + + + + + + + + true + Script input connect. + 140a303b-ef70-4b59-a913-724c0d0505cb + connect + connect + true + 0 + true + 47c152bc-c823-4835-aad3-3bf5c281e892 + 1 + 35915213-5534-4277-81b8-1bdc9e7383d2 + + + + + + 207 + 154 + 46 + 32 + + + 231.5 + 170.3333 + + + + + + + + Script output ros_client. + 54922ac8-ee9c-400b-ac86-feaf21cb04a2 + ros_client + ros_client + false + 0 + + + + + + 283 + 92 + 56 + 94 + + + 311 + 139 + + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + import Grasshopper +import System +from ghpythonlib.componentbase import executingcomponent as component +from scriptcontext import sticky as st + +import compas +from compas_fab.ghpython.components import create_id +from compas_fab.ghpython.components.icons import ros_robot_icon +from compas_ghpython.artists import RobotModelArtist + + +class ROSRobot(component): + def SetUpParam(self, p, name, nickname, description): + p.Name = name + p.NickName = nickname + p.Description = description + p.Optional = True + + def RegisterInputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "ros_client", "ros_client", "The ROS client.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Boolean() + self.SetUpParam(p, "load", "load", "If `True`, loads the robot from ROS. Defaults to False.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + def RegisterOutputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "robot", "robot", "The robot.") + self.Params.Output.Add(p) + + def SolveInstance(self, DA): + p0 = self.marshal.GetInput(DA, 0) + p1 = self.marshal.GetInput(DA, 1) + result = self.RunScript(p0, p1) + + if result is not None: + self.marshal.SetOutput(result, DA, 0, True) + + def get_Internal_Icon_24x24(self): + return ros_robot_icon + + def RunScript(self, ros_client, load): + self.Message = "Loading..." + compas.PRECISION = '12f' + + key = create_id(self, 'robot') + + if ros_client and ros_client.is_connected and load: + # Load URDF from ROS + robot = ros_client.load_robot(load_geometry=True) + robot.artist = RobotModelArtist(robot.model) + self.Message = "{} loaded".format(robot.name) + st[key] = robot + else: + if st.get(key): + self.Message = "{} loaded".format(st.get(key).name) + else: + self.Message = "No robot" + + robot = st.get(key, None) + if robot: # client sometimes need to be restarted, without needing to reload geometry + robot.client = ros_client + return robot + + GhPython provides a Python script component + + 669 + 112 + + + 788 + 927 + + true + true + true + 1 + 1cb74eb0-a053-4919-a55e-3175350e261c + true + true + GhPython Script + Load robot + + + + + + 376 + 117 + 124 + 85 + + + 446 + 160 + + + + + + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + fcf0c1b8-fa76-4032-92b0-ef2ada751e62 + ros_client + ros_client + true + 0 + true + 54922ac8-ee9c-400b-ac86-feaf21cb04a2 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 1 + + + + + + 378 + 119 + 53 + 40 + + + 406 + 139.25 + + + + + + + + true + Script input load. + 4b059742-6fce-4e6a-b6b0-cd2e2ccfdb08 + load + load + true + 0 + true + d19cf29a-0512-4632-b4e0-ecc00c5b8487 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 1 + + + + + + 378 + 159 + 53 + 41 + + + 406 + 179.75 + + + + + + + + Script output robot. + 9a9900f7-c5de-485a-9791-63a5e1930c86 + robot + robot + false + 0 + + + + + + 461 + 119 + 37 + 81 + + + 479.5 + 159.5 + + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + import Grasshopper +import System +from ghpythonlib.componentbase import executingcomponent as component +from scriptcontext import sticky as st + +from compas.geometry import Frame +from compas.geometry import Transformation +from compas_ghpython.artists import MeshArtist +from compas_ghpython import draw_frame +from compas_fab.ghpython.components import create_id +from compas_fab.ghpython.components.icons import robot_visualize_icon + +class RobotVisualize(component): + def SetUpParam(self, p, name, nickname, description): + p.Name = name + p.NickName = nickname + p.Description = description + p.Optional = True + + def RegisterInputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "robot", "robot", "The robot.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_String() + self.SetUpParam(p, "group", "group", "The planning group used for end-effector and base visualization.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "configuration", "configuration", "The robot's full configuration.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Boolean() + self.SetUpParam(p, "reload_scene", "reload_scene", "Whether or not to reload the scene information from the client.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + def RegisterOutputParams(self, pManager): + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "visual", "visual", "The robot's visual meshes.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "frames", "frames", "The robot's joint frames.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "attached_collision_meshes", "attached_collision_meshes", "Attached collision meshes in the scene.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "collision_meshes", "collision_meshes", "Collision meshes in the scene.") + self.Params.Output.Add(p) + + def SolveInstance(self, DA): + p0 = self.marshal.GetInput(DA, 0) + p1 = self.marshal.GetInput(DA, 1) + p2 = self.marshal.GetInput(DA, 2) + p3 = self.marshal.GetInput(DA, 3) + result = self.RunScript(p0, p1, p2, p3) + + if result is not None: + if not hasattr(result, '__getitem__'): + self.marshal.SetOutput(result, DA, 0, True) + else: + self.marshal.SetOutput(result[0], DA, 0, True) + self.marshal.SetOutput(result[1], DA, 1, True) + self.marshal.SetOutput(result[2], DA, 2, True) + self.marshal.SetOutput(result[3], DA, 3, True) + + def get_Internal_Icon_24x24(self): + return robot_visualize_icon + + def RunScript(self, robot, group, configuration, reload_scene): + + visual = None + frames = None + collision_meshes = [] + attached_collision_meshes = [] + + if robot: + configuration = configuration or robot.zero_configuration() + + robot.update(configuration, visual=True, collision=False) + frames = [draw_frame(f) for f in robot.transformed_frames(configuration, group)] + + visual = robot.artist.draw_visual() + + scene_key = create_id(self, 'scene') + + if robot and (reload_scene or scene_key not in st): + st[scene_key] = robot.client.get_planning_scene() + + scene = st.get(scene_key, None) + + if scene and robot and robot.client and robot.client.is_connected: + + scene_key_co = scene_key + '_co' + if reload_scene or scene_key_co not in st: + for co in scene.world.collision_objects: + # HACK: Little workaround to a bug in to_collision_meshes() + header = co.header + frame_id = header.frame_id + co.header = dict(frame_id=frame_id) + cms = co.to_collision_meshes() + # HACK: Restore proper header + co.header = header + + for cm in cms: + if frame_id != '/world': + raise NotImplementedException('Only world-referenced collision meshes are supported') + + if cm.frame != Frame.worldXY(): + t = Transformation.from_frame(cm.frame) + mesh = cm.mesh.transformed(t) + else: + mesh = cm.mesh + + rhino_mesh = MeshArtist(mesh).draw() + collision_meshes.append(rhino_mesh) + st[scene_key_co] = collision_meshes + + collision_meshes = st.get(scene_key_co, None) + + for aco in scene.robot_state.attached_collision_objects: + for acm in aco.to_attached_collision_meshes(): + frame_id = aco.object['header']['frame_id'] + frame = robot.forward_kinematics(configuration, options=dict(link=frame_id)) + t = Transformation.from_frame(frame) + + # Local CM frame + if acm.collision_mesh.frame and acm.collision_mesh.frame != Frame.worldXY(): + t = t * Transformation.from_frame(acm.collision_mesh.frame) + + mesh = acm.collision_mesh.mesh.transformed(t) + + rhino_mesh = MeshArtist(mesh).draw() + attached_collision_meshes.append(rhino_mesh) + + return (visual, frames, attached_collision_meshes, collision_meshes) + + GhPython provides a Python script component + + 776 + 53 + + + 1051 + 880 + + true + true + true + 1 + 49f90167-2646-4d22-86bb-012cb0fa4ce7 + true + true + GhPython Script + Visualize + + + + + + 2902 + 943 + 243 + 84 + + + 2991 + 985 + + + + + + 4 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 4 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + cf579257-0392-4efa-8abc-cd5056adcf57 + robot + robot + true + 0 + true + 9a9900f7-c5de-485a-9791-63a5e1930c86 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2904 + 945 + 72 + 20 + + + 2941.5 + 955 + + + + + + + + true + Script input group. + 1bfd0eaf-087b-48f8-94ab-ec1f66301ff5 + group + group + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2904 + 965 + 72 + 20 + + + 2941.5 + 975 + + + + + + + + true + Script input configuration. + 2b362d36-7eb3-4375-b95e-a6ac847f62ba + configuration + configuration + true + 0 + true + 9d1d7aec-b041-4a18-90aa-523201e25b01 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2904 + 985 + 72 + 20 + + + 2941.5 + 995 + + + + + + + + true + Script input reload_scene. + e0c5dc07-2e68-4c56-b256-f4d6f758b13b + reload_scene + reload_scene + true + 0 + true + 11f438a0-e803-417d-8e51-4bf9fdfb3f32 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2904 + 1005 + 72 + 20 + + + 2941.5 + 1015 + + + + + + + + Script output visual. + 7fb0382a-e34f-49af-8952-9248a6d53e87 + visual + visual + false + 0 + + + + + + 3006 + 945 + 137 + 20 + + + 3074.5 + 955 + + + + + + + + Script output frames. + a94910e2-c32f-4b57-b31b-4b2bb61f886c + frames + frames + false + 0 + + + + + + 3006 + 965 + 137 + 20 + + + 3074.5 + 975 + + + + + + + + Script output attached_collision_meshes. + ece8fe7d-7f3d-4b20-a022-3c3f798472a2 + attached_collision_meshes + attached_collision_meshes + false + 0 + + + + + + 3006 + 985 + 137 + 20 + + + 3074.5 + 995 + + + + + + + + Script output collision_meshes. + 5425d29f-9702-41b7-b855-110be3410f3f + collision_meshes + collision_meshes + false + 0 + + + + + + 3006 + 1005 + 137 + 20 + + + 3074.5 + 1015 + + + + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + true + + -175.4048 + 163.6236 + + + -89.72121 + 163.6236 + + + -89.72121 + 193.9932 + + + -175.4048 + 193.9932 + + A quick note + Arial + 052e844a-59bc-4346-a9d3-a1965fe01a5c + false + Scribble + Scribble + 41 + ROS + + + + + + -180.4048 + 158.6236 + 95.68359 + 40.36963 + + + -175.4048 + 163.6236 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + true + + -173.4048 + 518.1589 + + + -90.60402 + 518.1589 + + + -90.60402 + 547.988 + + + -173.4048 + 547.988 + + A quick note + Arial + 5d32bed8-8ecb-420b-94ff-7e259c6e0271 + false + Scribble + Scribble + 41 + Pick + + + + + + -178.4048 + 513.1589 + 92.80078 + 39.8291 + + + -173.4048 + 518.1589 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + import Grasshopper +import System +from ghpythonlib.componentbase import executingcomponent as component +from scriptcontext import sticky as st + +from compas_fab.ghpython.components import coerce_frame +from compas_fab.backends import RosValidationError + +class InverseKinematics(component): + def SetUpParam(self, p, name, nickname, description): + p.Name = name + p.NickName = nickname + p.Description = description + p.Optional = True + + def RegisterInputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "robot", "robot", "The robot.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "plane", "plane", "The plane or frame to calculate the inverse kinematic for.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "start_configuration", "start_configuration", + "If passed, the inverse will be calculated such that the calculated joint positions \ + differ the least from the start_configuration. Defaults to the zero configuration.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_String() + self.SetUpParam(p, "group", "group", "The planning group used for calculation. Defaults to the robot's main planning group.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + def RegisterOutputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "a", "configuration", "The planning group's configuration.") + self.Params.Output.Add(p) + + def SolveInstance(self, DA): + p0 = self.marshal.GetInput(DA, 0) + p1 = self.marshal.GetInput(DA, 1) + p2 = self.marshal.GetInput(DA, 2) + p3 = self.marshal.GetInput(DA, 3) + result = self.RunScript(p0, p1, p2, p3) + + if result is not None: + self.marshal.SetOutput(result, DA, 0, True) + + def get_Internal_Icon_24x24(self): + return inverse_kinematics_icon + + def RunScript(self, robot, plane, start_configuration, group): + configuration = None + self.Message = '' + if robot and robot.client and robot.client.is_connected and plane: + frame = coerce_frame(plane) + try: + configuration = robot.inverse_kinematics(frame, start_configuration, group) + except RosValidationError as e: + self.Message = 'No solution found' + raise + + if configuration: + self.Message = 'Solution found' + return configuration + + GhPython provides a Python script component + + 416 + 248 + + + 684 + 571 + + true + true + true + 1 + e4f9217d-c7c3-49af-9a83-834638eb0d4d + true + true + GhPython Script + IK + + + + + + 215 + 1349 + 207 + 84 + + + 330 + 1391 + + + + + + 4 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + 29fc4f93-58c2-4192-8f02-3ecdf4a1be23 + robot + robot + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 217 + 1351 + 98 + 20 + + + 267.5 + 1361 + + + + + + + + true + Script input plane. + c75f16a9-ac28-43bf-a9b6-95a50d2b00f1 + plane + plane + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 217 + 1371 + 98 + 20 + + + 267.5 + 1381 + + + + + + + + true + Script input start_configuration. + 79ab0fb8-9433-4fe1-a38b-0c119815d935 + start_configuration + start_configuration + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 217 + 1391 + 98 + 20 + + + 267.5 + 1401 + + + + + + + + true + Script input group. + 14fc99fc-0ac5-4bf2-9d18-9cfab5caf53b + group + group + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 217 + 1411 + 98 + 20 + + + 267.5 + 1421 + + + + + + + + Script output configuration. + 9f3010dd-f68e-4afc-ad16-9a448e090c7b + configuration + configuration + false + 0 + + + + + + 345 + 1351 + 75 + 80 + + + 382.5 + 1391 + + + + + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + 11f438a0-e803-417d-8e51-4bf9fdfb3f32 + Boolean Toggle + reload + false + 0 + true + + + + + + 2770 + 1004 + 101 + 22 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + from compas.geometry import Box +from compas.datastructures import Mesh +from compas_ghpython.artists import MeshArtist + +shape = Box.from_width_height_depth(w, h, d) +brick = Mesh.from_shape(shape) + +mesh = MeshArtist(brick).draw() + GhPython provides a Python script component + + 455 + 613 + + + 1134 + 1121 + + true + true + true + 7ab9dd8f-ef96-4fa7-83c6-73bbfa8256ad + false + true + GhPython Script + Python + + + + + + 100 + 841 + 88 + 64 + + + 132 + 873 + + + + + + 3 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 3 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + d5445420-7f73-489a-a402-f534142329eb + h + h + true + 0 + true + 38da7932-bace-4722-99e8-41530a8b7e79 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 102 + 843 + 15 + 20 + + + 111 + 853 + + + + + + + + true + Script input w. + 6282d3f3-b08b-4ead-81a5-16f764732ae7 + w + w + true + 0 + true + e65f93ac-4a14-4fef-afc6-44d78530e45e + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 102 + 863 + 15 + 20 + + + 111 + 873 + + + + + + + + true + Script input d. + a8705f46-83b1-4be5-83ca-a074b9e5c0a4 + d + d + true + 0 + true + d87fb28a-1fe7-43f1-9815-d869f233b385 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 102 + 883 + 15 + 20 + + + 111 + 893 + + + + + + + + Script output shape. + 252a3ad3-fe63-448c-9531-ba99a4a17577 + a + shape + false + 0 + + + + + + 147 + 843 + 39 + 20 + + + 166.5 + 853 + + + + + + + + Script output brick. + 5499898c-9def-41d8-a767-7d5681a3af05 + brick + brick + false + 0 + + + + + + 147 + 863 + 39 + 20 + + + 166.5 + 873 + + + + + + + + Script output mesh. + 6088143e-d145-4a47-8c41-51e32cd53990 + mesh + mesh + false + 0 + + + + + + 147 + 883 + 39 + 20 + + + 166.5 + 893 + + + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + e65f93ac-4a14-4fef-afc6-44d78530e45e + Number Slider + + false + 0 + + + + + + -170 + 870 + 160 + 20 + + + -169.4536 + 870.9739 + + + + + + 3 + 1 + 0 + 0.05 + 0.01 + 0 + 0.016 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 38da7932-bace-4722-99e8-41530a8b7e79 + Number Slider + + false + 0 + + + + + + -170 + 850 + 192 + 20 + + + -169.4238 + 850.4012 + + + + + + 3 + 1 + 0 + 0.05 + 0.01 + 0 + 0.012 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + d87fb28a-1fe7-43f1-9815-d869f233b385 + Number Slider + + false + 0 + + + + + + -169 + 891 + 192 + 20 + + + -168.9764 + 891.2905 + + + + + + 3 + 1 + 0 + 0.05 + 0.01 + 0 + 0.031 + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + true + + -173.4048 + 664.7191 + + + -68.28224 + 664.7191 + + + -68.28224 + 694.5482 + + + -173.4048 + 694.5482 + + A quick note + Arial + 49e35091-c6e9-4be6-af3b-1d3bc207a03a + false + Scribble + Scribble + 41 + Place + + + + + + -178.4048 + 659.7191 + 115.1226 + 39.8291 + + + -173.4048 + 664.7191 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + from compas_fab.robots import Configuration + +config = Configuration.from_revolute_values(j) + GhPython provides a Python script component + + 26 + 26 + + + 558 + 571 + + true + true + true + 1 + 9bde434b-367e-491f-9f01-040b116c4562 + false + true + GhPython Script + Home config + + + + + + 223 + 1103 + 84 + 98 + + + 250 + 1152 + + + + + + 1 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + 1 + true + Script variable Pickup config + 24655f45-8c71-4631-8530-a0bc0f33ad9f + j + j + true + 1 + true + 6a7e4d1a-ceb2-4c60-bd73-b1fd7e57a88d + 453254b0-f451-4808-a6c8-f678281679fd + c789e886-ac48-44a7-8696-71249b62e335 + ffdf9a6f-f4a6-417e-96df-c38d59b6a4da + 4bbbdf99-354b-448e-8eb7-59249cc4e3d0 + b6ce1f01-cf45-408d-b8ba-45a08f564742 + 6 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 225 + 1105 + 10 + 94 + + + 231.5 + 1152 + + + + + + + + Script output config. + f956b690-65c4-4b82-ac9a-488e4afed703 + config + config + false + 0 + + + + + + 265 + 1105 + 40 + 94 + + + 285 + 1152 + + + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 6a7e4d1a-ceb2-4c60-bd73-b1fd7e57a88d + Number Slider + + false + 0 + + + + + + 15 + 1093 + 160 + 20 + + + 15.35516 + 1093.502 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + 1.57 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 453254b0-f451-4808-a6c8-f678281679fd + Number Slider + + false + 0 + + + + + + 15 + 1115 + 160 + 20 + + + 15.3551 + 1115.102 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + -1.57 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + c789e886-ac48-44a7-8696-71249b62e335 + Number Slider + + false + 0 + + + + + + 15 + 1136 + 160 + 20 + + + 15.3551 + 1136.702 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + 1.57 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + ffdf9a6f-f4a6-417e-96df-c38d59b6a4da + Number Slider + + false + 0 + + + + + + 15 + 1158 + 160 + 20 + + + 15.3551 + 1158.302 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + -1.57 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 4bbbdf99-354b-448e-8eb7-59249cc4e3d0 + Number Slider + + false + 0 + + + + + + 15 + 1179 + 160 + 20 + + + 15.3551 + 1179.901 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + -1.57 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + b6ce1f01-cf45-408d-b8ba-45a08f564742 + Number Slider + + false + 0 + + + + + + 14 + 1201 + 160 + 20 + + + 14.99004 + 1201.542 + + + + + + 2 + 1 + 0 + 3.14 + -3.14 + 0 + 3.14 + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + true + + -173.4048 + 981.7598 + + + -54.10841 + 981.7598 + + + -54.10841 + 1012.109 + + + -173.4048 + 1012.109 + + A quick note + Arial + 726245b8-cd81-4793-93c4-5a74c6fadea6 + false + Scribble + Scribble + 41 + Offset + + + + + + -178.4048 + 976.7598 + 129.2964 + 40.34961 + + + -173.4048 + 981.7598 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + true + + -173.4048 + 1362.047 + + + -14.24953 + 1362.047 + + + -14.24953 + 1391.876 + + + -173.4048 + 1391.876 + + A quick note + Arial + d42341b5-06d6-414d-8a72-d1a48effb96f + false + Scribble + Scribble + 41 + Toolbox + + + + + + -178.4048 + 1357.047 + 169.1553 + 39.8291 + + + -173.4048 + 1362.047 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + import Grasshopper +import System +from ghpythonlib.componentbase import executingcomponent as component +from scriptcontext import sticky as st + +from compas_fab.ghpython.components import create_id +from compas_fab.ghpython.components import coerce_frame +from compas_fab.ghpython.components.icons import plan_cartesian_motion_icon + +class PlanCartesianMotion(component): + def SetUpParam(self, p, name, nickname, description): + p.Name = name + p.NickName = nickname + p.Description = description + p.Optional = True + + def RegisterInputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "robot", "robot", "The robot.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "planes", "planes", "The planes or frames through which the path is defined.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.list + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "start_configuration", "start_configuration", + "The robot's full configuration, i.e. values for all configurable joints of the entire robot, at the starting position. Defaults to the all-zero configuration.") # noqa E501 + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_String() + self.SetUpParam(p, "group", "group", "The planning group used for calculation. Defaults to the robot's main planning group.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + +# p = Grasshopper.Kernel.Parameters.Param_GenericObject() +# self.SetUpParam(p, "attached_collision_meshes", "attached_collision_meshes", "A list of attached collision meshes to be included for planning.") +# p.Access = Grasshopper.Kernel.GH_ParamAccess.list +# self.Params.Input.Add(p) + +# p = Grasshopper.Kernel.Parameters.Param_GenericObject() +# self.SetUpParam(p, "path_constraints", "path_constraints", +# "Optional constraints that can be imposed along the solution path. Note that path calculation won't work if the start_configuration violates these constraints. Defaults to None.") # noqa E501 +# p.Access = Grasshopper.Kernel.GH_ParamAccess.list +# self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Number() + self.SetUpParam(p, "max_step", "max_step", "The approximate distance between the calculated points. (Defined in the robot's units.) Defaults to 0.01.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Boolean() + self.SetUpParam(p, "compute", "compute", "If `True`, calculates a trajectory.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + def RegisterOutputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "trajectory", "trajectory", "The calculated trajectory.") + self.Params.Output.Add(p) + + def SolveInstance(self, DA): + p0 = self.marshal.GetInput(DA, 0) + p1 = self.marshal.GetInput(DA, 1) + p2 = self.marshal.GetInput(DA, 2) + p3 = self.marshal.GetInput(DA, 3) + p4 = self.marshal.GetInput(DA, 4) + p5 = self.marshal.GetInput(DA, 5) +# p6 = self.marshal.GetInput(DA, 6) +# p7 = self.marshal.GetInput(DA, 7) +# result = self.RunScript(p0, p1, p2, p3, p4, p5, p6, p7) + result = self.RunScript(p0, p1, p2, p3, p4, p5) + + if result is not None: + self.marshal.SetOutput(result, DA, 0, True) + + def get_Internal_Icon_24x24(self): + return plan_cartesian_motion_icon + + def RunScript(self, robot, planes, start_configuration, group, max_step, compute): + + key = create_id(self, 'trajectory') + + max_step = float(max_step) if max_step else 0.01 + # NOTE: Read from scene + attached_collision_meshes = None + path_constraints = None + attached_collision_meshes = list(attached_collision_meshes) if attached_collision_meshes else None + + if robot and robot.client and robot.client.is_connected and start_configuration and planes and compute: + frames = [coerce_frame(plane) for plane in planes] + st[key] = robot.plan_cartesian_motion(frames, + start_configuration=start_configuration, + group=group, + options=dict( + max_step=max_step, + path_constraints=path_constraints, + attached_collision_meshes=attached_collision_meshes + )) + + trajectory = st.get(key, None) + + if trajectory and trajectory.fraction < 1.0: + raise Exception('Incomplete trajectory. Fraction={}'.format(trajectory.fraction)) + + return trajectory + GhPython provides a Python script component + + 416 + 248 + + + 684 + 571 + + true + true + true + 1 + c6ffa12e-83a0-4af7-8681-e213e9c0ba9f + true + true + GhPython Script + Plan Cartesian Motion + + + + + + 475 + 1312 + 188 + 157 + + + 590 + 1391 + + + + + + 6 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + d1e40e43-b307-4997-95f9-cc5ceb5b1ff8 + robot + robot + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 477 + 1314 + 98 + 25 + + + 527.5 + 1326.75 + + + + + + + + 1 + true + Script input planes. + 595db290-c1cd-47ae-a4a7-4d4b2c12919c + planes + planes + true + 1 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 477 + 1339 + 98 + 26 + + + 527.5 + 1352.25 + + + + + + + + true + Script input start_configuration. + e9a1a984-1028-4f75-90de-96a238f876cb + start_configuration + start_configuration + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 477 + 1365 + 98 + 25 + + + 527.5 + 1377.75 + + + + + + + + true + Script input group. + 0174acbc-9c27-4c7e-9508-fd4153cace00 + group + group + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 477 + 1390 + 98 + 26 + + + 527.5 + 1403.25 + + + + + + + + true + Script input max_step. + 0f1faba3-ea01-41f5-910a-d48118bef748 + max_step + max_step + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 477 + 1416 + 98 + 25 + + + 527.5 + 1428.75 + + + + + + + + true + Script input compute. + 0a27b8d5-ba01-4b82-8eab-e296cf91f0d1 + compute + compute + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 477 + 1441 + 98 + 26 + + + 527.5 + 1454.25 + + + + + + + + Script output trajectory. + 706ebe2f-4fa1-47c4-a7bb-388260bfe9f8 + trajectory + trajectory + false + 0 + + + + + + 605 + 1314 + 56 + 153 + + + 633 + 1390.5 + + + + + + + + + + + + + + f31d8d7a-7536-4ac8-9c96-fde6ecda4d0a + Cluster + + + + + + 1Vp7VBTXGZ+FZd3lGcWanCbRia8aG1Gr6UM9yjJbcJGXPAyiRobdYXd0dmadmUVAbYjiI40h4oPGR60kKgSfNbU1MQqpmhNMU4tJWz2S1KaeGqWxmFRi7DH23tmZhXkti2C0e878sd93X9/v9z3uvTNmG+PweQiavwN+BgRBIsAT66V8LpKeX0KwHMnQUJUFxFANf/1gE6nfdAJ3EixsEiGqIyWV3QbFFiB6ZfvIISeqvGl1P1n7vaUfTDvbL4slSkhiMdRHAr0pxw1GccaJ4nSCc+eWeQmoDhcnjhF1GQzrwSmoGS7MVhPolUNQhIMnnAFdDeIcaCOKSZrkgRVZLOMlWJ4kOGlY+BhtOC/MYwZ/Duy42l7/5TlzlI3gHCzp5UXj4RIRYwbuIaR/ACG8zMUyPtqZ4HKXWrLBCiBUnAQj/MVIUgy046VZBYjAYhaAxYrjh4liUy7Ougih5WDwd8HtO3egpcYChvFICD8agyZGzALmyqayQIlqGku2w5uGlzE+vmvbyBSwbq+qcXTKdGsaWcTirAiR1D5C1bR/J6qZRdCOQPto8ET5ZbJeUG7yy+EAYSKpxpS8Tic583jblY716emV+2uGjim8sVAGuDGdKSEsGEPzOEn7/c0oeqsWW6NzWZzmKMAtOsoDej6J4jTKCPOjOMXQLhRHS8Afhk2IttMcj9MOIsVHOqW1XLCYtz1W9/6M2pErtoYfKR6oXos5g3QsVEkjrTzPkkU+3g9hgNgk6CmCaBj830TZEOQEhiCrkhBkelJEFlnCCFgNEbS8Dak4g0V5cRb3zCdpr4+Xws6gY29MEs4RqItgPATPlmma9JthzhGDosakND5bsr9j28hHZSaZU8SuKrMMKeZMYSp/0MEFGEw5jI91EIKLgWfPx4uux39qsNdVfefaKcPMmCi/WuYAsF+I4CR6ADgnATheK4IcsSrAqWBsSFOzDByDCE6YDjgDJGcAMpF1TYQerqvD08+vwt4oW/rX16tvhssQMqUzsL8an1wVPogCn6OtW7nTbXjq74ZNzZpjHuHoA3yAewTBJ/HPWGwWzN0cD9IwyHB4gDpVPBuEGQBADnfXyFQ3MmbhvFuyOnzJuGVGO094EKSzLpj82MI2ExC93/DEaD91ICuJjm0K4tjxgUB2Bnfv5pkIz474rnVt4hctzHBb/N27N6LFDxI6PxWlov+u0+KnqVzwXxkIhpBAKIaVT/BhJ2BUE4QX57Z98fXqF6fX3s7Jjd8zsE0GgiUwihqF/HuCguCluigALxVLggHRKQl7Et6c9UTLV9jGD6lz7R9fPSezJ3KW4G5o/uwCdWEw6UA5EmMJWBWk9I8Ws4wHXVJaVr4MdTAeL0ODiOG0i8In8w5HT7q0acb6KvZo6ZKrq/RWo4I3HOhCrQyTgfNcBLAtB5WhQlkZKjCgbVdVBhOin/wGiutaUtrFQE3zFsV7Zp/YPTizsupX2K1Xv2yRmReV39n723CfxCnA0r8DHAqB++xQuk/hVKD95/1JcrTPU+T3M1OXtKasRyFRUtYdJWN3Jm7Yj1L26tGLf33z+WU35JTMDkbJ7HtDSVtQStofVErg8MG2CAFKyruj5O3nmHXJ1l2J69/xbKYunZwnp6QgGCUF3e4Ult9uazWvjc/Y3dzYsq/1hZLe7hQgYzeCMnbrQWKsRzuDh0TKHODUxbM+hzZdyr2XfE/nH0LN1Ky+D54UMZ+tAVS0q6iwg2L5Wc82BTGi/RRBu3i3pvGL2YkD7dMKk2tLn2IPRmQckxufJnRUG592b4xvD2r8V9JeIAzR2QucrHwhs3wpmX7w1UemHJ0Qg8qMiciicFpxPgx2XvqR2JIDGwEHQ1H+szjKFKO8myWIMU7SQ9CcAAKKl5LcGK4MRIiH04R5v/vY+CUJDal7sGnn3cXlFzRWpt4SZFF0t+kg0fUBhlw5nNbwbse1yqTPD/U2HVgA0E0YPHGq00HtW3G2uKunJBrC//9ocP3wzRHNWzcnr1+14fgO82Wkz2hQHi16SUPhCkDDKR0arq1bZXNfOS3RYNSj4fjutVPrbx9IPdw0Jfe9o9wAeWhnCOk1dB7G6vJQTDHgzEG7UC9D0jzqz9va+CuLl9aS1AQAebcEHNv7hz9N/ajFtunWX+Zsmr1saG/jwCyWRS0CRu+LtW0cdEsiIEKPgEGfvmQbMOkMVvv0PxoPvLfY1m0cWMRR+mM+jmc8WleMkX5V15GQWFGmwM3COwA5oFoQ9zyulFkolLjqXN5dFxODDnsVZzGkohGwtwWw12QVeTLp8fTNykM74xOMSb+d+8iW3d70Xd3yFNmnPEXy4741ojouT6x7eeyT9uoFNeaVmY71oRDVZX3dhqEywYYYhnpEFlaBPAjvSXZ3JbKfHpFBA04z4/VtxJnLAS3FHMHfswSqTHMhJdDAsu5JoCH/Ac/Pu/Jj1uOnpvbE2h0dV+3bz0e/gb223ym/gMsvQDViDZa3cJ2aFPcMw1JOFHT0wo7aVzIP1/dvL5uwKL16DTH0b0bLf7UnVYEWll8Q6n3MMOCkb4v3MTdV11jfF1xY66Ze76QZl8mSLlJwDcEuTbNqzq3DCpY121fmJ3xWmJf6b7kn+EdQb9wzu41g5U61t4V0ODD/mHgTfU51Ez3ShiSevC/ny0iMYVgnSYvv9vRvo3t45oyV+6Qmd1/Pa/jk2mP19uqi1Xnhr+Xkh5KFDVl9f/86VuSmQpOb8QI3Ykxb9GLaMuN6xy+czp9WhlsutRUsXC6zJTqb4eFVqk5cG3UwHA38AV5C+yFEWTgIzJW48DZVlJaPgdVOE99b1RvPhl3YmtnAPTOpNaHlFf01qV/RZQF1qPhNBfgdh/iBwJ+ovIhNTAZbyNM9ekUXJ6wJ5Rm/ydrO8/JDYe+4tn2Erdg0eUPUHWzK3TqPIu6VPtnLuEem2fxbMM17JdRqQ3ac7NEbusnZkheMcsA1ESzqoBjHwsUkB1/dqj0DBRmUxZ0kTms7CTl5/MpTN3LsW9Zs33Vt4RO/lONopV2UBo7WHgRhHkfYCBfYonWW0J6A1yyCV68F3sU/PgiXckNWts08Mvjrxh4lyBh//DmD5Efl2+L7lB+RVNGHYX4croxvJE14Syfmx0i9/Dh+Z/apOQdeT67fGff+7392o0Zui/CdhfbhAqyGFT+bCbCIMRSwCIrg1yt3VjfUaCE82IrC7068cAORwuIc52a8XhAv/o8buDC7TQp65d4IqAyiSplDgSpMVC3ds7dy2PWcpJ2bT++9/eMBFrPdNl+GsfA5hxaxh/L7j3jp2Vkpy2PtP3B3LK/SAENFrJItRGLLD3yUHvB51Nznkm+aU7dtOdM6au6738j3fTkAtKIiSlGUYqSBkhjKGYioMAyXWB/31BDb5ZyDWBhWJIlGtWaLIkdX0eqEt4DI2bUjFGnxFW1FF/mA1SjN8IQxmfED6U9DLIlTmlAqSTDZeZwiHQHf1zZXfTaQNMYcslyQ+r/Rqrcac4nSwELirc4F4MgDS1Ne9tP+w2BoUTTuX4/bLn+4D7vYmI8hDZ8rkpmE5/8A + + Contains a cluster of Grasshopper components + true + 1 + 87380de2-badc-4b2b-a438-aac8de443f24 + Cluster + T0CF + false + + + + + 3 + 348f98ef-5f46-4a58-885f-0470a6d4f1f8 + 499c6afc-e204-4b10-aed8-ccc3ae4a7d31 + e6827551-bd5f-4777-9cc2-97e2a1cf285e + a734e7f6-2f8f-4929-916a-9608854f6392 + d0ccacbd-d43e-44d1-95fa-d65b95597d22 + 43cd6740-e900-4cb5-aac6-f6ee8442edb2 + + + + + + 4 + 1368 + 144 + 46 + + + 70 + 1391 + + + + + + 2 + 4f8984c4-7c7a-4d69-b0a2-183cbb330d20 + 3e8ca6be-fda8-4aaf-b5c0-3c54c8bb7312 + 1 + 4f8984c4-7c7a-4d69-b0a2-183cbb330d20 + + + + + Contains a collection of three-dimensional axis-systems + e6827551-bd5f-4777-9cc2-97e2a1cf285e + Plane + tcf_point + true + 0 + + + + + + 6 + 1370 + 49 + 21 + + + 32 + 1380.5 + + + + + + + + Contains a collection of floating point numbers + 499c6afc-e204-4b10-aed8-ccc3ae4a7d31 + Number + z_offset + true + 0 + 1 + + + + + + 6 + 1391 + 49 + 21 + + + 32 + 1401.5 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.07 + + + + + + + + + + + Contains a collection of three-dimensional axis-systems + 348f98ef-5f46-4a58-885f-0470a6d4f1f8 + Plane + t0cf_frame + false + 0 + + + + + + 85 + 1370 + 61 + 42 + + + 115.5 + 1391 + + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + import os +from compas.geometry import Frame +from compas.datastructures import Mesh +from compas_fab.robots import PlanningScene +from compas_fab.robots import Tool +from compas_ghpython.artists import MeshArtist + +HERE = os.path.dirname(ghenv.Component.OnPingDocument().FilePath) + +# create tool from mesh and frame +mesh = Mesh.from_stl(os.path.join(HERE, 'vacuum_gripper.stl')) +frame = Frame([z_offset, 0, 0], [0, 0, 1], [0, 1, 0]) +tool = Tool(mesh, frame, name='vacuum_gripper') +tool_at_origin = MeshArtist(mesh).draw() + +if robot and robot.client and robot.client.is_connected: + scene = PlanningScene(robot) + if attached: + robot.attach_tool(tool) + scene.add_attached_tool() + else: + if robot.attached_tool: + scene.remove_attached_tool() + scene.remove_collision_mesh('attached_tool_link_collision_0') + robot.detach_tool() + + GhPython provides a Python script component + + 93 + 93 + + + 797 + 925 + + true + true + true + bfe572e7-d997-4c3c-8488-4e03d01804ea + false + true + GhPython Script + Attach tool + + + + + + 342 + 265 + 159 + 86 + + + 408 + 308 + + + + + + 3 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + 6e80e6d6-8757-4819-8351-1a7c5da7f996 + robot + robot + true + 0 + true + 9a9900f7-c5de-485a-9791-63a5e1930c86 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 1 + + + + + + 344 + 267 + 49 + 27 + + + 370 + 280.6667 + + + + + + + + true + Script input attached. + 404a4436-fc31-4bbd-846f-0b582b5ffd9c + attached + attached + true + 0 + true + b278407c-79b3-49ef-a2c8-ee682b33d9ef + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 344 + 294 + 49 + 27 + + + 370 + 308 + + + + + + + + true + Script input z_offset. + b7e50fd9-4f43-49fe-8c0a-b5a025756216 + z_offset + z_offset + true + 0 + true + 9a4be73c-3082-4c74-be27-41c7c1688c53 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 344 + 321 + 49 + 28 + + + 370 + 335.3333 + + + + + + + + Script output tool_at_origin. + ec3d9765-86ad-4ef4-bb37-6e2408651259 + tool_at_origin + tool_at_origin + false + 0 + + + + + + 423 + 267 + 76 + 82 + + + 461 + 308 + + + + + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + b278407c-79b3-49ef-a2c8-ee682b33d9ef + Boolean Toggle + Attach + false + 0 + true + + + + + + 15 + 296 + 101 + 22 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + true + + -173.4048 + 301.41 + + + -91.44484 + 301.41 + + + -91.44484 + 331.2391 + + + -173.4048 + 331.2391 + + A quick note + Arial + 6fe2e9d2-130c-4a02-b347-a1c6b831fc5a + false + Scribble + Scribble + 41 + Tool + + + + + + -178.4048 + 296.41 + 91.95996 + 39.8291 + + + -173.4048 + 301.41 + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 9a4be73c-3082-4c74-be27-41c7c1688c53 + Number Slider + z_offset + false + 0 + + + + + + 15 + 324 + 170 + 20 + + + 15.73172 + 324.025 + + + + + + 3 + 1 + 0 + 0.2 + -0.1 + 0 + 0.07 + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + import os +from compas.geometry import Frame +from compas.datastructures import Mesh +from compas_fab.robots import PlanningScene +from compas_fab.robots import CollisionMesh +from compas_ghpython.artists import MeshArtist +from compas_rhino.geometry import RhinoMesh + +if robot and robot.client and robot.client.is_connected: + static_cm_name = 'static_objects' + scene = PlanningScene(robot) + scene.remove_collision_mesh(static_cm_name) + if meshes: + for mesh in meshes: + mesh = RhinoMesh.from_geometry(mesh).to_compas() + cm = CollisionMesh(mesh, static_cm_name) + scene.append_collision_mesh(cm) + + GhPython provides a Python script component + + 156 + 156 + + + 924 + 745 + + true + true + true + 67e77c02-1764-4e11-bf1d-4203f550692e + false + true + GhPython Script + Python + + + + + + 424 + 390 + 75 + 60 + + + 485 + 420 + + + + + + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 0 + + + + + true + Script variable Python + d8842ce0-d92a-4fcf-8634-a387177ebe33 + robot + robot + true + 0 + true + 9a9900f7-c5de-485a-9791-63a5e1930c86 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 1 + + + + + + 426 + 392 + 44 + 28 + + + 449.5 + 406 + + + + + + + + 1 + true + Script input meshes. + 90e52a89-cf0f-4c9d-ae82-b73d0248a98b + meshes + meshes + true + 1 + true + cec5af33-7de8-45a7-8a88-c746edfb38bd + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 426 + 420 + 44 + 28 + + + 449.5 + 434 + + + + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + true + + -173.4048 + 410.6744 + + + -52.70705 + 410.6744 + + + -52.70705 + 441.044 + + + -173.4048 + 441.044 + + A quick note + Arial + d366a040-055c-47c4-93f0-6e444f072d66 + false + Scribble + Scribble + 41 + Scene + + + + + + -178.4048 + 405.6744 + 130.6978 + 40.36963 + + + -173.4048 + 410.6744 + + + + + + + + + + 1e936df3-0eea-4246-8549-514cb8862b7a + Mesh + + + + + Contains a collection of polygon meshes + cec5af33-7de8-45a7-8a88-c746edfb38bd + Mesh + Mesh + false + 0 + + + + + + 15 + 424 + 50 + 20 + + + 40.98947 + 434.8297 + + + + + + 1 + + + + + 1 + {0} + + + + + + Y2BkYGD4DwQgGgR4mIBEeFBGZl6+c35ubn6ejkJYalFxZn6erZmekaWekYGRsYWeoaGpgaGOgnNpTklpUaptXmppSVFijo5CQGlSTmayd2plSH52ap6tqamRkYVhqqV5srmpqamxASvIFmGw4Xruqfm5qSVFlXq+qcUZLEBx9jKIPVyJRckZmWWpxim5nPkFqXl5pUVJxSwpiSWJIEUcHBxMICcKqDMw2ADpzLKSHk5mIIMfRCixMjAw/apnYhBjhXjn938mBhGo155cue7n/vKy4P6nDALNjEofdHdKx/wByt9jgchbaAAJGQY08OW9PYwZvvCui1roO3upl5/ELbokDnjLR/Zn6/60f7GpZwHL8+/7+X8IcPjK3rFHN8KHzWN/dpTw/sxXD/blX/CyfyiaDVXTYI+E9yNhFDFQqDEyNDA4lEANhPmIgRHdKiDQdZZ5/chMCs0VEg5YlKKAdpfnXhLh28D6mBDCD+wZGO2C5LVh1jEysLAwMbOysrNxcXFwcnPz8ggI8PELCgoLiYmJiIqLy8hKSMhIysvLScnKysjLycnJS0urKKiqqqgrKqqpAGk1dXU1ZXV1RhZWViZWFhZ2Lm5uDm4uLl4BQUE+QQEBYTFxcRFxMTE5WRkZNVUlpQdAS7M/cOeDA6AZ6qiKW5/TPt+YL6q6Zz4jx56Fb3rC+b813uB32fw28ZGCmc+f0pn7ZH1kjhxbbve+abqtj8wxts7zL2+k8Aq3b/y4kn1j4ruWjYmPDL4fuPHjSvXjD/oneA0KJaRn759w1qVMfdNMg+8KvwVvzj1RtrBdd9P+C3/7ZP6dSOyQ4TtRx7iRMWDLvp/W13csBLmrd+qv02B36cPdlZyQceM8A/uUDZJSDSfmFZnF9DiZ3TjzV2BWkNmd2i0JwYpvCjcz7mqzuKn/JVTIAWjGxR9fc8FmzIeb4XtuL+8hBx7WhG49Xy+raTuYOo/5tR7h6pkofSBkZvM0XYnGaaxBQRMmMf3JKS649PLl5lp7F5elq3Mcv1+f6r3doIfn+rbEM2d/r1VYfjUwo2LzbaM1mbz/115e/L365P0Yi5jLV/++VSw/fOx9aXSb6dpEpZOVmtMDX6xJVMn5Wpn7f6fnavN0+/3qTz982cf9PHF9f8/PeNuef+z3HEMOHnXd+wNfEmoAppvsyfdlwP6ZB/fP5KqfnncWeT9iYBbxcPz5x57Foib1/Q31N5b/9+U0CcTIHWs/+Z636obMPW2u6e0fO6/yb+xnPlvHt+OPdPPk/eqxT5tPH/5x5NX3af1vzl/7u1Nejf/x4l39nGdrfVxet3OZGyxoYgv5q3/xy36X6+c/JAWfZ5r2/P73xTOZN5+XAyld3XzC/v57VkN5Z1ufe/xa/bH2f9+yM0yUOp/7aa1FF8ilS5ByE7YclVbN/A/C+oCRt7ED6qsDuctGqbiXEerAhJMML4GFA4ODb/YjEM0ALHhA9AHeqJdgQ/ckvYUbbvN2X9T/eqYGGJ+bOFtHwSgYBaNgFAwLAAA= + + 00000000-0000-0000-0000-000000000000 + + + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + true + + -173.4048 + 1114.921 + + + -61.31544 + 1114.921 + + + -61.31544 + 1144.75 + + + -173.4048 + 1144.75 + + A quick note + Arial + 562c0dcf-a89c-4f0e-9470-6e8b91f11f7e + false + Scribble + Scribble + 41 + Home + + + + + + -178.4048 + 1109.921 + 122.0894 + 39.8291 + + + -173.4048 + 1114.921 + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + a17a3498-e042-4db0-b3e7-eca2f875e5b8 + Number Slider + approach_offset + false + 0 + + + + + + 12 + 989 + 211 + 20 + + + 12.986 + 989.0408 + + + + + + 3 + 1 + 0 + 0.2 + 0 + 0 + 0.05 + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + from compas.geometry import Translation +from compas_fab.ghpython.components import coerce_frame + +# TODO: create a list of pickup frames with 3 frames: +# approach frame + pick up frame + approach frame + +f = coerce_frame(pick_t0cf_frame) + +approach_frame = f.copy() +approach_frame.transform(Translation.from_vector([0,0,approach_offset])) + +pickup_t0cf_frames = [approach_frame, f, approach_frame] + + GhPython provides a Python script component + + 1022 + 256 + + + 729 + 803 + + true + true + true + 1 + d59210ff-fb0c-47ac-88e4-bfb3bdd17472 + false + true + GhPython Script + Pickup frames + + + + + + 1501 + 650 + 221 + 105 + + + 1603 + 703 + + + + + + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + e8f5e947-99c5-441f-9aa2-ab76065faf07 + pick_t0cf_frame + pick_t0cf_frame + true + 0 + true + bf2d76a6-3501-45a4-893d-ae3e0eaa5ce4 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 1 + + + + + + 1503 + 652 + 85 + 50 + + + 1547 + 677.25 + + + + + + + + true + Script input approach_offset. + 43dd6963-b012-4ebc-ba8f-ae8b82f5452f + approach_offset + approach_offset + true + 0 + true + fa81c62e-402f-4a98-b743-073a361974d6 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 1 + + + + + + 1503 + 702 + 85 + 51 + + + 1547 + 727.75 + + + + + + + + Script output pickup_t0cf_frames. + b241bc34-d3b5-49b7-b546-a83f9d99d91f + pickup_t0cf_frames + pickup_t0cf_frames + false + 0 + + + + + + 1618 + 652 + 102 + 101 + + + 1669 + 702.5 + + + + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + true + + 20.54071 + -47.42408 + + + 154.7497 + -47.42408 + + + 154.7497 + -14.66285 + + + 20.54071 + -14.66285 + + A quick note + Arial + b4428083-5df1-433c-b590-4df513e94c3b + false + Scribble + Scribble + 45 + INPUT + + + + + + 15.54071 + -52.42408 + 144.209 + 42.76123 + + + 20.54071 + -47.42408 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + true + + 3089.445 + -44.5486 + + + 3210.317 + -44.5486 + + + 3210.317 + -11.21608 + + + 3089.445 + -11.21608 + + A quick note + Arial + 4c6e9558-0e0e-4605-a5de-a63e8b78f29f + false + Scribble + Scribble + 45 + JSON + + + + + + 3084.445 + -49.5486 + 130.8716 + 43.33252 + + + 3089.445 + -44.5486 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + import Grasshopper +import System +from ghpythonlib.componentbase import executingcomponent as component +from scriptcontext import sticky as st + +from compas_ghpython import draw_frame +from compas_fab.ghpython.components import create_id +from compas_fab.ghpython.components import coerce_frame +from compas_fab.ghpython.components.icons import trajectory_visualize_icon + +class TrajectoryVisualize(component): + def SetUpParam(self, p, name, nickname, description): + p.Name = name + p.NickName = nickname + p.Description = description + p.Optional = True + + def RegisterInputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "robot", "robot", "The robot.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_String() + self.SetUpParam(p, "group", "group", "The planning group for which this trajectory was planned.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "trajectory", "trajectory", "The calculated trajectory.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + def RegisterOutputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "start_configuration", "start_configuration", "The start configuration of the trajectory.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "configurations", "configurations", "The full configurations along the trajectory.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Number() + self.SetUpParam(p, "fraction", "fraction", "Indicates the percentage of requested trajectory that was calculated, e.g. 1 means the full trajectory was found.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Number() + self.SetUpParam(p, "time", "time", "The time which is needed to execute that trajectory at full speed.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Plane() + self.SetUpParam(p, "planes", "planes", "The planes of the robot's end-effector.") + self.Params.Output.Add(p) + + def SolveInstance(self, DA): + p0 = self.marshal.GetInput(DA, 0) + p1 = self.marshal.GetInput(DA, 1) + p2 = self.marshal.GetInput(DA, 2) + result = self.RunScript(p0, p1, p2) + + if result is not None: + if not hasattr(result, '__getitem__'): + self.marshal.SetOutput(result, DA, 0, True) + else: + self.marshal.SetOutput(result[0], DA, 0, True) + self.marshal.SetOutput(result[1], DA, 1, True) + self.marshal.SetOutput(result[2], DA, 2, True) + self.marshal.SetOutput(result[3], DA, 3, True) + self.marshal.SetOutput(result[4], DA, 4, True) + + def get_Internal_Icon_24x24(self): + return trajectory_visualize_icon + + def RunScript(self, robot, group, trajectory): + start_configuration = None + configurations = [] + fraction = 0. + time = 0. + + planes = [] + positions = [] + velocities = [] + accelerations = [] + + if robot and trajectory: + group = group or robot.main_group_name + + for c in trajectory.points: + configurations.append(robot.merge_group_with_full_configuration(c, trajectory.start_configuration, group)) + frame = robot.forward_kinematics(c, group, options=dict(solver='model')) + planes.append(draw_frame(frame)) + positions.append(c.positions) + velocities.append(c.velocities) + accelerations.append(c.accelerations) + + start_configuration = trajectory.start_configuration + fraction = trajectory.fraction + time = trajectory.time_from_start + + # return outputs if you have them; here I try it for you: + return (start_configuration, configurations, fraction, time, planes) + + GhPython provides a Python script component + + 416 + 248 + + + 684 + 571 + + true + true + true + 1 + e37b5872-2136-4007-9701-3851c1cc4a87 + true + true + GhPython Script + Visualize Trajectory + + + + + + 716 + 1321 + 188 + 140 + + + 786 + 1391 + + + + + + 3 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 5 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + 6aa301b4-6cee-4345-bd30-6f3863f96203 + robot + robot + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 718 + 1323 + 53 + 45 + + + 746 + 1345.667 + + + + + + + + true + Script input group. + fede8c15-1fd3-43a7-a90c-d3fe3da5daad + group + group + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 718 + 1368 + 53 + 45 + + + 746 + 1391 + + + + + + + + true + Script input trajectory. + 120bae85-d34a-4caf-8ea5-953d9524ed70 + trajectory + trajectory + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 718 + 1413 + 53 + 46 + + + 746 + 1436.333 + + + + + + + + Script output start_configuration. + 7dade1d5-4247-400d-9bd7-eb4b0b06927f + start_configuration + start_configuration + false + 0 + + + + + + 801 + 1323 + 101 + 27 + + + 851.5 + 1336.6 + + + + + + + + Script output configurations. + 4d980fad-4382-4c12-8ffa-80fb83ba449a + configurations + configurations + false + 0 + + + + + + 801 + 1350 + 101 + 27 + + + 851.5 + 1363.8 + + + + + + + + Script output fraction. + cc787af3-0b87-42c5-9e1a-1aff8eb7520e + fraction + fraction + false + 0 + + + + + + 801 + 1377 + 101 + 27 + + + 851.5 + 1391 + + + + + + + + Script output time. + 121fb4b2-8d79-43d2-bc51-0b7e5232d7a9 + time + time + false + 0 + + + + + + 801 + 1404 + 101 + 27 + + + 851.5 + 1418.2 + + + + + + + + Script output planes. + 11b58743-03db-4a58-80c9-8836f9ae9411 + planes + planes + false + 0 + + + + + + 801 + 1431 + 101 + 28 + + + 851.5 + 1445.4 + + + + + + + + + + + + + + 17b7152b-d30d-4d50-b9ef-c9fe25576fc2 + XY Plane + + + + + World XY plane. + true + c6af1eaf-f143-4a51-80ae-4c170fc22b7e + XY Plane + XY + + + + + + 175 + 491 + 65 + 31 + + + 207 + 507 + + + + + + Origin of plane + 3ba2ecfd-e216-4a78-a1fc-40c311b63561 + Origin + O + false + b2ac75b7-c534-4271-9a27-3649779c17d0 + 1 + + + + + + 177 + 493 + 15 + 27 + + + 186 + 506.5 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + World XY plane + 947ea514-3a1f-4433-899e-2226ba952ee6 + Plane + P + false + 0 + + + + + + 222 + 493 + 16 + 27 + + + 230 + 506.5 + + + + + + + + + + + + f31d8d7a-7536-4ac8-9c96-fde6ecda4d0a + Cluster + + + + + + 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 + + Contains a cluster of Grasshopper components + 1 + 2662160f-5d25-46cc-b2fb-037617fa9fc1 + Cluster + T0CF + false + + + + + 3 + 58713318-131c-4f88-981b-e1d4d061c646 + 5edf06f3-69c3-4b43-a30f-29ad2bf28eb8 + bf2d76a6-3501-45a4-893d-ae3e0eaa5ce4 + d0ccacbd-d43e-44d1-95fa-d65b95597d22 + 43cd6740-e900-4cb5-aac6-f6ee8442edb2 + a734e7f6-2f8f-4929-916a-9608854f6392 + + + + + + 353 + 522 + 144 + 46 + + + 419 + 545 + + + + + + 2 + 4f8984c4-7c7a-4d69-b0a2-183cbb330d20 + 3e8ca6be-fda8-4aaf-b5c0-3c54c8bb7312 + 1 + 4f8984c4-7c7a-4d69-b0a2-183cbb330d20 + + + + + Contains a collection of three-dimensional axis-systems + 5edf06f3-69c3-4b43-a30f-29ad2bf28eb8 + Plane + tcf_point + true + b2ac75b7-c534-4271-9a27-3649779c17d0 + 1 + + + + + + 355 + 524 + 49 + 21 + + + 381 + 534.5 + + + + + + + + Contains a collection of floating point numbers + 58713318-131c-4f88-981b-e1d4d061c646 + Number + z_offset + true + 9a4be73c-3082-4c74-be27-41c7c1688c53 + 1 + 1 + + + + + + 355 + 545 + 49 + 21 + + + 381 + 555.5 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.07 + + + + + + + + + + + Contains a collection of three-dimensional axis-systems + bf2d76a6-3501-45a4-893d-ae3e0eaa5ce4 + Plane + t0cf_frame + false + 0 + + + + + + 434 + 524 + 61 + 42 + + + 464.5 + 545 + + + + + + + + + + + + + + a8b97322-2d53-47cd-905e-b932c3ccd74e + Button + + + + + Button object with two values + False + True + 8c731948-abe8-4e50-a551-e6a07b85d9c4 + Button + Button + false + 0 + + + + + + 1738 + 568 + 103 + 22 + + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 0 + Retrieve a specific item from a list. + true + 5937d47f-10eb-43c2-b0f8-c788d579c8db + List Item + Item + + + + + + 2678 + 956 + 64 + 64 + + + 2712 + 988 + + + + + + 3 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 2e3ab970-8545-46bb-836c-1c11e5610bce + cb95db89-6165-43b6-9c41-5702bc5bf137 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + 1 + Base list + 7d1faee1-9526-4289-b122-75a309082be7 + List + L + false + ba0ed5fc-6a7f-48ff-9a13-2a2455c0e6a4 + 1 + + + + + + 2680 + 958 + 17 + 20 + + + 2690 + 968 + + + + + + + + Item index + 0314b618-3ebc-4edc-84c5-dfd0a0fb7a98 + Index + i + false + 76c149ba-07e7-470c-8952-7038c2cb9b2d + 1 + + + + + + 2680 + 978 + 17 + 20 + + + 2690 + 988 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + 1f21af97-0724-439b-a832-12547b5356a0 + Wrap + W + false + 0 + + + + + + 2680 + 998 + 17 + 20 + + + 2690 + 1008 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {i'} + 9d1d7aec-b041-4a18-90aa-523201e25b01 + false + Item + i + false + 0 + + + + + + 2727 + 958 + 13 + 60 + + + 2733.5 + 988 + + + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 76c149ba-07e7-470c-8952-7038c2cb9b2d + Number Slider + + false + 0 + + + + + + 2420 + 978 + 159 + 20 + + + 2420.382 + 978.2473 + + + + + + 3 + 1 + 1 + 200 + 0 + 0 + 200 + + + + + + + + + 3e8ca6be-fda8-4aaf-b5c0-3c54c8bb7312 + Number + + + + + Contains a collection of floating point numbers + fa81c62e-402f-4a98-b743-073a361974d6 + Number + Num + false + a17a3498-e042-4db0-b3e7-eca2f875e5b8 + 1 + + + + + + 328 + 989 + 50 + 20 + + + 353.4652 + 999.7706 + + + + + + + + + + 8ec86459-bf01-4409-baee-174d0d2b13d0 + Data + + + + + Contains a collection of generic data + true + ca6f4492-c165-4b33-8d01-a55901efe6bd + Data + Data + false + f956b690-65c4-4b82-ac9a-488e4afed703 + 1 + + + + + + 328 + 1142 + 50 + 20 + + + 353.2021 + 1152.203 + + + + + + + + + + 1817fd29-20ae-4503-b542-f0fb651e67d7 + List Length + + + + + Measure the length of a list. + true + 54ebcc2c-2159-48d1-88c8-9c12b4311847 + List Length + Lng + + + + + + 1501 + 876 + 61 + 38 + + + 1530 + 895 + + + + + + 1 + Base list + 3dd3ba85-5aaf-47dc-80ca-cfa62b9c0851 + List + L + false + 0fc838b5-d3e6-4ce0-a346-c3a1d321b2f6 + 1 + + + + + + 1503 + 878 + 12 + 34 + + + 1510.5 + 895 + + + + + + + + Number of items in L + ba8fb317-fbd9-4274-8820-55e12a8553ff + Length + L + false + 0 + + + + + + 1545 + 878 + 15 + 34 + + + 1552.5 + 895 + + + + + + + + + + + + 4f8984c4-7c7a-4d69-b0a2-183cbb330d20 + Plane + + + + + Contains a collection of three-dimensional axis-systems + 0fc838b5-d3e6-4ce0-a346-c3a1d321b2f6 + Plane + Pln + false + e328113b-073c-46f1-b400-4227e548946d + 1 + + + + + + 778 + 678 + 50 + 20 + + + 803.885 + 688.4667 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + import math +from compas.geometry import Frame +from compas.geometry import Transformation +from compas.geometry import Translation +from compas_fab.robots import PlanningScene +from compas_fab.robots import AttachedCollisionMesh +from compas_fab.robots import CollisionMesh +from compas_fab.ghpython.components import coerce_frame + + +# TODO: Calculate placement and approach frames +# and prepare scene collision meshes + +place_tolerance = 0.002 +place_t0cf_frames = [coerce_frame(f).transformed(Translation.from_vector([0,0,0.006+place_tolerance])) for f in place_t0cf_frames] +approach_t0cf_frames = [coerce_frame(f).transformed(Translation.from_vector([0,0,approach_offset])) for f in place_t0cf_frames] + + +if robot: + scene = PlanningScene(robot) + scene.remove_attached_collision_mesh('brick') + scene.remove_collision_mesh('brick') + ee_link_name = robot.get_end_effector_link_name() + + if robot.attached_tool: + brick_frame = robot.attached_tool.frame.copy() + else: + brick_frame = Frame.worldXY() + + brick_frame.point.x += 0.006 + brick_acm = AttachedCollisionMesh(CollisionMesh(element, 'brick', brick_frame), ee_link_name) + scene.add_attached_collision_mesh(brick_acm) + + #prepare prev elements + built_elements = 'built_elements' + scene.remove_collision_mesh(built_elements) + + for f in robot.from_t0cf_to_tcf(place_t0cf_frames[0:i-1]): + t = Transformation.from_frame(f) + mesh = element.transformed(t) + cm = CollisionMesh(mesh, built_elements) + scene.append_collision_mesh(cm) + GhPython provides a Python script component + + 29 + 91 + + + 1587 + 1673 + + true + true + 1 + 9baf9b45-b983-48be-a3c4-ff13530c72c6 + false + true + GhPython Script + Prepare scene + + + + + + 1588 + 863 + 243 + 104 + + + 1698 + 915 + + + + + + 5 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 2 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Prepare scene + c9e4df6c-ac62-4400-9db9-b24b79162fbc + robot + robot + true + 0 + true + 9a9900f7-c5de-485a-9791-63a5e1930c86 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1590 + 865 + 93 + 20 + + + 1638 + 875 + + + + + + + + true + Script input i. + 79a39e07-fd19-41ae-9428-089da3b1bd8b + i + i + true + 0 + true + ba8fb317-fbd9-4274-8820-55e12a8553ff + 1 + 48d01794-d3d8-4aef-990e-127168822244 + + + + + + 1590 + 885 + 93 + 20 + + + 1638 + 895 + + + + + + + + 1 + true + Script input place_t0cf_frames. + e61432af-6e45-43dc-b26e-bea2ff009454 + place_t0cf_frames + place_t0cf_frames + true + 1 + true + 0fc838b5-d3e6-4ce0-a346-c3a1d321b2f6 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1590 + 905 + 93 + 20 + + + 1638 + 915 + + + + + + + + true + Script input element. + 311b430c-5e93-4eab-9179-0ef6c103abd1 + element + element + true + 0 + true + 5499898c-9def-41d8-a767-7d5681a3af05 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1590 + 925 + 93 + 20 + + + 1638 + 935 + + + + + + + + true + Script input approach_offset. + 750362de-d9c9-4077-8c89-2f6fe9444338 + approach_offset + approach_offset + true + 0 + true + fa81c62e-402f-4a98-b743-073a361974d6 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1590 + 945 + 93 + 20 + + + 1638 + 955 + + + + + + + + Script output approach_t0cf_frames. + 9a395231-fda6-44ab-b851-46f21049e011 + approach_t0cf_frames + approach_t0cf_frames + false + 0 + + + + + + 1713 + 865 + 116 + 50 + + + 1771 + 890 + + + + + + + + Script output place_t0cf_frames. + 05804095-9196-4944-b8ba-233555dc1a50 + place_t0cf_frames + place_t0cf_frames + false + 0 + + + + + + 1713 + 915 + 116 + 50 + + + 1771 + 940 + + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + import os +import math +import compas +from compas.geometry import Frame +from compas.geometry import Transformation +from compas.geometry import Translation +from compas_ghpython.artists import MeshArtist +from compas_fab.robots import Configuration +from compas_fab.robots import PlanningScene +from compas_fab.robots import AttachedCollisionMesh +from compas_fab.robots import CollisionMesh +from compas_fab.ghpython.components import coerce_frame +from scriptcontext import sticky as st + +# TODO: Calculate two trajectories: +# 1) kinematic plan from last point of pickup +# 2) cartesian plan for placing + +def generate_trajectory(f, pif, pickup_trajectory): + + #initialize start_configuration + start_configuration = robot.zero_configuration() + #place trafectory + if pickup_trajectory: + start_configuration.values = pickup_trajectory.points[-1].values + place_trajectory = robot.plan_cartesian_motion(f, + start_configuration, + group=group, + options=dict(max_step=0.01, + avoid_collisions=True, + planner_id='RRTstarkConfigDefault')) + #pickup trajectory + start_configuration.values = place_trajectory.points[-1].values + pickup_trajectory = robot.plan_cartesian_motion(pif, + start_configuration, + group=group, + options=dict(max_step=0.01, + avoid_collisions=True, + planner_id='RRTstarkConfigDefault')) + + st[place_key] = place_trajectory + st[traj_key] = pickup_trajectory + place_trajectory = st.get(place_key) + pickup_trajectory = st.get(traj_key) + + return place_trajectory, pickup_trajectory + + +traj_key = '{}_{}'.format('pickup_trajectory', ghenv.Component.InstanceGuid) +place_key = '{}_{}'.format('place_trajectory', ghenv.Component.InstanceGuid) + +pif = [coerce_frame(pf) for pf in pickup_t0cf_frames] +frames = [[af, plf, af] for plf, af in zip(place_t0cf_frames, approach_t0cf_frames)] + +pickup_trajectories = [] +place_trajectories = [] + +if robot and compute: + for f in frames: + place_trajectory, pickup_trajectory = generate_trajectory(f, pif, pickup_trajectory) + pickup_trajectories.append(pickup_trajectory) + place_trajectories.append(place_trajectory) + + GhPython provides a Python script component + + 5 + 52 + + + 2248 + 1893 + + true + true + 1 + a5f3f98d-e1af-45fc-a57c-8f01a829d2a3 + false + true + GhPython Script + Plan Motion + + + + + + 1910 + 863 + 248 + 164 + + + 2040 + 945 + + + + + + 8 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 2 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Exercise + ca9f115d-3d3d-4588-959a-d284fa2c2819 + robot + robot + true + 0 + true + 9a9900f7-c5de-485a-9791-63a5e1930c86 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 1 + + + + + + 1912 + 865 + 113 + 20 + + + 1970 + 875 + + + + + + + + true + Script input group. + ed9ae14a-2d2b-4e52-b139-b2856c9035ba + group + group + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1912 + 885 + 113 + 20 + + + 1970 + 895 + + + + + + + + true + Script input home_config. + 019898a9-2d8c-4cef-bb68-22c1f5e5e7dc + home_config + home_config + true + 0 + true + ca6f4492-c165-4b33-8d01-a55901efe6bd + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 1 + + + + + + 1912 + 905 + 113 + 20 + + + 1970 + 915 + + + + + + + + true + Script input pickup_trajectory. + 217d4a4a-4eb2-46fa-852c-720a1f916b36 + pickup_trajectory + pickup_trajectory + true + 0 + true + dcfe8806-86f9-4cfc-af81-819cd25482f0 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1912 + 925 + 113 + 20 + + + 1970 + 935 + + + + + + + + 1 + true + Script input pickup_t0cf_frames. + 18057ac5-0cdb-4748-8bbe-d09ad71943b7 + pickup_t0cf_frames + pickup_t0cf_frames + true + 1 + true + b241bc34-d3b5-49b7-b546-a83f9d99d91f + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1912 + 945 + 113 + 20 + + + 1970 + 955 + + + + + + + + 1 + true + Script input approach_t0cf_frames. + 38ca1d8b-ce5f-41b1-a31c-12ab715428af + approach_t0cf_frames + approach_t0cf_frames + true + 1 + true + 9a395231-fda6-44ab-b851-46f21049e011 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1912 + 965 + 113 + 20 + + + 1970 + 975 + + + + + + + + 1 + true + Script input place_t0cf_frames. + d2330b8f-dadb-47a0-a5ce-51653a422c3a + place_t0cf_frames + place_t0cf_frames + true + 1 + true + 05804095-9196-4944-b8ba-233555dc1a50 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1912 + 985 + 113 + 20 + + + 1970 + 995 + + + + + + + + true + Script input compute. + 93e2f7ca-9611-43a2-afe0-bdb6c0498b83 + compute + compute + true + 0 + true + 314e45dc-6256-4dcc-90c3-aaa1e08b613a + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1912 + 1005 + 113 + 20 + + + 1970 + 1015 + + + + + + + + Script output pickup_trajectories. + 0ac0402c-aca7-4167-9000-cfddc8a90179 + pickup_trajectories + pickup_trajectories + false + 0 + + + + + + 2055 + 865 + 101 + 80 + + + 2105.5 + 905 + + + + + + + + Script output place_trajectories. + a46ae31f-ef20-45a8-89b4-578092ccba5e + place_trajectories + place_trajectories + false + 0 + + + + + + 2055 + 945 + 101 + 80 + + + 2105.5 + 985 + + + + + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + 314e45dc-6256-4dcc-90c3-aaa1e08b613a + Boolean Toggle + Toggle + false + 0 + true + + + + + + 1906 + 835 + 104 + 22 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + # TODO: Merge all trajectories +configs = [] +for i, p in enumerate(pick): + if i == 0: # first pickup & place + configurations = pick1.points + place[i].points + p.points + else: # from 2nd to last pickup & place + configurations = place[i].points + p.points + configs.extend(configurations) + +#configs = pick1.points +#for place_trajectory, pick_trajectory in zip(place, pick): +# configs.extend(place_trajectory.points) +# configs.extend(pick_trajectory.points) + + GhPython provides a Python script component + + 243 + 519 + + + 1607 + 1408 + + true + true + 1 + 7e727ff6-4118-4fcc-8d61-a780f76ab28c + false + true + GhPython Script + Merge trajectories + + + + + + 2234 + 860 + 147 + 132 + + + 2284 + 926 + + + + + + 3 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 2 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + 40f57814-6fbb-4633-b6e1-7e774843d97b + pick1 + pick1 + true + 0 + true + dcfe8806-86f9-4cfc-af81-819cd25482f0 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2236 + 862 + 33 + 42 + + + 2254 + 883.3333 + + + + + + + + 1 + true + Script input pick. + d53c24e6-bee9-445a-91ad-3500c38bad25 + pick + pick + true + 1 + true + 0ac0402c-aca7-4167-9000-cfddc8a90179 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2236 + 904 + 33 + 43 + + + 2254 + 926 + + + + + + + + 1 + true + Script input place. + ff2f0e70-e3c1-43d8-9768-ad16fff70f86 + place + place + true + 1 + true + a46ae31f-ef20-45a8-89b4-578092ccba5e + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2236 + 947 + 33 + 43 + + + 2254 + 968.6666 + + + + + + + + Script output configurations. + 88ff1b67-787f-4ad4-a11e-3ae6f1c31b08 + configurations + configurations + false + 0 + + + + + + 2299 + 862 + 80 + 64 + + + 2339 + 894 + + + + + + + + Script output configs. + ba0ed5fc-6a7f-48ff-9a13-2a2455c0e6a4 + configs + configs + false + 0 + + + + + + 2299 + 926 + 80 + 64 + + + 2339 + 958 + + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + import Grasshopper +import System +from ghpythonlib.componentbase import executingcomponent as component +from scriptcontext import sticky as st + +from compas_ghpython import draw_frame +from compas_fab.ghpython.components import create_id +from compas_fab.ghpython.components import coerce_frame +from compas_fab.ghpython.components.icons import trajectory_visualize_icon + +class TrajectoryVisualize(component): + def SetUpParam(self, p, name, nickname, description): + p.Name = name + p.NickName = nickname + p.Description = description + p.Optional = True + + def RegisterInputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "robot", "robot", "The robot.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_String() + self.SetUpParam(p, "group", "group", "The planning group for which this trajectory was planned.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "trajectory", "trajectory", "The calculated trajectory.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + def RegisterOutputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "start_configuration", "start_configuration", "The start configuration of the trajectory.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "configurations", "configurations", "The full configurations along the trajectory.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Number() + self.SetUpParam(p, "fraction", "fraction", "Indicates the percentage of requested trajectory that was calculated, e.g. 1 means the full trajectory was found.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Number() + self.SetUpParam(p, "time", "time", "The time which is needed to execute that trajectory at full speed.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Plane() + self.SetUpParam(p, "planes", "planes", "The planes of the robot's end-effector.") + self.Params.Output.Add(p) + + def SolveInstance(self, DA): + p0 = self.marshal.GetInput(DA, 0) + p1 = self.marshal.GetInput(DA, 1) + p2 = self.marshal.GetInput(DA, 2) + result = self.RunScript(p0, p1, p2) + + if result is not None: + if not hasattr(result, '__getitem__'): + self.marshal.SetOutput(result, DA, 0, True) + else: + self.marshal.SetOutput(result[0], DA, 0, True) + self.marshal.SetOutput(result[1], DA, 1, True) + self.marshal.SetOutput(result[2], DA, 2, True) + self.marshal.SetOutput(result[3], DA, 3, True) + self.marshal.SetOutput(result[4], DA, 4, True) + + def get_Internal_Icon_24x24(self): + return trajectory_visualize_icon + + def RunScript(self, robot, group, trajectory): + start_configuration = None + configurations = [] + fraction = 0. + time = 0. + + planes = [] + positions = [] + velocities = [] + accelerations = [] + + if robot and trajectory: + group = group or robot.main_group_name + + for c in trajectory.points: + configurations.append(robot.merge_group_with_full_configuration(c, trajectory.start_configuration, group)) + frame = robot.forward_kinematics(c, group, options=dict(solver='model')) + planes.append(draw_frame(frame)) + positions.append(c.positions) + velocities.append(c.velocities) + accelerations.append(c.accelerations) + + start_configuration = trajectory.start_configuration + fraction = trajectory.fraction + time = trajectory.time_from_start + + # return outputs if you have them; here I try it for you: + return (start_configuration, configurations, fraction, time, planes) + + GhPython provides a Python script component + + 416 + 248 + + + 684 + 571 + + true + true + 1 + a003596c-fc8d-4ac5-a6f1-fd7555dd239b + true + true + GhPython Script + Visualize Trajectory + + + + + + 2560 + 443 + 188 + 140 + + + 2630 + 513 + + + + + + 3 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 5 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + c2ecc370-89a1-4036-98cb-7c6f65d1a833 + robot + robot + true + 0 + true + 9a9900f7-c5de-485a-9791-63a5e1930c86 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2562 + 445 + 53 + 45 + + + 2590 + 467.6667 + + + + + + + + true + Script input group. + 8ef2dfa3-7a51-4468-87a7-e909f16a93a9 + group + group + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2562 + 490 + 53 + 45 + + + 2590 + 513 + + + + + + + + true + Script input trajectory. + 532027a2-c91c-42f4-96ca-4df4cab1a38f + trajectory + trajectory + true + 0 + true + dcfe8806-86f9-4cfc-af81-819cd25482f0 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2562 + 535 + 53 + 46 + + + 2590 + 558.3334 + + + + + + + + Script output start_configuration. + 4ca48c0c-9209-4c41-bb93-a7a6e9870d3e + start_configuration + start_configuration + false + 0 + + + + + + 2645 + 445 + 101 + 27 + + + 2695.5 + 458.6 + + + + + + + + Script output configurations. + f8b39b52-7c01-410c-8138-f8d2ef2fa87b + configurations + configurations + false + 0 + + + + + + 2645 + 472 + 101 + 27 + + + 2695.5 + 485.8 + + + + + + + + Script output fraction. + 9065a65a-77c0-4ef1-87e7-afe00bdb0ecf + fraction + fraction + false + 0 + + + + + + 2645 + 499 + 101 + 27 + + + 2695.5 + 513 + + + + + + + + Script output time. + 2fdce139-a2fa-41a7-8020-1ea165e94d9c + time + time + false + 0 + + + + + + 2645 + 526 + 101 + 27 + + + 2695.5 + 540.2 + + + + + + + + Script output planes. + c86f8bc2-ded5-4c66-9c5a-48f54206c708 + planes + planes + false + 0 + + + + + + 2645 + 553 + 101 + 28 + + + 2695.5 + 567.4 + + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + import Grasshopper +import System +from ghpythonlib.componentbase import executingcomponent as component +from scriptcontext import sticky as st + +from compas_ghpython import draw_frame +from compas_fab.ghpython.components import create_id +from compas_fab.ghpython.components import coerce_frame +from compas_fab.ghpython.components.icons import trajectory_visualize_icon + +class TrajectoryVisualize(component): + def SetUpParam(self, p, name, nickname, description): + p.Name = name + p.NickName = nickname + p.Description = description + p.Optional = True + + def RegisterInputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "robot", "robot", "The robot.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_String() + self.SetUpParam(p, "group", "group", "The planning group for which this trajectory was planned.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "trajectory", "trajectory", "The calculated trajectory.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + def RegisterOutputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "start_configuration", "start_configuration", "The start configuration of the trajectory.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "configurations", "configurations", "The full configurations along the trajectory.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Number() + self.SetUpParam(p, "fraction", "fraction", "Indicates the percentage of requested trajectory that was calculated, e.g. 1 means the full trajectory was found.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Number() + self.SetUpParam(p, "time", "time", "The time which is needed to execute that trajectory at full speed.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Plane() + self.SetUpParam(p, "planes", "planes", "The planes of the robot's end-effector.") + self.Params.Output.Add(p) + + def SolveInstance(self, DA): + p0 = self.marshal.GetInput(DA, 0) + p1 = self.marshal.GetInput(DA, 1) + p2 = self.marshal.GetInput(DA, 2) + result = self.RunScript(p0, p1, p2) + + if result is not None: + if not hasattr(result, '__getitem__'): + self.marshal.SetOutput(result, DA, 0, True) + else: + self.marshal.SetOutput(result[0], DA, 0, True) + self.marshal.SetOutput(result[1], DA, 1, True) + self.marshal.SetOutput(result[2], DA, 2, True) + self.marshal.SetOutput(result[3], DA, 3, True) + self.marshal.SetOutput(result[4], DA, 4, True) + + def get_Internal_Icon_24x24(self): + return trajectory_visualize_icon + + def RunScript(self, robot, group, trajectory): + start_configuration = None + configurations = [] + fraction = 0. + time = 0. + + planes = [] + positions = [] + velocities = [] + accelerations = [] + + if robot and trajectory: + group = group or robot.main_group_name + + for c in trajectory.points: + configurations.append(robot.merge_group_with_full_configuration(c, trajectory.start_configuration, group)) + frame = robot.forward_kinematics(c, group, options=dict(solver='model')) + planes.append(draw_frame(frame)) + positions.append(c.positions) + velocities.append(c.velocities) + accelerations.append(c.accelerations) + + start_configuration = trajectory.start_configuration + fraction = trajectory.fraction + time = trajectory.time_from_start + + # return outputs if you have them; here I try it for you: + return (start_configuration, configurations, fraction, time, planes) + + GhPython provides a Python script component + + 55 + 110 + + + 790 + 655 + + true + true + 1 + 781902aa-fb33-4d03-bad8-fce4aafa0416 + true + true + GhPython Script + Visualize Trajectory + + + + + + 2558 + 604 + 188 + 140 + + + 2628 + 674 + + + + + + 3 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 5 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + 7dc3e565-84df-4953-bf24-5c77f7c7a423 + robot + robot + true + 0 + true + 9a9900f7-c5de-485a-9791-63a5e1930c86 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2560 + 606 + 53 + 45 + + + 2588 + 628.6667 + + + + + + + + true + Script input group. + 73e6a41a-9f77-4b43-afc1-6e73a6533efa + group + group + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2560 + 651 + 53 + 45 + + + 2588 + 674 + + + + + + + + true + Script input trajectory. + 5f0d4956-14e9-427b-ab67-35240ba513f7 + trajectory + trajectory + true + 0 + true + bb002e1d-5173-4ee7-a7c5-4967ac376aee + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2560 + 696 + 53 + 46 + + + 2588 + 719.3334 + + + + + + + + Script output start_configuration. + d3235a1d-b214-4000-8569-d80b021b81cc + start_configuration + start_configuration + false + 0 + + + + + + 2643 + 606 + 101 + 27 + + + 2693.5 + 619.6 + + + + + + + + Script output configurations. + 5ec3cd18-022a-47e7-a77c-f60c949ef49c + configurations + configurations + false + 0 + + + + + + 2643 + 633 + 101 + 27 + + + 2693.5 + 646.8 + + + + + + + + Script output fraction. + ce13f3f5-9eb5-450c-a548-9749a81a9b11 + fraction + fraction + false + 0 + + + + + + 2643 + 660 + 101 + 27 + + + 2693.5 + 674 + + + + + + + + Script output time. + 10a7dcba-3a56-4867-9762-82c0d0c4c5e7 + time + time + false + 0 + + + + + + 2643 + 687 + 101 + 27 + + + 2693.5 + 701.2 + + + + + + + + Script output planes. + c252b34a-1aef-4345-9144-82d68324950d + planes + planes + false + 0 + + + + + + 2643 + 714 + 101 + 28 + + + 2693.5 + 728.4 + + + + + + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 2 + Retrieve a specific item from a list. + true + 2c6392f9-9507-48f4-b75d-443af7101485 + List Item + Item + + + + + + 2454 + 682 + 71 + 64 + + + 2488 + 714 + + + + + + 3 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 2e3ab970-8545-46bb-836c-1c11e5610bce + cb95db89-6165-43b6-9c41-5702bc5bf137 + 3 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + 1 + Base list + 2536c882-3bd9-4327-9585-3abdcf223b2f + List + L + false + 0ac0402c-aca7-4167-9000-cfddc8a90179 + 1 + + + + + + 2456 + 684 + 17 + 20 + + + 2466 + 694 + + + + + + + + Item index + 405dc0e0-6f36-4b18-bf46-ff30825051d3 + Index + i + false + 0 + + + + + + 2456 + 704 + 17 + 20 + + + 2466 + 714 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + c11ab3ef-4c6d-44a8-88d0-800d69d7585a + Wrap + W + false + 0 + + + + + + 2456 + 724 + 17 + 20 + + + 2466 + 734 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {-2'} + bb002e1d-5173-4ee7-a7c5-4967ac376aee + false + Item -2 + -2 + false + 0 + + + + + + 2503 + 684 + 20 + 20 + + + 2513 + 694 + + + + + + + + Item at {-1'} + 35eaba3d-01ac-44a0-a089-6eb45a516918 + false + Item -1 + -1 + false + 0 + + + + + + 2503 + 704 + 20 + 20 + + + 2513 + 714 + + + + + + + + Item at {i'} + e136193d-2f3b-41a5-b6e7-731f0eaa65e5 + false + Item + i + false + 0 + + + + + + 2503 + 724 + 20 + 20 + + + 2513 + 734 + + + + + + + + + + + + + + 537b0419-bbc2-4ff4-bf08-afe526367b2c + Custom Preview + + + + + Allows for customized geometry previews + true + ed0f70d1-142a-4a13-8cf6-ae134783d257 + Custom Preview + Preview + + + + + + + 3415 + 1019 + 48 + 65 + + + 3449 + 1052 + + + + + + Geometry to preview + true + adb03630-9339-4e68-a1c3-7e119f78d90d + Geometry + G + false + a3d2f4c0-32db-43a1-8295-40c99a145ca9 + 1 + + + + + + 3417 + 1021 + 17 + 30 + + + 3427 + 1036.25 + + + + + + + + The material override + fab79a21-11bc-40b0-913f-9efbf3ddf6de + Material + M + false + 1a804a97-9b85-4230-a3b1-f0eff8f793e7 + 1 + + + + + + 3417 + 1051 + 17 + 31 + + + 3427 + 1066.75 + + + + + + 1 + + + + + 1 + {0} + + + + + + 255;221;160;221 + + + 255;66;48;66 + + 0.5 + + 255;255;255;255 + + 0 + + + + + + + + + + + + + + + 59daf374-bc21-4a5e-8282-5504fb7ae9ae + List Item + + + + + 1 + Retrieve a specific item from a list. + true + c91d7211-9cd1-4e72-b248-c7b8194d29da + List Item + Item + + + + + + 3294 + 1003 + 71 + 64 + + + 3328 + 1035 + + + + + + 3 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 2e3ab970-8545-46bb-836c-1c11e5610bce + cb95db89-6165-43b6-9c41-5702bc5bf137 + 2 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + 1 + Base list + af8c693e-ac3f-420e-8c52-a607cc2449c4 + List + L + false + 5425d29f-9702-41b7-b855-110be3410f3f + 1 + + + + + + 3296 + 1005 + 17 + 20 + + + 3306 + 1015 + + + + + + + + Item index + 597cc5db-f181-4e8f-b541-8fb5b4c771b9 + Index + i + false + 0 + + + + + + 3296 + 1025 + 17 + 20 + + + 3306 + 1035 + + + + + + 1 + + + + + 1 + {0} + + + + + 0 + + + + + + + + + + + Wrap index to list bounds + a3c834d9-ab99-47d5-8464-e267ee386a35 + Wrap + W + false + 0 + + + + + + 3296 + 1045 + 17 + 20 + + + 3306 + 1055 + + + + + + 1 + + + + + 1 + {0} + + + + + true + + + + + + + + + + + Item at {-1'} + a3d2f4c0-32db-43a1-8295-40c99a145ca9 + false + Item -1 + -1 + false + 0 + + + + + + 3343 + 1005 + 20 + 30 + + + 3353 + 1020 + + + + + + + + Item at {i'} + 62af9f1b-d4da-4985-b080-2f88c858c938 + false + Item + i + false + 0 + + + + + + 3343 + 1035 + 20 + 30 + + + 3353 + 1050 + + + + + + + + + + + + + + 4fdfe351-6c07-47ce-9fb9-be027fb62186 + Shift List + + + + + Offset all items in a list. + true + c5ddd8d0-09e6-4df1-adf6-11395b48fd76 + Shift List + Shift + + + + + + 3299 + 1107 + 66 + 64 + + + 3333 + 1139 + + + + + + 1 + List to shift + 30b7268c-4bfb-4bc8-b589-e338ec57e0c2 + List + L + false + 5425d29f-9702-41b7-b855-110be3410f3f + 1 + + + + + + 3301 + 1109 + 17 + 20 + + + 3311 + 1119 + + + + + + + + Shift offset + 62b39994-727e-4d69-82fb-6cf0662c7220 + Shift + S + false + 0 + + + + + + 3301 + 1129 + 17 + 20 + + + 3311 + 1139 + + + + + + 1 + + + + + 1 + {0} + + + + + -1 + + + + + + + + + + + Wrap values + 930334a1-e544-4d53-b828-395d9386bfea + Wrap + W + false + 0 + + + + + + 3301 + 1149 + 17 + 20 + + + 3311 + 1159 + + + + + + 1 + + + + + 1 + {0} + + + + + false + + + + + + + + + + + 1 + Shifted list + a2311c9f-7aed-4d4d-965e-64553de08172 + List + L + false + 0 + + + + + + 3348 + 1109 + 15 + 60 + + + 3355.5 + 1139 + + + + + + + + + + + + 537b0419-bbc2-4ff4-bf08-afe526367b2c + Custom Preview + + + + + Allows for customized geometry previews + true + 066da693-d960-4d27-bb66-e473cc3ca3d4 + Custom Preview + Preview + + + + + + + 3413 + 1122 + 48 + 65 + + + 3447 + 1155 + + + + + + Geometry to preview + true + a8c7a71a-10c5-4e2f-bd62-7acf9b3d4bee + Geometry + G + false + a2311c9f-7aed-4d4d-965e-64553de08172 + 1 + + + + + + 3415 + 1124 + 17 + 30 + + + 3425 + 1139.25 + + + + + + + + The material override + 3afe242d-8bd4-4dd1-b859-67f462b06e4b + Material + M + false + 1f9ff1ad-b792-4248-b3c1-943ac5786365 + 1 + + + + + + 3415 + 1154 + 17 + 31 + + + 3425 + 1169.75 + + + + + + 1 + + + + + 1 + {0} + + + + + + 255;221;160;221 + + + 255;66;48;66 + + 0.5 + + 255;255;255;255 + + 0 + + + + + + + + + + + + + + + 1e936df3-0eea-4246-8549-514cb8862b7a + Mesh + + + + + Contains a collection of polygon meshes + true + 98a6e12d-8448-4993-9edd-71c7658e5f38 + Mesh + Mesh + false + 7fb0382a-e34f-49af-8952-9248a6d53e87 + 1 + + + + + + 3318 + 947 + 50 + 20 + + + 3343.404 + 957.9166 + + + + + + + + + + 537b0419-bbc2-4ff4-bf08-afe526367b2c + Custom Preview + + + + + Allows for customized geometry previews + true + 0deadd24-8f12-4829-aaa9-82bf0d5415f5 + Custom Preview + Preview + + + + + + + 3413 + 938 + 48 + 65 + + + 3447 + 971 + + + + + + Geometry to preview + true + 0825e73d-9630-4e0b-8abb-ec912bdfbb34 + Geometry + G + false + 98a6e12d-8448-4993-9edd-71c7658e5f38 + 1 + + + + + + 3415 + 940 + 17 + 30 + + + 3425 + 955.25 + + + + + + + + The material override + 6429eb66-ae28-47d9-9763-442445701133 + Material + M + false + 70cc5425-d702-4584-b46d-0509ab8a651d + 1 + + + + + + 3415 + 970 + 17 + 31 + + + 3425 + 985.75 + + + + + + 1 + + + + + 1 + {0} + + + + + + 255;221;160;221 + + + 255;66;48;66 + + 0.5 + + 255;255;255;255 + + 0 + + + + + + + + + + + + + + + 9c53bac0-ba66-40bd-8154-ce9829b9db1a + Colour Swatch + + + + + Colour (palette) swatch + 70cc5425-d702-4584-b46d-0509ab8a651d + Colour Swatch + Swatch + false + 0 + + 0;255;255;255 + + + + + + + 3280 + 978 + 88 + 20 + + + 3280.535 + 978.3527 + + + + + + + + + + 9c53bac0-ba66-40bd-8154-ce9829b9db1a + Colour Swatch + + + + + Colour (palette) swatch + 1f9ff1ad-b792-4248-b3c1-943ac5786365 + Colour Swatch + Swatch + false + 0 + + 91;45;189;131 + + + + + + + 3284 + 1185 + 88 + 20 + + + 3284.563 + 1185.333 + + + + + + + + + + 9c53bac0-ba66-40bd-8154-ce9829b9db1a + Colour Swatch + + + + + Colour (palette) swatch + 1a804a97-9b85-4230-a3b1-f0eff8f793e7 + Colour Swatch + Swatch + false + 0 + + 197;255;255;255 + + + + + + + 3280 + 1079 + 88 + 20 + + + 3280.604 + 1079.713 + + + + + + + + + + c552a431-af5b-46a9-a8a4-0fcbc27ef596 + Group + + + + + 1 + + 150;255;255;255 + + A group of Grasshopper objects + ed0f70d1-142a-4a13-8cf6-ae134783d257 + c91d7211-9cd1-4e72-b248-c7b8194d29da + c5ddd8d0-09e6-4df1-adf6-11395b48fd76 + 066da693-d960-4d27-bb66-e473cc3ca3d4 + 98a6e12d-8448-4993-9edd-71c7658e5f38 + 0deadd24-8f12-4829-aaa9-82bf0d5415f5 + 70cc5425-d702-4584-b46d-0509ab8a651d + 1f9ff1ad-b792-4248-b3c1-943ac5786365 + 1a804a97-9b85-4230-a3b1-f0eff8f793e7 + 9 + b652b4a5-2a9a-405b-8b30-b42a702ce466 + Group + color mesh + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + from compas_rhino import unload_modules +unload_modules('model') + +import Rhino.Geometry as rg +import math as m + +from model import Brick + +planes = [] +meshes = [] + +for i in range (z_number):#Z + for j in range (x_number): #x + for k in range (y_number): #y + if i % 2 == 1: + + x_value = (Brick.REFERENCE_LENGTH * j)+(3*j)+(Brick.REFERENCE_LENGTH/2) + y_value = Brick.REFERENCE_WIDTH*k + (4.5*k) * (j/6 +0.03) + z_value = Brick.REFERENCE_HEIGHT * i + i*1 + plane_origin = rg.Point3d(x_value, y_value, z_value ) + plane = rg.Plane(plane_origin, rg.Vector3d.XAxis, rg.Vector3d.YAxis) + rg.Plane.Rotate(plane, m.radians(j*4 +10), plane.ZAxis, plane.Origin) + #rg.Plane.Translate(plane, rg.Vector3d(0,0,0)) + + else: + + x_value = (Brick.REFERENCE_LENGTH * j)+(3*j) + y_value = Brick.REFERENCE_WIDTH*k + (4.5*k) * (j/6 +0.03) + z_value = Brick.REFERENCE_HEIGHT * i + i*1 + plane_origin = rg.Point3d(x_value, y_value, z_value ) + plane = rg.Plane(plane_origin, rg.Vector3d.XAxis, rg.Vector3d.YAxis) + rg.Plane.Rotate(plane, m.radians(j*4+10), plane.ZAxis, plane.Origin) + #rg.Plane.Translate(plane, rg.Vector3d(0,0,0)) + + + myBrick = Brick(plane) + planes.append(myBrick.base_plane()) + meshes.append(myBrick.mesh()) + + + + + + + + + GhPython provides a Python script component + + 905 + 278 + + + 2240 + 2019 + + true + true + false + ecee5b24-b1ed-418d-a4bd-6e0b750fcf1f + false + true + GhPython Script + New pattern + + + + + + 208 + 664 + 136 + 95 + + + 280 + 712 + + + + + + 3 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 3 + 3ede854e-c753-40eb-84cb-b48008f14fd4 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Bricks + 3ae1f858-6f97-40e7-894e-7e79d9980bfc + x_number + x_number + true + 0 + true + b7e20f86-efa7-4972-ae82-910348246785 + 1 + 48d01794-d3d8-4aef-990e-127168822244 + + + + + + 210 + 666 + 55 + 30 + + + 239 + 681.1667 + + + + + + + + true + Script input y_number. + 266f99a8-d92a-483a-8486-fcfff78a2045 + y_number + y_number + true + 0 + true + 97712fde-30f8-43e4-82bf-959e99216762 + 1 + 48d01794-d3d8-4aef-990e-127168822244 + + + + + + 210 + 696 + 55 + 30 + + + 239 + 711.5 + + + + + + + + true + Script input z_number. + b32f1f4c-9e01-46a3-85bb-95719646b77d + z_number + z_number + true + 0 + true + ee91ac60-35dc-4d05-9b63-3e908d900c4e + 1 + 48d01794-d3d8-4aef-990e-127168822244 + + + + + + 210 + 726 + 55 + 31 + + + 239 + 741.8334 + + + + + + + + The execution information, as output and error streams + 94076860-4624-4147-a577-0e7f980a0a14 + out + out + false + 0 + + + + + + 295 + 666 + 47 + 30 + + + 318.5 + 681.1667 + + + + + + + + Script output meshes. + 59e0a68d-c1f0-47ac-a611-d218da7d1ea0 + meshes + meshes + false + 0 + + + + + + 295 + 696 + 47 + 30 + + + 318.5 + 711.5 + + + + + + + + Script output planes. + 7fc4b0c1-c68f-421f-83d3-ce723a03bfaa + planes + planes + false + 0 + + + + + + 295 + 726 + 47 + 31 + + + 318.5 + 741.8334 + + + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + b7e20f86-efa7-4972-ae82-910348246785 + Number Slider + + false + 0 + + + + + + 10 + 674 + 181 + 20 + + + 10.6203 + 674.014 + + + + + + 3 + 1 + 1 + 10 + 0 + 0 + 4 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 97712fde-30f8-43e4-82bf-959e99216762 + Number Slider + + false + 0 + + + + + + 10 + 697 + 181 + 20 + + + 10.31134 + 697.803 + + + + + + 3 + 1 + 1 + 10 + 0 + 0 + 3 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + ee91ac60-35dc-4d05-9b63-3e908d900c4e + Number Slider + + false + 0 + + + + + + 9 + 720 + 181 + 20 + + + 9.754333 + 720.5229 + + + + + + 3 + 1 + 1 + 10 + 0 + 0 + 5 + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + 54e72725-6aae-4d4b-90ac-7db02740a14e + Number Slider + + false + 0 + + + + + + 26 + 644 + 165 + 20 + + + 26.14142 + 644.3318 + + + + + + 3 + 1 + 0 + 0.001 + 0 + 0 + 0.001 + + + + + + + + + 4d2a06bd-4b0f-4c65-9ee0-4220e4c01703 + Scale + + + + + Scale an object uniformly in all directions. + true + 60acdc37-fc82-478a-b966-1c2238e744fd + Scale + Scale + + + + + + 370 + 700 + 67 + 64 + + + 402 + 732 + + + + + + Base geometry + d54ecf4b-f7d5-4fe7-9cb5-7b3b72071a32 + Geometry + G + true + 7fc4b0c1-c68f-421f-83d3-ce723a03bfaa + 1 + + + + + + 372 + 702 + 15 + 20 + + + 381 + 712 + + + + + + + + Center of scaling + c5b4834e-1fa8-4cbf-b03d-954548a0b9dd + Center + C + false + 0 + + + + + + 372 + 722 + 15 + 20 + + + 381 + 732 + + + + + + 1 + + + + + 1 + {0} + + + + + + + 0 + 0 + 0 + + + + + + + + + + + + Scaling factor + bd187879-3f5e-4c2e-a184-3da8220806b4 + Factor + F + false + 54e72725-6aae-4d4b-90ac-7db02740a14e + 1 + + + + + + 372 + 742 + 15 + 20 + + + 381 + 752 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.5 + + + + + + + + + + + Scaled geometry + be157387-2fdb-4ca4-948d-ec4fe87d5d98 + Geometry + G + false + 0 + + + + + + 417 + 702 + 18 + 30 + + + 426 + 717 + + + + + + + + Transformation data + a1e7a09d-d39a-4514-b833-6e712e2955c2 + Transform + X + false + 0 + + + + + + 417 + 732 + 18 + 30 + + + 426 + 747 + + + + + + + + + + + + e9eb1dcf-92f6-4d4d-84ae-96222d60f56b + Move + + + + + Translate (move) an object along a vector. + true + 285d8023-3187-4a8b-b033-5ca8221d7e7c + Move + Move + + + + + + 455 + 696 + 67 + 50 + + + 487 + 721 + + + + + + Base geometry + 7e693878-ac4f-4227-8f63-1db12b40cc8f + Geometry + G + true + be157387-2fdb-4ca4-948d-ec4fe87d5d98 + 1 + + + + + + 457 + 698 + 15 + 23 + + + 466 + 709.5 + + + + + + + + Translation vector + 5a835661-d960-43c9-8c55-c47c37be27dd + Motion + T + false + 1ce54dea-cb37-4f20-83c6-0edaa26ec43a + 1 + + + + + + 457 + 721 + 15 + 23 + + + 466 + 732.5 + + + + + + 1 + + + + + 1 + {0} + + + + + + 0 + 0 + 10 + + + + + + + + + + + + Translated geometry + dae489a9-07c9-46f6-8e62-bf21c52b9a31 + Geometry + G + false + 0 + + + + + + 502 + 698 + 18 + 23 + + + 511 + 709.5 + + + + + + + + Transformation data + 0b7fa6fd-cd9b-4582-b9e3-d18729869210 + Transform + X + false + 0 + + + + + + 502 + 721 + 18 + 23 + + + 511 + 732.5 + + + + + + + + + + + + d3d195ea-2d59-4ffa-90b1-8b7ff3369f69 + Unit Y + + + + + Unit vector parallel to the world {y} axis. + true + 0a375a78-f249-4c35-8278-385aecd42907 + Unit Y + Y + + + + + + 210 + 614 + 63 + 28 + + + 239 + 628 + + + + + + Unit multiplication + ba06b012-5594-45c5-90a0-3819ca81ff20 + Factor + F + false + a909b265-17c3-49bf-a1cd-31e1a3085e6f + 1 + + + + + + 212 + 616 + 12 + 24 + + + 219.5 + 628 + + + + + + 1 + + + + + 1 + {0} + + + + + 1 + + + + + + + + + + + World {y} vector + 1ce54dea-cb37-4f20-83c6-0edaa26ec43a + Unit vector + V + false + 0 + + + + + + 254 + 616 + 17 + 24 + + + 262.5 + 628 + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + a909b265-17c3-49bf-a1cd-31e1a3085e6f + Number Slider + + false + 0 + + + + + + 28 + 621 + 163 + 20 + + + 28.42804 + 621.228 + + + + + + 1 + 1 + 0 + 1 + 0 + 0 + 0.6 + + + + + + + + + f31d8d7a-7536-4ac8-9c96-fde6ecda4d0a + Cluster + + + + + + 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 + + Contains a cluster of Grasshopper components + 1 + ba4adbea-a1b3-4423-869a-5f5efc4db8fe + Cluster + T0CF + false + + + + + 3 + 20606d38-1b1b-4d29-9066-7314a397b2ea + af7d3a43-bf28-4d3a-a968-187b89544dcd + e328113b-073c-46f1-b400-4227e548946d + 43cd6740-e900-4cb5-aac6-f6ee8442edb2 + d0ccacbd-d43e-44d1-95fa-d65b95597d22 + a734e7f6-2f8f-4929-916a-9608854f6392 + + + + + + 592 + 665 + 144 + 46 + + + 658 + 688 + + + + + + 2 + 4f8984c4-7c7a-4d69-b0a2-183cbb330d20 + 3e8ca6be-fda8-4aaf-b5c0-3c54c8bb7312 + 1 + 4f8984c4-7c7a-4d69-b0a2-183cbb330d20 + + + + + Contains a collection of three-dimensional axis-systems + 20606d38-1b1b-4d29-9066-7314a397b2ea + Plane + tcf_point + true + dae489a9-07c9-46f6-8e62-bf21c52b9a31 + 1 + + + + + + 594 + 667 + 49 + 21 + + + 620 + 677.5 + + + + + + + + Contains a collection of floating point numbers + af7d3a43-bf28-4d3a-a968-187b89544dcd + Number + z_offset + true + 9a4be73c-3082-4c74-be27-41c7c1688c53 + 1 + 1 + + + + + + 594 + 688 + 49 + 21 + + + 620 + 698.5 + + + + + + 1 + + + + + 1 + {0} + + + + + 0.07 + + + + + + + + + + + Contains a collection of three-dimensional axis-systems + e328113b-073c-46f1-b400-4227e548946d + Plane + t0cf_frame + false + 0 + + + + + + 673 + 667 + 61 + 42 + + + 703.5 + 688 + + + + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + true + + 1619.181 + -46.97431 + + + 1818.934 + -46.97431 + + + 1818.934 + -13.64179 + + + 1619.181 + -13.64179 + + A quick note + Arial + 1ca3c3b8-18a0-485b-8393-a4aa121cf8d4 + false + Scribble + Scribble + 45 + SOLVING + + + + + + 1614.181 + -51.97431 + 209.7534 + 43.33252 + + + 1619.181 + -46.97431 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + # Mac will not automatically do this so, here we go +import os +import sys +HERE = os.path.dirname(ghenv.Component.OnPingDocument().FilePath) +if HERE not in sys.path: sys.path.append(HERE) + +## Start assembly definition +from assembly import Assembly +from assembly import Element + +from compas.datastructures import Mesh +from compas.geometry import Translation +from compas_fab.ghpython.components import coerce_frame + + +assembly = Assembly() + +assembly.attributes['home_config'] = home_config +assembly.attributes['element'] = element +assembly.attributes['place_tolerance'] = place_tolerance +assembly.approach_offset = approach_offset + +source_element = assembly.attributes['element'] +assembly.pick_t0cf_frame = coerce_frame(pick_t0cf_frame) +place_t0cf_frames = [coerce_frame(f) for f in place_t0cf_frames] + +for key, frame in enumerate(robot.from_t0cf_to_tcf(place_t0cf_frames)): + x, y, z = 0, 0, (source_element.height / 2) + + frame = frame.transformed(Translation.from_vector([x, y, z])) + approach_t0cf_frame = frame.transformed(Translation.from_vector([0, 0, approach_offset])) + element = Element(frame=frame, + approach_frame=approach_t0cf_frame, + geometry_at_origin=Mesh.from_shape(source_element)) + assembly.add_element(element, key) + +pickup_t0cf_frames = assembly.pick_t0cf_frames() + GhPython provides a Python script component + + 457 + 356 + + + 1502 + 1535 + + true + true + 1 + fd9b00a1-4fa2-4250-bf75-9a5d0a375bee + false + true + GhPython Script + Create assembly + + + + + + 960 + 581 + 229 + 144 + + + 1070 + 653 + + + + + + 7 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 2 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Create assembly + aec2f3dd-0e8c-4302-9056-6d8e2ef8126a + robot + robot + true + 0 + true + 9a9900f7-c5de-485a-9791-63a5e1930c86 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 962 + 583 + 93 + 20 + + + 1010 + 593 + + + + + + + + true + Script input pick_t0cf_frame. + 67454834-dabb-4df3-8f8f-8c4b144be0d5 + pick_t0cf_frame + pick_t0cf_frame + true + 0 + true + bf2d76a6-3501-45a4-893d-ae3e0eaa5ce4 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 962 + 603 + 93 + 20 + + + 1010 + 613 + + + + + + + + 1 + true + Script input place_t0cf_frames. + cba0b97a-eb2f-40ba-b7eb-902c76d3b817 + place_t0cf_frames + place_t0cf_frames + true + 1 + true + e328113b-073c-46f1-b400-4227e548946d + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 962 + 623 + 93 + 20 + + + 1010 + 633 + + + + + + + + true + Script input approach_offset. + 356fc3f0-79bc-4969-8bd2-8f3724556a7d + approach_offset + approach_offset + true + 0 + true + a17a3498-e042-4db0-b3e7-eca2f875e5b8 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 962 + 643 + 93 + 20 + + + 1010 + 653 + + + + + + + + true + Script input element. + 78aea61d-45ca-4843-b8f8-d3d3f5fbdde8 + element + element + true + 0 + true + 252a3ad3-fe63-448c-9531-ba99a4a17577 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 962 + 663 + 93 + 20 + + + 1010 + 673 + + + + + + + + true + Script input home_config. + 74c6f8c9-9b0d-44e8-a6cc-e4a80ff0e2b0 + home_config + home_config + true + 0 + true + f956b690-65c4-4b82-ac9a-488e4afed703 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 962 + 683 + 93 + 20 + + + 1010 + 693 + + + + + + + + true + Script input place_tolerance. + 7bf4ca6c-8e62-4f70-961e-0d4543c8ef2e + place_tolerance + place_tolerance + true + 0 + true + 0 + 39fbc626-7a01-46ab-a18e-ec1c0c41685b + + + + + + 962 + 703 + 93 + 20 + + + 1010 + 713 + + + + + + 1 + + + + + 1 + {0} + + + + + Grasshopper.Kernel.Types.GH_Number + 0.008 + + + + + + + + + + + Script output assembly. + c3c6a6b8-81c2-457b-9ca0-dc150f8a77e8 + assembly + assembly + false + 0 + + + + + + 1085 + 583 + 102 + 70 + + + 1136 + 618 + + + + + + + + Script output pickup_t0cf_frames. + 31e84a49-19da-4674-8b74-5ae598560f11 + pickup_t0cf_frames + pickup_t0cf_frames + false + 0 + + + + + + 1085 + 653 + 102 + 70 + + + 1136 + 688 + + + + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + true + + 979.2699 + 538.9601 + + + 1177.443 + 538.9601 + + + 1177.443 + 576.9372 + + + 979.2699 + 576.9372 + + A quick note + Arial + 32a47c5f-6e9f-4fd4-af69-5f33be3c44e4 + false + Scribble + Scribble + 41 + Assembly + + + + + + 974.2699 + 533.9601 + 208.1733 + 47.97705 + + + 979.2699 + 538.9601 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + from compas.datastructures import Mesh +from compas_fab.robots import AttachedCollisionMesh +from compas_fab.robots import CollisionMesh +from compas_fab.robots import PlanningScene + + +if robot: + scene = PlanningScene(robot) + scene.remove_collision_mesh('built_elements') + + a = [] + for key in assembly.nodes(): + # Linear order assumed here! + if key >= i: break + element = assembly.element(key) + cm = CollisionMesh(element.geometry_at_placement, 'built_elements') + scene.append_collision_mesh(cm) + + # Setup attached element + scene.remove_attached_collision_mesh('brick') + scene.remove_collision_mesh('brick') + + ee_link_name = robot.get_end_effector_link_name() + if robot.attached_tool: + brick_frame = robot.attached_tool.frame.copy() + else: + brick_frame = Frame.worldXY() + + # Centered origin, get half + element = assembly.attributes['element'] + brick_frame.point.x += element.height / 2 + element = Mesh.from_shape(element) + brick_acm = AttachedCollisionMesh(CollisionMesh(element, 'brick', brick_frame), ee_link_name) + scene.add_attached_collision_mesh(brick_acm) + + GhPython provides a Python script component + + 668 + 417 + + + 558 + 571 + + true + true + 1 + 19ea3000-8a91-4bca-8866-792502605bcd + false + true + GhPython Script + ROS scene + + + + + + 1694 + 1073 + 83 + 81 + + + 1763 + 1114 + + + + + + 3 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 0 + + + + + true + Script variable Python + 80aa6b6d-833e-45c7-bd00-414d70dbd152 + robot + robot + true + 0 + true + 9a9900f7-c5de-485a-9791-63a5e1930c86 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1696 + 1075 + 52 + 25 + + + 1723.5 + 1087.833 + + + + + + + + true + Script input assembly. + 8b372ba5-db8d-4c20-bea0-df45cf256aa4 + assembly + assembly + true + 0 + true + c3c6a6b8-81c2-457b-9ca0-dc150f8a77e8 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1696 + 1100 + 52 + 26 + + + 1723.5 + 1113.5 + + + + + + + + true + Script input i. + 7213734f-9532-4ad7-a5e8-0ab215743b3a + i + i + true + 0 + true + d3765dd9-51b9-48b1-8583-25508339aed8 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1696 + 1126 + 52 + 26 + + + 1723.5 + 1139.167 + + + + + + + + + + + + + + 57da07bd-ecab-415d-9d86-af36d7073abc + Number Slider + + + + + Numeric slider for single values + d3765dd9-51b9-48b1-8583-25508339aed8 + Number Slider + + false + 0 + + + + + + 1505 + 1130 + 160 + 20 + + + 1505.196 + 1130.106 + + + + + + 3 + 1 + 1 + 100 + 0 + 0 + 0 + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + if assembly: + assembly.pick_trajectory = pick_trajectory + GhPython provides a Python script component + + 130 + 130 + + + 566 + 683 + + true + true + 1 + d3497764-72f4-4b96-9c43-e4b12c91e0f7 + false + true + GhPython Script + Store + + + + + + 2271 + 804 + 108 + 48 + + + 2365 + 828 + + + + + + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 0 + + + + + true + Script variable Python + e4a7cd6c-eb62-465f-98e1-81d030fe775e + assembly + assembly + true + 0 + true + c3c6a6b8-81c2-457b-9ca0-dc150f8a77e8 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 1 + + + + + + 2273 + 806 + 77 + 22 + + + 2313 + 817 + + + + + + + + true + Script input pick_trajectory. + d2b17130-8fac-4015-a044-301cd7ef312d + pick_trajectory + pick_trajectory + true + 0 + true + 0ac0402c-aca7-4167-9000-cfddc8a90179 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2273 + 828 + 77 + 22 + + + 2313 + 839 + + + + + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + import Grasshopper +import System +from ghpythonlib.componentbase import executingcomponent as component +from scriptcontext import sticky as st + +from compas_fab.ghpython.components import create_id +from compas_fab.ghpython.components import coerce_frame +from compas_fab.ghpython.components.icons import plan_cartesian_motion_icon + +class PlanCartesianMotion(component): + def SetUpParam(self, p, name, nickname, description): + p.Name = name + p.NickName = nickname + p.Description = description + p.Optional = True + + def RegisterInputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "robot", "robot", "The robot.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "planes", "planes", "The planes or frames through which the path is defined.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.list + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "start_configuration", "start_configuration", + "The robot's full configuration, i.e. values for all configurable joints of the entire robot, at the starting position. Defaults to the all-zero configuration.") # noqa E501 + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_String() + self.SetUpParam(p, "group", "group", "The planning group used for calculation. Defaults to the robot's main planning group.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + +# p = Grasshopper.Kernel.Parameters.Param_GenericObject() +# self.SetUpParam(p, "attached_collision_meshes", "attached_collision_meshes", "A list of attached collision meshes to be included for planning.") +# p.Access = Grasshopper.Kernel.GH_ParamAccess.list +# self.Params.Input.Add(p) + +# p = Grasshopper.Kernel.Parameters.Param_GenericObject() +# self.SetUpParam(p, "path_constraints", "path_constraints", +# "Optional constraints that can be imposed along the solution path. Note that path calculation won't work if the start_configuration violates these constraints. Defaults to None.") # noqa E501 +# p.Access = Grasshopper.Kernel.GH_ParamAccess.list +# self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Number() + self.SetUpParam(p, "max_step", "max_step", "The approximate distance between the calculated points. (Defined in the robot's units.) Defaults to 0.01.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Boolean() + self.SetUpParam(p, "compute", "compute", "If `True`, calculates a trajectory.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + def RegisterOutputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "trajectory", "trajectory", "The calculated trajectory.") + self.Params.Output.Add(p) + + def SolveInstance(self, DA): + p0 = self.marshal.GetInput(DA, 0) + p1 = self.marshal.GetInput(DA, 1) + p2 = self.marshal.GetInput(DA, 2) + p3 = self.marshal.GetInput(DA, 3) + p4 = self.marshal.GetInput(DA, 4) + p5 = self.marshal.GetInput(DA, 5) +# p6 = self.marshal.GetInput(DA, 6) +# p7 = self.marshal.GetInput(DA, 7) +# result = self.RunScript(p0, p1, p2, p3, p4, p5, p6, p7) + result = self.RunScript(p0, p1, p2, p3, p4, p5) + + if result is not None: + self.marshal.SetOutput(result, DA, 0, True) + + def get_Internal_Icon_24x24(self): + return plan_cartesian_motion_icon + + def RunScript(self, robot, planes, start_configuration, group, max_step, compute): + + key = create_id(self, 'trajectory') + + max_step = float(max_step) if max_step else 0.01 + # NOTE: Read from scene + attached_collision_meshes = None + path_constraints = None + attached_collision_meshes = list(attached_collision_meshes) if attached_collision_meshes else None + + if robot and robot.client and robot.client.is_connected and start_configuration and planes and compute: + frames = [coerce_frame(plane) for plane in planes] + st[key] = robot.plan_cartesian_motion(frames, + start_configuration=start_configuration, + group=group, + options=dict( + max_step=max_step, + path_constraints=path_constraints, + attached_collision_meshes=attached_collision_meshes + )) + + trajectory = st.get(key, None) + + if trajectory and trajectory.fraction < 1.0: + raise Exception('Incomplete trajectory. Fraction={}'.format(trajectory.fraction)) + + return trajectory + GhPython provides a Python script component + + 380 + 257 + + + 1840 + 1391 + + true + true + 1 + de944dfd-0524-4e32-847a-6d55172e6a96 + true + true + GhPython Script + Plan Cartesian Motion + + + + + + 1745 + 595 + 188 + 157 + + + 1860 + 674 + + + + + + 6 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 1 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + 34656f8c-a260-4302-a0c3-3549e25875bf + robot + robot + true + 0 + true + 9a9900f7-c5de-485a-9791-63a5e1930c86 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1747 + 597 + 98 + 25 + + + 1797.5 + 609.75 + + + + + + + + 1 + true + Script input planes. + e1b06454-8651-4966-b63c-b2f48e117af8 + planes + planes + true + 1 + true + 31e84a49-19da-4674-8b74-5ae598560f11 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1747 + 622 + 98 + 26 + + + 1797.5 + 635.25 + + + + + + + + true + Script input start_configuration. + 2e99ead4-6674-4c78-a25e-02db600f1f62 + start_configuration + start_configuration + true + 0 + true + f956b690-65c4-4b82-ac9a-488e4afed703 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1747 + 648 + 98 + 25 + + + 1797.5 + 660.75 + + + + + + + + true + Script input group. + 8c43e63e-6356-42ed-a19f-cf754c556a98 + group + group + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1747 + 673 + 98 + 26 + + + 1797.5 + 686.25 + + + + + + + + true + Script input max_step. + 0d3db76f-ef50-4a94-b1cb-6182a9acf64e + max_step + max_step + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1747 + 699 + 98 + 25 + + + 1797.5 + 711.75 + + + + + + + + true + Script input compute. + 6a261cfe-c2da-4610-9b10-c0e39ee31eb7 + compute + compute + true + 0 + true + 8c731948-abe8-4e50-a551-e6a07b85d9c4 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 1747 + 724 + 98 + 26 + + + 1797.5 + 737.25 + + + + + + + + Script output trajectory. + dcfe8806-86f9-4cfc-af81-819cd25482f0 + trajectory + trajectory + false + 0 + + + + + + 1875 + 597 + 56 + 153 + + + 1903 + 673.5 + + + + + + + + + + + + + + fbac3e32-f100-4292-8692-77240a42fd1a + Point + + + + + Contains a collection of three-dimensional points + b2ac75b7-c534-4271-9a27-3649779c17d0 + Point + Pt + false + 0 + + + + + + 11 + 551 + 50 + 20 + + + 36.95251 + 561.5808 + + + + + + 1 + + + + + 1 + {0} + + + + + + + -0.0643269056259189 + 0.668512451261046 + 0.0817357251225426 + + + + + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + true + + 2560.79 + 267.9866 + + + 2832.074 + 267.9866 + + + 2832.074 + 298.3563 + + + 2560.79 + 298.3563 + + A quick note + Arial + 04b7fd46-609e-48b8-a151-5e9495abbd13 + false + Scribble + Scribble + 41 + Save to JSON + + + + + + 2555.79 + 262.9866 + 281.2849 + 40.36966 + + + 2560.79 + 267.9866 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + import os +import json +import compas + +HERE = os.path.dirname(ghenv.Component.OnPingDocument().FilePath) +rfile = os.path.join(HERE, 'assembly.json') + +# We are storing a full assembly representation +if save and assembly: + compas.json_dump(assembly, rfile) + + # Pretty formatting because OCD + with open(rfile, 'r+') as rf: + data = json.load(rf) + rf.seek(0) + json.dump(data, rf, indent=4, sort_keys=True) + + GhPython provides a Python script component + + 1405 + 231 + + + 1579 + 1305 + + true + false + 1 + af35f706-7af8-4260-b588-358a993d1352 + false + true + GhPython Script + Save + + + + + + 2710 + 320 + 112 + 44 + + + 2779 + 342 + + + + + + 2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 2 + 3ede854e-c753-40eb-84cb-b48008f14fd4 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Save + 693870d1-7975-4bc2-9352-ffba36c01fcb + assembly + assembly + true + 0 + true + c3c6a6b8-81c2-457b-9ca0-dc150f8a77e8 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + 2 + + + + + + 2712 + 322 + 52 + 20 + + + 2739.5 + 332 + + + + + + + + true + Script input save. + d857b401-066f-4625-9f96-df6662a5dc8c + save + save + true + 0 + true + fbd9e873-ec49-47bc-8d5c-258d8036b745 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2712 + 342 + 52 + 20 + + + 2739.5 + 352 + + + + + + + + The execution information, as output and error streams + 5f98ae84-f5dc-414b-ad0a-341943c35da4 + out + out + false + 0 + + + + + + 2794 + 322 + 26 + 20 + + + 2807 + 332 + + + + + + + + Script output a. + d37b140a-2c87-4117-9ffa-a5e5a78894eb + a + a + false + 0 + + + + + + 2794 + 342 + 26 + 20 + + + 2807 + 352 + + + + + + + + + + + + + + a8b97322-2d53-47cd-905e-b932c3ccd74e + Button + + + + + Button object with two values + False + True + fbd9e873-ec49-47bc-8d5c-258d8036b745 + Button + Button + false + 0 + + + + + + 2429 + 341 + 103 + 22 + + + + + + + + + + 410755b1-224a-4c1e-a407-bf32fb45ea7e + 00000000-0000-0000-0000-000000000000 + GhPython Script + + + + + import Grasshopper +import System +from ghpythonlib.componentbase import executingcomponent as component +from scriptcontext import sticky as st + +from compas.geometry import Frame +from compas.geometry import Transformation +from compas_ghpython.artists import MeshArtist +from compas_ghpython import draw_frame +from compas_fab.ghpython.components import create_id +from compas_fab.ghpython.components.icons import robot_visualize_icon + +class RobotVisualize(component): + def SetUpParam(self, p, name, nickname, description): + p.Name = name + p.NickName = nickname + p.Description = description + p.Optional = True + + def RegisterInputParams(self, pManager): + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "robot", "robot", "The robot.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_String() + self.SetUpParam(p, "group", "group", "The planning group used for end-effector and base visualization.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "configuration", "configuration", "The robot's full configuration.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_Boolean() + self.SetUpParam(p, "reload_scene", "reload_scene", "Whether or not to reload the scene information from the client.") + p.Access = Grasshopper.Kernel.GH_ParamAccess.item + self.Params.Input.Add(p) + + def RegisterOutputParams(self, pManager): + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "visual", "visual", "The robot's visual meshes.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "frames", "frames", "The robot's joint frames.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "attached_collision_meshes", "attached_collision_meshes", "Attached collision meshes in the scene.") + self.Params.Output.Add(p) + + p = Grasshopper.Kernel.Parameters.Param_GenericObject() + self.SetUpParam(p, "collision_meshes", "collision_meshes", "Collision meshes in the scene.") + self.Params.Output.Add(p) + + def SolveInstance(self, DA): + p0 = self.marshal.GetInput(DA, 0) + p1 = self.marshal.GetInput(DA, 1) + p2 = self.marshal.GetInput(DA, 2) + p3 = self.marshal.GetInput(DA, 3) + result = self.RunScript(p0, p1, p2, p3) + + if result is not None: + if not hasattr(result, '__getitem__'): + self.marshal.SetOutput(result, DA, 0, True) + else: + self.marshal.SetOutput(result[0], DA, 0, True) + self.marshal.SetOutput(result[1], DA, 1, True) + self.marshal.SetOutput(result[2], DA, 2, True) + self.marshal.SetOutput(result[3], DA, 3, True) + + def get_Internal_Icon_24x24(self): + return robot_visualize_icon + + def RunScript(self, robot, group, configuration, reload_scene): + + visual = None + frames = None + collision_meshes = [] + attached_collision_meshes = [] + + if robot: + configuration = configuration or robot.zero_configuration() + + robot.update(configuration, visual=True, collision=False) + frames = [draw_frame(f) for f in robot.transformed_frames(configuration, group)] + + visual = robot.artist.draw_visual() + + scene_key = create_id(self, 'scene') + + if robot and (reload_scene or scene_key not in st): + st[scene_key] = robot.client.get_planning_scene() + + scene = st.get(scene_key, None) + + if scene: + scene_key_co = scene_key + '_co' + if reload_scene or scene_key_co not in st: + for co in scene.world.collision_objects: + # HACK: Little workaround to a bug in to_collision_meshes() + header = co.header + frame_id = header.frame_id + co.header = dict(frame_id=frame_id) + cms = co.to_collision_meshes() + # HACK: Restore proper header + co.header = header + + for cm in cms: + if frame_id != '/world': + raise NotImplementedException('Only world-referenced collision meshes are supported') + + if cm.frame != Frame.worldXY(): + t = Transformation.from_frame(cm.frame) + mesh = cm.mesh.transformed(t) + else: + mesh = cm.mesh + + rhino_mesh = MeshArtist(mesh).draw() + collision_meshes.append(rhino_mesh) + st[scene_key_co] = collision_meshes + + collision_meshes = st.get(scene_key_co, None) + + for aco in scene.robot_state.attached_collision_objects: + for acm in aco.to_attached_collision_meshes(): + frame_id = aco.object['header']['frame_id'] + frame = robot.forward_kinematics(configuration, options=dict(link=frame_id)) + t = Transformation.from_frame(frame) + + # Local CM frame + if acm.collision_mesh.frame and acm.collision_mesh.frame != Frame.worldXY(): + t = t * Transformation.from_frame(acm.collision_mesh.frame) + + mesh = acm.collision_mesh.mesh.transformed(t) + + rhino_mesh = MeshArtist(mesh).draw() + attached_collision_meshes.append(rhino_mesh) + + return (visual, frames, attached_collision_meshes, collision_meshes) + + GhPython provides a Python script component + + 776 + 53 + + + 821 + 880 + + true + true + true + 1 + ebe99570-fddf-41df-aa4c-5d4202f08c7f + true + true + GhPython Script + Visualize + + + + + + 2589 + 130 + 243 + 84 + + + 2678 + 172 + + + + + + 4 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 84fa917c-1ed8-4db3-8be1-7bdc4a6495a2 + 4 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + 8ec86459-bf01-4409-baee-174d0d2b13d0 + + + + + true + Script variable Python + 217464a9-767d-43bb-ba34-7c1c7164471d + robot + robot + true + 0 + true + 9a9900f7-c5de-485a-9791-63a5e1930c86 + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2591 + 132 + 72 + 20 + + + 2628.5 + 142 + + + + + + + + true + Script input group. + f0885311-9e17-4d64-a69c-94739238cb77 + group + group + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2591 + 152 + 72 + 20 + + + 2628.5 + 162 + + + + + + + + true + Script input configuration. + ad098fef-2525-4213-933b-639056d48baa + configuration + configuration + true + 0 + true + 0 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2591 + 172 + 72 + 20 + + + 2628.5 + 182 + + + + + + + + true + Script input reload_scene. + 2600c4d3-355c-4dd4-a088-1ab7e6316901 + reload_scene + reload_scene + true + 0 + true + 475fa148-99eb-4bdd-ad50-28959a3b193d + 1 + 87f87f55-5b71-41f4-8aea-21d494016f81 + + + + + + 2591 + 192 + 72 + 20 + + + 2628.5 + 202 + + + + + + + + Script output visual. + 8556425a-ca3b-4287-b2a3-e311c52b6cd8 + visual + visual + false + 0 + + + + + + 2693 + 132 + 137 + 20 + + + 2761.5 + 142 + + + + + + + + Script output frames. + 500e7fb0-17fb-4e84-842c-b00468c3ac32 + frames + frames + false + 0 + + + + + + 2693 + 152 + 137 + 20 + + + 2761.5 + 162 + + + + + + + + Script output attached_collision_meshes. + 5522dc69-489f-4f95-8657-1166564b80dd + attached_collision_meshes + attached_collision_meshes + false + 0 + + + + + + 2693 + 172 + 137 + 20 + + + 2761.5 + 182 + + + + + + + + Script output collision_meshes. + 79dc54ae-3aad-4bbe-af91-2fe6663ef6eb + collision_meshes + collision_meshes + false + 0 + + + + + + 2693 + 192 + 137 + 20 + + + 2761.5 + 202 + + + + + + + + + + + + + + 2e78987b-9dfb-42a2-8b76-3923ac8bd91a + Boolean Toggle + + + + + Boolean (true/false) toggle + 475fa148-99eb-4bdd-ad50-28959a3b193d + Boolean Toggle + reload + false + 0 + true + + + + + + 2425 + 196 + 101 + 22 + + + + + + + + + + 7f5c6c55-f846-4a08-9c9a-cfdc285cc6fe + Scribble + + + + + true + + 2583.522 + 80.05577 + + + 2837.39 + 80.05577 + + + 2837.39 + 109.8849 + + + 2583.522 + 109.8849 + + A quick note + Arial + b626a1f5-5bd9-42c3-96da-26f221b1048e + false + Scribble + Scribble + 41 + Visualization + + + + + + 2578.522 + 75.05577 + 263.8677 + 39.8291 + + + 2583.522 + 80.05577 + + + + + + + + + + + + + + + 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 + + + + + \ No newline at end of file diff --git a/lecture_06/assignment_05/Guillaume Jami/model.py b/lecture_06/assignment_05/Guillaume Jami/model.py new file mode 100644 index 0000000..cbbe844 --- /dev/null +++ b/lecture_06/assignment_05/Guillaume Jami/model.py @@ -0,0 +1,441 @@ +import Rhino.Geometry as rg +import rhinoscriptsyntax as rs +import math as m +import simple_comm as c +import simple_ur_script as ur + + +class Fabrication(): + ROBOT_IP = "192.168.10.10" + + def __init__(self, fabricate=False, brick_planes=None, robot_ip=ROBOT_IP): + self.brick_planes = brick_planes + self.robot_ip = robot_ip + self.accel = 0.1 + self.vel = 0.1 + self.script = "" + self.way_planes = [] + + def tcp(self): + self.script += ur.set_tcp_by_angles( + 0.0, 0.0, 74.0, m.radians(0.0), m.radians(180.0), m.radians(0)) + + def set_robot_base_plane(self): + + rs.MessageBox( + "move robot to base plane origin, press OK when there", 0) + data = c.listen_to_robot(ROBOT_IP) + pose = data['pose'] + pt_1 = rg.Point3d(pose[0]*1000, pose[1]*1000, pose[2]*1000) + print(pt_1) + rs.MessageBox( + "move robot to base plane positive x direction, press OK when there", 0) + data = c.listen_to_robot(ROBOT_IP) + pose = data['pose'] + pt_2 = rg.Point3d(pose[0]*1000, pose[1]*1000, pose[2]*1000) + print(pt_2) + rs.MessageBox( + "move robot to base plane positive y direction, press OK when there", 0) + data = c.listen_to_robot(robot_ip) + pose = data['pose'] + pt_3 = rg.Point3d(pose[0]*1000, pose[1]*1000, pose[2]*1000) + print(pt_3) + + robot_base = rg.Plane(pt_1, pt_2-pt_1, pt_3-pt_1) + text_file = open("robot_base.txt", "w") + text_file.write(str(robot_base.Origin)+"," + + str(robot_base.XAxis)+","+str(robot_base.YAxis)) + text_file.close() + + # def load_robot_base_plane(self): + text_file = open("robot_base.txt", "r") + string = text_file.read() + values = string.split(",") + values = [float(value) for value in values] + + base_origin = rg.Point3d(values[0], values[1], values[2]) + base_x_axis = rg.Vector3d(values[3], values[4], values[5]) + base_y_axis = rg.Vector3d(values[6], values[7], values[8]) + + base_plane = rg.Plane(base_origin, base_x_axis, base_y_axis) + return base_plane + + def set_robot_base_plane_from_pts(self): + + pt_0 = rg.Point3d(327, 230, 0) # base plane origin + # point on base plane positive x direction + pt_1 = rg.Point3d(499, 230, 0) + pt_2 = rg.Point3d(499, 499, 0) # point on base plane positive xy + + robot_base = rg.Plane(pt_0, pt_1-pt_0, pt_2-pt_0) + return robot_base + + def rhino_to_robot_space(self, in_plane): + plane = in_plane.Clone() + _r_matrix = rg.Transform.PlaneToPlane( + rg.Plane.WorldXY, self.set_robot_base_plane_from_pts()) + plane.Transform(_r_matrix) + return plane + + def robot_transformation(self): # LOAD robot model + _robot_matrix = rg.Transform.PlaneToPlane( + self.set_robot_base_plane_from_pts(), rg.Plane.WorldXY) + return _robot_matrix + + def pickup_brick(self, pick_up_plane): + """Example of a method's documentation. + + Parameters + ---------- + point_x : float + Description of the first param + point_y : float + Description of the second param + """ + + safe_distance = 50 + + safe_plane = pick_up_plane.Clone() + safe_plane.Translate(rg.Vector3d(0, 0, safe_distance)) + + self.script += ur.move_l(safe_plane, self.accel, self.vel) + self.way_planes.append(safe_plane) + + self.script += ur.move_l(pick_up_plane, self.accel, self.vel) + self.way_planes.append(pick_up_plane) + + self.script += ur.set_digital_out(4, True) + self.script += ur.sleep(1) + + self.script += ur.move_l(safe_plane, self.accel, self.vel) + self.way_planes.append(safe_plane) + + return None + + def place_brick(self, plane): + """ + this function gereates the robotic sequience for placing a brick + Requires a plane wich describes the possition of the brick""" + + safe_distance = 50 + + safe_plane = plane.Clone() + safe_plane.Translate(rg.Vector3d(0, 0, safe_distance)) + + self.script += ur.move_l(safe_plane, self.accel, self.vel) + self.way_planes.append(safe_plane) + + self.script += ur.move_l(plane, self.accel, self.vel) + self.way_planes.append(plane) + + self.script += ur.set_digital_out(4, False) + self.script += ur.sleep(1) + + self.script += ur.move_l(safe_plane, self.accel, self.vel) + self.way_planes.append(safe_plane) + + return None + + def procedure(self, transform=True): + + self.tcp() + robot_planes = [] + + if transform: + pick_up_plane = rg.Plane(rg.Point3d( + 0, 450, 0), rg.Vector3d.XAxis, rg.Vector3d.YAxis) + for plane in (self.brick_planes): + robot_planes.append(self.rhino_to_robot_space(plane)) + + else: + pick_up_plane = self.rhino_to_robot_space( + rg.Plane(rg.Point3d(0, 450, 0), rg.Vector3d.XAxis, rg.Vector3d.YAxis)) + robot_planes = self.brick_planes + + for plane in (robot_planes): + self.pickup_brick(pick_up_plane) + self.place_brick(plane) + + def visualize(self): + """this funktion visualizes the planes wich are sent to the robot""" + + crv = [] + + for plane in self.way_planes: + #print (plane.Origin) + pt = plane.Origin + crv.append(pt) + + curve = rg.NurbsCurve.Create(False, 1, crv) + print(curve) + return self.way_planes, curve + + def send(self): + """ + this funktion sends the script to the robot.""" + + self.script = c.concatenate_script(self.script) + #c.send_script(self.script, self.robot_ip) + return self.script + + +class Brick(object): + REFERENCE_LENGTH = 31 + REFERENCE_WIDTH = 25 + REFERENCE_HEIGHT = 8 + + def __init__(self, plane, length=REFERENCE_LENGTH, width=REFERENCE_WIDTH, height=REFERENCE_HEIGHT): + """Brick containes picking plane, placing plane and geometry + + Parameters + ---------- + plane : Rhino Geometry plane + this plane describes the possition and orientation of the Brick + + """ + self.plane = plane + self.length = length + self.width = width + self.height = height + + + def dimensions(self): + """returns the dimenesnions of the brick: + + Returns + ---------- + [length : float, width : float, height: float] + + """ + + return self.length, self.width, self.height + + def pts(self): + """returns 8 points describing the brick: + + Returns + ---------- + [pt0 : bottom point at origin, + pt1 : bottom point at possitive Y, + pt2 : bottom point at possitive X, + pt3 : bottom point at possitive X and poossitive Y, + pt4 : top point at origin, + pt1 : top point at possitive Y, + pt2 : top point at possitive X, + pt3 : top point at possitive X and poossitive Y] + + """ + + pt_0 = rg.Point3d(0, 0, 0) + pt_1 = rg.Point3d(self.length, 0, 0) + pt_2 = rg.Point3d(self.length, self.width, 0) + pt_3 = rg.Point3d(0, self.width, 0) + + pt_4 = rg.Point3d(0, 0, self.height) + pt_5 = rg.Point3d(self.length, 0, self.height) + pt_6 = rg.Point3d(self.length, self.width, self.height) + pt_7 = rg.Point3d(0, self.width, self.height) + + b_pts = [pt_0, pt_1, pt_2, pt_3, pt_4, pt_5, pt_6, pt_7] + + return b_pts + + def origin(self): + """returns the origin plane in the centre of the base of the brick: + + Returns + ---------- + [Rhino Geometry Plane] + + """ + vec = (self.pts()[2]-self.pts()[0])/2 + origin = self.pts()[0] + vec + plane = rg.Plane(origin, rg.Vector3d.XAxis, rg.Vector3d.YAxis) + return plane + + def transformation(self): + """Transoformation matrix fot transformating the brick to the brick possiotn: + + Returns + ---------- + [Rhino Geometry Transformation] + + """ + return rg.Transform.PlaneToPlane(self.origin(), self.plane) + + def base_plane(self): + """Base plane of the transformed brick: + + Returns + ---------- + [Rhino Geometry Plane] + + """ + + p_plane = self.origin() + p_plane.Transform(self.transformation()) + return p_plane + + def picking_plane(self): + """Robot's picking plane on the transformed brick: + + Returns + ---------- + [Rhino Geometry Plane] + + """ + p_plane = self.origin() + p_pt = p_plane.Origin + p_plane = rg.Plane(p_pt+rg.Vector3d(0, 0, self.height), + p_plane.XAxis, p_plane.YAxis) + + p_plane.Transform(self.transformation()) + return p_plane + + def surface(self): + """NURB surfaces depicting the brick: + + Returns + ---------- + [srf0 : base surface, + srf1 : long edge, + srf2 : top surface + srf3 : long edge, + srf4 : short edge + srf5 : short edge] + + """ + tran_brick_pts = [] + for pt in self.pts(): + transformation_pt = pt.Clone() + transformation_pt.Transform(self.transformation()) + tran_brick_pts.append(transformation_pt) + + pt_0, pt_1, pt_2, pt_3, pt_4, pt_5, pt_6, pt_7 = tran_brick_pts + + srf_0 = rg.NurbsSurface.CreateFromPoints( + [pt_0, pt_1, pt_3, pt_2], 2, 2, 1, 1) + srf_1 = rg.NurbsSurface.CreateFromPoints( + [pt_0, pt_1, pt_4, pt_5], 2, 2, 1, 1) + srf_2 = rg.NurbsSurface.CreateFromPoints( + [pt_4, pt_5, pt_7, pt_6], 2, 2, 1, 1) + srf_3 = rg.NurbsSurface.CreateFromPoints( + [pt_6, pt_7, pt_2, pt_3], 2, 2, 1, 1) + srf_4 = rg.NurbsSurface.CreateFromPoints( + [pt_0, pt_3, pt_4, pt_7], 2, 2, 1, 1) + srf_5 = rg.NurbsSurface.CreateFromPoints( + [pt_1, pt_2, pt_5, pt_6], 2, 2, 1, 1) + + return (srf_0, srf_1, srf_2, srf_3, srf_4, srf_5) + + def mesh(self): + """Mesh depicting the brick: + + Returns + ---------- + mesh_brick : Mesh + """ + + mesh_brick = rg.Mesh.CreateFromBox(self.pts(), 1, 1, 1) + mesh_brick.Transform(self.transformation()) + + return mesh_brick + + +class Wall(): + def __init__(self, x_cnt, z_cnt): + """Wall generates and contains the bricks + + Parameters + ---------- + x_cnt : int + this number corresponds to the length of the wall (amount of bricks) + + x_cnt : int + this number corresponds to the hight of the wall + (amount of brick layers) + + """ + + self.x_cnt = x_cnt + self.z_cnt = z_cnt + + + self.b_length = Brick.REFERENCE_LENGTH + self.b_width = Brick.REFERENCE_WIDTH + self.b_height = Brick.REFERENCE_HEIGHT + + def brick_possitions(self): + """Genrates a Rhino Geometry plane for each brick + + This is where the design of the wall is created. + + Returns + ---------- + brick_planes : [Rhino Geometry Plane, Rhino Geometry Plane, ...] + + """ + + brick_planes = [] + for i in range(self.z_cnt): # layer count + for j in range(self.x_cnt): # layer length + + if i % 2 == 0: + x_pos = j * (self.b_length+1) + rotation = m.radians(10) + else: + x_pos = j * (self.b_length+1) + (self.b_length/2)-1 + rotation = m.radians(-10) + + z_pos = i * (self.b_height) + + origin = rg.Point3d(x_pos, 0, z_pos) + plane = rg.Plane(origin, rg.Vector3d.XAxis, rg.Vector3d.YAxis) + plane.Rotate(rotation, rg.Vector3d.ZAxis) + brick_planes.append(plane) + + return brick_planes + + def geometric_model(self): + """Generates a 3D model of the wall + + Returns + ---------- + geo : [Rhino Geometry Surface, Rhino Geometry Surface, ...] + + """ + + planes = [] + geo = [] + + for plane in self.brick_possitions(): + myBrick = Brick(plane) + planes.append(myBrick.base_plane()) + # geo.extend(myBrick.surface()) + + geo.append(myBrick.mesh()) + + visualizeFabrication = Fabrication( + brick_planes=self.brick_possitions()) + visualizeFabrication.procedure(transform=False) + robot_matrix = visualizeFabrication.robot_transformation() + + print(robot_matrix) + + return geo, visualizeFabrication.visualize(), robot_matrix + + def fabrication_model(self): + """Generates all the data necessary for the robotic fabrication + process and sends the comands to the robot + + Returns script + ---------- + script : "UR script" + """ + + myFabrication = Fabrication(brick_planes=self.brick_possitions()) + + myFabrication.procedure() + script = myFabrication.send() + + return script, myFabrication.visualize() diff --git a/lecture_06/assignment_05/Guillaume Jami/simple_comm.py b/lecture_06/assignment_05/Guillaume Jami/simple_comm.py new file mode 100644 index 0000000..0b66f4d --- /dev/null +++ b/lecture_06/assignment_05/Guillaume Jami/simple_comm.py @@ -0,0 +1,136 @@ +import socket +from struct import * + +def concatenate_script(list_ur_commands): + """ + Internal function that concatenates generated UR script into one large script file. Usually used to combine + scripts generated by the GrasshopperPython components + + Args: + list_ur_commands: A list of formatted UR Script strings + + Returns: + ur_script: The concatenated script + """ + + ur_script = "\ndef my_script():\n" + #ur_script += '\tpopup("running my_script")\n' + + combined_script = "" + for ur_cmd in list_ur_commands: + combined_script += ur_cmd + + #format combined script + lines = combined_script.split("\n") + for l in lines: + ur_script += "\t" + l + "\n" + + ur_script += 'end\n' + ur_script += '\nmy_script()\n' + return ur_script + +def send_script(script_to_send,robot_ip): + """ + Opens a socket to the Robot and sends a script + + Args: + script_to_send: Script to send to socket + robot_id: Integer. ID of robot + + """ + + '''Function that opens a socket connection to the robot''' + PORT = 30002 + HOST = robot_ip + + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.settimeout(2) + try: + s.connect((HOST, PORT)) + except: + print ("Cannot connect to ",HOST,PORT) + + s.settimeout(None) + max_size= 2<<18 + n=len(script_to_send) + if n>max_size: + raise Exception("Program too long") + + try: + s.send(script_to_send) + except: + print("failed to send") + s.close() + +def listen_to_robot(robot_ip): + PORT = 30003 + HOST = robot_ip + # Create dictionary to store data + chunks={} + chunks["target_joints"] = [] + chunks["actual_joints"]= [] + chunks["forces"] = [] + chunks["pose"] = [] + chunks["time"] = [0] + + data = read(HOST, PORT) + get_messages(data, chunks) + return chunks + +def read(HOST, PORT): + """ + Method that opens a TCP socket to the robot, receives data from the robot server and then closes socket + + Returns: + data: Data broadcast by the robot. In bytes + """ + + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.settimeout(1) + try: + s.connect((HOST, PORT)) + print "connected" + except: + traceback.print_exc() + print "Cannot connect to ",HOST,PORT + s.settimeout(None) + data = s.recv(1024) + s.close() + return data + +def get_messages(bytes, chunks_info): + """ + Function parses data stream and selects the following information: + 1) q_target + 2) q_actual + 3) TCP force + 4) Tool Vector + 5) Time + + This data is formatted and the chunks dictionary is updated + for more info see: http://wiki03.lynero.net/Technical/RealTimeClientInterface + """ + + + # get messages + q_target = bytes[12:60] + q_actual = bytes[252:300] + tcp_force = bytes[540:588] + tool_vector = bytes[588:636] + controller_time = bytes[740:748] + + # format type: int, + fmt_double6 = "!dddddd" + fmt_double1 = "!d" + + #Unpack selected data + target_joints = unpack(fmt_double6,q_target) + chunks_info["target_joints"]= (math.degrees(j) for j in target_joints) + actual_joints = unpack(fmt_double6,q_actual) + chunks_info["actual_joints"]= (math.degrees(j) for j in actual_joints) + forces = unpack(fmt_double6,tcp_force) + chunks_info["forces"]= forces + pose = unpack(fmt_double6,tool_vector) + chunks_info["pose"]= pose + time = unpack(fmt_double1,controller_time) + chunks_info["time"]= time diff --git a/lecture_06/assignment_05/Guillaume Jami/simple_ur_script.py b/lecture_06/assignment_05/Guillaume Jami/simple_ur_script.py new file mode 100644 index 0000000..8cb4612 --- /dev/null +++ b/lecture_06/assignment_05/Guillaume Jami/simple_ur_script.py @@ -0,0 +1,193 @@ +""" +This module wraps standard UR Script functions. +Main change is that plane infromation substitute for pose data +""" + +import utils +import Rhino.Geometry as rg + +# Some Constants +MAX_ACCEL = 1.5 +MAX_VELOCITY = 2 + + +def move_l(plane_to, accel, vel): + """ + Function that returns UR script for linear movement in tool-space. + + Args: + plane_to: Rhino.Geometry Plane. A target plane for calculating pose (in UR base coordinate system) + accel: tool accel in m/s^2 + vel: tool speed in m/s + + Returns: + script: UR script + """ + + # Check acceleration and velocity are non-negative and below a set limit + accel = MAX_ACCEL if (abs(accel) >MAX_ACCEL) else abs(accel) + vel = MAX_VELOCITY if (abs(vel) > MAX_VELOCITY) else abs(vel) + + _matrix = rg.Transform.PlaneToPlane(rg.Plane.WorldXY,plane_to) + _axis_angle= utils.matrix_to_axis_angle(_matrix) + # Create pose data + _pose = [plane_to.OriginX/1000, plane_to.OriginY/1000, plane_to.OriginZ/1000,_axis_angle[0], _axis_angle[1], _axis_angle[2]] + _pose_fmt = "p[" + ("%.4f,"*6)[:-1]+"]" + _pose_fmt = _pose_fmt%tuple(_pose) + # Format UR script + script = "movel(%s, a = %.2f, v = %.2f)\n"%(_pose_fmt,accel,vel) + return script + + +def move_l_blend(plane_to, accel, vel, blend_radius = 0): + """ + Function that returns UR script for linear movement in tool-space. + + Args: + plane_to: Rhino.Geometry Plane. A target plane for calculating pose (in UR base coordinate system) + accel: tool accel in m/s^2 + vel: tool speed in m/s + + Returns: + script: UR script + """ + + # Check acceleration and velocity are non-negative and below a set limit + accel = MAX_ACCEL if (abs(accel) >MAX_ACCEL) else abs(accel) + vel = MAX_VELOCITY if (abs(vel) > MAX_VELOCITY) else abs(vel) + # Check blend radius is positive + blend_radius = max(0, blend_radius) + + _matrix = rg.Transform.PlaneToPlane(rg.Plane.WorldXY,plane_to) + _axis_angle= utils.matrix_to_axis_angle(_matrix) + # Create pose data + _pose = [plane_to.OriginX/1000, plane_to.OriginY/1000, plane_to.OriginZ/1000,_axis_angle[0], _axis_angle[1], _axis_angle[2]] + _pose_fmt = "p[" + ("%.4f,"*6)[:-1]+"]" + _pose_fmt = _pose_fmt%tuple(_pose) + # Format UR script + script = "movel(%s, a = %.2f, v = %.2f, r = %.4f)\n"%(_pose_fmt, accel, vel, blend_radius) + return script + +def move_j(joints, accel, vel): + """ + Function that returns UR script for linear movement in joint space. + + Args: + joints: A list of 6 joint angles (double). + accel: tool accel in m/s^2 + accel: tool accel in m/s^2 + vel: tool speed in m/s + + Returns: + script: UR script + """ + # Check acceleration and velocity are non-negative and below a set limit + + _j_fmt = "[" + ("%.2f,"*6)[:-1]+"]" + _j_fmt = _j_fmt%tuple(joints) + script = "movej(%s, a = %.2f, v = %.2f)\n"%(_j_fmt,accel,vel) + return script + +def set_tcp_by_plane(x_offset, y_offset, z_offset, ref_plane=rg.Plane.WorldXY): + """ + TODO: Need to test if this gives the correct result + Function that returns UR script for setting tool center point + + Args: + x_offset: float. tooltip offset in mm + y_offset: float. tooltip offset in mm + z_offset: float. tooltip offset in mm + ref_plane: Plane that defines orientation of the tip. If none specified, world XY plane used as default. (in UR base coordinate system) + + Returns: + script: UR script + """ + + if (ref_plane != rg.Plane.WorldXY): + _matrix = rg.Transform.PlaneToPlane(rg.Plane.WorldXY,ref_plane) + _axis_angle= utils.matrix_to_axis_angle(_matrix) + else: + _axis_angle = rg.Vector3d(0,0,0) + # Create pose data + _pose = [x_offset/1000, y_offset/1000, z_offset/1000,_axis_angle[0], _axis_angle[1], _axis_angle[2]] + _pose_fmt = "p[" + ("%.4f,"*6)[:-1]+"]" + _pose_fmt = _pose_fmt%tuple(_pose) + + # Format UR script + script = "set_tcp(%s)\n"%(_pose_fmt) + return script + +def set_tcp_by_angles(x_offset, y_offset, z_offset, x_rotate, y_rotate, z_rotate): + """ + Function that returns UR script for setting tool center point + + Args: + x_offset: float. tooltip offset in mm + y_offset: float. tooltip offset in mm + z_offset: float. tooltip offset in mm + x_rotation: float. rotation around world x axis in radians + y_rotation: float. rotation around world y axis in radians + z_rotation: float. rotation around world z axis in radians + + Returns: + script: UR script + """ + + #Create rotation matrix + _rX = rg.Transform.Rotation(x_rotate, rg.Vector3d(1,0,0), rg.Point3d(0,0,0)) + _rY = rg.Transform.Rotation(y_rotate, rg.Vector3d(0,1,0), rg.Point3d(0,0,0)) + _rZ = rg.Transform.Rotation(z_rotate, rg.Vector3d(0,0,1), rg.Point3d(0,0,0)) + _r = _rX * _rY * _rZ + _axis_angle= utils.matrix_to_axis_angle(_r) + + # Create pose data + _pose = [x_offset/1000, y_offset/1000, z_offset/1000,_axis_angle[0], _axis_angle[1], _axis_angle[2]] + _pose_fmt = "p[" + ("%.4f,"*6)[:-1]+"]" + _pose_fmt = _pose_fmt%tuple(_pose) + + # Format UR script + script = "set_tcp(%s)\n"%(_pose_fmt) + return script + +def popup(message, title): + """ + Function that returns UR script for popup + + Args: + message: float. tooltip offset in mm + title: float. tooltip offset in mm + + Returns: + script: UR script + """ + script = 'popup("%s","%s") \n' %(message,title) + return script + +def sleep(time): + """ + Function that returns UR script for sleep() + + Args: + time: float.in s + + Returns: + script: UR script + """ + script = "sleep(%s) \n" %(time) + return script + +def set_digital_out(id, signal): + """ + Function that returns UR script for setting digital out + + Args: + id: int. Input id number + signal: boolean. signal level - on or off + + Returns: + script: UR script + """ + + # Format UR script + script = "set_digital_out(%s,%s)\n"%(id,signal) + return script diff --git a/lecture_06/assignment_05/Guillaume Jami/utils.py b/lecture_06/assignment_05/Guillaume Jami/utils.py new file mode 100644 index 0000000..1156739 --- /dev/null +++ b/lecture_06/assignment_05/Guillaume Jami/utils.py @@ -0,0 +1,236 @@ +""" +This module contains utility functions: + 1) Transformation functions + 2) Useful geometry functions e.g. Intersections +""" + +import Rhino.Geometry as rg +import math + +# ----- Coordinate System conversions ----- + +def rhino_to_robotbase(ref_plane, model_base): + """ + Function that transforms a reference plane from Rhino coordinate system to the robot's base coordinate system + TODO (Jason): maybe change this whole method? maybe not model but robot base + + Args: + ref_plane: Rhino.Geometry plane object. The reference plane to transform + model_base: Rhino.Geometry plane object. The base plane for building on. Given in robot's base coordinate system. + + Returns: + ref_plane: Reference plane transformed to robot space + """ + + # Transform the orientation plane based on model_base coordinate system + _matrix = rg.Transform.PlaneToPlane(rg.Plane.WorldXY,model_base) + #_matrix = rg.Transform.PlaneToPlane(model_base,rg.Plane.WorldXY,) + ref_plane.Transform(_matrix) + return ref_plane + +def matrix_to_axis_angle(m): + """ + Function that transforms a 4x4 matrix to axis-angle format + referenced from Martin Baker's www.euclideanspace.com + + Args: + m: Rhino.Geometry Transform structure - 4x4 matrix + + Returns: + axis: Rhino.Geometry Vector3d object - axis-angle notation + """ + + epsilon = 0.01 + epsilon2 = 0.01 + + if (math.fabs(m.M01 - m.M10) < epsilon) & (math.fabs(m.M02 - m.M20) < epsilon) & (math.fabs(m.M12 - m.M21) < epsilon): + #singularity found + #first check for identity matrix which must have +1 for all terms + #in leading diagonal and zero in other terms + if (math.fabs(m.M01 + m.M10) < epsilon2) & (math.fabs(m.M02 + m.M20) < epsilon2) & (math.fabs(m.M12 + m.M21) < epsilon2) & (math.fabs(m.M00 + m.M11 + m.M22 - 3) < epsilon2): + #this singularity is identity matrix so angle = 0 make zero angle, arbitrary axis + angle = 0 + x = 1 + y = z = 0 + else: + # otherwise this singularity is angle = 180 + angle = math.pi; + xx = (m.M00 + 1) / 2 + yy = (m.M11 + 1) / 2 + zz = (m.M22 + 1) / 2 + xy = (m.M01 + m.M10) / 4 + xz = (m.M02 + m.M20) / 4 + yz = (m.M12 + m.M21) / 4 + if ((xx > yy) & (xx > zz)): + # m.M00 is the largest diagonal term + if (xx < epsilon): + x = 0 + y = z = 0.7071 + else: + x = math.sqrt(xx) + y = xy / x + z = xz / x + elif (yy > zz): + # m.M11 is the largest diagonal term + if (yy < epsilon): + x = z = 0.7071 + y = 0 + else: + y = math.sqrt(yy) + x = xy / y + z = yz / y + else: + # m.M22 is the largest diagonal term so base result on this + if (zz < epsilon): + x = y = 0.7071 + z = 0 + else: + z = math.sqrt(zz) + x = xz / z + y = yz / z + else: + s = math.sqrt((m.M21 - m.M12) * (m.M21 - m.M12)+ (m.M02 - m.M20) * (m.M02 - m.M20)+ (m.M10 - m.M01) * (m.M10 - m.M01)); # used to normalise + if (math.fabs(s) < 0.001): + #prevent divide by zero, should not happen if matrix is orthogonal and should be + s = 1 + angle = math.acos((m.M00 + m.M11 + m.M22 - 1) / 2) + x = (m.M21 - m.M12) / s + y = (m.M02 - m.M20) / s + z = (m.M10 - m.M01) / s + angleRad = angle + axis = rg.Vector3d(x,y,z) + axis = axis*angleRad + + return axis + +def matrix_to_euler(m): + """ + Gets the Euler rotation angles from a transformation matrix + from http://forums.codeguru.com/archive/index.php/t-329530.html + + Args: + m = Transform object + Returns: + tuple of euler angles in radians + """ + + rotz = math.atan2(m.M10, m.M00) + roty = -math.asin(m.M20) + rotx = math.atan2(m.M21, m.M22) + return (rotx, roty, rotz) + +# ----- Matrix related helper functions + +def dh_matrix((d, theta, a, alpha)): + """ + This function creates the Denavit Hartenberg transformation matrix between adjacent frames + + Arguments: + d: Joint distance. in mm + theta: joint angle. in radians + a: link length. in mm + alpha: twist angle. in radians + + Returns: + m: Denavit Hartenberg transformation matrix + """ + + _matrix = [ + (math.cos(theta), -math.sin(theta) * math.cos(alpha),math.sin(theta) * math.sin(alpha),a * math.cos(theta)), + (math.sin(theta), math.cos(theta) * math.cos(alpha), -math.cos(theta) * math.sin(alpha), a * math.sin(theta)), + (0, math.sin(alpha),math.cos(alpha),d), + (0,0,0,1) + ] + + m = rg.Transform() + for i in range(4): + for j in range(4): + m[i,j] = _matrix[i][j] + + return m + +def concatenate_matrices(matrices): + """ + This function creates a concatenated matrix from a list of matrices + + Arguments: + matrices: A list of tranformation matrices + + Returns: + _transform: Concatenated matrix + """ + _transform = matrices[0] + for i in range(1,len(matrices)): + _transform *= matrices[i] + return _transform + + +# ----- Miscellaneous geometry helper functions +def signed_angle(v1,v2,v_normal): + """ + This function gets the angle between 2 vectors -pi < theta< pi + + Arguments: + v1: Vector3d. First unitized vector + v2: Vector3d. Second unitized vector + v_normal: Vector3d. Normal to 2 vectors that determines what is positive/negative + + Returns: + theta: float. signed angle between -pi and pi + """ + # from 0 to pi + c = rg.Vector3d.Multiply(v1,v2) + n = rg.Vector3d.CrossProduct(v1,v2) + s= n.Length + + theta = math.atan2(s,c) + + if (rg.Vector3d.Multiply(n, v_normal) < 0): + theta *= -1 + return theta + +def cir_cir_intersection(cir1,cir2): + """ + Funtion that returns the intersection points between two circles + + Arguments: + 1) cir1: First circle + 2) cir2: Second Circle + + Returns: + xpts: list of 2 Point3d objectts + + Note that there is no error checking + """ + r1 = cir1.Radius + r2 = cir2.Radius + d = cir1.Center.DistanceTo(cir2.Center) + + a = (r1 **2 - r2**2 + d**2)/(2*d) + h = math.sqrt(r1 **2 - a **2 ) + + v_c1 = rg.Vector3d(cir1.Center) + v_c2 = rg.Vector3d(cir2.Center) + + v_c1c2 = v_c2 - v_c1 + v_c1c2.Unitize() + v_c1c2 *= a + + v_pt0 = v_c1 + v_c1c2 + + v_pt0ptX = rg.Vector3d.CrossProduct(cir1.Normal,v_c1c2) + v_pt0ptX.Unitize() + v_pt0ptX *= h + + xpt1 = rg.Point3d(v_pt0 + v_pt0ptX) + v_pt0ptX.Reverse() + xpt2 = rg.Point3d(v_pt0 + v_pt0ptX) + + return [xpt1,xpt2] + +def check_arguments(function): + def decorated(*args): + if None in args: + raise TypeError("Invalid Argument") + return function(*args) + return decorated diff --git a/lecture_06/assignment_05/Guillaume Jami/vacuum_gripper.stl b/lecture_06/assignment_05/Guillaume Jami/vacuum_gripper.stl new file mode 100644 index 0000000..4fbbb2e Binary files /dev/null and b/lecture_06/assignment_05/Guillaume Jami/vacuum_gripper.stl differ