Sketch: Add test case for degenerated geometry

This commit is contained in:
wmayer
2024-05-27 15:23:25 +02:00
committed by wwmayer
parent cdec6dd1a2
commit e96ac0b1db
3 changed files with 35 additions and 30 deletions

View File

@@ -972,30 +972,7 @@ std::vector<Base::Vector3d> SketchAnalysis::getOpenVertices() const
return points;
}
int SketchAnalysis::detectDegeneratedGeometries(double tolerance)
{
int countDegenerated = 0;
const std::vector<Part::Geometry*>& geom = sketch->getInternalGeometry();
for (std::size_t i = 0; i < geom.size(); i++) {
auto gf = GeometryFacade::getFacade(geom[i]);
if (gf->getConstruction()) {
continue;
}
if (gf->getGeometry()->isDerivedFrom<Part::GeomCurve>()) {
Part::GeomCurve* curve = static_cast<Part::GeomCurve*>(gf->getGeometry());
double len = curve->length(curve->getFirstParameter(), curve->getLastParameter());
if (len < tolerance) {
countDegenerated++;
}
}
}
return countDegenerated;
}
int SketchAnalysis::removeDegeneratedGeometries(double tolerance)
std::set<int> SketchAnalysis::getDegeneratedGeometries(double tolerance) const
{
std::set<int> delInternalGeometries;
const std::vector<Part::Geometry*>& geom = sketch->getInternalGeometry();
@@ -1006,8 +983,7 @@ int SketchAnalysis::removeDegeneratedGeometries(double tolerance)
continue;
}
if (gf->getGeometry()->isDerivedFrom<Part::GeomCurve>()) {
Part::GeomCurve* curve = static_cast<Part::GeomCurve*>(gf->getGeometry());
if (auto curve = dynamic_cast<Part::GeomCurve*>(gf->getGeometry())) {
double len = curve->length(curve->getFirstParameter(), curve->getLastParameter());
if (len < tolerance) {
delInternalGeometries.insert(static_cast<int>(i));
@@ -1015,9 +991,20 @@ int SketchAnalysis::removeDegeneratedGeometries(double tolerance)
}
}
return delInternalGeometries;
}
int SketchAnalysis::detectDegeneratedGeometries(double tolerance) const
{
std::set<int> delInternalGeometries = getDegeneratedGeometries(tolerance);
return static_cast<int>(delInternalGeometries.size());
}
int SketchAnalysis::removeDegeneratedGeometries(double tolerance)
{
std::set<int> delInternalGeometries = getDegeneratedGeometries(tolerance);
for (auto it = delInternalGeometries.rbegin(); it != delInternalGeometries.rend(); ++it) {
sketch->delGeometry(*it);
}
return static_cast<int>(delInternalGeometries.size());
}

View File

@@ -142,7 +142,7 @@ public:
void makeMissingEquality(bool onebyone = true);
/// Detect degenerated geometries
int detectDegeneratedGeometries(double tolerance);
int detectDegeneratedGeometries(double tolerance) const;
/// Remove degenerated geometries
int removeDegeneratedGeometries(double tolerance);
@@ -169,7 +169,7 @@ public:
// third type of routines
std::vector<Base::Vector3d> getOpenVertices() const;
protected:
private:
Sketcher::SketchObject* sketch;
struct VertexIds;
@@ -184,9 +184,10 @@ protected:
std::vector<ConstraintIds> lineequalityConstraints;
std::vector<ConstraintIds> radiusequalityConstraints;
protected:
private:
bool checkHorizontal(Base::Vector3d dir, double angleprecision);
bool checkVertical(Base::Vector3d dir, double angleprecision);
std::set<int> getDegeneratedGeometries(double tolerance) const;
};
} // namespace Sketcher

View File

@@ -64,6 +64,23 @@ class TestSketchValidateCoincidents(unittest.TestCase):
del geo0, geo1, geo2, geo3
del sketch
def testDegenratedGeometryCase(self):
sketch = self.Doc.addObject("Sketcher::SketchObject", "Sketch")
v0 = Vector(-47.680691, 18.824165000000004, 0.0)
v1 = Vector(-47.680691, -27.346279, 0.0)
v2 = Vector(-47.680691, -27.34627900001, 0.0)
geo0 = sketch.addGeometry(Part.LineSegment(v0, v1))
geo1 = sketch.addGeometry(Part.LineSegment(v1, v2))
sketch.addConstraint(Sketcher.Constraint("Coincident", geo0, 2, geo1, 1))
self.Doc.recompute()
tol = 1.0e-8
self.assertEqual(sketch.ConstraintCount, 1)
self.assertEqual(sketch.detectDegeneratedGeometries(tol), 1)
self.assertEqual(sketch.removeDegeneratedGeometries(tol), 1)
self.assertEqual(sketch.detectDegeneratedGeometries(tol), 0)
self.assertEqual(sketch.ConstraintCount, 0)
def tearDown(self):
# closing doc
FreeCAD.closeDocument(self.Doc.Name)