From 7c036f24ffc367e0d6d83240860a5c39591d25aa Mon Sep 17 00:00:00 2001 From: akl Date: Tue, 28 Apr 2015 12:21:22 +0400 Subject: [PATCH] 0022762: [EDF] Fast detection of face/face face/solid solid/solid interference - Part 2: introduce CheckSelfIntersectionsFast function --- doc/salome/examples/CMakeLists.txt | 1 + .../examples/check_self_intersections.py | 16 +- .../examples/check_self_intersections_fast.py | 21 + doc/salome/gui/GEOM/images/measures11.png | Bin 33219 -> 36082 bytes doc/salome/gui/GEOM/images/measures13.png | Bin 0 -> 36327 bytes .../GEOM/input/check_self_intersections.doc | 31 ++ .../tui_check_self_intersections_fast.doc | 6 + .../gui/GEOM/input/tui_measurement_tools.doc | 1 + .../gui/GEOM/input/tui_test_measures.doc | 5 +- idl/GEOM_Gen.idl | 15 + src/GEOMGUI/GEOM_msg_en.ts | 12 + src/GEOMGUI/GEOM_msg_fr.ts | 12 + src/GEOMGUI/GEOM_msg_ja.ts | 12 + src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx | 104 +++- src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx | 5 + src/GEOM_I/GEOM_IMeasureOperations_i.cc | 43 ++ src/GEOM_I/GEOM_IMeasureOperations_i.hh | 5 + src/GEOM_SWIG/GEOM_TestMeasures.py | 24 +- src/GEOM_SWIG/geomBuilder.py | 31 ++ .../MeasureGUI_CheckSelfIntersectionsDlg.cxx | 484 +++++++++++++----- .../MeasureGUI_CheckSelfIntersectionsDlg.h | 50 +- 21 files changed, 719 insertions(+), 159 deletions(-) create mode 100644 doc/salome/examples/check_self_intersections_fast.py create mode 100644 doc/salome/gui/GEOM/images/measures13.png create mode 100644 doc/salome/gui/GEOM/input/tui_check_self_intersections_fast.doc diff --git a/doc/salome/examples/CMakeLists.txt b/doc/salome/examples/CMakeLists.txt index a437b4078..e9dc70f96 100644 --- a/doc/salome/examples/CMakeLists.txt +++ b/doc/salome/examples/CMakeLists.txt @@ -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 diff --git a/doc/salome/examples/check_self_intersections.py b/doc/salome/examples/check_self_intersections.py index 8df91b9fe..f70a54540 100644 --- a/doc/salome/examples/check_self_intersections.py +++ b/doc/salome/examples/check_self_intersections.py @@ -7,9 +7,15 @@ from salome.geom import geomBuilder geompy = geomBuilder.New(salome.myStudy) # create a box -box = geompy.MakeBoxDXDYDZ(100,30,100) -IsValid = geompy.CheckSelfIntersections(box) -if IsValid == 0: - raise RuntimeError, "Box with self-intersections created" +box = geompy.MakeBoxDXDYDZ(100,100,100) +# create a cylinder +cylinder = geompy.MakeCylinderRH(100, 300) +# make a compound +compound = geompy.MakeCompound([box, cylinder]) + +# check self-intersection +IsValid = geompy.CheckSelfIntersections(compound) +if not IsValid: + print "Shape is self-intersected!" else: - print "\nBox is valid" + print "No self-intersection detected in a shape" diff --git a/doc/salome/examples/check_self_intersections_fast.py b/doc/salome/examples/check_self_intersections_fast.py new file mode 100644 index 000000000..83c8a741e --- /dev/null +++ b/doc/salome/examples/check_self_intersections_fast.py @@ -0,0 +1,21 @@ +# 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,100,100) +# create a cylinder +cylinder = geompy.MakeCylinderRH(100, 300) +# make a compound +compound = geompy.MakeCompound([box, cylinder]) + +# check self-intersection +IsValid = geompy.CheckSelfIntersectionsFast(compound) +if not IsValid: + print "Shape is self-intersected!" +else: + print "No self-intersection detected in a shape" diff --git a/doc/salome/gui/GEOM/images/measures11.png b/doc/salome/gui/GEOM/images/measures11.png index 6ee44987416555bf22ca65b9ea84c5a5835cb1b6..562714d31227c690518d3a8011b2e264e248096d 100644 GIT binary patch literal 36082 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 C_0W9) literal 33219 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 K0<^<(Q; zXD$<0;u2}@q61sDWEI*F+*=fRlqnLQ-H$hmN-P$MBJ%p@_F{kFBi$sBXD; z+uHhq4iy}Eu#vceNvvH`LYIdZc9l~%!H^;VOM#BYM0t!y3K<}oNP6(-5jl}wB@v!# zO-)J>w7zn=Z5pd0{W(n~qhe&E2(IjrxiCOuT>7WVN(E;N3ERl?F8!4blI+VE>O(fa zY0ig9KL+KocpJeS!ZnU428n@{l?u_C#dQ==TZZCv^w-u=clpA3RMOJIf>q{5ByJYb z$G9B0KaHR#EIU|`nwglHNla5y*8^W3^(+SEO7xB*EMdYTFM;P0_|Iw`9z#b9_o=+R zJUpysn;Z8}1V_-#cKi9zBfHmIYC+x*X-hG&3Xj2s&zZOisq%pKlmk7zg+WJDV~VGG z3)xwl=r|8Okhog)bIEsP3xOnhO01}Uu?Dsz>r!8OL6g2~JAU#GtSWeCJ$a^iX=**+ zcAOHbr$uLus$od2AMA1nR*H8OCGm(X7lSpTpd- ze*56cJ7IVJApEzJYg6+H=a$jbzG7H1;rSjV`AA_#DBPuR==6_}ZQRJp&2CHwxHhIrg`8;agGPP`LzDKJ?^O;tNDF+%EMxTgunm8UOV-Ymg@TP33gRyY z%Icf#3$SPOmD9_~5B|P@)-{A`kIqoZbN2hYUq3#_A=Q(4MrB-q;MI&jt;7@{>eVwa zf>Q>(sX(IM2c4qil{E_VCq*Bcw{T}d0nz)wo_3&B_S;su>)B1t(VO{L{+e`_ak~Pe zjL5+Yv2hGW?vYdKr?bnld$#*={`Nh8JNGkdwYz1VZV66ZOlsAdLk6E$f`^gXk@dkV z2dgdz$u-TBy6qXsI!56)l5K08zt1#{rTA(D`s4iXoeS*{%5K~*e%#Jk0=-Xy=dT#X z&oPJC;aL;dcgggfW|;?=%z6)64qna9kS$$n%Nx0<)=_-v3-dulcuB|B*H#mBUH)_) z{$@%K^;Jhl2g&OT3#V8mQ`G4CE%lhvEV~+(-G!o&sa1m{}Qh} zZP9i~)l^H_yU|QaH{{@{kn9TCZ*Qpv7f2-1pEL5u)z$HRFRjnU-`rU-r$rf{x$XI3 zBOVkMFJShytj)WoyOoT3lHya|u9n?o)EpsV21Y0`wrjIDP$kG3h?uiw368w5JyUyN zkoE;Cp7iG5lxIXVIZ!zX{F{jSSMl@j6%g?%vg$&DpzamjE0=8K<<;d}6#{lK**c){ z=>J-5{i{y<+djm$?dG$l{o;nc42-I)2U&}L)U&-CEH&w{XD>nIl?vb-= ZT>HvOx3_pmrr^p+XB5uMC!a8I`wyB{j7tCj diff --git a/doc/salome/gui/GEOM/images/measures13.png b/doc/salome/gui/GEOM/images/measures13.png new file mode 100644 index 0000000000000000000000000000000000000000..6e9deb5663330caa773d7354ecb713482f5ccb2c GIT binary patch literal 36327 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 Self-intersections in the Main Menu select +Inspection - > Detect Self-intersections. + +There are two ways to check self-intersections. + +\anchor check_self_intersections_topological +

