[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [638] trunk/py/scripts/addons/ add_mesh_archimedean_solids.py: * Added support for "Cuboctahedron"

Martin Buerbaum martin.buerbaum at gmx.at
Mon Apr 26 12:38:56 CEST 2010


Revision: 638
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-extensions&revision=638
Author:   pontiac
Date:     2010-04-26 12:38:55 +0200 (Mon, 26 Apr 2010)

Log Message:
-----------
* Added support for "Cuboctahedron"
* Added somne checks for input-parameters to prevent bad geometry.
* Use Vector(()) for all vertice coordinates.
* Documented some of the internal functions.
* Added invert_face_normal() to flip the normal of a face.

Modified Paths:
--------------
    trunk/py/scripts/addons/add_mesh_archimedean_solids.py

Modified: trunk/py/scripts/addons/add_mesh_archimedean_solids.py
===================================================================
--- trunk/py/scripts/addons/add_mesh_archimedean_solids.py	2010-04-25 19:40:06 UTC (rev 637)
+++ trunk/py/scripts/addons/add_mesh_archimedean_solids.py	2010-04-26 10:38:55 UTC (rev 638)
@@ -226,101 +226,12 @@
 
     return faces
 
+########################
 
-def add_rhombicuboctahedron(quad_size=sqrt(2.0) / (1.0 + sqrt(2) / 2.0)):
-    faces = []
-    verts = []
 
-    size = 2.0
-
-    # Top & bottom faces (quads)
-    face_top = []
-    face_bot = []
-    for z, up in [(size / 2.0, True), (-size / 2.0, False)]:
-        face = []
-        face.append(len(verts))
-        verts.append(Vector((quad_size / 2.0, quad_size / 2.0, z)))
-        face.append(len(verts))
-        verts.append(Vector((quad_size / 2.0, -quad_size / 2.0, z)))
-        face.append(len(verts))
-        verts.append(Vector((-quad_size / 2.0, -quad_size / 2.0, z)))
-        face.append(len(verts))
-        verts.append(Vector((-quad_size / 2.0, quad_size / 2.0, z)))
-
-        if up:
-            # Top face (quad)
-            face_top = face
-        else:
-            # Bottom face (quad)
-            face_bot = face
-
-    edgeloop_up = []
-    edgeloop_low = []
-    for z, up in [(quad_size / 2.0, True), (-quad_size / 2.0, False)]:
-        edgeloop = []
-
-        edgeloop.append(len(verts))
-        verts.append(Vector((size / 2.0, quad_size / 2.0, z)))
-        edgeloop.append(len(verts))
-        verts.append(Vector((size / 2.0, -quad_size / 2.0, z)))
-        edgeloop.append(len(verts))
-        verts.append(Vector((quad_size / 2.0, -size / 2.0, z)))
-        edgeloop.append(len(verts))
-        verts.append(Vector((-quad_size / 2.0, -size / 2.0, z)))
-        edgeloop.append(len(verts))
-        verts.append(Vector((-size / 2.0, -quad_size / 2.0, z)))
-        edgeloop.append(len(verts))
-        verts.append(Vector((-size / 2.0, quad_size / 2.0, z)))
-        edgeloop.append(len(verts))
-        verts.append(Vector((-quad_size / 2.0, size / 2.0, z)))
-        edgeloop.append(len(verts))
-        verts.append(Vector((quad_size / 2.0, size / 2.0, z)))
-
-        if up:
-            # Upper 8-sider
-            edgeloop_up = edgeloop
-        else:
-            # Lower 8-sider
-            edgeloop_low = edgeloop
-
-    face_top_idx = len(faces)
-    faces.append(face_top)
-    faces.append(face_bot)
-    faces_middle = createFaces(edgeloop_low, edgeloop_up, closed=True)
-    faces.extend(faces_middle)
-
-    # Upper Quads
-    faces.append([edgeloop_up[0], face_top[0], face_top[1], edgeloop_up[1]])
-    faces.append([edgeloop_up[2], face_top[1], face_top[2], edgeloop_up[3]])
-    faces.append([edgeloop_up[4], face_top[2], face_top[3], edgeloop_up[5]])
-    faces.append([edgeloop_up[6], face_top[3], face_top[0], edgeloop_up[7]])
-
-    # Upper Tris
-    faces.append([face_top[0], edgeloop_up[0], edgeloop_up[7]])
-    faces.append([face_top[1], edgeloop_up[2], edgeloop_up[1]])
-    faces.append([face_top[2], edgeloop_up[4], edgeloop_up[3]])
-    faces.append([face_top[3], edgeloop_up[6], edgeloop_up[5]])
-
-    # Lower Quads
-    faces.append([edgeloop_low[0], edgeloop_low[1], face_bot[1], face_bot[0]])
-    faces.append([edgeloop_low[2], edgeloop_low[3], face_bot[2], face_bot[1]])
-    faces.append([edgeloop_low[4], edgeloop_low[5], face_bot[3], face_bot[2]])
-    faces.append([edgeloop_low[6], edgeloop_low[7], face_bot[0], face_bot[3]])
-
-    # Lower Tris
-    faces.append([face_bot[0], edgeloop_low[7], edgeloop_low[0]])
-    faces.append([face_bot[1], edgeloop_low[1], edgeloop_low[2]])
-    faces.append([face_bot[2], edgeloop_low[3], edgeloop_low[4]])
-    faces.append([face_bot[3], edgeloop_low[5], edgeloop_low[6]])
-
-    # Invert face normal
-    f = faces[face_top_idx]
-    faces[face_top_idx] = [f[0]] + list(reversed(f[1:]))
-
-    return verts, faces
-
-
 # Returns the middle location of a _regular_ polygon.
+# verts ... List of vertex coordinates (Vector) used by the ngon.
+# ngon ... List of ngones (vertex indices of each ngon point)
 def get_polygon_center(verts, ngons):
     faces = []
 
@@ -341,10 +252,11 @@
     return verts, faces
 
 
+# v1 ... First vertex point (Vector)
+# v2 ... Second vertex point (Vector)
+# edgelength_middle .. Length of the middle section (va->vb)
+# (v1)----(va)---------------(vb)----(v2)
 def subdivide_edge_2_cuts(v1, v2, edgelength_middle):
-    v1 = Vector(v1)
-    v2 = Vector(v2)
-
     length = (v2 - v1).length
     vn = (v2 - v1).normalize()
 
@@ -356,17 +268,30 @@
     return (va, vb)
 
 
+# Invert the normal of a face.
+# Inverts the order of the vertices to change the normal direction of a face.
+def invert_face_normal(face):
+    return [face[0]] + list(reversed(face[1:]))
+
+########################
+
+
 def add_truncated_tetrahedron(hexagon_side=2.0 * sqrt(2.0) / 3.0,
     star_ngons=False):
+
+    if (hexagon_side < 0.0
+        or hexagon_side > 2.0 * sqrt(2.0)):
+        return None, None
+
     verts = []
     faces = []
 
     # Vertices of a simple Tetrahedron
     verts_tet = [
-        (1.0, 1.0, -1.0),    # tip 0
-        (-1.0, 1.0, 1.0),    # tip 1
-        (1.0, -1.0, 1.0),    # tip 2
-        (-1.0, -1.0, -1.0)]  # tip 3
+        Vector((1.0, 1.0, -1.0)),    # tip 0
+        Vector((-1.0, 1.0, 1.0)),    # tip 1
+        Vector((1.0, -1.0, 1.0)),    # tip 2
+        Vector((-1.0, -1.0, -1.0))]  # tip 3
 
     # Calculate truncated vertices
     tri0 = []
