- 개요
원하는 텍스트를 생성하는 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을 적용하고
또 Origin과 Extrude 여부에 따라 텍스트를 조정한다
이후 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의 클래스를 등록한다
- 최종 실행 결과
'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 |