Adding Sequencer Tools, a (basic and beginning) collection of tools for the Sequencer.
[blender-addons-contrib.git] / sequencer_tools / export_strips.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 import bpy
20 from bpy.props import StringProperty
21
22 class SEQExportStrip(bpy.types.Operator):
23     """
24     Export (render) selected strips in sequencer
25     """
26     bl_idname = "sequencer.export_strips"
27     bl_label = "Export Strips"
28     filepath = StringProperty(subtype='FILE_PATH')
29
30     def execute(self, context):
31         sce = bpy.context.scene
32         back_filepath = sce.render.filepath
33         back_seq = sce.render.use_sequencer
34         back_start = sce.frame_start
35         back_end = sce.frame_end
36         hidden_seq = []
37
38         sce.render.use_sequencer = True
39         sce.render.filepath = self.filepath
40         seq = sce.sequence_editor
41         start = end = None
42         for strip in seq.sequences_all:
43             if not strip.select:
44                 if not strip.mute:
45                     strip.mute = True
46                     hidden_seq.append(strip)
47                 continue
48             if start is None or strip.frame_final_start < start:
49                 start = strip.frame_final_start
50             if end is None or strip.frame_final_end < end:
51                 end = strip.frame_final_end
52         sce.frame_start = start
53         sce.frame_end = end
54
55         # Non-blocking render!
56         bpy.ops.render.render("INVOKE_DEFAULT", animation=True)
57
58         for strip in hidden_seq:
59             strip.mute = False
60         sce.render.use_sequencer = back_seq
61         sce.render.filepath = back_filepath
62         sce.frame_start = back_start
63         sce.frame_end = back_end
64         return {"FINISHED"}
65
66     def invoke(self, context, event):
67         if not self.filepath:
68             self.filepath = bpy.context.scene.render.filepath
69         winman = context.window_manager
70         winman.fileselect_add(self)
71         return {"RUNNING_MODAL"}
72