見出し画像

[Blender][スクリプト]サイドバーにオニオンスキン関連の機能追加

一つ目。

アクティブなグリースペンシルオブジェクトのオニオンスキン設定をサイドバーに追加。
一番下のボタンを押すと、シーン内の全グリースペンシルの内、今選択中のレイヤーだけがオン、それ以外がオフになります。つまり今描こうとしているレイヤーのオニオンスキンだけを表示します。

import bpy

class VIEW3D_PT_OnionSkinPanel(bpy.types.Panel):
    bl_label = "Onion Skin Settings"
    bl_idname = "VIEW3D_PT_onion_skin_panel"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = "Tool"
    
    @classmethod
    def poll(cls, context):
        return context.active_object and context.active_object.type == 'GPENCIL'
    
    def draw(self, context):
        layout = self.layout
        obj = context.active_object
        gpd = obj.data

        col = layout.column()
        col.prop(gpd, "onion_factor", text="Opacity", slider=True)
        col.prop(gpd, "ghost_before_range", text="Frames Before")
        col.prop(gpd, "ghost_after_range", text="Frames After")
        col.operator("gpencil.onion_skin_toggle", text="Off Inactive Onion Skin")

class GPENCIL_OT_OnionSkinToggle(bpy.types.Operator):
    bl_idname = "gpencil.onion_skin_toggle"
    bl_label = "Toggle Onion Skin"
    
    @classmethod
    def poll(cls, context):
        return context.active_object and context.active_object.type == 'GPENCIL'

    def execute(self, context):
        active_layer = context.active_gpencil_layer
        if active_layer is None:
            self.report({'WARNING'}, "No active GPencil layer found.")
            return {'CANCELLED'}
        
        for obj in bpy.data.objects:
            if obj.type == 'GPENCIL':
                for layer in obj.data.layers:
                    if layer == active_layer:
                        layer.use_onion_skinning = True
                    else:
                        layer.use_onion_skinning = False
                        
        return {'FINISHED'}

def register():
    bpy.utils.register_class(VIEW3D_PT_OnionSkinPanel)
    bpy.utils.register_class(GPENCIL_OT_OnionSkinToggle)

def unregister():
    bpy.utils.unregister_class(VIEW3D_PT_OnionSkinPanel)
    bpy.utils.unregister_class(GPENCIL_OT_OnionSkinToggle)

if __name__ == "__main__":
    register()



二つ目。

こっちはビュー毎の設定をサイドバーに表示したもの。
上から
・オニオンスキンのオンオフ
・非アクティブなレイヤーのフェード
・非アクティブなオブジェクトのフェード

import bpy

class VIEW3D_PT_grease_pencil_overlay_settings(bpy.types.Panel):
    bl_label = "Grease Pencil Overlay Settings"
    bl_idname = "VIEW3D_PT_grease_pencil_overlay_settings"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = 'View'

    def draw(self, context):
        layout = self.layout
        overlay = context.space_data.overlay

        # Onion Skin
        layout.prop(overlay, "use_gpencil_onion_skin", text="Onion Skin")

        # Fade Inactive Layers
        row = layout.row(align=True)
        row.prop(overlay, "use_gpencil_fade_layers", text="", icon='NONE')
        row.label(text="Inactive Layers")
        row.prop(overlay, "gpencil_fade_layer", text="", slider=True)

        # Fade Inactive Objects
        row = layout.row(align=True)
        row.prop(overlay, "use_gpencil_fade_objects", text="", icon='NONE')
        row.label(text="Inactive Objects")
        row.prop(overlay, "gpencil_fade_objects", text="", slider=True)

def register():
    bpy.utils.register_class(VIEW3D_PT_grease_pencil_overlay_settings)

def unregister():
    bpy.utils.unregister_class(VIEW3D_PT_grease_pencil_overlay_settings)

if __name__ == "__main__":
    register()

この記事が気に入ったらサポートをしてみませんか?