@@ -446,41 +371,319 @@
     return verts, faces
 
 
-class AddRhombicuboctahedron(bpy.types.Operator):
-    '''Add a mesh for a thombicuboctahedron.'''
-    bl_idname = 'mesh.primitive_thombicuboctahedron_add'
-    bl_label = 'Add Rhombicuboctahedron'
-    bl_description = 'Create a mesh for a thombicuboctahedron.'
-    bl_options = {'REGISTER', 'UNDO'}
+def add_cuboctahedron(octagon_side=0.0, star_ngons=False):
+    if (octagon_side > 2.0 or octagon_side < 0.0):
+        return None, None, None
 
-    # edit - Whether to add or update.
-    edit = BoolProperty(name='',
-        description='',
-        default=False,
-        options={'HIDDEN'})
-    quad_size = FloatProperty(name="Quad Size",
-        description="Size of the orthogonal quad faces.",
-        min=0.01,
-        max=1.99,
-        default=sqrt(2.0) / (1.0 + sqrt(2) / 2.0))
+    s = octagon_side
+    verts = []
+    faces = []
 
-    def execute(self, context):
-        props = self.properties
+    size = 2.0
 
-        verts, faces = add_rhombicuboctahedron(props.quad_size)
+    name = "Cuboctahedron"
+    if s == 0.0:
+        # Upper quad face
+        dist = z = size / 2.0
+        face_top = [len(verts), len(verts) + 1, len(verts) + 2, len(verts) + 3]
+        verts.append(Vector((dist, 0.0, z)))
+        verts.append(Vector((0.0, dist, z)))
+        verts.append(Vector((-dist, 0.0, z)))
+        verts.append(Vector((0.0, -dist, z)))
+        faces.append(face_top)
 
