[GeometryCheck] add new settings options

This commit is contained in:
mwganson
2019-08-28 20:24:22 -05:00
committed by wmayer
parent 662eb5c092
commit dc86201bb0
2 changed files with 291 additions and 35 deletions

View File

@@ -30,6 +30,7 @@
# include <QTextStream>
# include <QThread>
# include <QTreeWidget>
# include <QPushButton>
# include <Python.h>
# include <Standard_Version.hxx>
# include <BRepCheck_Analyzer.hxx>
@@ -383,10 +384,13 @@ ResultEntry* ResultModel::nodeFromIndex(const QModelIndex &index) const
TaskCheckGeometryResults::TaskCheckGeometryResults(QWidget *parent) : QWidget(parent)
{
this->setWindowTitle(tr("Check Geometry"));
this->setWindowTitle(tr("Check Geometry Results"));
setupInterface();
setupFunctionMap();
goCheck();
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
if (group->GetBool("AutoRun", false))
goCheck();
}
TaskCheckGeometryResults::~TaskCheckGeometryResults()
@@ -397,6 +401,7 @@ TaskCheckGeometryResults::~TaskCheckGeometryResults()
void TaskCheckGeometryResults::setupInterface()
{
message = new QLabel(this);
message->setText(tr("Click Run check button to run check"));
model = new ResultModel(this);
treeView = new QTreeView(this);
treeView->setModel(model);
@@ -488,7 +493,6 @@ void TaskCheckGeometryResults::goCheck()
aStream << checkedCount << " processed out of " << selectedCount << " selected\n";
aStream << invalidShapes << " invalid shapes.";
message->setText(aMessage);
Gui::Selection().clearSelection();
}
void TaskCheckGeometryResults::recursiveCheck(const BRepCheck_Analyzer &shapeCheck, const TopoDS_Shape &shape,
@@ -587,7 +591,21 @@ QString TaskCheckGeometryResults::getShapeContentString()
int TaskCheckGeometryResults::goBOPSingleCheck(const TopoDS_Shape& shapeIn, ResultEntry *theRoot, const QString &baseName,
const Handle(Message_ProgressIndicator)& theProgress)
{
//ArgumentAnalyser was moved at version 6.6. no back port for now.
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
bool runSingleThreaded = group->GetBool("RunBOPCheckSingleThreaded", false);
bool logErrors = group->GetBool("LogErrors", true);
bool argumentTypeMode = group->GetBool("ArgumentTypeMode", true);
bool selfInterMode = group->GetBool("SelfInterMode", true);
bool smallEdgeMode = group->GetBool("SmallEdgeMode", true);
bool rebuildFaceMode = group->GetBool("RebuildFaceMode", true);
bool continuityMode = group->GetBool("ContinuityMode", true);
bool tangentMode = group->GetBool("TangentMode", true);
bool mergeVertexMode = group->GetBool("MergeVertexMode", true);
bool mergeEdgeMode = group->GetBool("MergeEdgeMode", true);
bool curveOnSurfaceMode = group->GetBool("CurveOnSurfaceMode", true);
//ArgumentAnalyser was moved at version 6.6. no back port for now.
#if OCC_VERSION_HEX >= 0x060600
//Reference use: src/BOPTest/BOPTest_CheckCommands.cxx
@@ -609,20 +627,20 @@ int TaskCheckGeometryResults::goBOPSingleCheck(const TopoDS_Shape& shapeIn, Resu
// BOPCheck.StopOnFirstFaulty() = true; //this doesn't run any faster but gives us less results.
BOPCheck.SetShape1(BOPCopy);
//all settings are false by default. so only turn on what we want.
BOPCheck.ArgumentTypeMode() = true;
BOPCheck.SelfInterMode() = true;
BOPCheck.SmallEdgeMode() = true;
BOPCheck.RebuildFaceMode() = true;
BOPCheck.ArgumentTypeMode() = argumentTypeMode;
BOPCheck.SelfInterMode() = selfInterMode;
BOPCheck.SmallEdgeMode() = smallEdgeMode;
BOPCheck.RebuildFaceMode() = rebuildFaceMode;
#if OCC_VERSION_HEX >= 0x060700
BOPCheck.ContinuityMode() = true;
BOPCheck.ContinuityMode() = continuityMode;
#endif
#if OCC_VERSION_HEX >= 0x060900
BOPCheck.SetParallelMode(true); //this doesn't help for speed right now(occt 6.9.1).
BOPCheck.SetRunParallel(true); //performance boost, use all available cores
BOPCheck.TangentMode() = true; //these 4 new tests add about 5% processing time.
BOPCheck.MergeVertexMode() = true;
BOPCheck.CurveOnSurfaceMode() = true;
BOPCheck.MergeEdgeMode() = true;
BOPCheck.SetParallelMode(!runSingleThreaded); //this doesn't help for speed right now(occt 6.9.1).
BOPCheck.SetRunParallel(!runSingleThreaded); //performance boost, use all available cores
BOPCheck.TangentMode() = tangentMode; //these 4 new tests add about 5% processing time.
BOPCheck.MergeVertexMode() = mergeVertexMode;
BOPCheck.MergeEdgeMode() = mergeEdgeMode;
BOPCheck.CurveOnSurfaceMode() = curveOnSurfaceMode;
#endif
#ifdef FC_DEBUG
@@ -691,11 +709,13 @@ BOPCheck.Perform();
entry->children.push_back(faultyEntry);
/*log BOPCheck errors to report view*/
std::cerr << faultyEntry->parent->name.toStdString().c_str() << " : "
<< faultyEntry->name.toStdString().c_str() << " : "
<< faultyEntry->type.toStdString().c_str() << " : "
<< faultyEntry->error.toStdString().c_str()
<< std::endl;
if (logErrors){
std::cerr << faultyEntry->parent->name.toStdString().c_str() << " : "
<< faultyEntry->name.toStdString().c_str() << " : "
<< faultyEntry->type.toStdString().c_str() << " : "
<< faultyEntry->error.toStdString().c_str()
<< std::endl;
}
}
}
return 1;
@@ -717,13 +737,18 @@ void TaskCheckGeometryResults::dispatchError(ResultEntry *entry, const BRepCheck
}
}
goSetupResultBoundingBox(entry);
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
bool logErrors = group->GetBool("LogErrors", true); //log errors to report view
/*log BRepCheck errors to report view*/
std::cerr << entry->parent->name.toStdString().c_str() << " : "
<< entry->name.toStdString().c_str() << " : "
<< entry->type.toStdString().c_str() << " : "
<< entry->error.toStdString().c_str() << " (BRepCheck)"
<< std::endl;
if (logErrors){
std::cerr << entry->parent->name.toStdString().c_str() << " : "
<< entry->name.toStdString().c_str() << " : "
<< entry->type.toStdString().c_str() << " : "
<< entry->error.toStdString().c_str() << " (BRepCheck)"
<< std::endl;
}
}
void TaskCheckGeometryResults::setupFunctionMap()
@@ -939,7 +964,6 @@ TaskCheckGeometryDialog::TaskCheckGeometryDialog() : widget(0), contentLabel(0)
taskbox->groupLayout()->addWidget(widget);
Content.push_back(taskbox);
contentLabel = new QTextEdit();
contentLabel->setText(widget->getShapeContentString());
shapeContentBox = new Gui::TaskView::TaskBox(Gui::BitmapFactory().pixmap("Part_CheckGeometry"),
@@ -951,21 +975,150 @@ TaskCheckGeometryDialog::TaskCheckGeometryDialog() : widget(0), contentLabel(0)
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
runBOPCheckBox = new QCheckBox();
runBOPCheckBox->setText(tr("Run BOP check"));
runBOPCheckBox->setToolTip(tr("Extra boolean operations check that can sometimes \
find errors that the regular geometry check misses,\n but which said errors do not always \
mean the checked object is unusable."));
runBOPCheckBox->setChecked(group->GetBool("RunBOPCheck"));
settingsBox = new Gui::TaskView::TaskBox(Gui::BitmapFactory().pixmap("Part_CheckGeometry"),
tr("Settings"), true, 0);
settingsBox->groupLayout()->addWidget(runBOPCheckBox);
settingsBox->hideGroupBox();
Content.push_back(settingsBox);
autoRunCheckBox = new QCheckBox();
autoRunCheckBox->setText(tr("Automatically run check"));
autoRunCheckBox->setToolTip(tr("\
Automatically run the geometry check when opening this task. \n\
If unchecked, you must click Run check button to run the check. If checked \n\
you must wait for the check to finish before this dialog appears. \n\
Default: false"));
autoRunCheckBox->setChecked(group->GetBool("AutoRun", false));
connect(autoRunCheckBox, SIGNAL(toggled(bool)),
this, SLOT(on_autoRunCheckBox_toggled(bool)));
settingsBox->groupLayout()->addWidget(autoRunCheckBox);
runBOPCheckBox = new QCheckBox();
runBOPCheckBox->setText(tr("Run BOP check"));
runBOPCheckBox->setToolTip(tr("\
Extra boolean operations check that can sometimes find errors that\n\
the standard BRep geometry check misses. These errors do not always \n\
mean the checked object is unusable. Default: false"));
runBOPCheckBox->setChecked(group->GetBool("RunBOPCheck", false));
connect(runBOPCheckBox, SIGNAL(toggled(bool)),
this, SLOT(on_runBOPCheckBox_toggled(bool)));
settingsBox->groupLayout()->addWidget(runBOPCheckBox);
runSingleThreadedCheckBox = new QCheckBox();
runSingleThreadedCheckBox->setText(tr("Single-threaded"));
runSingleThreadedCheckBox->setToolTip(tr("\
Run the geometry check in a single thread. This is slower,\n\
but more stable. Default: false"));
runSingleThreadedCheckBox->setChecked(group->GetBool("RunSingleThreaded", false));
connect(runSingleThreadedCheckBox, SIGNAL(toggled(bool)),
this, SLOT(on_runSingleThreadedCheckBox_toggled(bool)));
settingsBox->groupLayout()->addWidget(runSingleThreadedCheckBox);
logErrorsCheckBox = new QCheckBox();
logErrorsCheckBox->setText(tr("Log errors"));
logErrorsCheckBox->setToolTip(tr("Log errors to report view. Default: true"));
logErrorsCheckBox->setChecked(group->GetBool("LogErrors", true));
connect(logErrorsCheckBox, SIGNAL(toggled(bool)),
this, SLOT(on_logErrorsCheckBox_toggled(bool)));
settingsBox->groupLayout()->addWidget(logErrorsCheckBox);
settingsBox->groupLayout()->addWidget(new QLabel(tr("\nIndividual BOP Checks:")));
argumentTypeModeCheckBox = new QCheckBox();
argumentTypeModeCheckBox->setText(tr(" BOPAlgo BadType"));
argumentTypeModeCheckBox->setToolTip(tr("Check for bad argument types. (ArgumentTypeMode check) Default: true"));
argumentTypeModeCheckBox->setChecked(group->GetBool("ArgumentTypeMode", true));
connect(argumentTypeModeCheckBox, SIGNAL(toggled(bool)),
this, SLOT(on_argumentTypeModeCheckBox_toggled(bool)));
settingsBox->groupLayout()->addWidget(argumentTypeModeCheckBox);
selfInterModeCheckBox = new QCheckBox();
selfInterModeCheckBox->setText(tr(" BOPAlgo SelfIntersect"));
selfInterModeCheckBox->setToolTip(tr("Check for self-intersections. (SelfInterMode check) Default: true"));
selfInterModeCheckBox->setChecked(group->GetBool("SelfInterMode", true));
connect(selfInterModeCheckBox, SIGNAL(toggled(bool)),
this, SLOT(on_selfInterModeCheckBox_toggled(bool)));
settingsBox->groupLayout()->addWidget(selfInterModeCheckBox);
smallEdgeModeCheckBox = new QCheckBox();
smallEdgeModeCheckBox->setText(tr(" BOPAlgo TooSmallEdge"));
smallEdgeModeCheckBox->setToolTip(tr("Check for edges that are too small (SmallEdgeMode check). Default: true"));
smallEdgeModeCheckBox->setChecked(group->GetBool("SmallEdgeMode", true));
connect(smallEdgeModeCheckBox, SIGNAL(toggled(bool)),
this, SLOT(on_smallEdgeModeCheckBox_toggled(bool)));
settingsBox->groupLayout()->addWidget(smallEdgeModeCheckBox);
rebuildFaceModeCheckBox = new QCheckBox();
rebuildFaceModeCheckBox->setText(tr(" BOPAlgo NonRecoverableFace"));
rebuildFaceModeCheckBox->setToolTip(tr("Check for non-recoverable faces (RebuildFaceMode check). Default: true"));
rebuildFaceModeCheckBox->setChecked(group->GetBool("RebuildFaceMode", true));
connect(rebuildFaceModeCheckBox, SIGNAL(toggled(bool)),
this, SLOT(on_rebuildFaceModeCheckBox_toggled(bool)));
settingsBox->groupLayout()->addWidget(rebuildFaceModeCheckBox);
continuityModeCheckBox = new QCheckBox();
continuityModeCheckBox->setText(tr(" BOPAlgo GeomAbs_C0"));
continuityModeCheckBox->setToolTip(tr("Check for continuity errors (ContinuityMode check). Default: true"));
continuityModeCheckBox->setChecked(group->GetBool("ContinuityMode", true));
connect(continuityModeCheckBox, SIGNAL(toggled(bool)),
this, SLOT(on_continuityModeCheckBox_toggled(bool)));
settingsBox->groupLayout()->addWidget(continuityModeCheckBox);
tangentModeCheckBox = new QCheckBox();
tangentModeCheckBox->setText(tr(" BOPAlgo IncompatibilityOfFace"));
tangentModeCheckBox->setToolTip(tr("Check for incompatible faces (TangentMode check). Default: true"));
tangentModeCheckBox->setChecked(group->GetBool("TangentMode", true));
connect(tangentModeCheckBox, SIGNAL(toggled(bool)),
this, SLOT(on_tangentModeCheckBox_toggled(bool)));
settingsBox->groupLayout()->addWidget(tangentModeCheckBox);
mergeVertexModeCheckBox = new QCheckBox();
mergeVertexModeCheckBox->setText(tr(" BOPAlgo IncompatibilityOfVertex"));
mergeVertexModeCheckBox->setToolTip(tr("Check for incompatible vertices (MergeVertexMode check). Default: true"));
mergeVertexModeCheckBox->setChecked(group->GetBool("MergeVertexMode", true));
connect(mergeVertexModeCheckBox, SIGNAL(toggled(bool)),
this, SLOT(on_mergeVertexModeCheckBox_toggled(bool)));
settingsBox->groupLayout()->addWidget(mergeVertexModeCheckBox);
mergeEdgeModeCheckBox = new QCheckBox();
mergeEdgeModeCheckBox->setText(tr(" BOPAlgo IncompatibilityOfEdge"));
mergeEdgeModeCheckBox->setToolTip(tr("Check for incompatible edges (MergeEdgeMode check). Default: true"));
mergeEdgeModeCheckBox->setChecked(group->GetBool("MergeEdgeMode", true));
connect(mergeEdgeModeCheckBox, SIGNAL(toggled(bool)),
this, SLOT(on_mergeEdgeModeCheckBox_toggled(bool)));
settingsBox->groupLayout()->addWidget(mergeEdgeModeCheckBox);
curveOnSurfaceModeCheckBox = new QCheckBox();
curveOnSurfaceModeCheckBox->setText(tr(" BOPAlgo InvalidCurveOnSurface"));
curveOnSurfaceModeCheckBox->setToolTip(tr("Check for invalid curves on surfaces (InvalidCurveOnSurfaceMode check). Default: true"));
curveOnSurfaceModeCheckBox->setChecked(group->GetBool("CurveOnSurfaceMode", true));
connect(curveOnSurfaceModeCheckBox, SIGNAL(toggled(bool)),
this, SLOT(on_curveOnSurfaceModeCheckBox_toggled(bool)));
settingsBox->groupLayout()->addWidget(curveOnSurfaceModeCheckBox);
}
bool TaskCheckGeometryDialog::accept()
{
widget->goCheck();
contentLabel->setText(widget->getShapeContentString());
return false;
}
bool TaskCheckGeometryDialog::reject()
{
return true;
}
void TaskCheckGeometryDialog::modifyStandardButtons(QDialogButtonBox* box)
{
QPushButton* btn = box->button(QDialogButtonBox::Ok);
btn->setText(tr("Run check"));
}
void TaskCheckGeometryDialog::on_autoRunCheckBox_toggled(bool isOn)
{
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
group->SetBool("AutoRun", isOn);
}
void TaskCheckGeometryDialog::on_runBOPCheckBox_toggled(bool isOn)
@@ -973,7 +1126,83 @@ void TaskCheckGeometryDialog::on_runBOPCheckBox_toggled(bool isOn)
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
group->SetBool("RunBOPCheck", isOn);
}
void TaskCheckGeometryDialog::on_runSingleThreadedCheckBox_toggled(bool isOn)
{
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
group->SetBool("RunSingleThreaded", isOn);
}
void TaskCheckGeometryDialog::on_logErrorsCheckBox_toggled(bool isOn)
{
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
group->SetBool("LogErrors", isOn);
}
void TaskCheckGeometryDialog::on_argumentTypeModeCheckBox_toggled(bool isOn)
{
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
group->SetBool("ArgumentTypeMode", isOn);
}
void TaskCheckGeometryDialog::on_selfInterModeCheckBox_toggled(bool isOn)
{
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
group->SetBool("SelfInterMode", isOn);
}
void TaskCheckGeometryDialog::on_smallEdgeModeCheckBox_toggled(bool isOn)
{
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
group->SetBool("SmallEdgeMode", isOn);
}
void TaskCheckGeometryDialog::on_rebuildFaceModeCheckBox_toggled(bool isOn)
{
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
group->SetBool("RebuildFaceMode", isOn);
}
void TaskCheckGeometryDialog::on_continuityModeCheckBox_toggled(bool isOn)
{
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
group->SetBool("ContinuityMode", isOn);
}
void TaskCheckGeometryDialog::on_tangentModeCheckBox_toggled(bool isOn)
{
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
group->SetBool("TangentMode", isOn);
}
void TaskCheckGeometryDialog::on_mergeVertexModeCheckBox_toggled(bool isOn)
{
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
group->SetBool("MergeVertexMode", isOn);
}
void TaskCheckGeometryDialog::on_mergeEdgeModeCheckBox_toggled(bool isOn)
{
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
group->SetBool("MergeEdgeMode", isOn);
}
void TaskCheckGeometryDialog::on_curveOnSurfaceModeCheckBox_toggled(bool isOn)
{
ParameterGrp::handle group = App::GetApplication().GetUserParameter().
GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod")->GetGroup("Part")->GetGroup("CheckGeometry");
group->SetBool("CurveOnSurfaceMode", isOn);
}
TaskCheckGeometryDialog::~TaskCheckGeometryDialog()

