본문 바로가기
블렌더

3D블렌더 2.83+애드온(add-on) 만들기+파이썬

반응형

첫 게시글 보기 : https://itadventure.tistory.com/319

 

3D 블렌더 2.83 + 파이썬 스크립트와의 만남

3D 블렌더 프로그램에는 파이썬 스크립트 엔진이 내장되어 있는데요. 관련 스크립트를 통해 재미난 것들을 할 수가 있지요. 앞으로 이걸로 어디까지 할 수 있을지 알아 보는 시간을 가져보도록 �

itadventure.tistory.com

크레이가 블렌더에서 파이썬을 시작한지 2주가 되었습니다.
오늘은 블렌더 파이썬의 꽃, 애드온(add-on)을 만드는 방법을 살펴보도록 하겠습니다.

블렌더에서 제공하는 기본 애드온을 블렌더 시스템에 추가하는 방법에 대해서는 아래에 나와 있습니다.
https://itadventure.tistory.com/283 b v

 

블렌더 키트 애드온 ( BlenderKit add-on ) - #1. 모델편

블렌더에는 블렌더키트라는 도구가 있는데요. 매우 강력한 애드온 기능입니다. 무료로 사용가능한 오브젝트, 매트리얼 등을 제공하거든요. 위에 보이는 집도 사실 무료 컨텐츠에 포함된 도구입

itadventure.tistory.com

블렌더키트는 정말이지 멋진 애드온이 아닐 수 없지요.
뭐 이런 수준은 아니더라도 "애드온을 만들어볼 수 있다면.."하고 꿈꿔오신 분이 계시다면
오늘 내용 제대로 만나신 겁니다 :)

오늘 내용은 나만의 애드온이지 아쉽게도 다른 사람도 볼 수 있는 애드온은 아닙니다.
아마도 쓸만한 애드온이어야 블렌더에서 기본 애드온으로 채택을 해줄텐데요.
관련 내용 알게되면 추후 공유하도록 하겠습니다 :)


애드온은 앞에서 다뤄온 파이썬 스크립트로 기능을 만드는 건 똑같습니다만,
일부 내용이 추가가 됩니다.
우선 거두절미하고, 블렌더를 시작, 스크립트 창을 준비해주신 다음 아래 스크립트를 입력해주세요.
기능은 지난 챕터와 기능은 동일한 것입니다만 소스가 더욱 길어졌지요? :)

bl_info = {
    "name": "CraySpin",
    "author": "Cray",
    "version": (0, 1, 0),
    "blender": (2, 80, 0),
    "location": "View3D > Sidebar > cray",
    "description": "오브젝트 배열 복사 애드온 샘플코드",
    "category": "CrayTool",
}

import bpy

def print(*datas):
    window=bpy.context.window_manager.windows[0]
    screen = window.screen
    for area in screen.areas:
        if area.type == 'CONSOLE':
            for data in datas:
                bpy.ops.console.scrollback_append(
                    {'window': window, 'screen': screen, 'area': area},
                    text=str(data))

class CRAYSPIN_PROPERTY(bpy.types.PropertyGroup):
    x_repeat: bpy.props.IntProperty(name="X반복", default=0)
    y_repeat: bpy.props.IntProperty(name="Y반복", default=0)

class CRAYSPIN_PT_panel(bpy.types.Panel):
    bl_label = "크레이 스핀 도구창"
    bl_category = "크레이"
    bl_space_type = "VIEW_3D"
    bl_region_type = "UI"

    def draw(self, context):
        row = self.layout.row()
        row.label(text="선택 오브젝트 : ", icon='OBJECT_DATA')
        box = self.layout.box()
        obj = context.object
        if obj is not None:
          box.label(text=obj.name, icon='KEYFRAME')
          
        row = self.layout.row()
        row.prop(context.scene.crayspin_property, "x_repeat")
        row = self.layout.row()
        row.prop(context.scene.crayspin_property, "y_repeat")
        
        row = self.layout.row()
        row.operator("cray.spinoperator", text="복사")
    
