blender/blender python

프로퍼티 그룹

monstro 2025. 8. 6. 11:51
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로 이름을 입력받아 설정
  • 생성할 오브젝트의 크기 : FloatVectorPropertyX / 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