From b240ef1c5055610e963590a26d93108a5b727a6f Mon Sep 17 00:00:00 2001 From: Zdenek Dolezal Date: Mon, 13 Feb 2023 21:12:46 +0100 Subject: [PATCH 1/4] Bake operators fix By using bpy_extras.anim_utils module directly there is more control over baking actions, but the pose transform bone needs to be reset in order to correctly bake steering. The bone resetting is neccessary even for Blender 3.3. --- bake_operators.py | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/bake_operators.py b/bake_operators.py index 65fed30..ca2c5df 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 @@ -208,14 +209,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 +264,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 +308,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' @@ -377,15 +387,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): From 59a3662e6745219fe4dfa11b6e92f9f9afbf8629 Mon Sep 17 00:00:00 2001 From: Webber Date: Sat, 9 Mar 2024 12:31:07 +0100 Subject: [PATCH 2/4] chore: add pycharm shared settings and dictionary --- .idea/.gitignore | 8 ++++++++ .idea/inspectionProfiles/profiles_settings.xml | 6 ++++++ .idea/misc.xml | 7 +++++++ .idea/modules.xml | 8 ++++++++ .idea/rigacar.iml | 12 ++++++++++++ .idea/vcs.xml | 6 ++++++ 6 files changed, 47 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/rigacar.iml create mode 100644 .idea/vcs.xml 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..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ 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 From d528bd52263c4c40ba7314dc5890d2c61bdf2ef5 Mon Sep 17 00:00:00 2001 From: Webber Date: Sat, 9 Mar 2024 12:53:12 +0100 Subject: [PATCH 3/4] feat!: blender 4 support by jiapeiLu --- car_rig.py | 142 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 89 insertions(+), 53 deletions(-) diff --git a/car_rig.py b/car_rig.py index 910ad0d..30d5f95 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 visiblity + 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 custome 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,14 @@ 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) + # wheel_brake_pose_bone.bone_group = wheel_pose_bone.bone_group + # wheel_brake_pose_bone.bone.layers = wheel_pose_bone.bone.layers cns = wheel_brake_pose_bone.constraints.new('LIMIT_SCALE') cns.name = 'Brakes' @@ -677,7 +701,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 +820,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) @@ -878,7 +904,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 +1177,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 +1186,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 +1281,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 +1345,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 +1390,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 +1451,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 +1472,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) From 30bc3b3662fd08d16f800095ac0311cb529f2983 Mon Sep 17 00:00:00 2001 From: Webber Date: Sat, 9 Mar 2024 13:46:11 +0100 Subject: [PATCH 4/4] chore: pep8, formatting, typos, fork readme --- .../inspectionProfiles/profiles_settings.xml | 1 + README.md | 14 +- __init__.py | 22 +- bake_operators.py | 19 +- car_rig.py | 38 +- widgets.py | 399 +++++++++++------- 6 files changed, 309 insertions(+), 184 deletions(-) diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml index 105ce2d..dd4c951 100644 --- a/.idea/inspectionProfiles/profiles_settings.xml +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -1,5 +1,6 @@ + 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 ca2c5df..2276e76 100644 --- a/bake_operators.py +++ b/bake_operators.py @@ -34,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 @@ -136,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: @@ -195,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] @@ -372,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 @@ -413,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 30d5f95..1feb833 100644 --- a/car_rig.py +++ b/car_rig.py @@ -126,13 +126,13 @@ def dispatch_bones_to_armature_layers(ob): 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 visiblity + # 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 + # get MCH bone re_mch_bone = re.compile(r'^MCH-Wheel(Brake)?\.(Ft|Bk)\.[LR](\.\d+)?$') for b in ob.data.bones: @@ -156,7 +156,7 @@ def dispatch_bones_to_armature_layers(ob): default_visible_layer.assign(ob.data.bones[b.name]) # ob.data.bones[b.name].layers[CUSTOM_SHAPE_LAYER] = True - # remove custome shape from default layer + # Remove custom shape from default layer for bone in custom_shape_layer.bones: default_visible_layer.unassign(bone) @@ -459,8 +459,6 @@ def generate_constraint_on_wheel_brake_bone(wheel_brake_pose_bone, wheel_pose_bo for bone in group.bones: if bone.name == wheel_pose_bone.anme: group.assign(wheel_brake_pose_bone) - # wheel_brake_pose_bone.bone_group = wheel_pose_bone.bone_group - # wheel_brake_pose_bone.bone.layers = wheel_pose_bone.bone.layers cns = wheel_brake_pose_bone.constraints.new('LIMIT_SCALE') cns.name = 'Brakes' @@ -830,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 @@ -1178,7 +1176,7 @@ 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')) + 'Suspension', 'WheelDamper.Ft.L', 'WheelDamper.Ft.R', 'WheelDamper.Bk.L', 'WheelDamper.Bk.R')) wheel_widgets = ('Steering',) for wheel_dimension in self.dimension.wheels_dimensions: @@ -1187,7 +1185,7 @@ def generate_bone_groups(self): 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') + '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) 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()