This commit is contained in:
2026-07-20 10:16:27 +08:00
parent 8493f0df03
commit f3d2951dc3
24 changed files with 23623 additions and 1546 deletions
+9 -50
View File
@@ -29,6 +29,7 @@ from shared.models.schemas import create_mold_cavity_data, create_mold_key_info
from shared.utils.logger import get_logger
from moldinsight.core.base_mold_generator import BaseMoldGenerator
from moldinsight.core.side_action_designer import SideActionDesigner
from moldinsight.services.material_service import MaterialService
logger = get_logger(__name__)
@@ -54,48 +55,6 @@ class AluminumFoamMoldGenerator(BaseMoldGenerator):
self.foam_material = foam_material
self.foam_materials = {
"AlSi10Mg": {
"density": 0.45,
"expansion_ratio": 2.5,
"shrinkage_rate": 0.015,
"molding_temp": 380,
"description": "常用铝硅泡沫"
},
"AlSi12": {
"density": 0.50,
"expansion_ratio": 2.2,
"shrinkage_rate": 0.012,
"molding_temp": 360,
"description": "高强度铝泡沫"
},
"Pure Al Foam": {
"density": 0.35,
"expansion_ratio": 3.0,
"shrinkage_rate": 0.020,
"molding_temp": 400,
"description": "纯铝泡沫"
},
"AlSi7Mg": {
"density": 0.40,
"expansion_ratio": 2.8,
"shrinkage_rate": 0.018,
"molding_temp": 390,
"description": "轻质铝镁泡沫"
}
}
self.plastic_materials = {
"ABS": {"density": 1.05, "shrinkage": 0.005},
"PP": {"density": 0.90, "shrinkage": 0.016},
"PC": {"density": 1.20, "shrinkage": 0.005},
"PE": {"density": 0.95, "shrinkage": 0.025},
"PS": {"density": 1.05, "shrinkage": 0.004},
"PA": {"density": 1.14, "shrinkage": 0.015},
"POM": {"density": 1.42, "shrinkage": 0.020},
"PMMA": {"density": 1.18, "shrinkage": 0.004}
}
self.parting_line_tolerance = 0.1
self.max_draft_angle = 5.0
self.min_draft_angle = 1.0
@@ -107,21 +66,21 @@ class AluminumFoamMoldGenerator(BaseMoldGenerator):
def set_foam_material(self, material: str):
"""设置铝泡沫材料"""
if material in self.foam_materials:
props = self.foam_materials[material]
if MaterialService.is_foam_material(material):
props = MaterialService.get_material(material)
self.foam_material = material
self.material_density = props["density"]
self.shrinkage_rate = props["shrinkage_rate"]
self.shrinkage_rate = props["shrinkage"]
logger.info(f"铝泡沫材料设置为 {material}, 密度: {props['density']} g/cm³")
else:
logger.warning(f"未知材料 {material}, 使用当前设置")
def set_material(self, material: str):
"""设置材料(自动识别类型)"""
if material in self.foam_materials:
if MaterialService.is_foam_material(material):
self.set_foam_material(material)
elif material in self.plastic_materials:
props = self.plastic_materials[material]
elif MaterialService.has_material(material):
props = MaterialService.get_material(material)
self.material_density = props["density"]
self.shrinkage_rate = props["shrinkage"]
logger.info(f"塑料材料设置为 {material}, 密度: {props['density']} g/cm³")
@@ -204,7 +163,7 @@ class AluminumFoamMoldGenerator(BaseMoldGenerator):
parting_geometry = self._extract_parting_surface_geometry(parting_surface)
material_info = self.foam_materials.get(self.foam_material, {})
material_info = MaterialService.get_material(self.foam_material)
detailed_json = {
"metadata": {
@@ -251,7 +210,7 @@ class AluminumFoamMoldGenerator(BaseMoldGenerator):
def generate_cavity_key_info(self, cavity_data: Dict) -> Dict[str, Any]:
"""生成模具型腔的关键信息"""
analysis = cavity_data["analysis"]
material_info = self.foam_materials.get(self.foam_material, {})
material_info = MaterialService.get_material(self.foam_material)
key_info = {
"mold_parameters": {
+3 -9
View File
@@ -9,6 +9,7 @@ from shared.models.schemas import (
create_analysis_result
)
from shared.utils.logger import get_logger
from moldinsight.services.material_service import MaterialService
logger = get_logger(__name__)
@@ -25,12 +26,6 @@ class GeometryAnalyzer:
"high_complexity": 50,
}
self.product_materials = {
"ABS": {"shrinkage": 0.005, "min_wall": 1.2},
"PP": {"shrinkage": 0.016, "min_wall": 1.0},
"PC": {"shrinkage": 0.007, "min_wall": 1.5},
}
self.mold_materials = {
"Aluminum": {"thermal_conductivity": 200, "hardness": "HB80", "cost": "low"},
"P20_Steel": {"thermal_conductivity": 30, "hardness": "HRC30", "cost": "medium"},
@@ -54,7 +49,6 @@ class GeometryAnalyzer:
features = self._detect_features(geometry_data, shape)
product_props = self.product_materials.get(product_material, {})
mold_props = self.mold_materials.get(mold_material, {})
recommendations = self._generate_recommendations(
@@ -744,8 +738,8 @@ class GeometryAnalyzer:
avg_thickness = (volume / surface_area) * 0.6
if avg_thickness is not None:
material_props = self.product_materials.get(material, self.product_materials["ABS"])
min_wall = material_props["min_wall"]
material_props = MaterialService.get_material(material)
min_wall = material_props.get("min_wall", 1.2)
if avg_thickness < min_wall:
return create_design_recommendation(
+3 -13
View File
@@ -13,6 +13,7 @@ from shared.models.schemas import create_mold_cavity_data, create_mold_key_info
from shared.utils.logger import get_logger
from moldinsight.core.base_mold_generator import BaseMoldGenerator
from moldinsight.core.side_action_designer import SideActionDesigner
from moldinsight.services.material_service import MaterialService
logger = get_logger(__name__)
@@ -24,25 +25,14 @@ class MoldCavityGenerator(BaseMoldGenerator):
material_density: float = 1.05):
super().__init__(shrinkage_rate, draft_angle, material_density)
self.material_densities = {
"ABS": 1.05,
"PP": 0.90,
"PC": 1.20,
"PE": 0.95,
"PS": 1.05,
"PA": 1.14,
"POM": 1.42,
"PMMA": 1.18
}
self.parting_line_tolerance = 0.1
self.max_draft_angle = 5.0
self.side_action_designer = SideActionDesigner()
def set_material(self, material: str):
"""设置产品材料"""
if material in self.material_densities:
self.material_density = self.material_densities[material]
if MaterialService.has_material(material):
self.material_density = MaterialService.get_material(material)["density"]
logger.info(f"材料设置为 {material}, 密度: {self.material_density} g/cm³")
else:
logger.warning(f"未知材料 {material}, 使用默认密度 {self.material_density} g/cm³")
+36 -15
View File
@@ -1,22 +1,38 @@
# services/material_service.py
"""材料属性管理服务"""
"""材料属性管理服务 - 全局唯一材料属性源
from typing import Dict, Any, List, Optional
所有材料属性(密度、收缩率、最小壁厚、泡沫特性等)集中在此,
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": {"density": 1.05, "shrinkage": 0.005, "name": "ABS", "is_foam": False},
"PP": {"density": 0.90, "shrinkage": 0.016, "name": "PP", "is_foam": False},
"PE": {"density": 0.95, "shrinkage": 0.020, "name": "PE", "is_foam": False},
"PC": {"density": 1.20, "shrinkage": 0.007, "name": "PC", "is_foam": False},
"PA": {"density": 1.14, "shrinkage": 0.010, "name": "PA", "is_foam": False},
"POM": {"density": 1.41, "shrinkage": 0.020, "name": "POM", "is_foam": False},
"PMMA": {"density": 1.18, "shrinkage": 0.005, "name": "PMMA", "is_foam": False},
"PBT": {"density": 1.31, "shrinkage": 0.015, "name": "PBT", "is_foam": False},
"AlSi10Mg": {"density": 0.45, "shrinkage": 0.015, "name": "AlSi10Mg", "is_foam": True},
"AlSi12": {"density": 0.50, "shrinkage": 0.012, "name": "AlSi12", "is_foam": True},
"Pure Al Foam": {"density": 0.35, "shrinkage": 0.020, "name": "Pure Al Foam", "is_foam": True},
"AlSi7Mg": {"density": 0.40, "shrinkage": 0.018, "name": "AlSi7Mg", "is_foam": True},
# —— 注塑塑料 ——
"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": "轻质铝镁泡沫"},
}
# 默认回退材料
@@ -24,13 +40,18 @@ _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)