fix: Generate faces for sketch objects and fix tool preview state
Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
@@ -14,6 +14,7 @@
|
|||||||
#include <gp_Ax2.hxx>
|
#include <gp_Ax2.hxx>
|
||||||
#include <TopExp_Explorer.hxx>
|
#include <TopExp_Explorer.hxx>
|
||||||
#include <ShapeAnalysis_FreeBounds.hxx>
|
#include <ShapeAnalysis_FreeBounds.hxx>
|
||||||
|
#include <gp_Pln.hxx>
|
||||||
|
|
||||||
#include <QJsonArray>
|
#include <QJsonArray>
|
||||||
|
|
||||||
@@ -53,6 +54,13 @@ void SketchFeature::buildShape()
|
|||||||
QList<TopoDS_Edge> lineEdges;
|
QList<TopoDS_Edge> lineEdges;
|
||||||
QList<TopoDS_Face> faces;
|
QList<TopoDS_Face> faces;
|
||||||
|
|
||||||
|
gp_Pln sketchPlane;
|
||||||
|
switch (m_plane) {
|
||||||
|
case SketchPlane::XY: sketchPlane = gp_Pln(gp::Origin(), gp::DY()); break;
|
||||||
|
case SketchPlane::XZ: sketchPlane = gp_Pln(gp::Origin(), gp::DZ()); break;
|
||||||
|
case SketchPlane::YZ: sketchPlane = gp_Pln(gp::Origin(), gp::DX()); break;
|
||||||
|
}
|
||||||
|
|
||||||
for (SketchObject* obj : m_objects) {
|
for (SketchObject* obj : m_objects) {
|
||||||
if (auto line = dynamic_cast<SketchLine*>(obj)) {
|
if (auto line = dynamic_cast<SketchLine*>(obj)) {
|
||||||
BRepBuilderAPI_MakeEdge makeEdge(line->startPoint(), line->endPoint());
|
BRepBuilderAPI_MakeEdge makeEdge(line->startPoint(), line->endPoint());
|
||||||
@@ -82,7 +90,7 @@ void SketchFeature::buildShape()
|
|||||||
if (me1.IsDone() && me2.IsDone() && me3.IsDone() && me4.IsDone()) {
|
if (me1.IsDone() && me2.IsDone() && me3.IsDone() && me4.IsDone()) {
|
||||||
BRepBuilderAPI_MakeWire wireBuilder(me1.Edge(), me2.Edge(), me3.Edge(), me4.Edge());
|
BRepBuilderAPI_MakeWire wireBuilder(me1.Edge(), me2.Edge(), me3.Edge(), me4.Edge());
|
||||||
if (wireBuilder.IsDone()) {
|
if (wireBuilder.IsDone()) {
|
||||||
BRepBuilderAPI_MakeFace faceBuilder(wireBuilder.Wire());
|
BRepBuilderAPI_MakeFace faceBuilder(sketchPlane, wireBuilder.Wire());
|
||||||
if (faceBuilder.IsDone()) {
|
if (faceBuilder.IsDone()) {
|
||||||
faces.append(faceBuilder.Face());
|
faces.append(faceBuilder.Face());
|
||||||
}
|
}
|
||||||
@@ -127,7 +135,7 @@ void SketchFeature::buildShape()
|
|||||||
TopExp_Explorer explorer(closedWires, TopAbs_WIRE);
|
TopExp_Explorer explorer(closedWires, TopAbs_WIRE);
|
||||||
for (; explorer.More(); explorer.Next()) {
|
for (; explorer.More(); explorer.Next()) {
|
||||||
TopoDS_Wire wire = TopoDS::Wire(explorer.Current());
|
TopoDS_Wire wire = TopoDS::Wire(explorer.Current());
|
||||||
BRepBuilderAPI_MakeFace faceBuilder(wire);
|
BRepBuilderAPI_MakeFace faceBuilder(sketchPlane, wire);
|
||||||
if (faceBuilder.IsDone()) {
|
if (faceBuilder.IsDone()) {
|
||||||
faces.append(faceBuilder.Face());
|
faces.append(faceBuilder.Face());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -730,6 +730,7 @@ void ViewportWidget::drawSketch(const SketchFeature* sketch)
|
|||||||
m_litShaderProgram->setAttributeBuffer(1, GL_FLOAT, 3 * sizeof(GLfloat), 3, 6 * sizeof(GLfloat));
|
m_litShaderProgram->setAttributeBuffer(1, GL_FLOAT, 3 * sizeof(GLfloat), 3, 6 * sizeof(GLfloat));
|
||||||
|
|
||||||
glDrawArrays(GL_TRIANGLES, 0, faceData.size() / 6);
|
glDrawArrays(GL_TRIANGLES, 0, faceData.size() / 6);
|
||||||
|
m_litShaderProgram->disableAttributeArray(1);
|
||||||
m_shaderProgram->bind(); // rebind simple shader for subsequent draws
|
m_shaderProgram->bind(); // rebind simple shader for subsequent draws
|
||||||
}
|
}
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
|
|||||||
Reference in New Issue
Block a user