import bpy from mathutils import Vector, Euler import bmesh import math def NormalInDirection(normal, direction, limit = 0.99): return abs(direction.dot( normal )) > limit def UpOrDown(normal): up = NormalInDirection(normal, Vector((0.0, 0.0, 1.0)), limit = 0.99) down = NormalInDirection(normal, Vector((0.0, 0.0, -1.0)), limit = 0.99) if up or down: return True return False def generate_pendant_shade(shape_parameters): radius = shape_parameters["radius"] depth = shape_parameters["height"] print(depth) bpy.ops.mesh.primitive_cylinder_add(radius=radius, depth=depth) cone = bpy.data.objects["Cylinder"] cone.name = "shade" bpy.ops.object.mode_set(mode='EDIT') num_subdivisions = 3 if len(shape_parameters["division_offsets"])>3: num_subdivisions = 4 for idx in range(num_subdivisions): bpy.ops.mesh.subdivide() bm = bmesh.from_edit_mesh(cone.data) num_verts = len(bm.verts) summed_offset = 0.0 for jdx in range(len(shape_parameters["division_offsets"])): summed_offset += shape_parameters["division_offsets"][jdx] for idx in range(num_verts): bm.verts.ensure_lookup_table() vert = bm.verts[idx] theta = math.atan2(vert.co.x, vert.co.y) vert.co.z = vert.co.z -depth/2.0 delta = abs(vert.co.z) frac = delta/depth summed_offset = 0.0 prev_offset = 0.0 division_index = len(shape_parameters["division_offsets"])-1 for jdx in range(len(shape_parameters["division_offsets"])): prev_offset = summed_offset summed_offset += shape_parameters["division_offsets"][jdx] if frac >=prev_offset and frac <= summed_offset: division_index = jdx current_offset = shape_parameters["division_offsets"][division_index] division_type = shape_parameters["division_patterns"][division_index] if division_index==0: division_radius = shape_parameters["fixture_radius"] previous_offset = 0.0 previous_radius = division_radius else: division_radius = shape_parameters["radius"]*shape_parameters["division_radii"][division_index] previous_offset = shape_parameters["division_offsets"][division_index-1] previous_radius = shape_parameters["radius"]*shape_parameters["division_radii"][division_index-1] if previous_radius< shape_parameters["fixture_radius"]: previous_radius = shape_parameters["fixture_radius"] if division_radius