diff --git a/blender/dump.py b/blender/dump.py deleted file mode 100644 index c74bd72..0000000 --- a/blender/dump.py +++ /dev/null @@ -1,75 +0,0 @@ -import json - -import bmesh -import bpy -from bpy_extras.io_utils import ExportHelper -from bpy.props import StringProperty - - -def dump_mesh_to_json(context, filepath): - if context.object.mode == 'OBJECT': - bpy.ops.object.mode_set(mode='EDIT') - - m = context.object.data - b = bmesh.from_edit_mesh(m) - - print("info:") - - data = {} - data['vertices'] = [list(vert.co) for vert in b.verts] - - data['edges for vert'] = [] - for vert in b.verts: - data['edges for vert'].append([e.index for e in vert.link_edges]) - data['faces for vert'] = [] - for vert in b.verts: - data['faces for vert'].append([e.index for e in vert.link_faces]) - - edges = [] - for edge in b.edges: - edges.append([v.index for v in edge.verts]) - data['edges'] = edges - - data['faces for edge'] = [] - for edge in b.edges: - data['faces for edge'].append([f.index for f in edge.link_faces]) - - faces = [] - for face in b.faces: - faces.append([v.index for v in face.verts]) - data['faces'] = faces - - data['edges for face'] = [] - for face in b.faces: - data['edges for face'].append([e.index for e in face.edges]) - - json.dump(data, open(filepath, 'w')) - bpy.ops.object.mode_set(mode='OBJECT') - - -class DumpMesh(bpy.types.Operator, ExportHelper): - '''dump mesh for surfaces''' - bl_idname = 'object.dump_mesh' - bl_label = 'Dump Mesh' - filename_ext = ".json" - - filter_glob = StringProperty( - default="*.json", - options={'HIDDEN'}, - ) - - @classmethod - def poll(cls, context): - return context.active_object is not None - - def execute(self, context): - dump_mesh_to_json(context, self.filepath) - return {'FINISHED'} - - -def register(): - bpy.utils.register_class(DumpMesh) - - -def unregister(): - bpy.utils.unregister_class(DumpMesh) diff --git a/blender/load.py b/blender/load.py deleted file mode 100644 index 05c84ea..0000000 --- a/blender/load.py +++ /dev/null @@ -1,68 +0,0 @@ -import json - -import bmesh -import bpy -from bpy_extras.io_utils import ExportHelper -from bpy.props import FloatProperty, BoolProperty, FloatVectorProperty -from bpy.props import StringProperty -from bpy_extras import object_utils - - -class DumpMesh(bpy.types.Operator, ExportHelper): - '''load json mesh from surfaces''' - bl_idname = 'object.load_mesh' - bl_label = 'Load Mesh' - filename_ext = ".json" - - filter_glob = StringProperty( - default="*.json", - options={'HIDDEN'}, - ) - - # generic transform props - view_align = BoolProperty( - name="Align to View", - default=False, - ) - location = FloatVectorProperty( - name="Location", - subtype='TRANSLATION', - ) - rotation = FloatVectorProperty( - name="Rotation", - subtype='EULER', - ) - - @classmethod - def poll(cls, context): - return context.active_object is not None - - def execute(self, context): - data = json.load(open(self.filepath, 'r')) - mesh = bpy.data.meshes.new("Imported") - - bm = bmesh.new() - - for v_co in data['vertices']: - bm.verts.new(v_co) - - for f_idx in data['faces']: - bm.faces.new([bm.verts[i] for i in f_idx]) - - bm.to_mesh(mesh) - mesh.update() - - # add the mesh as an object into the scene with this utility module - try: - object_utils.object_data_add(context, mesh, operator=self) - except: - pass - return {'FINISHED'} - - -def register(): - bpy.utils.register_class(DumpMesh) - - -def unregister(): - bpy.utils.unregister_class(DumpMesh) diff --git a/blender/surf.py b/blender/surf.py new file mode 100644 index 0000000..09bb346 --- /dev/null +++ b/blender/surf.py @@ -0,0 +1,144 @@ +import json + +import bmesh +import bpy +from bpy_extras.io_utils import ExportHelper +from bpy.props import StringProperty, BoolProperty, FloatVectorProperty +from bpy_extras import object_utils + + +class SMBDumpMesh(bpy.types.Operator, ExportHelper): + '''dump mesh info into .json file for smbsurf''' + bl_idname = 'object.dump_mesh' + bl_label = 'Dump Mesh' + filename_ext = ".json" + + filter_glob = StringProperty( + default="*.json", + options={'HIDDEN'}, + ) + + @classmethod + def poll(cls, context): + if context.active_object.type == 'MESH': + return context.active_object + else: + return None + + def execute(self, context): + if context.object.mode == 'OBJECT': + bpy.ops.object.mode_set(mode='EDIT') + + m = context.object.data + b = bmesh.from_edit_mesh(m) + + data = {} + data['vertices'] = [list(vert.co) for vert in b.verts] + + data['edges for vert'] = [] + for vert in b.verts: + data['edges for vert'].append([e.index for e in vert.link_edges]) + data['faces for vert'] = [] + for vert in b.verts: + data['faces for vert'].append([e.index for e in vert.link_faces]) + + edges = [] + for edge in b.edges: + edges.append([v.index for v in edge.verts]) + data['edges'] = edges + + data['faces for edge'] = [] + for edge in b.edges: + data['faces for edge'].append([f.index for f in edge.link_faces]) + + faces = [] + for face in b.faces: + faces.append([v.index for v in face.verts]) + data['faces'] = faces + + data['edges for face'] = [] + for face in b.faces: + data['edges for face'].append([e.index for e in face.edges]) + + json.dump(data, open(self.filepath, 'w')) + bpy.ops.object.mode_set(mode='OBJECT') + return {'FINISHED'} + + +class SMBLoadMesh(bpy.types.Operator, ExportHelper): + '''load json mesh from smbsurf''' + bl_idname = 'object.load_mesh' + bl_label = 'Load Mesh' + filename_ext = ".json" + + filter_glob = StringProperty( + default="*.json", + options={'HIDDEN'}, + ) + + # generic transform props + view_align = BoolProperty( + name="Align to View", + default=False, + ) + location = FloatVectorProperty( + name="Location", + subtype='TRANSLATION', + ) + rotation = FloatVectorProperty( + name="Rotation", + subtype='EULER', + ) + + @classmethod + def poll(cls, context): + return context.active_object is not None + + def execute(self, context): + data = json.load(open(self.filepath, 'r')) + mesh = bpy.data.meshes.new("Imported") + + bm = bmesh.new() + + for v_co in data['vertices']: + bm.verts.new(v_co) + + for f_idx in data['faces']: + bm.faces.new([bm.verts[i] for i in f_idx]) + + bm.to_mesh(mesh) + mesh.update() + + # add the mesh as an object into the scene with this utility module + try: + object_utils.object_data_add(context, mesh, operator=self) + except: + pass + return {'FINISHED'} + + +class SMBPanel(bpy.types.Panel): + bl_space_type = 'VIEW_3D' + bl_region_type = 'TOOLS' + bl_idname = "VIEW3D_PT_TEST_PANEL" + bl_label = "smbsurf" + + def draw(self, context): + self.layout.operator('object.dump_mesh', icon='EXPORT') + self.layout.operator('object.load_mesh', icon='IMPORT') + + @classmethod + def poll(cls, context): + return (context.object is not None) + + +def register(): + bpy.utils.register_class(SMBDumpMesh) + bpy.utils.register_class(SMBLoadMesh) + bpy.utils.register_class(SMBPanel) + + +def unregister(): + bpy.utils.unregister_class(SMBDumpMesh) + bpy.utils.unregister_class(SMBLoadMesh) + bpy.utils.unregister_class(SMBPanel)