본문 바로가기
블렌더

3D 블렌더 2.83 + 파이썬 스크립트 / 패널 UI 추가하기

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

 

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

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

itadventure.tistory.com

블렌더 파이썬에는 블렌더 화면 UI(User Interface) 를 추가하고 실행할 수 있는 기능이 있습니다.
블렌더 화면의 우측 속성탭에 있는 요소들을 패널(Panel)이라고 부르는데요.

파이썬 스크립트를 이용하면 이 패널 형식으로 내가 원하는 내용을 추가할 수 있습니다.
물론 기능 작동도 되도록 말이지요.

패널을 추가하는 공식 스크립트 안내가
초심자가 소화하기는 좀 어렵게 되어 있어서
초단순하게 구성해보았습니다.

우선 지난 번처럼 블렌더 파이썬 스크립트 입력창을 준비해 주시구요.
아래 스크립트를 입력해 주시기 바랍니다.

import bpy

class CrayPanel(bpy.types.Panel):
    bl_label = "블렌더 파이썬의 패널 연습"
    bl_idname = "SAMPLE_PT_LA"
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "object"

    def draw(self, context):
        self.layout.row().label(text="블렌더의 세계!", icon='WORLD_DATA')

bpy.utils.register_class(CrayPanel)

그리고 스크립트를 실행하면 좌측 하단 정보 창에는 스크립트를 실행한 기록이 보이지만,

화면에 아무런 변화가 없는듯 합니다.
정말로 변화가 없는 걸까요? 오른쪽의 오브젝트 속성 아이콘을 선택해 주세요,.

그리고 화면 안쪽을 스크롤해서 내려보면 아래와 같은 화면을 찾으실 수 있을 겁니다.
바로 이게 파이썬 스크립트로 만들어 낼 수 있는 패널입니다.

좌측 화살표 버튼을 누르면 접기, 펼치기도 잘 되고 마치 블렌더에 원래부터 있었던 메뉴같지 않습니까? :)

소스코드를 설명드리자면,

아래 부분은 블렌더 파이썬 스크립트를 사용하기 위해 항상 첫줄에 기재해 주어야 합니다.
그냥 기본으로 사용한다 생각하시면 되구요.

import bpy

그 다음부터는 약간 복잡한게 나옵니다. 바로 클래스(class)라는 것이지요.
클래스라면 중학교에서 배웠던 학급(class)이라는 단어가 생각나지 않으신가요? :)
네! 바로 그와 동일한 단어입니다.

class CrayPanel(bpy.types.Panel):

클래스는 최근 사용되는 대부분의 컴퓨터 언어에서 밥먹듯이 등장하는 것입니다.
보통 클래스를 정의한다고 하는데요. 클래스라는 말이 아마 생소하실 것이기 때문에,
설계도라고 생각하시면 더욱 이해가 쉬우실 것 같습니다.
바로 설계도를 정의하는 것이지요.

이 설계도는 자동차 설계도일까요? 비행기 설계도일까요? 아니면 로보트?
상상에 맡겨드리겠습니다 :)

소스에 보면 class 어쩌고 다음에 이렇게 깔끔하게 안쪽으로 들여썼지요?
그냥 보기 좋으라고만 한게 아닙니다. 파이썬에서는 들여쓰기가 매우 중요한데요.

바로 그 정의가 끝나는 지점을 의미하기 때문이지요.
그러니까 class 정의는 소스의 이 부분까지만 해당합니다.

class CrayPanel(bpy.types.Panel):
    bl_label = "블렌더 파이썬의 패널 연습"
    bl_idname = "SAMPLE_PT_LA"
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "object"

    def draw(self, context):
        self.layout.row().label(text="블렌더의 세계!", icon='WORLD_DATA')

class 뒤에 따라붙는 영문이름은 마음대로 지어줄 수 있는데요. CrayPanel 로 지어주었습니다.
그래서 이렇게 정의하고 CrayPanel 클래스라고 부릅니다.

그리고 그 다음 줄부터는 클래스 정의와는 상관없는 내용입니다.
아래 명령어는 register_class ( 해석 : 클래스를 등록해! ) 라고 해서 클래스를 그 설계된대로
블렌더 시스템에 등록하여 작동시키는 명령입니다.
이 명령은 클래스 바로 다음에 나와도 되고 한참 있다가 나와도 되지요.

 

bpy.utils.register_class(CrayPanel)

클래스 정의 스크립트를 실행할 때까지는 블렌더에서 아무 일도 발생하지 않습니다.
그냥 이런게 있구나라고만 블렌더는 기억할 뿐이지요.

하지만 바로 전의 register_class(CrayPanel) 스크립트를 실행하는 순간,
클래스는 그 설계도대로 작동을 시작합니다.
그러니까 만약 마지막 명령어가 없다면 기껏 정의한 한 클래스는 아무 작동을 안 합니다.

