[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [2726] contrib/py/scripts/addons: moving nuke chan io into a py package (1 addon), no other changes to file data, other changes coming next.

Campbell Barton ideasman42 at gmail.com
Mon Dec 5 19:06:57 CET 2011


Revision: 2726
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=2726
Author:   campbellbarton
Date:     2011-12-05 18:06:49 +0000 (Mon, 05 Dec 2011)
Log Message:
-----------
moving nuke chan io into a py package (1 addon), no other changes to file data, other changes coming next.

Added Paths:
-----------
    contrib/py/scripts/addons/io_anim_nuke_chan/
    contrib/py/scripts/addons/io_anim_nuke_chan/export_nuke_chan.py
    contrib/py/scripts/addons/io_anim_nuke_chan/import_nuke_chan.py

Removed Paths:
-------------
    contrib/py/scripts/addons/io_export_chan.py
    contrib/py/scripts/addons/io_import_chan.py

Copied: contrib/py/scripts/addons/io_anim_nuke_chan/export_nuke_chan.py (from rev 2725, contrib/py/scripts/addons/io_export_chan.py)
===================================================================
--- contrib/py/scripts/addons/io_anim_nuke_chan/export_nuke_chan.py	                        (rev 0)
+++ contrib/py/scripts/addons/io_anim_nuke_chan/export_nuke_chan.py	2011-12-05 18:06:49 UTC (rev 2726)
@@ -0,0 +1,174 @@
+# ##### 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": "Export animation to nuke (.chan)",
+    "author": "Michael Krupa",
+    "version": (1, 0),
+    "blender": (2, 6, 0),
+    "api": 36079,
+    "location": "File > Export > Nuke (.chan)",
+    "description": "Export object's animation to 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"}
+
+""" This script is an exporter to the nuke's .chan files.
+It takes the currently active object and writes it's transformation data
+into a text file with .chan extension."""
+
+import bpy
+from mathutils import Matrix
+from mathutils import Euler
+from math import radians
+from math import degrees
+from math import atan
+from math import atan2
+from math import tan
+
+
+def save_chan(context, filepath, y_up, rot_ord):
+    #check if we have anything selected, if not, end with no action
+    if not bpy.context.active_object:
+        return {'FINISHED'}
+
+    #get the active object
+    obj = bpy.context.active_object
+
+    #get the range of an animation
+    f_start = bpy.context.scene.frame_start
+    f_end = bpy.context.scene.frame_end
+
+    #get the resolution (needed by nuke)
+    res_x = bpy.context.scene.render.resolution_x
+    res_y = bpy.context.scene.render.resolution_y
+    res_ratio = res_y / res_x
+
+    #prepare the correcting matrix
+    rot_mat = Matrix.Rotation(radians(-90), 4, "X").to_4x4()
+
+    f = open(filepath, 'w')
+    #iterate the frames
+    for a in range(f_start, f_end, 1):
+        #reset the new line of a chan file
+        export_string = []
+
+        #set the current frame
+        bpy.context.scene.frame_set(a)
+
+        #get the objects world matrix
+        mat = obj.matrix_world
+
+        #if the setting is proper use the rotation matrix
+        #to flip the Z and Y axis
+        if y_up:
+            mat = rot_mat * mat
+
+        #create the first component of a new line, the frame number
+        export_string.append("%i\t" % a)
+
+        #create transform component
+        t = mat.to_translation()
+        export_string.append("%f\t%f\t%f\t" % t[:])
+
+        #create rotation component
+        r = mat.to_euler(rot_ord)
+
+        #export_string += "%f\t%f\t%f\t" % (r[0], r[1], r[2])
+        export_string.append("%f\t%f\t%f\t" % (degrees(r[0]),
+                                           degrees(r[1]),
+                                           degrees(r[2])))
+
+        #if we have a camera, add the focal length
+        if obj.type == 'CAMERA':
+            #I've found via the experiments that this is a blenders 
+            #default sensor size (in mm)
+            sensor_x = 32.0
+            #the vertical sensor size we get by multiplying the sensor_x by
+            #resolution ratio
+            sensor_y = sensor_x * res_ratio
+            cam_lens = obj.data.lens
+            #calculate the vertical field of view
+            #we know the vertical size of (virtual) sensor, the focal length
+            #of the camera so all we need to do is to feed this data to
+            #atan2 function whitch returns the degree (in radians) of 
+            #an angle formed by a triangle with two legs of a given lengths
+            vfov = degrees(atan2(sensor_y / 2, cam_lens))*2
+            export_string.append("%f\n" % vfov)
+
+        #when all is set and done write the new line
+        f.write("".join(export_string))
+
+    #after the whole loop close the file
+    f.close()
+
+    return {'FINISHED'}
+
+
+from bpy_extras.io_utils import ExportHelper
+from bpy.props import StringProperty, BoolProperty, EnumProperty
+
+
+class ExportChan(bpy.types.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 = EnumProperty(items=(('XYZ', "XYZ", "XYZ"),
+                               ('XZY', "XZY", "XZY"),
+                               ('YXZ', "YXZ", "YXZ"),
+                               ('YZX', "YZX", "YZX"),
+                               ('ZXY', "ZXY", "ZXY"),
+                               ('ZYX', "ZYX", "ZYX"),
+                               ),
+                        name="Rotation order",
+                        description="Choose the export rotation order",
+                        default='XYZ')
+    settings = {"y_up": y_up, "rot_ord": rot_ord}
+
+    @classmethod
+    def poll(cls, context):
+        return context.active_object != None
+
+    def execute(self, context):
+        return save_chan(context, self.filepath, self.y_up, self.rot_ord)
+
+
+def menu_func_export(self, context):
+    self.layout.operator(ExportChan.bl_idname, text="Nuke (.chan)")
+
+
+def register():
+    bpy.utils.register_class(ExportChan)
+    bpy.types.INFO_MT_file_export.append(menu_func_export)
+
+
+def unregister():
+    bpy.utils.unregister_class(ExportChan)
+    bpy.types.INFO_MT_file_export.remove(menu_func_export)
+
+
+if __name__ == "__main__":
+    register()

Copied: contrib/py/scripts/addons/io_anim_nuke_chan/import_nuke_chan.py (from rev 2725, contrib/py/scripts/addons/io_import_chan.py)
===================================================================
--- contrib/py/scripts/addons/io_anim_nuke_chan/import_nuke_chan.py	                        (rev 0)
+++ contrib/py/scripts/addons/io_anim_nuke_chan/import_nuke_chan.py	2011-12-05 18:06:49 UTC (rev 2726)
@@ -0,0 +1,187 @@
+# ##### 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": "Import animation from chan file (.chan)",
+    "author": "Michael Krupa",
+    "version": (1, 0),
+    "blender": (2, 6, 0),
+    "api": 36079,
+    "location": "File > Import > Nuke (.chan)",
+    "description": "Import object's animation from 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/index.php?"\
+        "func=detail&atid=467&aid=28368&group_id=153",
+    "category": "Import-Export"}
+
+""" This script is an importer for the nuke's .chan files"""
+
+import bpy
+from mathutils import Matrix
+from mathutils import Euler
+from mathutils import Vector
+from math import radians
+from math import degrees
+from math import atan
+from math import tan
+
+
+def read_chan(context, filepath, z_up, rot_ord):
+    #check if we have anything selected, if not, finish without doing anything.
+    if not bpy.context.active_object:
+        return {'FINISHED'}
+
+    #get the active object
+    obj = bpy.context.active_object
+
+    #get the resolution (needed to calculate the camera lens)
+    res_x = bpy.context.scene.render.resolution_x
+    res_y = bpy.context.scene.render.resolution_y
+    res_ratio = res_y / res_x
+
+    #prepare the correcting matrix
+    rot_mat = Matrix.Rotation(radians(90), 4, "X").to_4x4()
+
+    #read the file
+    f = open(filepath, 'r')
+
+    #iterate throug the files lines
+    for line in f.readlines():
+        #reset the target objects matrix
+        #(the one from whitch one we'll extract the final transforms)
+        m_trans_mat = Matrix()
+        m_trans_mat.to_4x4()
+
+        #strip the line
+        data = line.split()
+
+        #test if the line is not commented out
+        if data[0] != "#":
+
+            #set the frame number basing on the chan file
+            bpy.context.scene.frame_set(int(data[0]))
+
+            #read the translation values from the first three columns of line
+            v_transl = Vector([float(data[1]), float(data[2]), float(data[3])])
+            translation_mat = Matrix.Translation(v_transl)
+            translation_mat.to_4x4()
+
+            #read the rotations, and set the rotation order basing on the order
+            #set during the export (it's not being saved in the chan file
+            #you have to keep it noted somewhere
+            #the actual objects rotation order doesn't matter since the
+            #rotations are being extracted from the matrix afterwards

@@ Diff output truncated at 10240 characters. @@


More information about the Bf-extensions-cvs mailing list