blender/release/scripts/mod_meshtools.py

179 lines
5.8 KiB
Python
Raw Normal View History

# +---------------------------------------------------------+
# | Copyright (c) 2001 Anthony D'Agostino |
# | http://ourworld.compuserve.com/homepages/scorpius |
# | scorpius@compuserve. |
# | September 28, 2002 |
# | Released under the Blender Artistic Licence (BAL) |
# | Import Export Suite v0.5 |
# +---------------------------------------------------------+
# | Common Functions For All Modules |
# +---------------------------------------------------------+
import Blender
import sys#, random, operator
import mod_flags
try:
import random, operator
# ===================================
# ==== Append Faces To Face List ====
# ===================================
def append_faces(mesh, faces, facesuv, uvcoords):
r = random.randrange(200, 255, 50)
g = random.randrange(100, 200, 50)
b = random.randrange(0, 100, 50)
for i in range(len(faces)):
if not i%100 and mod_flags.show_progress: Blender.Window.DrawProgressBar(float(i)/len(faces), "Generating Faces")
numfaceverts=len(faces[i])
if numfaceverts <= 4: # This face is a triangle or quad
face = Blender.NMesh.Face()
for j in range(numfaceverts):
index = faces[i][j]
face.v.append(mesh.verts[index])
if len(uvcoords) > 1:
uvidx = facesuv[i][j]
face.uv.append(uvcoords[uvidx])
face.mode = 0
#face.col = [Blender.NMesh.Col(r, g, b)]*4 # Random color
face.col = [Blender.NMesh.Col()]*4
mesh.faces.append(face)
else: # Triangulate n-sided convex polygon.
a, b, c = 0, 1, 2 # Indices of first triangle.
for j in range(numfaceverts-2): # Number of triangles in polygon.
face = Blender.NMesh.Face()
face.v.append(mesh.verts[faces[i][a]])
face.v.append(mesh.verts[faces[i][b]])
face.v.append(mesh.verts[faces[i][c]])
b = c; c += 1
mesh.faces.append(face)
#face.smooth = 1
# =====================================
# ==== Append Verts to Vertex List ====
# =====================================
def append_verts(mesh, verts, normals):
#print "Number of normals:", len(normals)
#print "Number of verts :", len(verts)
for i in range(len(verts)):
if not i%100 and mod_flags.show_progress: Blender.Window.DrawProgressBar(float(i)/len(verts), "Generating Verts")
x, y, z = verts[i]
mesh.verts.append(Blender.NMesh.Vert(x, y, z))
if normals:
mesh.verts[i].no[0] = normals[i][0]
mesh.verts[i].no[1] = normals[i][1]
mesh.verts[i].no[2] = normals[i][2]
# =============================
# ==== Create Blender Mesh ====
# =============================
def create_mesh(verts, faces, objname, facesuv=[], uvcoords=[], normals=[]):
if normals: normal_flag = 0
else: normal_flag = 1
mesh = Blender.NMesh.GetRaw()
append_verts(mesh, verts, normals)
append_faces(mesh, faces, facesuv, uvcoords)
if not mod_flags.overwrite_mesh_name:
objname = versioned_name(objname)
Blender.NMesh.PutRaw(mesh, objname, normal_flag) # Name the Mesh
Blender.Object.GetSelected()[0].name=objname # Name the Object
Blender.Redraw()
except ImportError: pass
# ================================
# ==== Increment Name Version ====
# ================================
def versioned_name(objname):
existing_names = []
for object in Blender.Object.Get():
existing_names.append(object.name)
existing_names.append(object.data.name)
if objname in existing_names: # don't over-write other names
try:
name, ext = objname.split('.')
except ValueError:
name, ext = objname, ''
try:
num = int(ext)
root = name
except ValueError:
root = objname
for i in xrange(1, 1000):
objname = "%s.%03d" % (root, i)
if objname not in existing_names:
break
return objname
# =============================
# ==== Print Text In A Box ====
# =============================
def print_boxed(text):
lines = text.splitlines()
maxlinelen = max(map(len, lines))
print '+-' + '-'*maxlinelen + '-+'
for line in lines: print '| ' + line.ljust(maxlinelen) + ' |'
print '+-' + '-'*maxlinelen + '-+'
print '\a\r', # beep when done
# =================================================
# ==== Get Euler Angles From A Rotation Matrix ====
# =================================================
#def mat2euler(mat):
# angle_y = -math.asin(mat[0][2])
# c = math.cos(angle_y)
# if math.fabs(c) > 0.005:
# angle_x = math.atan2(mat[1][2]/c, mat[2][2]/c)
# angle_z = math.atan2(mat[0][1]/c, mat[0][0]/c)
# else:
# angle_x = 0.0
# angle_z = -math.atan2(mat[1][0], mat[1][1])
# return (angle_x, angle_y, angle_z)
# ============================
# ==== Transpose A Matrix ====
# ============================
def transpose(A):
S = len(A)
T = len(A[0])
B = [[None]*S for i in range(T)]
for i in range(T):
for j in range(S):
B[i][j] = A[j][i]
return B
#def append_ntimes(Seq, N):
# Seq = reduce(operator.add, Seq) # Flatten once
# if N == 1: return Seq
# return append_ntimes(Seq, N-1)
# print "mesh.has_col ", mesh.has_col
# print "mesh.hasVertexColours()", mesh.hasVertexColours()
# print "mesh.hasFaceUV() ", mesh.hasFaceUV()
# print "mesh.has_uvco ", mesh.has_uvco
# # =============================
# # ==== Create Blender Mesh ====
# # =============================
# def create_mesh_old(verts, faces, objname):
# mesh = Blender.NMesh.GetRaw()
# # === Vertex List ===
# for i in range(len(verts)):
# x, y, z = verts[i]
# mesh.verts.append(Blender.NMesh.Vert(x, y ,z))
# # === Face List ===
# for i in range(len(faces)):
# face = Blender.NMesh.Face()
# for j in range(len(faces[i])):
# index = faces[i][j]
# face.v.append(mesh.verts[index])
# mesh.faces.append(face)
# # === Name the Object ===
# Blender.NMesh.PutRaw(mesh, objname)
# object = Blender.Object.GetSelected()
# object[0].name=objname
# Blender.Redraw()