Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2006-01-16 09:33:55 +0300
committerCampbell Barton <ideasman42@gmail.com>2006-01-16 09:33:55 +0300
commit9cbf04ca9a5cc8b3c0893e8d3f222e45d2673942 (patch)
treee6e2c40f4bfe2cb4916ae539386052474fbf54d9 /release
parentcc183db48399aa267e4bfacb8e83530151442348 (diff)
Added user interface to OBJ import.
With options. ('Material (*.mtl)', IMPORT_MTL, 'Imports material settings and images from the obj\'s .mtl file'),\ ('All *.obj\'s in dir', IMPORT_DIR, 'Import all obj files in this dir (avoid overlapping data with "Create scene")'),\ ('Create scene', IMPORT_NEW_SCENE, 'Imports each obj into its own scene, named from the file'),\ 'Geometry...',\ ('Edges', IMPORT_EDGES, 'Import faces with 2 verts as in edge'),\ ('Smooths all faces', IMPORT_SMOOTH_ALL, 'Smooth all faces even if they are not in a smoothing group'),\
Diffstat (limited to 'release')
-rw-r--r--release/scripts/obj_import.py159
1 files changed, 90 insertions, 69 deletions
diff --git a/release/scripts/obj_import.py b/release/scripts/obj_import.py
index 176bd9907ab..ed0c0f34110 100644
--- a/release/scripts/obj_import.py
+++ b/release/scripts/obj_import.py
@@ -269,8 +269,6 @@ def comprehansiveImageLoad(imagePath, filePath):
break
return img
-
-
# No go.
print '\t\tImage Not Found "%s"' % imagePath
return None
@@ -279,22 +277,6 @@ def comprehansiveImageLoad(imagePath, filePath):
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
#==================================================================================#
# This function sets textures defined in .mtl file #
#==================================================================================#
@@ -444,7 +426,7 @@ def getUniqueName(name):
#==================================================================================#
# This loads data from .obj file #
#==================================================================================#
-def load_obj(file):
+def load_obj(file, IMPORT_MTL=1, IMPORT_EDGES=1, IMPORT_SMOOTH_ALL=0):
print '\nImporting OBJ file: "%s"' % file
@@ -487,7 +469,10 @@ def load_obj(file):
currentMat = nullMat # Use this mat.
currentImg = None # Null image is a string, otherwise this should be set to an image object.\
- currentSmooth = False
+ if IMPORT_SMOOTH_ALL:
+ currentSmooth = True
+ else:
+ currentSmooth = False
# Store a list of unnamed names
currentUnnamedGroupIdx = 1
@@ -555,9 +540,9 @@ def load_obj(file):
# We ignore it when naming the object.
currentObjectName = 'unnamed_obj_0' # If we cant get one, use this
- meshDict = {} # The 3 variables below are stored in a tuple within this dict for each mesh
+ #meshDict = {} # The 3 variables below are stored in a tuple within this dict for each mesh
currentMesh = NMesh.GetRaw() # The NMesh representation of the OBJ group/Object
- currentUsedVertList = {} # A Dict of smooth groups, each smooth group has a list of used verts and they are generated on demand so as to save memory.
+ #currentUsedVertList = {} # A Dict of smooth groups, each smooth group has a list of used verts and they are generated on demand so as to save memory.
currentMaterialMeshMapping = {} # Used to store material indicies so we dont have to search the mesh for materials every time.
# Every mesh has a null smooth group, this is used if there are no smooth groups in the OBJ file.
@@ -567,11 +552,12 @@ def load_obj(file):
# For direct accsess to the Current Meshes, Current Smooth Groups- Used verts.
# This is of course context based and changes on the fly.
# Set the initial '(null)' Smooth group, every mesh has one.
- currentUsedVertList[currentSmoothGroup] = currentUsedVertListSmoothGroup = VERT_USED_LIST[:]
+ currentUsedVertListSmoothGroup = VERT_USED_LIST[:]
+ currentUsedVertList= {currentSmoothGroup: currentUsedVertListSmoothGroup }
# 0:NMesh, 1:SmoothGroups[UsedVerts[0,0,0,0]], 2:materialMapping['matname':matIndexForThisNMesh]
- meshDict[currentObjectName] = (currentMesh, currentUsedVertList, currentMaterialMeshMapping)
+ meshDict = {currentObjectName: (currentMesh, currentUsedVertList, currentMaterialMeshMapping) }
# Only show the bad uv error once
badObjUvs = 0
@@ -664,16 +650,17 @@ def load_obj(file):
#print lIdx, len(vIdxLs), len(currentUsedVertListSmoothGroup)
#print fileLines[lIdx]
if len(vIdxLs) == 2:
- # Edge
- for i in (0,1):
- if currentUsedVertListSmoothGroup[vIdxLs[i]] == 0:
- faceQuadVList[i] = vertList[vIdxLs[i]]
- currentMesh.verts.append(faceQuadVList[i])
- currentUsedVertListSmoothGroup[vIdxLs[i]] = len(currentMesh.verts)-1
- else:
- faceQuadVList[i] = currentMesh.verts[currentUsedVertListSmoothGroup[vIdxLs[i]]]
-
- currentMesh.addEdge(faceQuadVList[0], faceQuadVList[1])
+ if IMPORT_EDGES:
+ # Edge
+ for i in (0,1):
+ if currentUsedVertListSmoothGroup[vIdxLs[i]] == 0:
+ faceQuadVList[i] = vertList[vIdxLs[i]]
+ currentMesh.verts.append(faceQuadVList[i])
+ currentUsedVertListSmoothGroup[vIdxLs[i]] = len(currentMesh.verts)-1
+ else:
+ faceQuadVList[i] = currentMesh.verts[currentUsedVertListSmoothGroup[vIdxLs[i]]]
+
+ currentMesh.addEdge(faceQuadVList[0], faceQuadVList[1])
elif len(vIdxLs) == 4:
# Have found some files where wach face references the same vert
@@ -744,7 +731,8 @@ def load_obj(file):
currentSmoothGroup = '(null)'
else:
if l[1] == 'off': # We all have a null group so dont need to try, will try anyway to avoid code duplication.
- currentSmooth = False
+ if not IMPORT_SMOOTH_ALL:
+ currentSmooth = False
currentSmoothGroup = '(null)'
else:
currentSmooth = True
@@ -793,7 +781,6 @@ def load_obj(file):
currentUsedVertList[currentSmoothGroup] = currentUsedVertListSmoothGroup = VERT_USED_LIST[:]
currentMaterialMeshMapping = {}
-
meshDict[currentObjectName] = (currentMesh, currentUsedVertList, currentMaterialMeshMapping)
currentMesh.hasFaceUV(1)
contextMeshMatIdx = -1
@@ -855,8 +842,9 @@ def load_obj(file):
#lIdx+=1
# Applies material properties to materials alredy on the mesh as well as Textures.
- for mtl in mtl_fileName:
- load_mtl(DIR, mtl, meshDict, materialDict)
+ if IMPORT_MTL:
+ for mtl in mtl_fileName:
+ load_mtl(DIR, mtl, meshDict, materialDict)
importedObjects = []
@@ -887,45 +875,78 @@ def load_obj(file):
print "obj import time: ", sys.time() - time1
+
+def load_obj_ui(file):
-# Batch directory loading.
-def load_obj_dir(obj_dir):
+ IMPORT_MTL = Draw.Create(1)
+ IMPORT_DIR = Draw.Create(0)
+ IMPORT_NEW_SCENE = Draw.Create(0)
+ IMPORT_EDGES = Draw.Create(1)
+ IMPORT_SMOOTH_ALL = Draw.Create(0)
- # Strip file
- obj_dir = stripFile(obj_dir)
- time = sys.time()
- objFiles = [f for f in os.listdir(obj_dir) if f.lower().endswith('obj')]
+ # Get USER Options
+ pup_block = [\
+ ('Material (*.mtl)', IMPORT_MTL, 'Imports material settings and images from the obj\'s .mtl file'),\
+ ('All *.obj\'s in dir', IMPORT_DIR, 'Import all obj files in this dir (avoid overlapping data with "Create scene")'),\
+ ('Create scene', IMPORT_NEW_SCENE, 'Imports each obj into its own scene, named from the file'),\
+ 'Geometry...',\
+ ('Edges', IMPORT_EDGES, 'Import faces with 2 verts as in edge'),\
+ ('Smooths all faces', IMPORT_SMOOTH_ALL, 'Smooth all faces even if they are not in a smoothing group'),\
+ ]
+
+ if not os:
+ pup_block.pop(1) # Make sure this is the IMPORT_DIR option that requires OS
+
+ if not Draw.PupBlock('Import...', pup_block):
+ return
+ Window.WaitCursor(1)
Window.DrawProgressBar(0, '')
+ time = sys.time()
+
+ IMPORT_MTL = IMPORT_MTL.val
+ IMPORT_DIR = IMPORT_DIR.val
+ IMPORT_NEW_SCENE = IMPORT_NEW_SCENE.val
+ IMPORT_EDGES = IMPORT_EDGES.val
+ IMPORT_SMOOTH_ALL = IMPORT_SMOOTH_ALL.val
+
+ #orig_scene = Scene.GetCurrent()
+
+ obj_dir = stripFile(file)
+ if IMPORT_DIR:
+ obj_files = [(obj_dir,f) for f in os.listdir(obj_dir) if f.lower().endswith('obj')]
+ else:
+ obj_files = [(obj_dir,stripPath(file))]
+
+ obj_len = len(obj_files)
count = 0
- obj_len = len(objFiles)
- for obj in objFiles:
- count+=1
-
- newScn = Scene.New(obj)
- newScn.makeCurrent()
-
- Window.DrawProgressBar((float(count)/obj_len) - 0.01, '%s: %i of %i' % (obj, count, obj_len))
-
- load_obj(obj_dir + obj)
-
+ for d, f in obj_files:
+ count+= 1
+ if not sys.exists(d+f):
+ print 'Error: "%s%s" does not exist' % (d,f)
+ else:
+ if IMPORT_NEW_SCENE:
+ scn = Scene.New('.'.join(f.split('.')[0:-1]))
+ scn.makeCurrent()
+
+
+ Window.DrawProgressBar((float(count)/obj_len) - 0.01, '%s: %i of %i' % (f, count, obj_len))
+ load_obj(d+f, IMPORT_MTL, IMPORT_EDGES, IMPORT_SMOOTH_ALL)
+
+
+ #orig_scene.makeCurrent() # We can leave them in there new scene.
Window.DrawProgressBar(1, '')
- print 'Total obj import "%s" dir: %.2f' % (obj_dir, sys.time() - time)
-
+ Window.WaitCursor(0)
+
+ if count > 1:
+ print 'Total obj import "%s" dir: %.2f' % (obj_dir, sys.time() - time)
+
def main():
- TEXT_IMPORT = 'Import a Wavefront OBJ'
- TEXT_BATCH_IMPORT = 'Import *.obj to Scenes'
- # load_obj("/metavr/file_examples/obj/zombie.obj")
- if Window.GetKeyQualifiers() & Window.Qual.SHIFT:
- if not os:
- Draw.PupMenu('Module "os" not found, needed for batch load, using normal selector.')
- Window.FileSelector(load_obj, TEXT_IMPORT)
- else:
- Window.FileSelector(load_obj_dir, TEXT_BATCH_IMPORT)
- else:
- Window.FileSelector(load_obj, TEXT_IMPORT)
-
+ Window.FileSelector(load_obj_ui, 'Import a Wavefront OBJ')
+
+
+
if __name__ == '__main__':
main() \ No newline at end of file