Skip to content
Snippets Groups Projects
__init__.py 4.65 KiB
Newer Older
# ##### 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 #####

bl_info = {
    "name": "Nuke Animation Format (.chan)",
    "author": "Michael Krupa",
    "version": (1, 0),
    "blender": (2, 6, 0),
    "api": 36079,
    "location": "File > Import/Export > Nuke (.chan)",
    "description": "Import/Export object's animation with nuke",
    "warning": "",
    "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/"
                "Scripts/Import-Export/Nuke",
    "tracker_url": "http://projects.blender.org/tracker/?"
                   "func=detail&atid=467&aid=28368&group_id=153",
    "category": "Import-Export"}


# To support reload properly, try to access a package var,
# if it's there, reload everything
if "bpy" in locals():
    import imp
    if "import_nuke_chan" in locals():
        imp.reload(import_nuke_chan)
    if "export_nuke_chan" in locals():
        imp.reload(export_nuke_chan)


import bpy
from bpy.types import Operator
from bpy_extras.io_utils import ImportHelper, ExportHelper
from bpy.props import (StringProperty,
                       BoolProperty,
                       EnumProperty)

# property shared by both operators
rot_ord = EnumProperty(
        name="Rotation order",
        description="Choose the export rotation order",
        items=(('XYZ', "XYZ", "XYZ"),
               ('XZY', "XZY", "XZY"),
               ('YXZ', "YXZ", "YXZ"),
               ('YZX', "YZX", "YZX"),
               ('ZXY', "ZXY", "ZXY"),
               ('ZYX', "ZYX", "ZYX"),
               ),
        default='XYZ')


class ImportChan(Operator, ImportHelper):
    '''Import animation from .chan file, exported from nuke or houdini. ''' \
    '''The importer uses frame numbers from the file'''
    bl_idname = "import_scene.import_chan"
    bl_label = "Import chan file"

    filename_ext = ".chan"

    filter_glob = StringProperty(default="*.chan", options={'HIDDEN'})

    rot_ord = rot_ord
    z_up = BoolProperty(
            name="Make Z up",
            description="Switch the Y and Z axis",
            default=True)

    @classmethod
    def poll(cls, context):
        return context.active_object is not None

    def execute(self, context):
        from . import import_nuke_chan
        return import_nuke_chan.read_chan(context,
                                          self.filepath,
                                          self.z_up,
                                          self.rot_ord)


class ExportChan(Operator, ExportHelper):
    '''Export the animation to .chan file, readable by nuke and houdini. ''' \
    '''The exporter uses frames from the frames range'''
    bl_idname = "export.export_chan"
    bl_label = "Export chan file"

    filename_ext = ".chan"
    filter_glob = StringProperty(default="*.chan", options={'HIDDEN'})
    y_up = BoolProperty(
            name="Make Y up",
            description="Switch the Y and Z axis",
            default=True)
    rot_ord = rot_ord

    @classmethod
    def poll(cls, context):
        return context.active_object is not None

    def execute(self, context):
        from . import export_nuke_chan
        return export_nuke_chan.save_chan(context,
                                          self.filepath,
                                          self.y_up,
                                          self.rot_ord)


def menu_func_import(self, context):
    self.layout.operator(ImportChan.bl_idname, text="Nuke (.chan)")


def menu_func_export(self, context):
    self.layout.operator(ExportChan.bl_idname, text="Nuke (.chan)")


def register():
    bpy.utils.register_class(ImportChan)
    bpy.utils.register_class(ExportChan)
    bpy.types.INFO_MT_file_import.append(menu_func_import)
    bpy.types.INFO_MT_file_export.append(menu_func_export)


def unregister():
    bpy.utils.unregister_class(ImportChan)
    bpy.utils.unregister_class(ExportChan)
    bpy.types.INFO_MT_file_import.remove(menu_func_import)
    bpy.types.INFO_MT_file_export.remove(menu_func_export)


if __name__ == "__main__":
    register()