Fix T72118: Enable Windows 10 Non-client DPI Scaling
[blender.git] / intern / cycles / app / io_export_cycles_xml.py
1 #
2 # Copyright 2011-2013 Blender Foundation
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 # http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15 #
16
17 # XML exporter for generating test files, not intended for end users
18
19 import xml.etree.ElementTree as etree
20 import xml.dom.minidom as dom
21
22 import bpy
23 from bpy_extras.io_utils import ExportHelper
24 from bpy.props import PointerProperty, StringProperty
25
26 def strip(root):
27     root.text = None
28     root.tail = None
29
30     for elem in root:
31         strip(elem)
32
33 def write(node, fname):
34     strip(node)
35
36     s = etree.tostring(node)
37     s = dom.parseString(s).toprettyxml()
38
39     f = open(fname, "w")
40     f.write(s)
41
42 class CyclesXMLSettings(bpy.types.PropertyGroup):
43     @classmethod
44     def register(cls):
45         bpy.types.Scene.cycles_xml = PointerProperty(
46                                         type=cls,
47                                         name="Cycles XML export Settings",
48                                         description="Cycles XML export settings")
49         cls.filepath = StringProperty(
50                         name='Filepath',
51                         description='Filepath for the .xml file',
52                         maxlen=256,
53                         default='',
54                         subtype='FILE_PATH')
55
56     @classmethod
57     def unregister(cls):
58         del bpy.types.Scene.cycles_xml
59
60 # User Interface Drawing Code
61 class RenderButtonsPanel():
62     bl_space_type = 'PROPERTIES'
63     bl_region_type = 'WINDOW'
64     bl_context = "render"
65
66     @classmethod
67     def poll(cls, context):
68         return context.engine == 'CYCLES'
69
70
71 class PHYSICS_PT_fluid_export(RenderButtonsPanel, bpy.types.Panel):
72     bl_label = "Cycles XML Exporter"
73
74     def draw(self, context):
75         layout = self.layout
76
77         cycles = context.scene.cycles_xml
78
79         #layout.prop(cycles, "filepath")
80         layout.operator("export_mesh.cycles_xml")
81
82
83 # Export Operator
84 class ExportCyclesXML(bpy.types.Operator, ExportHelper):
85     bl_idname = "export_mesh.cycles_xml"
86     bl_label = "Export Cycles XML"
87
88     filename_ext = ".xml"
89
90     @classmethod
91     def poll(cls, context):
92         return (context.active_object is not None)
93
94     def execute(self, context):
95         filepath = bpy.path.ensure_ext(self.filepath, ".xml")
96
97         # get mesh
98         scene = context.scene
99         object = context.active_object
100
101         if not object:
102             raise Exception("No active object")
103
104         mesh = object.to_mesh(scene, True, 'PREVIEW')
105
106         if not mesh:
107             raise Exception("No mesh data in active object")
108
109         # generate mesh node
110         nverts = ""
111         verts = ""
112         uvs = ""
113         P = ""
114
115         for v in mesh.vertices:
116             P += "%f %f %f  " % (v.co[0], v.co[1], v.co[2])
117
118         verts_and_uvs = zip(mesh.tessfaces, mesh.tessface_uv_textures.active.data)
119
120         for f, uvf in verts_and_uvs:
121             vcount = len(f.vertices)
122             nverts += str(vcount) + " "
123
124             for v in f.vertices:
125                 verts += str(v) + " "
126
127             uvs += str(uvf.uv1[0]) + " " + str(uvf.uv1[1]) + " "
128             uvs += str(uvf.uv2[0]) + " " + str(uvf.uv2[1]) + " "
129             uvs += str(uvf.uv3[0]) + " " + str(uvf.uv3[1]) + " "
130             if vcount==4:
131                 uvs += " " + str(uvf.uv4[0]) + " " + str(uvf.uv4[1]) + " "
132
133
134         node = etree.Element('mesh', attrib={'nverts': nverts.strip(), 'verts': verts.strip(), 'P': P, 'UV' : uvs.strip()})
135
136         # write to file
137         write(node, filepath)
138
139         return {'FINISHED'}
140
141 def register():
142     bpy.utils.register_module(__name__)
143
144 def unregister():
145     bpy.utils.unregister_module(__name__)
146
147 if __name__ == "__main__":
148     register()