blender/scripts/startup/bl_operators/grease_pencil.py

64 lines
1.8 KiB
Python
Raw Permalink Normal View History

# SPDX-FileCopyrightText: 2025 Blender Authors
#
# SPDX-License-Identifier: GPL-2.0-or-later
import bpy
from bpy.types import Operator
from bpy.props import (
EnumProperty,
)
class GREASE_PENCIL_OT_relative_layer_mask_add(Operator):
"""Mask active layer with layer above or below"""
bl_idname = "grease_pencil.relative_layer_mask_add"
bl_label = "Mask with Layer Above/Below"
bl_options = {'REGISTER', 'UNDO'}
mode: EnumProperty(
name="Mode",
items=(
('ABOVE', "Above", ""),
('BELOW', "Below", "")
),
description="Which relative layer (above or below) to use as a mask",
default='ABOVE',
)
@classmethod
def poll(cls, context):
return (
(obj := context.active_object) is not None and
obj.is_editable and
obj.type == 'GREASEPENCIL' and
obj.data.layers.active is not None and
obj.data.is_editable
)
def execute(self, context):
obj = context.active_object
active_layer = obj.data.layers.active
if self.mode == 'ABOVE':
masking_layer = active_layer.next_node
elif self.mode == 'BELOW':
masking_layer = active_layer.prev_node
if masking_layer is None or type(masking_layer) != bpy.types.GreasePencilLayer:
self.report({'ERROR'}, "No layer found")
return {'CANCELLED'}
if masking_layer.name in active_layer.mask_layers:
self.report({'ERROR'}, "Layer is already added as a mask")
return {'CANCELLED'}
bpy.ops.grease_pencil.layer_mask_add(name=masking_layer.name)
active_layer.use_masks = True
return {'FINISHED'}
classes = (
GREASE_PENCIL_OT_relative_layer_mask_add,
)