import bpy import bmesh def select_object(object_name): # Check if the object exists in the scene if object_name in bpy.data.objects: # Get the object by name target_object = bpy.data.objects[object_name] # Ensure the object is in edit mode bpy.context.view_layer.objects.active = target_object bpy.ops.object.mode_set(mode='EDIT') # Create a new BMesh and select all faces of the object bm = bmesh.from_edit_mesh(target_object.data) for face in bm.faces: face.select = True # Update the mesh and exit edit mode bmesh.update_edit_mesh(target_object.data) bpy.ops.object.mode_set(mode='OBJECT') # Ensure the object is selected in object mode as well target_object.select_set(True) else: print(f"Object {object_name} not found in the scene.") bpy.ops.mesh.primitive_plane_add( size=2, enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1)) bpy.ops.object.editmode_toggle() bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='FACE') bpy.ops.mesh.subdivide() bpy.ops.mesh.select_nth(skip=0, nth=2, offset=1) bpy.ops.mesh.delete(type='FACE') mesh = bmesh.from_edit_mesh(bpy.context.object.data) mesh.faces.ensure_lookup_table() mesh.faces[0].select = True bpy.ops.transform.translate(value=(0, 0.973722, 0), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) bpy.ops.mesh.select_all(action='DESELECT') bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='EDGE') mesh.edges.ensure_lookup_table() mesh.edges[-1].select = True bpy.ops.transform.translate(value=(0, 1.25141, 0), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(False, True, False), mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) # Meta Data To Handel LoopCut View3D Error win = bpy.context.window scr = win.screen areas3d = [area for area in scr.areas if area.type == 'VIEW_3D'] region = [region for region in areas3d[0].regions if region.type == 'WINDOW'] override = {'window': win, 'screen': scr, 'area': areas3d[0], 'region': region[0], 'scene': bpy.context.scene, } # Add Lines To Plane To SubDivide bpy.ops.object.mode_set(mode='EDIT') bpy.ops.mesh.loopcut_slide(override, MESH_OT_loopcut={"number_cuts": 1, "smoothness": 0, "falloff": 'INVERSE_SQUARE', "object_index": 0, "edge_index": 1, "mesh_select_mode_init": (False, True, False)}, TRANSFORM_OT_edge_slide={"value": 0.460396, "single_side": False, "use_even": False, "flipped": False, "use_clamp": True, "mirror": True, "snap": False, "snap_elements": {'INCREMENT'}, "use_snap_project": False, "snap_target": 'CLOSEST', "use_snap_self": True, "use_snap_edit": True, "use_snap_nonedit": True, "use_snap_selectable": False, "snap_point": (0, 0, 0), "correct_uv": True, "release_confirm": False, "use_accurate": False}) bpy.ops.mesh.loopcut_slide(override, MESH_OT_loopcut={"number_cuts": 1, "smoothness": 0, "falloff": 'INVERSE_SQUARE', "object_index": 0, "edge_index": 4, "mesh_select_mode_init": (False, True, False)}, TRANSFORM_OT_edge_slide={"value": 0.525597, "single_side": False, "use_even": False, "flipped": False, "use_clamp": True, "mirror": True, "snap": False, "snap_elements": {'INCREMENT'}, "use_snap_project": False, "snap_target": 'CLOSEST', "use_snap_self": True, "use_snap_edit": True, "use_snap_nonedit": True, "use_snap_selectable": False, "snap_point": (0, 0, 0), "correct_uv": True, "release_confirm": False, "use_accurate": False}) bpy.ops.mesh.loopcut_slide(override, MESH_OT_loopcut={"number_cuts": 1, "smoothness": 0, "falloff": 'INVERSE_SQUARE', "object_index": 0, "edge_index": 4, "mesh_select_mode_init": (False, True, False)}, TRANSFORM_OT_edge_slide={"value": 0.525597, "single_side": False, "use_even": False, "flipped": False, "use_clamp": True, "mirror": True, "snap": False, "snap_elements": {'INCREMENT'}, "use_snap_project": False, "snap_target": 'CLOSEST', "use_snap_self": True, "use_snap_edit": True, "use_snap_nonedit": True, "use_snap_selectable": False, "snap_point": (0, 0, 0), "correct_uv": True, "release_confirm": False, "use_accurate": False}) bpy.ops.mesh.loopcut_slide(override, MESH_OT_loopcut={"number_cuts": 1, "smoothness": 0, "falloff": 'INVERSE_SQUARE', "object_index": 0, "edge_index": 9, "mesh_select_mode_init": (False, True, False)}, TRANSFORM_OT_edge_slide={"value": 0.435057, "single_side": False, "use_even": False, "flipped": False, "use_clamp": True, "mirror": True, "snap": False, "snap_elements": {'INCREMENT'}, "use_snap_project": False, "snap_target": 'CLOSEST', "use_snap_self": True, "use_snap_edit": True, "use_snap_nonedit": True, "use_snap_selectable": False, "snap_point": (0, 0, 0), "correct_uv": True, "release_confirm": False, "use_accurate": False}) bpy.ops.mesh.loopcut_slide(override, MESH_OT_loopcut={"number_cuts": 1, "smoothness": 0, "falloff": 'INVERSE_SQUARE', "object_index": 0, "edge_index": 9, "mesh_select_mode_init": (False, True, False)}, TRANSFORM_OT_edge_slide={"value": 0.278689, "single_side": False, "use_even": False, "flipped": False, "use_clamp": True, "mirror": True, "snap": False, "snap_elements": {'INCREMENT'}, "use_snap_project": False, "snap_target": 'CLOSEST', "use_snap_self": True, "use_snap_edit": True, "use_snap_nonedit": True, "use_snap_selectable": False, "snap_point": (0, 0, 0), "correct_uv": True, "release_confirm": False, "use_accurate": False}) bpy.ops.mesh.loopcut_slide(override, MESH_OT_loopcut={"number_cuts": 1, "smoothness": 0, "falloff": 'INVERSE_SQUARE', "object_index": 0, "edge_index": 7, "mesh_select_mode_init": (False, True, False)}, TRANSFORM_OT_edge_slide={"value": -0.0461538, "single_side": False, "use_even": False, "flipped": False, "use_clamp": True, "mirror": True, "snap": False, "snap_elements": {'INCREMENT'}, "use_snap_project": False, "snap_target": 'CLOSEST', "use_snap_self": True, "use_snap_edit": True, "use_snap_nonedit": True, "use_snap_selectable": False, "snap_point": (0, 0, 0), "correct_uv": True, "release_confirm": False, "use_accurate": False}) bpy.ops.mesh.select_all(action='DESELECT') # ----- Marks ON Plane Completed ----- # Now Skew The Selected Vertices and Edges bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='VERT') mesh.verts.ensure_lookup_table() mesh.verts[11].select = True bpy.ops.transform.translate(value=(0.111741, 0.121366, -0.0110779), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) mesh.verts[11].select = False for vert in mesh.verts[12:15]: vert.select = True for vert in mesh.verts[18:21]: vert.select = True bpy.ops.transform.translate(value=(0.146323, 0.157844, -0.00838055), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) for vert in mesh.verts[12:15]: vert.select = False for vert in mesh.verts[18:21]: vert.select = False # ---- Skewed vertices and edges Completed ----- # Now Raise The Surfaces To Make Tread Patterns bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='FACE') faces = mesh.faces[:] selected_faces_indices = [0, 9, 11] selected_faces = [faces[index] for index in selected_faces_indices] for face in selected_faces: face.select = True bpy.ops.mesh.extrude_region_move(MESH_OT_extrude_region={"use_normal_flip": False, "use_dissolve_ortho_edges": False, "mirror": False}, TRANSFORM_OT_translate={"value": (-2.32831e-10, 0, 0.231429), "orient_type": 'NORMAL', "orient_matrix": ((-0.0283855, -0.999539, -0.0107838), (0.999592, -0.028419, 0.00295946), (-0.00326456, -0.0106954, 0.999937)), "orient_matrix_type": 'NORMAL', "constraint_axis": (False, False, True), "mirror": False, "use_proportional_edit": False, "proportional_edit_falloff": 'SMOOTH', "proportional_size": 1, "use_proportional_connected": False, "use_proportional_projected": False, "snap": False, "snap_elements": {'INCREMENT'}, "use_snap_project": False, "snap_target": 'CLOSEST', "use_snap_self": True, "use_snap_edit": True, "use_snap_nonedit": True, "use_snap_selectable": False, "snap_point": (0, 0, 0), "snap_align": False, "snap_normal": (0, 0, 0), "gpencil_strokes": False, "cursor_transform": False, "texture_space": False, "remove_on_cancel": False, "view2d_edge_pan": False, "release_confirm": False, "use_accurate": False, "use_automerge_and_split": False}) bpy.ops.mesh.select_all(action='DESELECT') # ----- Raising The Tread Pattern Completed ----- # Now Bend The Right Side To give the curvature of Tyre Sides bpy.ops.mesh.select_mode(use_extend=False, use_expand=False, type='EDGE') mesh.edges.ensure_lookup_table() mesh.edges[42].select = True bpy.ops.transform.translate(value=(-0.00823739, -0.00352754, -0.230691), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=True, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) mesh.edges[42].select = False # Slecting Edges To Bend edges = mesh.edges[:] selected_edges_indices = [8, 10] selected_edges = [edges[index] for index in selected_edges_indices] for edge in selected_edges: edge.select = True bpy.ops.mesh.extrude_region_move(MESH_OT_extrude_region={"use_normal_flip": False, "use_dissolve_ortho_edges": False, "mirror": False}, TRANSFORM_OT_translate={"value": (-0.13444, 0.114647, -0.131293), "orient_type": 'GLOBAL', "orient_matrix": ((1, 0, 0), (0, 1, 0), (0, 0, 1)), "orient_matrix_type": 'GLOBAL', "constraint_axis": (False, False, False), "mirror": False, "use_proportional_edit": False, "proportional_edit_falloff": 'SMOOTH', "proportional_size": 1, "use_proportional_connected": False, "use_proportional_projected": False, "snap": False, "snap_elements": {'INCREMENT'}, "use_snap_project": False, "snap_target": 'CLOSEST', "use_snap_self": True, "use_snap_edit": True, "use_snap_nonedit": True, "use_snap_selectable": False, "snap_point": (0, 0, 0), "snap_align": False, "snap_normal": (0, 0, 0), "gpencil_strokes": False, "cursor_transform": False, "texture_space": False, "remove_on_cancel": False, "view2d_edge_pan": False, "release_confirm": False, "use_accurate": False, "use_automerge_and_split": False}) bpy.ops.mesh.extrude_region_move(MESH_OT_extrude_region={"use_normal_flip": False, "use_dissolve_ortho_edges": False, "mirror": False}, TRANSFORM_OT_translate={"value": (-0.0292257, 0.010511, -0.141693), "orient_type": 'GLOBAL', "orient_matrix": ((1, 0, 0), (0, 1, 0), (0, 0, 1)), "orient_matrix_type": 'GLOBAL', "constraint_axis": (False, False, False), "mirror": False, "use_proportional_edit": False, "proportional_edit_falloff": 'SMOOTH', "proportional_size": 1, "use_proportional_connected": False, "use_proportional_projected": False, "snap": False, "snap_elements": {'INCREMENT'}, "use_snap_project": False, "snap_target": 'CLOSEST', "use_snap_self": True, "use_snap_edit": True, "use_snap_nonedit": True, "use_snap_selectable": False, "snap_point": (0, 0, 0), "snap_align": False, "snap_normal": (0, 0, 0), "gpencil_strokes": False, "cursor_transform": False, "texture_space": False, "remove_on_cancel": False, "view2d_edge_pan": False, "release_confirm": False, "use_accurate": False, "use_automerge_and_split": False}) bpy.ops.mesh.extrude_region_move(MESH_OT_extrude_region={"use_normal_flip": False, "use_dissolve_ortho_edges": False, "mirror": False}, TRANSFORM_OT_translate={"value": (8.44495e-05, -0.0347722, -0.100592), "orient_type": 'GLOBAL', "orient_matrix": ((1, 0, 0), (0, 1, 0), (0, 0, 1)), "orient_matrix_type": 'GLOBAL', "constraint_axis": (False, False, False), "mirror": False, "use_proportional_edit": False, "proportional_edit_falloff": 'SMOOTH', "proportional_size": 1, "use_proportional_connected": False, "use_proportional_projected": False, "snap": False, "snap_elements": {'INCREMENT'}, "use_snap_project": False, "snap_target": 'CLOSEST', "use_snap_self": True, "use_snap_edit": True, "use_snap_nonedit": True, "use_snap_selectable": False, "snap_point": (0, 0, 0), "snap_align": False, "snap_normal": (0, 0, 0), "gpencil_strokes": False, "cursor_transform": False, "texture_space": False, "remove_on_cancel": False, "view2d_edge_pan": False, "release_confirm": False, "use_accurate": False, "use_automerge_and_split": False}) bpy.ops.mesh.select_all(action='DESELECT') bpy.ops.object.editmode_toggle() # Add Modifier Of Array To Multiply Selected Treaded Pattern select_object("Plane") bpy.ops.object.modifier_add(type='ARRAY') bpy.context.object.modifiers["Array"].use_relative_offset = False bpy.context.object.modifiers["Array"].use_constant_offset = True bpy.context.object.modifiers["Array"].use_merge_vertices = True bpy.context.object.modifiers["Array"].use_merge_vertices_cap = True # Add Circle On Which Plane Will Be Pojected bpy.ops.curve.primitive_bezier_circle_add( radius=1, enter_editmode=False, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1)) bpy.ops.transform.rotate(value=1.5708, orient_axis='X', orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', constraint_axis=(True, False, False), mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) bpy.ops.transform.resize(value=(7.31203, 7.31203, 7.31203), orient_type='GLOBAL', orient_matrix=((1, 0, 0), (0, 1, 0), (0, 0, 1)), orient_matrix_type='GLOBAL', mirror=False, use_proportional_edit=False, proportional_edit_falloff='SMOOTH', proportional_size=1, use_proportional_connected=False, use_proportional_projected=False, snap=False, snap_elements={'INCREMENT'}, use_snap_project=False, snap_target='CLOSEST', use_snap_self=True, use_snap_edit=True, use_snap_nonedit=True, use_snap_selectable=False) bpy.ops.object.mode_set(mode='OBJECT') select_object("Plane") bpy.ops.object.modifier_add(type='CURVE') # Curve The Plane to Circle and increase its number bpy.context.object.modifiers["Curve"].object = bpy.data.objects["BezierCircle"] bpy.context.object.modifiers["Array"].count = 46 # Add Mirror of Object bpy.ops.object.modifier_add(type='MIRROR') bpy.context.object.modifiers["Mirror"].use_axis[1] = True bpy.context.object.modifiers["Mirror"].use_axis[0] = False # Specify the output file path for the X3D file output_path = r"C:\Users\MAB\Downloads\tyre.x3d" # Export the selected object(s) as an X3D file bpy.ops.export_scene.x3d( filepath=output_path, check_existing=True, filter_glob="*.x3d", use_selection=True, # Export only the selected object(s) use_mesh_modifiers=True, # Apply modifiers to the mesh before exporting # use_triangles=True, # Export triangles instead of quads use_normals=True, # Export normals # use_embedded_textures=False, # Embed textures in the X3D file (True) or save them separately (False) # use_materials=True, # Export materials # use_vertex_colors=True, # Export vertex colors # use_blen_objects=True, # Export Blender objects as X3D objects # use_blen_materials=True, # Export Blender materials as X3D materials # use_blen_lights=True, # Export Blender lights as X3D lights # use_blen_cameras=True, # Export Blender cameras as X3D viewpoints axis_forward='-Z', # Set the forward axis (change if needed) axis_up='Y', # Set the up axis (change if needed) ) print(f"X3D file saved to : ", output_path)