e64023f046b8031a11c85e7db7861daa56f9ce5f
[blender.git] / intern / cycles / blender / addon / xml.py
1 #
2 # Copyright 2011, Blender Foundation.
3 #
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software Foundation,
16 # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 #
18
19 # <pep8 compliant>
20
21 # XML exporter for generating test files, not intended for end users
22
23 import os
24 import bpy
25 from bpy_extras.io_utils import ExportHelper
26 import xml.etree.ElementTree as etree
27 import xml.dom.minidom as dom
28
29
30 def strip(root):
31     root.text = None
32     root.tail = None
33
34     for elem in root:
35         strip(elem)
36
37
38 def write(node, fname):
39     strip(node)
40
41     s = etree.tostring(node)
42     s = dom.parseString(s).toprettyxml()
43
44     f = open(fname, "w")
45     f.write(s)
46
47
48 class ExportCyclesXML(bpy.types.Operator, ExportHelper):
49     ''''''
50     bl_idname = "export_mesh.cycles_xml"
51     bl_label = "Export Cycles XML"
52
53     filename_ext = ".xml"
54
55     @classmethod
56     def poll(cls, context):
57         return context.active_object != None
58
59     def execute(self, context):
60         filepath = bpy.path.ensure_ext(self.filepath, ".xml")
61
62         # get mesh
63         scene = context.scene
64         object = context.object
65
66         if not object:
67             raise Exception("No active object")
68
69         mesh = object.to_mesh(scene, True, 'PREVIEW')
70
71         if not mesh:
72             raise Exception("No mesh data in active object")
73
74         # generate mesh node
75         nverts = ""
76         verts = ""
77         P = ""
78
79         for v in mesh.vertices:
80             P += "%f %f %f  " % (v.co[0], v.co[1], v.co[2])
81
82         for i, f in enumerate(mesh.faces):
83             nverts += str(len(f.vertices)) + " "
84
85             for v in f.vertices:
86                 verts += str(v) + " "
87             verts += " "
88
89         node = etree.Element('mesh', attrib={'nverts': nverts, 'verts': verts, 'P': P})
90
91         # write to file
92         write(node, filepath)
93
94         return {'FINISHED'}
95
96
97 def register():
98     pass
99
100
101 def unregister():
102     pass
103
104 if __name__ == "__main__":
105     register()