[Blender3.3] 日本の地形モデルメッシュ追加アドオンの開発 (7): 独自アイコンの指定
前回までで一応動作するものになりましたが、改良の余地は沢山あります。
それらも一つ一つ調べながらやらないとなので、時間がかかりそうです。
さて、今回は追加メニューで表示するアイコンを独自のものに変えてみたいと思います。
最初にアイコンを作成します。
次に作るのは、読み込み用のモジュールです。icon.py としました。内容は下記の通りです。
# -*- coding: utf-8 -*-
#
# package: terrain_model
# file: icon.py
import os
import bpy
from trace import Trace
# We can store multiple preview collections here,
# however in this example we only store "main"
preview_collections = {}
def get_icon_id(name):
pcoll = preview_collections["custom"]
return pcoll[name].icon_id
def register():
Trace.print("icon: register()")
# Note that preview collections returned by bpy.utils.previews
# are regular py objects - you can use them to store custom data.
import bpy.utils.previews
pcoll = bpy.utils.previews.new()
# path to the folder where the icon is
# the path is calculated relative to this py file inside the addon folder
icons_dir = os.path.join(os.path.dirname(__file__), "icons")
for root, dirs, files in os.walk(icons_dir):
for file in files:
(name, ext) = os.path.splitext(file)
if ext == ".png":
# load a preview thumbnail of a file and store in the previews collection
Trace.print("icon: load as %s" % (name))
pcoll.load(name, os.path.join(root, file), 'IMAGE')
preview_collections["custom"] = pcoll
def unregister():
for pcoll in preview_collections.values():
bpy.utils.previews.remove(pcoll)
preview_collections.clear()
内容は、モジュールファイルのあるフォルダの下のiconフォルダ下のPNGファイルを拾い出して読み込むというものです。Blenderにあったテンプレートをベースに修正。一応、汎用性のあるモジュールにしておきました。
それで、新しいモジュールファイルが増えたので、__init__.py もそのモジュールファイルを追加するように直します。
# -*- coding: utf-8 -*-
#
# package: terrain_model
# file: __init__.py
bl_info = {
"name": "New Terrain Model (JP)",
"author": "Shiki Kuraga",
"version": (1, 0),
"blender": (3, 3, 0),
"location": "View3D > Add > Mesh > New Terrain Model (JP)",
"description": "Adds a new Terrain Model (JP) Mesh Object",
"warning": "",
"support": "TESTING",
"doc_url": "",
"category": "Add Mesh",
}
__all__ = [ 'translation', 'icon', 'operator', 'model', 'hubeny_formula' ]
from . import translation
from . import icon
from . import operator
import bpy
from trace import Trace
## This allows you to right click on a button and link to documentation
#def add_object_manual_map():
# url_manual_prefix = "https://docs.blender.org/manual/en/latest/"
# url_manual_mapping = (
# ("bpy.ops.mesh.add_object2", "scene_layout/object/types.html"),
# )
# return url_manual_prefix, url_manual_mapping
def register():
Trace.print("register()")
bpy.app.translations.register(__name__, translation.translation_dict)
icon.register()
operator.register()
# bpy.utils.register_manual_map(add_object_manual_map)
def unregister():
Trace.print("unregister()")
operator.unregister()
icon.unregister()
bpy.app.translations.unregister(__name__)
# bpy.utils.unregister_manual_map(add_object_manual_map)
if __name__ == "__main__":
register()
やっていることは簡単で、__all__ に 'icon' を加えるのと、register(), unregister()にiconモジュールのregister(), unregister()を追加することだけです。
これらを踏まえて、メニュー生成処理をしているoperator.pyを手直しします。これはもう、変更部分だけ抽出して表示します。(これの前段で、"from . import icon" の宣言が必要)
def add_object_button(self, context):
# insert separator
self.layout.separator()
self.layout.operator(
OBJECT_OT_add_object.bl_idname,
text = T("Terrain Model (JP)"),
icon_value = icon.get_icon_id('TM_MESH_TERRAIN'))
# icon = 'PLUGIN')
レイアウト設定で、icon = で指定していたアイコンを、icon_value = として独自アイコンのアイコンIDを設定しただけです。
結果、メニュー上のアイコンが新しいものになりました。
こうしてアイコンが独自のもので表示できると、気持ち良いですね。
