1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright 2016-2020 by Nathan Lovato, Daniel Oakey, Razvan Radulescu, and contributors
# This file is part of Power Sequencer.
"""
Find the two closest cuts, trims and deletes all strips above in the range but leaves some
margin. Removes the newly formed gap.
"""
import bpy
from .utils.functions import convert_duration_to_frames, trim_strips
from .utils.doc import doc_name, doc_idname, doc_brief, doc_description
from .utils.functions import find_closest_surrounding_cuts_frames, find_strips_in_range
class POWER_SEQUENCER_OT_trim_to_surrounding_cuts(bpy.types.Operator):
"""*Brief* Automatically trim to surrounding cuts with some time offset
Finds the two cuts closest to the mouse cursor and trims the footage in between, leaving a
little time offset. It's useful after you removed some bad audio but you need to keep some
video around for a transition.
By default, the tool leaves a 0.2 seconds margin on either side of the trim.
"""
doc = {
"name": doc_name(__qualname__),
"demo": "",
"description": doc_description(__doc__),
"shortcuts": [
(
{"type": "LEFTMOUSE", "value": "PRESS", "shift": True, "alt": True},
{},
"Trim to Surrounding Cuts",
)
],
"keymap": "Sequencer",
}
bl_idname = doc_idname(__qualname__)
bl_label = doc["name"]
bl_description = doc_brief(doc["description"])
bl_options = {"REGISTER", "UNDO"}
margin: bpy.props.FloatProperty(
name="Trim margin",
description="Margin to leave on either sides of the trim in seconds",
default=0.2,
min=0,
)
gap_remove: bpy.props.BoolProperty(
name="Remove gaps",
description="When trimming the sequences, remove gaps automatically",
default=True,
)
@classmethod
def poll(cls, context):
return context
def invoke(self, context, event):
if not context.sequences:
return {"CANCELLED"}
frame = context.region.view2d.region_to_view(
x=event.mouse_region_x, y=event.mouse_region_y
)[0]
frame = round(frame)
margin_frame = convert_duration_to_frames(context, self.margin)
left_cut_frame, right_cut_frame = find_closest_surrounding_cuts_frames(context, frame)
if abs(left_cut_frame - right_cut_frame) <= margin_frame * 2:
self.report(
{"WARNING"},
("The trim margin is larger than the gap\n" "Use snap trim or reduce the margin"),
)
return {"CANCELLED"}
to_delete, to_trim = find_strips_in_range(
left_cut_frame, right_cut_frame, context.sequences
)
trim_start, trim_end = (left_cut_frame + margin_frame, right_cut_frame - margin_frame)
trim_strips(context, trim_start, trim_end, to_trim, to_delete)
if self.gap_remove:
frame_to_remove_gap = right_cut_frame - 1 if frame == right_cut_frame else frame
# bpy.ops.anim.change_frame(frame_to_remove_gap)
context.scene.frame_current = frame_to_remove_gap
bpy.ops.power_sequencer.gap_remove()
context.scene.frame_current = trim_start
return {"FINISHED"}
|