Sketcher: [skip ci] add function to sketch validation panel to remove degenerated geometry

This commit is contained in:
wmayer
2020-08-13 17:24:10 +02:00
parent d8bc05b162
commit 2b34145e4c
5 changed files with 154 additions and 43 deletions

View File

@@ -822,3 +822,49 @@ std::vector<Base::Vector3d> SketchAnalysis::getOpenVertices(void) 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++) {
Part::Geometry* g = geom[i];
if (g->Construction)
continue;
if (g->getTypeId().isDerivedFrom(Part::GeomCurve::getClassTypeId())) {
Part::GeomCurve* curve = static_cast<Part::GeomCurve*>(g);
double len = curve->length(curve->getFirstParameter(), curve->getLastParameter());
if (len < tolerance)
countDegenerated++;
}
}
return countDegenerated;
}
int SketchAnalysis::removeDegeneratedGeometries(double tolerance)
{
std::set<int> delInternalGeometries;
const std::vector<Part::Geometry *>& geom = sketch->getInternalGeometry();
for (std::size_t i=0; i<geom.size(); i++) {
Part::Geometry* g = geom[i];
if (g->Construction)
continue;
if (g->getTypeId().isDerivedFrom(Part::GeomCurve::getClassTypeId())) {
Part::GeomCurve* curve = static_cast<Part::GeomCurve*>(g);
double len = curve->length(curve->getFirstParameter(), curve->getLastParameter());
if (len < tolerance)
delInternalGeometries.insert(static_cast<int>(i));
}
}
for (auto it = delInternalGeometries.rbegin(); it != delInternalGeometries.rend(); ++it) {
sketch->delGeometry(*it);
}
return static_cast<int>(delInternalGeometries.size());
}

View File

@@ -104,6 +104,11 @@ public:
/// Equality constraints simple routine Make step (see constructor)
void makeMissingEquality(bool onebyone = true);
/// Detect degenerated geometries
int detectDegeneratedGeometries(double tolerance);
/// Remove degenerated geometries
int removeDegeneratedGeometries(double tolerance);
// Complex routines (see constructor)
/// Fully automated multi-constraint autoconstraining

View File

@@ -234,7 +234,7 @@ void SketcherValidation::on_findReversed_clicked()
ui->swapReversed->setEnabled(false);
}
} else {
QMessageBox::warning(this, tr("Reversed external geometry"),
QMessageBox::information(this, tr("Reversed external geometry"),
tr("No reversed external-geometry arcs were found."));
}
}
@@ -350,6 +350,41 @@ void SketcherValidation::hidePoints()
}
}
void SketcherValidation::on_findDegenerated_clicked()
{
double prec = Precision::Confusion();
int count = sketchAnalyser.detectDegeneratedGeometries(prec);
if (count == 0) {
QMessageBox::information(this, tr("No degenerated geometry"),
tr("No degenerated geometry found"));
ui->fixDegenerated->setEnabled(false);
}
else {
QMessageBox::warning(this, tr("Degenerated geometry"),
tr("%1 degenerated geometry found").arg(count));
ui->fixDegenerated->setEnabled(true);
}
}
void SketcherValidation::on_fixDegenerated_clicked()
{
// undo command open
App::Document* doc = sketch->getDocument();
doc->openTransaction("Remove degenerated geometry");
double prec = Precision::Confusion();
sketchAnalyser.removeDegeneratedGeometries(prec);
ui->fixButton->setEnabled(false);
hidePoints();
// finish the transaction and update
Gui::WaitCursor wc;
doc->commitTransaction();
doc->recompute();
}
// -----------------------------------------------
TaskSketcherValidation::TaskSketcherValidation(Sketcher::SketchObject* Obj)

View File

@@ -58,6 +58,8 @@ private Q_SLOTS:
void on_orientLockEnable_clicked();
void on_orientLockDisable_clicked();
void on_delConstrExtr_clicked();
void on_findDegenerated_clicked();
void on_fixDegenerated_clicked();
private:
void showPoints(const std::vector<Base::Vector3d>&);

View File

@@ -14,36 +14,6 @@
<string>Sketcher validation</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<item row="2" column="0">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Invalid constraints</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="1">
<widget class="QPushButton" name="fixConstraint">
<property name="text">
<string>Fix</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QPushButton" name="findConstraint">
<property name="text">
<string>Find</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QPushButton" name="delConstrExtr">
<property name="text">
<string>Delete constraints to external geom.</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="0" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="title">
@@ -57,16 +27,19 @@
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="fixButton">
<property name="text">
<string>Fix</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBoxTolerance"/>
</item>
<item row="1" column="0" colspan="2">
<widget class="QCheckBox" name="checkBoxIgnoreConstruction">
<property name="text">
<string>Ignore construction geometry</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="findButton">
<property name="text">
@@ -74,6 +47,13 @@
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="fixButton">
<property name="text">
<string>Fix</string>
</property>
</widget>
</item>
<item row="3" column="0" colspan="2">
<widget class="QPushButton" name="highlightButton">
<property name="text">
@@ -81,13 +61,56 @@
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QCheckBox" name="checkBoxIgnoreConstruction">
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Invalid constraints</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QPushButton" name="findConstraint">
<property name="text">
<string>Ignore construction geometry</string>
<string>Find</string>
</property>
<property name="checked">
<bool>true</bool>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="fixConstraint">
<property name="text">
<string>Fix</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QPushButton" name="delConstrExtr">
<property name="text">
<string>Delete constraints to external geom.</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="2" column="0">
<widget class="QGroupBox" name="groupBox_6">
<property name="title">
<string>Degenerated geometry</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<item row="0" column="0">
<widget class="QPushButton" name="findDegenerated">
<property name="text">
<string>Find</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="fixDegenerated">
<property name="text">
<string>Fix</string>
</property>
</widget>
</item>