diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..dd4c951 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..db8786c --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..f4341c8 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/rigacar.iml b/.idea/rigacar.iml new file mode 100644 index 0000000..8b8c395 --- /dev/null +++ b/.idea/rigacar.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md index 2c310d9..a0b25ab 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ +# Rigacar + +## Fork + +_This fork supports **Blender 4.0+** and consolidates fixes from the community while the maintainer is absent._ + +Upstream readme description below. + +## Upstream + Rigacar is a free addon for Blender. It is designed to fulfill the following goals: * generate a complete rig as quickly as possible (actually few seconds) for standard car models @@ -6,6 +16,6 @@ Rigacar is a free addon for Blender. It is designed to fulfill the following goa Please read [full documentation](http://digicreatures.net/articles/rigacar.html) on my website. -You can also watch the series of videotutorials: +You can also watch the series of video tutorials: -[![Rigacar Part 1](http://img.youtube.com/vi/D3XQxA_-TzY/0.jpg)](https://www.youtube.com/watch?v=D3XQxA_-TzY&list=PLH_mmrv8SfPFiEj93RJt3sBvHCnipI9qK "Rigacar videotutorials") +[![Rigacar Part 1](http://img.youtube.com/vi/D3XQxA_-TzY/0.jpg)](https://www.youtube.com/watch?v=D3XQxA_-TzY&list=PLH_mmrv8SfPFiEj93RJt3sBvHCnipI9qK "Rigacar video tutorials") diff --git a/__init__.py b/__init__.py index afa2475..7865ec8 100644 --- a/__init__.py +++ b/__init__.py @@ -21,17 +21,18 @@ bl_info = { "name": "Rigacar (Generates Car Rig)", "author": "David Gayerie", - "version": (7, 1), - "blender": (2, 83, 0), + "version": (8, 0), + "blender": (4, 0, 0), "location": "View3D > Add > Armature", "description": "Adds a deformation rig for vehicules, generates animation rig and bake wheels animation.", "wiki_url": "http://digicreatures.net/articles/rigacar.html", "tracker_url": "https://github.com/digicreatures/rigacar/issues", - "category": "Rigging"} - + "category": "Rigging" +} if "bpy" in locals(): import importlib + if "bake_operators" in locals(): importlib.reload(bake_operators) if "car_rig" in locals(): @@ -188,15 +189,16 @@ def draw(self, context): def menu_entries(menu, context): - menu.layout.operator(car_rig.OBJECT_OT_armatureCarDeformationRig.bl_idname, text="Car (deformation rig)", icon='AUTO') + menu.layout.operator(car_rig.OBJECT_OT_armatureCarDeformationRig.bl_idname, text="Car (deformation rig)", + icon='AUTO') classes = ( - RIGACAR_PT_rigProperties, - RIGACAR_PT_groundSensorsProperties, - RIGACAR_PT_animationRigView, - RIGACAR_PT_wheelsAnimationView, - RIGACAR_PT_groundSensorsView, + RIGACAR_PT_rigProperties, + RIGACAR_PT_groundSensorsProperties, + RIGACAR_PT_animationRigView, + RIGACAR_PT_wheelsAnimationView, + RIGACAR_PT_groundSensorsView, ) diff --git a/bake_operators.py b/bake_operators.py index 65fed30..2276e76 100644 --- a/bake_operators.py +++ b/bake_operators.py @@ -19,6 +19,7 @@ # import bpy +import bpy_extras.anim_utils import mathutils import math import itertools @@ -33,7 +34,9 @@ def wrapper(self, context, *args, **kwargs): return func(self, context, *args, **kwargs) finally: context.window.cursor_modal_restore() + return wrapper + return cursor_decorator @@ -135,7 +138,7 @@ def evaluate(self, f): def fix_old_steering_rotation(rig_object): """ - Fix armature generated with rigacar version < 6.0 + Fix armature generated with Rigacar version < 6.0 """ if rig_object.pose and rig_object.pose.bones: if 'MCH-Steering.rotation' in rig_object.pose.bones: @@ -194,7 +197,8 @@ def _create_scale_evaluator(self, action, source_bone): def _bake_action(self, context, *source_bones): action = context.object.animation_data.action - nla_tweak_mode = context.object.animation_data.use_tweak_mode if hasattr(context.object.animation_data, 'use_tweak_mode') else False + nla_tweak_mode = context.object.animation_data.use_tweak_mode if hasattr(context.object.animation_data, + 'use_tweak_mode') else False # saving context selected_bones = [b for b in context.object.data.bones if b.select] @@ -208,14 +212,15 @@ def _bake_action(self, context, *source_bones): source_bones_matrix_basis.append(context.object.pose.bones[source_bone.name].matrix_basis.copy()) source_bone.select = True - # Blender 2.81 : Another hack for another bug in the bake operator - # removing from the selection objects which are not the current one - for obj in context.selected_objects: - if obj is not context.object: - obj.select_set(state=False) - - bpy.ops.nla.bake(frame_start=self.frame_start, frame_end=self.frame_end, only_selected=True, bake_types={'POSE'}, visual_keying=True) - baked_action = context.object.animation_data.action + baked_action = bpy_extras.anim_utils.bake_action( + context.object, + action=None, + frames=range(self.frame_start, self.frame_end + 1), + only_selected=True, + do_pose=True, + do_object=False, + do_visual_keying=True, + ) # restoring context for source_bone, matrix_basis in zip(source_bones, source_bones_matrix_basis): @@ -262,6 +267,10 @@ def _bake_wheels_rotation(self, context): bones = set(wheel_bones + brake_bones) baked_action = self._bake_action(context, *bones) + if baked_action is None: + self.report({'WARNING'}, "Existing action failed to bake. Won't bake wheel rotation") + return + try: for wheel_bone, brake_bone in zip(wheel_bones, brake_bones): self._bake_wheel_rotation(context, baked_action, wheel_bone, brake_bone) @@ -302,6 +311,10 @@ def _evaluate_distance_per_frame(self, action, bone, brake_bone): def _bake_wheel_rotation(self, context, baked_action, bone, brake_bone): fc_rot = create_property_animation(context, bone.name.replace('MCH-', '')) + # Reset the transform of the wheel bone, otherwise baking yields wrong results + pb: bpy.types.PoseBone = context.object.pose.bones[bone.name] + pb.matrix_basis.identity() + for f, distance in self._evaluate_distance_per_frame(baked_action, bone, brake_bone): kf = fc_rot.keyframe_points.insert(f, distance) kf.interpolation = 'LINEAR' @@ -362,10 +375,12 @@ def _evaluate_rotation_per_frame(self, action, bone_offset, bone): length_ratio = bone_offset * self.rotation_factor / projected_steering_direction steering_direction_vector *= length_ratio - steering_position = mathutils.geometry.distance_point_to_plane(steering_direction_vector, world_space_bone_direction_vector, world_space_bone_normal_vector) + steering_position = mathutils.geometry.distance_point_to_plane(steering_direction_vector, + world_space_bone_direction_vector, + world_space_bone_normal_vector) if previous_steering_position is not None \ - and abs(steering_position - previous_steering_position) < steering_threshold: + and abs(steering_position - previous_steering_position) < steering_threshold: continue yield f, steering_position @@ -377,15 +392,24 @@ def _bake_steering_rotation(self, context, bone_offset, bone): clear_property_animation(context, 'Steering.rotation') fix_old_steering_rotation(context.object) fc_rot = create_property_animation(context, 'Steering.rotation') - action = self._bake_action(context, bone) + + baked_action = self._bake_action(context, bone) + if baked_action is None: + self.report({'WARNING'}, "Existing action failed to bake. Won't bake steering rotation") + return try: - for f, steering_pos in self._evaluate_rotation_per_frame(action, bone_offset, bone): + # Reset the transform of the steering bone, because baking action manipulates the transform + # and evaluate_rotation_frame expects it at it's default position + pb: bpy.types.PoseBone = context.object.pose.bones[bone.name] + pb.matrix_basis.identity() + + for f, steering_pos in self._evaluate_rotation_per_frame(baked_action, bone_offset, bone): kf = fc_rot.keyframe_points.insert(f, steering_pos) kf.type = 'JITTER' kf.interpolation = 'LINEAR' finally: - bpy.data.actions.remove(action) + bpy.data.actions.remove(baked_action) class ANIM_OT_carClearSteeringWheelsRotation(bpy.types.Operator): @@ -394,8 +418,10 @@ class ANIM_OT_carClearSteeringWheelsRotation(bpy.types.Operator): bl_description = "Clear generated rotation for steering and wheels" bl_options = {'REGISTER', 'UNDO'} - clear_steering: bpy.props.BoolProperty(name="Steering", description="Clear generated animation for steering", default=True) - clear_wheels: bpy.props.BoolProperty(name="Wheels", description="Clear generated animation for wheels", default=True) + clear_steering: bpy.props.BoolProperty(name="Steering", description="Clear generated animation for steering", + default=True) + clear_wheels: bpy.props.BoolProperty(name="Wheels", description="Clear generated animation for wheels", + default=True) def draw(self, context): self.layout.use_property_decorate = False diff --git a/car_rig.py b/car_rig.py index 910ad0d..1feb833 100644 --- a/car_rig.py +++ b/car_rig.py @@ -26,10 +26,11 @@ from math import inf from rna_prop_ui import rna_idprop_ui_create -CUSTOM_SHAPE_LAYER = 13 -MCH_BONE_EXTENSION_LAYER = 14 -DEF_BONE_LAYER = 15 -MCH_BONE_LAYER = 31 +DEFAULT_VISIBLE_LAYER = 'CarRig_Default_Ctrls' # New Setting for Blender4.0 +CUSTOM_SHAPE_LAYER = 'CarRig_Custom_Ctrls' # 13 +MCH_BONE_EXTENSION_LAYER = 'CarRig_MCH_Bone_Ext' # 14 +DEF_BONE_LAYER = 'CarRig_Def_Bone' # 15 +MCH_BONE_LAYER = 'CarRig_MCH_Bone' # 31 def deselect_edit_bones(ob): @@ -88,12 +89,11 @@ def create_translation_x_driver(ob, bone, driver_data_path): def create_bone_group(pose, group_name, color_set, bone_names): - group = pose.bone_groups.new(name=group_name) - group.color_set = color_set + # Here Only set color for bone_name in bone_names: bone = pose.bones.get(bone_name) if bone is not None: - bone.bone_group = group + bone.color.palette = color_set def name_range(prefix, nb=1000): @@ -113,38 +113,52 @@ def get_widget(name): def define_custom_property(target, name, value, description=None, overridable=True): - rna_idprop_ui_create(target, name, default=value, description=description, overridable=overridable, min=-inf, max=inf) + rna_idprop_ui_create(target, name, default=value, description=description, overridable=overridable, min=-inf, + max=inf) def dispatch_bones_to_armature_layers(ob): + '''Bone Collections were introduced in Blender 4.0 as replacement of Armature Layers and Bone Groups.''' + amt = bpy.context.object.data + default_visible_layer = amt.collections.new(name=DEFAULT_VISIBLE_LAYER) + custom_shape_layer = amt.collections.new(name=CUSTOM_SHAPE_LAYER) # 13 + def_bone_layer = amt.collections.new(name=DEF_BONE_LAYER) # 15 + mch_bone_layer = amt.collections.new(name=MCH_BONE_LAYER) # 31 + mch_bone_extension_layer = amt.collections.new(name=MCH_BONE_EXTENSION_LAYER) # 14 + + # set visibility + custom_shape_layer.is_visible = False + def_bone_layer.is_visible = False + mch_bone_extension_layer.is_visible = False + mch_bone_layer.is_visible = False + + # get MCH bone re_mch_bone = re.compile(r'^MCH-Wheel(Brake)?\.(Ft|Bk)\.[LR](\.\d+)?$') - default_visible_layers = [False] * 32 for b in ob.data.bones: - layers = [False] * 32 if b.name.startswith('DEF-'): - layers[DEF_BONE_LAYER] = True + def_bone_layer.assign(b) elif b.name.startswith('MCH-'): - layers[MCH_BONE_LAYER] = True + mch_bone_layer.assign(b) if b.name in ('MCH-Body', 'MCH-Steering') or re_mch_bone.match(b.name): - layers[MCH_BONE_EXTENSION_LAYER] = True + mch_bone_extension_layer.assign(b) else: - layer_num = ob.pose.bones[b.name].bone_group_index - layers[layer_num] = True - default_visible_layers[layer_num] = True - b.layers = layers + default_visible_layer.assign(b) + pass - ob.data.layers = default_visible_layers - - shape_bone_layers = [False] * 32 - shape_bone_layers[CUSTOM_SHAPE_LAYER] = True for b in ob.pose.bones: if b.custom_shape: if b.custom_shape_transform: ob.pose.bones[b.custom_shape_transform.name].custom_shape = b.custom_shape - ob.data.bones[b.custom_shape_transform.name].layers = shape_bone_layers + custom_shape_layer.assign(ob.pose.bones[b.custom_shape_transform.name]) + # ob.data.bones[b.custom_shape_transform.name].layers = shape_bone_layers else: - ob.data.bones[b.name].layers[CUSTOM_SHAPE_LAYER] = True + default_visible_layer.assign(ob.data.bones[b.name]) + # ob.data.bones[b.name].layers[CUSTOM_SHAPE_LAYER] = True + + # Remove custom shape from default layer + for bone in custom_shape_layer.bones: + default_visible_layer.unassign(bone) class NameSuffix(object): @@ -184,7 +198,8 @@ def __init__(self, armature, bone_name): bone = armature.data.bones[bone_name] self.__center = bone.head.copy() if not objs: - self.__xyz = [bone.head.x - bone.length / 2, bone.head.x + bone.length / 2, bone.head.y - bone.length, bone.head.y + bone.length, .0, bone.head.z * 2] + self.__xyz = [bone.head.x - bone.length / 2, bone.head.x + bone.length / 2, bone.head.y - bone.length, + bone.head.y + bone.length, .0, bone.head.z * 2] else: self.__xyz = [inf, -inf, inf, -inf, inf, -inf] self.__compute(mathutils.Matrix(), *objs) @@ -270,7 +285,8 @@ def __init__(self, armature, position, side_position, default): self.position = position self.side_position = side_position self.wheels = [] - wheel_bones = (armature.data.edit_bones.get(name) for name in name_range('DEF-Wheel.%s.%s' % (self.position, self.side_position))) + wheel_bones = (armature.data.edit_bones.get(name) for name in + name_range('DEF-Wheel.%s.%s' % (self.position, self.side_position))) for wheel_bone in wheel_bones: if wheel_bone is None: break @@ -354,7 +370,8 @@ def car_center(self): @property def width(self): - return max([self.bb_body.width] + [abs(w.compute_outer_x() - self.bb_body.center.x) * 2 for w in self.wheels_dimensions]) + return max([self.bb_body.width] + [abs(w.compute_outer_x() - self.bb_body.center.x) * 2 for w in + self.wheels_dimensions]) @property def height(self): @@ -418,7 +435,8 @@ def nb_back_wheels(self): @property def wheels_dimensions(self): - return filter(lambda w: w.nb, (self.wheels_front_left, self.wheels_front_right, self.wheels_back_left, self.wheels_back_right)) + return filter(lambda w: w.nb, + (self.wheels_front_left, self.wheels_front_right, self.wheels_back_left, self.wheels_back_right)) def create_wheel_brake_bone(wheel_brake, parent_bone, wheel_bone): @@ -435,8 +453,12 @@ def generate_constraint_on_wheel_brake_bone(wheel_brake_pose_bone, wheel_pose_bo wheel_brake_pose_bone.lock_scale = (True, False, False) wheel_brake_pose_bone.custom_shape = get_widget('WGT-CarRig.WheelBrake') wheel_brake_pose_bone.bone.show_wire = True - wheel_brake_pose_bone.bone_group = wheel_pose_bone.bone_group - wheel_brake_pose_bone.bone.layers = wheel_pose_bone.bone.layers + amt = bpy.context.object.data + groups = amt.collections + for group in groups: + for bone in group.bones: + if bone.name == wheel_pose_bone.anme: + group.assign(wheel_brake_pose_bone) cns = wheel_brake_pose_bone.constraints.new('LIMIT_SCALE') cns.name = 'Brakes' @@ -677,7 +699,8 @@ def generate_animation_wheel_bones(self, name_suffix, wheel_bounding_box, parent ground_sensor.head = wheel_bounding_box.box_center ground_sensor.head.z = def_wheel_bone.head.z ground_sensor.tail = ground_sensor.head - ground_sensor.tail.y += max(max(wheel_bounding_box.height, ground_sensor.head.z) / 2.5, wheel_bounding_box.width * 1.02) + ground_sensor.tail.y += max(max(wheel_bounding_box.height, ground_sensor.head.z) / 2.5, + wheel_bounding_box.width * 1.02) ground_sensor.use_deform = False ground_sensor.parent = parent_bone @@ -795,7 +818,8 @@ def generate_constraints_on_rig(self): cns.to_max_y_rot = math.radians(-180) cns.owner_space = 'LOCAL' cns.target_space = 'LOCAL' - create_constraint_influence_driver(self.ob, cns, '["suspension_rolling_factor"]', base_influence=influence) + create_constraint_influence_driver(self.ob, cns, '["suspension_rolling_factor"]', + base_influence=influence) root = pose.bones['Root'] root.lock_scale = (True, True, True) @@ -804,19 +828,19 @@ def generate_constraints_on_rig(self): root.bone.show_wire = True for ground_sensor_axle_name in ('GroundSensor.Axle.Ft', 'GroundSensor.Axle.Bk'): - groundsensor_axle = pose.bones.get(ground_sensor_axle_name) - if groundsensor_axle: - groundsensor_axle.lock_location = (True, True, False) - groundsensor_axle.lock_rotation = (True, True, True) - groundsensor_axle.lock_scale = (True, True, True) - groundsensor_axle.custom_shape = get_widget('WGT-CarRig.GroundSensor.Axle') - groundsensor_axle.lock_rotation_w = True - groundsensor_axle.custom_shape_transform = pose.bones['SHP-%s' % groundsensor_axle.name] - groundsensor_axle.bone.show_wire = True - self.generate_ground_projection_constraint(groundsensor_axle) - - if groundsensor_axle.name == 'GroundSensor.Axle.Ft' and 'GroundSensor.Axle.Bk' in pose.bones: - cns = groundsensor_axle.constraints.new('LIMIT_DISTANCE') + ground_sensor_axle = pose.bones.get(ground_sensor_axle_name) + if ground_sensor_axle: + ground_sensor_axle.lock_location = (True, True, False) + ground_sensor_axle.lock_rotation = (True, True, True) + ground_sensor_axle.lock_scale = (True, True, True) + ground_sensor_axle.custom_shape = get_widget('WGT-CarRig.GroundSensor.Axle') + ground_sensor_axle.lock_rotation_w = True + ground_sensor_axle.custom_shape_transform = pose.bones['SHP-%s' % ground_sensor_axle.name] + ground_sensor_axle.bone.show_wire = True + self.generate_ground_projection_constraint(ground_sensor_axle) + + if ground_sensor_axle.name == 'GroundSensor.Axle.Ft' and 'GroundSensor.Axle.Bk' in pose.bones: + cns = ground_sensor_axle.constraints.new('LIMIT_DISTANCE') cns.name = 'Limit distance from Root' cns.limit_mode = 'LIMITDIST_ONSURFACE' cns.target = self.ob @@ -878,7 +902,8 @@ def generate_constraints_on_rig(self): cns.owner_space = 'LOCAL' cns.target_space = 'LOCAL' - self.generate_childof_constraint(mch_steering_rotation, mch_root_axle_front if mch_root_axle_front else root) + self.generate_childof_constraint(mch_steering_rotation, + mch_root_axle_front if mch_root_axle_front else root) mch_steering = pose.bones['MCH-Steering'] cns = mch_steering.constraints.new('DAMPED_TRACK') @@ -1150,7 +1175,8 @@ def generate_constraints_on_wheel_damper(self, wheel_dimension): def generate_bone_groups(self): pose = self.ob.pose create_bone_group(pose, 'Direction', color_set='THEME04', bone_names=('Root', 'Drift', 'SHP-Root', 'SHP-Drift')) - create_bone_group(pose, 'Suspension', color_set='THEME09', bone_names=('Suspension', 'WheelDamper.Ft.L', 'WheelDamper.Ft.R', 'WheelDamper.Bk.L', 'WheelDamper.Bk.R')) + create_bone_group(pose, 'Suspension', color_set='THEME09', bone_names=( + 'Suspension', 'WheelDamper.Ft.L', 'WheelDamper.Ft.R', 'WheelDamper.Bk.L', 'WheelDamper.Bk.R')) wheel_widgets = ('Steering',) for wheel_dimension in self.dimension.wheels_dimensions: @@ -1158,7 +1184,8 @@ def generate_bone_groups(self): wheel_widgets += tuple(wheel_dimension.names('WheelBrake')) create_bone_group(pose, 'Wheel', color_set='THEME03', bone_names=wheel_widgets) - ground_sensor_names = ('GroundSensor.Axle.Ft', 'GroundSensor.Axle.Bk', 'SHP-GroundSensor.Axle.Ft', 'SHP-GroundSensor.Axle.Bk') + ground_sensor_names = ( + 'GroundSensor.Axle.Ft', 'GroundSensor.Axle.Bk', 'SHP-GroundSensor.Axle.Ft', 'SHP-GroundSensor.Axle.Bk') for wheel_dimension in self.dimension.wheels_dimensions: ground_sensor_names += tuple(wheel_dimension.names('GroundSensor')) ground_sensor_names += tuple("SHP-%s" % i for i in ground_sensor_names) @@ -1252,15 +1279,15 @@ def draw(self, context): def invoke(self, context, event): self.bones_position = { - 'Body': mathutils.Vector((0.0, 0, .8)), - 'Wheel.Ft.L': mathutils.Vector((0.9, -2, .5)), - 'Wheel.Ft.R': mathutils.Vector((-.9, -2, .5)), - 'Wheel.Bk.L': mathutils.Vector((0.9, 2, .5)), - 'Wheel.Bk.R': mathutils.Vector((-.9, 2, .5)), - 'WheelBrake.Ft.L': mathutils.Vector((0.8, -2, .5)), - 'WheelBrake.Ft.R': mathutils.Vector((-.8, -2, .5)), - 'WheelBrake.Bk.L': mathutils.Vector((0.8, 2, .5)), - 'WheelBrake.Bk.R': mathutils.Vector((-.8, 2, .5)) + 'Body': mathutils.Vector((0.0, 0, .8)), + 'Wheel.Ft.L': mathutils.Vector((0.9, -2, .5)), + 'Wheel.Ft.R': mathutils.Vector((-.9, -2, .5)), + 'Wheel.Bk.L': mathutils.Vector((0.9, 2, .5)), + 'Wheel.Bk.R': mathutils.Vector((-.9, 2, .5)), + 'WheelBrake.Ft.L': mathutils.Vector((0.8, -2, .5)), + 'WheelBrake.Ft.R': mathutils.Vector((-.8, -2, .5)), + 'WheelBrake.Bk.L': mathutils.Vector((0.8, 2, .5)), + 'WheelBrake.Bk.R': mathutils.Vector((-.8, 2, .5)) } self.target_objects_name = {} @@ -1316,24 +1343,29 @@ def execute(self, context): try: bpy.ops.object.mode_set(mode='EDIT') except TypeError: - self.report({'ERROR'}, "Cannot edit the new armature! Please make sure the active collection is visible and editable") + self.report({'ERROR'}, + "Cannot edit the new armature! Please make sure the active collection is visible and editable") return {'CANCELLED'} self._create_bone(rig, 'Body', delta_pos=self.body_pos_delta) self._create_wheel_bones(rig, 'Wheel.Ft.L', self.nb_front_wheels_pairs, self.front_wheel_pos_delta) - self._create_wheel_bones(rig, 'Wheel.Ft.R', self.nb_front_wheels_pairs, self.front_wheel_pos_delta.reflect(mathutils.Vector((1, 0, 0)))) + self._create_wheel_bones(rig, 'Wheel.Ft.R', self.nb_front_wheels_pairs, + self.front_wheel_pos_delta.reflect(mathutils.Vector((1, 0, 0)))) self._create_wheel_bones(rig, 'Wheel.Bk.L', self.nb_back_wheels_pairs, self.back_wheel_pos_delta) - self._create_wheel_bones(rig, 'Wheel.Bk.R', self.nb_back_wheels_pairs, self.back_wheel_pos_delta.reflect(mathutils.Vector((1, 0, 0)))) + self._create_wheel_bones(rig, 'Wheel.Bk.R', self.nb_back_wheels_pairs, + self.back_wheel_pos_delta.reflect(mathutils.Vector((1, 0, 0)))) front_wheel_brakes_delta_pos = self.front_wheel_pos_delta.copy() front_wheel_brakes_delta_pos.x = self.front_wheel_brakes_pos_delta self._create_wheel_bones(rig, 'WheelBrake.Ft.L', self.nb_front_wheel_brakes_pairs, front_wheel_brakes_delta_pos) - self._create_wheel_bones(rig, 'WheelBrake.Ft.R', self.nb_front_wheel_brakes_pairs, front_wheel_brakes_delta_pos.reflect(mathutils.Vector((1, 0, 0)))) + self._create_wheel_bones(rig, 'WheelBrake.Ft.R', self.nb_front_wheel_brakes_pairs, + front_wheel_brakes_delta_pos.reflect(mathutils.Vector((1, 0, 0)))) back_wheel_brakes_delta_pos = self.back_wheel_pos_delta.copy() back_wheel_brakes_delta_pos.x = self.back_wheel_brakes_pos_delta self._create_wheel_bones(rig, 'WheelBrake.Bk.L', self.nb_back_wheel_brakes_pairs, back_wheel_brakes_delta_pos) - self._create_wheel_bones(rig, 'WheelBrake.Bk.R', self.nb_back_wheel_brakes_pairs, back_wheel_brakes_delta_pos.reflect(mathutils.Vector((1, 0, 0)))) + self._create_wheel_bones(rig, 'WheelBrake.Bk.R', self.nb_back_wheel_brakes_pairs, + back_wheel_brakes_delta_pos.reflect(mathutils.Vector((1, 0, 0)))) deselect_edit_bones(rig) @@ -1356,7 +1388,8 @@ def _create_bone(self, rig, name, delta_pos): target_obj = bpy.context.scene.objects[target_obj_name] if name == 'Body': b.tail = b.head - b.tail.y += target_obj.dimensions[1] / 2 if target_obj.dimensions and target_obj.dimensions[0] != 0 else 1 + b.tail.y += target_obj.dimensions[1] / 2 if target_obj.dimensions and target_obj.dimensions[ + 0] != 0 else 1 target_obj.parent = rig target_obj.parent_bone = b.name target_obj.parent_type = 'BONE' @@ -1416,9 +1449,9 @@ class POSE_OT_carAnimationAddBrakeWheelBones(bpy.types.Operator): @classmethod def poll(cls, context): - return context.object.mode == 'POSE' and\ - context.object is not None and context.object.data is not None and\ - context.object.data.get('Car Rig') + return context.object.mode == 'POSE' and \ + context.object is not None and context.object.data is not None and \ + context.object.data.get('Car Rig') def execute(self, context): mode = context.object.mode @@ -1437,7 +1470,8 @@ def create_wheelbrake_bone(self, context, wheel_pose_bone, name, parent_name): amt = context.object.data if name not in amt.bones and parent_name in amt.bones: bpy.ops.object.mode_set(mode='EDIT') - create_wheel_brake_bone(amt.edit_bones.new(name), amt.edit_bones[parent_name], amt.edit_bones[wheel_pose_bone.name]) + create_wheel_brake_bone(amt.edit_bones.new(name), amt.edit_bones[parent_name], + amt.edit_bones[wheel_pose_bone.name]) bpy.ops.object.mode_set(mode='POSE') generate_constraint_on_wheel_brake_bone(obj.pose.bones[name], wheel_pose_bone) diff --git a/widgets.py b/widgets.py index 4b77a56..ae37e9e 100644 --- a/widgets.py +++ b/widgets.py @@ -72,7 +72,8 @@ def get_widgets(): (0.41178521513938904, 0.07347165793180466, 0.0), (0.3602612316608429, 0.09748400002717972, 0.0), (0.29565858840942383, 0.12036669254302979, 0.0), (0.21969391405582428, 0.13851231336593628, 0.0), (0.13528653979301453, 0.15106302499771118, 0.0), (0.04568054899573326, 0.15747304260730743, 0.0), - (-0.560016930103302, 3.5614462490229926e-07, 0.0), (-0.5472726821899414, 0.051212746649980545, 0.0), + (-0.560016930103302, 3.5614462490229926e-07, 0.0), + (-0.5472726821899414, 0.051212746649980545, 0.0), (-0.5173879265785217, 0.09973714500665665, 0.0), (-0.46497008204460144, 0.14364132285118103, 0.0), (-0.3959912657737732, 0.1842898577451706, 0.0), (-0.3111281096935272, 0.21670186519622803, 0.0), (-0.21430844068527222, 0.2407861351966858, 0.0), (-0.10925304144620895, 0.2556171119213104, 0.0), @@ -80,7 +81,8 @@ def get_widgets(): (-0.4915122985839844, 0.12226644158363342, 0.0), (-0.4308139681816101, 0.1645427942276001, 0.0), (-0.3535597026348114, 0.2004958689212799, 0.0), (-0.2627182900905609, 0.22874398529529572, 0.0), (-0.16178074479103088, 0.2482016384601593, 0.0), (-0.05462652072310448, 0.2581210136413574, 0.0), - (-0.4683051109313965, 2.978201791847823e-07, 0.0), (-0.46016228199005127, 0.03240064159035683, 0.0), + (-0.4683051109313965, 2.978201791847823e-07, 0.0), + (-0.46016228199005127, 0.03240064159035683, 0.0), (-0.43346360325813293, 0.06059274449944496, 0.0), (-0.38938117027282715, 0.08542850613594055, 0.0), (-0.33114129304885864, 0.110313281416893, 0.0), (-0.2601758539676666, 0.13103415071964264, 0.0), (-0.17921197414398193, 0.1465274840593338, 0.0), (-0.09136109799146652, 0.15609556436538696, 0.0), @@ -89,57 +91,72 @@ def get_widgets(): (-0.29565858840942383, 0.12036669254302979, 0.0), (-0.21969391405582428, 0.13851231336593628, 0.0), (-0.13528653979301453, 0.15106302499771118, 0.0), (-0.04568054899573326, 0.15747304260730743, 0.0), (0.0, 0.26062488555908203, 0.0), (0.0, 0.15932999551296234, 0.0)], - 'edges': [(8, 0), (9, 1), (10, 2), (11, 3), (12, 4), (13, 5), (14, 6), (15, 7), (1, 8), (2, 9), (3, 10), (4, 11), - (5, 12), (6, 13), (7, 14), (64, 15), (24, 16), (25, 17), (26, 18), (27, 19), (28, 20), (29, 21), - (30, 22), (31, 23), (17, 24), (18, 25), (19, 26), (20, 27), (21, 28), (22, 29), (23, 30), (65, 31), - (0, 16), (24, 8), (1, 17), (25, 9), (40, 32), (41, 33), (42, 34), (43, 35), (44, 36), (45, 37), (46, 38), - (47, 39), (33, 40), (34, 41), (35, 42), (36, 43), (37, 44), (38, 45), (39, 46), (64, 47), (56, 48), - (57, 49), (58, 50), (59, 51), (60, 52), (61, 53), (62, 54), (63, 55), (49, 56), (50, 57), (51, 58), - (52, 59), (53, 60), (54, 61), (55, 62), (65, 63), (32, 48), (56, 40), (33, 49), (57, 41)] + 'edges': [(8, 0), (9, 1), (10, 2), (11, 3), (12, 4), (13, 5), (14, 6), (15, 7), (1, 8), (2, 9), (3, 10), + (4, 11), (5, 12), (6, 13), (7, 14), (64, 15), (24, 16), (25, 17), (26, 18), (27, 19), (28, 20), + (29, 21), (30, 22), (31, 23), (17, 24), (18, 25), (19, 26), (20, 27), (21, 28), (22, 29), (23, 30), + (65, 31), (0, 16), (24, 8), (1, 17), (25, 9), (40, 32), (41, 33), (42, 34), (43, 35), (44, 36), + (45, 37), (46, 38), (47, 39), (33, 40), (34, 41), (35, 42), (36, 43), (37, 44), (38, 45), (39, 46), + (64, 47), (56, 48), (57, 49), (58, 50), (59, 51), (60, 52), (61, 53), (62, 54), (63, 55), (49, 56), + (50, 57), (51, 58), (52, 59), (53, 60), (54, 61), (55, 62), (65, 63), (32, 48), (56, 40), (33, 49), + (57, 41)] } widgets['Root'] = { - 'vertices': [(-0.5, -0.8844379782676697, 0.0), (-0.3844379782676697, -1.0, 0.0), (-0.4912033677101135, -0.9286617040634155, 0.0), - (-0.4661526679992676, -0.9661527276039124, 0.0), (-0.42866164445877075, -0.9912034273147583, 0.0), (0.3844379782676697, -1.0, 0.0), - (0.5, -0.8844379782676697, 0.0), (0.42866164445877075, -0.9912034273147583, 0.0), (0.4661526679992676, -0.9661527276039124, 0.0), - (0.4912033677101135, -0.9286617040634155, 0.0), (-0.5, 0.8844379782676697, 0.0), (-0.3844379782676697, 1.0, 0.0), - (-0.4912033677101135, 0.9286617040634155, 0.0), (-0.4661526679992676, 0.9661527276039124, 0.0), (-0.42866164445877075, 0.9912034273147583, 0.0), - (0.5, 0.8844379782676697, 0.0), (0.3844379782676697, 1.0, 0.0), (0.4912033677101135, 0.9286617040634155, 0.0), - (0.4661526679992676, 0.9661527276039124, 0.0), (0.42866164445877075, 0.9912034273147583, 0.0), (0.1234154999256134, -1.0, 0.0), - (-0.1234154999256134, -1.0, 0.0), (0.1234154999256134, -1.0971899032592773, 0.0), (-0.1234154999256134, -1.0971899032592773, 0.0), - (0.3031257688999176, -1.0971899032592773, 0.0), (-0.3031257688999176, -1.0971899032592773, 0.0), (0.0, -1.25, 0.0)], - 'edges': [(0, 2), (2, 3), (3, 4), (4, 1), (5, 7), (7, 8), (8, 9), (9, 6), (10, 12), (12, 13), (13, 14), (14, 11), (15, 17), (17, 18), (18, 19), - (19, 16), (0, 10), (6, 15), (11, 16), (20, 5), (21, 1), (22, 20), (23, 21), (24, 22), (25, 23), (26, 24), (26, 25)] + 'vertices': [(-0.5, -0.8844379782676697, 0.0), (-0.3844379782676697, -1.0, 0.0), + (-0.4912033677101135, -0.9286617040634155, 0.0), (-0.4661526679992676, -0.9661527276039124, 0.0), + (-0.42866164445877075, -0.9912034273147583, 0.0), (0.3844379782676697, -1.0, 0.0), + (0.5, -0.8844379782676697, 0.0), (0.42866164445877075, -0.9912034273147583, 0.0), + (0.4661526679992676, -0.9661527276039124, 0.0), (0.4912033677101135, -0.9286617040634155, 0.0), + (-0.5, 0.8844379782676697, 0.0), (-0.3844379782676697, 1.0, 0.0), + (-0.4912033677101135, 0.9286617040634155, 0.0), (-0.4661526679992676, 0.9661527276039124, 0.0), + (-0.42866164445877075, 0.9912034273147583, 0.0), (0.5, 0.8844379782676697, 0.0), + (0.3844379782676697, 1.0, 0.0), (0.4912033677101135, 0.9286617040634155, 0.0), + (0.4661526679992676, 0.9661527276039124, 0.0), (0.42866164445877075, 0.9912034273147583, 0.0), + (0.1234154999256134, -1.0, 0.0), (-0.1234154999256134, -1.0, 0.0), + (0.1234154999256134, -1.0971899032592773, 0.0), (-0.1234154999256134, -1.0971899032592773, 0.0), + (0.3031257688999176, -1.0971899032592773, 0.0), (-0.3031257688999176, -1.0971899032592773, 0.0), + (0.0, -1.25, 0.0)], + 'edges': [(0, 2), (2, 3), (3, 4), (4, 1), (5, 7), (7, 8), (8, 9), (9, 6), (10, 12), (12, 13), (13, 14), + (14, 11), (15, 17), (17, 18), (18, 19), (19, 16), (0, 10), (6, 15), (11, 16), (20, 5), (21, 1), + (22, 20), (23, 21), (24, 22), (25, 23), (26, 24), (26, 25)] } widgets['GroundSensor'] = { - 'vertices': [(-0.5, -0.822191596031189, 0.0), (-0.32219159603118896, -1.0, 0.0), (-0.4761781692504883, -0.9110957980155945, 0.0), - (-0.4110957980155945, -0.9761781692504883, 0.0), (0.32219159603118896, -1.0, 0.0), (0.5, -0.822191596031189, 0.0), - (0.4110957980155945, -0.9761781692504883, 0.0), (0.47617819905281067, -0.9110957980155945, 0.0), (-0.5, 0.822191596031189, 0.0), - (-0.32219159603118896, 1.0, 0.0), (-0.4761781692504883, 0.9110957980155945, 0.0), (-0.4110957980155945, 0.9761781692504883, 0.0), - (0.5, 0.822191596031189, 0.0), (0.32219159603118896, 1.0, 0.0), (0.4761781692504883, 0.9110957980155945, 0.0), - (0.4110957980155945, 0.9761781692504883, 0.0)], - 'edges': [(0, 2), (2, 3), (3, 1), (4, 6), (6, 7), (7, 5), (8, 10), (10, 11), (11, 9), (12, 14), (14, 15), (15, 13), (0, 8), (1, 4), (5, 12), (9, 13)] + 'vertices': [(-0.5, -0.822191596031189, 0.0), (-0.32219159603118896, -1.0, 0.0), + (-0.4761781692504883, -0.9110957980155945, 0.0), (-0.4110957980155945, -0.9761781692504883, 0.0), + (0.32219159603118896, -1.0, 0.0), (0.5, -0.822191596031189, 0.0), + (0.4110957980155945, -0.9761781692504883, 0.0), (0.47617819905281067, -0.9110957980155945, 0.0), + (-0.5, 0.822191596031189, 0.0), (-0.32219159603118896, 1.0, 0.0), + (-0.4761781692504883, 0.9110957980155945, 0.0), (-0.4110957980155945, 0.9761781692504883, 0.0), + (0.5, 0.822191596031189, 0.0), (0.32219159603118896, 1.0, 0.0), + (0.4761781692504883, 0.9110957980155945, 0.0), (0.4110957980155945, 0.9761781692504883, 0.0)], + 'edges': [(0, 2), (2, 3), (3, 1), (4, 6), (6, 7), (7, 5), (8, 10), (10, 11), (11, 9), (12, 14), (14, 15), + (15, 13), (0, 8), (1, 4), (5, 12), (9, 13)] } widgets['GroundSensor.Axle'] = { - 'vertices': [(0.0, 0.5, 0.0), (-0.19134172797203064, 0.4619397521018982, 0.0), (-0.3535533845424652, 0.3535533845424652, 0.0), - (-0.4619397521018982, 0.19134171307086945, 0.0), (-0.5, -2.1855694143368964e-08, 0.0), (-0.4619397521018982, -0.19134175777435303, 0.0), - (-0.3535533845424652, -0.3535533845424652, 0.0), (-0.19134174287319183, -0.4619397521018982, 0.0), (-7.549790126404332e-08, -0.5, 0.0), - (0.1913416087627411, -0.46193981170654297, 0.0), (0.35355329513549805, -0.35355350375175476, 0.0), (0.4619397521018982, -0.19134178757667542, 0.0), - (0.5, 5.962440319251527e-09, 0.0), (0.4619397222995758, 0.1913418024778366, 0.0), (0.35355326533317566, 0.35355350375175476, 0.0), - (0.19134148955345154, 0.46193987131118774, 0.0), (0.0, 0.2866188585758209, 0.0), (-0.1096842959523201, 0.2648012936115265, 0.0), - (-0.2026701420545578, 0.2026701420545578, 0.0), (-0.2648012936115265, 0.1096842885017395, 0.0), (-0.2866188585758209, -1.2528508008813333e-08, 0.0), - (-0.2648012936115265, -0.10968431085348129, 0.0), (-0.2026701420545578, -0.2026701420545578, 0.0), (-0.1096843034029007, -0.2648012936115265, 0.0), - (-4.327824498773225e-08, -0.2866188585758209, 0.0), (0.10968422889709473, -0.2648013234138489, 0.0), - (0.20267008244991302, -0.20267020165920258, 0.0), (0.2648012936115265, -0.10968433320522308, 0.0), - (0.2866188585758209, 3.4178957442065894e-09, 0.0), (0.2648012638092041, 0.10968434065580368, 0.0), - (0.20267006754875183, 0.20267020165920258, 0.0), (0.10968416184186935, 0.26480135321617126, 0.0), (-2.1639122493866125e-08, 0.0, 0.0)], - 'edges': [(1, 0), (2, 1), (3, 2), (4, 3), (5, 4), (6, 5), (7, 6), (8, 7), (9, 8), (10, 9), (11, 10), (12, 11), (13, 12), (14, 13), (15, 14), (0, 15), - (17, 16), (18, 17), (19, 18), (20, 19), (21, 20), (22, 21), (23, 22), (24, 23), (25, 24), (26, 25), (27, 26), (28, 27), (29, 28), (30, 29), - (31, 30), (16, 31), (32, 24), (16, 32), (20, 32), (28, 32)] - } - + 'vertices': [(0.0, 0.5, 0.0), (-0.19134172797203064, 0.4619397521018982, 0.0), + (-0.3535533845424652, 0.3535533845424652, 0.0), (-0.4619397521018982, 0.19134171307086945, 0.0), + (-0.5, -2.1855694143368964e-08, 0.0), (-0.4619397521018982, -0.19134175777435303, 0.0), + (-0.3535533845424652, -0.3535533845424652, 0.0), (-0.19134174287319183, -0.4619397521018982, 0.0), + (-7.549790126404332e-08, -0.5, 0.0), (0.1913416087627411, -0.46193981170654297, 0.0), + (0.35355329513549805, -0.35355350375175476, 0.0), (0.4619397521018982, -0.19134178757667542, 0.0), + (0.5, 5.962440319251527e-09, 0.0), (0.4619397222995758, 0.1913418024778366, 0.0), + (0.35355326533317566, 0.35355350375175476, 0.0), (0.19134148955345154, 0.46193987131118774, 0.0), + (0.0, 0.2866188585758209, 0.0), (-0.1096842959523201, 0.2648012936115265, 0.0), + (-0.2026701420545578, 0.2026701420545578, 0.0), (-0.2648012936115265, 0.1096842885017395, 0.0), + (-0.2866188585758209, -1.2528508008813333e-08, 0.0), + (-0.2648012936115265, -0.10968431085348129, 0.0), (-0.2026701420545578, -0.2026701420545578, 0.0), + (-0.1096843034029007, -0.2648012936115265, 0.0), + (-4.327824498773225e-08, -0.2866188585758209, 0.0), + (0.10968422889709473, -0.2648013234138489, 0.0), (0.20267008244991302, -0.20267020165920258, 0.0), + (0.2648012936115265, -0.10968433320522308, 0.0), (0.2866188585758209, 3.4178957442065894e-09, 0.0), + (0.2648012638092041, 0.10968434065580368, 0.0), (0.20267006754875183, 0.20267020165920258, 0.0), + (0.10968416184186935, 0.26480135321617126, 0.0), (-2.1639122493866125e-08, 0.0, 0.0)], + 'edges': [(1, 0), (2, 1), (3, 2), (4, 3), (5, 4), (6, 5), (7, 6), (8, 7), (9, 8), (10, 9), (11, 10), (12, 11), + (13, 12), (14, 13), (15, 14), (0, 15), (17, 16), (18, 17), (19, 18), (20, 19), (21, 20), (22, 21), + (23, 22), (24, 23), (25, 24), (26, 25), (27, 26), (28, 27), (29, 28), (30, 29), (31, 30), (16, 31), + (32, 24), (16, 32), (20, 32), (28, 32)]} widgets['Wheel'] = { 'vertices': [(0, 0.9999999403953552, -1.1874362826347351e-07), (0, 0.9807851910591125, 0.19509020447731018), (0, 0.9238794445991516, 0.38268333673477173), (0, 0.8314695358276367, 0.555570125579834), @@ -242,127 +259,217 @@ def get_widgets(): } widgets['Steering'] = { - 'vertices': [(0.7296777367591858, 0.07034172862768173, 0.0), (0.057004380971193314, -0.07034172862768173, 0.0), (0.7296777367591858, -0.07034172862768173, 0.0), - (0.057004380971193314, 0.07034172862768173, 0.0), (0.7296777367591858, 0.16664999723434448, 0.0), (0.7296777367591858, -0.16664999723434448, 0.0), - (0.9998999834060669, 0.0, 0.0), (-0.7296777367591858, 0.07034172862768173, 0.0), (-0.057004380971193314, -0.07034172862768173, 0.0), - (-0.7296777367591858, -0.07034172862768173, 0.0), (-0.057004380971193314, 0.07034172862768173, 0.0), (-0.7296777367591858, 0.16664999723434448, 0.0), + 'vertices': [(0.7296777367591858, 0.07034172862768173, 0.0), (0.057004380971193314, -0.07034172862768173, 0.0), + (0.7296777367591858, -0.07034172862768173, 0.0), + (0.057004380971193314, 0.07034172862768173, 0.0), (0.7296777367591858, 0.16664999723434448, 0.0), + (0.7296777367591858, -0.16664999723434448, 0.0), + (0.9998999834060669, 0.0, 0.0), (-0.7296777367591858, 0.07034172862768173, 0.0), + (-0.057004380971193314, -0.07034172862768173, 0.0), + (-0.7296777367591858, -0.07034172862768173, 0.0), + (-0.057004380971193314, 0.07034172862768173, 0.0), (-0.7296777367591858, 0.16664999723434448, 0.0), (-0.7296777367591858, -0.16664999723434448, 0.0), (-0.9998999834060669, 0.0, 0.0)], - 'edges': [(2, 1), (3, 0), (1, 3), (0, 4), (5, 2), (4, 6), (6, 5), (9, 8), (10, 7), (8, 10), (7, 11), (12, 9), (11, 13), (13, 12)] + 'edges': [(2, 1), (3, 0), (1, 3), (0, 4), (5, 2), (4, 6), (6, 5), (9, 8), (10, 7), (8, 10), (7, 11), (12, 9), + (11, 13), (13, 12)] } widgets['Suspension'] = { - 'vertices': [(-0.42728525400161743, -0.12928833067417145, -0.04404989629983902), (-0.06909304857254028, 0.2578587830066681, 0.0), + 'vertices': [(-0.42728525400161743, -0.12928833067417145, -0.04404989629983902), + (-0.06909304857254028, 0.2578587830066681, 0.0), (-0.13347753882408142, 0.23118986189365387, 0.0), (-0.1887657195329666, 0.1887657195329666, 0.0), (-0.23118992149829865, 0.13347753882408142, 0.0), (-0.2578587830066681, 0.06909307092428207, 0.0), - (-0.42728525400161743, -0.06909316033124924, -0.025838270783424377), (-0.2578587830066681, -0.06909302622079849, 0.0), - (-0.23118986189365387, -0.13347747921943665, 0.0), (-0.18876579403877258, -0.18876568973064423, 0.0), + (-0.42728525400161743, -0.06909316033124924, -0.025838270783424377), + (-0.2578587830066681, -0.06909302622079849, 0.0), + (-0.23118986189365387, -0.13347747921943665, 0.0), + (-0.18876579403877258, -0.18876568973064423, 0.0), (-0.1334775984287262, -0.23118983209133148, 0.0), (-0.06909313797950745, -0.2578587532043457, 0.0), - (-0.42728525400161743, 0.06909292191267014, -0.025838270783424377), (0.06909293681383133, -0.2578587830066681, 0.0), + (-0.42728525400161743, 0.06909292191267014, -0.025838270783424377), + (0.06909293681383133, -0.2578587830066681, 0.0), (0.13347743451595306, -0.23118995130062103, 0.0), (0.18876565992832184, -0.18876583874225616, 0.0), (0.23118983209133148, -0.1334775984287262, 0.0), (0.2578587532043457, -0.06909316033124924, 0.0), - (0.42728525400161743, -0.06909316033124924, -0.025838270783424377), (0.2578587830066681, 0.06909292191267014, 0.0), + (0.42728525400161743, -0.06909316033124924, -0.025838270783424377), + (0.2578587830066681, 0.06909292191267014, 0.0), (0.23118992149829865, 0.13347740471363068, 0.0), (0.18876585364341736, 0.18876561522483826, 0.0), (0.13347768783569336, 0.2311897873878479, 0.0), (0.0690932497382164, 0.2578587532043457, 0.0), - (0.42728525400161743, 0.06909292191267014, -0.025838270783424377), (0.42728525400161743, -0.12928833067417145, -0.04404989629983902), - (0.42728525400161743, 0.12928791344165802, -0.04404982924461365), (0.6011841893196106, -2.227646831443053e-07, -0.12004293501377106), - (-0.42728525400161743, 0.12928791344165802, -0.04404982924461365), (-0.6011841893196106, -2.227646831443053e-07, -0.12004293501377106), - (-0.06909316033124924, -0.42728525400161743, -0.025838270783424377), (0.06909292191267014, -0.42728525400161743, -0.025838270783424377), - (-0.12928833067417145, -0.42728525400161743, -0.04404989629983902), (0.12928785383701324, -0.42728525400161743, -0.04404980689287186), - (-2.545882011872891e-07, -0.6011841893196106, -0.12004290521144867), (-0.06909316033124924, 0.42728525400161743, -0.025838270783424377), - (0.06909292191267014, 0.42728525400161743, -0.025838270783424377), (-0.12928833067417145, 0.42728525400161743, -0.04404989629983902), - (0.12928785383701324, 0.42728525400161743, -0.04404982924461365), (-2.545882011872891e-07, 0.6011841893196106, -0.12004293501377106), - (0.0, 0.1595769226551056, 0.0), (-0.0797884613275528, 0.13819767534732819, 0.0), (-0.13819767534732819, 0.079788438975811, 0.0), - (-0.1595769226551056, -6.975329203129377e-09, 0.0), (-0.13819767534732819, -0.0797884613275528, 0.0), - (-0.0797884613275528, -0.13819767534732819, 0.0), (-2.409544741510672e-08, -0.1595769226551056, 0.0), + (0.42728525400161743, 0.06909292191267014, -0.025838270783424377), + (0.42728525400161743, -0.12928833067417145, -0.04404989629983902), + (0.42728525400161743, 0.12928791344165802, -0.04404982924461365), + (0.6011841893196106, -2.227646831443053e-07, -0.12004293501377106), + (-0.42728525400161743, 0.12928791344165802, -0.04404982924461365), + (-0.6011841893196106, -2.227646831443053e-07, -0.12004293501377106), + (-0.06909316033124924, -0.42728525400161743, -0.025838270783424377), + (0.06909292191267014, -0.42728525400161743, -0.025838270783424377), + (-0.12928833067417145, -0.42728525400161743, -0.04404989629983902), + (0.12928785383701324, -0.42728525400161743, -0.04404980689287186), + (-2.545882011872891e-07, -0.6011841893196106, -0.12004290521144867), + (-0.06909316033124924, 0.42728525400161743, -0.025838270783424377), + (0.06909292191267014, 0.42728525400161743, -0.025838270783424377), + (-0.12928833067417145, 0.42728525400161743, -0.04404989629983902), + (0.12928785383701324, 0.42728525400161743, -0.04404982924461365), + (-2.545882011872891e-07, 0.6011841893196106, -0.12004293501377106), + (0.0, 0.1595769226551056, 0.0), (-0.0797884613275528, 0.13819767534732819, 0.0), + (-0.13819767534732819, 0.079788438975811, 0.0), + (-0.1595769226551056, -6.975329203129377e-09, 0.0), + (-0.13819767534732819, -0.0797884613275528, 0.0), + (-0.0797884613275528, -0.13819767534732819, 0.0), + (-2.409544741510672e-08, -0.1595769226551056, 0.0), (0.07978841662406921, -0.13819767534732819, 0.0), (0.1381976306438446, -0.07978851348161697, 0.0), (0.1595769226551056, -7.418926628588451e-08, 0.0), (0.13819773495197296, 0.07978837937116623, 0.0), - (0.07978855073451996, 0.1381976157426834, 0.0), (0.3002154231071472, 0.06909292191267014, -0.0018598437309265137), - (0.34257203340530396, 0.06909292191267014, -0.007112756371498108), (0.3849286139011383, 0.06909292191267014, -0.015268802642822266), - (0.3849286139011383, -0.06909316033124924, -0.015268847346305847), (0.34257200360298157, -0.06909316033124924, -0.00711272656917572), - (0.30021539330482483, -0.06909316033124924, -0.0018598437309265137), (-0.3002154231071472, 0.06909303367137909, -0.0018598437309265137), - (-0.34257203340530396, 0.0690929964184761, -0.007112756371498108), (-0.3849286139011383, 0.06909295171499252, -0.015268802642822266), - (-0.3849286139011383, -0.06909313052892685, -0.015268802642822266), (-0.34257200360298157, -0.06909309327602386, -0.007112711668014526), - (-0.30021539330482483, -0.06909305602312088, -0.0018598586320877075), (-0.06909314543008804, -0.30021539330482483, -0.0018598437309265137), - (-0.06909314543008804, -0.34257200360298157, -0.00711272656917572), (-0.06909315288066864, -0.3849286139011383, -0.015268847346305847), - (0.06909293681383133, -0.3002154231071472, -0.0018598437309265137), (0.06909292936325073, -0.34257203340530396, -0.007112756371498108), - (0.06909292191267014, -0.3849286139011383, -0.015268802642822266), (-0.06909307837486267, 0.3002154231071472, -0.0018598437309265137), - (-0.06909310817718506, 0.34257203340530396, -0.007112756371498108), (-0.06909313052892685, 0.3849286139011383, -0.015268802642822266), - (0.06909316033124924, 0.30021539330482483, -0.0018598437309265137), (0.06909307837486267, 0.34257200360298157, -0.00711272656917572), + (0.07978855073451996, 0.1381976157426834, 0.0), + (0.3002154231071472, 0.06909292191267014, -0.0018598437309265137), + (0.34257203340530396, 0.06909292191267014, -0.007112756371498108), + (0.3849286139011383, 0.06909292191267014, -0.015268802642822266), + (0.3849286139011383, -0.06909316033124924, -0.015268847346305847), + (0.34257200360298157, -0.06909316033124924, -0.00711272656917572), + (0.30021539330482483, -0.06909316033124924, -0.0018598437309265137), + (-0.3002154231071472, 0.06909303367137909, -0.0018598437309265137), + (-0.34257203340530396, 0.0690929964184761, -0.007112756371498108), + (-0.3849286139011383, 0.06909295171499252, -0.015268802642822266), + (-0.3849286139011383, -0.06909313052892685, -0.015268802642822266), + (-0.34257200360298157, -0.06909309327602386, -0.007112711668014526), + (-0.30021539330482483, -0.06909305602312088, -0.0018598586320877075), + (-0.06909314543008804, -0.30021539330482483, -0.0018598437309265137), + (-0.06909314543008804, -0.34257200360298157, -0.00711272656917572), + (-0.06909315288066864, -0.3849286139011383, -0.015268847346305847), + (0.06909293681383133, -0.3002154231071472, -0.0018598437309265137), + (0.06909292936325073, -0.34257203340530396, -0.007112756371498108), + (0.06909292191267014, -0.3849286139011383, -0.015268802642822266), + (-0.06909307837486267, 0.3002154231071472, -0.0018598437309265137), + (-0.06909310817718506, 0.34257203340530396, -0.007112756371498108), + (-0.06909313052892685, 0.3849286139011383, -0.015268802642822266), + (0.06909316033124924, 0.30021539330482483, -0.0018598437309265137), + (0.06909307837486267, 0.34257200360298157, -0.00711272656917572), (0.0690930038690567, 0.3849286139011383, -0.015268847346305847)], - 'edges': [(2, 1), (3, 2), (4, 3), (5, 4), (12, 28), (0, 6), (8, 7), (9, 8), (10, 9), (11, 10), (28, 29), (29, 0), (14, 13), (15, 14), (16, 15), - (17, 16), (54, 24), (57, 17), (20, 19), (21, 20), (22, 21), (23, 22), (60, 12), (25, 18), (24, 26), (27, 25), (26, 27), (63, 7), - (32, 30), (31, 33), (34, 32), (33, 34), (66, 30), (69, 31), (37, 35), (36, 38), (39, 37), (38, 39), (72, 35), (75, 36), (41, 40), - (42, 41), (43, 42), (44, 43), (45, 44), (46, 45), (47, 46), (48, 47), (49, 48), (50, 49), (51, 50), (40, 51), (19, 52), (52, 53), - (53, 54), (18, 55), (55, 56), (56, 57), (5, 58), (58, 59), (59, 60), (6, 61), (61, 62), (62, 63), (11, 64), (64, 65), (65, 66), - (13, 67), (67, 68), (68, 69), (1, 70), (70, 71), (71, 72), (23, 73), (73, 74), (74, 75)] - } + 'edges': [(2, 1), (3, 2), (4, 3), (5, 4), (12, 28), (0, 6), (8, 7), (9, 8), (10, 9), (11, 10), (28, 29), + (29, 0), (14, 13), (15, 14), (16, 15), (17, 16), (54, 24), (57, 17), (20, 19), (21, 20), (22, 21), + (23, 22), (60, 12), (25, 18), (24, 26), (27, 25), (26, 27), (63, 7), (32, 30), (31, 33), (34, 32), + (33, 34), (66, 30), (69, 31), (37, 35), (36, 38), (39, 37), (38, 39), (72, 35), (75, 36), (41, 40), + (42, 41), (43, 42), (44, 43), (45, 44), (46, 45), (47, 46), (48, 47), (49, 48), (50, 49), (51, 50), + (40, 51), (19, 52), (52, 53), (53, 54), (18, 55), (55, 56), (56, 57), (5, 58), (58, 59), (59, 60), + (6, 61), (61, 62), (62, 63), (11, 64), (64, 65), (65, 66), (13, 67), (67, 68), (68, 69), (1, 70), + (70, 71), (71, 72), (23, 73), (73, 74), (74, 75)]} widgets['WheelDamper'] = { - 'vertices': [(-0.17770397663116455, -0.09192684292793274, 0.14030149579048157), (-0.17770397663116455, -0.09192684292793274, 0.23383590579032898), - (-0.10793274641036987, -0.16846297681331635, 0.13250692188739777), (-0.10793278366327286, -0.16846297681331635, 0.22604137659072876), - (-0.009241040796041489, -0.1998595893383026, 0.12471239268779755), (-0.009241056628525257, -0.19985966384410858, 0.21824686229228973), - (0.09192679077386856, -0.17770402133464813, 0.11691785603761673), (0.09192682057619095, -0.17770402133464813, 0.21045231819152832), - (0.16846293210983276, -0.10793281346559525, 0.1091233491897583), (0.16846293210983276, -0.10793281346559525, 0.2026577889919281), - (0.1998595893383026, -0.009241072461009026, 0.10132881999015808), (0.1998595893383026, -0.009241089224815369, 0.19486328959465027), - (0.17770397663116455, 0.09192679077386856, 0.09353431314229965), (0.1777040809392929, 0.09192677587270737, 0.18706879019737244), - (0.10793274641036987, 0.16846294701099396, 0.08573977649211884), (0.10793281346559525, 0.16846294701099396, 0.17927424609661102), - (0.009240993298590183, 0.19985954463481903, 0.0779452696442604), (0.009241056628525257, 0.1998595893383026, 0.1714797168970108), - (-0.09192684292793274, 0.17770391702651978, 0.07015073299407959), (-0.09192682057619095, 0.17770402133464813, 0.16368518769741058), - (-0.16846294701099396, 0.10793264955282211, 0.06235618144273758), (-0.16846297681331635, 0.10793274641036987, 0.15589064359664917), - (-0.19985954463481903, 0.009240960702300072, 0.05456162989139557), (-0.1998595893383026, 0.00924102496355772, 0.14809606969356537), - (-0.17770391702651978, -0.09192687273025513, 0.04676707834005356), (-0.17770402133464813, -0.09192684292793274, 0.14030154049396515), - (-0.1079326793551445, -0.16846294701099396, 0.03897252678871155), (-0.10793278366327286, -0.16846302151679993, 0.13250696659088135), - (-0.00924097653478384, -0.19985954463481903, 0.03117799013853073), (-0.009241056628525257, -0.19985966384410858, 0.12471242249011993), - (0.09192684292793274, -0.17770391702651978, 0.02338346280157566), (0.09192682057619095, -0.1777040809392929, 0.11691789329051971), - (0.16846293210983276, -0.1079326942563057, 0.015588936395943165), (0.16846293210983276, -0.10793283581733704, 0.10912337899208069), - (0.19985954463481903, -0.009240993298590183, 0.0077944230288267136), (0.1998595893383026, -0.009241105057299137, 0.10132886469364166), - (0.17770391702651978, 0.09192683547735214, -9.42906623890849e-08), (0.1777040809392929, 0.09192677587270737, 0.09353433549404144), - (0.1079326793551445, 0.16846290230751038, -0.007794610224664211), (0.10793281346559525, 0.16846294701099396, 0.08573982864618301), - (0.00924097653478384, 0.19985945522785187, -0.015589137561619282), (0.009241056628525257, 0.1998595893383026, 0.0779452919960022), - (-0.09192682057619095, 0.177703857421875, -0.023383673280477524), (-0.09192682057619095, 0.17770402133464813, 0.07015074789524078), - (-0.16846290230751038, 0.10793262720108032, -0.031178224831819534), (-0.16846294701099396, 0.10793274641036987, 0.06235621124505997), - (-0.19985945522785187, 0.009240944869816303, -0.03897276148200035), (-0.1998595893383026, 0.00924102496355772, 0.05456166714429855), - (-0.177703857421875, -0.09192684292793274, -0.046767283231019974), (-0.17770402133464813, -0.09192684292793274, 0.04676711559295654), - (-0.10793262720108032, -0.16846290230751038, -0.054561812430620193), (-0.10793278366327286, -0.16846302151679993, 0.038972560316324234), - (-0.009240960702300072, -0.19985948503017426, -0.062356337904930115), (-0.00924102496355772, -0.19985966384410858, 0.031178021803498268), - (0.09192684292793274, -0.177703857421875, -0.07015086710453033), (0.09192683547735214, -0.17770402133464813, 0.023383498191833496), - (0.16846293210983276, -0.10793262720108032, -0.07794538885354996), (0.16846302151679993, -0.10793278366327286, 0.015588970854878426), - (0.19985945522785187, -0.009240944869816303, -0.08573991060256958), (0.19985966384410858, -0.009241040796041489, 0.007794454228132963), - (0.1777038276195526, 0.09192683547735214, -0.09353446215391159), (0.1777040809392929, 0.09192684292793274, -6.286042264491698e-08), - (0.10793259739875793, 0.1684628427028656, -0.10132896900177002), (0.10793281346559525, 0.16846302151679993, -0.007794579025357962), - (0.00924092996865511, 0.1998593956232071, -0.10912348330020905), (0.009241040796041489, 0.19985966384410858, -0.015589105896651745), - (-0.09192682057619095, 0.17770376801490784, -0.11691801995038986), (-0.09192684292793274, 0.17770405113697052, -0.023383641615509987), - (-0.1684628427028656, 0.10793255269527435, -0.12471257150173187), (-0.16846302151679993, 0.10793274641036987, -0.031178191304206848), - (-0.1998593509197235, 0.009240913204848766, -0.1325071007013321), (-0.19985966384410858, 0.009240993298590183, -0.03897274285554886), - (-0.17770376801490784, -0.09192683547735214, -0.1403016299009323), (-0.17770402133464813, -0.09192688763141632, -0.046767283231019974), - (-0.10793255269527435, -0.1684628427028656, -0.14809612929821014), (-0.10793274641036987, -0.16846303641796112, -0.054561812430620193), - (-0.009240896441042423, -0.1998593509197235, -0.15589067339897156), (-0.009240993298590183, -0.19985966384410858, -0.062356337904930115), - (0.09192683547735214, -0.17770375311374664, -0.16368518769741058), (0.09192688763141632, -0.17770402133464813, -0.07015086710453033), - (0.1684628129005432, -0.10793253034353256, -0.1714797168970108), (0.16846302151679993, -0.10793274641036987, -0.07794538885354996), - (0.1998593509197235, -0.009240913204848766, -0.17927424609661102), (0.1998595893383026, -0.009241009131073952, -0.08573991060256958), - (0.17770375311374664, 0.09192679077386856, -0.18706879019737244), (0.17770397663116455, 0.09192684292793274, -0.09353446215391159), - (0.10793255269527435, 0.1684628278017044, -0.19486330449581146), (0.10793274641036987, 0.16846294701099396, -0.10132896900177002), - (0.00924092996865511, 0.1998593509197235, -0.20265783369541168), (0.00924102496355772, 0.19985954463481903, -0.10912348330020905), - (-0.09192678332328796, 0.17770370841026306, -0.2104523628950119), (-0.09192679077386856, 0.17770394682884216, -0.11691801995038986), - (-0.1684628129005432, 0.10793255269527435, -0.21824689209461212), (-0.16846290230751038, 0.10793272405862808, -0.12471257150173187), - (-0.19985929131507874, 0.00924092996865511, -0.22604137659072876), (-0.19985954463481903, 0.00924102496355772, -0.1325071007013321), - (-0.17770370841026306, -0.09192678332328796, -0.23383590579032898), (-0.17770391702651978, -0.09192680567502975, -0.1403016299009323), - (-0.21371114253997803, -0.21371114253997803, 0.24772925674915314), (0.21371114253997803, -0.21371114253997803, 0.24772925674915314), - (-0.21371114253997803, 0.21371114253997803, 0.24772925674915314), (0.21371114253997803, 0.21371114253997803, 0.24772925674915314), - (-0.21371114253997803, -0.21371114253997803, -0.24772925674915314), (0.21371114253997803, -0.21371114253997803, -0.24772925674915314), - (-0.21371114253997803, 0.21371114253997803, -0.24772925674915314), (0.21371114253997803, 0.21371114253997803, -0.24772925674915314)], - 'edges': [(1, 3), (2, 0), (3, 5), (4, 2), (5, 7), (6, 4), (7, 9), (8, 6), (9, 11), (10, 8), (11, 13), (12, 10), (13, 15), (14, 12), - (15, 17), (16, 14), (17, 19), (18, 16), (19, 21), (20, 18), (21, 23), (22, 20), (23, 25), (24, 22), (25, 27), (26, 24), - (27, 29), (28, 26), (29, 31), (30, 28), (31, 33), (32, 30), (33, 35), (34, 32), (35, 37), (36, 34), (37, 39), (38, 36), - (39, 41), (40, 38), (41, 43), (42, 40), (43, 45), (44, 42), (45, 47), (46, 44), (47, 49), (48, 46), (49, 51), (50, 48), - (51, 53), (52, 50), (53, 55), (54, 52), (55, 57), (56, 54), (57, 59), (58, 56), (59, 61), (60, 58), (61, 63), (62, 60), - (63, 65), (64, 62), (65, 67), (66, 64), (67, 69), (68, 66), (69, 71), (70, 68), (71, 73), (72, 70), (73, 75), (74, 72), - (75, 77), (76, 74), (77, 79), (78, 76), (79, 81), (80, 78), (81, 83), (82, 80), (83, 85), (84, 82), (85, 87), (86, 84), - (87, 89), (88, 86), (89, 91), (90, 88), (91, 93), (92, 90), (93, 95), (94, 92), (95, 97), (96, 94), (100, 98), (98, 99), - (99, 101), (101, 100), (104, 102), (102, 103), (103, 105), (105, 104)] + 'vertices': [(-0.17770397663116455, -0.09192684292793274, 0.14030149579048157), + (-0.17770397663116455, -0.09192684292793274, 0.23383590579032898), + (-0.10793274641036987, -0.16846297681331635, 0.13250692188739777), + (-0.10793278366327286, -0.16846297681331635, 0.22604137659072876), + (-0.009241040796041489, -0.1998595893383026, 0.12471239268779755), + (-0.009241056628525257, -0.19985966384410858, 0.21824686229228973), + (0.09192679077386856, -0.17770402133464813, 0.11691785603761673), + (0.09192682057619095, -0.17770402133464813, 0.21045231819152832), + (0.16846293210983276, -0.10793281346559525, 0.1091233491897583), + (0.16846293210983276, -0.10793281346559525, 0.2026577889919281), + (0.1998595893383026, -0.009241072461009026, 0.10132881999015808), + (0.1998595893383026, -0.009241089224815369, 0.19486328959465027), + (0.17770397663116455, 0.09192679077386856, 0.09353431314229965), + (0.1777040809392929, 0.09192677587270737, 0.18706879019737244), + (0.10793274641036987, 0.16846294701099396, 0.08573977649211884), + (0.10793281346559525, 0.16846294701099396, 0.17927424609661102), + (0.009240993298590183, 0.19985954463481903, 0.0779452696442604), + (0.009241056628525257, 0.1998595893383026, 0.1714797168970108), + (-0.09192684292793274, 0.17770391702651978, 0.07015073299407959), + (-0.09192682057619095, 0.17770402133464813, 0.16368518769741058), + (-0.16846294701099396, 0.10793264955282211, 0.06235618144273758), + (-0.16846297681331635, 0.10793274641036987, 0.15589064359664917), + (-0.19985954463481903, 0.009240960702300072, 0.05456162989139557), + (-0.1998595893383026, 0.00924102496355772, 0.14809606969356537), + (-0.17770391702651978, -0.09192687273025513, 0.04676707834005356), + (-0.17770402133464813, -0.09192684292793274, 0.14030154049396515), + (-0.1079326793551445, -0.16846294701099396, 0.03897252678871155), + (-0.10793278366327286, -0.16846302151679993, 0.13250696659088135), + (-0.00924097653478384, -0.19985954463481903, 0.03117799013853073), + (-0.009241056628525257, -0.19985966384410858, 0.12471242249011993), + (0.09192684292793274, -0.17770391702651978, 0.02338346280157566), + (0.09192682057619095, -0.1777040809392929, 0.11691789329051971), + (0.16846293210983276, -0.1079326942563057, 0.015588936395943165), + (0.16846293210983276, -0.10793283581733704, 0.10912337899208069), + (0.19985954463481903, -0.009240993298590183, 0.0077944230288267136), + (0.1998595893383026, -0.009241105057299137, 0.10132886469364166), + (0.17770391702651978, 0.09192683547735214, -9.42906623890849e-08), + (0.1777040809392929, 0.09192677587270737, 0.09353433549404144), + (0.1079326793551445, 0.16846290230751038, -0.007794610224664211), + (0.10793281346559525, 0.16846294701099396, 0.08573982864618301), + (0.00924097653478384, 0.19985945522785187, -0.015589137561619282), + (0.009241056628525257, 0.1998595893383026, 0.0779452919960022), + (-0.09192682057619095, 0.177703857421875, -0.023383673280477524), + (-0.09192682057619095, 0.17770402133464813, 0.07015074789524078), + (-0.16846290230751038, 0.10793262720108032, -0.031178224831819534), + (-0.16846294701099396, 0.10793274641036987, 0.06235621124505997), + (-0.19985945522785187, 0.009240944869816303, -0.03897276148200035), + (-0.1998595893383026, 0.00924102496355772, 0.05456166714429855), + (-0.177703857421875, -0.09192684292793274, -0.046767283231019974), + (-0.17770402133464813, -0.09192684292793274, 0.04676711559295654), + (-0.10793262720108032, -0.16846290230751038, -0.054561812430620193), + (-0.10793278366327286, -0.16846302151679993, 0.038972560316324234), + (-0.009240960702300072, -0.19985948503017426, -0.062356337904930115), + (-0.00924102496355772, -0.19985966384410858, 0.031178021803498268), + (0.09192684292793274, -0.177703857421875, -0.07015086710453033), + (0.09192683547735214, -0.17770402133464813, 0.023383498191833496), + (0.16846293210983276, -0.10793262720108032, -0.07794538885354996), + (0.16846302151679993, -0.10793278366327286, 0.015588970854878426), + (0.19985945522785187, -0.009240944869816303, -0.08573991060256958), + (0.19985966384410858, -0.009241040796041489, 0.007794454228132963), + (0.1777038276195526, 0.09192683547735214, -0.09353446215391159), + (0.1777040809392929, 0.09192684292793274, -6.286042264491698e-08), + (0.10793259739875793, 0.1684628427028656, -0.10132896900177002), + (0.10793281346559525, 0.16846302151679993, -0.007794579025357962), + (0.00924092996865511, 0.1998593956232071, -0.10912348330020905), + (0.009241040796041489, 0.19985966384410858, -0.015589105896651745), + (-0.09192682057619095, 0.17770376801490784, -0.11691801995038986), + (-0.09192684292793274, 0.17770405113697052, -0.023383641615509987), + (-0.1684628427028656, 0.10793255269527435, -0.12471257150173187), + (-0.16846302151679993, 0.10793274641036987, -0.031178191304206848), + (-0.1998593509197235, 0.009240913204848766, -0.1325071007013321), + (-0.19985966384410858, 0.009240993298590183, -0.03897274285554886), + (-0.17770376801490784, -0.09192683547735214, -0.1403016299009323), + (-0.17770402133464813, -0.09192688763141632, -0.046767283231019974), + (-0.10793255269527435, -0.1684628427028656, -0.14809612929821014), + (-0.10793274641036987, -0.16846303641796112, -0.054561812430620193), + (-0.009240896441042423, -0.1998593509197235, -0.15589067339897156), + (-0.009240993298590183, -0.19985966384410858, -0.062356337904930115), + (0.09192683547735214, -0.17770375311374664, -0.16368518769741058), + (0.09192688763141632, -0.17770402133464813, -0.07015086710453033), + (0.1684628129005432, -0.10793253034353256, -0.1714797168970108), + (0.16846302151679993, -0.10793274641036987, -0.07794538885354996), + (0.1998593509197235, -0.009240913204848766, -0.17927424609661102), + (0.1998595893383026, -0.009241009131073952, -0.08573991060256958), + (0.17770375311374664, 0.09192679077386856, -0.18706879019737244), + (0.17770397663116455, 0.09192684292793274, -0.09353446215391159), + (0.10793255269527435, 0.1684628278017044, -0.19486330449581146), + (0.10793274641036987, 0.16846294701099396, -0.10132896900177002), + (0.00924092996865511, 0.1998593509197235, -0.20265783369541168), + (0.00924102496355772, 0.19985954463481903, -0.10912348330020905), + (-0.09192678332328796, 0.17770370841026306, -0.2104523628950119), + (-0.09192679077386856, 0.17770394682884216, -0.11691801995038986), + (-0.1684628129005432, 0.10793255269527435, -0.21824689209461212), + (-0.16846290230751038, 0.10793272405862808, -0.12471257150173187), + (-0.19985929131507874, 0.00924092996865511, -0.22604137659072876), + (-0.19985954463481903, 0.00924102496355772, -0.1325071007013321), + (-0.17770370841026306, -0.09192678332328796, -0.23383590579032898), + (-0.17770391702651978, -0.09192680567502975, -0.1403016299009323), + (-0.21371114253997803, -0.21371114253997803, 0.24772925674915314), + (0.21371114253997803, -0.21371114253997803, 0.24772925674915314), + (-0.21371114253997803, 0.21371114253997803, 0.24772925674915314), + (0.21371114253997803, 0.21371114253997803, 0.24772925674915314), + (-0.21371114253997803, -0.21371114253997803, -0.24772925674915314), + (0.21371114253997803, -0.21371114253997803, -0.24772925674915314), + (-0.21371114253997803, 0.21371114253997803, -0.24772925674915314), + (0.21371114253997803, 0.21371114253997803, -0.24772925674915314)], + 'edges': [(1, 3), (2, 0), (3, 5), (4, 2), (5, 7), (6, 4), (7, 9), (8, 6), (9, 11), (10, 8), (11, 13), (12, 10), + (13, 15), (14, 12), (15, 17), (16, 14), (17, 19), (18, 16), (19, 21), (20, 18), (21, 23), (22, 20), + (23, 25), (24, 22), (25, 27), (26, 24), (27, 29), (28, 26), (29, 31), (30, 28), (31, 33), (32, 30), + (33, 35), (34, 32), (35, 37), (36, 34), (37, 39), (38, 36), (39, 41), (40, 38), (41, 43), (42, 40), + (43, 45), (44, 42), (45, 47), (46, 44), (47, 49), (48, 46), (49, 51), (50, 48), (51, 53), (52, 50), + (53, 55), (54, 52), (55, 57), (56, 54), (57, 59), (58, 56), (59, 61), (60, 58), (61, 63), (62, 60), + (63, 65), (64, 62), (65, 67), (66, 64), (67, 69), (68, 66), (69, 71), (70, 68), (71, 73), (72, 70), + (73, 75), (74, 72), (75, 77), (76, 74), (77, 79), (78, 76), (79, 81), (80, 78), (81, 83), (82, 80), + (83, 85), (84, 82), (85, 87), (86, 84), (87, 89), (88, 86), (89, 91), (90, 88), (91, 93), (92, 90), + (93, 95), (94, 92), (95, 97), (96, 94), (100, 98), (98, 99), (99, 101), (101, 100), (104, 102), + (102, 103), (103, 105), (105, 104)] } return widgets + if __name__ == "__main__": create()