Files
Nero Frame 13 4617c47ad0 Added sanity check baseline made by claude.
Also changed the location to a panel in VIEW_3D instead of menu.
2026-10-13 16:33:03 +02:00

51 lines
1.9 KiB
Python

import bpy
from ... import config
from ...core import Check, Issue, Severity, contexts, is_local
class CollectionStructureCheck(Check):
"""Placeholder until the production hierarchy is defined: see REQUIRED_COLLECTIONS."""
id = "collection_structure"
label = "Collection structure"
description = (
"No object directly in the Scene Collection, no empty collections, "
"and the required collections (config REQUIRED_COLLECTIONS) exist."
)
category = "Structure"
contexts = contexts.ASSET
fix_description = "Remove empty collections"
def run(self, ctx):
scene = ctx.scene
for ob in scene.collection.objects:
yield Issue.for_id(f"'{ob.name}' is directly in the Scene Collection", ob)
for name in config.REQUIRED_COLLECTIONS:
if "{asset}" in name:
if not ctx.asset_name:
yield Issue(f"Cannot resolve required collection '{name}': unknown asset name")
continue
name = name.format(asset=ctx.asset_name)
if name not in bpy.data.collections:
yield Issue(f"Required collection '{name}' is missing")
for collection in scene.collection.children_recursive:
if is_local(collection) and not collection.all_objects and not collection.children:
yield Issue.for_id(
f"Collection '{collection.name}' is empty",
collection,
severity=Severity.WARNING,
data={"empty": True},
)
def fix(self, ctx, issues):
for issue in issues:
if issue.data.get("empty"):
collection = issue.get_id()
if collection is not None:
bpy.data.collections.remove(collection)
unfixed = [i for i in issues if not i.data.get("empty")]
return [f"{len(unfixed)} issue(s) must be fixed by hand"] if unfixed else []