Check topological intersections

+ This operation checks the topology of the selected shape to detect self-intersections. \image html measures11.png @@ -29,5 +37,28 @@ where: \n See also a \ref tui_check_self_intersections_page "TUI example". +\anchor check_self_intersections_fast +

Fast intersection

+ +This operations allows to quickly detect self-interferences of the given shape by means of 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 Result: Boolean. +\n TUI Command: geompy.CheckSelfIntersectionsFast(theShape, theDeflection, theTolerance), \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". */ \ No newline at end of file diff --git a/doc/salome/gui/GEOM/input/tui_check_self_intersections_fast.doc b/doc/salome/gui/GEOM/input/tui_check_self_intersections_fast.doc new file mode 100644 index 000000000..c8266e331 --- /dev/null +++ b/doc/salome/gui/GEOM/input/tui_check_self_intersections_fast.doc @@ -0,0 +1,6 @@ +/*! + +\page tui_check_self_intersections_fast_page Detect Self-intersections fast +\tui_script{check_self_intersections_fast.py} + +*/ diff --git a/doc/salome/gui/GEOM/input/tui_measurement_tools.doc b/doc/salome/gui/GEOM/input/tui_measurement_tools.doc index 6e83325c3..be111dbb1 100644 --- a/doc/salome/gui/GEOM/input/tui_measurement_tools.doc +++ b/doc/salome/gui/GEOM/input/tui_measurement_tools.doc @@ -19,6 +19,7 @@
  • \subpage tui_check_compound_of_blocks_page
  • \subpage tui_get_non_blocks_page
  • \subpage tui_check_self_intersections_page
  • +
  • \subpage tui_check_self_intersections_fast_page
  • \subpage tui_fast_intersection_page
  • diff --git a/doc/salome/gui/GEOM/input/tui_test_measures.doc b/doc/salome/gui/GEOM/input/tui_test_measures.doc index b954b7f60..3e147f388 100644 --- a/doc/salome/gui/GEOM/input/tui_test_measures.doc +++ b/doc/salome/gui/GEOM/input/tui_test_measures.doc @@ -17,7 +17,10 @@ \until Detect Self-intersections \anchor swig_CheckSelfIntersections -\until Detect Fast intersection +\until Detect Self-intersections fast + +\anchor swig_CheckSelfIntersectionsFast +\until Fast intersection \anchor swig_FastIntersection \until WhatIs diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 87a912edc..88edc8f07 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -4448,6 +4448,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 diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 8c43d9c84..9d86a99db 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -7274,6 +7274,10 @@ Do you want to create new material? MeasureGUI_CheckSelfIntersectionsDlg + + GEOM_CHECK_INTERSECT_TYPE + Self-intersection Detection Type + GEOM_CHECK_INTE_INTERSECTIONS Self-intersections @@ -7338,6 +7342,14 @@ Do you want to create new material? GEOM_CHECK_INTE_ALL Face to Face + all above + + GEOM_CHECK_INT_DEFLECT + Deflection coefficient + + + GEOM_CHECK_INT_DETECT_GAPS + Detect gaps with tolerance + MeasureGUI_FastCheckIntersectionsDlg diff --git a/src/GEOMGUI/GEOM_msg_fr.ts b/src/GEOMGUI/GEOM_msg_fr.ts index 0d8d4623c..06169dafb 100644 --- a/src/GEOMGUI/GEOM_msg_fr.ts +++ b/src/GEOMGUI/GEOM_msg_fr.ts @@ -7274,6 +7274,10 @@ Voulez-vous en créer un nouveau ? MeasureGUI_CheckSelfIntersectionsDlg + + GEOM_CHECK_INTERSECT_TYPE + Self-intersection Detection Type + GEOM_CHECK_INTE_INTERSECTIONS Auto-intersections @@ -7338,6 +7342,14 @@ Voulez-vous en créer un nouveau ? GEOM_CHECK_INTE_ALL Face à Face + tout au-delà + + GEOM_CHECK_INT_DEFLECT + Deflection coefficient + + + GEOM_CHECK_INT_DETECT_GAPS + Detect gaps with tolerance + MeasureGUI_FastCheckIntersectionsDlg diff --git a/src/GEOMGUI/GEOM_msg_ja.ts b/src/GEOMGUI/GEOM_msg_ja.ts index 6efba76e0..a92a3e60b 100644 --- a/src/GEOMGUI/GEOM_msg_ja.ts +++ b/src/GEOMGUI/GEOM_msg_ja.ts @@ -7271,6 +7271,10 @@ MeasureGUI_CheckSelfIntersectionsDlg + + GEOM_CHECK_INTERSECT_TYPE + Self-intersection Detection Type + GEOM_CHECK_INTE_INTERSECTIONS 自己交差 @@ -7335,6 +7339,14 @@ GEOM_CHECK_INTE_ALL 面から面と上記すべて + + GEOM_CHECK_INT_DEFLECT + Deflection coefficient + + + GEOM_CHECK_INT_DETECT_GAPS + Detect gaps with tolerance + MeasureGUI_FastCheckIntersectionsDlg diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx index d1d23d51c..5e33ac622 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx @@ -50,8 +50,9 @@ #include #include #include -#if OCC_VERSION_LARGE > 0x06080000 #include +#if OCC_VERSION_LARGE > 0x06090000 +#include #endif #include #include @@ -71,10 +72,13 @@ #include #include #include +#include #include #include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC +#include + //============================================================================= /*! * Constructor @@ -1510,7 +1514,6 @@ bool GEOMImpl_IMeasureOperations::CheckSelfIntersections Handle(TColStd_HSequenceOfInteger)& theIntersections) { SetErrorCode(KO); - bool isGood = false; if (theIntersections.IsNull()) theIntersections = new TColStd_HSequenceOfInteger; @@ -1518,13 +1521,13 @@ bool GEOMImpl_IMeasureOperations::CheckSelfIntersections theIntersections->Clear(); if (theShape.IsNull()) - return isGood; + return false; Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); - if (aRefShape.IsNull()) return isGood; + if (aRefShape.IsNull()) return false; TopoDS_Shape aShape = aRefShape->GetValue(); - if (aShape.IsNull()) return isGood; + if (aShape.IsNull()) return false; // 0. Prepare data TopoDS_Shape aScopy; @@ -1546,7 +1549,6 @@ bool GEOMImpl_IMeasureOperations::CheckSelfIntersections aCSI.Perform(); Standard_Integer iErr = aCSI.ErrorStatus(); - isGood = true; // Standard_Integer aNbS, n1, n2; BOPDS_MapIteratorMapOfPassKey aItMPK; @@ -1570,14 +1572,82 @@ bool GEOMImpl_IMeasureOperations::CheckSelfIntersections theIntersections->Append(anIndices.FindIndex(aS1)); theIntersections->Append(anIndices.FindIndex(aS2)); - isGood = false; } if (!iErr) { SetErrorCode(OK); } - return isGood; + return theIntersections->IsEmpty(); +} + +//============================================================================= +/*! + * CheckSelfIntersectionsFast + */ +//============================================================================= +bool GEOMImpl_IMeasureOperations::CheckSelfIntersectionsFast + (Handle(GEOM_Object) theShape, + float theDeflection, double theTolerance, + Handle(TColStd_HSequenceOfInteger)& theIntersections) +{ + SetErrorCode(KO); + + if (theIntersections.IsNull()) + theIntersections = new TColStd_HSequenceOfInteger; + else + theIntersections->Clear(); + + if (theShape.IsNull()) + return false; + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + if (aRefShape.IsNull()) return false; + + TopoDS_Shape aShape = aRefShape->GetValue(); + if (aShape.IsNull()) return false; + + // 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); + +#if OCC_VERSION_LARGE > 0x06090000 + // Checker of fast interferences + BRepExtrema_SelfIntersection aTool(aScopy, (theTolerance <= 0.) ? 0.0 : theTolerance); + + // Launch the checker + aTool.Perform(); + + const BRepExtrema_OverlapTool::OverlapSubShapes& intersections = aTool.OverlapElements(); + + std::set processed; + + for (BRepExtrema_OverlapTool::OverlapSubShapes::Iterator it(intersections); it.More(); it.Next()) { + Standard_Integer idxLeft = it.Key(); + if (processed.count(idxLeft) > 0) continue; // already added + processed.insert(idxLeft); + const TColStd_PackedMapOfInteger& overlaps = it.Value(); + for (TColStd_MapIteratorOfPackedMapOfInteger subit(overlaps); subit.More(); subit.Next()) { + Standard_Integer idxRight = subit.Key(); + if (processed.count(idxRight) > 0) continue; // already added + const TopoDS_Shape& aS1 = aTool.GetSubShape(idxLeft); + const TopoDS_Shape& aS2 = aTool.GetSubShape(idxRight); + theIntersections->Append(anIndices.FindIndex(aS1)); + theIntersections->Append(anIndices.FindIndex(aS2)); + } + } + + if (aTool.IsDone()) + SetErrorCode(OK); +#endif + + return theIntersections->IsEmpty(); } //============================================================================= @@ -1593,8 +1663,6 @@ bool GEOMImpl_IMeasureOperations::FastIntersect (Handle(GEOM_Object) theShape1, SetErrorCode(KO); bool isGood = false; -#if OCC_VERSION_LARGE > 0x06080000 - if (theIntersections1.IsNull()) theIntersections1 = new TColStd_HSequenceOfInteger; else @@ -1646,12 +1714,22 @@ bool GEOMImpl_IMeasureOperations::FastIntersect (Handle(GEOM_Object) theShape1, aBSP.Perform(); // 2. Get sets of IDs of overlapped faces - for (BRepExtrema_OverlappedSubShapes::Iterator anIt1 (aBSP.OverlapSubShapes1()); anIt1.More(); anIt1.Next()) { +#if OCC_VERSION_LARGE > 0x06090000 + for (BRepExtrema_OverlapTool::OverlapSubShapes::Iterator anIt1 (aBSP.OverlapSubShapes1()); anIt1.More(); anIt1.Next()) +#else + for (BRepExtrema_OverlappedSubShapes::Iterator anIt1 (aBSP.OverlapSubShapes1()); anIt1.More(); anIt1.Next()) +#endif + { const TopoDS_Shape& aS1 = aBSP.GetSubShape1(anIt1.Key()); theIntersections1->Append(anIndices1.FindIndex(aS1)); } - for (BRepExtrema_OverlappedSubShapes::Iterator anIt2 (aBSP.OverlapSubShapes2()); anIt2.More(); anIt2.Next()) { +#if OCC_VERSION_LARGE > 0x06090000 + for (BRepExtrema_OverlapTool::OverlapSubShapes::Iterator anIt2 (aBSP.OverlapSubShapes2()); anIt2.More(); anIt2.Next()) +#else + for (BRepExtrema_OverlappedSubShapes::Iterator anIt2 (aBSP.OverlapSubShapes2()); anIt2.More(); anIt2.Next()) +#endif + { const TopoDS_Shape& aS2 = aBSP.GetSubShape2(anIt2.Key()); theIntersections2->Append(anIndices2.FindIndex(aS2)); } @@ -1661,8 +1739,6 @@ bool GEOMImpl_IMeasureOperations::FastIntersect (Handle(GEOM_Object) theShape1, if (aBSP.IsDone()) SetErrorCode(OK); -#endif // OCC_VERSION_LARGE > 0x06080000 - return isGood; } diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx index 3798af25e..e81e5db1f 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx @@ -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, diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.cc b/src/GEOM_I/GEOM_IMeasureOperations_i.cc index f75787a3c..407d71f05 100644 --- a/src/GEOM_I/GEOM_IMeasureOperations_i.cc +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.cc @@ -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 diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.hh b/src/GEOM_I/GEOM_IMeasureOperations_i.hh index 27e2e5d42..71e6194ba 100644 --- a/src/GEOM_I/GEOM_IMeasureOperations_i.hh +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.hh @@ -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, diff --git a/src/GEOM_SWIG/GEOM_TestMeasures.py b/src/GEOM_SWIG/GEOM_TestMeasures.py index 87c9a0d11..7ad571552 100644 --- a/src/GEOM_SWIG/GEOM_TestMeasures.py +++ b/src/GEOM_SWIG/GEOM_TestMeasures.py @@ -33,8 +33,12 @@ def TestMeasureOperations (geompy, math): p678 = geompy.MakeVertex(60, 70, 80) p789 = geompy.MakeVertex(70, 80, 90) + vz = geompy.MakeVectorDXDYDZ(0, 0, 1) + cube = geompy.MakeBoxTwoPnt(p678, p789) + cylinder = geompy.MakeCylinder(p0, vz, 5, 70) + ####### PointCoordinates ####### Coords = geompy.PointCoordinates(p137) @@ -52,18 +56,20 @@ def TestMeasureOperations (geompy, math): ####### Detect Self-intersections ####### - [Face_1,Face_2] = geompy.SubShapes(box, [33, 23]) - Translation_1 = geompy.MakeTranslation(Face_1, 5, -15, -40) - Compound_1 = geompy.MakeCompound([Face_2, Translation_1]) - if geompy.CheckSelfIntersections(Compound_1) == True: + selfIntersected = geompy.MakeCompound([box, cylinder]) + if geompy.CheckSelfIntersections(selfIntersected): raise RuntimeError, "Existing self-intersection is not detected" - ####### Detect Fast intersection ####### + ####### Detect Self-intersections fast ####### - if salome_version.getXVersion() > "0x70501": - cylinder = geompy.MakeCylinderRH(100, 300) - if geompy.FastIntersect(box, cylinder)[0] == False: - raise RuntimeError, "Existing intersection is not detected" + if salome_version.getXVersion() > "0x70600": + if geompy.CheckSelfIntersectionsFast(selfIntersected): + raise RuntimeError, "Existing self-intersection is not detected" + + ####### Fast intersection ####### + + if not geompy.FastIntersect(box, cylinder)[0]: + raise RuntimeError, "Existing intersection is not detected" ####### WhatIs ####### diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index f932a632a..982a45dc5 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -11257,6 +11257,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 diff --git a/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.cxx b/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.cxx index a07e919e5..97b3d170e 100644 --- a/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.cxx @@ -26,6 +26,7 @@ #include "MeasureGUI_CheckSelfIntersectionsDlg.h" #include "MeasureGUI.h" +#include #include #include #include @@ -58,80 +59,144 @@ //================================================================================= 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()->GroupConstructors->setTitle(tr("GEOM_CHECK_INTERSECT_TYPE")); 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_INFOS"), 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); + + 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); + + /***************************************************************/ myHelpFileName = "check_self_intersections_page.html"; @@ -161,32 +226,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 +295,56 @@ 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: + mySimpleGrp->show(); + myFastGrp->hide(); + break; + case 1: + 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 +357,7 @@ void MeasureGUI_CheckSelfIntersectionsDlg::onCompute() QString anErrMsg(""); if (!findSelfIntersections(hasSelfInte, anErrMsg)) { - myTextView->setText(anErrMsg); + getTextView()->setText(anErrMsg); return; } @@ -243,12 +377,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 +390,8 @@ void MeasureGUI_CheckSelfIntersectionsDlg::onCompute() anInteList.append(anInteStr); } - myInteList->addItems(anInteList); - myComputeButton->setEnabled(false); + getInteList()->addItems(anInteList); + getComputeButton()->setEnabled(false); } //================================================================================= @@ -291,7 +425,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 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 +463,11 @@ bool MeasureGUI_CheckSelfIntersectionsDlg::ClickOnApply() if ( !onAccept() ) return false; + clear(); initName(); + + ConstructorsClicked(getConstructorId()); + return true; } @@ -341,7 +495,7 @@ GEOM::GEOM_IOperations_ptr MeasureGUI_CheckSelfIntersectionsDlg::createOperation //================================================================================= bool MeasureGUI_CheckSelfIntersectionsDlg::isValid( QString& ) { - return !myObj->_is_nil(); + return !getObj().isNull(); } //================================================================================= @@ -350,37 +504,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 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 +568,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 +581,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(), getDeflection(), getTolerance(), myInters2); + } + nbPairs = getInters()->length()/2; - if (nbPairs*2 != myInters->length()) { + if (nbPairs*2 != getInters()->length()) { isOK = false; } } @@ -426,7 +598,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 +619,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 +652,7 @@ void MeasureGUI_CheckSelfIntersectionsDlg::onSubShapesListSelectionChanged() erasePreview(); // Selected IDs - QList selected = myShapeList->selectedItems(); + QList selected = getShapeList()->selectedItems(); QList aIds; foreach(QListWidgetItem* item, selected) { int idx = item->data(Qt::UserRole).toInt(); @@ -492,7 +664,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 +672,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 +698,15 @@ bool MeasureGUI_CheckSelfIntersectionsDlg::execute(ObjectList& objects) TColStd_IndexedMapOfInteger aMapIndex; QList 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 +719,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 +734,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 +763,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 MeasureGUI_CheckSelfIntersectionsDlg::getSourceObjects() +{ + QList 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 : myShapeList2 ); +} + +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 ); } diff --git a/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.h b/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.h index f05dd8109..ac0f2d935 100644 --- a/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.h +++ b/src/MeasureGUI/MeasureGUI_CheckSelfIntersectionsDlg.h @@ -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 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