Sketch: Add test case for degenerated geometry
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user