blender/blender python

텍스트 Add-On

monstro 2025. 7. 9. 17:30
728x90
반응형

- 개요

원하는 텍스트를 생성하는 Add-On을 만들어본다

기능은 다음과 같이 구성하였다

  • 입력한 텍스트를 생성
  • 텍스트의 Scale 조정
  • 텍스트의 첫번째 단어가 아닌 텍스트의 중심생성 기준으로 결정할지 선택
  • 텍스트를 Extrude할지 선택하고 설정한 비율만큼 Extrude

 

텍스트를 생성하고 설정하는 과정은 다음과 같다

텍스트를 입력하는 동작Edit Mode에서만 수행이 가능한데, 따라서 다음과 같이 진행한다

  • 텍스트 생성
  • Edit Mode를 열고 텍스트 입력
  • Edit Mode를 닫고 이후 텍스트 설정

 

1) Add-On으로 확장하기 위한 bl_info 정의

bl_info = {
    "name": "Text Tool",
    "author": "Monstro",
    "version": (1, 0),
    "blender": (4, 1, 0),
    "location": "View3D > Add > Mesh > New Object",
    "description": "Adds a Custom Text",
    "warning": "",
    "doc_url": "",
    "category": "Add Mesh",
}

...

 

해당 클래스를 실제 Add-On으로 확장하기 위한 bl_info를 정의하였다

필요한 정보를 작성하여 클래스를 Add-On으로 확장할 수 있다

 

2) 메인 패널 클래스 정의

import bpy

# PT = Panel Type
class OBJECT_PT_TextTool(bpy.types.Panel):
    bl_label = "Text Tool"
    bl_idname = "OBJECT_PT_TextTool"
    bl_space_type = 'VIEW_3D'
    bl_region_type = 'UI'
    bl_category = 'Text Tool'

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

        row = layout.row()
        row.operator("wm.textop", icon="SYNTAX_OFF", text="Add Text")
        
...

 

텍스트를 생성하고 설정하는 기능(클래스)을 제공하기 위한 메인 패널 클래스를 정의하였다

패널을 동작시키는 draw 함수를 정의하고 행을 하나 추가한다

추가한 행의 operator Add-On 클래스의 아이디네임을 넘겨주어 클래스의 기능을 사용할 수 있다

 

3) Add-On 클래스 정의

...

# OT = Operator Type        
class WM_OT_TextOp(bpy.types.Operator):
    bl_label = "Text Tool Operator"
    bl_idname = "wm.textop"
    
    text : bpy.props.StringProperty(name="Enter Text:")
    scale : bpy.props.FloatVectorProperty(name="Scale:", default=(1, 1, 1))
    center : bpy.props.BoolProperty(name="Center Origin", default=False)
    extrude : bpy.props.BoolProperty(name="Extrude", default=False)
    extrude_amount : bpy.props.FloatProperty(name="Extrude Amount:", default=0.06)
    
    def execute(self, context):
        
        t = self.text
        s = self.scale
        c = self.center
        e = self.extrude
        ea = self.extrude_amount
        
        # If you want to modify text`s property, enter Edit Mode
        bpy.ops.object.text_add(enter_editmode=True, align='WORLD', location=(0, 0, 0), scale=(1, 1, 1))
        # Start Text with first letter
        bpy.ops.font.delete(type='PREVIOUS_WORD')
        bpy.ops.font.text_insert(text=t)
        # Turn off Edit Mode
        bpy.ops.object.editmode_toggle()
        
        bpy.ops.transform.resize(value=s)
        
        # Text will be extruded
        if e == True:
            bpy.context.object.data.extrude = ea    
        
        # Text will be aligned in center
        if c == True:
            bpy.context.object.data.align_x = 'CENTER'
            bpy.context.object.data.align_y = 'CENTER'
            
        
        return {'FINISHED'}

    def invoke(self, context, event):
        return context.window_manager.invoke_props_dialog(self)
        
...

 

텍스트를 다루는 Add-On 클래스 WM_OT_TextOp를 정의하였다

우선 프로퍼티를 작업한다

메인 패널에서 보여지는 해당 클래스의 라벨이름 해당 클래스의 아이디네임을 정의한다

다음으로 텍스트 관련 5개의 프로퍼티를 정의하였는데, 각각 다음과 같다

  • text = 생성할 텍스트, 입력한 값으로 설정됨
  • scale = 생성한 텍스트의 scale
  • center = True로 설정되면 텍스트의 중심을 기준으로 텍스트를 생성함
  • extrude = True로 설정되면 텍스트는 extrude되어 생성됨
  • extrude_amount = 텍스트가 extrude되는 경우 적용할 비율

 

다음으로 Add-On 클래스의 동작에 필요한 함수들을 정의한다

Add-On이 동작하기 위해 필요한 execute 함수를 우선 작업하였다

가장 먼저 프로퍼티들을 함수 내부에서 사용하기 위해 지역 변수에 저장한다

 

이어서 텍스트를 입력한 값으로 생성하기 위한 로직을 구성하였다

과정은 다음과 같다

  • 텍스트 생성
  • 디폴트 텍스트를 전부 지우고, 첫번째 글자부터 시작
  • Edit Mode를 열고 입력한 텍스트를 적용한 후에 Edit Mode를 닫음

 

텍스트의 생성-설정이 끝났으므로 패널에서 입력한 텍스트의 scale을 적용하고

OriginExtrude 여부에 따라 텍스트를 조정한다

이후 FINISHED를 리턴하여 execute 함수를 종료한다

 

invoke 함수에서는 WM_OT_TextOp클래스를 담은 대화상자를 띄운다

 

4) 클래스의 등록

...

def register():
    bpy.utils.register_class(OBJECT_PT_TextTool)
    bpy.utils.register_class(WM_OT_TextOp)


def unregister():
    bpy.utils.unregister_class(OBJECT_PT_TextTool)
    bpy.utils.unregister_class(WM_OT_TextOp)


if __name__ == "__main__":
    register()

 

resgiser 함수unregister 함수에 메인 패널의 클래스와 Add-On의 클래스를 등록한다

 

- 최종 실행 결과

 

728x90
반응형

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

커스텀 레이아웃  (0) 2025.07.17
커스텀 노드 그룹  (0) 2025.07.16
대화 상자  (0) 2025.07.09
BPY를 이용한 키프레임 모디파이어 추가  (0) 2025.07.02
다이아몬드 쉐이더 Add-On  (0) 2025.07.02