위 클래스가 작동되면 무슨 일이 일어날까요?
클래스를 하나 하나 뜯어 보도록 하겠습니다.

먼저 아래와 같이 클래스 정의를 시작하는 첫 줄에서

class CrayPanel(bpy.types.Panel):

class CrayPanel 이라는 부분은 클래스 이름을 CrayPanel 로 해서 설계도를 만들어준다고 생각하시면 되며,
bpy.types.Panel 이라는 부분이 뒤따라 나오는데 이 부분을 부모 클래스(Parent class)라고 합니다.

그리고 한꺼번에 CrayPanel(bpy.types.Panel) 이라고 써주게 되면
"bpy.types.Panel 부모 클래스에서 상속받아 CrayPanel 자식 클래스를 정의한다"라고 표현합니다.

상속이란 부모의 재산물려받는 것입니다.
하지만 컴퓨터 언어에서 상속부모의 설계물려받는 것이라고 생각하시면 되는데요.

CrayPanel 이라는 클래스에는 금방 보셨던 화살표를 누르면 접었다 펼치는 기능이라든가,
화면을 저 멀리 스크롤시키면 화면밖으로 사라지는 기능같은 것은 전혀 없습니다.

그런데 어떻게 그렇게 작동이 되는 걸까요?

바로 bpy.types.Panel 클래스에 그런 기능이 들어 있기 때문입니다.
그래서 bpy.types.Panel 클래스를 상속받으면
bpy.types.Panel 클래스에 설계된 기능들을 그대로 사용할 수 있는 것입니다.

부모 클래스로부터 설계를 물려받아 자식 클래스를 정의하는 것, 뭐라구요?
"상속"입니다.

참고로 이어서 나오는 콜론 기호 ( : ) 는 다음 줄부터 '설계도의 시작'이란걸 의미합니다.

class CrayPanel(bpy.types.Panel):

다음으로 bl_label 이란게 등장하는데요. 이런걸 클래스의 속성 또는 프로퍼티(Property)라고 합니다.

    bl_label = "블렌더 파이썬의 패널 연습"

bl_label 이란 좀 특수한 프로퍼티입니다.
왜나하면 여기 따옴표 안의 정의한 내용이 바로 아래 보이는 화면처럼 블렌더 창에 표시되기 때문인데요.
이 또한 부모 클래스의 기능입니다.

다음으로 나오는 bl_idname 은 아이디명이라고 해서
블렌더에서 내부적으로 사용하는 이름과 겹치지 않는 유일한 이름으로 정의해야 하는데요.

    bl_idname = "SAMPLE_PT_LA"

지금 만드는 패널의 경우 글자 중간에 "_PT_" 라는 문장이 포함되어야 합니다.
일종의 블렌더 스크립터들의 약속같은 건데요.
블렌더에서도 "_PT_" 를 포함하지 않는 경우 실행은 되나 매번 경고메시지가 나타나서
'수정하라고~, 수정하라고~' 요구합니다.

그 다음 등장하는 3줄은 블렌더 화면중 어디에 이 클래스를 어느 창에 적용할 것인지를 정의하는 부분입니다.

    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = "object"

bl_space_type 이 "PROPERTIES"인 경우 "프로퍼티스"창에 등록이 됩니다.
아이콘 목록들이 있는 창 왼쪽 제목에 마우스를 대 보세요.
그러면 툴팁 도움말에 '프로퍼티스' 라고 뜹니다. 이 창에 등록하겠다는 의미입니다.

참고로 블렌더 영문 UI에서는 이렇게 뜹니다. 'PROPERTIES' = 'Properties' 스펠링이 똑같지요.

그리고 bl_context 는 어느 아이콘 탭에 등록할지를 결정합니다.

    bl_context = "object"

영문 UI 에서 마우스를 아래 아이콘에 가져다 대면 Object 라고 뜰 겁니다.
바로 이 탭 아이콘에 패널을 등록하겠다는 의미이지요.

참고로 각 아이콘 탭의 bi_context 명은 아래와 같습니다.

복사하시기 편하게 텍스트로도 기록합니다.

render 
output 
view_layer 
scene 
world 
object 
modifier 
particle 
physics 
constraint 
data 
material 
texture

bi_region_type 은 아직 정확히 뭔지 분석이 안되어 알게 되면 다음에 다뤄보도록 하겠습니다.
하지만 필수 입력이기 때문에 누락하시면 작동이 안됩니다.

    bl_region_type = 'WINDOW'

이어서 def 라는 선언문이 등장하는데요.
def 는 defined (뜻:정의된) 단어의 앞 세글자입니다.

    def draw(self, context):

