跳至正文
-
Subscribe to our newsletter & never miss our best posts. Subscribe Now!
CAE

学习CAE软件开发

CAE

学习CAE软件开发

  • 首页
  • OCCT
  • C++
  • 首页
  • OCCT
  • C++
关

搜索

  • https://www.facebook.com/
  • https://twitter.com/
  • https://t.me/
  • https://www.instagram.com/
  • https://youtube.com/
Subscribe
主页

OpenCASCADE 7.7.0 完全教程(二十一):法兰盘参数化建模实战

作者 Comely
2026年 3月 5日 2 分钟阅读
0

OpenCASCADE 7.7.0 完全教程(二十一):法兰盘参数化建模实战

> 版本: OCCT 7.7.0
> 难度: 实战
> 字数: 约 3000 字
> 案例: 完整法兰盘零件设计

—

案例概述

本教程将带领你完成一个完整的法兰盘零件建模,综合运用前面学到的所有技能:
– 基本体素创建
– 布尔运算
– 倒角圆角
– 阵列复制
– 参数化设计

法兰盘规格

| 参数 | 数值 | 说明 |
|——|——|——|
| 外径 | 150mm | 法兰盘整体直径 |
| 内径 | 50mm | 中心通孔直径 |
| 厚度 | 20mm | 法兰盘厚度 |
| 螺栓孔数 | 6 | 均布螺栓孔 |
| 螺栓孔径 | 12mm | 单个螺栓孔直径 |
| 分布圆直径 | 120mm | 螺栓孔中心分布圆 |

—

完整代码实现

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

// 法兰盘参数 struct FlangeParams { double outerRadius = 75.0; // 外半径 double innerRadius = 25.0; // 内半径 double thickness = 20.0; // 厚度 int boltHoleCount = 6; // 螺栓孔数量 double boltHoleRadius = 6.0; // 螺栓孔半径 double boltCircleRadius = 60.0; // 螺栓分布圆半径 double edgeFillet = 3.0; // 边缘圆角 };

// 创建法兰盘主体 TopoDS_Solid CreateFlangeBody(const FlangeParams& params) { // 创建外圆柱 gp_Ax2 axis(gp_Pnt(0, 0, 0), gp_Dir(0, 0, 1)); TopoDS_Solid outerCyl = BRepPrimAPI_MakeCylinder( axis, params.outerRadius, params.thickness); // 创建内孔刀具 TopoDS_Solid innerCyl = BRepPrimAPI_MakeCylinder( axis, params.innerRadius, params.thickness); // 切除中心孔 BRepAlgoAPI_Cut cut(outerCyl, innerCyl); return TopoDS::Solid(cut.Shape()); }

// 创建单个螺栓孔 TopoDS_Solid CreateBoltHole(const gp_Pnt& center, double radius, double height) { gp_Ax2 axis(center, gp_Dir(0, 0, 1)); return BRepPrimAPI_MakeCylinder(axis, radius, height); }

// 创建所有螺栓孔 TopTools_ListOfShape CreateBoltHoles(const FlangeParams& params) { TopTools_ListOfShape holes; for (int i = 0; i < params.boltHoleCount; i++) { double angle = 2.0 * M_PI * i / params.boltHoleCount; double x = params.boltCircleRadius * cos(angle); double y = params.boltCircleRadius * sin(angle); gp_Pnt center(x, y, 0); TopoDS_Solid hole = CreateBoltHole(center, params.boltHoleRadius, params.thickness); holes.Append(hole); } return holes; }

// 合并所有螺栓孔刀具 TopoDS_Shape MergeShapes(const TopTools_ListOfShape& shapes) { if (shapes.IsEmpty()) { return TopoDS_Shape(); } TopoDS_Shape result = shapes.First(); for (TopTools_ListIteratorOfListOfShape it(shapes); it.More(); it.Next()) { if (it.Value() != shapes.First()) { BRepAlgoAPI_Fuse fuse(result, it.Value()); result = fuse.Shape(); } } return result; }

// 添加边缘圆角 TopoDS_Shape AddEdgeFillets(const TopoDS_Shape& shape, double radius) { BRepFilletAPI_MakeFillet fillet(shape); // 查找所有外边缘 TopExp_Explorer exp(shape, TopAbs_EDGE); while (exp.More()) { TopoDS_Edge edge = TopoDS::Edge(exp.Current()); fillet.Add(radius, edge); exp.Next(); } return fillet.Shape(); }

