diff --git a/src/SketchFeature.cpp b/src/SketchFeature.cpp index 57675d4..ef95687 100644 --- a/src/SketchFeature.cpp +++ b/src/SketchFeature.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -113,21 +114,22 @@ void SketchFeature::buildShape() } if (!lineEdges.isEmpty()) { - BRepBuilderAPI_MakeWire wireBuilder; + TopoDS_Compound compound; + BRep_Builder builder; + builder.MakeCompound(compound); for (const auto& edge : lineEdges) { - wireBuilder.Add(edge); + builder.Add(compound, edge); } - if (wireBuilder.IsDone()) { - TopoDS_Shape wiresShape = wireBuilder.Shape(); - TopExp_Explorer explorer(wiresShape, TopAbs_WIRE); - for (; explorer.More(); explorer.Next()) { - TopoDS_Wire wire = TopoDS::Wire(explorer.Current()); - if (wire.Closed()) { - BRepBuilderAPI_MakeFace faceBuilder(wire); - if (faceBuilder.IsDone()) { - faces.append(faceBuilder.Face()); - } - } + + ShapeAnalysis_FreeBounds freeBounds(compound, 1e-6, Standard_True); + TopoDS_Compound closedWires = freeBounds.GetClosedWires(); + + TopExp_Explorer explorer(closedWires, TopAbs_WIRE); + for (; explorer.More(); explorer.Next()) { + TopoDS_Wire wire = TopoDS::Wire(explorer.Current()); + BRepBuilderAPI_MakeFace faceBuilder(wire); + if (faceBuilder.IsDone()) { + faces.append(faceBuilder.Face()); } } } diff --git a/src/ViewportWidget.cpp b/src/ViewportWidget.cpp index 057e1ff..df0b0d9 100644 --- a/src/ViewportWidget.cpp +++ b/src/ViewportWidget.cpp @@ -544,11 +544,11 @@ void ViewportWidget::drawSketch(const SketchFeature* sketch) switch (sketch->plane()) { case SketchFeature::SketchPlane::XY: u_axis = QVector3D(1, 0, 0); - v_axis = QVector3D(0, 0, 1); + v_axis = QVector3D(0, 1, 0); break; case SketchFeature::SketchPlane::XZ: u_axis = QVector3D(1, 0, 0); - v_axis = QVector3D(0, 1, 0); + v_axis = QVector3D(0, 0, 1); break; case SketchFeature::SketchPlane::YZ: u_axis = QVector3D(0, 1, 0); @@ -574,10 +574,10 @@ void ViewportWidget::drawSketch(const SketchFeature* sketch) gp_Pnt p2, p4; if (sketch->plane() == SketchFeature::SketchPlane::XY) { p2.SetCoord(p3.X(), p1.Y(), p1.Z()); - p4.SetCoord(p1.X(), p1.Y(), p3.Z()); + p4.SetCoord(p1.X(), p3.Y(), p1.Z()); } else if (sketch->plane() == SketchFeature::SketchPlane::XZ) { p2.SetCoord(p3.X(), p1.Y(), p1.Z()); - p4.SetCoord(p1.X(), p3.Y(), p1.Z()); + p4.SetCoord(p1.X(), p1.Y(), p3.Z()); } else if (sketch->plane() == SketchFeature::SketchPlane::YZ) { p2.SetCoord(p1.X(), p3.Y(), p1.Z()); p4.SetCoord(p1.X(), p1.Y(), p3.Z()); @@ -664,6 +664,7 @@ void ViewportWidget::drawSketch(const SketchFeature* sketch) // Draw faces if (!sketch->shape().IsNull()) { + glDisable(GL_CULL_FACE); BRepMesh_IncrementalMesh(sketch->shape(), 0.1, Standard_False, 0.5, Standard_True); // Linear deflection, compute normals QVector faceData; @@ -731,6 +732,7 @@ void ViewportWidget::drawSketch(const SketchFeature* sketch) glDrawArrays(GL_TRIANGLES, 0, faceData.size() / 6); m_shaderProgram->bind(); // rebind simple shader for subsequent draws } + glEnable(GL_CULL_FACE); } glEnable(GL_DEPTH_TEST); @@ -787,6 +789,9 @@ void ViewportWidget::drawSelectionPlanes() glDisable(GL_DEPTH_TEST); m_vbo.bind(); + m_shaderProgram->enableAttributeArray(0); + m_shaderProgram->setAttributeBuffer(0, GL_FLOAT, 0, 3, 0); + m_shaderProgram->disableAttributeArray(1); QVector vertices; auto drawPlane = [&](const QVector& quadVerts, bool highlighted) {