class CRAYSPIN_Operator(bpy.types.Operator):
    bl_idname = 'cray.spinoperator'
    bl_label = 'cray.spinoperator'

    def execute(self, context):        
        print(context.scene.crayspin_property.x_repeat, context.scene.crayspin_property.y_repeat)
        
        selected_objects=bpy.context.selected_objects
        if len(selected_objects) == 0:
            self.report({'ERROR'}, "오브젝트를 선택하세요")
            return {'FINISHED'}

        org_name=selected_objects[0].name;
                
        for x in range(0, context.scene.crayspin_property.x_repeat + 1):
            for y in range(0, context.scene.crayspin_property.y_repeat + 1):
                if x==0 and y==0:        continue
                bpy.data.objects[org_name].select_set(True)
                bpy.ops.object.duplicate_move(
                    OBJECT_OT_duplicate={"mode":'TRANSLATION'},
                    TRANSFORM_OT_translate={"value":(x * 4, y * 4, 0)})
                bpy.ops.object.select_all(action='DESELECT')

        self.report({'INFO'}, "오브젝트가 복사되었습니다.")
        
        return {'FINISHED'}
    
classes = (
   CRAYSPIN_PROPERTY,
   CRAYSPIN_PT_panel,
   CRAYSPIN_Operator,
)


def register():
    for cls in classes:
        bpy.utils.register_class(cls)
    bpy.types.Scene.crayspin_property = bpy.props.PointerProperty(type=CRAYSPIN_PROPERTY)


def unregister():
    for cls in classes:
        bpy.utils.unregister_class(cls)
    del bpy.types.Scene.crayspin_property


if __name__ == "__main__":
    register()

그리고 잠깐! 아직 실행하지는 말아 주세요.
이 파일을 블렌더의 애드온 폴더에 저장해주셔야 합니다.

통상적으로 C:\Program Files\Blender Foundation\Blender 2.83\2.83\scripts\addons 폴더이나 약간 다를 수는 있습니다.
블렌더 실행폴더 하위 디렉토리인 \2.83\scripts\addon 폴더에 이 파일을 저장해 주세요.
파일명은 자유롭게 주셔도 되나 확장자는 .py가 되어야 하는데 크레이는 CraySpin.py 로 지어주었습니다.

이제 블렌더를 종료했다가 다시 실행해주시기 바랍니다.
그리고 3D 뷰어 창에서 단축키 N키를 치면 도구 창들이 등장하긴 하지만,
위의 스크립트로 만든 기능은 뜨질 않으실 겁니다.

자, 이제 애드온을 설치해볼 차례입니다.
편집 - 환경설정 메뉴로 이동하신 다음,

애드온 탭을 선택하고,

Cray 를 검색해보세요. 그러면 CrayTool 카테고리의 CraySpin 애드온이 검색이 되실 겁니다.

왼쪽 버튼을 체크하는 순간, 

3d뷰어의 도구창에 크레이 탭이 등장할 것입니다

그리고 체크를 풀면, 

다시 탭이 사라지게 되는 것이지요.

이 탭의 기능은 지난번과 동일합니다.
단지 이 기능이 애드온 기능이 되어버렸기 때문에 언제든지 환경설정에서
블렌더에 추가하거나 제거할 수가 있는 것입니다.

또 하나 이 화살표 부분을 클릭 탭을 펼쳐봅시다.

그러면 이 애드온의 상세 정보가 나오는데요. bl_info 라고해서 이 정보를 적어주는 부분이 따로 있습니다.


그러면 지난 챕터와 다른 부분을 하나씩 살펴보도록 할까요?

제일먼저 애드온의 정보가 등장합니다.
이 정보는 import bpy 보다도 먼저 등장하는데요. 순전히 애드온을 위한 변수입니다.

bl_info = {
    "name": "CraySpin",
    "author": "Cray",
    "version": (0, 1, 0),
    "blender": (2, 80, 0),
    "location": "View3D > Sidebar > cray",
    "description": "오브젝트 배열 복사 애드온 샘플코드",
    "category": "CrayTool",
}

