more updates, mostly 2.3 error checking, nice messages when pythons not installed and some nendo import optimizations.

BPyMesh will work with the exception of the redux function in py2.3
This commit is contained in:
2006-07-03 20:17:40 +00:00
parent 64ff9ae4a8
commit c4b4e2922f
6 changed files with 106 additions and 71 deletions

View File

@@ -1,8 +1,8 @@
import Blender
from BPyMesh_redux import redux # seperated because of its size.
#import BPyMesh_redux
#reload(BPyMesh_redux)
#redux= BPyMesh_redux.redux
# from BPyMesh_redux import redux # seperated because of its size.
import BPyMesh_redux
reload(BPyMesh_redux)
redux= BPyMesh_redux.redux
# python 2.3 has no reversed() iterator. this will only work on lists and tuples
try:
@@ -15,7 +15,10 @@ except:
try:
set
except:
try:
from sets import Set as set
except:
set= None
def meshWeight2Dict(me):
@@ -642,6 +645,10 @@ def ngon(from_data, indices, PREF_FIX_LOOPS= True):
indices: a list of indicies to use this list is the ordered closed polyline to fill, and can be a subset of the data given.
PREF_FIX_LOOPS: If this is enabled polylines that use loops to make multiple polylines are delt with correctly.
'''
if not set: # Need sets for this, otherwise do a normal fill.
PREF_FIX_LOOPS= False
Vector= Blender.Mathutils.Vector
if not indices:
return []

View File

@@ -33,7 +33,10 @@ import BPyMesh
try:
set
except:
try:
from sets import Set as set
except:
set= None
def uv_key(uv):
return round(uv.x, 5), round(uv.y, 5)
@@ -63,6 +66,8 @@ def redux(ob, REDUX=0.5, BOUNDRY_WEIGHT=2.0, REMOVE_DOUBLES=False, FACE_AREA_WEI
if REDUX<0 or REDUX>1.0:
raise 'Error, factor must be between 0 and 1.0'
elif not set:
raise 'Error, this function requires Python 2.4 or a full install of Python 2.3'
BOUNDRY_WEIGHT= 1+BOUNDRY_WEIGHT

View File

@@ -50,6 +50,11 @@ importername = "lwo_import 0.3.0a - devel"
# +----------------------------------------------------------
# +---------------------------------------------------------+
# | Release log: |
# | 0.2.2 : This code works with Blender 2.42 RC3 |
# | Added a new PolyFill function for BPYMesh's |
# | ngon() to use, checked compatibility |
# | lightwaves ngons are imported as fgons |
# | Checked compatibility against 1711 lwo files |
# | 0.2.1 : This code works with Blender 2.40 RC1 |
# | modified material mode assignment to deal with |
# | Python API modification |
@@ -85,8 +90,14 @@ import Blender
# use for comprehensiveImageLoad
import BPyImage
# Use this ngon function
import BPyMesh
#python specific modules import
import struct, chunk, os, cStringIO
try:
import struct, chunk, os, cStringIO
except:
struct= chunk= os= cStringIO= None
# ===========================================================
# === Utility Preamble ======================================
@@ -1060,8 +1071,6 @@ def read_surfs(lwochunk, surf_list, tag_list):
import BPyMesh
reload(BPyMesh)
def reduce_face(verts, face):
TriangleArea= Blender.Mathutils.TriangleArea
Vector= Blender.Mathutils.Vector
@@ -1428,35 +1437,6 @@ def create_objects(clip_list, objspec_list, surf_list):
return
# =====================
# === Load an image ===
# =====================
#extensively search for image name
"""
def load_image(dir_part, name):
img = None
nname = os.path.splitext(name)
lname = [c.lower() for c in nname]
ext_list = [nname[1]]
if lname[1] != nname[1]:
ext_list.append(lname[1])
ext_list.extend(['.tga', '.png', '.jpg', '.gif', '.bmp']) #order from best to worst (personal judgement) bmp last cause of nasty bug
#first round: original "case"
name_list = []
name_list.extend([os.path.join(dir_part, nname[0] + ext) for ext in ext_list])
#second round: lower "case"
if lname[0] != nname[0]:
name_list.extend([os.path.join(dir_part, lname[0] + ext) for ext in ext_list])
for nn in name_list:
if os.path.exists(nn) == 1:
break
try:
img = Blender.Image.Load(nn)
return img
except IOError:
return None
"""
# ===========================================
# === Lookup for image index in clip_list ===
@@ -1788,16 +1768,15 @@ def read_faces_6(lwochunk):
tobj.pprint("read %s faces; type of block %d (0=FACE; 1=PATCH)" % (len(faces), subsurf))
return faces, subsurf
def main():
if not struct:
Blender.Draw.PupMenu('This importer requires a full python install')
return
Blender.Window.FileSelector(read, "Import LWO", '*.lwo')
# ===========================================================
# === Start the show and main callback ======================
# ===========================================================
def fs_callback(filename):
read(filename)
Blender.Window.FileSelector(fs_callback, "Import LWO")
if __name__=='__main__':
main()
# Cams debugging lwo loader
"""

View File

@@ -70,17 +70,25 @@ edges during the course of modeling.
# ***** END GPL LICENCE BLOCK *****
import Blender, meshtools
import struct, time, sys, os
try:
import struct, os
except:
struct= None
# =============================
# === Read Nendo 1.x Format ===
# =============================
def read(filename):
start = time.clock()
start = Blender.sys.time()
scn= Blender.Scene.GetCurrent()
for obj in scn.getChildren():
obj.sel= 0
file = open(filename, "rb")
version, numobjs = read_header(file)
for object in range(numobjs):
for object in xrange(numobjs):
good, = struct.unpack(">B", file.read(1))
if not good: continue # an empty object
objname = read_object_flags(file)
@@ -94,9 +102,9 @@ def read(filename):
Blender.Window.DrawProgressBar(1.0, "Done") # clear progressbar
file.close()
end = time.clock()
end = Blender.sys.time()
seconds = " in %.2f %s" % (end-start, "seconds")
message = "Successfully imported " + os.path.basename(filename) + seconds
message = "Successfully imported " + filename.split(Blender.sys.sep)[-1] + seconds
message += " (%s)" % version.title()
meshtools.print_boxed(message)
@@ -130,7 +138,7 @@ def read_object_flags(file):
def read_edge_table(file, version):
numedges, = struct.unpack(">H", file.read(2))
edge_table = {}
for i in range(numedges):
for i in xrange(numedges):
if not i%100 and meshtools.show_progress:
Blender.Window.DrawProgressBar(float(i)/numedges, "Reading Edge Table")
edge = struct.unpack(">8H", file.read(16))
@@ -146,7 +154,7 @@ def read_edge_table(file, version):
def read_face_table(file):
numfaces, = struct.unpack(">H", file.read(2))
face_table = {}
for i in range(numfaces):
for i in xrange(numfaces):
if not i%100 and meshtools.show_progress:
Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Face Table")
face_table[i] = struct.unpack(">H", file.read(2))[0]
@@ -158,7 +166,7 @@ def read_face_table(file):
def read_vert_table(file):
numverts, = struct.unpack(">H", file.read(2))
vert_table = []
for i in range(numverts):
for i in xrange(numverts):
if not i%100 and meshtools.show_progress:
Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Vertex Table")
w, x, y, z = struct.unpack(">H3f", file.read(14))
@@ -196,7 +204,7 @@ def make_verts(vert_table):
[0.0,-0.1, 0.0, 0.0],
[0.0, 0.0, 0.0, 1.0]]
verts = []
for i in range(len(vert_table)):
for i in xrange(len(vert_table)):
vertex = vert_table[i][1]
vertex = meshtools.apply_transform(vertex, matrix)
verts.append(vertex)
@@ -207,11 +215,10 @@ def make_verts(vert_table):
# =======================
def make_face_table(edge_table): # For Nendo
face_table = {}
for i in range(len(edge_table)):
for i in xrange(len(edge_table)):
Lf = edge_table[i][2]
Rf = edge_table[i][3]
face_table[Lf] = i
face_table[Rf] = i
face_table[Lf] = face_table[Rf] = i
return face_table
# =======================
@@ -219,11 +226,10 @@ def make_face_table(edge_table): # For Nendo
# =======================
def make_vert_table(edge_table): # For Nendo
vert_table = {}
for i in range(len(edge_table)):
for i in xrange(len(edge_table)):
Sv = edge_table[i][1]
Ev = edge_table[i][0]
vert_table[Sv] = i
vert_table[Ev] = i
vert_table[Sv] = vert_table[Ev]= i
return vert_table
# ==================
@@ -233,7 +239,7 @@ def make_faces(edge_table): # For Nendo
face_table = make_face_table(edge_table)
faces=[]
#for i in range(len(face_table)):
for i in face_table.keys(): # avoids a whole class of errors
for i in face_table.iterkeys(): # avoids a whole class of errors
face_verts = []
current_edge = face_table[i]
while(1):
@@ -250,7 +256,14 @@ def make_faces(edge_table): # For Nendo
faces.append(face_verts)
return faces
def fs_callback(filename):
read(filename)
Blender.Window.FileSelector(fs_callback, "Import Nendo")
def main():
if not struct:
Blender.Draw.PupMenu('This importer requires a full python install')
return
Blender.Window.FileSelector(read, 'Import Nendo', '*.ndo')
if __name__=='__main__':
main()

View File

@@ -49,6 +49,7 @@ def file_callback(filename):
return
file = open(filename, 'wb')
mesh = BPyMesh.getMeshFromObject(object, None, True, False, scn)
if not mesh:
Blender.Draw.PupMenu('Error%t|Could not get mesh data from active object')
@@ -56,7 +57,13 @@ def file_callback(filename):
mesh.transform(object.matrixWorld)
have_uv = mesh.faceUV
if mesh.vertexColors or mesh.faceUV:
mesh.faceUV= 1
have_uv= True
else:
have_uv= False
verts = [] # list of dictionaries
vdict = {} # (index, normal, uv) -> new index
for i, f in enumerate(mesh.faces):
@@ -130,4 +137,11 @@ def file_callback(filename):
file.write('\n')
file.close()
Blender.Window.FileSelector(file_callback, 'PLY Export', Blender.sys.makename(ext='.ply'))
def main():
Blender.Window.FileSelector(file_callback, 'PLY Export', Blender.sys.makename(ext='.ply'))
if __name__=='__main__':
main()

View File

@@ -41,7 +41,10 @@ Run this script from "File->Import" and select the desired PLY file.
# 2.32.
import Blender, meshtools
import re, struct, StringIO
try:
import re, struct, StringIO
except:
struct= None
class element_spec:
name = ''
@@ -301,5 +304,19 @@ def filesel_callback(filename):
message = 'Successfully imported ' + Blender.sys.basename(filename) + ' ' + str(Blender.sys.time()-t)
meshtools.print_boxed(message)
Blender.Window.FileSelector(filesel_callback, 'Import PLY', Blender.sys.makename(ext='.ply'))
def main():
if not struct:
Blender.Draw.PupMenu('This importer requires a full python install')
return
Blender.Window.FileSelector(filesel_callback, 'Import PLY', '*.ply')
if __name__=='__main__':
main()