Files
blender-portable-repo/scripts/addons/asset_pipeline/asset_catalog.py
T
2026-03-17 14:58:51 -06:00

110 lines
3.2 KiB
Python

# SPDX-FileCopyrightText: 2025 Blender Studio Tools Authors
#
# SPDX-License-Identifier: GPL-3.0-or-later
import os
from pathlib import Path
import bpy
from typing import List
asset_file_cache = None
cat_data_cache = None
asset_cat_dict = {}
def find_asset_cat_file(directory: str) -> str:
"""Find Asset Catalog file in directory or parent directories, recursively
Args:
directory (str): Directory to search for Asset Catalog file
Returns:
str: Path to Asset Catalog file or None if not found
"""
global asset_file_cache
if asset_file_cache is not None:
return asset_file_cache
asset_file = os.path.join(directory, "blender_assets.cats.txt")
if os.path.exists(asset_file):
return asset_file
parent_dir = os.path.dirname(directory)
if parent_dir == directory:
return None
return find_asset_cat_file(parent_dir)
def get_asset_catalog_items(reload: bool = False) -> List[str]:
"""Generate List of Asset Catalog Items, and Dictionary of
Asset Catalog UUIDs with their matching names. When this function
is called the list and dict of asset catalog items will be updated.
The List is used in the UI to populate the Asset Catalog List, and the
Dictionary is used to look up the asset catalog UUID based on the name.
Args:
reload (bool, optional): Forces reload of list/dict if True. Defaults to False.
Returns:
List[str]: Returns list of strings representing Asset Catalog Names
"""
global cat_data_cache
global asset_cat_dict
asset_cat_list = []
# Return Empty List if File doesn't exist
asset_cat_file = find_asset_cat_file(Path(bpy.data.filepath).parent.__str__())
if asset_cat_file is None:
return asset_cat_list
# Return Cached List if exists and reload is False
if cat_data_cache is not None and not reload:
return cat_data_cache
asset_cat_dict.clear() # Reset dict so it is in sync with name list
# Loop over items in file to find asset catalog
with (Path(asset_cat_file)).open() as file:
for line in file.readlines():
if line.startswith(("#", "VERSION", "\n")):
continue
# Each line contains : 'uuid:catalog_tree:catalog_name' + eol ('\n')
name = line.split(':', 1)[1].split(":")[-1].strip("\n")
uuid = line.split(':', 1)[0]
asset_cat_dict[uuid] = name # Populate dict of uuid:name
asset_cat_list.append(name) # Populate list of asset catalogue names
cat_data_cache = asset_cat_list # Update Cache List
return asset_cat_list
def get_asset_id(name: str) -> str:
"""Get Asset Catalog UUID based on Asset Catalog Name
Args:
name (str): Asset Catalog Name
Returns:
str: Asset Catalog UUID or None if not found
"""
global asset_cat_dict
for key, value in asset_cat_dict.items():
if value == name:
return key
def get_asset_name(id: str) -> str:
"""Get Asset Catalog UUID based on Asset Catalog Name
Args:
name (str): Asset Catalog Name
Returns:
str: Asset Catalog UUID or None if not found
"""
global asset_cat_dict
for key, value in asset_cat_dict.items():
if key == id:
return value