category 와 name 이 애드온 검색에 사용된다는 점을 제외하면 아래 화면에 보이는 내용 그대로 사람들에게
"이것은 어떠어떠한 애드온이오!"라고 소개해준다고 생각하시면 되겠습니다.

그 다음으로는 클래스를 등록하는 부분이 변경되었습니다.
먼저 클래스를 아래와 같이 배열로 선언하고,

classes = (
   CRAYSPIN_PROPERTY,
   CRAYSPIN_PT_panel,
   CRAYSPIN_Operator,
)

register()라는 함수에서 이 클래스들을 한꺼번에 등록해주는데요.
이 때 프로퍼티는 별도로 생성해주어야 합니다.

def register():
    for cls in classes:
        bpy.utils.register_class(cls)
    bpy.types.Scene.crayspin_property = bpy.props.PointerProperty(type=CRAYSPIN_PROPERTY)

register() 함수는 아주 특별한 기능인데요.
환경설정에서 애드온을 검색하고 체크상자를 체크하는 순간 실행됩니다.
그리고 체크하고 난 다움부터는 블렌더를 종료하고 다시 시작하면 항상 자동으로 실행됩니다.
그러니까 애드온 전용 함수인 셈입니다.
물론 애드온 체크를 푼다면 다음번 실행부터는 더 이상 실행되지 않지요 :)

이어서 지난 시간에는 못보던 기능의 함수가 하나 정의되는데요.
바로 unregister() 함수입니다.

def unregister():
    for cls in classes:
        bpy.utils.unregister_class(cls)
    del bpy.types.Scene.crayspin_property

이 함수도 아주 특별한 함수인데요.
애드온을 체크 해제할때 실행됩니다.
애드온에 사용했던 클래스를 모두 해제하는데 프로퍼티도 별도로 해제해주는 것이지요.
클래스가 해제되면 추가되었던 UI들도 모두 함께 삭제됩니다.

다음으로 나오는 내용은 사실 없어도 아무 문제는 없는 코드입니다.
이 두줄을 지워도 애드온 기능은 아무 지장이 없는데요.

if __name__ == "__main__":
    register()

사실 이 기능은 애드온 개발자를 위한 코드입니다.
만일 애드온을 개발하는데 하나 수정할 때마다 매번 블레더를 껐다가 켰다 확인하려면 얼마나 귀찮겠습니까?
이 코드는 그런 점을 보완해 줍니다.

__name__ 이라는 변수는 블렌더 실행 후 스크립트의 텍스트 에디터에서 실행할 때__main__ 값을 갖습니다.
그러니까 블렌더가 처음 실행하면서 애드온 목록을 조사할 때는 if문에 의해서 register() 함수가가 실행되지 않는 것이지요. register() 함수가 자동 실행되는 건 애드온 체크를 한 경우만 해당합니다.

이는 애드온 개발자가 스크립트를 실행할 떄만 바로 register()함수를 실행하게 해줌으로써
블렌더를 다시 껐다 켰다 하지 않아도 되는 장점이 있습니다.

필요하신 분에게 도움이 되셨길 바랍니다.
오늘도 여기까지 읽어주신 분들께 감사드립니다.


하나님의 말씀을 마음에 담아두면 환난 날에 도움이 됩니다.
하나님과 사람에게 모두 사랑받는 여러분 되시길 소원합니다 :)

예수는 그 지혜와 그 키가 자라가며 하나님과 사람에게 더 사랑스러워 가시더라
-누가복음2장 52절 말씀-

다음 게시글 : https://itadventure.tistory.com/333

 

블렌더 파이썬 CMD 모드

오늘은 블렌더의 간단한 팁 하나를 공개하도록 하겠습니다. 바로 블렌더 화면을 띄우지 않고 블렌더를 실행하는 것인데요. 파이썬이 메쉬를 자동 생성하여 블렌더 파일로 저장까지도 할 수 있��

itadventure.tistory.com

 

반응형