def 다음에 draw(...) 라고 쓰는것을 draw 함수(function)를 정의한다고 합니다.
이 경우 클래스 안에서 정의했기 때문에 클래스 함수라고도 부르는데요.
참고로 패널 클래스에서 draw 함수는 이미 그 형태가 고정된 예약함수입니다.
그래서 패널에 그려줄 요소를 간단하게 함축하여 정의만 해주면 됩니다. 

아래 코드의 경우

        self.layout.row().label(text="블렌더의 세계!", icon='WORLD_DATA')

패널화면에 이런 모양의 UI를 추가해주지요.

self.layout() 은 부모클래스로부터 물려받은 클래스 자체의 레이아웃(Layout)을 말하는 것이고,
row()는 한줄을 추가하는 명령입니다.
그리고 label()은 추가된 줄에 라벨을 적용하는데
text는 문장을 "블렌더의 세계!"로 지정하고,
icon은 왼쪽에 지구본 아이콘을 추가로 표시해라~ 라는 내용이지요.

여기까지가 지금까지 본 전체의 설명입니다.

좀 더 나아가보도록 합시다. 만약 패널 내용을 아래와 같이 구성하려면 어떻게 해야 할까요?

draw() 함수를 아래와 같이 구성해주시면 됩니다.

    def draw(self, context):
        self.layout.row().label(text="블렌더의 세계!", icon='WORLD_DATA')
        self.layout.row().label(text="오신 것을 환영합니다", icon='MENU_PANEL')
        self.layout.row().label(text="3차원 가상공간과 스크립트!", icon='GRIP')
        self.layout.row().label(text="멋지지 않으세요?", icon='BLENDER')

