[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [4348] trunk/py/scripts/addons: add simple VRML2 exporter, this is mainly intended for use with 3D printers - single mesh export only .

Campbell Barton ideasman42 at gmail.com
Mon Mar 11 12:14:35 CET 2013


Revision: 4348
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=4348
Author:   campbellbarton
Date:     2013-03-11 11:14:35 +0000 (Mon, 11 Mar 2013)
Log Message:
-----------
add simple VRML2 exporter, this is mainly intended for use with 3D printers - single mesh export only.
currently supports triangles, material/vertex colors.

Added Paths:
-----------
    trunk/py/scripts/addons/io_mesh_vrml2/
    trunk/py/scripts/addons/io_mesh_vrml2/__init__.py
    trunk/py/scripts/addons/io_mesh_vrml2/export_vrml2.py

Added: trunk/py/scripts/addons/io_mesh_vrml2/__init__.py
===================================================================
--- trunk/py/scripts/addons/io_mesh_vrml2/__init__.py	                        (rev 0)
+++ trunk/py/scripts/addons/io_mesh_vrml2/__init__.py	2013-03-11 11:14:35 UTC (rev 4348)
@@ -0,0 +1,110 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8-80 compliant>
+
+bl_info = {
+    "name": "VRML2 (Virtual Reality Modeling Language)",
+    "author": "Campbell Barton",
+    "blender": (2, 66, 0),
+    "location": "File > Export",
+    "description": "Exports the active mesh object to VRML2, supporting vertex and material colors",
+    "warning": "",
+    "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"
+                "Scripts/Import-Export/VRML2",
+    "tracker_url": "",
+    "support": 'OFFICIAL',
+    "category": "Import-Export"}
+
+if "bpy" in locals():
+    import imp
+    if "export_vrml2" in locals():
+        imp.reload(export_vrml2)
+
+
+import os
+import bpy
+from bpy.props import CollectionProperty, StringProperty, BoolProperty, EnumProperty
+from bpy_extras.io_utils import ExportHelper
+
+class ExportPLY(bpy.types.Operator, ExportHelper):
+    """Export a single object as a Stanford PLY with normals, """ \
+    """colors and texture coordinates"""
+    bl_idname = "export_mesh.ply"
+    bl_label = "Export PLY"
+
+    filename_ext = ".ply"
+    filter_glob = StringProperty(default="*.ply", options={'HIDDEN'})
+
+    use_mesh_modifiers = BoolProperty(
+            name="Apply Modifiers",
+            description="Apply Modifiers to the exported mesh",
+            default=True,
+            )
+    use_colors = BoolProperty(
+            name="Vertex Colors",
+            description="Export the active vertex color layer",
+            default=True)
+    color_type = EnumProperty(
+            name='Color',
+            items=(
+            ('MATERIAL', "Material Color", ""),
+            ('VERTEX', "Vertex Color", "")),
+            default='MATERIAL',
+            )
+
+    @classmethod
+    def poll(cls, context):
+        obj = context.active_object
+        return (obj is not None) and obj.type == 'MESH'
+
+    def execute(self, context):
+        filepath = self.filepath
+        filepath = bpy.path.ensure_ext(filepath, self.filename_ext)
+        from . import export_vrml2
+        keywords = self.as_keywords(ignore=("check_existing", "filter_glob"))
+        return export_vrml2.save(self, context, **keywords)
+
+    def draw(self, context):
+        layout = self.layout
+
+        row = layout.row()
+        row.prop(self, "use_mesh_modifiers")
+        row.prop(self, "use_colors")
+        row = layout.row()
+        row.active = self.use_colors
+        row.prop(self, "color_type")
+
+
+def menu_func_export(self, context):
+    self.layout.operator(ExportPLY.bl_idname, text="VRML2 (.wrl)")
+
+
+def register():
+    bpy.utils.register_module(__name__)
+
+    bpy.types.INFO_MT_file_export.append(menu_func_export)
+
+
+def unregister():
+    bpy.utils.unregister_module(__name__)
+
+    bpy.types.INFO_MT_file_export.remove(menu_func_export)
+
+if __name__ == "__main__":
+    register()


Property changes on: trunk/py/scripts/addons/io_mesh_vrml2/__init__.py
___________________________________________________________________
Added: svn:eol-style
   + native

Added: trunk/py/scripts/addons/io_mesh_vrml2/export_vrml2.py
===================================================================
--- trunk/py/scripts/addons/io_mesh_vrml2/export_vrml2.py	                        (rev 0)
+++ trunk/py/scripts/addons/io_mesh_vrml2/export_vrml2.py	2013-03-11 11:14:35 UTC (rev 4348)
@@ -0,0 +1,156 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+#  This program is free software; you can redistribute it and/or
+#  modify it under the terms of the GNU General Public License
+#  as published by the Free Software Foundation; either version 2
+#  of the License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software Foundation,
+#  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+# <pep8-80 compliant>
+
+import bpy
+import bmesh
+
+def save_bmesh(fw, bm, use_color, color_type, material_colors):
+    fw('#VRML V2.0 utf8\n')
+    fw('#modeled using blender3d http://blender.org\n')
+    fw('Shape {\n')
+    fw('\tappearance Appearance {\n')
+    fw('\t\tmaterial Material {\n')
+    fw('\t\t}\n')  # end 'Material'
+    fw('\t}\n')  # end 'Appearance'
+
+    fw('\tgeometry IndexedFaceSet {\n')
+    fw('\t\tcoord Coordinate {\n')
+    fw('\t\t\tpoint [ ')
+    v = None
+    for v in bm.verts:
+        fw("%.6f %.6f %.6f " % v.co[:])
+    del v
+    fw(']\n')  # end 'point[]'
+    fw('\t\t}\n')  # end 'Coordinate'
+
+    if use_color:
+        if color_type == 'MATERIAL':
+            fw('\t\tcolorPerVertex FALSE\n')
+            fw('\t\tcolor Color {\n')
+            fw('\t\t\tcolor [ ')
+            c = None
+            for c in material_colors:
+                fw(c)
+            del c
+            fw(']\n')  # end 'color[]'
+            fw('\t\t}\n')  # end 'Color'
+        elif color_type == 'VERTEX':
+            fw('\t\tcolorPerVertex TRUE\n')
+            fw('\t\tcolor Color {\n')
+            fw('\t\t\tcolor [ ')
+            v = None
+            c_none = "0.00 0.00 0.00 "
+            color_layer = bm.loops.layers.color.active
+            assert(color_layer is not None)
+            for v in bm.verts:
+                # weak, use first loops color
+                try:
+                    l = v.link_loops[0]
+                except:
+                    l = None
+                fw(c_none if l is None else ("%.2f %.2f %.2f " % l[color_layer][:]))
+                
+            del v
+            fw(']\n')  # end 'color[]'
+            fw('\t\t}\n')  # end 'Color'
+    
+    if use_color:
+        if color_type == 'MATERIAL':
+            fw('\t\tcolorIndex [ ')
+            i = None
+            for f in bm.faces:
+                i = f.material_index
+                if i >= len(material_colors):
+                    i = 0
+                fw("%d " % i)
+            del i
+            fw(']\n')  # end 'colorIndex[]'
+        elif color_type == 'VERTEX':
+            pass
+
+    fw('\t\tcoordIndex [ ')
+    f = fv = None
+    for f in bm.faces:
+        fv = f.verts[:]
+        fw("%d %d %d -1 " % (fv[0].index, fv[1].index, fv[2].index))
+    del f, fv
+    fw(']\n')  # end 'coordIndex[]'
+
+    fw('\t}\n')  # end 'IndexedFaceSet'
+    fw('}\n')  # end 'Shape'
+
+
+def save_object(fw, obj, use_mesh_modifiers, use_color, color_type):
+    
+    assert(obj.type == 'MESH')
+    
+    # TODO use_mesh_modifiers
+
+    me = obj.data
+    if obj.mode == 'EDIT':
+        bm_orig = bmesh.from_edit_mesh(me)
+        bm = bm_orig.copy()
+    else:
+        bm = bmesh.new()
+        bm.from_mesh(me)
+
+    bm.transform(obj.matrix_world)
+    bmesh.ops.triangulate(bm, faces=bm.faces, use_beauty=True)
+
+    # default empty
+    material_colors = []
+
+    if use_color:
+        if color_type == 'VERTEX':
+            if bm.loops.layers.color.active is None:
+                use_color = False
+        elif color_type == 'MATERIAL':
+            if not me.materials:
+                use_color = False
+            else:
+                material_colors = [
+                        "%.2f %.2f %.2f " % (m.diffuse_color[:] if m else (1.0, 1.0, 1.0))
+                        for m in me.materials]
+        else:
+            assert(0)
+
+    material_colors = []
+    save_bmesh(fw, bm, use_color, color_type, material_colors)
+
+    bm.free()
+
+def save_object_fp(filepath, obj, use_mesh_modifiers, use_color, color_type):
+    file = filepath(filepath)
+    save_object(file.write, use_color, color_type)
+    file.close()
+
+def save(operator,
+         context,
+         filepath="",
+         use_mesh_modifiers=True,
+         use_colors=True,
+         color_type='MATERIAL'):
+
+    save_object_fp(filepath, context.object,
+                   use_mesh_modifiers, use_color, color_type)
+
+    return {'FINISHED'}
+
+# save_object(open("/test.wrl", 'w', encoding='utf-8').write, bpy.context.object)


Property changes on: trunk/py/scripts/addons/io_mesh_vrml2/export_vrml2.py
___________________________________________________________________
Added: svn:eol-style
   + native



More information about the Bf-extensions-cvs mailing list