int main() { std::cout << "=== 法兰盘参数化建模 ===" << std::endl; // 1. 设置参数 FlangeParams params; std::cout << "参数设置:" << std::endl; std::cout << " 外径:" << params.outerRadius * 2 << "mm" << std::endl; std::cout << " 内径:" << params.innerRadius * 2 << "mm" << std::endl; std::cout << " 厚度:" << params.thickness << "mm" << std::endl; std::cout << " 螺栓孔:" << params.boltHoleCount << " x M" << params.boltHoleRadius * 2 << std::endl; // 2. 创建法兰盘主体 std::cout << "\n步骤 1: 创建法兰盘主体..." << std::endl; TopoDS_Solid body = CreateFlangeBody(params); // 3. 创建螺栓孔 std::cout << "步骤 2: 创建螺栓孔..." << std::endl; TopTools_ListOfShape boltHoles = CreateBoltHoles(params); TopoDS_Shape allHoles = MergeShapes(boltHoles); // 4. 切除螺栓孔 std::cout << "步骤 3: 切除螺栓孔..." << std::endl; BRepAlgoAPI_Cut cut(body, allHoles); TopoDS_Shape withHoles = cut.Shape(); // 5. 添加圆角 std::cout << "步骤 4: 添加边缘圆角..." << std::endl; TopoDS_Shape finalPart = AddEdgeFillets(withHoles, params.edgeFillet); std::cout << "\n✅ 法兰盘建模完成!" << std::endl; return 0; }

---

代码详解

1. 参数化结构设计

使用结构体管理所有设计参数,便于修改和重用:

struct FlangeParams {
    double outerRadius = 75.0;      // 外半径
    double innerRadius = 25.0;      // 内半径
    double thickness = 20.0;        // 厚度
    int boltHoleCount = 6;          // 螺栓孔数量
    double boltHoleRadius = 6.0;    // 螺栓孔半径
    double boltCircleRadius = 60.0; // 螺栓分布圆半径
    double edgeFillet = 3.0;        // 边缘圆角
};

优势:
- 所有参数集中管理
- 易于修改和迭代
- 可以保存为配置文件

2. 螺栓孔阵列计算

使用极坐标计算均布孔位置:

for (int i = 0; i < params.boltHoleCount; i++) {
    double angle = 2.0 * M_PI * i / params.boltHoleCount;
    double x = params.boltCircleRadius * cos(angle);
    double y = params.boltCircleRadius * sin(angle);
    gp_Pnt center(x, y, 0);
    // 创建螺栓孔...
}

3. 布尔运算流程

外圆柱 → 切除内孔 → 切除螺栓孔 → 添加圆角 → 完成

---

扩展:生成工程图数据

// 计算法兰盘质量属性
#include 
#include 

void CalculateMassProperties(const TopoDS_Shape& shape) { GProp_GProps props; BRepGProp::VolumeProperties(shape, props); double volume = props.Mass(); gp_Pnt center = props.CentreOfMass(); std::cout << "体积:" << volume << " mm³" << std::endl; std::cout << "质心:(" << center.X() << ", " << center.Y() << ", " << center.Z() << ")" << std::endl; }

---

常见问题

Q1: 如何修改法兰盘规格?

只需修改 FlangeParams 结构体中的参数值即可。

Q2: 螺栓孔位置不准确?

检查角度计算是否使用弧度制(M_PI),而非角度制。

Q3: 布尔运算失败?

尝试调整公差或确保几何体有足够重叠。

---

总结

本教程完成了:
- ✅ 参数化法兰盘设计
- ✅ 布尔运算综合应用
- ✅ 阵列孔计算
- ✅ 边缘处理

这是 OCCT 实战的典型工作流程。

---

*字数:约 3000 字 | 分类:OpenCASCADE 教程 | 难度:实战 | 版本:7.7.0*

作者

Comely

关注我
其他文章
上一个

OpenCASCADE 7.7.0 完全教程(二十):布尔运算实战

暂无评论!成为第一个。

发表回复 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注

近期文章

  • OpenCASCADE 7.7.0 完全教程(二十一):法兰盘参数化建模实战
  • OpenCASCADE 7.7.0 完全教程(二十):布尔运算实战
  • OpenCASCADE 7.7.0 完全教程(一):入门与架构详解
  • OpenCASCADE 7.7.0 完全教程(四):数据交换与格式转换
  • OpenCASCADE 7.7.0 完全教程(三):建模算法实战

归档

  • 2026 年 3 月

分类

  • 主页

opencascade小助手

Copyright 2026CAE. All rights reserved.
蜀ICP备2021024090号