Blender Add-on : เริ่มต้นสร้าง Add-on

Datafarm
4 min readApr 8, 2021

ในบทความคราวนี้เราจะมาหัดสร้าง Blender Add-on ต่อจากบทความที่ผ่านมา โดยในบทความที่ผ่านมานั้นเราได้ทำความรู้จักกับ Blender และเครื่องมือที่จำเป็นสำหรับการสร้าง Add-on ของ Blender ไปแล้ว ดังนั้นในบทความนี้เราจะมาสร้าง Add-on ขึ้นมาสักตัว โดย Add-on ที่เราจะสร้างเป็น Add-on ง่ายๆที่ทำหน้าที่ในการ duplicate object ที่เราทำการเลือก ตามจำนวนและระยะห่างที่เราต้องการไปตามแกน Z และในบทความนี้เราจะทำการเพิ่ม Add-on ของเราเข้าไปใน Menu ของโปรแกรม Blender ในตอนที่มีเปิดการใช้งาน Add-on รวมไปถึงการเพิ่ม Short-key ให้กับ Add-on ของเราด้วย

ในขั้นตอนแรกทางแอดมินแนะนำให้เปิด Console Window ของ Blender ก่อน โดยเจ้าตัว Console Window จะทำหน้าที่ในการแสดงข้อความเกี่ยวกับการทำงาน, สถานะต่างๆ รวมไปถึง Error ต่างๆ ของโปรแกรม เพราะฉะนั้นในกรณีนี้ที่เราทำการสร้าง Add-on จึงควรเปิด Console Window ไว้ใช้ในการตรวจหา Error ต่างๆจาก Add-on ที่เราพัฒนาขึ้น โดยในแต่ละระบบปฏิบัติการจะมีวิธีการเปิดใช้งาน Console Window แตกต่างกันไป โดยเราสามารถเข้าไปดูวิธีเปิดใช้งานได้จาก

https://docs.blender.org/manual/en/latest/advanced/command_line/launch/index.html

แต่ในกรณีที่เราใช้ระบบปฏิบัติการ Linux ที่เป็น Ubuntu จำเป็นจะต้องทำการติดตั้งเครื่องมือที่มีชื่อว่า Menu Editor เพื่อทำการเปิดใช้งาน “ Run in terminal ” ที่ใช้สำหรับการเปิด Console Window ก่อน โดยมีวิธีการดังนี้

1. กดปุ่ม ctrl + alt + T เพื่อทำการเปิด Terminal ขึ้นมา

2. พิมพ์คำสั่ง sudo apt install menulibre เพื่อทำการติดตั้ง Menu Editor

3. หลังจากทำการติดตั้งเรียบร้อย เราก็สามารถเปิด Menu Editor แล้วทำการเลือกไปที่ Sidebar > Graphic > Blender จะได้หน้าภาพด้านล่าง ให้ทำการคลิกที่ Run in Terminal

4. ทำการ save การตั้งค่า แล้วหลังจากนั้นให้ Restart ระบบ โดยหลังจากการ Restart แล้ว เราแค่เพียงเปิดโปรแกรม Blender ตามปกติ แต่คราวนี้เราจะได้หน้าต่าง Terminal ที่เป็น Window console ของ Blender ขึ้นมาอีกหน้าต่าง ดังภาพ

หลังจากนั้นให้เราไปที่โปรแกรม Blender แล้วทำการเปิด Text editor ของ Blender เพื่อทำการพัฒนา Add-on โดยเริ่มต้นจากการใส่รายละเอียดเกี่ยวกับ Add-on ที่เราจะทำการพัฒนารวมไปถึง code ของ Add-on ของเรา ดังนี้

import bpyclass ZAxisArray(bpy.types.Operator):“””Object Z Axis Array”””bl_idname = “object.z_axis_array”bl_label = “Z Axis Array”bl_options = {‘REGISTER’, ‘UNDO’}total: bpy.props.IntProperty(name=”Steps”, default=1, min=1, max=100)factor: bpy.props.FloatProperty(name=”Z-Factor”, default=1, min=0, max=100)def execute(self, context):for i in range(self.total):bpy.ops.object.duplicate()active_obj = context.active_objectactive_obj.location.z = (active_obj.location.z + (active_obj.dimensions.z*self.factor))
return {‘FINISHED’}
def register():bpy.types.VIEW3D_MT_object.append(menu_func)def unregister():bpy.types.VIEW3D_MT_object.remove(menu_func)if __name__ == “__main__”:register()

โดยจาก code ที่เห็นข้างต้นจะทำงานโดยการรับ จำนวนของ Object ที่เราต้องการทำ Array เข้ามาเก็บไว้ total ผ่านทาง ui ของ Blender ที่จะทำการแสดงเมื่อเราใช้งาน Add-on โดย total จะมีค่าเริ่มต้นอยู่ที่ 1 และเก็บ factor สำหรับกำหนดระยะห่างไว้ใน factor และเมื่อ function execute ทำงานก็จะนำค่าทั้งสองมาใช้งานภายใน function โดยค่า total จะถูกนำมาใช้กำหนดจำนวนรอบของ for loop และค่า factor จะถูกนำมาคูณกับค่าของ z-axis แล้วนำไปบวกกับตำแหน่งในแกน z ของ วัตถุเพื่อใช้กำหนดระยะห่างระหว่างวัตถุวัดจากจุด origin ของวัตถุ ซึ่งจุด origin จะเป็นจุดสีส้มที่อยู่กึ่งกลางของวัตถุดังรูป

หลังจากนั้นเราจะทำการเพิ่ม add-on ของเราที่ได้ทำขึ้นมาเข้าไปใน menu ของ Blender ด้วยการเพิ่ม code ดังต่อไปนี้

