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

134 lines
3.7 KiB
Python

# SPDX-FileCopyrightText: 2021 Blender Studio Tools Authors
#
# SPDX-License-Identifier: GPL-3.0-or-later
import os
from pathlib import Path
from typing import Any
import bpy
from .prefs import addon_prefs_get
from .logger import LoggerFactory
logger = LoggerFactory.getLogger(__name__)
def ui_redraw() -> None:
"""
Forces blender to redraw the UI.
"""
for screen in bpy.data.screens:
for area in screen.areas:
area.tag_redraw()
def _get_scene_name() -> str:
if not bpy.data.filepath:
return ""
filepath = Path(os.path.abspath(bpy.path.abspath(bpy.data.filepath)))
return filepath.parents[1].name
def _get_shot_name() -> str:
if not bpy.data.filepath:
return ""
filepath = Path(os.path.abspath(bpy.path.abspath(bpy.data.filepath)))
return filepath.parents[0].name
def _gen_cacheconfig_filename() -> str:
return f"{_get_shot_name()}.cacheconfig.{bpy.context.scene.cm.cache_version}.json"
def gen_cachedir_path_str(self: Any) -> str:
addon_prefs = addon_prefs_get()
if not addon_prefs.is_cachedir_root_valid:
return ""
p = (
Path(addon_prefs.cachedir_root_path)
/ _get_scene_name()
/ _get_shot_name()
/ bpy.context.scene.cm.cache_version
)
return p.absolute().as_posix()
def gen_cacheconfig_path_str(self: Any) -> str:
cachedir_str = gen_cachedir_path_str(None)
if not cachedir_str:
return ""
p = Path(cachedir_str) / _gen_cacheconfig_filename()
return p.absolute().as_posix()
def gen_cache_coll_filename(collection: bpy.types.Collection) -> str:
return (
f"{_get_shot_name()}.{collection.name}.{bpy.context.scene.cm.cache_version}.abc"
)
def gen_cachepath_collection(
collection: bpy.types.Collection, context: bpy.types.Context
) -> Path:
cachedir_path = Path(gen_cachedir_path_str(None))
if not cachedir_path:
raise ValueError(
f"Failed to generate cachepath for collection: {collection.name}. Invalid cachepath: {str(cachedir_path)}"
)
return cachedir_path.joinpath(gen_cache_coll_filename(collection)).absolute()
def get_cache_version_dir_path_str(self: Any) -> str:
addon_prefs = addon_prefs_get()
if not addon_prefs.is_cachedir_root_valid:
return ""
p = Path(addon_prefs.cachedir_root_path) / _get_scene_name() / _get_shot_name()
return p.absolute().as_posix()
def rm_deleted_colls_from_list(context: bpy.types.Context) -> None:
for category in [context.scene.cm.colls_export, context.scene.cm.colls_import]:
category_name = context.scene.cm.category
colls = [item.coll_ptr for item in category]
colls.reverse()
# Make sure to remove list from the back to not throw off the subsequent indexes.
for idx, coll in enumerate(colls):
org_idx = len(colls) - 1 - idx
if not coll:
# Remove item for that category at that index.
category.remove(org_idx)
logger.info(
"Removed index %i from %s list. Does not exists anymore.",
org_idx,
category_name.lower(),
)
# Update selection index.
curr_index = context.scene.cm.colls_export_index
if category_name == "IMPORT":
curr_index = context.scene.cm.colls_import_index
if curr_index == org_idx and curr_index > 0:
if category_name == "IMPORT":
context.scene.cm.colls_import_index = curr_index - 1
else:
context.scene.cm.colls_export_index = curr_index - 1
ui_redraw()