# services/material_service.py """材料属性管理服务 - 全局唯一材料属性源 所有材料属性(密度、收缩率、最小壁厚、泡沫特性等)集中在此, geometry_analyzer / mold_generator / aluminum_foam_mold 等模块一律通过 MaterialService 查询, 禁止再各自维护材料字典,避免数据漂移。 历史问题:材料字典曾在 4 处重复定义且冲突(如 PE 收缩率此处 0.020 vs aluminum_foam_mold 0.025; PC/PA/PMMA 收缩率、POM 密度也冲突;PS 在其他字典有而此处缺失)。现已统一,以本文件为唯一源。 泡沫材料原用 `shrinkage_rate` 键,现统一为 `shrinkage`(值一致)。 """ from typing import Dict, Any, List MATERIAL_PROPERTIES: Dict[str, Dict[str, Any]] = { # —— 注塑塑料 —— "ABS": {"name": "ABS", "density": 1.05, "shrinkage": 0.005, "is_foam": False, "min_wall": 1.2}, "PP": {"name": "PP", "density": 0.90, "shrinkage": 0.016, "is_foam": False, "min_wall": 1.0}, "PE": {"name": "PE", "density": 0.95, "shrinkage": 0.020, "is_foam": False, "min_wall": 1.0}, "PC": {"name": "PC", "density": 1.20, "shrinkage": 0.007, "is_foam": False, "min_wall": 1.5}, "PA": {"name": "PA", "density": 1.14, "shrinkage": 0.010, "is_foam": False, "min_wall": 1.0}, "POM": {"name": "POM", "density": 1.41, "shrinkage": 0.020, "is_foam": False, "min_wall": 1.0}, "PMMA": {"name": "PMMA", "density": 1.18, "shrinkage": 0.005, "is_foam": False, "min_wall": 1.5}, "PBT": {"name": "PBT", "density": 1.31, "shrinkage": 0.015, "is_foam": False, "min_wall": 1.2}, "PS": {"name": "PS", "density": 1.05, "shrinkage": 0.004, "is_foam": False, "min_wall": 1.0}, # —— 铝泡沫 —— "AlSi10Mg": {"name": "AlSi10Mg", "density": 0.45, "shrinkage": 0.015, "is_foam": True, "expansion_ratio": 2.5, "molding_temp": 380, "description": "常用铝硅泡沫"}, "AlSi12": {"name": "AlSi12", "density": 0.50, "shrinkage": 0.012, "is_foam": True, "expansion_ratio": 2.2, "molding_temp": 360, "description": "高强度铝泡沫"}, "Pure Al Foam": {"name": "Pure Al Foam", "density": 0.35, "shrinkage": 0.020, "is_foam": True, "expansion_ratio": 3.0, "molding_temp": 400, "description": "纯铝泡沫"}, "AlSi7Mg": {"name": "AlSi7Mg", "density": 0.40, "shrinkage": 0.018, "is_foam": True, "expansion_ratio": 2.8, "molding_temp": 390, "description": "轻质铝镁泡沫"}, } # 默认回退材料 _DEFAULT_MATERIAL = MATERIAL_PROPERTIES["ABS"] class MaterialService: """材料属性管理服务 - 集中管理材料字典,便于扩展和单测""" @staticmethod def get_material(material_name: str) -> Dict[str, Any]: """获取材料属性,不存在则回退到 ABS""" return MATERIAL_PROPERTIES.get(material_name, _DEFAULT_MATERIAL) @staticmethod def has_material(material_name: str) -> bool: """材料是否在字典中(不回退)""" return material_name in MATERIAL_PROPERTIES @staticmethod def is_foam_material(material_name: str) -> bool: return MATERIAL_PROPERTIES.get(material_name, _DEFAULT_MATERIAL).get("is_foam", False) @staticmethod def list_all_materials() -> List[str]: return list(MATERIAL_PROPERTIES.keys()) @staticmethod def resolve_material(requested: str) -> str: """解析请求的材料名,若不在字典中则回退为 ABS""" return requested if requested in MATERIAL_PROPERTIES else "ABS"