728x90
반응형
- 개요
프로퍼티 그룹은 동적으로 정의된 속성 집합의 기본 클래스로
사용하면 기존에 존재하던 데이터를 UI나 파이썬으로 접근할 수 있는 사용자 정의 데이터로 확장할 수 있다
단, 프로퍼티 그룹을 사용하는 경우에 주의해야 하는 점이 몇가지 존재한다
- Blender 데이터에 할당되기 이전에 등록해야 함 : 따라서 register 함수에서 등록
- 등록된 프로퍼티 그룹은 등록해제도 동일하게 수행해야 함 : 따라서 unregister 함수에서 등록해제
이때, 프로퍼티 그룹을 등록하고 등록해제하기 위해 types.Scene.my_tool 프로퍼티를 사용한다
my_tool은 사용자 정의 속성 또는 프로퍼티 그룹을 지정하는 용도로 사용한다
1) 프로퍼티 그룹 클래스
import bpy
class MyProperties(bpy.types.PropertyGroup):
my_string : bpy.props.StringProperty(name="Enter Name")
my_float_vector : bpy.props.FloatVectorProperty(name="Enter Size", soft_min=0, soft_max=1000)
my_enum : bpy.props.EnumProperty(
name="Enumerator / Dropdown",
description="Sample Text",
items=[
# identifier / description / name
('OP1', "Add Cube", ""),
('OP2', "Add Sphere", ""),
('OP3', "Add Suzanne", ""),
]
)
...
MyProperty 클래스는 프로퍼티 그룹 클래스로 사용한다
따라서 bpy.types.PropertyGroup 클래스를 상속받아 정의한다
프로퍼티는 총 3개로 각각 다음과 같다
- 생성할 오브젝트의 이름 : StringProperty로 이름을 입력받아 설정
- 생성할 오브젝트의 크기 : FloatVectorProperty로 X / Y / Z 좌표값을 입력받아 설정
- 생성할 오브젝트의 종류 : EnumProperty로 드롭다운 메뉴에서 생성할 오브젝트를 선택
2) 메인 패널 클래스
...
class pg_PT_main_panel(bpy.types.Panel):
bl_label = "Main Panel"
bl_idname = "pg_PT_main_panel"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = "New Tab"
def draw(self, context):
layout = self.layout
scene = context.scene
mytool = scene.my_tool
layout.prop(mytool, "my_string")
layout.prop(mytool, "my_float_vector")
layout.prop(mytool, "my_enum")
row = layout.row()
row.operator("pg.myop_operator")
...
pg_PT_main_panel 클래스는 수행하는 기능을 담고 있는 패널 클래스이다
따라서 bpy.types.Panel 클래스를 상속받아 정의한다
패널을 정의하는 draw 함수를 위와 같이 구성하였다
- layout.prop : scene.my_tool로부터 3개의 사용자 정의 프로퍼티를 가져오고 값을 설정
- row.operator : 설정한 값을 기반으로 operator 클래스를 통해 동작을 수행
3) operator 클래스
...
class pg_OT_my_op(bpy.types.Operator):
bl_label = "Operator"
bl_idname = "pg.myop_operator"
def execute(self, context):
scene = context.scene
mytool = scene.my_tool
# Create Object
if mytool.my_enum == 'OP1':
bpy.ops.mesh.primitive_cube_add()
elif mytool.my_enum == 'OP2':
bpy.ops.mesh.primitive_uv_sphere_add()
elif mytool.my_enum == 'OP3':
bpy.ops.mesh.primitive_monkey_add()
# Rename Object
bpy.context.object.name = mytool.my_string
# Resize Object
bpy.ops.transform.resize(
value=(
mytool.my_float_vector[0],
mytool.my_float_vector[1],
mytool.my_float_vector[2]
)
)
return {'FINISHED'}
...
pg_OT_my_op 클래스는 수행하는 동작을 정의하는 클래스이다
따라서 bpy.types.Operator 클래스를 상속받아 정의하였다
수행하는 동작을 정의하는 execute 함수를 위와 같이 구성하였다
- scene.my_tool로부터 EnumProperty의 값을 가져와 적합한 오브젝트를 생성
- scene.my_tool로부터 StringProperty의 값을 가져와 생성한 오브젝트의 이름을 설정
- scene.my_tool로부터 FloatVectorProperty의 값을 가져와 오브젝트의 사이즈를 설정
4) 클래스 등록 / 등록해제
...
classes = [
MyProperties,
pg_PT_main_panel,
pg_OT_my_op,
]
def register():
for cls in classes:
bpy.utils.register_class(cls)
bpy.types.Scene.my_tool = bpy.props.PointerProperty(type=MyProperties)
def unregister():
for cls in classes:
bpy.utils.unregister_class(cls)
del bpy.types.Scene.my_tool
if __name__ == "__main__":
register()
생성한 클래스들을 등록 / 등록해제하기 위해 register 함수와 unregister 함수를 정의한다
이때 register 함수에서는 scene.my_tool 프로퍼티에 생성한 프로퍼티 그룹을 등록하고
unregister 함수에서는 등록한 scene.my_tool 프로퍼티를 제거한다
- 최종 실행 결과
728x90
반응형
'blender > blender python' 카테고리의 다른 글
| 모듈 임포트 (0) | 2025.08.06 |
|---|---|
| 프로퍼티 서브타입 (0) | 2025.08.06 |
| 머티리얼 생성과 할당 (0) | 2025.07.30 |
| 클래스 네이밍 컨벤션 (0) | 2025.07.30 |
| 드롭다운 메뉴 (0) | 2025.07.30 |