[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [1546] extern/py/scripts/addons/ makehuman: Additions to work with curves, lattices and hooks.

Thomas Larsson thomas_larsson_01 at hotmail.com
Sun Feb 6 15:37:02 CET 2011


Revision: 1546
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=1546
Author:   thomasl
Date:     2011-02-06 14:36:59 +0000 (Sun, 06 Feb 2011)
Log Message:
-----------
Additions to work with curves, lattices and hooks.
Also with special debug mode for stubborn child-of bug.

Added Paths:
-----------
    extern/py/scripts/addons/makehuman/1.2.2/
    extern/py/scripts/addons/makehuman/1.2.2/io_import_scene_mhx.py

Added: extern/py/scripts/addons/makehuman/1.2.2/io_import_scene_mhx.py
===================================================================
--- extern/py/scripts/addons/makehuman/1.2.2/io_import_scene_mhx.py	                        (rev 0)
+++ extern/py/scripts/addons/makehuman/1.2.2/io_import_scene_mhx.py	2011-02-06 14:36:59 UTC (rev 1546)
@@ -0,0 +1,2571 @@
+""" 
+**Project Name:**      MakeHuman
+
+**Product Home Page:** http://www.makehuman.org/
+
+**Code Home Page:**    http://code.google.com/p/makehuman/
+
+**Authors:**           Thomas Larsson
+
+**Copyright(c):**      MakeHuman Team 2001-2010
+
+**Licensing:**         GPL3 (see also http://sites.google.com/site/makehumandocs/licensing)
+
+**Coding Standards:**  See http://sites.google.com/site/makehumandocs/developers-guide
+
+Abstract
+MHX (MakeHuman eXchange format) importer for Blender 2.5x.
+Version 1.2.2
+
+"""
+
+bl_info = {
+    'name': 'Import: MakeHuman (.mhx)',
+    'author': 'Thomas Larsson',
+    'version': (1, 2, 2),
+    'blender': (2, 5, 6),
+    'api': 34595,
+    'location': "File > Import",
+    'description': 'Import files in the MakeHuman eXchange format (.mhx)',
+    'warning': '',
+    'wiki_url': 'http://wiki.blender.org/index.php/Extensions:2.5/Py/'\
+        'Scripts/Import-Export/Make_Human',
+    'tracker_url': 'https://projects.blender.org/tracker/index.php?'\
+        'func=detail&aid=21872',
+    'category': 'Import-Export'}
+
+"""
+Place this file in the .blender/scripts/addons dir
+You have to activated the script in the "Add-Ons" tab (user preferences).
+Access from the File > Import menu.
+"""
+
+MAJOR_VERSION = 1
+MINOR_VERSION = 2
+SUB_VERSION = 2
+BLENDER_VERSION = (2, 56, 0)
+
+#
+#
+#
+
+import bpy
+import os
+import time
+import mathutils
+from mathutils import *
+#import geometry
+#import string
+
+MHX249 = False
+Blender24 = False
+Blender25 = True
+TexDir = "~/makehuman/exports"
+
+#
+#
+#
+
+theScale = 1.0
+One = 1.0/theScale
+useMesh = 1
+verbosity = 2
+warnedTextureDir = False
+warnedVersion = False
+
+true = True
+false = False
+Epsilon = 1e-6
+nErrors = 0
+theTempDatum = None
+
+todo = []
+
+#
+#    toggle flags
+#
+
+T_EnforceVersion = 0x01
+T_Clothes = 0x02
+T_Stretch = 0x04
+T_Bend = 0x08
+
+T_Diamond = 0x10
+T_Replace = 0x20
+T_Face = 0x40
+T_Shape = 0x80
+
+T_Mesh = 0x100
+T_Armature = 0x200
+T_Proxy = 0x400
+T_Cage = 0x800
+
+T_Rigify = 0x1000
+T_Opcns = 0x2000
+T_Symm = 0x4000
+T_MHX = 0x8000
+
+toggle = T_EnforceVersion + T_Replace + T_Mesh + T_Armature + T_Face + T_Shape + T_Proxy + T_Clothes
+
+#
+#    setFlagsAndFloats(rigFlags):
+#
+#    Global floats
+#fFingerPanel = 0.0
+#fFingerIK = 0.0
+fNoStretch = 0.0
+
+#    rigLeg and rigArm flags
+T_Toes = 0x0001
+#T_GoboFoot = 0x0002
+
+#T_InvFoot = 0x0010
+#T_InvFootPT = 0x0020
+#T_InvFootNoPT = 0x0040
+
+#T_FingerPanel = 0x100
+#T_FingerRot = 0x0200
+#T_FingerIK = 0x0400
+
+
+#T_LocalFKIK = 0x8000
+
+#rigLeg = 0
+#rigArm = 0
+
+def setFlagsAndFloats():
+    '''
+    global toggle, rigLeg, rigArm
+
+    (footRig, fingerRig) = rigFlags
+    rigLeg = 0
+    if footRig == 'Reverse foot': 
+        rigLeg |= T_InvFoot
+        if toggle & T_PoleTar:
+            rigLeg |= T_InvFootPT
+        else:
+            rigLeg |= T_InvFootNoPT
+    elif footRig == 'Gobo': rigLeg |= T_GoboFoot        
+
+    rigArm = 0
+    if fingerRig == 'Panel': rigArm |= T_FingerPanel
+    elif fingerRig == 'Rotation': rigArm |= T_FingerRot
+    elif fingerRig == 'IK': rigArm |= T_FingerIK
+
+    toggle |= T_Panel
+    '''
+    global fNoStretch
+    if toggle&T_Stretch: fNoStretch == 0.0
+    else: fNoStretch = 1.0
+
+    return
+
+
+#
+#    Dictionaries
+#
+
+loadedData = {
+    'NONE' : {},
+
+    'Object' : {},
+    'Mesh' : {},
+    'Armature' : {},
+    'Lamp' : {},
+    'Camera' : {},
+    'Lattice' : {},
+    'Curve' : {},
+    'Text' : {},
+
+    'Material' : {},
+    'Image' : {},
+    'MaterialTextureSlot' : {},
+    'Texture' : {},
+    
+    'Bone' : {},
+    'BoneGroup' : {},
+    'Rigify' : {},
+
+    'Action' : {},
+    'Group' : {},
+
+    'MeshTextureFaceLayer' : {},
+    'MeshColorLayer' : {},
+    'VertexGroup' : {},
+    'ShapeKey' : {},
+    'ParticleSystem' : {},
+
+    'ObjectConstraints' : {},
+    'ObjectModifiers' : {},
+    'MaterialSlot' : {},
+}
+
+Plural = {
+    'Object' : 'objects',
+    'Mesh' : 'meshes',
+    'Lattice' : 'lattices',
+    'Curve' : 'curves',
+    'Text' : 'texts',
+    'Group' : 'groups',
+    'Empty' : 'empties',
+    'Armature' : 'armatures',
+    'Bone' : 'bones',
+    'BoneGroup' : 'bone_groups',
+    'Pose' : 'poses',
+    'PoseBone' : 'pose_bones',
+    'Material' : 'materials',
+    'Texture' : 'textures',
+    'Image' : 'images',
+    'Camera' : 'cameras',
+    'Lamp' : 'lamps',
+    'World' : 'worlds',
+}
+
+#
+#    checkBlenderVersion()
+#
+
+def checkBlenderVersion():
+    print("Found Blender", bpy.app.version)
+    (A, B, C) = bpy.app.version
+    (a, b, c) = BLENDER_VERSION
+    if a <= A: return
+    if b <= B: return
+    if c <= C: return
+    msg = (
+"This version of the MHX importer only works with Blender (%d, %d, %d) or later. " % (a, b, c) +
+"Download a more recent Blender from www.blender.org or www.graphicall.org.\n"
+    )
+    raise NameError(msg)
+    return
+
+#
+#    readMhxFile(filePath, scale):
+#
+
+def readMhxFile(filePath, scale):
+    global todo, nErrors, theScale, defaultScale, One, toggle
+
+    checkBlenderVersion()    
+    
+    theScale = scale
+    defaultScale = scale
+    One = 1.0/theScale
+
+    fileName = os.path.expanduser(filePath)
+    (shortName, ext) = os.path.splitext(fileName)
+    if ext.lower() != ".mhx":
+        print("Error: Not a mhx file: " + fileName)
+        return
+    print( "Opening MHX file "+ fileName )
+    time1 = time.clock()
+
+    ignore = False
+    stack = []
+    tokens = []
+    key = "toplevel"
+    level = 0
+    nErrors = 0
+    comment = 0
+    nesting = 0
+
+    setFlagsAndFloats()
+
+    file= open(fileName, "rU")
+    print( "Tokenizing" )
+    lineNo = 0
+    for line in file: 
+        # print(line)
+        lineSplit= line.split()
+        lineNo += 1
+        if len(lineSplit) == 0:
+            pass
+        elif lineSplit[0][0] == '#':
+            if lineSplit[0] == '#if':
+                if comment == nesting:
+                    try:
+                        res = eval(lineSplit[1])
+                    except:
+                        res = False
+                    if res:
+                        comment += 1
+                nesting += 1
+            elif lineSplit[0] == '#else':
+                if comment == nesting-1:
+                    comment += 1
+                elif comment == nesting:
+                    comment -= 1
+            elif lineSplit[0] == '#endif':
+                if comment == nesting:
+                    comment -= 1
+                nesting -= 1
+        elif comment < nesting:
+            pass
+        elif lineSplit[0] == 'end':
+            try:
+                sub = tokens
+                tokens = stack.pop()
+                if tokens:
+                    tokens[-1][2] = sub
+                level -= 1
+            except:
+                print( "Tokenizer error at or before line %d" % lineNo )
+                print( line )
+                dummy = stack.pop()
+        elif lineSplit[-1] == ';':
+            if lineSplit[0] == '\\':
+                key = lineSplit[1]
+                tokens.append([key,lineSplit[2:-1],[]])
+            else:
+                key = lineSplit[0]
+                tokens.append([key,lineSplit[1:-1],[]])
+        else:
+            key = lineSplit[0]
+            tokens.append([key,lineSplit[1:],[]])
+            stack.append(tokens)
+            level += 1
+            tokens = []
+    file.close()
+
+    if level != 0:
+        raise NameError("Tokenizer out of kilter %d" % level)    
+    clearScene()
+    print( "Parsing" )
+    parse(tokens)
+    
+    for (expr, glbals, lcals) in todo:
+        try:
+            print("Doing %s" % expr)
+            exec(expr, glbals, lcals)
+        except:
+            msg = "Failed: "+expr
+            print( msg )
+            nErrors += 1
+            #raise NameError(msg)
+
+    time2 = time.clock()
+    print("toggle = %x" % toggle)
+    msg = "File %s loaded in %g s" % (fileName, time2-time1)
+    if nErrors:
+        msg += " but there where %d errors. " % (nErrors)
+    print(msg)
+    return
+
+#
+#    getObject(name, var, glbals, lcals):
+#
+
+def getObject(name, var, glbals, lcals):
+    try:
+        ob = loadedData['Object'][name]
+    except:
+        if name != "None":
+            pushOnTodoList(None, "ob = loadedData['Object'][name]" % globals(), locals())
+        ob = None
+    return ob
+
+#
+#    checkMhxVersion(major, minor):
+#
+
+def checkMhxVersion(major, minor):
+    global warnedVersion
+    if  major != MAJOR_VERSION or (major == MAJOR_VERSION and minor > MINOR_VERSION):
+        if warnedVersion:
+            return
+        else:
+            msg = (
+"Wrong MHX version\n" +
+"Expected MHX %d.%d but the loaded file has version MHX %d.%d\n" % (MAJOR_VERSION, MINOR_VERSION, major, minor) +
+"You can disable this error message by deselecting the Enforce version option when importing. " +
+"Alternatively, you can try to download the most recent nightly build from www.makehuman.org. " +
+"The current version of the import script is located in the importers/mhx/blender25x folder and is called import_scene_mhx.py. " +
+"The version distributed with Blender builds from www.graphicall.org may be out of date.\n"
+)
+        if toggle & T_EnforceVersion:
+            raise NameError(msg)
+        else:
+            print(msg)
+            warnedVersion = True
+    return
+
+#
+#    parse(tokens):
+#
+
+ifResult = False
+
+def parse(tokens):
+    global MHX249, ifResult, theScale, defaultScale, One
+    
+    for (key, val, sub) in tokens:    
+        print("Parse %s" % key)
+        data = None
+        if key == 'MHX':
+            checkMhxVersion(int(val[0]), int(val[1]))
+        elif key == 'MHX249':
+            MHX249 = eval(val[0])
+            print("Blender 2.49 compatibility mode is %s\n" % MHX249)
+        elif MHX249:
+            pass
+        elif key == 'print':
+            msg = concatList(val)
+            print(msg)
+        elif key == 'warn':
+            msg = concatList(val)
+            print(msg)
+        elif key == 'error':
+            msg = concatList(val)
+            raise NameError(msg)    
+        elif key == 'NoScale':
+            if eval(val[0]):
+                theScale = 1.0
+            else:

@@ Diff output truncated at 10240 characters. @@


More information about the Bf-extensions-cvs mailing list