View File

@@ -102,6 +102,7 @@ public:
TaskCheckGeometryResults(QWidget *parent = 0);
~TaskCheckGeometryResults();
QString getShapeContentString();
void goCheck();
private Q_SLOTS:
void currentRowChanged (const QModelIndex &current, const QModelIndex &previous);
@@ -109,7 +110,6 @@ private Q_SLOTS:
private:
void setupInterface();
void goCheck();
void recursiveCheck(const BRepCheck_Analyzer &shapeCheck, const TopoDS_Shape &shape,
ResultEntry *parent);
void checkSub(const BRepCheck_Analyzer &shapeCheck, const TopoDS_Shape &shape,
@@ -138,13 +138,25 @@ public:
~TaskCheckGeometryDialog();
virtual QDialogButtonBox::StandardButtons getStandardButtons() const
{return QDialogButtonBox::Close;}
{return QDialogButtonBox::Ok | QDialogButtonBox::Close;}
virtual bool isAllowedAlterDocument(void) const
{return false;}
virtual bool needsFullSpace() const {return true;}
private Q_SLOTS:
void on_runBOPCheckBox_toggled(bool isOn);
void on_runSingleThreadedCheckBox_toggled(bool isOn);
void on_logErrorsCheckBox_toggled(bool isOn);
void on_autoRunCheckBox_toggled(bool isOn);
void on_argumentTypeModeCheckBox_toggled(bool isOn);
void on_selfInterModeCheckBox_toggled(bool isOn);
void on_smallEdgeModeCheckBox_toggled(bool isOn);
void on_rebuildFaceModeCheckBox_toggled(bool isOn);
void on_continuityModeCheckBox_toggled(bool isOn);
void on_tangentModeCheckBox_toggled(bool isOn);
void on_mergeVertexModeCheckBox_toggled(bool isOn);
void on_mergeEdgeModeCheckBox_toggled(bool isOn);
void on_curveOnSurfaceModeCheckBox_toggled(bool isOn);
private:
TaskCheckGeometryResults* widget;
@@ -152,7 +164,22 @@ private:
Gui::TaskView::TaskBox* shapeContentBox;
Gui::TaskView::TaskBox* settingsBox;
QTextEdit *contentLabel;
QCheckBox *autoRunCheckBox;
QCheckBox *runBOPCheckBox;
QCheckBox *runSingleThreadedCheckBox;
QCheckBox *logErrorsCheckBox;
QCheckBox *argumentTypeModeCheckBox;
QCheckBox *selfInterModeCheckBox;
QCheckBox *smallEdgeModeCheckBox;
QCheckBox *rebuildFaceModeCheckBox;
QCheckBox *continuityModeCheckBox;
QCheckBox *tangentModeCheckBox;
QCheckBox *mergeVertexModeCheckBox;
QCheckBox *mergeEdgeModeCheckBox;
QCheckBox *curveOnSurfaceModeCheckBox;
bool accept();
bool reject();
virtual void modifyStandardButtons(QDialogButtonBox*);
};
class BOPProgressIndicator : public Message_ProgressIndicator