2.6 Python UI files:
[blender.git] / release / scripts / startup / bl_operators / anim.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8-80 compliant>
20
21 import bpy
22 from bpy.types import Operator
23
24
25 class ANIM_OT_keying_set_export(Operator):
26     "Export Keying Set to a python script"
27     bl_idname = "anim.keying_set_export"
28     bl_label = "Export Keying Set..."
29
30     filepath = bpy.props.StringProperty(name="File Path", description="Filepath to write file to")
31     filter_folder = bpy.props.BoolProperty(name="Filter folders", description="", default=True, options={'HIDDEN'})
32     filter_text = bpy.props.BoolProperty(name="Filter text", description="", default=True, options={'HIDDEN'})
33     filter_python = bpy.props.BoolProperty(name="Filter python", description="", default=True, options={'HIDDEN'})
34
35     def execute(self, context):
36         if not self.filepath:
37             raise Exception("Filepath not set")
38
39         f = open(self.filepath, "w")
40         if not f:
41             raise Exception("Could not open file")
42
43         scene = context.scene
44         ks = scene.keying_sets.active
45
46         f.write("# Keying Set: %s\n" % ks.name)
47
48         f.write("import bpy\n\n")
49         f.write("scene= bpy.data.scenes[0]\n\n")  # XXX, why not use the current scene?
50
51         # Add KeyingSet and set general settings
52         f.write("# Keying Set Level declarations\n")
53         f.write("ks= scene.keying_sets.new(name=\"%s\")\n" % ks.name)
54
55         if not ks.is_path_absolute:
56             f.write("ks.is_path_absolute = False\n")
57         f.write("\n")
58
59         f.write("ks.bl_options = %r\n" % ks.bl_options)
60         f.write("\n")
61
62         # generate and write set of lookups for id's used in paths
63         id_to_paths_cache = {}  # cache for syncing ID-blocks to bpy paths + shorthands
64
65         for ksp in ks.paths:
66             if ksp.id is None:
67                 continue
68             if ksp.id in id_to_paths_cache:
69                 continue
70
71             # - idtype_list is used to get the list of id-datablocks from bpy.data.*
72             #   since this info isn't available elsewhere
73             # - id.bl_rna.name gives a name suitable for UI,
74             #   with a capitalised first letter, but we need
75             #   the plural form that's all lower case
76             idtype_list = ksp.id.bl_rna.name.lower() + "s"
77             id_bpy_path = "bpy.data.%s[\"%s\"]" % (idtype_list, ksp.id.name)
78
79             # shorthand ID for the ID-block (as used in the script)
80             short_id = "id_%d" % len(id_to_paths_cache)
81
82             # store this in the cache now
83             id_to_paths_cache[ksp.id] = [short_id, id_bpy_path]
84
85         f.write("# ID's that are commonly used\n")
86         for id_pair in id_to_paths_cache.values():
87             f.write("%s = %s\n" % (id_pair[0], id_pair[1]))
88         f.write("\n")
89
90         # write paths
91         f.write("# Path Definitions\n")
92         for ksp in ks.paths:
93             f.write("ksp = ks.paths.add(")
94
95             # id-block + data_path
96             if ksp.id:
97                 # find the relevant shorthand from the cache
98                 id_bpy_path = id_to_paths_cache[ksp.id][0]
99             else:
100                 id_bpy_path = "None"  # XXX...
101             f.write("%s, '%s'" % (id_bpy_path, ksp.data_path))
102
103             # array index settings (if applicable)
104             if ksp.use_entire_array:
105                 f.write(", index=-1")
106             else:
107                 f.write(", index=%d" % ksp.array_index)
108
109             # grouping settings (if applicable)
110             # NOTE: the current default is KEYINGSET, but if this changes, change this code too
111             if ksp.group_method == 'NAMED':
112                 f.write(", group_method='%s', group_name=\"%s\"" % (ksp.group_method, ksp.group))
113             elif ksp.group_method != 'KEYINGSET':
114                 f.write(", group_method='%s'" % ksp.group_method)
115
116             # finish off
117             f.write(")\n")
118
119         f.write("\n")
120         f.close()
121
122         return {'FINISHED'}
123
124     def invoke(self, context, event):
125         wm = context.window_manager
126         wm.fileselect_add(self)
127         return {'RUNNING_MODAL'}