2026-04-13 09:43:24 +08:00
|
|
|
|
# services/material_service.py
|
2026-07-20 10:16:27 +08:00
|
|
|
|
"""材料属性管理服务 - 全局唯一材料属性源
|
2026-04-13 09:43:24 +08:00
|
|
|
|
|
2026-07-20 10:16:27 +08:00
|
|
|
|
所有材料属性(密度、收缩率、最小壁厚、泡沫特性等)集中在此,
|
|
|
|
|
|
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
|
2026-04-13 09:43:24 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MATERIAL_PROPERTIES: Dict[str, Dict[str, Any]] = {
|
2026-07-20 10:16:27 +08:00
|
|
|
|
# —— 注塑塑料 ——
|
|
|
|
|
|
"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": "轻质铝镁泡沫"},
|
2026-04-13 09:43:24 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# 默认回退材料
|
|
|
|
|
|
_DEFAULT_MATERIAL = MATERIAL_PROPERTIES["ABS"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MaterialService:
|
2026-07-20 10:16:27 +08:00
|
|
|
|
"""材料属性管理服务 - 集中管理材料字典,便于扩展和单测"""
|
2026-04-13 09:43:24 +08:00
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
|
def get_material(material_name: str) -> Dict[str, Any]:
|
|
|
|
|
|
"""获取材料属性,不存在则回退到 ABS"""
|
|
|
|
|
|
return MATERIAL_PROPERTIES.get(material_name, _DEFAULT_MATERIAL)
|
|
|
|
|
|
|
2026-07-20 10:16:27 +08:00
|
|
|
|
@staticmethod
|
|
|
|
|
|
def has_material(material_name: str) -> bool:
|
|
|
|
|
|
"""材料是否在字典中(不回退)"""
|
|
|
|
|
|
return material_name in MATERIAL_PROPERTIES
|
|
|
|
|
|
|
2026-04-13 09:43:24 +08:00
|
|
|
|
@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"
|