22762 (part 2): add second 'Detect Self-Intersections Fast' tab in the 'Check Self-Intersections' dialog box.

This commit is contained in:
akl 2015-04-28 12:21:22 +04:00
parent 7760eb2714
commit 9eecc554ac
20 changed files with 648 additions and 140 deletions

View File

@ -56,6 +56,7 @@ SET(GOOD_TESTS
center_of_mass.py
check_compound_of_blocks.py
check_self_intersections.py
check_self_intersections_fast.py
check_shape.py
complex_objs_ex01.py
complex_objs_ex02.py

View File

@ -0,0 +1,15 @@
# Detect Self-intersections fast
import salome
salome.salome_init()
import GEOM
from salome.geom import geomBuilder
geompy = geomBuilder.New(salome.myStudy)
# create a box
box = geompy.MakeBoxDXDYDZ(100,30,100)
IsValid = geompy.CheckSelfIntersectionsFast(box, 0.002, 0)
if IsValid == 0:
raise RuntimeError, "Box with self-intersections created"
else:
print "\nBox is valid"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 928 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 871 KiB

View File

@ -2,24 +2,26 @@
\page check_self_intersections_page Detect Self-intersections
This operation checks the topology of the selected shape to detect self-intersections.
\n To <b>Detect Self-intersections</b> in the <b>Main Menu</b> select
<b>Inspection - > Detect Self-intersections</b>.
<ol>
<li> This operation checks the topology of the selected shape to detect self-intersections.
\image html measures11.png
In this dialog:
- \b Object - the checked object. \b Selection button allows picking it in the viewer or in the object browser.
- <b>Level of check</b> - 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".
- <b>Level of check</b> - 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".
- <b>Compute self-intersections</b> 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(s) to show <b>Sub-shapes</b> in the field to the right.
- \b Apply and <b>Apply and Close</b> buttons are used to store interferences selected in the "Self-intersections" list box in the study for further analysis.
If no any interference is selected, all interferences are published in the study. Each interference is published as a child
compound of the source shape and contains a couple of intersecting sub-shapes.
If no any interference is selected, all interferences are published in the study. Each interference is published as a child compound of the source shape and contains a couple of intersecting sub-shapes.
\note This tool is useful for detection of shapes, not suitable for
\note This tool is useful for detection of shapes that can not be used as
arguments of Boolean operations and Partition algorithm.
For more information about Partition and Boolean Operations Algorithms
and their limitations refer to <a href="SALOME_BOA_PA.pdf">this document</a>.
@ -32,5 +34,28 @@ where: \n
See also a \ref tui_check_self_intersections_page "TUI example".
</li>
<li>Detect self-intersections of the given shape with algorithm based on mesh intersections.
\image html measures13.png
This algorithm works on the faces level, i.e. it computes only face-to-face intersections. No additional types of intersections is computed. This case can be useful in order to detect all the intersections between the subshapes of type "surface" inside assembly
.
Quality of result will depend on the quality of tesselation (managed via the deflection parameter). However, small values of deflection can significantly decrease performance of the algorithm.
Nevertheless, performance of Fast Intersect algorithm is much higher than topological intersection.
\n <b>Result:</b> Boolean.
\n <b>TUI Command:</b> <em>geompy.CheckSelfIntersectionsFast(theShape, theDeflection, theTolerance),</em> \n
where: \n
\em theShape is the shape checked for validity. \n
\em theDeflection is a linear deflection coefficient that specifies quality of tesselation. If theDeflection <= 0, default deflection 0.001 is used.
\em theTolerance Specifies a distance between shapes used for detecting gaps:
- if theTolerance <= 0, algorithm detects intersections;
- if theTolerance > 0, algorithm detects gaps.
See also a \ref tui_check_self_intersections_fast_page "TUI example".
</li>
</ol>
*/

View File

@ -0,0 +1,6 @@
/*!
\page tui_check_self_intersections_fast_page Detect Self-intersections fast
\tui_script{check_self_intersections_fast.py}
*/

View File

@ -19,6 +19,7 @@
<li>\subpage tui_check_compound_of_blocks_page</li>
<li>\subpage tui_get_non_blocks_page</li>
<li>\subpage tui_check_self_intersections_page</li>
<li>\subpage tui_check_self_intersections_fast_page</li>
<li>\subpage tui_fast_intersection_page</li>
</ul>

View File

@ -17,6 +17,9 @@
\until Detect Self-intersections
\anchor swig_CheckSelfIntersections
\until Detect Self-intersections fast
\anchor swig_CheckSelfIntersectionsFast
\until Detect Fast intersection
\anchor swig_FastIntersection

View File

@ -4447,6 +4447,21 @@ module GEOM
in long theCheckLevel,
out ListOfLong theIntersections);
/*!
* \brief Detect self-intersections of the given shape with algorithm based on mesh intersections.
* \param theShape Shape to check validity of.
* \param theDeflection Linear deflection coefficient that specifies quality of tesselation:
* \param theTolerance Specifies a distance between sub-shapes used for detecting gaps:
* - if \a theTolerance <= 0, algorithm detects intersections
* - if \a theTolerance > 0, algorithm detects gaps
* \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 CheckSelfIntersectionsFast (in GEOM_Object theShape,
in float theDeflection,
in double theTolerance,
out ListOfLong theIntersections);
/*!
* \brief Detect intersections of the given shapes with algorithm based on mesh intersections.
* \param theShape1 First source object

View File

@ -425,7 +425,7 @@ Please, select face, shell or solid and try again</translation>
</message>
<message>
<source>GEOM_CHECK_SELF_INTERSECTIONS</source>
<translation>Detect Self-intersections</translation>
<translation>Self-intersection Detection Type</translation>
</message>
<message>
<source>GEOM_FAST_CHECK_INTERSECTIONS</source>
@ -7323,6 +7323,14 @@ Do you want to create new material?</translation>
<source>GEOM_CHECK_INTE_ALL</source>
<translation>Face to Face + all above</translation>
</message>
<message>
<source>GEOM_CHECK_INT_DEFLECT</source>
<translation>Deflection coefficient</translation>
</message>
<message>
<source>GEOM_CHECK_INT_DETECT_GAPS</source>
<translation>Detect gaps with tolerance</translation>
</message>
</context>
<context>
<name>MeasureGUI_FastCheckIntersectionsDlg</name>

View File

@ -425,7 +425,7 @@ Choisissez une face, une coque ou un solide et essayez de nouveau</translation>
</message>
<message>
<source>GEOM_CHECK_SELF_INTERSECTIONS</source>
<translation>Détecter les auto-intersections</translation>
<translation type="unfinished">Self-intersection Detection Type</translation>
</message>
<message>
<source>GEOM_FAST_CHECK_INTERSECTIONS</source>
@ -7256,6 +7256,14 @@ Voulez-vous en créer un nouveau ?</translation>
<source>GEOM_CHECK_INTE_ALL</source>
<translation>Face à Face + tout au-delà</translation>
</message>
<message>
<source>GEOM_CHECK_INT_DEFLECT</source>
<translation type="unfinished">Deflection coefficient</translation>
</message>
<message>
<source>GEOM_CHECK_INT_DETECT_GAPS</source>
<translation type="unfinished">Detect gaps with tolerance</translation>
</message>
</context>
<context>
<name>MeasureGUI_FastCheckIntersectionsDlg</name>

View File

@ -409,7 +409,7 @@
</message>
<message>
<source>GEOM_CHECK_SELF_INTERSECTIONS</source>
<translation></translation>
<translation type="unfinished">Self-intersection Detection Type</translation>
</message>
<message>
<source>GEOM_FAST_CHECK_INTERSECTIONS</source>
@ -7141,6 +7141,14 @@
<source>GEOM_CHECK_INTE_ALL</source>
<translation type="unfinished">Face to Face + all above</translation>
</message>
<message>
<source>GEOM_CHECK_INT_DEFLECT</source>
<translation type="unfinished">Deflection coefficient</translation>
</message>
<message>
<source>GEOM_CHECK_INT_DETECT_GAPS</source>
<translation type="unfinished">Detect gaps with tolerance</translation>
</message>
</context>
<context>
<name>MeasureGUI_FastCheckIntersectionsDlg</name>

View File

@ -1580,6 +1580,61 @@ bool GEOMImpl_IMeasureOperations::CheckSelfIntersections
return isGood;
}
//=============================================================================
/*!
* CheckSelfIntersectionsFast
*/
//=============================================================================
bool GEOMImpl_IMeasureOperations::CheckSelfIntersectionsFast
(Handle(GEOM_Object) theShape,
float theDeflection, double theTolerance,
Handle(TColStd_HSequenceOfInteger)& theIntersections)
{
SetErrorCode(KO);
bool isGood = false;
if (theIntersections.IsNull())
theIntersections = new TColStd_HSequenceOfInteger;
else
theIntersections->Clear();
if (theShape.IsNull())
return isGood;
Handle(GEOM_Function) aRefShape = theShape->GetLastFunction();
if (aRefShape.IsNull()) return isGood;
TopoDS_Shape aShape = aRefShape->GetValue();
if (aShape.IsNull()) return isGood;
// 0. Prepare data
TopoDS_Shape aScopy;
//
GEOMAlgo_AlgoTools::CopyShape(aShape, aScopy);
GEOMUtils::MeshShape(aScopy, theDeflection);
//
// Map sub-shapes and their indices
TopTools_IndexedMapOfShape anIndices;
TopExp::MapShapes(aScopy, anIndices);
//
BRepExtrema_ShapeProximity aBSP; // checker of fast interferences
aBSP.LoadShape1(aScopy);
aBSP.SetTolerance((theTolerance <= 0.) ? 0.0 : theTolerance);
// 1. Launch the checker
aBSP.Perform();
// TODO theIntersections filling
//theIntersections = aBSP.Interferences(); // to be corrected!!!
isGood = theIntersections->IsEmpty();
if (aBSP.IsDone())
SetErrorCode(OK);
return isGood;
}
//=============================================================================
/*!
* FastIntersect

View File

@ -158,6 +158,11 @@ class GEOMImpl_IMeasureOperations : public GEOM_IOperations {
const SICheckLevel theCheckLevel,
Handle(TColStd_HSequenceOfInteger)& theIntersections);
Standard_EXPORT bool CheckSelfIntersectionsFast (Handle(GEOM_Object) theShape,
float deflection,
double tolerance,
Handle(TColStd_HSequenceOfInteger)& theIntersections);
Standard_EXPORT bool FastIntersect (Handle(GEOM_Object) theShape1, Handle(GEOM_Object) theShape2,
double tolerance, float deflection,
Handle(TColStd_HSequenceOfInteger)& theIntersections1,

View File

@ -765,6 +765,49 @@ CORBA::Boolean GEOM_IMeasureOperations_i::CheckSelfIntersections (GEOM::GEOM_Obj
return isGood;
}
//=============================================================================
/*!
* CheckSelfIntersectionsFast
*/
//=============================================================================
CORBA::Boolean GEOM_IMeasureOperations_i::CheckSelfIntersectionsFast
(GEOM::GEOM_Object_ptr theShape,
CORBA::Float theDeflection,
CORBA::Double theTolerance,
GEOM::ListOfLong_out theIntersections)
{
// Set a not done flag
GetOperations()->SetNotDone();
bool isGood = false;
// Allocate the CORBA arrays
GEOM::ListOfLong_var anIntegersArray = new GEOM::ListOfLong();
// Get the reference shape
Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
if (!aShape.IsNull()) {
Handle(TColStd_HSequenceOfInteger) anIntegers = new TColStd_HSequenceOfInteger;
// Detect self-intersections
isGood = GetOperations()->CheckSelfIntersectionsFast
(aShape, theDeflection, theTolerance, anIntegers);
int nbInts = anIntegers->Length();
anIntegersArray->length(nbInts);
for (int ii = 0; ii < nbInts; ii++) {
anIntegersArray[ii] = anIntegers->Value(ii + 1);
}
}
// Initialize out-parameters with local arrays
theIntersections = anIntegersArray._retn();
return isGood;
}
//=============================================================================
/*!
* FastIntersect

View File

@ -100,6 +100,11 @@ class GEOM_I_EXPORT GEOM_IMeasureOperations_i :
CORBA::Long theCheckLevel,
GEOM::ListOfLong_out theIntersections);
CORBA::Boolean CheckSelfIntersectionsFast (GEOM::GEOM_Object_ptr theShape,
CORBA::Float theDeflection,
CORBA::Double theTolerance,
GEOM::ListOfLong_out theIntersections);
CORBA::Boolean FastIntersect (GEOM::GEOM_Object_ptr theShape1,
GEOM::GEOM_Object_ptr theShape2,
CORBA::Double theTolerance,

View File

@ -58,10 +58,17 @@ def TestMeasureOperations (geompy, math):
if geompy.CheckSelfIntersections(Compound_1) == True:
raise RuntimeError, "Existing self-intersection is not detected"
####### Detect Self-intersections fast #######
if salome_version.getXVersion() > "0x70700":
cylinder = geompy.MakeCylinderRH(100, 300)
Compound_2 = geompy.MakeCompound([box, cylinder])
if geompy.CheckSelfIntersectionsFast(Compound_2) == True:
raise RuntimeError, "Existing self-intersection is not detected"
####### Detect Fast intersection #######
if salome_version.getXVersion() > "0x70501":
cylinder = geompy.MakeCylinderRH(100, 300)
if geompy.FastIntersect(box, cylinder)[0] == False:
raise RuntimeError, "Existing intersection is not detected"

View File

@ -11250,6 +11250,37 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen):
RaiseIfFailed("CheckSelfIntersections", self.MeasuOp)
return IsValid
## Detect self-intersections of the given shape with algorithm based on mesh intersections.
# @param theShape Shape to check.
# @param theDeflection Linear deflection coefficient that specifies quality of tesselation:
# - if \a theDeflection <= 0, default deflection 0.001 is used
# @param theTolerance Specifies a distance between sub-shapes used for detecting gaps:
# - if \a theTolerance <= 0, algorithm detects intersections (default behavior)
# - if \a theTolerance > 0, algorithm detects gaps
# @return TRUE, if the shape contains no self-intersections.
#
# @ref tui_check_self_intersections_fast_page "Example"
@ManageTransactions("MeasuOp")
def CheckSelfIntersectionsFast(self, theShape, theDeflection = 0.001, theTolerance = 0.0):
"""
Detect self-intersections of the given shape with algorithm based on mesh intersections.
Parameters:
theShape Shape to check.
theDeflection Linear deflection coefficient that specifies quality of tesselation:
- if theDeflection <= 0, default deflection 0.001 is used
theTolerance Specifies a distance between shapes used for detecting gaps:
- if theTolerance <= 0, algorithm detects intersections (default behavior)
- if theTolerance > 0, algorithm detects gaps
Returns:
TRUE, if the shape contains no self-intersections.
"""
# Example: see GEOM_TestMeasures.py
(IsValid, Pairs) = self.MeasuOp.CheckSelfIntersectionsFast(theShape, theDeflection, theTolerance)
RaiseIfFailed("CheckSelfIntersectionsFast", self.MeasuOp)
return IsValid
## Detect intersections of the given shapes with algorithm based on mesh intersections.
# @param theShape1 First source object
# @param theShape2 Second source object

View File

@ -26,6 +26,7 @@
#include "MeasureGUI_CheckSelfIntersectionsDlg.h"
#include "MeasureGUI.h"
#include <SUIT_MessageBox.h>
#include <SUIT_OverrideCursor.h>
#include <SUIT_Session.h>
#include <SUIT_ResourceMgr.h>
@ -58,82 +59,142 @@
//=================================================================================
MeasureGUI_CheckSelfIntersectionsDlg::MeasureGUI_CheckSelfIntersectionsDlg (GeometryGUI* GUI, QWidget* parent)
: GEOMBase_Skeleton (GUI, parent, false),
myTextView (0),
mySelButton (0),
myEditObjName (0),
myTextView1 (0),
myTextView2 (0),
mySelButton1 (0),
mySelButton2 (0),
myEditObjName1 (0),
myEditObjName2 (0),
myLevelBox (0),
myComputeButton (0),
myInteList (0),
myShapeList (0)
myComputeButton1 (0),
myComputeButton2 (0),
myInteList1 (0),
myShapeList1 (0),
myInteList2 (0),
myShapeList2 (0),
myCurrConstrId (-1)
{
SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
QPixmap image0 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_CHECK_SELF_INTERSECTIONS")));
QPixmap image1 (aResMgr->loadPixmap("GEOM", tr("ICON_SELECT")));
QPixmap image2 (aResMgr->loadPixmap("GEOM", tr("ICON_DLG_FAST_CHECK_INTERSECTIONS")));
setWindowTitle(tr("GEOM_CHECK_SELF_INTERSECTIONS"));
/***************************************************************/
mainFrame()->GroupConstructors->setTitle(tr("GEOM_CHECK_SELF_INTERSECTIONS"));
mainFrame()->RadioButton1->setIcon(image0);
mainFrame()->RadioButton2->setAttribute( Qt::WA_DeleteOnClose );
mainFrame()->RadioButton2->close();
mainFrame()->RadioButton2->setIcon(image2);;
mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose );
mainFrame()->RadioButton3->close();
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"));
/***************************************************************/
/* SIMPLE SELF-INTERSECTION constructor
/***************************************************************/
mySimpleGrp = 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 *aSummaryLbl1 = new QLabel(tr("GEOM_CHECK_INTE_SUMMARY"));
QFont aFont (TEXTEDIT_FONT_FAMILY, TEXTEDIT_FONT_SIZE);
aFont.setStyleHint(QFont::TypeWriter, QFont::PreferAntialias);
myTextView = new QTextBrowser;
myTextView->setReadOnly(true);
myTextView->setFont(aFont);
myTextView1 = new QTextBrowser;
myTextView1->setReadOnly(true);
myTextView1->setFont(aFont);
mySelButton = new QPushButton;
mySelButton->setIcon(image1);
mySelButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
mySelButton1 = new QPushButton;
mySelButton1->setIcon(image1);
mySelButton1->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
myEditObjName = new QLineEdit;
myEditObjName->setReadOnly(true);
myEditObjName1 = new QLineEdit;
myEditObjName1->setReadOnly(true);
myLevelBox = new QComboBox;
myComputeButton = new QPushButton(tr("GEOM_CHECK_INTE_COMPUTE"));
myComputeButton1 = new QPushButton(tr("GEOM_CHECK_INTE_COMPUTE"));
myInteList = new QListWidget;
myInteList->setSelectionMode(QAbstractItemView::ExtendedSelection);
myShapeList = new QListWidget;
myShapeList->setSelectionMode(QAbstractItemView::ExtendedSelection);
myInteList1 = new QListWidget;
myInteList1->setSelectionMode(QAbstractItemView::ExtendedSelection);
myShapeList1 = new QListWidget;
myShapeList1->setSelectionMode(QAbstractItemView::ExtendedSelection);
QGridLayout *aGrpLayout = new QGridLayout(aGrp);
QGridLayout *aGrpLayout1 = new QGridLayout(mySimpleGrp);
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(aGrp);
aGrpLayout1->setMargin(9);
aGrpLayout1->setSpacing(6);
aGrpLayout1->addWidget(anObjLbl, 0, 0);
aGrpLayout1->addWidget(mySelButton1, 0, 1);
aGrpLayout1->addWidget(myEditObjName1, 0, 2);
aGrpLayout1->addWidget(aLevelLbl, 1, 0);
aGrpLayout1->addWidget(myLevelBox, 1, 1, 1, 2);
aGrpLayout1->addWidget(myComputeButton1, 2, 0, 1, 3);
aGrpLayout1->addWidget(aSummaryLbl1, 3, 0);
aGrpLayout1->addWidget(myTextView1, 4, 0, 1, 3);
aGrpLayout1->addWidget(anInteLbl, 5, 0);
aGrpLayout1->addWidget(aShapeLbl, 5, 2);
aGrpLayout1->addWidget(myInteList1, 6, 0, 1, 2);
aGrpLayout1->addWidget(myShapeList1, 6, 2);
/***************************************************************/
/* FAST SELF-INTERSECTION constructor
/***************************************************************/
myFastGrp = new QGroupBox(tr("GEOM_CHECK_INT_OBJ"), centralWidget());
QLabel *anObjLbl2 = new QLabel(tr("GEOM_OBJECT"), myFastGrp);
QLabel *aDeflectLbl = new QLabel(tr("GEOM_CHECK_INT_DEFLECT"), myFastGrp);
QLabel *aSummaryLbl2 = new QLabel(tr("GEOM_CHECK_INTE_SUMMARY"));
QLabel *anInteLbl2 = new QLabel(tr("GEOM_CHECK_INTE_INTERSECTIONS"), myFastGrp);
QLabel *aShapeLbl2 = new QLabel(tr("GEOM_CHECK_INTE_SUBSHAPES"), myFastGrp);
myHelpFileName = "check_self_intersections_page.html";
mySelButton2 = new QPushButton(myFastGrp);
mySelButton2->setIcon(image1);
mySelButton2->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
myEditObjName2 = new QLineEdit(myFastGrp);
myEditObjName2->setReadOnly(true);
myDeflection = new SalomeApp_DoubleSpinBox(myFastGrp);
myDetGaps = new QCheckBox(tr( "GEOM_CHECK_INT_DETECT_GAPS" ));
myTolerance = new SalomeApp_DoubleSpinBox(myFastGrp);
myComputeButton2 = new QPushButton(tr("GEOM_CHECK_INTE_COMPUTE"));
myTextView2 = new QTextBrowser;
myTextView2->setReadOnly(true);
myTextView2->setFont(aFont);
myInteList2 = new QListWidget(myFastGrp);
myInteList2->setSelectionMode(QAbstractItemView::ExtendedSelection);
myShapeList2 = new QListWidget(myFastGrp);
myShapeList2->setSelectionMode(QAbstractItemView::ExtendedSelection);
QGridLayout *aGrpLayout2 = new QGridLayout(myFastGrp);
aGrpLayout2->setMargin(9);
aGrpLayout2->setSpacing(6);
aGrpLayout2->addWidget(anObjLbl2, 0, 0);
aGrpLayout2->addWidget(mySelButton2, 0, 1);
aGrpLayout2->addWidget(myEditObjName2, 0, 2);
aGrpLayout2->addWidget(aDeflectLbl, 1, 0);
aGrpLayout2->addWidget(myDeflection, 1, 1, 1, 2);
aGrpLayout2->addWidget(myDetGaps, 2, 0);
aGrpLayout2->addWidget(myTolerance, 2, 1, 1, 2);
aGrpLayout2->addWidget(myComputeButton2, 3, 0, 1, 3);
aGrpLayout2->addWidget(aSummaryLbl2, 4, 0);
aGrpLayout2->addWidget(myTextView2, 5, 0, 1, 3);
aGrpLayout2->addWidget(anInteLbl2, 6, 0);
aGrpLayout2->addWidget(aShapeLbl2, 6, 1, 1, 2);
aGrpLayout2->addWidget(myInteList2, 7, 0);
aGrpLayout2->addWidget(myShapeList2, 7, 1, 1, 2);
/***************************************************************/
QVBoxLayout* layout2 = new QVBoxLayout (centralWidget());
layout2->setMargin(0); layout2->setSpacing(6);
layout2->addWidget(mySimpleGrp);
layout2->addWidget(myFastGrp);
/* Initialisation */
Init();
@ -161,32 +222,65 @@ void MeasureGUI_CheckSelfIntersectionsDlg::Init()
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);
myComputeButton1->setEnabled(false);
connect(mySelButton1, SIGNAL(clicked()),
this, SLOT(SetEditCurrentArgument()));
connect(myInteList1, SIGNAL(itemSelectionChanged()),
SLOT(onInteListSelectionChanged()));
connect(myShapeList1, SIGNAL(itemSelectionChanged()),
SLOT(onSubShapesListSelectionChanged()));
connect(myLevelBox, SIGNAL(currentIndexChanged(int)),
this, SLOT(clear()));
connect(myComputeButton1, SIGNAL(clicked()), this, SLOT(onCompute()));
/***************************************************************/
myObj2.nullify();
myEditObjName2->setText("");
myEditObjName2->setEnabled(true);
myDetGaps->setChecked(false);
initSpinBox(myTolerance, 0, MAX_NUMBER, 1);
myTolerance->setValue(0);
myTolerance->setEnabled(false);
myComputeButton2->setEnabled(false);
// Obtain deflection from preferences
SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
initSpinBox(myDeflection, 1e-3, 1.0, 1e-3);
myDeflection->setValue(qMax(1e-3, resMgr->doubleValue("Geometry", "deflection_coeff", 1e-3)));
connect( mySelButton2, SIGNAL(clicked()),
this, SLOT(SetEditCurrentArgument()));
connect( myDetGaps, SIGNAL(toggled(bool)), this, SLOT(OnGaps(bool)));
connect( myTolerance, SIGNAL(valueChanged(double)), this, SLOT(clear()));
connect( myDeflection, SIGNAL(valueChanged(double)), this, SLOT(clear()));
connect( myInteList2, SIGNAL(itemSelectionChanged()),
SLOT(onInteListSelectionChanged()));
connect( myShapeList2, SIGNAL(itemSelectionChanged()),
SLOT(onSubShapesListSelectionChanged()));
connect( myComputeButton2, SIGNAL(clicked()), this, SLOT(onCompute()));
/***************************************************************/
connect(this, SIGNAL(constructorsClicked(int)),
this, SLOT(ConstructorsClicked(int)));
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);
ConstructorsClicked(0);
activateSelection();
SelectionIntoArgument();
}
@ -197,20 +291,58 @@ void MeasureGUI_CheckSelfIntersectionsDlg::Init()
//=================================================================================
void MeasureGUI_CheckSelfIntersectionsDlg::clear()
{
myTextView->setText("");
getTextView()->setText("");
getComputeButton()->setEnabled(true);
myInteList->blockSignals(true);
myShapeList->blockSignals(true);
myInteList->clear();
myShapeList->clear();
myInteList->blockSignals(false);
myShapeList->blockSignals(false);
getInteList()->blockSignals(true);
getShapeList()->blockSignals(true);
getInteList()->clear();
getShapeList()->clear();
getInteList()->blockSignals(false);
getShapeList()->blockSignals(false);
erasePreview();
buttonOk()->setEnabled(false);
buttonApply()->setEnabled(false);
myComputeButton->setEnabled(true);
}
//=================================================================================
// function : ConstructorsClicked()
// purpose : Radio button management
//=================================================================================
void MeasureGUI_CheckSelfIntersectionsDlg::ConstructorsClicked(int constructorId)
{
if (myCurrConstrId == constructorId)
return;
disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
switch (constructorId) {
case 0:
myHelpFileName = "check_self_intersections_page.html";
mySimpleGrp->show();
myFastGrp->hide();
break;
case 1:
myHelpFileName = "check_self_intersections_fast_page.html";
mySimpleGrp->hide();
myFastGrp->show();
break;
}
myCurrConstrId = constructorId;
connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
this, SLOT(SelectionIntoArgument()));
qApp->processEvents();
updateGeometry();
resize(minimumSizeHint());
processPreview();
//updateButtonState();
activateSelection();
SelectionIntoArgument();
}
//=================================================================================
@ -223,7 +355,7 @@ void MeasureGUI_CheckSelfIntersectionsDlg::onCompute()
QString anErrMsg("");
if (!findSelfIntersections(hasSelfInte, anErrMsg)) {
myTextView->setText(anErrMsg);
getTextView()->setText(anErrMsg);
return;
}
@ -243,12 +375,12 @@ void MeasureGUI_CheckSelfIntersectionsDlg::onCompute()
aMsg += anErrMsg;
}
myTextView->setText(aMsg);
getTextView()->setText(aMsg);
// Pairs
QStringList anInteList;
QString anInteStr ("");
int nbPairs = myInters->length()/2;
int nbPairs = getInters()->length()/2;
for (int i = 1; i <= nbPairs; i++) {
anInteStr = "Intersection # ";
@ -256,8 +388,8 @@ void MeasureGUI_CheckSelfIntersectionsDlg::onCompute()
anInteList.append(anInteStr);
}
myInteList->addItems(anInteList);
myComputeButton->setEnabled(false);
getInteList()->addItems(anInteList);
getComputeButton()->setEnabled(false);
}
//=================================================================================
@ -291,7 +423,23 @@ void MeasureGUI_CheckSelfIntersectionsDlg::DeactivateActiveDialog()
//=================================================================================
void MeasureGUI_CheckSelfIntersectionsDlg::activateSelection()
{
globalSelection(GEOM_ALLSHAPES);
switch (getConstructorId()) {
case 0:
globalSelection(GEOM_ALLSHAPES);
break;
case 1:
TColStd_MapOfInteger aTypes;
aTypes.Add(GEOM_COMPOUND );
aTypes.Add(GEOM_SOLID );
aTypes.Add(GEOM_SHELL);
aTypes.Add(GEOM_FACE);
globalSelection(aTypes);
std::list<int> needTypes;
needTypes.push_back( TopAbs_FACE ), needTypes.push_back( TopAbs_SHELL ), needTypes.push_back( TopAbs_SOLID ), needTypes.push_back( TopAbs_COMPOUND );
localSelection(GEOM::GEOM_Object::_nil(), needTypes );
break;
}
}
//=================================================================================
@ -313,7 +461,11 @@ bool MeasureGUI_CheckSelfIntersectionsDlg::ClickOnApply()
if ( !onAccept() )
return false;
clear();
initName();
ConstructorsClicked(getConstructorId());
return true;
}
@ -341,7 +493,7 @@ GEOM::GEOM_IOperations_ptr MeasureGUI_CheckSelfIntersectionsDlg::createOperation
//=================================================================================
bool MeasureGUI_CheckSelfIntersectionsDlg::isValid( QString& )
{
return !myObj->_is_nil();
return getObj().isNull();
}
//=================================================================================
@ -350,37 +502,51 @@ bool MeasureGUI_CheckSelfIntersectionsDlg::isValid( QString& )
//=================================================================================
void MeasureGUI_CheckSelfIntersectionsDlg::SetEditCurrentArgument()
{
myEditObjName->setFocus();
getEditObjName()->setFocus();
SelectionIntoArgument();
}
//=================================================================================
// function : OnGaps()
// purpose :
//=================================================================================
void MeasureGUI_CheckSelfIntersectionsDlg::OnGaps(bool checked)
{
clear();
myTolerance->setEnabled(checked);
}
//=================================================================================
// function : SelectionIntoArgument
// purpose :
//=================================================================================
void MeasureGUI_CheckSelfIntersectionsDlg::SelectionIntoArgument()
{
QList<TopAbs_ShapeEnum> typesLst;
if ( getConstructorId() == 0 ) {
typesLst << TopAbs_COMPOUND
<< TopAbs_COMPSOLID
<< TopAbs_SOLID
<< TopAbs_SHELL
<< TopAbs_FACE
<< TopAbs_WIRE
<< TopAbs_EDGE
<< TopAbs_VERTEX
<< TopAbs_SHAPE;
} else {
typesLst << TopAbs_FACE
<< TopAbs_SHELL
<< TopAbs_SOLID
<< TopAbs_COMPOUND;
}
// Clear the dialog.
clear();
myObj = GEOM::GEOM_Object::_nil();
LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
SALOME_ListIO aSelList;
aSelMgr->selectedObjects(aSelList);
GEOM::GeomObjPtr aSelectedObject = getSelected( typesLst );
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));
(getConstructorId() == 0 ? myObj1 :myObj2) = aSelectedObject;
getEditObjName()->setText(getObj() ? GEOMBase::GetName(getObj().get()) : "");
}
//=================================================================================
@ -400,7 +566,7 @@ void MeasureGUI_CheckSelfIntersectionsDlg::enterEvent(QEvent *)
bool MeasureGUI_CheckSelfIntersectionsDlg::findSelfIntersections
(bool &HasSelfInte, QString &theErrMsg)
{
if (myObj->_is_nil()) {
if (getObj()->_is_nil()) {
return false;
}
@ -413,10 +579,14 @@ bool MeasureGUI_CheckSelfIntersectionsDlg::findSelfIntersections
SUIT_OverrideCursor wc;
try {
HasSelfInte = !anOper->CheckSelfIntersections(myObj, aLevel, myInters);
nbPairs = myInters->length()/2;
if ( getConstructorId() == 0 ) {
HasSelfInte = !anOper->CheckSelfIntersections(myObj1.get(), aLevel, myInters1);
} else {
HasSelfInte = !anOper->CheckSelfIntersectionsFast(myObj2.get(), getTolerance(), getDeflection(), myInters2);
}
nbPairs = getInters()->length()/2;
if (nbPairs*2 != myInters->length()) {
if (nbPairs*2 != getInters()->length()) {
isOK = false;
}
}
@ -426,7 +596,7 @@ bool MeasureGUI_CheckSelfIntersectionsDlg::findSelfIntersections
}
if (!anOper->IsDone()) {
if (myInters->length() == 0) {
if (getInters()->length() == 0) {
theErrMsg = tr(anOper->GetErrorCode());
isOK = false;
} else {
@ -447,24 +617,24 @@ bool MeasureGUI_CheckSelfIntersectionsDlg::findSelfIntersections
void MeasureGUI_CheckSelfIntersectionsDlg::onInteListSelectionChanged()
{
erasePreview();
myShapeList->clear();
getShapeList()->clear();
TopoDS_Shape aSelShape;
if (!myObj->_is_nil() && GEOMBase::GetShape(myObj, aSelShape)) {
if (!getObj()->_is_nil() && GEOMBase::GetShape(getObj().get(), aSelShape)) {
TopTools_IndexedMapOfShape anIndices;
TopExp::MapShapes(aSelShape, anIndices);
int nbSelected = myInteList->selectedItems().size();
int nbSelected = getInteList()->selectedItems().size();
for (int i = 0; i < myInteList->count(); i++) {
if ( myInteList->item(i)->isSelected() ) {
for (int i = 0; i < getInteList()->count(); i++) {
if ( getInteList()->item(i)->isSelected() ) {
if ( nbSelected > 1 )
myShapeList->addItem(QString("--- #%1 ---").arg(i+1));
getShapeList()->addItem(QString("--- #%1 ---").arg(i+1));
for (int j = 0; j < 2; j++) {
TopoDS_Shape aSubShape = anIndices.FindKey(myInters[i*2+j]);
TopoDS_Shape aSubShape = anIndices.FindKey(getInters()[i*2+j]);
QString aType = GEOMBase::GetShapeTypeString(aSubShape);
myShapeList->addItem(QString("%1_%2").arg(aType).arg(myInters[i*2+j]));
myShapeList->item(myShapeList->count()-1)->setData(Qt::UserRole, myInters[i*2+j]);
getShapeList()->addItem(QString("%1_%2").arg(aType).arg(getInters()[i*2+j]));
getShapeList()->item(getShapeList()->count()-1)->setData(Qt::UserRole, getInters()[i*2+j]);
}
}
}
@ -480,7 +650,7 @@ void MeasureGUI_CheckSelfIntersectionsDlg::onSubShapesListSelectionChanged()
erasePreview();
// Selected IDs
QList<QListWidgetItem*> selected = myShapeList->selectedItems();
QList<QListWidgetItem*> selected = getShapeList()->selectedItems();
QList<int> aIds;
foreach(QListWidgetItem* item, selected) {
int idx = item->data(Qt::UserRole).toInt();
@ -492,7 +662,7 @@ void MeasureGUI_CheckSelfIntersectionsDlg::onSubShapesListSelectionChanged()
TopoDS_Shape aSelShape;
TopoDS_Shape aSubShape;
TopTools_IndexedMapOfShape anIndices;
if (!myObj->_is_nil() && GEOMBase::GetShape(myObj, aSelShape)) {
if (!getObj()->_is_nil() && GEOMBase::GetShape(getObj().get(), aSelShape)) {
TopExp::MapShapes(aSelShape, anIndices);
getDisplayer()->SetColor(Quantity_NOC_RED);
getDisplayer()->SetWidth(3);
@ -500,11 +670,11 @@ void MeasureGUI_CheckSelfIntersectionsDlg::onSubShapesListSelectionChanged()
foreach(int idx, aIds) {
aSubShape = anIndices.FindKey(idx);
try {
SALOME_Prs* aPrs = !aSubShape.IsNull() ? getDisplayer()->BuildPrs(aSubShape) : 0;
if (aPrs) displayPreview(aPrs, true);
SALOME_Prs* aPrs = !aSubShape.IsNull() ? getDisplayer()->BuildPrs(aSubShape) : 0;
if (aPrs) displayPreview(aPrs, true);
}
catch (const SALOME::SALOME_Exception& e) {
SalomeApp_Tools::QtCatchCorbaException(e);
SalomeApp_Tools::QtCatchCorbaException(e);
}
}
}
@ -526,15 +696,15 @@ bool MeasureGUI_CheckSelfIntersectionsDlg::execute(ObjectList& objects)
TColStd_IndexedMapOfInteger aMapIndex;
QList<int> pairs;
int nbSelected = myInteList->selectedItems().size();
int nbSelected = getInteList()->selectedItems().size();
// Collect the map of indices
for (int i = 0; i < myInteList->count(); i++) {
if ( nbSelected < 1 || myInteList->item(i)->isSelected() ) {
aMapIndex.Add(myInters[i*2]);
aMapIndex.Add(myInters[i*2 + 1]);
pairs << myInters[i*2];
pairs << myInters[i*2 + 1];
for (int i = 0; i < getInteList()->count(); i++) {
if ( nbSelected < 1 || getInteList()->item(i)->isSelected() ) {
aMapIndex.Add(getInters()[i*2]);
aMapIndex.Add(getInters()[i*2 + 1]);
pairs << getInters()[i*2];
pairs << getInters()[i*2 + 1];
}
}
@ -547,7 +717,7 @@ bool MeasureGUI_CheckSelfIntersectionsDlg::execute(ObjectList& objects)
for (int i = 1; i <= aMapIndex.Extent(); i++)
anArray[i-1] = aMapIndex.FindKey(i);
GEOM::ListOfGO_var aList = shapesOper->MakeSubShapes(myObj, anArray);
GEOM::ListOfGO_var aList = shapesOper->MakeSubShapes(getObj().get(), anArray);
// Make compounds
for (int i = 0; i < pairs.count()/2; i++) {
@ -562,6 +732,27 @@ bool MeasureGUI_CheckSelfIntersectionsDlg::execute(ObjectList& objects)
return true;
}
//=================================================================================
// function : getDeflection
// purpose :
//=================================================================================
float MeasureGUI_CheckSelfIntersectionsDlg::getDeflection()
{
return (float)myDeflection->value();
}
//=================================================================================
// function : getTolerance
// purpose :
//=================================================================================
double MeasureGUI_CheckSelfIntersectionsDlg::getTolerance()
{
double aVal = myTolerance->value();
if (!myDetGaps->isChecked() || aVal < 0.0)
return 0.0;
return aVal;
}
//================================================================
// Function : getFather
// Purpose : Get father object for object to be added in study
@ -570,5 +761,54 @@ bool MeasureGUI_CheckSelfIntersectionsDlg::execute(ObjectList& objects)
GEOM::GEOM_Object_ptr MeasureGUI_CheckSelfIntersectionsDlg::getFather
(GEOM::GEOM_Object_ptr)
{
return myObj;
return getObj().get();
}
//=================================================================================
// function : getSourceObjects
// purpose : virtual method to get source objects
//=================================================================================
QList<GEOM::GeomObjPtr> MeasureGUI_CheckSelfIntersectionsDlg::getSourceObjects()
{
QList<GEOM::GeomObjPtr> res;
res << getObj();
return res;
}
//=================================================================================
// GETTERS
//=================================================================================
QTextBrowser* MeasureGUI_CheckSelfIntersectionsDlg::getTextView()
{
return ( getConstructorId() == 0 ? myTextView1 : myTextView2 );
}
QListWidget* MeasureGUI_CheckSelfIntersectionsDlg::getInteList()
{
return ( getConstructorId() == 0 ? myInteList1 : myInteList2 );
}
QListWidget* MeasureGUI_CheckSelfIntersectionsDlg::getShapeList()
{
return ( getConstructorId() == 0 ? myShapeList1 : myShapeList1 );
}
QPushButton* MeasureGUI_CheckSelfIntersectionsDlg::getComputeButton()
{
return ( getConstructorId() == 0 ? myComputeButton1 : myComputeButton2 );
}
QLineEdit* MeasureGUI_CheckSelfIntersectionsDlg::getEditObjName()
{
return ( getConstructorId() == 0 ? myEditObjName1 : myEditObjName2 );
}
GEOM::GeomObjPtr MeasureGUI_CheckSelfIntersectionsDlg::getObj()
{
return ( getConstructorId() == 0 ? myObj1 : myObj2 );
}
GEOM::ListOfLong_var MeasureGUI_CheckSelfIntersectionsDlg::getInters()
{
return ( getConstructorId() == 0 ? myInters1 : myInters2 );
}

View File

@ -54,6 +54,7 @@ protected:
virtual bool execute(ObjectList &);
virtual bool extractPrefix() const;
virtual GEOM::GEOM_Object_ptr getFather (GEOM::GEOM_Object_ptr);
virtual QList<GEOM::GeomObjPtr> getSourceObjects();
private slots:
@ -67,6 +68,9 @@ private slots:
void DeactivateActiveDialog();
void SelectionIntoArgument();
void SetEditCurrentArgument();
void ConstructorsClicked (int);
void OnGaps(bool);
private:
@ -76,18 +80,46 @@ private:
bool findSelfIntersections
(bool &HasSelfInte,
QString &theErrMsg);
float getDeflection();
double getTolerance();
// Getters
QTextBrowser* getTextView();
QListWidget* getInteList();
QListWidget* getShapeList();
QPushButton* getComputeButton();
QLineEdit* getEditObjName();
GEOM::GeomObjPtr getObj();
GEOM::ListOfLong_var getInters();
private:
QTextBrowser *myTextView;
QPushButton *mySelButton;
QLineEdit *myEditObjName;
int myCurrConstrId;
// simple
QPushButton *myComputeButton1;
QGroupBox *mySimpleGrp;
QTextBrowser *myTextView1;
QPushButton *mySelButton1;
QLineEdit *myEditObjName1;
QComboBox *myLevelBox;
QPushButton *myComputeButton;
QListWidget *myInteList;
QListWidget *myShapeList;
GEOM::GEOM_Object_var myObj;
GEOM::ListOfLong_var myInters;
QListWidget *myInteList1;
QListWidget *myShapeList1;
GEOM::GeomObjPtr myObj1;
GEOM::ListOfLong_var myInters1;
// fast
QPushButton *myComputeButton2;
QGroupBox *myFastGrp;
QTextBrowser *myTextView2;
QPushButton *mySelButton2;
QLineEdit *myEditObjName2;
QCheckBox *myDetGaps;
SalomeApp_DoubleSpinBox *myTolerance;
SalomeApp_DoubleSpinBox *myDeflection;
QListWidget *myInteList2;
QListWidget *myShapeList2;
GEOM::GeomObjPtr myObj2;
GEOM::ListOfLong_var myInters2;
GEOM::GEOM_IShapesOperations_var myShapesOper;
};
#endif // MEASUREGUI_CHECKSELFINTERDLG_H