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:
@@ -1,8 +1,8 @@
|
|||||||
import Blender
|
import Blender
|
||||||
from BPyMesh_redux import redux # seperated because of its size.
|
# from BPyMesh_redux import redux # seperated because of its size.
|
||||||
#import BPyMesh_redux
|
import BPyMesh_redux
|
||||||
#reload(BPyMesh_redux)
|
reload(BPyMesh_redux)
|
||||||
#redux= BPyMesh_redux.redux
|
redux= BPyMesh_redux.redux
|
||||||
|
|
||||||
# python 2.3 has no reversed() iterator. this will only work on lists and tuples
|
# python 2.3 has no reversed() iterator. this will only work on lists and tuples
|
||||||
try:
|
try:
|
||||||
@@ -15,7 +15,10 @@ except:
|
|||||||
try:
|
try:
|
||||||
set
|
set
|
||||||
except:
|
except:
|
||||||
from sets import Set as set
|
try:
|
||||||
|
from sets import Set as set
|
||||||
|
except:
|
||||||
|
set= None
|
||||||
|
|
||||||
|
|
||||||
def meshWeight2Dict(me):
|
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.
|
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.
|
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
|
Vector= Blender.Mathutils.Vector
|
||||||
if not indices:
|
if not indices:
|
||||||
return []
|
return []
|
||||||
|
|||||||
@@ -33,7 +33,10 @@ import BPyMesh
|
|||||||
try:
|
try:
|
||||||
set
|
set
|
||||||
except:
|
except:
|
||||||
from sets import Set as set
|
try:
|
||||||
|
from sets import Set as set
|
||||||
|
except:
|
||||||
|
set= None
|
||||||
|
|
||||||
def uv_key(uv):
|
def uv_key(uv):
|
||||||
return round(uv.x, 5), round(uv.y, 5)
|
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:
|
if REDUX<0 or REDUX>1.0:
|
||||||
raise 'Error, factor must be between 0 and 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
|
BOUNDRY_WEIGHT= 1+BOUNDRY_WEIGHT
|
||||||
|
|
||||||
|
|||||||
@@ -50,6 +50,11 @@ importername = "lwo_import 0.3.0a - devel"
|
|||||||
# +----------------------------------------------------------
|
# +----------------------------------------------------------
|
||||||
# +---------------------------------------------------------+
|
# +---------------------------------------------------------+
|
||||||
# | Release log: |
|
# | 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 |
|
# | 0.2.1 : This code works with Blender 2.40 RC1 |
|
||||||
# | modified material mode assignment to deal with |
|
# | modified material mode assignment to deal with |
|
||||||
# | Python API modification |
|
# | Python API modification |
|
||||||
@@ -85,8 +90,14 @@ import Blender
|
|||||||
# use for comprehensiveImageLoad
|
# use for comprehensiveImageLoad
|
||||||
import BPyImage
|
import BPyImage
|
||||||
|
|
||||||
|
# Use this ngon function
|
||||||
|
import BPyMesh
|
||||||
|
|
||||||
#python specific modules import
|
#python specific modules import
|
||||||
import struct, chunk, os, cStringIO
|
try:
|
||||||
|
import struct, chunk, os, cStringIO
|
||||||
|
except:
|
||||||
|
struct= chunk= os= cStringIO= None
|
||||||
|
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
# === Utility Preamble ======================================
|
# === Utility Preamble ======================================
|
||||||
@@ -1060,8 +1071,6 @@ def read_surfs(lwochunk, surf_list, tag_list):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
import BPyMesh
|
|
||||||
reload(BPyMesh)
|
|
||||||
def reduce_face(verts, face):
|
def reduce_face(verts, face):
|
||||||
TriangleArea= Blender.Mathutils.TriangleArea
|
TriangleArea= Blender.Mathutils.TriangleArea
|
||||||
Vector= Blender.Mathutils.Vector
|
Vector= Blender.Mathutils.Vector
|
||||||
@@ -1428,35 +1437,6 @@ def create_objects(clip_list, objspec_list, surf_list):
|
|||||||
return
|
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 ===
|
# === 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))
|
tobj.pprint("read %s faces; type of block %d (0=FACE; 1=PATCH)" % (len(faces), subsurf))
|
||||||
return 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')
|
||||||
|
|
||||||
|
if __name__=='__main__':
|
||||||
# ===========================================================
|
main()
|
||||||
# === Start the show and main callback ======================
|
|
||||||
# ===========================================================
|
|
||||||
|
|
||||||
def fs_callback(filename):
|
|
||||||
read(filename)
|
|
||||||
|
|
||||||
Blender.Window.FileSelector(fs_callback, "Import LWO")
|
|
||||||
|
|
||||||
# Cams debugging lwo loader
|
# Cams debugging lwo loader
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -70,17 +70,25 @@ edges during the course of modeling.
|
|||||||
# ***** END GPL LICENCE BLOCK *****
|
# ***** END GPL LICENCE BLOCK *****
|
||||||
|
|
||||||
import Blender, meshtools
|
import Blender, meshtools
|
||||||
import struct, time, sys, os
|
try:
|
||||||
|
import struct, os
|
||||||
|
except:
|
||||||
|
struct= None
|
||||||
|
|
||||||
# =============================
|
# =============================
|
||||||
# === Read Nendo 1.x Format ===
|
# === Read Nendo 1.x Format ===
|
||||||
# =============================
|
# =============================
|
||||||
def read(filename):
|
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")
|
file = open(filename, "rb")
|
||||||
version, numobjs = read_header(file)
|
version, numobjs = read_header(file)
|
||||||
|
|
||||||
for object in range(numobjs):
|
for object in xrange(numobjs):
|
||||||
good, = struct.unpack(">B", file.read(1))
|
good, = struct.unpack(">B", file.read(1))
|
||||||
if not good: continue # an empty object
|
if not good: continue # an empty object
|
||||||
objname = read_object_flags(file)
|
objname = read_object_flags(file)
|
||||||
@@ -94,9 +102,9 @@ def read(filename):
|
|||||||
|
|
||||||
Blender.Window.DrawProgressBar(1.0, "Done") # clear progressbar
|
Blender.Window.DrawProgressBar(1.0, "Done") # clear progressbar
|
||||||
file.close()
|
file.close()
|
||||||
end = time.clock()
|
end = Blender.sys.time()
|
||||||
seconds = " in %.2f %s" % (end-start, "seconds")
|
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()
|
message += " (%s)" % version.title()
|
||||||
meshtools.print_boxed(message)
|
meshtools.print_boxed(message)
|
||||||
|
|
||||||
@@ -130,7 +138,7 @@ def read_object_flags(file):
|
|||||||
def read_edge_table(file, version):
|
def read_edge_table(file, version):
|
||||||
numedges, = struct.unpack(">H", file.read(2))
|
numedges, = struct.unpack(">H", file.read(2))
|
||||||
edge_table = {}
|
edge_table = {}
|
||||||
for i in range(numedges):
|
for i in xrange(numedges):
|
||||||
if not i%100 and meshtools.show_progress:
|
if not i%100 and meshtools.show_progress:
|
||||||
Blender.Window.DrawProgressBar(float(i)/numedges, "Reading Edge Table")
|
Blender.Window.DrawProgressBar(float(i)/numedges, "Reading Edge Table")
|
||||||
edge = struct.unpack(">8H", file.read(16))
|
edge = struct.unpack(">8H", file.read(16))
|
||||||
@@ -146,7 +154,7 @@ def read_edge_table(file, version):
|
|||||||
def read_face_table(file):
|
def read_face_table(file):
|
||||||
numfaces, = struct.unpack(">H", file.read(2))
|
numfaces, = struct.unpack(">H", file.read(2))
|
||||||
face_table = {}
|
face_table = {}
|
||||||
for i in range(numfaces):
|
for i in xrange(numfaces):
|
||||||
if not i%100 and meshtools.show_progress:
|
if not i%100 and meshtools.show_progress:
|
||||||
Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Face Table")
|
Blender.Window.DrawProgressBar(float(i)/numfaces, "Reading Face Table")
|
||||||
face_table[i] = struct.unpack(">H", file.read(2))[0]
|
face_table[i] = struct.unpack(">H", file.read(2))[0]
|
||||||
@@ -158,7 +166,7 @@ def read_face_table(file):
|
|||||||
def read_vert_table(file):
|
def read_vert_table(file):
|
||||||
numverts, = struct.unpack(">H", file.read(2))
|
numverts, = struct.unpack(">H", file.read(2))
|
||||||
vert_table = []
|
vert_table = []
|
||||||
for i in range(numverts):
|
for i in xrange(numverts):
|
||||||
if not i%100 and meshtools.show_progress:
|
if not i%100 and meshtools.show_progress:
|
||||||
Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Vertex Table")
|
Blender.Window.DrawProgressBar(float(i)/numverts, "Reading Vertex Table")
|
||||||
w, x, y, z = struct.unpack(">H3f", file.read(14))
|
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.1, 0.0, 0.0],
|
||||||
[0.0, 0.0, 0.0, 1.0]]
|
[0.0, 0.0, 0.0, 1.0]]
|
||||||
verts = []
|
verts = []
|
||||||
for i in range(len(vert_table)):
|
for i in xrange(len(vert_table)):
|
||||||
vertex = vert_table[i][1]
|
vertex = vert_table[i][1]
|
||||||
vertex = meshtools.apply_transform(vertex, matrix)
|
vertex = meshtools.apply_transform(vertex, matrix)
|
||||||
verts.append(vertex)
|
verts.append(vertex)
|
||||||
@@ -207,11 +215,10 @@ def make_verts(vert_table):
|
|||||||
# =======================
|
# =======================
|
||||||
def make_face_table(edge_table): # For Nendo
|
def make_face_table(edge_table): # For Nendo
|
||||||
face_table = {}
|
face_table = {}
|
||||||
for i in range(len(edge_table)):
|
for i in xrange(len(edge_table)):
|
||||||
Lf = edge_table[i][2]
|
Lf = edge_table[i][2]
|
||||||
Rf = edge_table[i][3]
|
Rf = edge_table[i][3]
|
||||||
face_table[Lf] = i
|
face_table[Lf] = face_table[Rf] = i
|
||||||
face_table[Rf] = i
|
|
||||||
return face_table
|
return face_table
|
||||||
|
|
||||||
# =======================
|
# =======================
|
||||||
@@ -219,11 +226,10 @@ def make_face_table(edge_table): # For Nendo
|
|||||||
# =======================
|
# =======================
|
||||||
def make_vert_table(edge_table): # For Nendo
|
def make_vert_table(edge_table): # For Nendo
|
||||||
vert_table = {}
|
vert_table = {}
|
||||||
for i in range(len(edge_table)):
|
for i in xrange(len(edge_table)):
|
||||||
Sv = edge_table[i][1]
|
Sv = edge_table[i][1]
|
||||||
Ev = edge_table[i][0]
|
Ev = edge_table[i][0]
|
||||||
vert_table[Sv] = i
|
vert_table[Sv] = vert_table[Ev]= i
|
||||||
vert_table[Ev] = i
|
|
||||||
return vert_table
|
return vert_table
|
||||||
|
|
||||||
# ==================
|
# ==================
|
||||||
@@ -233,7 +239,7 @@ def make_faces(edge_table): # For Nendo
|
|||||||
face_table = make_face_table(edge_table)
|
face_table = make_face_table(edge_table)
|
||||||
faces=[]
|
faces=[]
|
||||||
#for i in range(len(face_table)):
|
#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 = []
|
face_verts = []
|
||||||
current_edge = face_table[i]
|
current_edge = face_table[i]
|
||||||
while(1):
|
while(1):
|
||||||
@@ -250,7 +256,14 @@ def make_faces(edge_table): # For Nendo
|
|||||||
faces.append(face_verts)
|
faces.append(face_verts)
|
||||||
return faces
|
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()
|
||||||
|
|
||||||
|
|||||||
@@ -49,14 +49,21 @@ def file_callback(filename):
|
|||||||
return
|
return
|
||||||
|
|
||||||
file = open(filename, 'wb')
|
file = open(filename, 'wb')
|
||||||
|
|
||||||
mesh = BPyMesh.getMeshFromObject(object, None, True, False, scn)
|
mesh = BPyMesh.getMeshFromObject(object, None, True, False, scn)
|
||||||
if not mesh:
|
if not mesh:
|
||||||
Blender.Draw.PupMenu('Error%t|Could not get mesh data from active object')
|
Blender.Draw.PupMenu('Error%t|Could not get mesh data from active object')
|
||||||
return
|
return
|
||||||
|
|
||||||
mesh.transform(object.matrixWorld)
|
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
|
verts = [] # list of dictionaries
|
||||||
vdict = {} # (index, normal, uv) -> new index
|
vdict = {} # (index, normal, uv) -> new index
|
||||||
for i, f in enumerate(mesh.faces):
|
for i, f in enumerate(mesh.faces):
|
||||||
@@ -130,4 +137,11 @@ def file_callback(filename):
|
|||||||
file.write('\n')
|
file.write('\n')
|
||||||
file.close()
|
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()
|
||||||
|
|||||||
@@ -41,7 +41,10 @@ Run this script from "File->Import" and select the desired PLY file.
|
|||||||
# 2.32.
|
# 2.32.
|
||||||
|
|
||||||
import Blender, meshtools
|
import Blender, meshtools
|
||||||
import re, struct, StringIO
|
try:
|
||||||
|
import re, struct, StringIO
|
||||||
|
except:
|
||||||
|
struct= None
|
||||||
|
|
||||||
class element_spec:
|
class element_spec:
|
||||||
name = ''
|
name = ''
|
||||||
@@ -301,5 +304,19 @@ def filesel_callback(filename):
|
|||||||
message = 'Successfully imported ' + Blender.sys.basename(filename) + ' ' + str(Blender.sys.time()-t)
|
message = 'Successfully imported ' + Blender.sys.basename(filename) + ' ' + str(Blender.sys.time()-t)
|
||||||
meshtools.print_boxed(message)
|
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()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user