X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FBooleanGUI%2FBooleanGUI_Dialog.cxx;h=4a007557df4c1fcbbaa94380a66e8bb3596ff643;hb=bbafce4b04731f9219f75dc124ec2429d994c202;hp=94143574ec3a98d03c0bc90892dc68faab32d458;hpb=8180539548a5038e52445454e88c1a170ee64e56;p=modules%2Fgeom.git diff --git a/src/BooleanGUI/BooleanGUI_Dialog.cxx b/src/BooleanGUI/BooleanGUI_Dialog.cxx index 94143574e..4a007557d 100644 --- a/src/BooleanGUI/BooleanGUI_Dialog.cxx +++ b/src/BooleanGUI/BooleanGUI_Dialog.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2024 CEA, EDF, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -6,7 +6,7 @@ // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -35,11 +35,15 @@ #include #include #include +#include // VSR 22/08/2012: issue 0021787: remove "Preview" button from BOP and Partition operations // Comment next line to enable preview in BOP dialog box #define NO_PREVIEW +#define DEFAULT_FUZZY_VALUE 1e-5 + + //================================================================================= // class : BooleanGUI_Dialog() // purpose : Constructs a BooleanGUI_Dialog which is a child of 'parent', with the @@ -77,7 +81,7 @@ BooleanGUI_Dialog::BooleanGUI_Dialog (const int theOperation, GeometryGUI* theGe image0 = QPixmap(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_SECTION"))); aTitle = tr("GEOM_SECTION"); aCaption = tr("GEOM_SECTION_TITLE"); - setHelpFileName("section_opeartion_page.html"); + setHelpFileName("section_operation_page.html"); break; } QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); @@ -92,22 +96,57 @@ BooleanGUI_Dialog::BooleanGUI_Dialog (const int theOperation, GeometryGUI* theGe mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); mainFrame()->RadioButton3->close(); - myGroup = new DlgRef_2Sel(centralWidget()); + myGroup = new DlgRef_2Sel2Spin3Check(centralWidget()); myGroup->GroupBox1->setTitle(tr("GEOM_ARGUMENTS")); - if (myOperation != BooleanGUI::CUT) { + if (myOperation == BooleanGUI::CUT) { + myGroup->TextLabel1->setText(tr("GEOM_MAIN_OBJECT")); + myGroup->TextLabel2->setText(tr("GEOM_TOOL_OBJECTS")); + } + else if (myOperation == BooleanGUI::SECTION) { myGroup->TextLabel1->setText(tr("GEOM_OBJECT_I").arg(1)); myGroup->TextLabel2->setText(tr("GEOM_OBJECT_I").arg(2)); - } - else { - myGroup->TextLabel1->setText(tr("GEOM_MAIN_OBJECT")); - myGroup->TextLabel2->setText(tr("GEOM_TOOL_OBJECT")); + } else { // Fuse or Common + myGroup->TextLabel1->setText(tr( "GEOM_SELECTED_OBJECTS" )); + myGroup->TextLabel2->hide(); + myGroup->PushButton2->hide(); + myGroup->LineEdit2->hide(); + + if (myOperation == BooleanGUI::FUSE) { + myGroup->CheckBox2->setText(tr("GEOM_BOOL_REMOVE_EXTRA_EDGES")); + } } myGroup->PushButton1->setIcon(image1); - myGroup->PushButton2->setIcon(image1); myGroup->LineEdit1->setReadOnly(true); - myGroup->LineEdit2->setReadOnly(true); + + if (myOperation != BooleanGUI::FUSE) { + myGroup->CheckBox2->hide(); + + if (myOperation != BooleanGUI::COMMON) { + myGroup->PushButton2->setIcon(image1); + myGroup->LineEdit2->setReadOnly(true); + } + } + + myGroup->TextLabel3->hide(); + myGroup->TextLabel4->hide(); + myGroup->SpinBox_DX->hide(); + myGroup->SpinBox_DY->hide(); + myGroup->CheckBox1->setText(tr("GEOM_CHECK_SELF_INTERSECTIONS")); + + // Add all "fuzzy parameter" related widgets + myGroup->CheckBox3->setText(tr("GEOM_USE_FUZZY_PARAMETER")); + + myFuzzyLbl = new QLabel(myGroup->GroupBox1); + myFuzzyLbl->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + myFuzzyLbl->setText(tr("GEOM_FUZZY_PARAMETER")); + myGroup->gridLayout1->addWidget(myFuzzyLbl, 7, 0, 1, 2); + + myFuzzyEdt = new SalomeApp_DoubleSpinBox(myGroup->GroupBox1); + initSpinBox( myFuzzyEdt, 1.e-7, 10.0, DEFAULT_FUZZY_VALUE, "length_tol_precision" ); + myFuzzyEdt->setValue(DEFAULT_FUZZY_VALUE); + myGroup->gridLayout1->addWidget(myFuzzyEdt, 7, 2); QVBoxLayout* layout = new QVBoxLayout(centralWidget()); layout->setMargin(0); layout->setSpacing(6); @@ -143,18 +182,36 @@ void BooleanGUI_Dialog::Init() myGroup->LineEdit1->setText(""); myGroup->LineEdit2->setText(""); + myGroup->CheckBox1->setChecked(true); + + if (myOperation == BooleanGUI::FUSE) { + myGroup->CheckBox2->setChecked(true); + } + + // Do not use Fuzzy parameter by default + myGroup->CheckBox3->setChecked(false); + myFuzzyLbl->setEnabled(false); + myFuzzyEdt->setEnabled(false); + myObject1.nullify(); - myObject2.nullify(); + reset(); // signals and slots connections connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); connect(myGroup->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); - connect(myGroup->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + + if (!myGroup->PushButton2->isHidden()) { + connect(myGroup->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + } + + if (!myGroup->CheckBox3->isHidden()) { + connect(myGroup->CheckBox3, SIGNAL(stateChanged(int)), this, SLOT(UseFuzzyChanged(int))); + } connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), - SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); + SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()), Qt::UniqueConnection); initName(mainFrame()->GroupConstructors->title()); @@ -165,9 +222,9 @@ void BooleanGUI_Dialog::Init() mainFrame()->RadioButton1->setFocus(); globalSelection(GEOM_ALLSHAPES); - + //localSelection(TopAbs_SHAPE); // VSR 24/09/2015: deactivate local selection in BOP (CoTech decision) + myGroup->PushButton1->click(); - SelectionIntoArgument(); resize(100,100); } @@ -198,10 +255,19 @@ bool BooleanGUI_Dialog::ClickOnApply() } //================================================================================= -// function : SelectionIntoArgument() -// purpose : Called when selection is changed or on dialog initialization or activation +// function : reset() +// purpose : //================================================================================= -void BooleanGUI_Dialog::SelectionIntoArgument() +void BooleanGUI_Dialog::reset() +{ + myObjects.clear(); +} + +//================================================================================= +// function : singleSelection +// purpose : Performs single selection. Called from SelectionIntoArgument() +//================================================================================= +void BooleanGUI_Dialog::singleSelection() { myEditCurrentArgument->setText(""); @@ -215,26 +281,78 @@ void BooleanGUI_Dialog::SelectionIntoArgument() disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0); myGeomGUI->getApp()->selectionMgr()->clearSelected(); connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()), - this, SLOT(SelectionIntoArgument())); + this, SLOT(SelectionIntoArgument()), Qt::UniqueConnection); if (myEditCurrentArgument == myGroup->LineEdit1) { myObject1 = aSelectedObject; - if (!myObject2) + if (!myGroup->PushButton2->isHidden() && !myObjects.count()) myGroup->PushButton2->click(); } else if (myEditCurrentArgument == myGroup->LineEdit2) { - myObject2 = aSelectedObject; + myObjects.clear(); + myObjects << aSelectedObject; if (!myObject1) myGroup->PushButton1->click(); } } else { if (myEditCurrentArgument == myGroup->LineEdit1) myObject1.nullify(); - else if (myEditCurrentArgument == myGroup->LineEdit2) myObject2.nullify(); + else if (myEditCurrentArgument == myGroup->LineEdit2) reset(); + } +} + +//================================================================================= +// function : multipleSelection +// purpose : Performs multiple selection. Called from SelectionIntoArgument() +//================================================================================= +void BooleanGUI_Dialog::multipleSelection() +{ + myEditCurrentArgument->setText( "" ); + reset(); + + myObjects = getSelected( TopAbs_SHAPE, -1 ); + + int i = myObjects.count(); + if ( i == 1 ) { + myEditCurrentArgument->setText( GEOMBase::GetName( myObjects.first().get() ) ); + } else if ( i > 0 ) { + myEditCurrentArgument->setText( QString::number( i ) + "_" + tr( "GEOM_OBJECTS" ) ); + } +} + +//================================================================================= +// function : SelectionIntoArgument() +// purpose : Called when selection is changed or on dialog initialization or activation +//================================================================================= +void BooleanGUI_Dialog::SelectionIntoArgument() +{ + myEditCurrentArgument->setText(""); + if ( myOperation == BooleanGUI::SECTION || + (myOperation == BooleanGUI::CUT && + myEditCurrentArgument == myGroup->LineEdit1)) { + singleSelection(); + } else { + multipleSelection(); } + processPreview(); } +//================================================================================= +// function : UseFuzzyChanged() +// purpose : This slot is called whenever the status of CheckButton3 has changed +//================================================================================= +void BooleanGUI_Dialog::UseFuzzyChanged(int state) +{ + QCheckBox* send = (QCheckBox*)sender(); + + if (send == myGroup->CheckBox3) { + bool isChecked = (state != Qt::Unchecked); + myFuzzyLbl->setEnabled(isChecked); + myFuzzyEdt->setEnabled(isChecked); + } +} + //================================================================================= // function : SetEditCurrentArgument() // purpose : @@ -246,8 +364,10 @@ void BooleanGUI_Dialog::SetEditCurrentArgument() if (send == myGroup->PushButton1) { myEditCurrentArgument = myGroup->LineEdit1; - myGroup->PushButton2->setDown(false); - myGroup->LineEdit2->setEnabled(false); + if (!myGroup->PushButton2->isHidden()) { + myGroup->PushButton2->setDown(false); + myGroup->LineEdit2->setEnabled(false); + } } else if (send == myGroup->PushButton2) { myEditCurrentArgument = myGroup->LineEdit2; @@ -256,11 +376,16 @@ void BooleanGUI_Dialog::SetEditCurrentArgument() myGroup->LineEdit1->setEnabled(false); } + globalSelection(GEOM_ALLSHAPES); + //localSelection(TopAbs_SHAPE); // VSR 24/09/2015: deactivate local selection in BOP (CoTech decision) + // enable line edit myEditCurrentArgument->setEnabled(true); myEditCurrentArgument->setFocus(); // after setFocus(), because it will be setDown(false) when loses focus send->setDown(true); + + SelectionIntoArgument(); } //================================================================================= @@ -272,7 +397,7 @@ void BooleanGUI_Dialog::ActivateThisDialog() GEOMBase_Skeleton::ActivateThisDialog(); connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), - this, SLOT( SelectionIntoArgument() ) ); + this, SLOT( SelectionIntoArgument() ), Qt::UniqueConnection ); processPreview(); } @@ -292,7 +417,7 @@ void BooleanGUI_Dialog::enterEvent (QEvent*) //================================================================================= GEOM::GEOM_IOperations_ptr BooleanGUI_Dialog::createOperation() { - return getGeomEngine()->GetIBooleanOperations(getStudyId()); + return getGeomEngine()->GetIBooleanOperations(); } //================================================================================= @@ -301,7 +426,24 @@ GEOM::GEOM_IOperations_ptr BooleanGUI_Dialog::createOperation() //================================================================================= bool BooleanGUI_Dialog::isValid (QString&) { - return myObject1 && myObject2; + bool isOK = false; + + switch (myOperation) { + case BooleanGUI::FUSE: + case BooleanGUI::COMMON: + isOK = myObjects.count() > 1; + break; + case BooleanGUI::CUT: + isOK = myObject1 && myObjects.count(); + break; + case BooleanGUI::SECTION: + isOK = myObject1 && (myObjects.count() == 1); + break; + default: + break; + } + + return isOK; } //================================================================================= @@ -313,7 +455,35 @@ bool BooleanGUI_Dialog::execute (ObjectList& objects) GEOM::GEOM_Object_var anObj; GEOM::GEOM_IBooleanOperations_var anOper = GEOM::GEOM_IBooleanOperations::_narrow(getOperation()); - anObj = anOper->MakeBoolean(myObject1.get(), myObject2.get(), myOperation); + const bool isCheckSelfInte = myGroup->CheckBox1->isChecked(); + const bool useFuzzyParam = myGroup->CheckBox3->isChecked(); + const double fuzzyValue = (useFuzzyParam ? myFuzzyEdt->value() : -1); + + GEOM::ListOfGO_var anObjects = new GEOM::ListOfGO(); + anObjects->length( myObjects.count() ); + for ( int i = 0; i < myObjects.count(); i++ ) + anObjects[i] = myObjects[i].copy(); + + switch (myOperation) { + case BooleanGUI::FUSE: + { + const bool isRmExtraEdges = myGroup->CheckBox2->isChecked(); + anObj = anOper->MakeFuseListWithFuzzy(anObjects, isCheckSelfInte, isRmExtraEdges, fuzzyValue); + } + break; + case BooleanGUI::COMMON: + anObj = anOper->MakeCommonListWithFuzzy(anObjects, isCheckSelfInte, fuzzyValue); + break; + case BooleanGUI::CUT: + anObj = anOper->MakeCutListWithFuzzy(myObject1.get(), anObjects, isCheckSelfInte, fuzzyValue); + break; + case BooleanGUI::SECTION: + anObj = anOper->MakeBooleanWithFuzzy(myObject1.get(), anObjects[0], myOperation, isCheckSelfInte, fuzzyValue); + break; + default: + break; + } + if (!anObj->_is_nil()) objects.push_back(anObj._retn()); @@ -324,14 +494,35 @@ bool BooleanGUI_Dialog::execute (ObjectList& objects) // function : restoreSubShapes // purpose : //================================================================================= -void BooleanGUI_Dialog::restoreSubShapes (SALOMEDS::Study_ptr theStudy, - SALOMEDS::SObject_ptr theSObject) +void BooleanGUI_Dialog::restoreSubShapes (SALOMEDS::SObject_ptr theSObject) { if (mainFrame()->CheckBoxRestoreSS->isChecked()) { // empty list of arguments means that all arguments should be restored - getGeomEngine()->RestoreSubShapesSO(theStudy, theSObject, GEOM::ListOfGO(), + getGeomEngine()->RestoreSubShapesSO( theSObject, GEOM::ListOfGO(), /*theFindMethod=*/GEOM::FSM_GetInPlace, // ? GEOM::FSM_GetSame /*theInheritFirstArg=*/myOperation == BooleanGUI::CUT, mainFrame()->CheckBoxAddPrefix->isChecked()); // ? false } } + +//================================================================================= +// function : addSubshapesToStudy +// purpose : virtual method to add new SubObjects if local selection +//================================================================================= +void BooleanGUI_Dialog::addSubshapesToStudy() +{ + GEOMBase::PublishSubObject( myObject1.get() ); + for ( int i = 0; i < myObjects.count(); i++ ) + GEOMBase::PublishSubObject( myObjects[i].get() ); +} + +//================================================================================= +// function : getSourceObjects +// purpose : virtual method to get source objects +//================================================================================= +QList BooleanGUI_Dialog::getSourceObjects() +{ + QList res(myObjects); + res << myObject1; + return res; +}