blender/blender python

드롭다운 메뉴

monstro 2025. 7. 30. 10:58
728x90
반응형

- 개요

드롭다운 메뉴를 추가하여 사용할 수 있는 옵션을 나타나는 여러개의 행에서 하나를 선택할 수 있도록 하고

선택한 옵션에 따라 각각 다른 동작을 수행할 수 있도록 구현한다

 

1) 메인 패널 클래스

import bpy

class ADDONNAME_PT_TemplatePanel(bpy.types.Panel):
    bl_label = "Name of the Panel"
    bl_idname = "ADDONNAME_PT_TemplatePanel"
    bl_space_type = "VIEW_3D"
    bl_region_type = 'UI'
    bl_category = "Template Tab"
    
    def draw(self, context):
        layout = self.layout
        layout.operator("wm.template_operator")
        
...

 

메인 패널 클래스를 위와 같이 구성하였다

패널로 사용하므로 bpy.types.Panel을 상속받도록 정의하였다

패널을 생성하는 draw 함수에서 드롭다운 메뉴를 보여주는 동작을 수행하는 클래스operator로 사용한다

따라서 드롭다운 메뉴를 보여주는 방식으로 패널이 동작한다

 

2) 드롭다운 메뉴 클래스

class ADDONAME_OT_TemplateOperator(bpy.types.Operator):
    bl_label = "Template Operator"
    bl_idname = "wm.template_operator"
    
    preset_enum : bpy.props.EnumProperty(
        name = "",
        description = "Select an Option",
        # Set items Attribute to add row of DropDownMenu
        
        items = [
            # identifier / name / description
            ('OP1', "Cube", "Add a Cube to the Scene"),
            ('OP2', "Sphere", "Add a Sphere to the Scene"),
            ('OP3', "Suzanne", "Add a Suzanne to the Scene")
        ]
    )
    
    
    def invoke(self, context, event):
        wm = context.window_manager
        return wm.invoke_props_dialog(self)
    
    
    def draw(self, context):
        layout = self.layout
        layout.prop(self, "preset_enum")
        
   
    def execute(self, context):
        if self.preset_enum == 'OP1':
            bpy.ops.mesh.primitive_cube_add()
        elif self.preset_enum == 'OP2':
            bpy.ops.mesh.primitive_uv_sphere_add()
        elif self.preset_enum == 'OP3':
            bpy.ops.mesh.primitive_monkey_add()
            
        return {'FINISHED'}
        
...

 

드롭다운 메뉴를 사용하기 위해서는 EnumProperty를 사용해야 한다

이때 EnumProperty의 어트리뷰트튜플 형태로 정의해야 한다

정의한 어트리뷰트는 다음과 같다

  • name : 드롭다운 메뉴의 이름
  • description : 드롭다운 메뉴에 대한 설명
  • items : 드롭다운 메뉴를 구성하는 옵션(행)

 

items 어트리뷰트의 경우 해당 옵션(행)을 구성하는 어트리튜브를 설정해야 한다

튜플을 사용하여 해당 옵션(행)을 구성하며 다음과 같이 설정하였다

  • identifier : 해당 옵션(행)파이썬에서 접근하기 위한 구분자
  • name : 해당 옵션(행)의 이름
  • description : 해당 옵션(행)에 대한 설명

 

마지막으로 Operator 클래스의 동작을 정의하는 execute 함수에서

EnumProperty의 identifier에 따라 다른 동작을 수행하도록 정의하였다

 

3) Add-On 클래스의 등록과 등록 해제

...

classes = (
    ADDONNAME_PT_TemplatePanel, ADDONAME_OT_TemplateOperator
)

register, unregister = bpy.utils.register_classes_factory(classes)
 
 
if __name__ == "__main__":
    register()

 

register_classes_factory를 사용하여 생성한 Add-On 클래스들을 등록 / 등록해제 하였다

 

- 최종 실행 결과

 

728x90
반응형

'blender > blender python' 카테고리의 다른 글

머티리얼 생성과 할당  (0) 2025.07.30
클래스 네이밍 컨벤션  (0) 2025.07.30
BPY 코드 작성 시 유용하게 사용할 수 있는 팁  (0) 2025.07.23
register 함수 / unregister 함수 개선  (0) 2025.07.23
단축키  (0) 2025.07.23