[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