diff options
author | meta-androcto <meta.androcto1@gmail.com> | 2016-08-03 03:10:18 +0300 |
---|---|---|
committer | meta-androcto <meta.androcto1@gmail.com> | 2016-08-03 03:10:18 +0300 |
commit | 5cd9040c995effc4c6bf233e820f741cbaf083ca (patch) | |
tree | 52571f0ec0726b6ea067db4a2eba14e939188f27 /archimesh/achm_lamp_maker.py | |
parent | 867ce6317b64a342ed0658702bed687fd3d087d7 (diff) |
move archimesh to release re: T37230
Diffstat (limited to 'archimesh/achm_lamp_maker.py')
-rw-r--r-- | archimesh/achm_lamp_maker.py | 786 |
1 files changed, 786 insertions, 0 deletions
diff --git a/archimesh/achm_lamp_maker.py b/archimesh/achm_lamp_maker.py new file mode 100644 index 00000000..2b2b8855 --- /dev/null +++ b/archimesh/achm_lamp_maker.py @@ -0,0 +1,786 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# <pep8 compliant> + +# ---------------------------------------------------------- +# Automatic generation of lamps +# Author: Antonio Vazquez (antonioya) +# +# ---------------------------------------------------------- +import bpy +import math +import copy +from achm_tools import * + + +# ------------------------------------------------------ +# set predefined designs +# +# self: self container +# ------------------------------------------------------ +def set_preset(self): + # ----------------------- + # Sphere + # ----------------------- + if self.preset == "1": + self.base_height = 0.22 + self.base_segments = 16 + self.base_rings = 6 + self.smooth = True + self.subdivide = True + self.br01 = 0.05 + self.br02 = 0.07 + self.br03 = 0.11 + self.br04 = 0.11 + self.br05 = 0.07 + self.br06 = 0.03 + + self.bz01 = 0 + self.bz02 = -1 + self.bz03 = -0.456 + self.bz04 = 0.089 + self.bz05 = -0.038 + self.bz06 = -0.165 + # ----------------------- + # Pear + # ----------------------- + if self.preset == "2": + self.base_height = 0.20 + self.base_segments = 16 + self.base_rings = 6 + self.smooth = True + self.subdivide = True + self.br01 = 0.056 + self.br02 = 0.062 + self.br03 = 0.072 + self.br04 = 0.090 + self.br05 = 0.074 + self.br06 = 0.03 + + self.bz01 = 0 + self.bz02 = 0 + self.bz03 = 0 + self.bz04 = 0 + self.bz05 = 0 + self.bz06 = 0 + # ----------------------- + # Vase + # ----------------------- + if self.preset == "3": + self.base_height = 0.20 + self.base_segments = 8 + self.base_rings = 6 + self.smooth = True + self.subdivide = True + self.br01 = 0.05 + self.br02 = 0.11 + self.br03 = 0.15 + self.br04 = 0.07 + self.br05 = 0.05 + self.br06 = 0.03 + + self.bz01 = 0 + self.bz02 = 0 + self.bz03 = 0 + self.bz04 = 0 + self.bz05 = 0 + self.bz06 = 0 + # ----------------------- + # Rectangular + # ----------------------- + if self.preset == "4": + self.base_height = 0.15 + self.base_segments = 4 + self.base_rings = 5 + self.smooth = False + self.subdivide = False + self.br01 = 0.08 + self.br02 = 0.08 + self.br03 = 0.08 + self.br04 = 0.08 + self.br05 = 0.03 + + self.bz01 = 0 + self.bz02 = 0 + self.bz03 = 0 + self.bz04 = 0.25 + self.bz05 = 0 + + +# ------------------------------------------------------------------ +# Define UI class +# Lamps +# ------------------------------------------------------------------ +class AchmLamp(bpy.types.Operator): + bl_idname = "mesh.archimesh_lamp" + bl_label = "Lamp" + bl_description = "Lamp Generator" + bl_category = 'Archimesh' + bl_options = {'REGISTER', 'UNDO'} + # preset + preset = bpy.props.EnumProperty( + items=( + ('0', "None", ""), + ('1', "Sphere", ""), + ('2', "Pear", ""), + ('3', "Vase", ""), + ('4', "Rectangular", ""), + ), + name="Predefined", + description="Apply predefined design", + ) + oldpreset = preset + + base_height = bpy.props.FloatProperty( + name='Height', + min=0.01, max=10, default=0.20, precision=3, + description='lamp base height', + ) + base_segments = bpy.props.IntProperty( + name='Segments', + min=3, max=128, default=16, + description='Number of segments (vertical)', + ) + base_rings = bpy.props.IntProperty( + name='Rings', + min=2, max=12, default=6, + description='Number of rings (horizontal)', + ) + holder = bpy.props.FloatProperty( + name='Lampholder', + min=0.001, max=10, default=0.02, precision=3, + description='Lampholder height', + ) + smooth = bpy.props.BoolProperty( + name="Smooth", + description="Use smooth shader", + default=True, + ) + subdivide = bpy.props.BoolProperty( + name="Subdivide", + description="Add subdivision modifier", + default=True, + ) + + bz01 = bpy.props.FloatProperty(name='S1', min=-1, max=1, default=0, precision=3, description='Z shift factor') + bz02 = bpy.props.FloatProperty(name='S2', min=-1, max=1, default=0, precision=3, description='Z shift factor') + bz03 = bpy.props.FloatProperty(name='S3', min=-1, max=1, default=0, precision=3, description='Z shift factor') + bz04 = bpy.props.FloatProperty(name='S4', min=-1, max=1, default=0, precision=3, description='Z shift factor') + bz05 = bpy.props.FloatProperty(name='S5', min=-1, max=1, default=0, precision=3, description='Z shift factor') + bz06 = bpy.props.FloatProperty(name='S6', min=-1, max=1, default=0, precision=3, description='Z shift factor') + bz07 = bpy.props.FloatProperty(name='S7', min=-1, max=1, default=0, precision=3, description='Z shift factor') + bz08 = bpy.props.FloatProperty(name='S8', min=-1, max=1, default=0, precision=3, description='Z shift factor') + bz09 = bpy.props.FloatProperty(name='S9', min=-1, max=1, default=0, precision=3, description='Z shift factor') + bz10 = bpy.props.FloatProperty(name='S10', min=-1, max=1, default=0, precision=3, description='Z shift factor') + bz11 = bpy.props.FloatProperty(name='S11', min=-1, max=1, default=0, precision=3, description='Z shift factor') + bz12 = bpy.props.FloatProperty(name='S12', min=-1, max=1, default=0, precision=3, description='Z shift factor') + + br01 = bpy.props.FloatProperty(name='R1', min=0.001, max=10, default=0.06, precision=3, description='Ring radio') + br02 = bpy.props.FloatProperty(name='R2', min=0.001, max=10, default=0.08, precision=3, description='Ring radio') + br03 = bpy.props.FloatProperty(name='R3', min=0.001, max=10, default=0.09, precision=3, description='Ring radio') + br04 = bpy.props.FloatProperty(name='R4', min=0.001, max=10, default=0.08, precision=3, description='Ring radio') + br05 = bpy.props.FloatProperty(name='R5', min=0.001, max=10, default=0.06, precision=3, description='Ring radio') + br06 = bpy.props.FloatProperty(name='R6', min=0.001, max=10, default=0.03, precision=3, description='Ring radio') + br07 = bpy.props.FloatProperty(name='R7', min=0.001, max=10, default=0.10, precision=3, description='Ring radio') + br08 = bpy.props.FloatProperty(name='R8', min=0.001, max=10, default=0.10, precision=3, description='Ring radio') + br09 = bpy.props.FloatProperty(name='R9', min=0.001, max=10, default=0.10, precision=3, description='Ring radio') + br10 = bpy.props.FloatProperty(name='R10', min=0.001, max=10, default=0.10, precision=3, description='Ring radio') + br11 = bpy.props.FloatProperty(name='R11', min=0.001, max=10, default=0.10, precision=3, description='Ring radio') + br12 = bpy.props.FloatProperty(name='R12', min=0.001, max=10, default=0.10, precision=3, description='Ring radio') + + top_height = bpy.props.FloatProperty( + name='Height', min=0.01, max=10, + default=0.20, precision=3, + description='lampshade height', + ) + top_segments = bpy.props.IntProperty( + name='Segments', min=3, max=128, + default=32, + description='Number of segments (vertical)', + ) + tr01 = bpy.props.FloatProperty( + name='R1', min=0.001, max=10, + default=0.16, precision=3, + description='lampshade bottom radio', + ) + tr02 = bpy.props.FloatProperty(name='R2', min=0.001, max=10, + default=0.08, precision=3, + description='lampshade top radio') + pleats = bpy.props.BoolProperty( + name="Pleats", description="Create pleats in the lampshade", + default=False, + ) + tr03 = bpy.props.FloatProperty( + name='R3', min=0.001, max=1, + default=0.01, precision=3, description='Pleats size', + ) + energy = bpy.props.FloatProperty( + name='Light', min=0.00, max=1000, + default=15, precision=3, + description='Light intensity', + ) + opacity = bpy.props.FloatProperty( + name='Translucency', min=0.00, max=1, + default=0.3, precision=3, + description='Lampshade translucency factor (1 completely translucent)', + ) + + # Materials + crt_mat = bpy.props.BoolProperty( + name="Create default Cycles materials", + description="Create default materials for Cycles render", + default=True, + ) + objcol = bpy.props.FloatVectorProperty( + name="Color", + description="Color for material", + default=(1.0, 1.0, 1.0, 1.0), + min=0.1, max=1, + subtype='COLOR', + size=4, + ) + + # ----------------------------------------------------- + # Draw (create UI interface) + # ----------------------------------------------------- + # noinspection PyUnusedLocal + def draw(self, context): + layout = self.layout + space = bpy.context.space_data + if not space.local_view: + # Imperial units warning + if bpy.context.scene.unit_settings.system == "IMPERIAL": + row = layout.row() + row.label("Warning: Imperial units not supported", icon='COLOR_RED') + + box = layout.box() + box.label("Lamp base") + row = box.row() + row.prop(self, 'preset') + row = box.row() + row.prop(self, 'base_height') + row.prop(self, 'base_segments') + row.prop(self, 'base_rings') + row = box.row() + row.prop(self, 'smooth') + row.prop(self, 'subdivide') + row = box.row() + row.prop(self, 'holder') + + if self.base_rings >= 1: + row = box.row() + row.prop(self, 'br01') + row.prop(self, 'bz01', slider=True) + if self.base_rings >= 2: + row = box.row() + row.prop(self, 'br02') + row.prop(self, 'bz02', slider=True) + if self.base_rings >= 3: + row = box.row() + row.prop(self, 'br03') + row.prop(self, 'bz03', slider=True) + + if self.base_rings >= 4: + row = box.row() + row.prop(self, 'br04') + row.prop(self, 'bz04', slider=True) + if self.base_rings >= 5: + row = box.row() + row.prop(self, 'br05') + row.prop(self, 'bz05', slider=True) + if self.base_rings >= 6: + row = box.row() + row.prop(self, 'br06') + row.prop(self, 'bz06', slider=True) + + if self.base_rings >= 7: + row = box.row() + row.prop(self, 'br07') + row.prop(self, 'bz07', slider=True) + if self.base_rings >= 8: + row = box.row() + row.prop(self, 'br08') + row.prop(self, 'bz08', slider=True) + if self.base_rings >= 9: + row = box.row() + row.prop(self, 'br09') + row.prop(self, 'bz09', slider=True) + + if self.base_rings >= 10: + row = box.row() + row.prop(self, 'br10') + row.prop(self, 'bz10', slider=True) + if self.base_rings >= 11: + row = box.row() + row.prop(self, 'br11') + row.prop(self, 'bz11', slider=True) + if self.base_rings >= 12: + row = box.row() + row.prop(self, 'br12') + row.prop(self, 'bz12', slider=True) + + box = layout.box() + box.label("Lampshade") + row = box.row() + row.prop(self, 'top_height') + row.prop(self, 'top_segments') + row = box.row() + row.prop(self, 'tr01') + row.prop(self, 'tr02') + row = box.row() + row.prop(self, 'energy') + row.prop(self, 'opacity', slider=True) + row = box.row() + row.prop(self, 'pleats') + if self.pleats: + row.prop(self, 'tr03') + + box = layout.box() + box.prop(self, 'crt_mat') + if self.crt_mat: + row = box.row() + row.prop(self, 'objcol') + else: + row = layout.row() + row.label("Warning: Operator does not work in local view mode", icon='ERROR') + + # ----------------------------------------------------- + # Execute + # ----------------------------------------------------- + # noinspection PyUnusedLocal + def execute(self, context): + if bpy.context.mode == "OBJECT": + if self.oldpreset != self.preset: + set_preset(self) + self.oldpreset = self.preset + + # Create lamp + create_lamp_mesh(self) + return {'FINISHED'} + else: + self.report({'WARNING'}, "Archimesh: Option only valid in Object mode") + return {'CANCELLED'} + + +# ------------------------------------------------------------------------------ +# Generate mesh data +# All custom values are passed using self container (self.myvariable) +# ------------------------------------------------------------------------------ +def create_lamp_mesh(self): + # deactivate others + for o in bpy.data.objects: + if o.select is True: + o.select = False + bpy.ops.object.select_all(False) + generate_lamp(self) + + return + + +# ------------------------------------------------------------------------------ +# Generate lamps +# All custom values are passed using self container (self.myvariable) +# ------------------------------------------------------------------------------ +def generate_lamp(self): + location = bpy.context.scene.cursor_location + myloc = copy.copy(location) # copy location to keep 3D cursor position + # --------------------- + # Lamp base + # --------------------- + mydata = create_lamp_base("Lamp_base", self.base_height, + myloc.x, myloc.y, myloc.z, + self.base_segments, self.base_rings, + [self.br01, self.br02, self.br03, self.br04, self.br05, self.br06, + self.br07, self.br08, self.br09, self.br10, self.br11, self.br12], + (self.bz01, self.bz02, self.bz03, self.bz04, self.bz05, self.bz06, + self.bz07, self.bz08, self.bz09, self.bz10, self.bz11, self.bz12), + self.subdivide, + self.crt_mat, self.objcol) + mybase = mydata[0] + posz = mydata[1] + # refine + remove_doubles(mybase) + set_normals(mybase) + # Smooth + if self.smooth: + set_smooth(mybase) + if self.subdivide: + set_modifier_subsurf(mybase) + # --------------------- + # Lampholder + # --------------------- + myholder = create_lampholder("Lampholder", self.holder, + myloc.x, myloc.y, myloc.z, + self.crt_mat) + # refine + remove_doubles(myholder) + set_normals(myholder) + set_smooth(myholder) + + myholder.parent = mybase + myholder.location.x = 0 + myholder.location.y = 0 + myholder.location.z = posz + # --------------------- + # Lamp strings + # --------------------- + mystrings = create_lampholder_strings("Lampstrings", self.holder, + myloc.x, myloc.y, myloc.z, + self.tr02, + self.top_height, + self.crt_mat) + # refine + remove_doubles(mystrings) + set_normals(mystrings) + + mystrings.parent = myholder + mystrings.location.x = 0 + mystrings.location.y = 0 + mystrings.location.z = 0.03 + # --------------------- + # Lampshade + # --------------------- + mytop = create_lampshade("Lampshade", self.top_height, + myloc.x, myloc.y, myloc.z, + self.top_segments, + self.tr01, self.tr02, + self.pleats, self.tr03, + self.opacity, + self.crt_mat) + # refine + remove_doubles(mytop) + set_normals(mytop) + if self.pleats is False: + set_smooth(mytop) + + mytop.parent = mybase + mytop.location.x = 0 + mytop.location.y = 0 + mytop.location.z = posz + self.holder + # --------------------- + # Light bulb + # --------------------- + radbulb = 0.02 + bpy.ops.mesh.primitive_uv_sphere_add(segments=16, size=radbulb) + mybulb = bpy.data.objects[bpy.context.active_object.name] + mybulb.name = "Lamp_Bulb" + mybulb.parent = myholder + mybulb.location = (0, 0, radbulb + self.holder + 0.04) + if self.crt_mat: + mat = create_emission_material(mybulb.name, True, 0.8, 0.8, 0.8, self.energy) + set_material(mybulb, mat) + + # deactivate others + for o in bpy.data.objects: + if o.select is True: + o.select = False + + mybase.select = True + bpy.context.scene.objects.active = mybase + + return + + +# ------------------------------------------------------------------------------ +# Create lamp base +# +# objName: Name for the new object +# height: Size in Z axis +# pX: position X axis +# pY: position Y axis +# pZ: position Z axis +# segments: number of segments +# rings: number of rings +# radios: ring radios +# ratios: Z shift ratios +# subdivide: Subdivision flag +# mat: Flag for creating materials +# objcol: Color +# ------------------------------------------------------------------------------ +def create_lamp_base(objname, height, px, py, pz, segments, rings, radios, ratios, subdivide, mat, objcol): + # Calculate heights + h = height / (rings - 1) + listheight = [] + z = 0 + for f in range(0, rings): + listheight.extend([z + (z * ratios[f])]) + z += h + + mydata = create_cylinder_data(segments, listheight, + radios, + True, True, False, 0, subdivide) + myvertex = mydata[0] + myfaces = mydata[1] + + mymesh = bpy.data.meshes.new(objname) + mycylinder = bpy.data.objects.new(objname, mymesh) + bpy.context.scene.objects.link(mycylinder) + + mymesh.from_pydata(myvertex, [], myfaces) + mymesh.update(calc_edges=True) + # Position + mycylinder.location.x = px + mycylinder.location.y = py + mycylinder.location.z = pz + # Materials + if mat: + rgb = objcol + mymat = create_diffuse_material(mycylinder.name + "_material", True, rgb[0], rgb[1], rgb[2], rgb[0], rgb[1], + rgb[2], 0.1) + set_material(mycylinder, mymat) + + return mycylinder, listheight[len(listheight) - 1] + + +# ------------------------------------------------------------------------------ +# Create lampholder +# +# objName: Name for the new object +# height: Size in Z axis +# pX: position X axis +# pY: position Y axis +# pZ: position Z axis +# mat: Flag for creating materials +# ------------------------------------------------------------------------------ +def create_lampholder(objname, height, px, py, pz, mat): + mydata = create_cylinder_data(16, [0, height, height + 0.005, height + 0.008, height + 0.05], + [0.005, 0.005, 0.010, 0.018, 0.018], + False, False, False, 0, False) + myvertex = mydata[0] + myfaces = mydata[1] + + mymesh = bpy.data.meshes.new(objname) + mycylinder = bpy.data.objects.new(objname, mymesh) + bpy.context.scene.objects.link(mycylinder) + + mymesh.from_pydata(myvertex, [], myfaces) + mymesh.update(calc_edges=True) + # Position + mycylinder.location.x = px + mycylinder.location.y = py + mycylinder.location.z = pz + + # Materials + if mat: + mat = create_diffuse_material(mycylinder.name + "_material", True, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.1) + set_material(mycylinder, mat) + + return mycylinder + + +# ------------------------------------------------------------------------------ +# Create lampholder strings +# +# objName: Name for the new object +# height: Size in Z axis +# pX: position X axis +# pY: position Y axis +# pZ: position Z axis +# radio: radio of lampshade +# shadeh: height of lampshader +# mat: Flag for creating materials +# ------------------------------------------------------------------------------ +def create_lampholder_strings(objname, height, px, py, pz, radio, shadeh, mat): + mydata = create_cylinder_data(32, [height + 0.005, height + 0.005, height + 0.006, height + 0.006], + [0.018, 0.025, 0.025, 0.018], + False, False, False, 0, False) + myvertex = mydata[0] + myfaces = mydata[1] + + mymesh = bpy.data.meshes.new(objname) + mycylinder = bpy.data.objects.new(objname, mymesh) + bpy.context.scene.objects.link(mycylinder) + + mymesh.from_pydata(myvertex, [], myfaces) + mymesh.update(calc_edges=True) + # Position + mycylinder.location.x = px + mycylinder.location.y = py + mycylinder.location.z = pz + # Box1 + box1 = create_box_segments("Lamp_B1", shadeh - 0.036, radio - 0.023) + box1.parent = mycylinder + box1.location = (0.021, 0, height + 0.004) + # Box2 + box2 = create_box_segments("Lamp_B2", shadeh - 0.036, -radio + 0.023) + box2.parent = mycylinder + box2.location = (-0.021, 0, height + 0.004) + + # Materials + if mat: + mat = create_diffuse_material(mycylinder.name + "_material", True, 0.8, 0.8, 0.8, 0.8, 0.8, 0.8, 0.1) + set_material(mycylinder, mat) + set_material(box1, mat) + set_material(box2, mat) + + return mycylinder + + +# ------------------------------------------------------------------------------ +# Create lampshade +# +# objName: Name for the new object +# height: Size in Z axis +# pX: position X axis +# pY: position Y axis +# pZ: position Z axis +# segments: number of segments +# radio1: ring radio 1 +# radio2: ring radio 2 +# pleats: flag for pleats +# pleatsize: difference in radios (less) +# opacity: opacity factor +# mat: Flag for creating materials +# ------------------------------------------------------------------------------ +def create_lampshade(objname, height, px, py, pz, segments, radio1, radio2, pleats, pleatsize, opacity, mat): + gap = 0.002 + radios = [radio1 - gap, radio1 - gap, radio1, radio2, radio2 - gap, radio2 - gap] + heights = [gap * 2, 0, 0, height, height, height - (gap * 2)] + mydata = create_cylinder_data(segments, heights, + radios, + False, False, pleats, pleatsize, False) + myvertex = mydata[0] + myfaces = mydata[1] + + mymesh = bpy.data.meshes.new(objname) + mycylinder = bpy.data.objects.new(objname, mymesh) + bpy.context.scene.objects.link(mycylinder) + + mymesh.from_pydata(myvertex, [], myfaces) + mymesh.update(calc_edges=True) + # Position + mycylinder.location.x = px + mycylinder.location.y = py + mycylinder.location.z = pz + # materials + if mat: + mymat = create_translucent_material(mycylinder.name + "_material", True, 0.8, 0.65, 0.45, 0.8, 0.65, 0.45, + opacity) + set_material(mycylinder, mymat) + + return mycylinder + + +# ------------------------------------------------------------------------------ +# Create box segments +# +# objName: Name for the new object +# height: Size in Z axis +# shift: Shift movement +# ------------------------------------------------------------------------------ +def create_box_segments(objname, height, shift): + gap = 0.001 + myvertex = [(0, 0, 0), (0, gap, 0), (gap, gap, 0), (gap, 0, 0), + (shift, 0, height), + (shift, gap, height), + (shift + gap, gap, height), + (shift + gap, 0, height)] + myfaces = [(6, 5, 1, 2), (7, 6, 2, 3), (4, 7, 3, 0), (1, 5, 4, 0)] + + mymesh = bpy.data.meshes.new(objname) + mysegment = bpy.data.objects.new(objname, mymesh) + bpy.context.scene.objects.link(mysegment) + + mymesh.from_pydata(myvertex, [], myfaces) + mymesh.update(calc_edges=True) + # Position + mysegment.location.x = 0 + mysegment.location.y = 0 + mysegment.location.z = 0 + + return mysegment + + +# ------------------------------------------------------------------------------ +# Create cylinders data +# +# segments: Number of pies +# listHeight: list of heights +# listRadio: list of radios +# top: top face flag +# bottom: bottom face flag +# pleats: flag for pleats +# pleatsize: difference in radios (less) +# subdiv: fix subdivision problem +# ------------------------------------------------------------------------------ +def create_cylinder_data(segments, listheight, listradio, bottom, top, pleats, pleatsize, subdiv): + myvertex = [] + myfaces = [] + if subdiv: + # Add at element 0 to fix subdivision problems + listheight.insert(0, listheight[0] + 0.001) + listradio.insert(0, listradio[0]) + # Add at last element to fix subdivision problems + e = len(listheight) - 1 + listheight.insert(e, listheight[e] + 0.001) + listradio.insert(e, listradio[e]) + # ------------------------------------- + # Vertices + # ------------------------------------- + idx = 0 + rp = 0 + for z in listheight: + seg = 0 + for i in range(segments): + x = math.cos(math.radians(seg)) * (listradio[idx] + rp) + y = math.sin(math.radians(seg)) * (listradio[idx] + rp) + mypoint = [(x, y, z)] + myvertex.extend(mypoint) + seg += 360 / segments + # pleats + if pleats is True and rp == 0: + rp = -pleatsize + else: + rp = 0 + + idx += 1 + # ------------------------------------- + # Faces + # ------------------------------------- + for r in range(0, len(listheight) - 1): + s = r * segments + t = 1 + for n in range(0, segments): + t += 1 + if t > segments: + t = 1 + myface = [(n + s, n + s - segments + 1, n + s + 1, n + s + segments)] + myfaces.extend(myface) + else: + myface = [(n + s, n + s + 1, n + s + segments + 1, n + s + segments)] + myfaces.extend(myface) + + # ----------------- + # bottom face + # ----------------- + if bottom: + fa = [] + for f in range(0, segments): + fa.extend([f]) + myfaces.extend([fa]) + # ----------------- + # top face + # ----------------- + if top: + fa = [] + for f in range(len(myvertex) - segments, len(myvertex)): + fa.extend([f]) + myfaces.extend([fa]) + + return myvertex, myfaces |