아이콘은 블렌더 2.83에서 무려 800여개에 달하는데요.
draw() 함수를 아래와 같이 구성하면 블렌더의 거의 모든 아이콘을 만나보실 수 있습니다.

    def draw(self, context):
        icons = ['QUESTION', 'ERROR', 'CANCEL', 'TRIA_RIGHT', 'TRIA_DOWN', 'TRIA_LEFT', 'TRIA_UP', 'ARROW_LEFTRIGHT', 'PLUS', 'DISCLOSURE_TRI_RIGHT', 'DISCLOSURE_TRI_DOWN', 'RADIOBUT_OFF', 'RADIOBUT_ON', 'MENU_PANEL', 'BLENDER', 'GRIP', 'DOT', 'COLLAPSEMENU', 'X', 'DUPLICATE', 'TRASH', 'COLLECTION_NEW', 'OPTIONS', 'NODE', 'NODE_SEL', 'WINDOW', 'WORKSPACE', 'RIGHTARROW_THIN', 'BORDERMOVE', 'VIEWZOOM', 'ADD', 'REMOVE', 'PANEL_CLOSE', 'COPY_ID', 'EYEDROPPER', 'CHECKMARK', 'AUTO', 'CHECKBOX_DEHLT', 'CHECKBOX_HLT', 'UNLOCKED', 'LOCKED', 'UNPINNED', 'PINNED', 'SCREEN_BACK', 'RIGHTARROW', 'DOWNARROW_HLT', 'FCURVE_SNAPSHOT', 'OBJECT_HIDDEN', 'TOPBAR', 'STATUSBAR', 'PLUGIN', 'HELP', 'GHOST_ENABLED', 'COLOR', 'UNLINKED', 'LINKED', 'HAND', 'ZOOM_ALL', 'ZOOM_SELECTED', 'ZOOM_PREVIOUS', 'ZOOM_IN', 'ZOOM_OUT', 'DRIVER_DISTANCE', 'DRIVER_ROTATIONAL_DIFFERENCE', 'DRIVER_TRANSFORM', 'FREEZE', 'STYLUS_PRESSURE', 'GHOST_DISABLED', 'FILE_NEW', 'FILE_TICK', 'QUIT', 'URL', 'RECOVER_LAST', 'THREE_DOTS', 'FULLSCREEN_ENTER', 'FULLSCREEN_EXIT', 'BRUSHES_ALL', 'LIGHT', 'MATERIAL', 'TEXTURE', 'ANIM', 'WORLD', 'SCENE', 'OUTPUT', 'SCRIPT', 'PARTICLES', 'PHYSICS', 'SPEAKER', 'TOOL_SETTINGS', 'SHADERFX', 'MODIFIER', 'BLANK1', 'FAKE_USER_OFF', 'FAKE_USER_ON', 'VIEW3D', 'GRAPH', 'OUTLINER', 'PROPERTIES', 'FILEBROWSER', 'IMAGE', 'INFO', 'SEQUENCE', 'TEXT', 'SOUND', 'ACTION', 'NLA', 'PREFERENCES', 'TIME', 'NODETREE', 'CONSOLE', 'TRACKER', 'ASSET_MANAGER', 'NODE_COMPOSITING', 'NODE_TEXTURE', 'NODE_MATERIAL', 'UV', 'OBJECT_DATAMODE', 'EDITMODE_HLT', 'UV_DATA', 'VPAINT_HLT', 'TPAINT_HLT', 'WPAINT_HLT', 'SCULPTMODE_HLT', 'POSE_HLT', 'PARTICLEMODE', 'TRACKING', 'TRACKING_BACKWARDS', 'TRACKING_FORWARDS', 'TRACKING_BACKWARDS_SINGLE', 'TRACKING_FORWARDS_SINGLE', 'TRACKING_CLEAR_BACKWARDS', 'TRACKING_CLEAR_FORWARDS', 'TRACKING_REFINE_BACKWARDS', 'TRACKING_REFINE_FORWARDS', 'SCENE_DATA', 'RENDERLAYERS', 'WORLD_DATA', 'OBJECT_DATA', 'MESH_DATA', 'CURVE_DATA', 'META_DATA', 'LATTICE_DATA', 'LIGHT_DATA', 'MATERIAL_DATA', 'TEXTURE_DATA', 'ANIM_DATA', 'CAMERA_DATA', 'PARTICLE_DATA', 'LIBRARY_DATA_DIRECT', 'GROUP', 'ARMATURE_DATA', 'COMMUNITY', 'BONE_DATA', 'CONSTRAINT', 'SHAPEKEY_DATA', 'CONSTRAINT_BONE', 'CAMERA_STEREO', 'PACKAGE', 'UGLYPACKAGE', 'EXPERIMENTAL', 'BRUSH_DATA', 'IMAGE_DATA', 'FILE', 'FCURVE', 'FONT_DATA', 'RENDER_RESULT', 'SURFACE_DATA', 'EMPTY_DATA', 'PRESET', 'RENDER_ANIMATION', 'RENDER_STILL', 'LIBRARY_DATA_BROKEN', 'BOIDS', 'STRANDS', 'LIBRARY_DATA_INDIRECT', 'GREASEPENCIL', 'LINE_DATA', 'LIBRARY_DATA_OVERRIDE', 'GROUP_BONE', 'GROUP_VERTEX', 'GROUP_VCOL', 'GROUP_UVS', 'FACE_MAPS', 'RNA', 'RNA_ADD', 'MOUSE_LMB', 'MOUSE_MMB', 'MOUSE_RMB', 'MOUSE_MOVE', 'MOUSE_LMB_DRAG', 'MOUSE_MMB_DRAG', 'MOUSE_RMB_DRAG', 'MEMORY', 'PRESET_NEW', 'DECORATE', 'DECORATE_KEYFRAME', 'DECORATE_ANIMATE', 'DECORATE_DRIVER', 'DECORATE_LINKED', 'DECORATE_LIBRARY_OVERRIDE', 'DECORATE_UNLOCKED', 'DECORATE_LOCKED', 'DECORATE_OVERRIDE', 'FUND', 'TRACKER_DATA', 'HEART', 'ORPHAN_DATA', 'USER', 'SYSTEM', 'SETTINGS', 'OUTLINER_OB_EMPTY', 'OUTLINER_OB_MESH', 'OUTLINER_OB_CURVE', 'OUTLINER_OB_LATTICE', 'OUTLINER_OB_META', 'OUTLINER_OB_LIGHT', 'OUTLINER_OB_CAMERA', 'OUTLINER_OB_ARMATURE', 'OUTLINER_OB_FONT', 'OUTLINER_OB_SURFACE', 'OUTLINER_OB_SPEAKER', 'OUTLINER_OB_FORCE_FIELD', 'OUTLINER_OB_GROUP_INSTANCE', 'OUTLINER_OB_GREASEPENCIL', 'OUTLINER_OB_LIGHTPROBE', 'OUTLINER_OB_IMAGE', 'RESTRICT_COLOR_OFF', 'RESTRICT_COLOR_ON', 'HIDE_ON', 'HIDE_OFF', 'RESTRICT_SELECT_ON', 'RESTRICT_SELECT_OFF', 'RESTRICT_RENDER_ON', 'RESTRICT_RENDER_OFF', 'RESTRICT_INSTANCED_OFF', 'OUTLINER_DATA_EMPTY', 'OUTLINER_DATA_MESH', 'OUTLINER_DATA_CURVE', 'OUTLINER_DATA_LATTICE', 'OUTLINER_DATA_META', 'OUTLINER_DATA_LIGHT', 'OUTLINER_DATA_CAMERA', 'OUTLINER_DATA_ARMATURE', 'OUTLINER_DATA_FONT', 'OUTLINER_DATA_SURFACE', 'OUTLINER_DATA_SPEAKER', 'OUTLINER_DATA_LIGHTPROBE', 'OUTLINER_DATA_GP_LAYER', 'OUTLINER_DATA_GREASEPENCIL', 'GP_SELECT_POINTS', 'GP_SELECT_STROKES', 'GP_MULTIFRAME_EDITING', 'GP_ONLY_SELECTED', 'GP_SELECT_BETWEEN_STROKES', 'MODIFIER_OFF', 'MODIFIER_ON', 'ONIONSKIN_OFF', 'ONIONSKIN_ON', 'RESTRICT_VIEW_ON', 'RESTRICT_VIEW_OFF', 'RESTRICT_INSTANCED_ON', 'MESH_PLANE', 'MESH_CUBE', 'MESH_CIRCLE', 'MESH_UVSPHERE', 'MESH_ICOSPHERE', 'MESH_GRID', 'MESH_MONKEY', 'MESH_CYLINDER', 'MESH_TORUS', 'MESH_CONE', 'MESH_CAPSULE', 'EMPTY_SINGLE_ARROW', 'LIGHT_POINT', 'LIGHT_SUN', 'LIGHT_SPOT', 'LIGHT_HEMI', 'LIGHT_AREA', 'CUBE', 'SPHERE', 'CONE', 'META_PLANE', 'META_CUBE', 'META_BALL', 'META_ELLIPSOID', 'META_CAPSULE', 'SURFACE_NCURVE', 'SURFACE_NCIRCLE', 'SURFACE_NSURFACE', 'SURFACE_NCYLINDER', 'SURFACE_NSPHERE', 'SURFACE_NTORUS', 'EMPTY_AXIS', 'STROKE', 'EMPTY_ARROWS', 'CURVE_BEZCURVE', 'CURVE_BEZCIRCLE', 'CURVE_NCURVE', 'CURVE_NCIRCLE', 'CURVE_PATH', 'LIGHTPROBE_CUBEMAP', 'LIGHTPROBE_PLANAR', 'LIGHTPROBE_GRID', 'COLOR_RED', 'COLOR_GREEN', 'COLOR_BLUE', 'TRIA_RIGHT_BAR', 'TRIA_DOWN_BAR', 'TRIA_LEFT_BAR', 'TRIA_UP_BAR', 'FORCE_FORCE', 'FORCE_WIND', 'FORCE_VORTEX', 'FORCE_MAGNETIC', 'FORCE_HARMONIC', 'FORCE_CHARGE', 'FORCE_LENNARDJONES', 'FORCE_TEXTURE', 'FORCE_CURVE', 'FORCE_BOID', 'FORCE_TURBULENCE', 'FORCE_DRAG', 'FORCE_SMOKEFLOW', 'RIGID_BODY', 'RIGID_BODY_CONSTRAINT', 'IMAGE_PLANE', 'IMAGE_BACKGROUND', 'IMAGE_REFERENCE', 'NODE_INSERT_ON', 'NODE_INSERT_OFF', 'NODE_TOP', 'NODE_SIDE', 'NODE_CORNER', 'ANCHOR_TOP', 'ANCHOR_BOTTOM', 'ANCHOR_LEFT', 'ANCHOR_RIGHT', 'ANCHOR_CENTER', 'SELECT_SET', 'SELECT_EXTEND', 'SELECT_SUBTRACT', 'SELECT_INTERSECT', 'SELECT_DIFFERENCE', 'ALIGN_LEFT', 'ALIGN_CENTER', 'ALIGN_RIGHT', 'ALIGN_JUSTIFY', 'ALIGN_FLUSH', 'ALIGN_TOP', 'ALIGN_MIDDLE', 'ALIGN_BOTTOM', 'BOLD', 'ITALIC', 'UNDERLINE', 'SMALL_CAPS', 'CON_ACTION', 'HOLDOUT_OFF', 'HOLDOUT_ON', 'INDIRECT_ONLY_OFF', 'INDIRECT_ONLY_ON', 'CON_CAMERASOLVER', 'CON_FOLLOWTRACK', 'CON_OBJECTSOLVER', 'CON_LOCLIKE', 'CON_ROTLIKE', 'CON_SIZELIKE', 'CON_TRANSLIKE', 'CON_DISTLIMIT', 'CON_LOCLIMIT', 'CON_ROTLIMIT', 'CON_SIZELIMIT', 'CON_SAMEVOL', 'CON_TRANSFORM', 'CON_TRANSFORM_CACHE', 'CON_CLAMPTO', 'CON_KINEMATIC', 'CON_LOCKTRACK', 'CON_SPLINEIK', 'CON_STRETCHTO', 'CON_TRACKTO', 'CON_ARMATURE', 'CON_CHILDOF', 'CON_FLOOR', 'CON_FOLLOWPATH', 'CON_PIVOT', 'CON_SHRINKWRAP', 'MODIFIER_DATA', 'MOD_WAVE', 'MOD_BUILD', 'MOD_DECIM', 'MOD_MIRROR', 'MOD_SOFT', 'MOD_SUBSURF', 'HOOK', 'MOD_PHYSICS', 'MOD_PARTICLES', 'MOD_BOOLEAN', 'MOD_EDGESPLIT', 'MOD_ARRAY', 'MOD_UVPROJECT', 'MOD_DISPLACE', 'MOD_CURVE', 'MOD_LATTICE', 'MOD_TINT', 'MOD_ARMATURE', 'MOD_SHRINKWRAP', 'MOD_CAST', 'MOD_MESHDEFORM', 'MOD_BEVEL', 'MOD_SMOOTH', 'MOD_SIMPLEDEFORM', 'MOD_MASK', 'MOD_CLOTH', 'MOD_EXPLODE', 'MOD_FLUIDSIM', 'MOD_MULTIRES', 'MOD_FLUID', 'MOD_SOLIDIFY', 'MOD_SCREW', 'MOD_VERTEX_WEIGHT', 'MOD_DYNAMICPAINT', 'MOD_REMESH', 'MOD_OCEAN', 'MOD_WARP', 'MOD_SKIN', 'MOD_TRIANGULATE', 'MOD_WIREFRAME', 'MOD_DATA_TRANSFER', 'MOD_NORMALEDIT', 'MOD_PARTICLE_INSTANCE', 'MOD_HUE_SATURATION', 'MOD_NOISE', 'MOD_OFFSET', 'MOD_SIMPLIFY', 'MOD_THICKNESS', 'MOD_INSTANCE', 'MOD_TIME', 'MOD_OPACITY', 'REC', 'PLAY', 'FF', 'REW', 'PAUSE', 'PREV_KEYFRAME', 'NEXT_KEYFRAME', 'PLAY_SOUND', 'PLAY_REVERSE', 'PREVIEW_RANGE', 'ACTION_TWEAK', 'PMARKER_ACT', 'PMARKER_SEL', 'PMARKER', 'MARKER_HLT', 'MARKER', 'KEYFRAME_HLT', 'KEYFRAME', 'KEYINGSET', 'KEY_DEHLT', 'KEY_HLT', 'MUTE_IPO_OFF', 'MUTE_IPO_ON', 'DRIVER', 'SOLO_OFF', 'SOLO_ON', 'FRAME_PREV', 'FRAME_NEXT', 'NLA_PUSHDOWN', 'IPO_CONSTANT', 'IPO_LINEAR', 'IPO_BEZIER', 'IPO_SINE', 'IPO_QUAD', 'IPO_CUBIC', 'IPO_QUART', 'IPO_QUINT', 'IPO_EXPO', 'IPO_CIRC', 'IPO_BOUNCE', 'IPO_ELASTIC', 'IPO_BACK', 'IPO_EASE_IN', 'IPO_EASE_OUT', 'IPO_EASE_IN_OUT', 'NORMALIZE_FCURVES', 'VERTEXSEL', 'EDGESEL', 'FACESEL', 'CURSOR', 'PIVOT_BOUNDBOX', 'PIVOT_CURSOR', 'PIVOT_INDIVIDUAL', 'PIVOT_MEDIAN', 'PIVOT_ACTIVE', 'CENTER_ONLY', 'ROOTCURVE', 'SMOOTHCURVE', 'SPHERECURVE', 'INVERSESQUARECURVE', 'SHARPCURVE', 'LINCURVE', 'NOCURVE', 'RNDCURVE', 'PROP_OFF', 'PROP_ON', 'PROP_CON', 'PROP_PROJECTED', 'PARTICLE_POINT', 'PARTICLE_TIP', 'PARTICLE_PATH', 'SNAP_FACE_CENTER', 'SNAP_PERPENDICULAR', 'SNAP_MIDPOINT', 'SNAP_OFF', 'SNAP_ON', 'SNAP_NORMAL', 'SNAP_GRID', 'SNAP_VERTEX', 'SNAP_EDGE', 'SNAP_FACE', 'SNAP_VOLUME', 'SNAP_INCREMENT', 'STICKY_UVS_LOC', 'STICKY_UVS_DISABLE', 'STICKY_UVS_VERT', 'CLIPUV_DEHLT', 'CLIPUV_HLT', 'SNAP_PEEL_OBJECT', 'GRID', 'OBJECT_ORIGIN', 'ORIENTATION_GLOBAL', 'ORIENTATION_GIMBAL', 'ORIENTATION_LOCAL', 'ORIENTATION_NORMAL', 'ORIENTATION_VIEW', 'COPYDOWN', 'PASTEDOWN', 'PASTEFLIPUP', 'PASTEFLIPDOWN', 'VIS_SEL_11', 'VIS_SEL_10', 'VIS_SEL_01', 'VIS_SEL_00', 'AUTOMERGE_OFF', 'AUTOMERGE_ON', 'UV_VERTEXSEL', 'UV_EDGESEL', 'UV_FACESEL', 'UV_ISLANDSEL', 'UV_SYNC_SELECT', 'TRANSFORM_ORIGINS', 'GIZMO', 'ORIENTATION_CURSOR', 'NORMALS_VERTEX', 'NORMALS_FACE', 'NORMALS_VERTEX_FACE', 'SHADING_BBOX', 'SHADING_WIRE', 'SHADING_SOLID', 'SHADING_RENDERED', 'SHADING_TEXTURE', 'OVERLAY', 'XRAY', 'LOCKVIEW_OFF', 'LOCKVIEW_ON', 'AXIS_SIDE', 'AXIS_FRONT', 'AXIS_TOP', 'LAYER_USED', 'LAYER_ACTIVE', 'OUTLINER_OB_HAIR', 'OUTLINER_DATA_HAIR', 'HAIR_DATA', 'OUTLINER_OB_POINTCLOUD', 'OUTLINER_DATA_POINTCLOUD', 'POINTCLOUD_DATA', 'OUTLINER_OB_VOLUME', 'OUTLINER_DATA_VOLUME', 'VOLUME_DATA', 'HOME', 'DOCUMENTS', 'TEMP', 'SORTALPHA', 'SORTBYEXT', 'SORTTIME', 'SORTSIZE', 'SHORTDISPLAY', 'LONGDISPLAY', 'IMGDISPLAY', 'BOOKMARKS', 'FONTPREVIEW', 'FILTER', 'NEWFOLDER', 'FOLDER_REDIRECT', 'FILE_PARENT', 'FILE_REFRESH', 'FILE_FOLDER', 'FILE_BLANK', 'FILE_BLEND', 'FILE_IMAGE', 'FILE_MOVIE', 'FILE_SCRIPT', 'FILE_SOUND', 'FILE_FONT', 'FILE_TEXT', 'SORT_DESC', 'SORT_ASC', 'LINK_BLEND', 'APPEND_BLEND', 'IMPORT', 'EXPORT', 'LOOP_BACK', 'LOOP_FORWARDS', 'BACK', 'FORWARD', 'FILE_ARCHIVE', 'FILE_CACHE', 'FILE_VOLUME', 'FILE_3D', 'FILE_HIDDEN', 'FILE_BACKUP', 'DISK_DRIVE', 'MATPLANE', 'MATSPHERE', 'MATCUBE', 'MONKEY', 'HAIR', 'ALIASED', 'ANTIALIASED', 'MAT_SPHERE_SKY', 'MATSHADERBALL', 'MATCLOTH', 'MATFLUID', 'WORDWRAP_OFF', 'WORDWRAP_ON', 'SYNTAX_OFF', 'SYNTAX_ON', 'LINENUMBERS_OFF', 'LINENUMBERS_ON', 'SCRIPTPLUGINS', 'DISC', 'DESKTOP', 'EXTERNAL_DRIVE', 'NETWORK_DRIVE', 'SEQ_SEQUENCER', 'SEQ_PREVIEW', 'SEQ_LUMA_WAVEFORM', 'SEQ_CHROMA_SCOPE', 'SEQ_HISTOGRAM', 'SEQ_SPLITVIEW', 'SEQ_STRIP_META', 'SEQ_STRIP_DUPLICATE', 'IMAGE_RGB', 'IMAGE_RGB_ALPHA', 'IMAGE_ALPHA', 'IMAGE_ZDEPTH', 'HANDLE_AUTOCLAMPED', 'HANDLE_AUTO', 'HANDLE_ALIGNED', 'HANDLE_VECTOR', 'HANDLE_FREE', 'VIEW_PERSPECTIVE', 'VIEW_ORTHO', 'VIEW_CAMERA', 'VIEW_PAN', 'VIEW_ZOOM', 'BRUSH_BLOB', 'BRUSH_BLUR', 'BRUSH_CLAY', 'BRUSH_CLAY_STRIPS', 'BRUSH_CLONE', 'BRUSH_CREASE', 'BRUSH_FILL', 'BRUSH_FLATTEN', 'BRUSH_GRAB', 'BRUSH_INFLATE', 'BRUSH_LAYER', 'BRUSH_MASK', 'BRUSH_MIX', 'BRUSH_NUDGE', 'BRUSH_PINCH', 'BRUSH_SCRAPE', 'BRUSH_SCULPT_DRAW', 'BRUSH_SMEAR', 'BRUSH_SMOOTH', 'BRUSH_SNAKE_HOOK', 'BRUSH_SOFTEN', 'BRUSH_TEXDRAW', 'BRUSH_TEXFILL', 'BRUSH_TEXMASK', 'BRUSH_THUMB', 'BRUSH_ROTATE', 'GPBRUSH_SMOOTH', 'GPBRUSH_THICKNESS', 'GPBRUSH_STRENGTH', 'GPBRUSH_GRAB', 'GPBRUSH_PUSH', 'GPBRUSH_TWIST', 'GPBRUSH_PINCH', 'GPBRUSH_RANDOMIZE', 'GPBRUSH_CLONE', 'GPBRUSH_WEIGHT', 'GPBRUSH_PENCIL', 'GPBRUSH_PEN', 'GPBRUSH_INK', 'GPBRUSH_INKNOISE', 'GPBRUSH_BLOCK', 'GPBRUSH_MARKER', 'GPBRUSH_FILL', 'GPBRUSH_AIRBRUSH', 'GPBRUSH_CHISEL', 'GPBRUSH_ERASE_SOFT', 'GPBRUSH_ERASE_HARD', 'GPBRUSH_ERASE_STROKE', 'SMALL_TRI_RIGHT_VEC', 'KEYTYPE_KEYFRAME_VEC', 'KEYTYPE_BREAKDOWN_VEC', 'KEYTYPE_EXTREME_VEC', 'KEYTYPE_JITTER_VEC', 'KEYTYPE_MOVING_HOLD_VEC', 'HANDLETYPE_FREE_VEC', 'HANDLETYPE_ALIGNED_VEC', 'HANDLETYPE_VECTOR_VEC', 'HANDLETYPE_AUTO_VEC', 'HANDLETYPE_AUTO_CLAMP_VEC', 'COLORSET_01_VEC', 'COLORSET_02_VEC', 'COLORSET_03_VEC', 'COLORSET_04_VEC', 'COLORSET_05_VEC', 'COLORSET_06_VEC', 'COLORSET_07_VEC', 'COLORSET_08_VEC', 'COLORSET_09_VEC', 'COLORSET_10_VEC', 'COLORSET_11_VEC', 'COLORSET_12_VEC', 'COLORSET_13_VEC', 'COLORSET_14_VEC', 'COLORSET_15_VEC', 'COLORSET_16_VEC', 'COLORSET_17_VEC', 'COLORSET_18_VEC', 'COLORSET_19_VEC', 'COLORSET_20_VEC', 'EVENT_A', 'EVENT_B', 'EVENT_C', 'EVENT_D', 'EVENT_E', 'EVENT_F', 'EVENT_G', 'EVENT_H', 'EVENT_I', 'EVENT_J', 'EVENT_K', 'EVENT_L', 'EVENT_M', 'EVENT_N', 'EVENT_O', 'EVENT_P', 'EVENT_Q', 'EVENT_R', 'EVENT_S', 'EVENT_T', 'EVENT_U', 'EVENT_V', 'EVENT_W', 'EVENT_X', 'EVENT_Y', 'EVENT_Z', 'EVENT_SHIFT', 'EVENT_CTRL', 'EVENT_ALT', 'EVENT_OS', 'EVENT_F1', 'EVENT_F2', 'EVENT_F3', 'EVENT_F4', 'EVENT_F5', 'EVENT_F6', 'EVENT_F7', 'EVENT_F8', 'EVENT_F9', 'EVENT_F10', 'EVENT_F11', 'EVENT_F12', 'EVENT_ESC', 'EVENT_TAB', 'EVENT_PAGEUP', 'EVENT_PAGEDOWN', 'EVENT_RETURN', 'EVENT_SPACEKEY']
        for icon in icons:
            self.layout.row().label(text=icon, icon=icon)

