2
0

skeleton.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. from common import *
  2. import sys
  3. reload( sys.modules["common"] )
  4. #===================================================================================================
  5. # GetSkeleton =
  6. #===================================================================================================
  7. def GetSkeleton( obj ):
  8. # check if obj is correct class
  9. if( obj.__class__.__name__ != "Blender Object" ):
  10. ERROR( "The given func param is not a \"Blender Object\" class but a \"" + obj.__class__.__name__ + "\"" )
  11. return 0
  12. # check modifiers
  13. if len(obj.modifiers) < 1:
  14. ERROR( "Obj \"" + obj.getName() + "\" doesnt have modifiers so no armature found" )
  15. return 0
  16. # search for modifier of skeleton type
  17. for mod in obj.modifiers:
  18. if mod.type == Blender.Modifier.Types.ARMATURE:
  19. aobj = mod[Blender.Modifier.Settings.OBJECT]
  20. skeleton = Blender.Object.Get( aobj.name ).getData( 0, 1 ) # set skeleton
  21. return skeleton
  22. ERROR( "Obj \"" + obj.getName() + "\" has no modifier of type armature" )
  23. return 0
  24. #===================================================================================================
  25. # ScriptSkeleton =
  26. #===================================================================================================
  27. def ScriptSkeleton( skeleton, b_cmnts ):
  28. # check if skeleton is correct class
  29. if( skeleton.__class__.__name__ != "Armature" ):
  30. ERROR( "The given func param is not a \"Armature\" class but a \"" + skeleton.__class__.__name__ + "\"" )
  31. return "error"
  32. ftxt = "" # file text
  33. # write the file
  34. bone_names = skeleton.bones.keys()
  35. bone_names.sort() # the bones are written in alpabetical order
  36. if( b_cmnts ): ftxt += "/*BONES*/ "
  37. ftxt += str( len(bone_names) ) + "\n"
  38. for bone_nam in bone_names:
  39. bone = skeleton.bones[ bone_nam ]
  40. if( b_cmnts ): ftxt += "\t/*\"" + bone.name + "\" BONE_ID " + str(bone_names.index(bone_nam)) + "*/\n"
  41. # name
  42. if( b_cmnts ): ftxt += "\t\t/*BONE_NAME*/ "
  43. ftxt += "\"" + bone.name + "\"\n"
  44. # head
  45. co = bone.head["ARMATURESPACE"]
  46. if( b_cmnts ): ftxt += "\t\t/*HEAD_ARMATURE_SPACE*/ "
  47. ftxt += str(co.x) + " " + str(co.y) + " " + str(co.z) + "\n"
  48. # tail
  49. co = bone.tail["ARMATURESPACE"]
  50. if( b_cmnts ): ftxt += "\t\t/*TAIL_ARMATURE_SPACE*/ "
  51. ftxt += str(co.x) + " " + str(co.y) + " " + str(co.z) + "\n"
  52. # matrix
  53. if( b_cmnts ): ftxt += "\t\t/*MATRIX_ARMATURE_SPACE*/ "
  54. for i_ in range(0, 4):
  55. for j_ in range(0, 4):
  56. ftxt += str( bone.matrix["ARMATURESPACE"][j_][i_] ) + " "
  57. ftxt += "\n"
  58. # write the parent
  59. if( b_cmnts ): ftxt += "\t\t/*PARENT_ID*/ "
  60. if not bone.parent:
  61. ftxt += "NULL\n"
  62. else:
  63. ftxt += str( bone_names.index( bone.parent.name ) )
  64. if( b_cmnts ): ftxt += " // " + bone.parent.name
  65. ftxt += "\n"
  66. # write the childs
  67. if( b_cmnts ): ftxt += "\t\t/*CHILD_IDS_NUM*/ "
  68. ftxt += str( len(bone.children) ) + " "
  69. if( b_cmnts ): ftxt += "/*CHILD_IDS*/ "
  70. for child in bone.children:
  71. ftxt += str( bone_names.index( child.name ) ) + " "
  72. if( b_cmnts ): ftxt += "/*" + child.name + "*/ "
  73. ftxt += "\n"
  74. return ftxt
  75. #===================================================================================================
  76. # ExportSkeleton =
  77. #===================================================================================================
  78. def ExportSkeleton( path, skeleton, b_cmnts ):
  79. #check if mesh is the correct class
  80. if( skeleton.__class__.__name__ != "Armature" ):
  81. ERROR( "The given func param is not a \"Armature\" class but a \"" + skeleton.__class__.__name__ + "\"" )
  82. return false
  83. INFO( "Trying to export skeleton \"" + skeleton.name + "\"" )
  84. filename = path + skeleton.name + ".skel"
  85. WriteFile( filename, ScriptSkeleton( skeleton, b_cmnts ) )
  86. INFO( "Skeleton exported!! \"" + filename + "\"" )