4 Name: 'Metasequoia(.mqo)...'
\r
7 Tooltip: 'Import from Metasequoia file format (.mqo)'
\r
9 __author__=['ousttrue']
\r
10 __url__ = ["http://gunload.web.fc2.com/blender/"]
\r
11 __version__= '0.6 2010/05/05'
\r
16 This script imports a mqo into Blender for editing.
\r
18 0.2 20080123: update.
\r
19 0.3 20091125: modify for linux.
\r
20 0.4 20100310: rewrite.
\r
21 0.5 20100311: create armature from mikoto bone.
\r
22 0.6 20100505: C extension.
\r
23 0.7 20100606: integrate 2.4 and 2.5.
\r
24 0.8 20100619: fix multibyte object name.
\r
28 ###############################################################################
\r
30 ###############################################################################
\r
35 from meshio import mqo
\r
38 return sys.version_info[0]<3
\r
43 from Blender import Mathutils
\r
51 from bpy.props import *
\r
57 def has_mikoto(mqo):
\r
61 def __createMaterials(scene, mqo, directory):
\r
63 create blender materials and renturn material list.
\r
68 if len(mqo.materials)>0:
\r
69 for material_index, m in enumerate(mqo.materials):
\r
71 material=bl.createMqoMaterial(m)
\r
72 materials.append(material)
\r
74 texture_name=m.getTexture()
\r
75 if texture_name!='':
\r
76 if texture_name in textureMap:
\r
77 texture=textureMap[texture_name]
\r
79 # load texture image
\r
80 if os.path.isabs(texture_name):
\r
85 path = os.path.join(directory, texture_name)
\r
87 if os.path.exists(path):
\r
88 print("create texture:", path)
\r
89 texture, image=bl.createTexture(path)
\r
90 textureMap[texture_name]=texture
\r
91 imageMap[material_index]=image
\r
93 print("%s not exits" % path)
\r
95 bl.materialAddTexture(material, texture)
\r
99 return materials, imageMap
\r
102 def __createObjects(scene, mqo, root, materials, imageMap, scale):
\r
104 create blender mesh objects.
\r
109 for o in mqo.objects:
\r
110 mesh, mesh_object=bl.createMesh(scene, o.getName())
\r
113 stack_depth=len(stack)-1
\r
114 print(o.depth, stack_depth)
\r
115 if o.depth<stack_depth:
\r
116 for i in range(stack_depth-o.depth):
\r
118 bl.objectMakeParent(stack[-1], mesh_object)
\r
119 stack.append(mesh_object)
\r
121 if o.getName().startswith('sdef'):
\r
122 objects.append(mesh_object)
\r
123 elif o.getName().startswith('anchor'):
\r
124 bl.objectLayerMask(mesh_object, [0, 1])
\r
125 elif o.getName().startswith('bone'):
\r
126 bl.objectLayerMask(mesh_object, [0, 1])
\r
128 bl.meshAddMqoGeometry(mesh, o, materials, imageMap, scale)
\r
133 def __execute(filename, scene, scale=1.0):
\r
136 if not io.read(filename):
\r
137 print("fail to load",filename)
\r
141 materials, imageMap=__createMaterials(scene, io, os.path.dirname(filename))
\r
144 root=bl.createEmptyObject(scene, os.path.basename(filename))
\r
145 objects=__createObjects(scene, io, root, materials, imageMap, scale)
\r
148 # create mikoto bone
\r
149 armature_object=create_armature(scene, io)
\r
150 if armature_object:
\r
151 root.makeParent([armature_object])
\r
153 # create bone weight
\r
154 create_bone_weight(scene, io, armature_object, objects)
\r
157 ###############################################################################
\r
159 ###############################################################################
\r
162 def execute_24(filename):
\r
166 filename=filename.decode(bl.INTERNAL_ENCODING)
\r
167 print("##start mqo_import.py##")
\r
168 print(bl.INTERNAL_ENCODING, bl.FS_ENCODING)
\r
169 print("parse mqo file: %s" % (filename))
\r
171 Blender.Window.WaitCursor(1)
\r
172 t = Blender.sys.time()
\r
175 scene = Blender.Scene.GetCurrent()
\r
176 __execute(filename, scene)
\r
179 print('finished in %.2f seconds' % (Blender.sys.time()-t))
\r
182 Blender.Window.WaitCursor(0)
\r
185 Blender.Window.FileSelector(execute_24, 'Import MQO', '*.mqo')
\r
188 def execute_25(*args):
\r
192 class IMPORT_OT_mqo(bpy.types.Operator):
\r
193 '''Import from Metasequoia file format (.mqo)'''
\r
194 bl_idname = "import_scene.mqo"
\r
195 bl_label = 'Import MQO'
\r
197 # List of operator properties, the attributes will be assigned
\r
198 # to the class instance from the operator settings before calling.
\r
200 path = StringProperty(
\r
202 description="File path used for importing the MQO file",
\r
203 maxlen= 1024, default= "")
\r
204 filename = StringProperty(
\r
206 description="Name of the file.")
\r
207 directory = StringProperty(
\r
209 description="Directory of the file.")
\r
211 scale = FloatProperty(
\r
213 description="Scale the MQO by this value",
\r
214 min=0.0001, max=1000000.0,
\r
215 soft_min=0.001, soft_max=100.0, default=0.01)
\r
217 def execute(self, context):
\r
219 self.properties.path,
\r
221 self.properties.scale)
\r
224 def invoke(self, context, event):
\r
226 wm.add_fileselect(self)
\r
227 return 'RUNNING_MODAL'
\r
231 def menu_func(self, context):
\r
232 self.layout.operator(
\r
233 IMPORT_OT_mqo.bl_idname,
\r
234 text="Metasequoia (.mqo)")
\r
237 bpy.types.register(IMPORT_OT_mqo)
\r
238 bpy.types.INFO_MT_file_import.append(menu_func)
\r
241 bpy.types.unregister(IMPORT_OT_mqo)
\r
242 bpy.types.INFO_MT_file_import.remove(menu_func)
\r
244 if __name__=="__main__":
\r