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 |