diff --git a/doc/salome/gui/GEOM/images/measures11.png b/doc/salome/gui/GEOM/images/measures11.png
index 85af6f187..fc1cea582 100644
Binary files a/doc/salome/gui/GEOM/images/measures11.png and b/doc/salome/gui/GEOM/images/measures11.png differ
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
Detect Self-intersections
-
-
- Detection of self-intersections failed
-
-
-
- There are no self-intersections in the shape
-
-
-
- Some self-intersections detected
-
-
-
- Warning: there were errors during the operation, so the list may be incomplete.
-
Circle
@@ -6967,4 +6951,71 @@ Do you want to create new material?
V-Isoline
+
+ MeasureGUI_CheckSelfIntersectionsDlg
+
+
+ Self-intersections
+
+
+
+ Sub-shapes
+
+
+
+ Level of check
+
+
+
+ Summary
+
+
+
+ Compute self-intersections
+
+
+
+ Self_intersection
+
+
+
+ There are no self-intersections in the shape
+
+
+
+ Some self-intersections detected
+
+
+
+ Detection of self-intersections failed
+
+
+
+ Warning: there were errors during the operation, so the list may be incomplete.
+
+
+
+ Vertex to Vertex
+
+
+
+ Vertex to Edge + all above
+
+
+
+ Edge to Edge + all above
+
+
+
+ Vertex to Face + all above
+
+
+
+ Edge to Face + all above
+
+
+
+ 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