From 291495de5e1eca20b3f960cf5ac008c32f41888a Mon Sep 17 00:00:00 2001 From: skv Date: Mon, 13 Oct 2014 12:14:17 +0400 Subject: [PATCH] 0022750: [EDF] Improve ergonomics of the "Detect Self-intersections" dialog box --- doc/salome/gui/GEOM/images/measures11.png | Bin 20884 -> 33250 bytes .../GEOM/input/check_self_intersections.doc | 19 +- idl/GEOM_Gen.idl | 16 + src/GEOMGUI/GEOM_msg_en.ts | 83 ++- src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx | 2 + src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx | 15 + src/GEOM_I/GEOM_IMeasureOperations_i.cc | 28 +- src/GEOM_I/GEOM_IMeasureOperations_i.hh | 1 + src/GEOM_SWIG/geomBuilder.py | 22 +- .../MeasureGUI_CheckSelfIntersectionsDlg.cxx | 481 +++++++++++++++--- .../MeasureGUI_CheckSelfIntersectionsDlg.h | 46 +- 11 files changed, 606 insertions(+), 107 deletions(-) diff --git a/doc/salome/gui/GEOM/images/measures11.png b/doc/salome/gui/GEOM/images/measures11.png index 85af6f187502f209f551313aaf1f40888065dd65..fc1cea58214c525cefcd4af5306907b0ca3ad14b 100644 GIT binary patch literal 33250 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 literal 20884 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 diff --git a/doc/salome/gui/GEOM/input/check_self_intersections.doc b/doc/salome/gui/GEOM/input/check_self_intersections.doc index 86c556786..7446f3dd3 100644 --- a/doc/salome/gui/GEOM/input/check_self_intersections.doc +++ b/doc/salome/gui/GEOM/input/check_self_intersections.doc @@ -8,9 +8,16 @@ This operation checks the topology of the selected shape to detect self-intersec In this dialog: -- \b Object - the checked object. \b Selection button allows picking it in the viewer or in the object browser. -- \b Errors list contains the list of intersections. Select the intersection to show Incriminated Sub-shapes in the field to the right. - +- \b Object - the checked object. \b Selection button allows picking it in the viewer or in the object browser. +- Level of check - The combo box that allows to set the level of checking shape on self-interference. + It defines which interferferences will be checked. Default value is "All interferences". +- Compute self-intersections button computes self-interferences. +- \b Summary section contains the general report if the object has self-intersections and/or if errors are occured during computation. +- \b Self-intersections list contains the list of self-intersections detected. +Select the intersection to show Sub-shapes in the field to the right. +- \b Apply and Apply and Close buttons are used to store selected self-intersected shapes in the study for further analysis. +If no shapes are selected, but an intersection is selected the both of intersected shapes are stored. If no intersections selected +all shapes of all intersections are stored in the study. \note This tool is useful for detection of shapes, not suitable for arguments of Boolean operations and Partition algorithm. @@ -18,8 +25,10 @@ For more information about Partition and Boolean Operations Algorithms and their limitations refer to this document. \n Result: Boolean. -\n TUI Command: geompy.CheckSelfIntersections(theShape), -where \em theShape is the shape checked for validity. +\n TUI Command: geompy.CheckSelfIntersections(theShape, theCheckLevel = GEOM.SI_ALL), \n +where: \n +\em theShape is the shape checked for validity. \n +\em theCheckLevel is the level of check. Default value is GEOM.SI_ALL to check all interferences. See also a \ref tui_check_self_intersections_page "TUI example". diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 7253abf9f..7679626b7 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -187,6 +187,20 @@ module GEOM FDT_String }; + /** + * This enumeration represents the level of checking shape on + * self-interference. It defines which interferferences will be checked. + */ + enum si_check_level + { + SI_V_V, // only V/V interferences + SI_V_E, // V/V and V/E interferences + SI_E_E, // V/V, V/E and E/E interferences + SI_V_F, // V/V, V/E, E/E and V/F interferences + SI_E_F, // V/V, V/E, E/E, V/F and E/F interferences + SI_ALL // all interferences + }; + /*! * \brief Object creation parameters @@ -4080,10 +4094,12 @@ module GEOM /*! * \brief Check a topology of the given shape on self-intersections presence. * \param theShape Shape to check validity of. + * \param theCheckLevel the level of self-interference check. * \param theIntersections Output. List of intersected sub-shapes IDs, it contains pairs of IDs. * \return TRUE, if the shape does not have any self-intersections. */ boolean CheckSelfIntersections (in GEOM_Object theShape, + in long theCheckLevel, out ListOfLong theIntersections); /*! diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index a732e5004..5b5c8bb63 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -415,22 +415,6 @@ Please, select face, shell or solid and try again GEOM_CHECK_SELF_INTERSECTIONS Detect Self-intersections - - GEOM_CHECK_SELF_INTERSECTIONS_FAILED - Detection of self-intersections failed - - - GEOM_NO_SELF_INTERSECTIONS - There are no self-intersections in the shape - - - GEOM_SELF_INTERSECTIONS_FOUND - Some self-intersections detected - - - GEOM_CHECK_SELF_INTERSECTIONS_ERRORS - Warning: there were errors during the operation, so the list may be incomplete. - GEOM_CIRCLE Circle @@ -6967,4 +6951,71 @@ Do you want to create new material? V-Isoline + + MeasureGUI_CheckSelfIntersectionsDlg + + GEOM_CHECK_INTE_INTERSECTIONS + Self-intersections + + + GEOM_CHECK_INTE_SUBSHAPES + Sub-shapes + + + GEOM_CHECK_INTE_CHECK_LEVEL + Level of check + + + GEOM_CHECK_INTE_SUMMARY + Summary + + + GEOM_CHECK_INTE_COMPUTE + Compute self-intersections + + + GEOM_SELF_INTERSECTION_NAME + Self_intersection + + + GEOM_NO_SELF_INTERSECTIONS + There are no self-intersections in the shape + + + GEOM_SELF_INTERSECTIONS_FOUND + Some self-intersections detected + + + GEOM_CHECK_SELF_INTERSECTIONS_FAILED + Detection of self-intersections failed + + + GEOM_CHECK_SELF_INTERSECTIONS_ERRORS + Warning: there were errors during the operation, so the list may be incomplete. + + + GEOM_CHECK_INTE_V_V + Vertex to Vertex + + + GEOM_CHECK_INTE_V_E + Vertex to Edge + all above + + + GEOM_CHECK_INTE_E_E + Edge to Edge + all above + + + GEOM_CHECK_INTE_V_F + Vertex to Face + all above + + + GEOM_CHECK_INTE_E_F + Edge to Face + all above + + + GEOM_CHECK_INTE_ALL + All interferences + + diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx index 0764495dc..fb2320ea5 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx @@ -1501,6 +1501,7 @@ TCollection_AsciiString GEOMImpl_IMeasureOperations::PrintShapeErrors //============================================================================= bool GEOMImpl_IMeasureOperations::CheckSelfIntersections (Handle(GEOM_Object) theShape, + const SICheckLevel theCheckLevel, Handle(TColStd_HSequenceOfInteger)& theIntersections) { SetErrorCode(KO); @@ -1534,6 +1535,7 @@ bool GEOMImpl_IMeasureOperations::CheckSelfIntersections // BOPAlgo_CheckerSI aCSI; // checker of self-interferences aCSI.SetArguments(aLCS); + aCSI.SetLevelOfCheck(theCheckLevel); // 1. Launch the checker aCSI.Perform(); diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx index 86d0a9c7b..3b8ae3d42 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx @@ -85,6 +85,20 @@ class GEOMImpl_IMeasureOperations : public GEOM_IOperations { SK_ADVANCED, // all advanced shapes (temporary implementation) }; + /** + * This enumeration represents the level of checking shape on + * self-interference. It defines which interferferences will be checked. + */ + enum SICheckLevel + { + SI_V_V = 0, // only V/V interferences + SI_V_E, // V/V and V/E interferences + SI_E_E, // V/V, V/E and E/E interferences + SI_V_F, // V/V, V/E, E/E and V/F interferences + SI_E_F, // V/V, V/E, E/E, V/F and E/F interferences + SI_ALL // all interferences + }; + Standard_EXPORT ShapeKind KindOfShape (Handle(GEOM_Object) theShape, Handle(TColStd_HSequenceOfInteger)& theIntegers, Handle(TColStd_HSequenceOfReal)& theDoubles); @@ -141,6 +155,7 @@ class GEOMImpl_IMeasureOperations : public GEOM_IOperations { const std::list &theErrors); Standard_EXPORT bool CheckSelfIntersections (Handle(GEOM_Object) theShape, + const SICheckLevel theCheckLevel, Handle(TColStd_HSequenceOfInteger)& theIntersections); Standard_EXPORT TCollection_AsciiString IsGoodForSolid (Handle(GEOM_Object) theShape); diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.cc b/src/GEOM_I/GEOM_IMeasureOperations_i.cc index b6785bda9..0d4a89eff 100644 --- a/src/GEOM_I/GEOM_IMeasureOperations_i.cc +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.cc @@ -706,6 +706,7 @@ char* GEOM_IMeasureOperations_i::PrintShapeErrors */ //============================================================================= CORBA::Boolean GEOM_IMeasureOperations_i::CheckSelfIntersections (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theCheckLevel, GEOM::ListOfLong_out theIntersections) { // Set a not done flag @@ -720,10 +721,35 @@ CORBA::Boolean GEOM_IMeasureOperations_i::CheckSelfIntersections (GEOM::GEOM_Obj Handle(GEOM_Object) aShape = GetObjectImpl(theShape); if (!aShape.IsNull()) { + GEOMImpl_IMeasureOperations::SICheckLevel aCheckLevel; + + switch(theCheckLevel) { + case GEOM::SI_V_V: + aCheckLevel = GEOMImpl_IMeasureOperations::SI_V_V; + break; + case GEOM::SI_V_E: + aCheckLevel = GEOMImpl_IMeasureOperations::SI_V_E; + break; + case GEOM::SI_E_E: + aCheckLevel = GEOMImpl_IMeasureOperations::SI_E_E; + break; + case GEOM::SI_V_F: + aCheckLevel = GEOMImpl_IMeasureOperations::SI_V_F; + break; + case GEOM::SI_E_F: + aCheckLevel = GEOMImpl_IMeasureOperations::SI_E_F; + break; + case GEOM::SI_ALL: + default: + aCheckLevel = GEOMImpl_IMeasureOperations::SI_ALL; + break; + } + Handle(TColStd_HSequenceOfInteger) anIntegers = new TColStd_HSequenceOfInteger; // Detect self-intersections - isGood = GetOperations()->CheckSelfIntersections(aShape, anIntegers); + isGood = GetOperations()->CheckSelfIntersections + (aShape, aCheckLevel, anIntegers); int nbInts = anIntegers->Length(); diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.hh b/src/GEOM_I/GEOM_IMeasureOperations_i.hh index 690ac5390..391de3f48 100644 --- a/src/GEOM_I/GEOM_IMeasureOperations_i.hh +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.hh @@ -97,6 +97,7 @@ class GEOM_I_EXPORT GEOM_IMeasureOperations_i : const GEOM::GEOM_IMeasureOperations::ShapeErrors &theErrors); CORBA::Boolean CheckSelfIntersections (GEOM::GEOM_Object_ptr theShape, + CORBA::Long theCheckLevel, GEOM::ListOfLong_out theIntersections); char* IsGoodForSolid (GEOM::GEOM_Object_ptr theShape); diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index a72a7d283..976f9e9fb 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -10569,22 +10569,38 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): ## Detect self-intersections in the given shape. # @param theShape Shape to check. + # @param theCheckLevel is the level of self-intersection check. + # Possible input values are: + # - GEOM.SI_V_V(0) - only V/V interferences + # - GEOM.SI_V_E(1) - V/V and V/E interferences + # - GEOM.SI_E_E(2) - V/V, V/E and E/E interferences + # - GEOM.SI_V_F(3) - V/V, V/E, E/E and V/F interferences + # - GEOM.SI_E_F(4) - V/V, V/E, E/E, V/F and E/F interferences + # - GEOM.SI_ALL(5) - all interferences. # @return TRUE, if the shape contains no self-intersections. # # @ref tui_measurement_tools_page "Example" @ManageTransactions("MeasuOp") - def CheckSelfIntersections(self, theShape): + def CheckSelfIntersections(self, theShape, theCheckLevel = GEOM.SI_ALL): """ Detect self-intersections in the given shape. Parameters: theShape Shape to check. - + theCheckLevel is the level of self-intersection check. + Possible input values are: + - GEOM.SI_V_V(0) - only V/V interferences + - GEOM.SI_V_E(1) - V/V and V/E interferences + - GEOM.SI_E_E(2) - V/V, V/E and E/E interferences + - GEOM.SI_V_F(3) - V/V, V/E, E/E and V/F interferences + - GEOM.SI_E_F(4) - V/V, V/E, E/E, V/F and E/F interferences + - GEOM.SI_ALL(5) - all interferences. + Returns: TRUE, if the shape contains no self-intersections. """ # Example: see GEOM_TestMeasures.py - (IsValid, Pairs) = self.MeasuOp.CheckSelfIntersections(theShape) + (IsValid, Pairs) = self.MeasuOp.CheckSelfIntersections(theShape, EnumToLong(theCheckLevel)) RaiseIfFailed("CheckSelfIntersections", self.MeasuOp) return IsValid diff --git a/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.cxx b/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.cxx index 8debf294c..de58de84c 100644 --- a/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.cxx @@ -24,8 +24,9 @@ // File : MeasureGUI_CheckSelfIntersectionsDlg.cxx #include "MeasureGUI_CheckSelfIntersectionsDlg.h" -#include "MeasureGUI_Widgets.h" +#include "MeasureGUI.h" +#include #include #include #include @@ -34,6 +35,7 @@ #include #include +#include #include #include @@ -41,6 +43,8 @@ #include #include +#include + #define TEXTEDIT_FONT_FAMILY "Courier" #define TEXTEDIT_FONT_SIZE 11 @@ -52,7 +56,14 @@ // true to construct a modal dialog. //================================================================================= MeasureGUI_CheckSelfIntersectionsDlg::MeasureGUI_CheckSelfIntersectionsDlg (GeometryGUI* GUI, QWidget* parent) - : MeasureGUI_Skeleton(GUI, parent, false) + : GEOMBase_Skeleton (GUI, parent, false), + myTextView (0), + mySelButton (0), + myEditObjName (0), + myLevelBox (0), + myComputeButton (0), + myInteList (0), + myShapeList (0) { SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_CHECK_SELF_INTERSECTIONS"))); @@ -63,31 +74,64 @@ MeasureGUI_CheckSelfIntersectionsDlg::MeasureGUI_CheckSelfIntersectionsDlg (Geom /***************************************************************/ mainFrame()->GroupConstructors->setTitle(tr("GEOM_CHECK_SELF_INTERSECTIONS")); mainFrame()->RadioButton1->setIcon(image0); + mainFrame()->RadioButton2->setAttribute( Qt::WA_DeleteOnClose ); + mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); + mainFrame()->RadioButton3->close(); - myGrp = new MeasureGUI_1Sel1TextView2ListBox (centralWidget()); - myGrp->GroupBox1->setTitle(tr("GEOM_CHECK_INFOS")); - myGrp->TextLabel1->setText(tr("GEOM_OBJECT")); + QGroupBox *aGrp = new QGroupBox(tr("GEOM_CHECK_INFOS")); + QLabel *anObjLbl = new QLabel(tr("GEOM_OBJECT")); + QLabel *anInteLbl = new QLabel(tr("GEOM_CHECK_INTE_INTERSECTIONS")); + QLabel *aShapeLbl = new QLabel(tr("GEOM_CHECK_INTE_SUBSHAPES")); + QLabel *aLevelLbl = new QLabel(tr("GEOM_CHECK_INTE_CHECK_LEVEL")); + QLabel *aSummaryLbl = new QLabel(tr("GEOM_CHECK_INTE_SUMMARY")); + QFont aFont (TEXTEDIT_FONT_FAMILY, TEXTEDIT_FONT_SIZE); - myGrp->TextView1->setReadOnly(true); - QFont aFont (TEXTEDIT_FONT_FAMILY, TEXTEDIT_FONT_SIZE); aFont.setStyleHint(QFont::TypeWriter, QFont::PreferAntialias); - myGrp->TextView1->setFont(aFont); + myTextView = new QTextBrowser; + myTextView->setReadOnly(true); + myTextView->setFont(aFont); - myGrp->PushButton1->setIcon(image1); - myGrp->LineEdit1->setReadOnly(true); + mySelButton = new QPushButton; + mySelButton->setIcon(image1); + mySelButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - myGrp->TextLabel2->setText(tr("GEOM_CHECK_BLOCKS_COMPOUND_ERRORS")); - myGrp->TextLabel3->setText(tr("GEOM_CHECK_BLOCKS_COMPOUND_SUBSHAPES")); + myEditObjName = new QLineEdit; + myEditObjName->setReadOnly(true); - myGrp->ListBox2->setSelectionMode(QAbstractItemView::ExtendedSelection); + myLevelBox = new QComboBox; + + myComputeButton = new QPushButton(tr("GEOM_CHECK_INTE_COMPUTE")); + + + myInteList = new QListWidget; + myShapeList = new QListWidget; + myShapeList->setSelectionMode(QAbstractItemView::ExtendedSelection); + + QGridLayout *aGrpLayout = new QGridLayout(aGrp); + + aGrpLayout->setMargin(9); + aGrpLayout->setSpacing(6); + aGrpLayout->addWidget(anObjLbl, 0, 0); + aGrpLayout->addWidget(anInteLbl, 5, 0); + aGrpLayout->addWidget(aShapeLbl, 5, 2); + aGrpLayout->addWidget(aLevelLbl, 1, 0); + aGrpLayout->addWidget(myLevelBox, 1, 1, 1, 2); + aGrpLayout->addWidget(myComputeButton, 2, 0, 1, 3); + aGrpLayout->addWidget(aSummaryLbl, 3, 0); + aGrpLayout->addWidget(myTextView, 4, 0, 1, 3); + aGrpLayout->addWidget(mySelButton, 0, 1); + aGrpLayout->addWidget(myEditObjName, 0, 2); + aGrpLayout->addWidget(myInteList, 6, 0, 1, 2); + aGrpLayout->addWidget(myShapeList, 6, 2); QVBoxLayout* layout = new QVBoxLayout (centralWidget()); layout->setMargin(0); layout->setSpacing(6); - layout->addWidget(myGrp); + layout->addWidget(aGrp); /***************************************************************/ - myHelpFileName = "using_measurement_tools_page.html#check_self_intersections_anchor"; + myHelpFileName = "check_self_intersections_page.html"; /* Initialisation */ Init(); @@ -107,94 +151,302 @@ MeasureGUI_CheckSelfIntersectionsDlg::~MeasureGUI_CheckSelfIntersectionsDlg() //================================================================================= void MeasureGUI_CheckSelfIntersectionsDlg::Init() { - mySelBtn = myGrp->PushButton1; - mySelEdit = myGrp->LineEdit1; - MeasureGUI_Skeleton::Init(); + // Fill in the combo box. + myLevelBox->insertItem(GEOM::SI_V_V, tr("GEOM_CHECK_INTE_V_V")); + myLevelBox->insertItem(GEOM::SI_V_E, tr("GEOM_CHECK_INTE_V_E")); + myLevelBox->insertItem(GEOM::SI_E_E, tr("GEOM_CHECK_INTE_E_E")); + myLevelBox->insertItem(GEOM::SI_V_F, tr("GEOM_CHECK_INTE_V_F")); + myLevelBox->insertItem(GEOM::SI_E_F, tr("GEOM_CHECK_INTE_E_F")); + myLevelBox->insertItem(GEOM::SI_ALL, tr("GEOM_CHECK_INTE_ALL")); + myLevelBox->setCurrentIndex(GEOM::SI_ALL); - connect(myGrp->ListBox1, SIGNAL(itemSelectionChanged()), SLOT(onErrorsListSelectionChanged())); - connect(myGrp->ListBox2, SIGNAL(itemSelectionChanged()), SLOT(onSubShapesListSelectionChanged())); + connect(myGeomGUI, SIGNAL(SignalDeactivateActiveDialog()), + this, SLOT(DeactivateActiveDialog())); + connect(myGeomGUI, SIGNAL(SignalCloseAllDialogs()), + this, SLOT(ClickOnCancel())); + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(mySelButton, SIGNAL(clicked()), + this, SLOT(SetEditCurrentArgument())); + connect(myInteList, SIGNAL(itemSelectionChanged()), + SLOT(onInteListSelectionChanged())); + connect(myShapeList, SIGNAL(itemSelectionChanged()), + SLOT(onSubShapesListSelectionChanged())); + connect(myLevelBox, SIGNAL(currentIndexChanged(int)), + this, SLOT(clear())); + connect(myComputeButton, SIGNAL(clicked()), this, SLOT(onCompute())); + + LightApp_SelectionMgr* aSel = myGeomGUI->getApp()->selectionMgr(); + + connect(aSel, SIGNAL(currentSelectionChanged()), + this, SLOT(SelectionIntoArgument())); + + initName( tr( "GEOM_SELF_INTERSECTION_NAME") ); + buttonOk()->setEnabled(false); + buttonApply()->setEnabled(false); + myComputeButton->setEnabled(false); + activateSelection(); + SelectionIntoArgument(); } //================================================================================= -// function : processObject +// function : clear // purpose : //================================================================================= -void MeasureGUI_CheckSelfIntersectionsDlg::processObject() +void MeasureGUI_CheckSelfIntersectionsDlg::clear() { - myGrp->ListBox1->clear(); - myGrp->ListBox2->clear(); + myTextView->setText(""); + disconnect(myInteList, SIGNAL(itemSelectionChanged()), this, 0); + disconnect(myShapeList, SIGNAL(itemSelectionChanged()), this, 0); + myInteList->clear(); + myShapeList->clear(); + connect(myInteList, SIGNAL(itemSelectionChanged()), + SLOT(onInteListSelectionChanged())); + connect(myShapeList, SIGNAL(itemSelectionChanged()), + SLOT(onSubShapesListSelectionChanged())); erasePreview(); + buttonOk()->setEnabled(false); + buttonApply()->setEnabled(false); + myComputeButton->setEnabled(true); +} - if (myObj->_is_nil()) +//================================================================================= +// function : onCompute +// purpose : +//================================================================================= +void MeasureGUI_CheckSelfIntersectionsDlg::onCompute() +{ + bool hasSelfInte = false; + QString anErrMsg(""); + + if (!findSelfIntersections(hasSelfInte, anErrMsg)) { + myTextView->setText(anErrMsg); return; + } + + // Status and apply buttons + QString aMsg(""); + + if (hasSelfInte) { + aMsg += tr("GEOM_SELF_INTERSECTIONS_FOUND"); + buttonOk()->setEnabled(true); + buttonApply()->setEnabled(true); + } else { + aMsg += tr("GEOM_NO_SELF_INTERSECTIONS"); + } + + if (!anErrMsg.isEmpty()) { + aMsg += "\n\n"; + aMsg += anErrMsg; + } + + myTextView->setText(aMsg); + + // Pairs + QStringList anInteList; + QString anInteStr (""); + int nbPairs = myInters->length()/2; + + for (int i = 1; i <= nbPairs; i++) { + anInteStr = "Intersection # "; + anInteStr += QString::number(i); + anInteList.append(anInteStr); + } + + myInteList->addItems(anInteList); + myComputeButton->setEnabled(false); +} + +//================================================================================= +// function : ActivateThisDialog +// purpose : +//================================================================================= +void MeasureGUI_CheckSelfIntersectionsDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + + LightApp_SelectionMgr* aSel = myGeomGUI->getApp()->selectionMgr(); + if ( aSel ) + connect( aSel, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + + activateSelection(); + DISPLAY_PREVIEW_MACRO +} + +//================================================================================= +// function : DeactivateActiveDialog() +// purpose : public slot to deactivate if active +//================================================================================= +void MeasureGUI_CheckSelfIntersectionsDlg::DeactivateActiveDialog() +{ + GEOMBase_Skeleton::DeactivateActiveDialog(); +} + +//================================================================================= +// function : activateSelection +// purpose : +//================================================================================= +void MeasureGUI_CheckSelfIntersectionsDlg::activateSelection() +{ + globalSelection(GEOM_ALLSHAPES); +} + +//================================================================================= +// function : ClickOnOk() +// purpose : +//================================================================================= +void MeasureGUI_CheckSelfIntersectionsDlg::ClickOnOk() +{ + if ( ClickOnApply() ) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool MeasureGUI_CheckSelfIntersectionsDlg::ClickOnApply() +{ + if ( !onAccept() ) + return false; + + initName(); + return true; +} + +//================================================================================= +// function : extractPrefix +// purpose : +//================================================================================= +bool MeasureGUI_CheckSelfIntersectionsDlg::extractPrefix() const +{ + return true; +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr MeasureGUI_CheckSelfIntersectionsDlg::createOperation() +{ + return getGeomEngine()->GetIMeasureOperations( getStudyId() ); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool MeasureGUI_CheckSelfIntersectionsDlg::isValid( QString& ) +{ + return !myObj->_is_nil(); +} + +//================================================================================= +// function : SetEditCurrentArgument +// purpose : +//================================================================================= +void MeasureGUI_CheckSelfIntersectionsDlg::SetEditCurrentArgument() +{ + myEditObjName->setFocus(); + SelectionIntoArgument(); +} + +//================================================================================= +// function : SelectionIntoArgument +// purpose : +//================================================================================= +void MeasureGUI_CheckSelfIntersectionsDlg::SelectionIntoArgument() +{ + // Clear the dialog. + clear(); + myObj = GEOM::GEOM_Object::_nil(); + + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + GEOM::GEOM_Object_var aSelectedObject = GEOM::GEOM_Object::_nil(); + + if (aSelList.Extent() > 0) { + aSelectedObject = GEOMBase::ConvertIOinGEOMObject( aSelList.First() ); + } + + if (aSelectedObject->_is_nil()) { + myEditObjName->setText(""); + return; + } + + myObj = aSelectedObject; + myEditObjName->setText(GEOMBase::GetName(myObj)); +} + +//================================================================================= +// function : enterEvent +// purpose : +//================================================================================= +void MeasureGUI_CheckSelfIntersectionsDlg::enterEvent(QEvent *) +{ + if ( !mainFrame()->GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : findSelfIntersections +// purpose : +//================================================================================= +bool MeasureGUI_CheckSelfIntersectionsDlg::findSelfIntersections + (bool &HasSelfInte, QString &theErrMsg) +{ + if (myObj->_is_nil()) { + return false; + } + + GEOM::GEOM_IMeasureOperations_var anOper = + GEOM::GEOM_IMeasureOperations::_narrow(getOperation()); + bool isOK = true; + int nbPairs = 0; + int aLevel = myLevelBox->currentIndex(); - QString aMsg (""); - GEOM::GEOM_IMeasureOperations_var anOper = GEOM::GEOM_IMeasureOperations::_narrow(getOperation()); - bool isGood = false, isFailed = false; - int nbPairs = 0; try { - isGood = anOper->CheckSelfIntersections(myObj, myInters); + HasSelfInte = !anOper->CheckSelfIntersections(myObj, aLevel, myInters); nbPairs = myInters->length()/2; + if (nbPairs*2 != myInters->length()) { - isFailed = true; + isOK = false; } } catch (const SALOME::SALOME_Exception& e) { SalomeApp_Tools::QtCatchCorbaException(e); - isFailed = true; - } - - if (!anOper->IsDone() && myInters->length() == 0) { - aMsg += tr(anOper->GetErrorCode()); - myGrp->TextView1->setText(aMsg); - return; - } - else if (isFailed) { - aMsg += tr("GEOM_CHECK_SELF_INTERSECTIONS_FAILED"); - myGrp->TextView1->setText(aMsg); - return; - } - - // Status - if (isGood) { - aMsg += tr("GEOM_NO_SELF_INTERSECTIONS"); - } - else { - aMsg += tr("GEOM_SELF_INTERSECTIONS_FOUND"); + isOK = false; } if (!anOper->IsDone()) { - aMsg += "\n\n"; - aMsg += tr("GEOM_CHECK_SELF_INTERSECTIONS_ERRORS"); + if (myInters->length() == 0) { + theErrMsg = tr(anOper->GetErrorCode()); + isOK = false; + } else { + // Valid case. Display all computed self-intersections + theErrMsg = tr("GEOM_CHECK_SELF_INTERSECTIONS_ERRORS"); + } + } else if (!isOK) { + theErrMsg = tr("GEOM_CHECK_SELF_INTERSECTIONS_FAILED"); } - myGrp->TextView1->setText(aMsg); - - // Pairs - QStringList aErrList; - QString aErrStr (""); - for (int i = 1; i <= nbPairs; i++) { - aErrStr = "Intersection # "; - aErrStr += QString::number(i); - aErrList.append(aErrStr); - } - - myGrp->ListBox1->addItems(aErrList); + return isOK; } //================================================================================= -// function : onErrorsListSelectionChanged +// function : onInteListSelectionChanged // purpose : //================================================================================= -void MeasureGUI_CheckSelfIntersectionsDlg::onErrorsListSelectionChanged() +void MeasureGUI_CheckSelfIntersectionsDlg::onInteListSelectionChanged() { erasePreview(); - int aCurItem = myGrp->ListBox1->currentRow(); + int aCurItem = myInteList->currentRow(); + if (aCurItem < 0) return; - //int nbPairs = myInters->length()/2; - QStringList aSubShapeList; TopoDS_Shape aSelShape; if (!myObj->_is_nil() && GEOMBase::GetShape(myObj, aSelShape)) { @@ -210,8 +462,8 @@ void MeasureGUI_CheckSelfIntersectionsDlg::onErrorsListSelectionChanged() if (!aType.isEmpty()) aSubShapeList.append(QString("%1_%2").arg(aType).arg(myInters[aCurItem*2 + 1])); } - myGrp->ListBox2->clear(); - myGrp->ListBox2->addItems(aSubShapeList); + myShapeList->clear(); + myShapeList->addItems(aSubShapeList); } //================================================================================= @@ -223,14 +475,14 @@ void MeasureGUI_CheckSelfIntersectionsDlg::onSubShapesListSelectionChanged() erasePreview(); // Current pair - int aErrCurItem = myGrp->ListBox1->currentRow(); + int aErrCurItem = myInteList->currentRow(); if (aErrCurItem < 0) return; // Selected IDs QList aIds; - for (int i = 0, n = myGrp->ListBox2->count(); i < n; i++) { - if (myGrp->ListBox2->item(i)->isSelected()) + for (int i = 0, n = myShapeList->count(); i < n; i++) { + if (myShapeList->item(i)->isSelected()) aIds.append(i); } if (aIds.count() < 1) @@ -259,3 +511,82 @@ void MeasureGUI_CheckSelfIntersectionsDlg::onSubShapesListSelectionChanged() } } } + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool MeasureGUI_CheckSelfIntersectionsDlg::execute(ObjectList& objects) +{ + bool hasSelfInte; + QString anErrMsg; + + if (!findSelfIntersections(hasSelfInte, anErrMsg)) { + return false; + } + + const int aNbInteSelected = myInteList->selectedItems().size(); + const bool isPublishAllInte = (aNbInteSelected < 1); + const bool isPublishAllShapes = + (aNbInteSelected != 1 || myShapeList->selectedItems().empty()); + int i; + const int n = myInteList->count(); + TColStd_IndexedMapOfInteger aMapIndex; + + // Collect the map of indices. + for (i = 0; i < n; i++) { + if (isPublishAllInte) { + // Collect the both of two indices. + aMapIndex.Add(myInters[i*2]); + aMapIndex.Add(myInters[i*2 + 1]); + } else if (myInteList->item(i)->isSelected()) { + if (isPublishAllShapes) { + // Collect the both of two indices. + aMapIndex.Add(myInters[i*2]); + aMapIndex.Add(myInters[i*2 + 1]); + } else if (myShapeList->count() == 2) { + // Collect only selected items. + if (myShapeList->item(0)->isSelected()) { + aMapIndex.Add(myInters[i*2]); + } + if (myShapeList->item(1)->isSelected()) { + aMapIndex.Add(myInters[i*2 + 1]); + } + } + } + } + + // Create objects. + GEOM::ListOfLong_var anArray = new GEOM::ListOfLong; + const int aNbShapes = aMapIndex.Extent(); + + anArray->length(aNbShapes); + + for (i = 1; i <= aNbShapes; i++) { + anArray[i - 1] = aMapIndex.FindKey(i); + } + + if (myShapesOper->_is_nil()) { + myShapesOper = getGeomEngine()->GetIShapesOperations(getStudyId()); + } + + GEOM::ListOfGO_var aList = myShapesOper->MakeSubShapes(myObj, anArray); + const int aNbObj = aList->length(); + + for (i = 0; i < aNbObj; i++) { + objects.push_back(GEOM::GEOM_Object::_duplicate(aList[i])); + } + + return true; +} + +//================================================================ +// Function : getFather +// Purpose : Get father object for object to be added in study +// (called with addInStudy method) +//================================================================ +GEOM::GEOM_Object_ptr MeasureGUI_CheckSelfIntersectionsDlg::getFather + (GEOM::GEOM_Object_ptr) +{ + return myObj; +} diff --git a/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.h b/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.h index e22346439..e9400be2d 100644 --- a/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.h +++ b/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.h @@ -26,38 +26,70 @@ #ifndef MEASUREGUI_CHECKSELFINTERDLG_H #define MEASUREGUI_CHECKSELFINTERDLG_H -#include +#include + +class QComboBox; +class QListWidget; +class QTextBrowser; -class MeasureGUI_1Sel1TextView2ListBox; //================================================================================= // class : MeasureGUI_CheckSelfIntersectionsDlg // purpose : //================================================================================= -class MeasureGUI_CheckSelfIntersectionsDlg : public MeasureGUI_Skeleton +class MeasureGUI_CheckSelfIntersectionsDlg : public GEOMBase_Skeleton { Q_OBJECT public: + MeasureGUI_CheckSelfIntersectionsDlg(GeometryGUI*, QWidget*); ~MeasureGUI_CheckSelfIntersectionsDlg(); protected: - // redefined from GEOMBase_Helper and MeasureGUI_Skeleton - virtual void processObject(); + // redefined from GEOMBase_Helper + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool isValid(QString &); + virtual bool execute(ObjectList &); + virtual bool extractPrefix() const; + virtual GEOM::GEOM_Object_ptr getFather (GEOM::GEOM_Object_ptr); private slots: - void onErrorsListSelectionChanged(); + + void onInteListSelectionChanged(); void onSubShapesListSelectionChanged(); + void clear(); + void onCompute(); + void ClickOnOk(); + bool ClickOnApply(); + void ActivateThisDialog(); + void DeactivateActiveDialog(); + void SelectionIntoArgument(); + void SetEditCurrentArgument(); private: + void Init(); + void activateSelection(); + void enterEvent(QEvent *); + bool findSelfIntersections + (bool &HasSelfInte, + QString &theErrMsg); private: - MeasureGUI_1Sel1TextView2ListBox* myGrp; + QTextBrowser *myTextView; + QPushButton *mySelButton; + QLineEdit *myEditObjName; + QComboBox *myLevelBox; + QPushButton *myComputeButton; + QListWidget *myInteList; + QListWidget *myShapeList; + GEOM::GEOM_Object_var myObj; GEOM::ListOfLong_var myInters; + GEOM::GEOM_IShapesOperations_var myShapesOper; + }; #endif // MEASUREGUI_CHECKSELFINTERDLG_H