OpenCASCADE 7.7.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*