"""Import assets UI labels and descriptions from a fixed .json files. blender -b -P import_ui_messages.py """ import bpy import json import pathlib FILE_NAME = "asset_messages.json" def main(): # Load JSON file. dirpath = pathlib.Path(__file__).parent with open(dirpath / FILE_NAME, "r") as f: message_data = json.load(f) for blend_path, file_message_data in message_data.items(): update_blend_message(blend_path, file_message_data) def update_blend_message(blend_path, message_data): # Assign fixed data. bpy.ops.wm.open_mainfile(filepath=str(blend_path)) blend_changed = False for asset_type, asset_datas in message_data.items(): assets = getattr(bpy.data, asset_type) for asset_data in asset_datas: asset = assets.get(asset_data["old_name"]) if asset is None: print(f' WARNING Asset {asset_data["old_name"]} not found') continue if asset_data["old_name"] != asset_data["new_name"]: blend_changed = True asset.name = asset_data["new_name"] if asset.asset_data.description != asset_data["description"]: blend_changed = True asset.asset_data.description = asset_data["description"] if asset_type == "node_groups": for interface, (interface_name, interface_description) in zip(asset.interface.items_tree, asset_data["interfaces"]): if interface.name != interface_name: blend_changed = True interface.name = interface_name if interface.description != interface_description: blend_changed = True interface.description = interface_description # Update warnings nodes. for node_name, message in asset_data.get("warnings", []): node = asset.nodes.get(node_name) if (node is None or node.bl_idname != 'GeometryNodeWarning' or not node.inputs['Message'].default_value): continue if node.inputs['Message'].default_value != message: blend_changed = True node.inputs['Message'].default_value = message # Update switch nodes. for node_name, switches_data in asset_data.get("switches", []): node = asset.nodes.get(node_name) if node is None or node.bl_idname != 'GeometryNodeMenuSwitch': continue for i, (name, description) in enumerate(switches_data): if node.enum_items[i].name != name: blend_changed = True node.enum_items[i].name = name if node.enum_items[i].description != description: blend_changed = True node.enum_items[i].description = description if blend_changed: bpy.ops.wm.save_mainfile(filepath=str(blend_path)) if __name__ == "__main__": main()