import bpy import math # Clear existing objects bpy.ops.object.select_all(action='SELECT') bpy.ops.object.delete() def create_band(radius, width, thickness): bpy.ops.mesh.primitive_cylinder_add( radius=radius, depth=width, vertices=64 ) band = bpy.context.active_object bpy.ops.object.mode_set(mode='EDIT') bpy.ops.mesh.select_all(action='SELECT') bpy.ops.mesh.normals_make_consistent(inside=False) bpy.ops.object.mode_set(mode='OBJECT') # Create thickness bpy.ops.object.modifier_add(type='SOLIDIFY') band.modifiers["Solidify"].thickness = thickness band.modifiers["Solidify"].offset = 0 return band def create_component(size, location): bpy.ops.mesh.primitive_cube_add(size=1, location=location) component = bpy.context.active_object component.scale = size return component # Create main band main_band = create_band(radius=0.1, width=0.15, thickness=0.01) main_band.location = (0, 0, 0) # Create sensor sensor = create_component(size=(0.02, 0.02, 0.01), location=(0.09, 0, 0)) # Create vibration motor motor = create_component(size=(0.03, 0.03, 0.02), location=(0.09, 0.04, 0)) # Create microcontroller microcontroller = create_component(size=(0.05, 0.05, 0.01), location=(0, 0.09, 0)) # Create battery battery = create_component(size=(0.06, 0.04, 0.02), location=(-0.08, 0.05, 0)) # Join all objects objects_to_join = [main_band, sensor, motor, microcontroller, battery] bpy.ops.object.select_all(action='DESELECT') for obj in objects_to_join: obj.select_set(True) bpy.context.view_layer.objects.active = main_band bpy.ops.object.join() # Add subdivision surface modifier for smoothing bpy.ops.object.modifier_add(type='SUBSURF') bpy.context.object.modifiers["Subdivision"].render_levels = 2 bpy.context.object.modifiers["Subdivision"].levels = 2 # Add material material = bpy.data.materials.new(name="DeviceMaterial") material.use_nodes = True bpy.context.active_object.data.materials.append(material) # Set up basic color material.node_tree.nodes["Principled BSDF"].inputs["Base Color"].default_value = (0.8, 0.8, 0.8, 1) # Light gray material.node_tree.nodes["Principled BSDF"].inputs["Roughness"].default_value = 0.3