|

楼主 |
发表于 2025-4-9 11:08:20
|
显示全部楼层
SectionStackBuilder.cpp(新增支持)
✅ 1. 样条拟合辅助方法
TopoDS_Wire SectionStackBuilder::buildWireFromContour(const Contour2D& contour, double z)
{
TColgp_Array1OfPnt points(1, (int)contour.size() + 1); // 封闭样条首尾闭合
for (size_t i = 0; i < contour.size(); ++i) {
points.SetValue((int)i + 1, gp_Pnt(contour[i].x(), contour[i].y(), z));
}
points.SetValue((int)contour.size() + 1, gp_Pnt(contour[0].x(), contour[0].y(), z)); // 闭合首尾
Handle(Geom_BSplineCurve) spline = GeomAPI_PointsToBSpline(points, GeomAbs_C2, 3, 8e-6);
return BRepBuilderAPI_MakeWire(BRepBuilderAPI_MakeEdge(spline));
}
2. 每层组合 wire(外轮廓 + 内孔)
TopoDS_Wire SectionStackBuilder::buildLayerWire(const LayerContour& layer)
{
BRepBuilderAPI_MakeWire wireBuilder;
for (size_t i = 0; i < layer.closedContours.size(); ++i)
{
const auto& contour = layer.closedContours[i];
TopoDS_Wire wire;
if (m_useSpline)
wire = buildWireFromContour(contour, layer.zHeight);
else
{
BRepBuilderAPI_MakeWire tempWire;
for (size_t j = 0; j < contour.size(); ++j)
{
Eigen::Vector2d p1 = contour[j];
Eigen::Vector2d p2 = contour[(j + 1) % contour.size()];
gp_Pnt gp1(p1.x(), p1.y(), layer.zHeight);
gp_Pnt gp2(p2.x(), p2.y(), layer.zHeight);
tempWire.Add(BRepBuilderAPI_MakeEdge(gp1, gp2));
}
wire = tempWire.Wire();
}
wireBuilder.Add(wire);
}
return wireBuilder.Wire();
}
3. 构建逻辑
TopoDS_Shape SectionStackBuilder::build()
{
if (m_sections.size() < 2)
throw std::runtime_error("至少需要两个层");
BRepOffsetAPI_ThruSections builder(true); // solid = true
for (const auto& layer : m_sections)
{
TopoDS_Wire wire = buildLayerWire(layer);
builder.AddWire(wire);
}
builder.Build();
return builder.Shape();
}
4. STL 导出同上:
bool SectionStackBuilder::exportAsSTL(const std::string& filePath, double deflection)
{
TopoDS_Shape solid = build();
StlAPI_Writer writer;
writer.SetASCIIMode(false);
writer.Write(solid, filePath.c_str());
return true;
}
|
|