204 lines
6.9 KiB
Python
204 lines
6.9 KiB
Python
from types import SimpleNamespace
|
|
|
|
from app.services.part_key_service import build_scene_manifest, get_effective_assignments
|
|
|
|
|
|
def test_build_scene_manifest_prefers_canonical_material_from_resolved_assignments():
|
|
cad_file = SimpleNamespace(
|
|
id="cad-1",
|
|
resolved_material_assignments={
|
|
"roller_part": {
|
|
"source_name": "KERO_Z-575693-QP-DRH_ISB_1_1",
|
|
"prim_path": "/Root/Assembly/roller_part",
|
|
"canonical_material": "HARTOMAT_010101_Steel-Bare",
|
|
}
|
|
},
|
|
manual_material_overrides=None,
|
|
source_material_assignments=None,
|
|
parsed_objects=None,
|
|
)
|
|
|
|
manifest = build_scene_manifest(cad_file)
|
|
|
|
assert manifest["parts"] == [
|
|
{
|
|
"part_key": "roller_part",
|
|
"source_name": "KERO_Z-575693-QP-DRH_ISB_1_1",
|
|
"prim_path": "/Root/Assembly/roller_part",
|
|
"effective_material": "HARTOMAT_010101_Steel-Bare",
|
|
"assignment_provenance": "auto",
|
|
"is_unassigned": False,
|
|
}
|
|
]
|
|
assert manifest["unassigned_parts"] == []
|
|
assert get_effective_assignments(cad_file) == {
|
|
"roller_part": "HARTOMAT_010101_Steel-Bare",
|
|
}
|
|
|
|
|
|
def test_build_scene_manifest_normalizes_legacy_schaeffler_material_names():
|
|
cad_file = SimpleNamespace(
|
|
id="cad-legacy",
|
|
resolved_material_assignments={
|
|
"roller_part": {
|
|
"source_name": "KERO_Z-575693-QP-DRH_ISB_1_1",
|
|
"prim_path": "/Root/Assembly/roller_part",
|
|
"canonical_material": "SCHAEFFLER_010101_Steel-Bare",
|
|
}
|
|
},
|
|
manual_material_overrides={"manual_part": "SCHAEFFLER_020101_Durotect-Blue"},
|
|
source_material_assignments={"roller": "SCHAEFFLER_030103_Elastomer-Black"},
|
|
parsed_objects=None,
|
|
)
|
|
|
|
manifest = build_scene_manifest(cad_file)
|
|
|
|
assert manifest["parts"] == [
|
|
{
|
|
"part_key": "roller_part",
|
|
"source_name": "KERO_Z-575693-QP-DRH_ISB_1_1",
|
|
"prim_path": "/Root/Assembly/roller_part",
|
|
"effective_material": "HARTOMAT_010101_Steel-Bare",
|
|
"assignment_provenance": "auto",
|
|
"is_unassigned": False,
|
|
}
|
|
]
|
|
assert get_effective_assignments(cad_file) == {
|
|
"roller_part": "HARTOMAT_010101_Steel-Bare",
|
|
}
|
|
|
|
|
|
def test_build_scene_manifest_adds_semantic_alias_for_deduplicated_instance_keys():
|
|
cad_file = SimpleNamespace(
|
|
id="cad-alias",
|
|
resolved_material_assignments={
|
|
"roller_part_2": {
|
|
"source_name": "RollerPart",
|
|
"prim_path": "/Root/Assembly/roller_part_2",
|
|
"canonical_material": "HARTOMAT_010101_Steel-Bare",
|
|
}
|
|
},
|
|
manual_material_overrides=None,
|
|
source_material_assignments=None,
|
|
parsed_objects=None,
|
|
)
|
|
|
|
manifest = build_scene_manifest(cad_file)
|
|
|
|
assert manifest["parts"] == [
|
|
{
|
|
"part_key": "roller_part_2",
|
|
"source_name": "RollerPart",
|
|
"prim_path": "/Root/Assembly/roller_part_2",
|
|
"effective_material": "HARTOMAT_010101_Steel-Bare",
|
|
"assignment_provenance": "auto",
|
|
"is_unassigned": False,
|
|
},
|
|
{
|
|
"part_key": "roller_part",
|
|
"source_name": "RollerPart",
|
|
"prim_path": "/Root/Assembly/roller_part_2",
|
|
"effective_material": "HARTOMAT_010101_Steel-Bare",
|
|
"assignment_provenance": "auto",
|
|
"is_unassigned": False,
|
|
},
|
|
]
|
|
assert manifest["unassigned_parts"] == []
|
|
assert get_effective_assignments(cad_file) == {
|
|
"roller_part_2": "HARTOMAT_010101_Steel-Bare",
|
|
"roller_part": "HARTOMAT_010101_Steel-Bare",
|
|
}
|
|
|
|
|
|
def test_build_scene_manifest_skips_alias_when_canonical_key_already_exists():
|
|
cad_file = SimpleNamespace(
|
|
id="cad-existing-alias",
|
|
resolved_material_assignments={
|
|
"roller_part": {
|
|
"source_name": "RollerPart",
|
|
"prim_path": "/Root/Assembly/roller_part",
|
|
"canonical_material": "HARTOMAT_010101_Steel-Bare",
|
|
},
|
|
"roller_part_2": {
|
|
"source_name": "RollerPart",
|
|
"prim_path": "/Root/Assembly/roller_part_2",
|
|
"canonical_material": "HARTOMAT_020202_Steel-Bare",
|
|
},
|
|
},
|
|
manual_material_overrides=None,
|
|
source_material_assignments=None,
|
|
parsed_objects=None,
|
|
)
|
|
|
|
manifest = build_scene_manifest(cad_file)
|
|
|
|
assert [part["part_key"] for part in manifest["parts"]] == [
|
|
"roller_part",
|
|
"roller_part_2",
|
|
]
|
|
assert get_effective_assignments(cad_file) == {
|
|
"roller_part": "HARTOMAT_010101_Steel-Bare",
|
|
"roller_part_2": "HARTOMAT_020202_Steel-Bare",
|
|
}
|
|
|
|
|
|
def test_build_scene_manifest_alias_inherits_leaf_manual_override():
|
|
cad_file = SimpleNamespace(
|
|
id="cad-manual-alias",
|
|
resolved_material_assignments={
|
|
"roller_part_3": {
|
|
"source_name": "RollerPart",
|
|
"prim_path": "/Root/Assembly/roller_part_3",
|
|
"canonical_material": "HARTOMAT_010101_Steel-Bare",
|
|
}
|
|
},
|
|
manual_material_overrides={
|
|
"roller_part_3": "SCHAEFFLER_020101_Durotect-Blue",
|
|
},
|
|
source_material_assignments=None,
|
|
parsed_objects=None,
|
|
)
|
|
|
|
manifest = build_scene_manifest(cad_file)
|
|
alias_part = next(part for part in manifest["parts"] if part["part_key"] == "roller_part")
|
|
|
|
assert alias_part == {
|
|
"part_key": "roller_part",
|
|
"source_name": "RollerPart",
|
|
"prim_path": "/Root/Assembly/roller_part_3",
|
|
"effective_material": "HARTOMAT_020101_Durotect-Blue",
|
|
"assignment_provenance": "manual",
|
|
"is_unassigned": False,
|
|
}
|
|
assert get_effective_assignments(cad_file) == {
|
|
"roller_part_3": "HARTOMAT_020101_Durotect-Blue",
|
|
"roller_part": "HARTOMAT_020101_Durotect-Blue",
|
|
}
|
|
|
|
|
|
def test_build_scene_manifest_adds_semantic_alias_for_exporter_af_suffix_keys():
|
|
cad_file = SimpleNamespace(
|
|
id="cad-af-alias",
|
|
resolved_material_assignments={
|
|
"kero_z_575693_qp_drh_isb_1_af6": {
|
|
"source_name": "KERO_Z-575693-QP-DRH_ISB_1_AF6_",
|
|
"prim_path": "/Root/Assembly/kero_z_575693_qp_drh_isb_1_af6",
|
|
"canonical_material": "HARTOMAT_010101_Steel-Bare",
|
|
}
|
|
},
|
|
manual_material_overrides=None,
|
|
source_material_assignments=None,
|
|
parsed_objects=None,
|
|
)
|
|
|
|
manifest = build_scene_manifest(cad_file)
|
|
|
|
assert [part["part_key"] for part in manifest["parts"]] == [
|
|
"kero_z_575693_qp_drh_isb_1_af6",
|
|
"kero_z_575693_qp_drh_isb_1",
|
|
]
|
|
assert get_effective_assignments(cad_file) == {
|
|
"kero_z_575693_qp_drh_isb_1_af6": "HARTOMAT_010101_Steel-Bare",
|
|
"kero_z_575693_qp_drh_isb_1": "HARTOMAT_010101_Steel-Bare",
|
|
}
|