This commit is contained in:
2026-04-21 14:41:58 +08:00
parent 5b7bbccce0
commit f8f034552a
2 changed files with 97 additions and 63 deletions
+45 -53
View File
@@ -247,9 +247,12 @@ class AluminumFoamMoldGenerator:
"manufacturing_info": {
"estimated_mold_size": self._calculate_mold_size(analysis),
"estimated_clamping_force": self._calculate_clamping_force(analysis),
"clamping_force_formula": "投影面积(cm²) × 0.3 (泡沫材料系数)",
"recommended_material": material_info.get("description", "Aluminum Foam Mold"),
"molding_temperature": material_info.get("molding_temp", 380),
"expansion_ratio": material_info.get("expansion_ratio", 2.5)
"expansion_ratio": material_info.get("expansion_ratio", 2.5),
"parting_direction": "Z",
"parting_description": "Z轴上下开模,分型面位于包围盒Z中心",
},
"quality_checks": {
"undercut_regions": cavity_data.get("undercut_regions", []),
@@ -436,7 +439,11 @@ class AluminumFoamMoldGenerator:
def _detect_parting_surfaces(self, shape: Any, analysis: Dict) -> Dict[str, Any]:
"""
检测分型面(支持多分型面)
检测分型面(泡沫模具专用)
规则:
1. 优先选择 Z 轴方向分型(上下开模)
2. 分型面位置选在产品的最大轮廓处,即包围盒的 Z 方向中心
"""
# 1. 尝试 AI 模型
if self.ai_parting_detector is not None:
@@ -446,58 +453,37 @@ class AluminumFoamMoldGenerator:
return self._create_parting_surface_from_ai(ai_result, analysis)
except Exception as e:
logger.warning(f"AI 分型面检测失败: {e}")
# 2. 法向量分析确定主方向
normal_stats = analysis.get("normal_statistics", {})
primary_direction = normal_stats.get("primary_direction", [0, 0, 1])
# 3. 创建主分型面
# 2. 泡沫模具强制 Z 轴方向分型(上下开模)
bbox = analysis["bounding_box"]
center = bbox["center"]
# 沿主方向创建分型面
dir_obj = gp_Dir(primary_direction[0], primary_direction[1], primary_direction[2])
parting_plane = gp_Pln(gp_Pnt(center[0], center[1], center[2]), dir_obj)
primary_direction = [0, 0, 1] # Z 轴方向
# 分型面位于包围盒 Z 方向中心(最大轮廓处)
parting_z = center[2]
parting_plane = gp_Pln(gp_Pnt(center[0], center[1], parting_z), gp_Dir(0, 0, 1))
try:
parting_surface = BRepBuilderAPI_MakeFace(parting_plane).Face()
except Exception:
# 回退到默认平面
parting_plane = gp_Pln(gp_Pnt(0, 0, center[2]), gp_Dir(0, 0, 1))
parting_plane = gp_Pln(gp_Pnt(0, 0, parting_z), gp_Dir(0, 0, 1))
parting_surface = BRepBuilderAPI_MakeFace(parting_plane).Face()
# 4. 计算分型线
logger.info(f"泡沫模具 Z 轴分型面: Z={parting_z:.2f} mm (包围盒中心)")
# 3. 计算分型线
parting_line = self._calculate_parting_line(shape, parting_surface)
# 5. 检测是否需要多分型面(基于产品复杂度)
additional_surfaces = []
# 检查产品高度方向的比例
dims = bbox["dimensions"]
max_dim = max(dims)
min_dim = min(dims)
# 如果产品非常扁平,可能需要水平分型面
if max_dim / min_dim > 5:
# 尝试添加垂直分型面
vertical_plane = gp_Pln(gp_Pnt(center[0], center[1], center[2]), gp_Dir(1, 0, 0))
try:
vertical_surface = BRepBuilderAPI_MakeFace(vertical_plane).Face()
additional_surfaces.append({
"surface": vertical_surface,
"direction": [1, 0, 0],
"reason": "产品扁平,需要垂直分型"
})
except Exception:
pass
return {
"primary_surface": parting_surface,
"primary_line": parting_line,
"primary_direction": primary_direction,
"confidence": normal_stats.get("confidence", 0.5),
"additional_surfaces": additional_surfaces,
"surface_count": 1 + len(additional_surfaces)
"confidence": 0.95, # Z 轴分型置信度高
"additional_surfaces": [],
"surface_count": 1,
"parting_direction": "Z",
"parting_position_z": parting_z,
}
def _detect_undercut_regions(self, shape: Any, parting_surface: Any) -> List[Dict]:
@@ -904,17 +890,23 @@ class AluminumFoamMoldGenerator:
}
def _calculate_clamping_force(self, analysis: Dict) -> str:
"""估算锁模力"""
volume_cm3 = analysis.get("volume", 0) / 1000
if volume_cm3 < 10:
return "30-50 吨"
elif volume_cm3 < 50:
return "50-100 吨"
elif volume_cm3 < 200:
return "100-200 吨"
else:
return "200+ 吨"
"""
估算锁模力(泡沫模具专用)
公式: 锁模力(吨) = 投影面积(cm²) × 0.3 (泡沫材料系数)
投影面积 = 长度 × 宽度 (Z轴开模)
"""
bbox = analysis.get("bounding_box", {})
dims = bbox.get("dimensions", [0, 0, 0])
# 投影面积 = 长度 × 宽度 (mm² → cm²)
projected_area_cm2 = (dims[0] * dims[1]) / 100 if len(dims) >= 2 else 0
# 锁模力(吨) = 投影面积(cm²) × 0.3
clamping_force_ton = int(projected_area_cm2 * 0.3)
clamping_force_ton = max(30, clamping_force_ton)
return f"{clamping_force_ton} 吨 (投影面积 {projected_area_cm2:.1f} cm² × 0.3)"
def _calculate_product_weight(self, analysis: Dict) -> str:
"""计算产品重量"""