text: #
  # Copyright 2011-2013 Blender Foundation
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #
  # http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  #
  
  # XML exporter for generating test files, not intended for end users
  
  import xml.etree.ElementTree as etree
  import xml.dom.minidom as dom
  
  import bpy
  from bpy_extras.io_utils import ExportHelper
  from bpy.props import PointerProperty, StringProperty
  
  def strip(root):
      root.text = None
      root.tail = None
  
      for elem in root:
          strip(elem)
  
  def write(node, fname):
      strip(node)
  
      s = etree.tostring(node)
      s = dom.parseString(s).toprettyxml()
  
      f = open(fname, "w")
      f.write(s)
  
  class CyclesXMLSettings(bpy.types.PropertyGroup):
      @classmethod
      def register(cls):
          bpy.types.Scene.cycles_xml = PointerProperty(
                                          type=cls,
                                          name="Cycles XML export Settings",
                                          description="Cycles XML export settings")
          cls.filepath = StringProperty(
                          name='Filepath',
                          description='Filepath for the .xml file',
                          maxlen=256,
                          default='',
                          subtype='FILE_PATH')
  
      @classmethod
      def unregister(cls):
          del bpy.types.Scene.cycles_xml
  
  # User Interface Drawing Code
  class RenderButtonsPanel():
      bl_space_type = 'PROPERTIES'
      bl_region_type = 'WINDOW'
      bl_context = "render"
  
      @classmethod
      def poll(cls, context):
          return context.engine == 'CYCLES'
  
  
  class PHYSICS_PT_fluid_export(RenderButtonsPanel, bpy.types.Panel):
      bl_label = "Cycles XML Exporter"
  
      def draw(self, context):
          layout = self.layout
  
          cycles = context.scene.cycles_xml
  
          #layout.prop(cycles, "filepath")
          layout.operator("export_mesh.cycles_xml")
  
  
  # Export Operator
  class ExportCyclesXML(bpy.types.Operator, ExportHelper):
      bl_idname = "export_mesh.cycles_xml"
      bl_label = "Export Cycles XML"
  
      filename_ext = ".xml"
  
      @classmethod
      def poll(cls, context):
          return (context.active_object is not None)
  
      def execute(self, context):
          filepath = bpy.path.ensure_ext(self.filepath, ".xml")
  
          # get mesh
          scene = context.scene
          object = context.active_object
  
          if not object:
              raise Exception("No active object")
  
          mesh = object.to_mesh(scene, True, 'PREVIEW')
  
          if not mesh:
              raise Exception("No mesh data in active object")
  
          # generate mesh node
          nverts = ""
          verts = ""
          uvs = ""
          P = ""
  
          for v in mesh.vertices:
              P += "%f %f %f  " % (v.co[0], v.co[1], v.co[2])
  
          verts_and_uvs = zip(mesh.tessfaces, mesh.tessface_uv_textures.active.data)
  
          for f, uvf in verts_and_uvs:
              vcount = len(f.vertices)
              nverts += str(vcount) + " "
  
              for v in f.vertices:
                  verts += str(v) + " "
  
              uvs += str(uvf.uv1[0]) + " " + str(uvf.uv1[1]) + " "
              uvs += str(uvf.uv2[0]) + " " + str(uvf.uv2[1]) + " "
              uvs += str(uvf.uv3[0]) + " " + str(uvf.uv3[1]) + " "
              if vcount==4:
                  uvs += " " + str(uvf.uv4[0]) + " " + str(uvf.uv4[1]) + " "
  
  
          node = etree.Element('mesh', attrib={'nverts': nverts.strip(), 'verts': verts.strip(), 'P': P, 'UV' : uvs.strip()})
  
          # write to file
          write(node, filepath)
  
          return {'FINISHED'}
  
  def register():
      bpy.utils.register_module(__name__)
  
  def unregister():
      bpy.utils.unregister_module(__name__)
  
  if __name__ == "__main__":
      register()
  