分模候选方案
This commit is contained in:
@@ -237,7 +237,6 @@ class MoldCavityGenerator(BaseMoldGenerator):
|
||||
logger.info(f"转换得到 {len(regions)} 个兼容倒扣区域")
|
||||
return regions
|
||||
|
||||
<<<<<<< HEAD
|
||||
def _analyze_face_normals(self, shape: Any) -> gp_Dir:
|
||||
"""
|
||||
分析产品表面的法向量分布,找出最优分型方向
|
||||
@@ -249,87 +248,6 @@ class MoldCavityGenerator(BaseMoldGenerator):
|
||||
"""
|
||||
face_normals = []
|
||||
explorer = TopExp_Explorer(shape, TopAbs_FACE)
|
||||
=======
|
||||
return scaled_shape
|
||||
|
||||
def _apply_draft_angles(self, shape: Any, parting_surface: Any) -> Any:
|
||||
"""添加拔模角(简化实现)"""
|
||||
# 实际实现需要复杂的拔模面处理
|
||||
# 这里返回原始形状(假设已在CAD中处理)
|
||||
logger.warning("拔模角处理为简化实现,建议在设计阶段处理")
|
||||
return shape
|
||||
|
||||
def _split_cavity_core(self, shape: Any, parting_surface: Any) -> Tuple[Any, Any]:
|
||||
"""
|
||||
按分型面将模具分为 A 板(定模/型腔侧)和 B 板(动模/型芯侧)
|
||||
|
||||
流程:
|
||||
1. 创建模具块(包围产品的长方体)
|
||||
2. 用分型面 Z 位置切出上半块和下半块
|
||||
3. 从上半块减去产品 → A 板(含型腔负形)
|
||||
4. 从下半块减去产品 → B 板(含型芯负形)
|
||||
"""
|
||||
try:
|
||||
from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeBox
|
||||
from OCC.Core.BRepAlgoAPI import BRepAlgoAPI_Cut
|
||||
from OCC.Core.TopExp import TopExp_Explorer
|
||||
from OCC.Core.TopAbs import TopAbs_SOLID
|
||||
|
||||
# 获取产品边界框
|
||||
from OCC.Core.Bnd import Bnd_Box
|
||||
from OCC.Core.BRepBndLib import brepbndlib
|
||||
bbox = Bnd_Box()
|
||||
brepbndlib.Add(shape, bbox)
|
||||
xmin, ymin, zmin, xmax, ymax, zmax = bbox.Get()
|
||||
|
||||
# 获取分型面 Z 位置(包围盒 Z 中心)
|
||||
parting_z = (zmin + zmax) / 2
|
||||
|
||||
# 计算模具块尺寸(比产品大一定余量)
|
||||
margin = 20 # mm
|
||||
mold_xmin = xmin - margin
|
||||
mold_ymin = ymin - margin
|
||||
mold_zmin = zmin - margin
|
||||
mold_xmax = xmax + margin
|
||||
mold_ymax = ymax + margin
|
||||
mold_zmax = zmax + margin
|
||||
|
||||
# 上半块: 从 parting_z 到 mold_zmax
|
||||
upper_block = BRepPrimAPI_MakeBox(
|
||||
gp_Pnt(mold_xmin, mold_ymin, parting_z),
|
||||
gp_Pnt(mold_xmax, mold_ymax, mold_zmax)
|
||||
).Shape()
|
||||
|
||||
# 下半块: 从 mold_zmin 到 parting_z
|
||||
lower_block = BRepPrimAPI_MakeBox(
|
||||
gp_Pnt(mold_xmin, mold_ymin, mold_zmin),
|
||||
gp_Pnt(mold_xmax, mold_ymax, parting_z)
|
||||
).Shape()
|
||||
|
||||
# A 板(定模)= 上半块 - 产品
|
||||
a_plate_op = BRepAlgoAPI_Cut(upper_block, shape)
|
||||
if a_plate_op.IsDone():
|
||||
a_plate = a_plate_op.Shape()
|
||||
logger.info(f"A板(定模)生成成功: Z={parting_z:.1f} ~ {mold_zmax:.1f}")
|
||||
else:
|
||||
logger.warning("A板布尔减法失败,使用上半块")
|
||||
a_plate = upper_block
|
||||
|
||||
# B 板(动模)= 下半块 - 产品
|
||||
b_plate_op = BRepAlgoAPI_Cut(lower_block, shape)
|
||||
if b_plate_op.IsDone():
|
||||
b_plate = b_plate_op.Shape()
|
||||
logger.info(f"B板(动模)生成成功: Z={mold_zmin:.1f} ~ {parting_z:.1f}")
|
||||
else:
|
||||
logger.warning("B板布尔减法失败,使用下半块")
|
||||
b_plate = lower_block
|
||||
|
||||
return a_plate, b_plate
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"分模失败: {e}")
|
||||
return shape, shape
|
||||
>>>>>>> 77c4885a4020b609f4964184661f42e936814c4f
|
||||
|
||||
while explorer.More():
|
||||
face = TopoDS_Face(explorer.Current())
|
||||
|
||||
Reference in New Issue
Block a user