def menu_func(self, context):self.layout.operator(ZAxisArray.bl_idname)

และเพิ่ม code ลงไปในส่วนของ register() function และ unregister() function

def register():bpy.types.VIEW3D_MT_object.append(menu_func)def unregister():bpy.types.VIEW3D_MT_object.remove(menu_func)

โดย code ในส่วนข้างต้นเราจะทำการสร้าง function ที่มีชื่อว่า menu_func และในส่วนของ register() จะทำหน้าที่ในการเพิ่ม function ลงใน menu ที่ชื่อว่า object เมื่อ Add-on เริ่มต้นการทำงาน

และส่วนของ unregister() นั้นจะทำหน้าที่ลบ function ออกเมื่อเราปิดการใช้งาน Add-on

เมื่อเราทำการเพิ่ม Add-on ของเราลงบนเมนูเรียบร้อยแล้ว เราจะทำการเพิ่มคีย์ลัดให้ Add-on ของเราโดยให้ทำการเพิ่ม code ลงไปดังนี้

addon_keymaps = []

และเพิ่ม code ลงไปในส่วนของ register() function ต่อจาก code เดิมที่เราได้เขียนไว้

def register():
wm = bpy.context.window_managerkc = wm.keyconfigs.addonif kc:km = wm.keyconfigs.addon.keymaps.new(name=’Object Mode’, space_type=’EMPTY’)kmi = km.keymap_items.new(ZAxisArray.bl_idname, ‘T’, ‘PRESS’, ctrl=True, shift=True)kmi.properties.total = 4addon_keymaps.append((km, kmi))

ส่วนของ unregister() นั้นเพื่อป้องกันการ unregister add-on ก่อนการลบคีย์ลัด ให้เราทำการเพิ่ม code ไปก่อนหน้า code ในส่วนของการ unregister add-on ดังนี้

def unregister():for km, kmi in addon_keymaps:km.keymap_items.remove(kmi)addon_keymaps.clear()

จาก code ที่เราได้ใส่ไปข้างต้นจะทำงานโดยการไปเรียกใช้งาน api ของ blender แล้วทำการเพิ่มคีย์ลัดไปยัง Add-on คีย์ลัดที่ถูกเพิ่มไปจะเป็น ctrl + shift + T และคีย์ที่เราจะเพิ่มไปนั้นไม่ควรที่จะไปซ้ำกับคีย์ลัดเดิมของ Blender ซึ่งเราสามารถเช็คคีย์ลัดของ Blender ได้จากการใช้งาน Add-on ที่มีชื่อว่า “Is Key Free”

และเมื่อเราทำการปิด Add-on ฟังก์ชั่น unregister จะทำการลบคีย์ลัดที่เราได้ทำการเพิ่มไว้ และจากนั้นจะทำการลบ add-on ของเราออกจาก menu ที่เราได้เพิ่มไว้

หลังจากที่เราได้เพิ่มคีย์ลัดและเมนูแล้วเราควรจะแก้ไขข้อมูลในส่วนของรายละเอียดของ Add-on ที่เราได้เพิ่มไว้ข้างต้นด้วย โดยหน้าตาของ Add-on ที่ได้หลังจากการแก้ไขทั้งหมดจะมีดังนี้

bl_info = {“name”: “Z Axis Array”,“blender”: (2, 92, 0),“category”: “Object”,“location”: “Object > Z Axis Array”}
import bpy
class ZAxisArray(bpy.types.Operator):“””Object Z Axis Array”””bl_idname = “object.z_axis_array”bl_label = “Z Axis Array”bl_options = {‘REGISTER’, ‘UNDO’}
total: bpy.props.IntProperty(name=”Steps”, default=1, min=1, max=100)factor: bpy.props.FloatProperty(name=”Z-Factor”, default=1, min=0, max=100)
def execute(self, context):

for i in range(self.total):
bpy.ops.object.duplicate()active_obj = context.active_objectactive_obj.location.z = (active_obj.location.z + (active_obj.dimensions.z*self.factor))
return {‘FINISHED’}

def menu_func(self, context):
self.layout.operator(ZAxisArray.bl_idname)
addon_keymaps = []

def register():
bpy.utils.register_class(ZAxisArray)bpy.types.VIEW3D_MT_object.append(menu_func)
wm = bpy.context.window_manager
kc = wm.keyconfigs.addonif kc:km = wm.keyconfigs.addon.keymaps.new(name=’Object Mode’, space_type=’EMPTY’)kmi = km.keymap_items.new(ZAxisArray.bl_idname, ‘T’, ‘PRESS’, ctrl=True, shift=True)kmi.properties.total = 4addon_keymaps.append((km, kmi))
def unregister():
for km, kmi in addon_keymaps:km.keymap_items.remove(kmi)addon_keymaps.clear()bpy.utils.unregister_class(ZAxisArray)bpy.types.VIEW3D_MT_object.remove(menu_func)
if __name__ == “__main__”:
register()

หากเราต้องการสร้างไฟล์ติดตั้งของ Blender Add-on ให้เราทำการ save ไฟล์ออกมาโดยใช้ชื่อว่า addon.py และเราสามารถติดตั้งได้โดยใช้วิธีเดียวกันกับบทความก่อนหน้า โดยเมื่อเราทำการติดตั้ง Add-on แล้วเราสามารถเรียกใช้ Add-on ได้จาก Object > Z Axis Array หรือผ่านทางคีย์ลัดที่เราได้สร้างไว้ ซึ่งหากเราเรียกใช้แล้วจะได้ผลลัพธ์เป็นการสร้าง Array ของวัตถุที่เลือกขึ้นมาในแนวแกน z ดังรูปครับ

--

--

No responses yet