블렌더에서 사용할 수 있는 아이콘 목록은 아래 URL에서 확인하실 수 있습니다.

https://itadventure.tistory.com/323

 

블렌더 + 파이썬 내장 아이콘 792개

블렌더 2.83 버전 기준으로 내장된 블렌더 아이콘 목록입니다. 파이썬 스크립트 draw 에서 icon 파라미터로 사용할 수 있습니다. 예시) def draw(self, context): self.layout.row().label(text="QUESTION", icon..

itadventure.tistory.com

필요하신 분에게 도움 되셨는지요 :)
오늘도 여기까지 읽어주셔서 감사드립니다.


천지와 천하만물을 창조하신 분, 하나님의 말씀을 마음에 두면 환날 날에 큰 도움이 됩니다.
부담 없으시면 한번 흝어봐주세요 :)

요한복음 1장 1,14절 말씀
태초에 말씀이 계시니라

이 말씀이 하나님과 함께 계셨으니 이 말씀은 곧 하나님이시니라
말씀이 육신이 되어 우리 가운데 거하시매 우리가 그 영광을 보니
아버지의 독생자의 영광이요 은혜와 진리가 충만하더라. 

다음 게시글 가기

https://itadventure.tistory.com/324

 

3D 블렌더 2.83 + 파이썬 스크립트 / 시작 프로그램? 노노, 시작 스크립트!

첫 게시글 보기 : https://itadventure.tistory.com/319 3D 블렌더 2.83 + 파이썬 스크립트와의 만남 3D 블렌더 프로그램에는 파이썬 스크립트 엔진이 내장되어 있는데요. 관련 스크립트를 통해 재미난 것들을

itadventure.tistory.com