[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を設定しただけです。
結果、メニュー上のアイコンが新しいものになりました。
こうしてアイコンが独自のもので表示できると、気持ち良いですね。