diff --git a/src/moldinsight/core/base_mold_generator.py b/src/moldinsight/core/base_mold_generator.py index 67045fc..7edc64b 100644 --- a/src/moldinsight/core/base_mold_generator.py +++ b/src/moldinsight/core/base_mold_generator.py @@ -85,6 +85,18 @@ class BaseMoldGenerator: except Exception: return gp_Dir(0, 0, 1) + @staticmethod + def _create_mold_block(analysis: Dict, margin: float = 30.0) -> TopoDS_Shape: + """基于产品边界框创建模具包围盒(用于切分 A/B 半模等可视化用途)。""" + bbox = analysis.get("bounding_box", {}) + dims = bbox.get("dimensions", [100, 100, 100]) + center = bbox.get("center", [0, 0, 0]) + half = [d / 2 + margin for d in dims] + return BRepPrimAPI_MakeBox( + gp_Pnt(center[0] - half[0], center[1] - half[1], center[2] - half[2]), + gp_Pnt(center[0] + half[0], center[1] + half[1], center[2] + half[2]), + ).Shape() + def _find_draftable_faces(self, shape: TopoDS_Shape, draft_direction: gp_Dir) -> List[TopoDS_Face]: draftable = [] explorer = TopExp_Explorer(shape, TopAbs_FACE) @@ -257,7 +269,8 @@ class BaseMoldGenerator: cavity = self._subtract_product_from_plate(mold_block, shape, "型腔") if cavity is None: - cavity = mold_block + logger.error("型腔布尔减运算失败,无法生成有效型腔几何") + raise RuntimeError("型腔布尔减运算失败:无法从模具块中减去产品形状") core = self._build_core_with_base( shape, mold_block, parting_plane, @@ -440,8 +453,8 @@ class BaseMoldGenerator: return None, None def _subtract_product_from_plate(self, plate: TopoDS_Shape, product: TopoDS_Shape, - plate_name: str) -> TopoDS_Shape: - """从模板中减去产品形状,生成型腔或型芯""" + plate_name: str) -> Optional[TopoDS_Shape]: + """从模板中减去产品形状,生成型腔或型芯。失败时返回 None 而非静默返回纯方块。""" try: cut_op = BRepAlgoAPI_Cut(plate, product) if cut_op.IsDone(): @@ -449,11 +462,11 @@ class BaseMoldGenerator: logger.info(f"{plate_name}减去产品成功") return result else: - logger.warning(f"{plate_name}布尔减运算失败") - return plate + logger.warning(f"{plate_name}布尔减运算失败,返回 None 而非纯方块") + return None except Exception as e: logger.warning(f"{plate_name}减产品失败: {e}") - return plate + return None def _split_cavity_core_fallback(self, shape: TopoDS_Shape, mold_block: Optional[TopoDS_Shape] = None) -> Tuple[TopoDS_Shape, TopoDS_Shape]: @@ -476,7 +489,8 @@ class BaseMoldGenerator: cavity = self._subtract_product_from_plate(mold_block, shape, "型腔(回退)") if cavity is None: - cavity = mold_block + logger.error("回退方案型腔布尔减运算也失败") + raise RuntimeError("回退方案型腔布尔减运算失败") center_z = (zmin + zmax) / 2 parting_plane = gp_Pln(gp_Pnt(0, 0, center_z), gp_Dir(0, 0, 1)) @@ -503,7 +517,9 @@ class BaseMoldGenerator: gp_Pnt(xmax + margin, ymax + margin, zmax + margin) ).Shape() cavity = self._subtract_product_from_plate(cavity_block, shape, "型腔(兜底)") - return cavity or cavity_block, shape + if cavity is None: + raise RuntimeError("兜底型腔布尔减运算失败") + return cavity, shape except Exception: return shape, shape diff --git a/src/moldinsight/core/cad_exporter.py b/src/moldinsight/core/cad_exporter.py index ef944ca..cf54356 100644 --- a/src/moldinsight/core/cad_exporter.py +++ b/src/moldinsight/core/cad_exporter.py @@ -266,6 +266,9 @@ class CADExporter: "cavity": ("cavity", "型腔"), "core": ("core", "型芯"), "parting_surface": ("parting_surface", "分型面"), + "product": ("product", "产品本体"), + "a_plate": ("a_plate", "A板(上模)"), + "b_plate": ("b_plate", "B板(下模)"), } shapes_to_export: List[Tuple[str, str, TopoDS_Shape]] = [] diff --git a/src/moldinsight/core/multi_scheme_planner.py b/src/moldinsight/core/multi_scheme_planner.py index d218df6..13c3b00 100644 --- a/src/moldinsight/core/multi_scheme_planner.py +++ b/src/moldinsight/core/multi_scheme_planner.py @@ -161,6 +161,17 @@ class MultiSchemeMoldPlanner: cavity_data["metadata"]["core_required"] = mold_structure["core_required"] cavity_data["metadata"]["structure_decision_reason"] = mold_structure["decision_reason"] + # 生成可视化辅助形状:A/B 半模(分型面切分)、产品本体 + a_plate, b_plate, product_for_export = None, None, scaled_shape + try: + mold_block_shape = generator._create_mold_block(analysis, margin=30.0) + a_plate, b_plate = generator._split_mold_block_by_plane( + mold_block_shape, + generator._get_parting_plane(parting_surface, shape), + ) + except Exception as exc: + logger.debug(f"A/B 半模生成失败(不影响主流程): {exc}") + return { "scheme_id": candidate["scheme_id"], "method": candidate["method"], @@ -188,6 +199,9 @@ class MultiSchemeMoldPlanner: "cavity": cavity, "core": core, "parting_surface": parting_surface, + "product": product_for_export, + "a_plate": a_plate, + "b_plate": b_plate, }, }