-        obj = create_mesh_object(context, verts, [], faces,
-            'Rhombicuboctahedron', props.edit)
+        # 4 vertices on the z=0.0 plane
+        z = 0.0
+        v_xp_yp = len(verts)
+        verts.append(Vector((dist, dist, z)))
+        v_xp_yn = len(verts)
+        verts.append(Vector((dist, -dist, z)))
+        v_xn_yn = len(verts)
+        verts.append(Vector((-dist, -dist, z)))
+        v_xn_yp = len(verts)
+        verts.append(Vector((-dist, dist, z)))
 
-        # Store 'recall' properties in the object.
-        recall_args_list = {
-            'edit': True,
-            'quad_size': props.quad_size}
-        store_recall_properties(obj, self, recall_args_list)
+        # Lower quad face
+        z = -size / 2.0
+        face_bot = [len(verts), len(verts) + 1, len(verts) + 2, len(verts) + 3]
+        verts.append((dist, 0.0, z))
+        verts.append((0.0, -dist, z))
+        verts.append((-dist, 0.0, z))
+        verts.append((0.0, dist, z))
+        faces.append(face_bot)
 
-        return {'FINISHED'}
+        # Last 4 faces
+        face_yp = [v_xp_yp, face_bot[3], v_xn_yp, face_top[1]]
+        face_yn = [v_xn_yn, face_bot[1], v_xp_yn, face_top[3]]
+        face_xp = [v_xp_yn, face_bot[0], v_xp_yp, face_top[0]]
+        face_xn = [v_xn_yp, face_bot[2], v_xn_yn, face_top[2]]
+        faces.extend([face_yp, face_yn, face_xp, face_xn])
 
+        # Tris top
+        tri_xp_yp_zp = [v_xp_yp, face_top[1], face_top[0]]
+        tri_xp_yn_zp = [v_xp_yn, face_top[0], face_top[3]]
+        tri_xn_yp_zp = [v_xn_yp, face_top[2], face_top[1]]
+        tri_xn_yn_zp = [v_xn_yn, face_top[3], face_top[2]]
+        faces.extend([tri_xp_yp_zp, tri_xp_yn_zp, tri_xn_yp_zp, tri_xn_yn_zp])
 
+        # Tris bottom
+        tri_xp_yp_zn = [v_xp_yn, face_bot[1], face_bot[0]]
+        tri_xp_yn_zn = [v_xp_yp, face_bot[0], face_bot[3]]
+        tri_xn_yp_zn = [v_xn_yn, face_bot[2], face_bot[1]]
+        tri_xn_yn_zn = [v_xn_yp, face_bot[3], face_bot[2]]
+        faces.extend([tri_xp_yp_zn, tri_xp_yn_zn, tri_xn_yp_zn, tri_xn_yn_zn])
+
+    else:
+        name = "TruncatedCube"
+
+        # Vertices of a simple Cube
+        verts_cube = [
+            Vector((1.0, 1.0, 1.0)),     # tip 0
+            Vector((1.0, -1.0, 1.0)),    # tip 1
+            Vector((-1.0, -1.0, 1.0)),   # tip 2
+            Vector((-1.0, 1.0, 1.0)),    # tip 3
+            Vector((1.0, 1.0, -1.0)),    # tip 4
+            Vector((1.0, -1.0, -1.0)),   # tip 5
+            Vector((-1.0, -1.0, -1.0)),  # tip 6
+            Vector((-1.0, 1.0, -1.0))]   # tip 7
+
+        tri_xp_yp_zp = []
+        tri_xp_yn_zp = []
+        tri_xn_yp_zp = []
+        tri_xn_yn_zp = []
+        tri_xp_yp_zn = []
+        tri_xp_yn_zn = []
+        tri_xn_yp_zn = []
+        tri_xn_yn_zn = []
+
+        # Prepare top & bottom octagons.
+        ngon_top = []
+        ngon_bot = []
+
+        # Top edges
+        va, vb = subdivide_edge_2_cuts(verts_cube[0], verts_cube[1], s)
+        va_idx, vb_idx = len(verts), len(verts) + 1
+        verts.extend([va, vb])
+        tri_xp_yp_zp.append(va_idx)
+        tri_xp_yn_zp.append(vb_idx)
+        ngon_top.extend([va_idx, vb_idx])
+        va, vb = subdivide_edge_2_cuts(verts_cube[1], verts_cube[2], s)
+        va_idx, vb_idx = len(verts), len(verts) + 1
+        verts.extend([va, vb])
+        tri_xp_yn_zp.append(va_idx)
+        tri_xn_yn_zp.append(vb_idx)
+        ngon_top.extend([va_idx, vb_idx])
+        va, vb = subdivide_edge_2_cuts(verts_cube[2], verts_cube[3], s)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-extensions-cvs mailing list