Files
geMoldInsight/src/moldinsight/services/material_service.py
T
2026-07-20 10:16:27 +08:00

67 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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"