From cbdcb3694dfacde362169e99cc3d242a3a7d40cd Mon Sep 17 00:00:00 2001 From: skv Date: Thu, 22 Jan 2015 12:14:55 +0300 Subject: [PATCH] 0022775: [CEA 1091] Add an option on GetNonBlocks to retrieve quadrangular faces defined on C1 edges --- doc/salome/gui/GEOM/images/measures10.png | Bin 24172 -> 29660 bytes doc/salome/gui/GEOM/images/measures2.png | Bin 21135 -> 24967 bytes doc/salome/gui/GEOM/images/measures2a.png | Bin 11085 -> 8572 bytes .../GEOM/input/check_compound_of_blocks.doc | 13 +- doc/salome/gui/GEOM/input/get_non_blocks.doc | 35 +- idl/GEOM_Gen.idl | 11 +- .../AdvancedEngine_IOperations.cxx | 2 +- src/BlockFix/BlockFix_CheckTool.cxx | 113 ++++- src/BlockFix/BlockFix_CheckTool.hxx | 11 +- src/GEOMGUI/GEOM_msg_en.ts | 4 + src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx | 468 ++++++------------ src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx | 10 +- src/GEOM_I/GEOM_IBlocksOperations_i.cc | 8 +- src/GEOM_I/GEOM_IBlocksOperations_i.hh | 2 + src/GEOM_I_Superv/GEOM_Superv_i.cc | 2 +- src/GEOM_SWIG/geomBuilder.py | 68 ++- .../MeasureGUI_CheckCompoundOfBlocksDlg.cxx | 171 +++++-- .../MeasureGUI_CheckCompoundOfBlocksDlg.h | 21 +- src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx | 101 +++- src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h | 15 +- 20 files changed, 632 insertions(+), 423 deletions(-) mode change 100755 => 100644 doc/salome/gui/GEOM/images/measures10.png mode change 100755 => 100644 src/GEOM_I/GEOM_IBlocksOperations_i.cc diff --git a/doc/salome/gui/GEOM/images/measures10.png b/doc/salome/gui/GEOM/images/measures10.png old mode 100755 new mode 100644 index 091b2c0aa3afcd60af29af3ee46bed799bc8ede1..7a05b55bb8678e684ab0e34b99a859aa4fc564c9 GIT binary patch literal 29660 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 literal 24172 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 z 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 literal 21135 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

!>ppD`ycB)$;_JS?M%p8#Y$vf+ zd^`Y6ziMXZ7Ukv^feY2oWVQl!R@Sf!9=eyBRy;mlu_XzRPigqPW{j$wwXqWSD6-4L_yGiztGNsBh9Wwz&O8WP>c__Q@GLj`749ME z@9US~SHN0$#pfHNN)3iYEsPkk)h`;+b$%8oB>(!L<5AAWL)nnPTnQcATqiCG%on*o zO(s5VF7%Tn-I~{X>#oflOB=P<|NP@2a0|DH4osdsVaOO>TLtE!+&hiM`nGkG!hp$~ z)6JTRr_ri_Z}ad70%8+>CN!k0-Zc8FzUK3H=<7o^fxC#TKHXRel?sXEQSN=%#pR!& zr%LEw7k9bdaida!_g{pt1DPy}T}PHe*C2Y+c)B<{yFP62p;Rh;@xrCo7pVW&(vb5$JS#fK9;ktd{g}}m#%81n$s3-U_tU7smXNL zi%V|JNemGT0C!`g21rZ+`vRm*ch=Y~ypQR5X8L|?a4dMUt%`%l<`heR4ZP{X#@Y=I zdY})HV<~>Nbv%{BQ$&Ds@B>|3Oa8UGczSkr=Jz6ZDH(}C1ZYb25GghHA@2WW%imqzlFZ$BfGaDq*Mj2>Gri>c zLs|Cmc~}G@Ph}i}Uw_}g|K1>Wb{n9 diff --git a/doc/salome/gui/GEOM/images/measures2a.png b/doc/salome/gui/GEOM/images/measures2a.png index 3068f49b196e2092a190ac13b284bb72b49b41bd..718c60f9044d47e8b0ccb09697c44ee201867b63 100644 GIT binary patch literal 8572 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 literal 11085 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 W38f+4B-oi&IH0tWRH=lK|NjDYUse C1 criterion - option that shitches on/off the C1 continuity mode. +- Angular Tolerance - angular tolerance to check C1 continuity between neighbor edges in a wire. +- \b Errors list informs of possible errors, for example: - Not a block; - Not glued; - Not connected; @@ -26,7 +31,7 @@ In this dialog: \n TUI Command: -geompy.CheckCompoundOfBlocks(Compound). Checks if the shape +geompy.CheckCompoundOfBlocks(Compound, theIsUseC1 = False, theAngTolerance = 1.e-12). Checks if the shape is a valid compound of blocks. If it is true, then the validity flag is returned, and encountered errors are printed in the python console. diff --git a/doc/salome/gui/GEOM/input/get_non_blocks.doc b/doc/salome/gui/GEOM/input/get_non_blocks.doc index 79f6ba021..e2b566dd3 100644 --- a/doc/salome/gui/GEOM/input/get_non_blocks.doc +++ b/doc/salome/gui/GEOM/input/get_non_blocks.doc @@ -5,24 +5,45 @@ This operation retrieves all non-block solids and non-quadrangular faces from the selected shape. -A non-block solid is a solid that does not have 6 faces, or has 6 faces, but some of them are not quadrangular. +A block solid is a solid that has 6 quadrangular faces. + +A quadrangular face is a face that has 1 wire with 4 edges. If there are +more than 4 edges in a single wire and C1 continuity mode is switched on, +a face is quadrangular if it has 4 bounds of C1 continuity. + +All solids and faces from a shape that do not satisfy these conditions are +returned by this operation. \image html measures2.png -\b Preview option shows non block solids and faces in the viewer. +It is possible to select an \b Object to be explored, to check or uncheck +Use C1 criterion option and to set the Angular Tolerance +to check C1 continuity between neighbor edges in a wire. -Press \b Apply or Apply and Close button to publish non block solids and faces in the Object -Browser under the processed object. Solids and faces are published separately in two groups. +\b Preview option shows non-block solids and non-quadrangular faces in the viewer. + +Press \b Apply or Apply and Close button to publish non-block solids +and non-quadrangular faces in the Object Browser under the processed object. +Solids and faces are published separately in two groups. If no bad sub-shapes have been found, the corresponding warning is shown. \image html measures2a.png \n TUI Command: -geompy.GetNonBlocks(Compound). Returns a tuple of two GEOM_Objects. +geompy.GetNonBlocks(theShape, theIsUseC1 = False, theAngTolerance = 1.e-12). \n +where \n +\em theShape is the shape to explore, \n +\em theIsUseC1 is the flag to check if there are 4 bounds on a face + taking into account C1 continuity, \n +\em theAngTolerance the angular tolerance to check if two neighbor edges are + codirectional in the common vertex with this tolerance. This parameter is + used only if \em theIsUseC1 is set to True. -The first object is a group of all non block solids; the second object is a group of all non -quadrangular faces. +This command returns a tuple of two GEOM_Objects. + +The first object is a group of all non-block solids; the second object is a group +of all non-quadrangular faces. See also a \ref tui_get_non_blocks_page "TUI example". diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index a85830009..2917f62cf 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -2770,10 +2770,14 @@ module GEOM * - The glue between two quadrangle faces should be applied. * \note Single block is also accepted as a valid compound of blocks. * \param theCompound The compound to check. + * \param theToleranceC1 the tolerance to check if two neighbor edges are + * collinear in the common vertex with this tolerance. Negative + * value means that C1 criterion is not used (old implementation). * \param theErrors Structure, containing discovered errors and incriminated sub-shapes. * \return TRUE, if the given shape is a compound of blocks. */ boolean CheckCompoundOfBlocks (in GEOM_Object theCompound, + in double theToleranceC1, out BCErrors theErrors); /*! @@ -2790,12 +2794,17 @@ module GEOM * \brief Retrieve all non blocks solids and faces from a shape. * * \param theShape The shape to explore. + * \param theToleranceC1 the tolerance to check if two neighbor edges are + * collinear in the common vertex with this tolerance. Negative + * value means that C1 criterion is not used (old implementation). * \param theNonQuads Output parameter. Group of all non quadrangular faces. * * \return Group of all non block solids (= not 6 faces, or with 6 * faces, but with the presence of non-quadrangular faces). */ - GEOM_Object GetNonBlocks (in GEOM_Object theShape, out GEOM_Object theNonQuads); + GEOM_Object GetNonBlocks (in GEOM_Object theShape, + in double theToleranceC1, + out GEOM_Object theNonQuads); /*! * \brief Remove all seam and degenerated edges from \a theShape. diff --git a/src/AdvancedEngine/AdvancedEngine_IOperations.cxx b/src/AdvancedEngine/AdvancedEngine_IOperations.cxx index 5d1b96999..ad7650b00 100644 --- a/src/AdvancedEngine/AdvancedEngine_IOperations.cxx +++ b/src/AdvancedEngine/AdvancedEngine_IOperations.cxx @@ -1583,7 +1583,7 @@ bool AdvancedEngine_IOperations::MakePipeTShapePartition(Handle(GEOM_Object) the // Last verification: result should be a block std::list errList; - if (!myBlocksOperations->CheckCompoundOfBlocks(Te3,errList)) { + if (!myBlocksOperations->CheckCompoundOfBlocks(Te3, -1, errList)) { SetErrorCode("TShape is not a compound of block"); return false; } diff --git a/src/BlockFix/BlockFix_CheckTool.cxx b/src/BlockFix/BlockFix_CheckTool.cxx index 32c0714be..36e527550 100644 --- a/src/BlockFix/BlockFix_CheckTool.cxx +++ b/src/BlockFix/BlockFix_CheckTool.cxx @@ -28,6 +28,11 @@ #include +#include + +#include +#include + #include #include @@ -36,8 +41,10 @@ #include #include #include +#include #include +#include #include #include #include @@ -49,6 +56,7 @@ BlockFix_CheckTool::BlockFix_CheckTool( ) { myHasCheck = Standard_False; + myAngTolerance = -1.; myPossibleBlocks.Clear(); } @@ -63,6 +71,17 @@ void BlockFix_CheckTool::SetShape(const TopoDS_Shape& aShape) myPossibleBlocks.Clear(); } +//======================================================================= +//function : SetAngTolerance +//purpose : +//======================================================================= +void BlockFix_CheckTool::SetAngTolerance(const Standard_Real theTolerance) +{ + myHasCheck = Standard_False; + myAngTolerance = theTolerance; + myPossibleBlocks.Clear(); +} + //======================================================================= //function : Perform //purpose : @@ -159,7 +178,6 @@ void BlockFix_CheckTool::Perform() if (nbe < 12) IsBlock = Standard_False; if (nbe > 12) { - IsBlock = Standard_False; // check edges unification // creating map of edge faces TopTools_IndexedDataMapOfShapeListOfShape aMapEdgeFaces; @@ -194,9 +212,19 @@ void BlockFix_CheckTool::Perform() Standard_Integer i = 1; for (; i <= aMapFacesEdges.Extent(); i++) { const TopTools_ListOfShape& ListEdges = aMapFacesEdges.FindFromIndex(i); - if (ListEdges.Extent() > 1) break; + if (ListEdges.Extent() > 1) { + if (myAngTolerance < 0.) { + break; + } + + // Check if edges have C1 continuity. + if (!isC1(ListEdges)) { + break; + } + } } if (i <= aMapFacesEdges.Extent()) { + IsBlock = Standard_False; MayBeUE = Standard_True; break; } @@ -265,3 +293,84 @@ void BlockFix_CheckTool::DumpCheckResult(Standard_OStream& S) const S<<" number of impossible blocks = "<D1(aParam1, aPnt, aVec1); + aCurve2->D1(aParam2, aPnt, aVec2); + + if (anEdge1.Orientation() != anEdge2.Orientation()) { + // Orientations are different. One vector should be reversed. + aVec1.Reverse(); + } + + const Standard_Real anAngle = aVec1.Angle(aVec2); + + if (anAngle > myAngTolerance) { + // There is no C1 continuity. + break; + } + } else { + // Non-manifold case. + break; + } + } + + return (i > aNbVtx && aNbEnds == 2); +} diff --git a/src/BlockFix/BlockFix_CheckTool.hxx b/src/BlockFix/BlockFix_CheckTool.hxx index 83bd5b3c1..66711433c 100644 --- a/src/BlockFix/BlockFix_CheckTool.hxx +++ b/src/BlockFix/BlockFix_CheckTool.hxx @@ -30,6 +30,7 @@ #include class TopoDS_Shape; +class TopTools_ListOfShape; #include #include @@ -38,14 +39,20 @@ class BlockFix_CheckTool { public: Standard_EXPORT BlockFix_CheckTool(); - Standard_EXPORT void SetShape(const TopoDS_Shape& aShape) ; + Standard_EXPORT void SetShape(const TopoDS_Shape& aShape); + Standard_EXPORT void SetAngTolerance(const Standard_Real theTolerance); Standard_EXPORT void Perform() ; Standard_EXPORT Standard_Integer NbPossibleBlocks() const; Standard_EXPORT TopoDS_Shape PossibleBlock(const Standard_Integer num) const; Standard_EXPORT void DumpCheckResult(Standard_OStream& S) const; private: - TopoDS_Shape myShape; + + Standard_Boolean isC1(const TopTools_ListOfShape &theEdges) const; + +private: + TopoDS_Shape myShape; + Standard_Real myAngTolerance; Standard_Boolean myHasCheck; Standard_Integer myNbSolids; Standard_Integer myNbBlocks; diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 06cb15a74..22961d63e 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -407,6 +407,10 @@ Please, select face, shell or solid and try again GEOM_NONBLOCKS NonBlocksGroup + + GEOM_USE_C1_CRITERION + Use C1 criterion + GEOM_CHECK_INFOS Object And Its Topological Information diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx index cca9f381f..2a733c51e 100644 --- a/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx @@ -88,6 +88,7 @@ #include #include +#include #include #include @@ -103,6 +104,147 @@ #include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC + +/** + * This function returns Standard_True if the face is quadrangular. It means + * that it has only 1 wire with 4 edges. If there are more then 4 edges in + * the wire and theToleranceC1 is not negative the new implementation is used. + * According to it the face is quadrangular if it is quadrangular according to + * an old implementation or if it has a single wire with more then 4 edges + * that form exactly 4 bounds of C1 continuity with the given tolerance. + * + * \param theFace the face to be checked + * \param theToleranceC1 if negative, it is not used; otherwise it is used + * to check if two neighbor edges of face have C1 continuity. + * \return Standard_True if the face is quadrangular; Standard_False otherwise. + */ +static Standard_Boolean IsQuadrangle(const TopoDS_Face &theFace, + const Standard_Real theToleranceC1) +{ + TopExp_Explorer aFExp (theFace, TopAbs_WIRE); + + if (!aFExp.More()) { + // no wire in the face + return Standard_False; + } + + TopoDS_Shape aWire = aFExp.Current(); + + aFExp.Next(); + + if (aFExp.More()) { + // multiple wires in the face + return Standard_False; + } + + // Check number of edges in the face + Standard_Integer aNbEdges = 0; + TopTools_MapOfShape aMapEdges; + TopExp_Explorer aWExp(aWire, TopAbs_EDGE); + + for (; aWExp.More(); aWExp.Next()) { + if (aMapEdges.Add(aWExp.Current())) { + aNbEdges++; + + if (aNbEdges > 4) { + break; + } + } + } + + if (aNbEdges < 4) { + return Standard_False; + } + + if (aNbEdges > 4) { + if (theToleranceC1 < 0.) { + return Standard_False; + } + + // Check if a wire has 4 bounds of C1 continuity. + BRepTools_WireExplorer aWireExp(TopoDS::Wire(aWire), theFace); + TopTools_ListOfShape anEdges; + + for (aNbEdges = 0; aWireExp.More(); aWireExp.Next()) { + const TopoDS_Edge &anEdge = aWireExp.Current(); + + // Skip degenerated edges. + if (!BRep_Tool::Degenerated(anEdge)) { + anEdges.Append(anEdge); + ++aNbEdges; + } + } + + if (aNbEdges < 4) { + return Standard_False; + } + + // Compute number of sharp corners. + anEdges.Append(anEdges.First()); // To make a loop. + + TopTools_ListIteratorOfListOfShape anIter(anEdges); + Standard_Real aPar[2]; + Standard_Integer aNbCorners = 0; + TopoDS_Edge anEdge1 = TopoDS::Edge(anEdges.First()); + Handle(Geom_Curve) aCurve1 = BRep_Tool::Curve(anEdge1, aPar[0], aPar[1]); + Handle(Geom_Curve) aCurve2; + TopoDS_Edge anEdge2; + TopoDS_Vertex aCommonVtx; + gp_Pnt aPnt; + gp_Vec aVec1; + gp_Vec aVec2; + Standard_Boolean isReversed1 = (anEdge1.Orientation() == TopAbs_REVERSED); + Standard_Boolean isReversed2; + + for (anIter.Next(); anIter.More(); anIter.Next()) { + TopoDS_Edge anEdge2 = TopoDS::Edge(anIter.Value()); + + if (!TopExp::CommonVertex(anEdge1, anEdge2, aCommonVtx)) { + // NEVERREACHED + return Standard_False; + } + + // Check the angle between tangent vectors of 2 curves at this point. + Standard_Real aParam1 = BRep_Tool::Parameter(aCommonVtx, anEdge1); + Standard_Real aParam2 = BRep_Tool::Parameter(aCommonVtx, anEdge2); + + aCurve2 = BRep_Tool::Curve(anEdge2, aPar[0], aPar[1]); + isReversed2 = (anEdge2.Orientation() == TopAbs_REVERSED); + aCurve1->D1(aParam1, aPnt, aVec1); + aCurve2->D1(aParam2, aPnt, aVec2); + + if (isReversed1) { + aVec1.Reverse(); + } + + if (isReversed2) { + aVec2.Reverse(); + } + const Standard_Real anAngle = aVec1.Angle(aVec2); + + if (anAngle > theToleranceC1) { + ++aNbCorners; + + if (aNbCorners > 4) { + break; + } + } + + // Go to the next couple of edges. + anEdge1 = anEdge2; + aCurve1 = aCurve2; + isReversed1 = isReversed2; + } + + // Check the total number of corners. + if (aNbCorners != 4) { + return Standard_False; + } + } + + return Standard_True; +} + //============================================================================= /*! * constructor: @@ -1647,7 +1789,8 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, TopTools_ListOfShape& BLO, TopTools_ListOfShape& NOT, TopTools_ListOfShape& EXT, - TopTools_ListOfShape& NOQ) + TopTools_ListOfShape& NOQ, + const Standard_Real theToleranceC1) { TopAbs_ShapeEnum aType = theShape.ShapeType(); switch (aType) { @@ -1656,7 +1799,7 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, { TopoDS_Iterator It (theShape); for (; It.More(); It.Next()) { - AddBlocksFrom(It.Value(), BLO, NOT, EXT, NOQ); + AddBlocksFrom(It.Value(), BLO, NOT, EXT, NOQ, theToleranceC1); } } break; @@ -1665,6 +1808,7 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, // Check, if there are seam or degenerated edges BlockFix_CheckTool aTool; aTool.SetShape(theShape); + aTool.SetAngTolerance(theToleranceC1); aTool.Perform(); if (aTool.NbPossibleBlocks() > 0) { EXT.Append(theShape); @@ -1676,41 +1820,12 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, TopExp_Explorer expF (theShape, TopAbs_FACE); for (; expF.More(); expF.Next()) { - if (mapFaces.Add(expF.Current())) { + TopoDS_Face aF = TopoDS::Face(expF.Current()); + + if (mapFaces.Add(aF)) { nbFaces++; - //0021483//if (nbFaces > 6) break; - // get wire - TopoDS_Shape aF = expF.Current(); - TopExp_Explorer wires (aF, TopAbs_WIRE); - if (!wires.More()) { - // no wire in the face - hasNonQuadr = Standard_True; - NOQ.Append(aF);//0021483 - //0021483//break; - continue; - } - TopoDS_Shape aWire = wires.Current(); - wires.Next(); - if (wires.More()) { - // multiple wires in the face - hasNonQuadr = Standard_True; - NOQ.Append(aF);//0021483 - //0021483//break; - continue; - } - - // Check number of edges in the face - Standard_Integer nbEdges = 0; - TopTools_MapOfShape mapEdges; - TopExp_Explorer expW (aWire, TopAbs_EDGE); - for (; expW.More(); expW.Next()) { - if (mapEdges.Add(expW.Current())) { - nbEdges++; - if (nbEdges > 4) break; - } - } - if (nbEdges != 4) { + if (!IsQuadrangle(aF, theToleranceC1)) { hasNonQuadr = Standard_True; NOQ.Append(aF);//0021483 } @@ -1732,34 +1847,10 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, TopTools_MapOfShape mapFaces; TopExp_Explorer expF (theShape, TopAbs_FACE); for (; expF.More(); expF.Next()) { - if (mapFaces.Add(expF.Current())) { - // get wire - TopoDS_Shape aF = expF.Current(); - TopExp_Explorer wires (aF, TopAbs_WIRE); - if (!wires.More()) { - // no wire in the face - NOQ.Append(aF);//0021483 - continue; - } - TopoDS_Shape aWire = wires.Current(); - wires.Next(); - if (wires.More()) { - // multiple wires in the face - NOQ.Append(aF);//0021483 - continue; - } + TopoDS_Face aF = TopoDS::Face(expF.Current()); - // Check number of edges in the face - Standard_Integer nbEdges = 0; - TopTools_MapOfShape mapEdges; - TopExp_Explorer expW (aWire, TopAbs_EDGE); - for (; expW.More(); expW.Next()) { - if (mapEdges.Add(expW.Current())) { - nbEdges++; - if (nbEdges > 4) break; - } - } - if (nbEdges != 4) { + if (mapFaces.Add(aF)) { + if (!IsQuadrangle(aF, theToleranceC1)) { NOQ.Append(aF);//0021483 } } @@ -1771,99 +1862,6 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape& theShape, } } -void AddBlocksFromOld (const TopoDS_Shape& theShape, - TopTools_ListOfShape& BLO, - TopTools_ListOfShape& NOT, - TopTools_ListOfShape& DEG, - TopTools_ListOfShape& SEA) -{ - TopAbs_ShapeEnum aType = theShape.ShapeType(); - switch (aType) { - case TopAbs_COMPOUND: - case TopAbs_COMPSOLID: - { - TopoDS_Iterator It (theShape); - for (; It.More(); It.Next()) { - AddBlocksFromOld(It.Value(), BLO, NOT, DEG, SEA); - } - } - break; - case TopAbs_SOLID: - { - TopTools_MapOfShape mapFaces; - TopExp_Explorer expF (theShape, TopAbs_FACE); - Standard_Integer nbFaces = 0; - Standard_Boolean hasNonQuadr = Standard_False; - Standard_Boolean hasDegenerated = Standard_False; - Standard_Boolean hasSeam = Standard_False; - for (; expF.More(); expF.Next()) { - if (mapFaces.Add(expF.Current())) { - nbFaces++; - if (nbFaces > 6) break; - - // Check number of edges in the face - Standard_Integer nbEdges = 0; - TopTools_MapOfShape mapEdges; - - // get wire - TopoDS_Shape aF = expF.Current(); - TopExp_Explorer wires (aF, TopAbs_WIRE); - if (!wires.More()) { - // no wire in the face - hasNonQuadr = Standard_True; - break; - } - TopoDS_Shape aWire = wires.Current(); - wires.Next(); - if (wires.More()) { - // multiple wires in the face - hasNonQuadr = Standard_True; - break; - } - - // iterate on wire - BRepTools_WireExplorer aWE (TopoDS::Wire(aWire), TopoDS::Face(aF)); - for (; aWE.More(); aWE.Next(), nbEdges++) { - if (BRep_Tool::Degenerated(aWE.Current())) { - // degenerated edge found - hasDegenerated = Standard_True; -// break; - } - if (mapEdges.Contains(aWE.Current())) { - // seam edge found - hasSeam = Standard_True; -// break; - } - mapEdges.Add(aWE.Current()); - } - if (nbEdges != 4) { - hasNonQuadr = Standard_True; - } - } - } - if (nbFaces == 6) { - if (hasDegenerated || hasSeam) { - if (hasDegenerated) { - DEG.Append(theShape); - } - if (hasSeam) { - SEA.Append(theShape); - } - } else if (hasNonQuadr) { - NOT.Append(theShape); - } else { - BLO.Append(theShape); - } - } else { - NOT.Append(theShape); - } - } - break; - default: - NOT.Append(theShape); - } -} - #define REL_NOT_CONNECTED 0 #define REL_OK 1 #define REL_NOT_GLUED 2 @@ -2086,158 +2084,6 @@ Standard_Boolean HasAnyConnection (const Standard_Integer theBlockIndex, return Standard_False; } -//============================================================================= -/*! - * CheckCompoundOfBlocksOld - */ -//============================================================================= -Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocksOld - (Handle(GEOM_Object) theCompound, - std::list& theErrors) -{ - SetErrorCode(KO); - - if (theCompound.IsNull()) return Standard_False; - TopoDS_Shape aBlockOrComp = theCompound->GetValue(); - - Standard_Boolean isCompOfBlocks = Standard_True; - - // Map sub-shapes and their indices - TopTools_IndexedMapOfShape anIndices; - TopExp::MapShapes(aBlockOrComp, anIndices); - - // 1. Report non-blocks - TopTools_ListOfShape NOT; // Not blocks - TopTools_ListOfShape DEG; // Hexahedral solids, having degenerated edges - TopTools_ListOfShape SEA; // Hexahedral solids, having seam edges - TopTools_ListOfShape BLO; // All blocks from the given compound - AddBlocksFromOld(aBlockOrComp, BLO, NOT, DEG, SEA); - - if (NOT.Extent() > 0) { - isCompOfBlocks = Standard_False; - BCError anErr; - anErr.error = NOT_BLOCK; - TopTools_ListIteratorOfListOfShape it (NOT); - for (; it.More(); it.Next()) { - anErr.incriminated.push_back(anIndices.FindIndex(it.Value())); - } - theErrors.push_back(anErr); - } - - if (DEG.Extent() > 0 || SEA.Extent() > 0) { - isCompOfBlocks = Standard_False; - BCError anErr; - anErr.error = EXTRA_EDGE; - - TopTools_ListIteratorOfListOfShape itDEG (DEG); - for (; itDEG.More(); itDEG.Next()) { - anErr.incriminated.push_back(anIndices.FindIndex(itDEG.Value())); - } - - TopTools_ListIteratorOfListOfShape itSEA (SEA); - for (; itSEA.More(); itSEA.Next()) { - anErr.incriminated.push_back(anIndices.FindIndex(itSEA.Value())); - } - - theErrors.push_back(anErr); - } - - Standard_Integer nbBlocks = BLO.Extent(); - if (nbBlocks == 0) { - isCompOfBlocks = Standard_False; - SetErrorCode(OK); - return isCompOfBlocks; - } - if (nbBlocks == 1) { - SetErrorCode(OK); - return isCompOfBlocks; - } - - // Convert list of blocks into array for easy and fast access - Standard_Integer ibl = 1; - TopTools_Array1OfShape aBlocks (1, nbBlocks); - TopTools_ListIteratorOfListOfShape BLOit (BLO); - for (; BLOit.More(); BLOit.Next(), ibl++) { - aBlocks.SetValue(ibl, BLOit.Value()); - } - - // 2. Find relations between all blocks, - // report connection errors (NOT_GLUED and INVALID_CONNECTION) - TColStd_Array2OfInteger aRelations (1, nbBlocks, 1, nbBlocks); - aRelations.Init(REL_NOT_CONNECTED); - - Standard_Integer row = 1; - for (row = 1; row <= nbBlocks; row++) { - TopoDS_Shape aBlock = aBlocks.Value(row); - - Standard_Integer col = row + 1; - for (; col <= nbBlocks; col++) { - Standard_Integer aRel = BlocksRelation(aBlock, aBlocks.Value(col)); - if (aRel != REL_NOT_CONNECTED) { - aRelations.SetValue(row, col, aRel); - aRelations.SetValue(col, row, aRel); - if (aRel == REL_NOT_GLUED) { - // report connection error - isCompOfBlocks = Standard_False; - BCError anErr; - anErr.error = NOT_GLUED; - anErr.incriminated.push_back(anIndices.FindIndex(aBlocks.Value(row))); - anErr.incriminated.push_back(anIndices.FindIndex(aBlocks.Value(col))); - theErrors.push_back(anErr); - } else if (aRel == REL_COLLISION_VV || - aRel == REL_COLLISION_FF || - aRel == REL_COLLISION_EE || - aRel == REL_UNKNOWN) { - // report connection error - isCompOfBlocks = Standard_False; - BCError anErr; - anErr.error = INVALID_CONNECTION; - anErr.incriminated.push_back(anIndices.FindIndex(aBlocks.Value(row))); - anErr.incriminated.push_back(anIndices.FindIndex(aBlocks.Value(col))); - theErrors.push_back(anErr); - } else { - } - } - } - } - - // 3. Find largest set of connected (good connection or not glued) blocks - TColStd_MapOfInteger aProcessedMap; - TColStd_MapOfInteger aLargestSet; - TColStd_MapOfInteger aCurrentSet; - for (ibl = 1; ibl <= nbBlocks; ibl++) { - if (!aProcessedMap.Contains(ibl)) { - aCurrentSet.Clear(); - FindConnected(ibl, aRelations, aProcessedMap, aCurrentSet); - if (aCurrentSet.Extent() > aLargestSet.Extent()) { - aLargestSet = aCurrentSet; - } - } - } - - // 4. Report all blocks, isolated from - BCError anErr; - anErr.error = NOT_CONNECTED; - Standard_Boolean hasIsolated = Standard_False; - for (ibl = 1; ibl <= nbBlocks; ibl++) { - if (!aLargestSet.Contains(ibl)) { - aProcessedMap.Clear(); - if (!HasAnyConnection(ibl, aLargestSet, aRelations, aProcessedMap)) { - // report connection absence - hasIsolated = Standard_True; - anErr.incriminated.push_back(anIndices.FindIndex(aBlocks.Value(ibl))); - } - } - } - if (hasIsolated) { - isCompOfBlocks = Standard_False; - theErrors.push_back(anErr); - } - - SetErrorCode(OK); - return isCompOfBlocks; -} - //============================================================================= /*! * PrintBCErrors @@ -2294,6 +2140,7 @@ TCollection_AsciiString GEOMImpl_IBlocksOperations::PrintBCErrors //============================================================================= Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocks (Handle(GEOM_Object) theCompound, + const Standard_Real theToleranceC1, std::list& theErrors) { SetErrorCode(KO); @@ -2312,7 +2159,7 @@ Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocks TopTools_ListOfShape EXT; // Hexahedral solids, having degenerated and/or seam edges TopTools_ListOfShape BLO; // All blocks from the given compound TopTools_ListOfShape NOQ; // All non-quadrangular faces - AddBlocksFrom(aBlockOrComp, BLO, NOT, EXT, NOQ); + AddBlocksFrom(aBlockOrComp, BLO, NOT, EXT, NOQ, theToleranceC1); // Report non-blocks if (NOT.Extent() > 0) { @@ -2478,7 +2325,8 @@ Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocks */ //============================================================================= Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetNonBlocks - (Handle(GEOM_Object) theShape, + (Handle(GEOM_Object) theShape, + const Standard_Real theToleranceC1, Handle(GEOM_Object)& theNonQuads) { SetErrorCode(KO); @@ -2491,7 +2339,7 @@ Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetNonBlocks TopTools_ListOfShape NOT; // Not blocks TopTools_ListOfShape EXT; // Hexahedral solids, having degenerated and/or seam edges TopTools_ListOfShape NOQ; // All non-quadrangular faces - AddBlocksFrom(aShape, BLO, NOT, EXT, NOQ); + AddBlocksFrom(aShape, BLO, NOT, EXT, NOQ, theToleranceC1); if (NOT.IsEmpty() && EXT.IsEmpty() && NOQ.IsEmpty()) { SetErrorCode("NOT_FOUND_ANY"); diff --git a/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx b/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx index 8a03b6e23..568872a08 100644 --- a/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx @@ -125,16 +125,15 @@ class GEOMImpl_IBlocksOperations : public GEOM_IOperations { std::list incriminated; }; - Standard_EXPORT Standard_Boolean CheckCompoundOfBlocksOld (Handle(GEOM_Object) theCompound, - std::list& theErrors); - Standard_EXPORT Standard_Boolean CheckCompoundOfBlocks (Handle(GEOM_Object) theCompound, + const Standard_Real theToleranceC1, std::list& theErrors); Standard_EXPORT TCollection_AsciiString PrintBCErrors (Handle(GEOM_Object) theCompound, const std::list& theErrors); - Standard_EXPORT Handle(GEOM_Object) GetNonBlocks (Handle(GEOM_Object) theShape, + Standard_EXPORT Handle(GEOM_Object) GetNonBlocks (Handle(GEOM_Object) theShape, + const Standard_Real theToleranceC1, Handle(GEOM_Object)& theNonQuads); Standard_EXPORT Handle(GEOM_Object) RemoveExtraEdges (Handle(GEOM_Object) theShape, @@ -148,7 +147,8 @@ class GEOMImpl_IBlocksOperations : public GEOM_IOperations { TopTools_ListOfShape& BLO, TopTools_ListOfShape& NOT, TopTools_ListOfShape& EXT, - TopTools_ListOfShape& NOQ); + TopTools_ListOfShape& NOQ, + const Standard_Real theToleranceC1 = -1.); // Extract blocks from blocks compounds Standard_EXPORT Handle(TColStd_HSequenceOfTransient) ExplodeCompoundOfBlocks diff --git a/src/GEOM_I/GEOM_IBlocksOperations_i.cc b/src/GEOM_I/GEOM_IBlocksOperations_i.cc old mode 100755 new mode 100644 index 55a9c3c70..513ffa752 --- a/src/GEOM_I/GEOM_IBlocksOperations_i.cc +++ b/src/GEOM_I/GEOM_IBlocksOperations_i.cc @@ -614,6 +614,7 @@ CORBA::Boolean GEOM_IBlocksOperations_i::IsCompoundOfBlocks //============================================================================= CORBA::Boolean GEOM_IBlocksOperations_i::CheckCompoundOfBlocks (GEOM::GEOM_Object_ptr theCompound, + const CORBA::Double theToleranceC1, GEOM::GEOM_IBlocksOperations::BCErrors_out theErrors) { CORBA::Boolean isComp = false; @@ -627,7 +628,8 @@ CORBA::Boolean GEOM_IBlocksOperations_i::CheckCompoundOfBlocks //Check std::list errList; - isComp = GetOperations()->CheckCompoundOfBlocks(aCompound, errList); + isComp = GetOperations()->CheckCompoundOfBlocks + (aCompound, theToleranceC1, errList); if (!GetOperations()->IsDone()) return isComp; @@ -749,6 +751,7 @@ char* GEOM_IBlocksOperations_i::PrintBCErrors //============================================================================= GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetNonBlocks (GEOM::GEOM_Object_ptr theShape, + const CORBA::Double theToleranceC1, GEOM::GEOM_Object_out theNonQuads) { GEOM::GEOM_Object_var aGEOMObject; @@ -765,7 +768,8 @@ GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetNonBlocks //Get the result Handle(GEOM_Object) aFaces; - Handle(GEOM_Object) anObject = GetOperations()->GetNonBlocks(aShape, aFaces); + Handle(GEOM_Object) anObject = + GetOperations()->GetNonBlocks(aShape, theToleranceC1, aFaces); if (!GetOperations()->IsDone()) return aGEOMObject._retn(); diff --git a/src/GEOM_I/GEOM_IBlocksOperations_i.hh b/src/GEOM_I/GEOM_IBlocksOperations_i.hh index fa457b566..7755eeb64 100644 --- a/src/GEOM_I/GEOM_IBlocksOperations_i.hh +++ b/src/GEOM_I/GEOM_IBlocksOperations_i.hh @@ -116,12 +116,14 @@ class GEOM_I_EXPORT GEOM_IBlocksOperations_i : CORBA::Long& theNbBlocks); CORBA::Boolean CheckCompoundOfBlocks (GEOM::GEOM_Object_ptr theCompound, + const CORBA::Double theToleranceC1, GEOM::GEOM_IBlocksOperations::BCErrors_out theErrors); char* PrintBCErrors (GEOM::GEOM_Object_ptr theCompound, const GEOM::GEOM_IBlocksOperations::BCErrors& theErrors); GEOM::GEOM_Object_ptr GetNonBlocks (GEOM::GEOM_Object_ptr theShape, + const CORBA::Double theToleranceC1, GEOM::GEOM_Object_out theNonQuads); GEOM::GEOM_Object_ptr RemoveExtraEdges (GEOM::GEOM_Object_ptr theShape, diff --git a/src/GEOM_I_Superv/GEOM_Superv_i.cc b/src/GEOM_I_Superv/GEOM_Superv_i.cc index 867a5c6f7..0324e6e59 100644 --- a/src/GEOM_I_Superv/GEOM_Superv_i.cc +++ b/src/GEOM_I_Superv/GEOM_Superv_i.cc @@ -2713,7 +2713,7 @@ CORBA::Boolean GEOM_Superv_i::CheckCompoundOfBlocks beginService( " GEOM_Superv_i::CheckCompoundOfBlocks" ); MESSAGE("GEOM_Superv_i::CheckCompoundOfBlocks"); getBlocksOp(); - CORBA::Boolean aRes = myBlocksOp->CheckCompoundOfBlocks(theCompound, theErrors); + CORBA::Boolean aRes = myBlocksOp->CheckCompoundOfBlocks(theCompound, -1., theErrors); endService( " GEOM_Superv_i::CheckCompoundOfBlocks" ); return aRes; } diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index bb6519a93..be89ae1a3 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -80,7 +80,7 @@ ## # create and publish cylinder ## cyl = geompy.MakeCylinderRH(100, 100, "cylinder") ## # get non blocks from cylinder -## g1, g2 = geompy.GetNonBlocks(cyl, "nonblock") +## g1, g2 = geompy.GetNonBlocks(cyl, theName="nonblock") ## @endcode ## ## Above example will publish both result compounds (first with non-hexa solids and @@ -88,7 +88,7 @@ ## However, if second command is invoked as ## ## @code -## g1, g2 = geompy.GetNonBlocks(cyl, ("nonhexa", "nonquad")) +## g1, g2 = geompy.GetNonBlocks(cyl, theName=("nonhexa", "nonquad")) ## @endcode ## ## ... the first compound will be published with "nonhexa" name, and second will be named "nonquad". @@ -11425,36 +11425,62 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): ## Check, if the compound of blocks is given. # To be considered as a compound of blocks, the # given shape must satisfy the following conditions: - # - Each element of the compound should be a Block (6 faces and 12 edges). + # - Each element of the compound should be a Block (6 faces). + # - Each face should be a quadrangle, i.e. it should have only 1 wire + # with 4 edges. If theIsUseC1 is set to True and + # there are more than 4 edges in the only wire of a face, + # this face is considered to be quadrangle if it has 4 bounds + # (1 or more edge) of C1 continuity. # - A connection between two Blocks should be an entire quadrangle face or an entire edge. # - The compound should be connexe. # - The glue between two quadrangle faces should be applied. # @param theCompound The compound to check. + # @param theIsUseC1 Flag to check if there are 4 bounds on a face + # taking into account C1 continuity. + # @param theAngTolerance the angular tolerance to check if two neighbor + # edges are codirectional in the common vertex with this + # tolerance. This parameter is used only if + # theIsUseC1 is set to True. # @return TRUE, if the given shape is a compound of blocks. # If theCompound is not valid, prints all discovered errors. # # @ref tui_measurement_tools_page "Example 1" # \n @ref swig_CheckCompoundOfBlocks "Example 2" @ManageTransactions("BlocksOp") - def CheckCompoundOfBlocks(self,theCompound): + def CheckCompoundOfBlocks(self,theCompound, theIsUseC1 = False, + theAngTolerance = 1.e-12): """ Check, if the compound of blocks is given. To be considered as a compound of blocks, the given shape must satisfy the following conditions: - - Each element of the compound should be a Block (6 faces and 12 edges). + - Each element of the compound should be a Block (6 faces). + - Each face should be a quadrangle, i.e. it should have only 1 wire + with 4 edges. If theIsUseC1 is set to True and + there are more than 4 edges in the only wire of a face, + this face is considered to be quadrangle if it has 4 bounds + (1 or more edge) of C1 continuity. - A connection between two Blocks should be an entire quadrangle face or an entire edge. - The compound should be connexe. - The glue between two quadrangle faces should be applied. Parameters: theCompound The compound to check. + theIsUseC1 Flag to check if there are 4 bounds on a face + taking into account C1 continuity. + theAngTolerance the angular tolerance to check if two neighbor + edges are codirectional in the common vertex with this + tolerance. This parameter is used only if + theIsUseC1 is set to True. Returns: TRUE, if the given shape is a compound of blocks. If theCompound is not valid, prints all discovered errors. """ # Example: see GEOM_Spanner.py - (IsValid, BCErrors) = self.BlocksOp.CheckCompoundOfBlocks(theCompound) + aTolerance = -1.0 + if theIsUseC1: + aTolerance = theAngTolerance + (IsValid, BCErrors) = self.BlocksOp.CheckCompoundOfBlocks(theCompound, aTolerance) RaiseIfFailed("CheckCompoundOfBlocks", self.BlocksOp) if IsValid == 0: Descr = self.BlocksOp.PrintBCErrors(theCompound, BCErrors) @@ -11463,6 +11489,12 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): ## Retrieve all non blocks solids and faces from \a theShape. # @param theShape The shape to explore. + # @param theIsUseC1 Flag to check if there are 4 bounds on a face + # taking into account C1 continuity. + # @param theAngTolerance the angular tolerance to check if two neighbor + # edges are codirectional in the common vertex with this + # tolerance. This parameter is used only if + # theIsUseC1 is set to True. # @param theName Object name; when specified, this parameter is used # for result publication in the study. Otherwise, if automatic # publication is switched on, default value is used for result name. @@ -11470,17 +11502,27 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): # @return A tuple of two GEOM_Objects. The first object is a group of all # non block solids (= not 6 faces, or with 6 faces, but with the # presence of non-quadrangular faces). The second object is a - # group of all non quadrangular faces. + # group of all non quadrangular faces (= faces with more then + # 1 wire or, if theIsUseC1 is set to True, faces + # with 1 wire with not 4 edges that do not form 4 bounds of + # C1 continuity). # # @ref tui_measurement_tools_page "Example 1" # \n @ref swig_GetNonBlocks "Example 2" @ManageTransactions("BlocksOp") - def GetNonBlocks (self, theShape, theName=None): + def GetNonBlocks (self, theShape, theIsUseC1 = False, + theAngTolerance = 1.e-12, theName=None): """ Retrieve all non blocks solids and faces from theShape. Parameters: theShape The shape to explore. + theIsUseC1 Flag to check if there are 4 bounds on a face + taking into account C1 continuity. + theAngTolerance the angular tolerance to check if two neighbor + edges are codirectional in the common vertex with this + tolerance. This parameter is used only if + theIsUseC1 is set to True. theName Object name; when specified, this parameter is used for result publication in the study. Otherwise, if automatic publication is switched on, default value is used for result name. @@ -11489,13 +11531,19 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): A tuple of two GEOM_Objects. The first object is a group of all non block solids (= not 6 faces, or with 6 faces, but with the presence of non-quadrangular faces). The second object is a - group of all non quadrangular faces. + group of all non quadrangular faces (= faces with more then + 1 wire or, if theIsUseC1 is set to True, faces + with 1 wire with not 4 edges that do not form 4 bounds of + C1 continuity). Usage: (res_sols, res_faces) = geompy.GetNonBlocks(myShape1) """ # Example: see GEOM_Spanner.py - aTuple = self.BlocksOp.GetNonBlocks(theShape) + aTolerance = -1.0 + if theIsUseC1: + aTolerance = theAngTolerance + aTuple = self.BlocksOp.GetNonBlocks(theShape, aTolerance) RaiseIfFailed("GetNonBlocks", self.BlocksOp) self._autoPublish(aTuple, theName, ("groupNonHexas", "groupNonQuads")) return aTuple diff --git a/src/MeasureGUI/MeasureGUI_CheckCompoundOfBlocksDlg.cxx b/src/MeasureGUI/MeasureGUI_CheckCompoundOfBlocksDlg.cxx index 8d7961412..eee95b56b 100644 --- a/src/MeasureGUI/MeasureGUI_CheckCompoundOfBlocksDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_CheckCompoundOfBlocksDlg.cxx @@ -26,7 +26,6 @@ // #include "MeasureGUI.h" #include "MeasureGUI_CheckCompoundOfBlocksDlg.h" -#include "MeasureGUI_Widgets.h" #include #include @@ -43,6 +42,8 @@ #include #include +#include + #define TEXTEDIT_FONT_FAMILY "Courier" #define TEXTEDIT_FONT_SIZE 11 @@ -54,7 +55,15 @@ // true to construct a modal dialog. //================================================================================= MeasureGUI_CheckCompoundOfBlocksDlg::MeasureGUI_CheckCompoundOfBlocksDlg( GeometryGUI* GUI, QWidget* parent ) - : GEOMBase_Skeleton( GUI, parent, false ) + : GEOMBase_Skeleton(GUI, parent, false), + myObjectName (0), + mySelButton (0), + myUseC1Check (0), + myTolLbl (0), + mySpinTol (0), + myTextView (0), + myListBox1 (0), + myListBox2 (0) { SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr(); QPixmap image0( aResMgr->loadPixmap( "GEOM", tr( "ICON_DLG_CHECK_COMPOUND_OF_BLOCKS" ) ) ); @@ -70,29 +79,55 @@ MeasureGUI_CheckCompoundOfBlocksDlg::MeasureGUI_CheckCompoundOfBlocksDlg( Geomet mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); mainFrame()->RadioButton3->close(); - myGrp = new MeasureGUI_1Sel1TextView2ListBox( centralWidget() ); - myGrp->GroupBox1->setTitle( tr( "GEOM_CHECK_INFOS" ) ); - myGrp->TextLabel1->setText( tr( "GEOM_OBJECT" ) ); + QGroupBox *aGrpParams = + new QGroupBox(tr("GEOM_CHECK_INFOS"), centralWidget()); + QGridLayout *aParamsLayout = new QGridLayout(aGrpParams); + QLabel *anObjLbl = new QLabel(tr("GEOM_OBJECT"), aGrpParams); + QLabel *anErrorsLbl = + new QLabel(tr("GEOM_CHECK_BLOCKS_COMPOUND_ERRORS"), aGrpParams); + QLabel *aNonBlocksLbl = + new QLabel(tr("GEOM_CHECK_BLOCKS_COMPOUND_SUBSHAPES"), aGrpParams); - myGrp->TextView1->setReadOnly( true ); - QFont aFont( TEXTEDIT_FONT_FAMILY, TEXTEDIT_FONT_SIZE ); - aFont.setStyleHint( QFont::TypeWriter, QFont::PreferAntialias ); - myGrp->TextView1->setFont( aFont ); + myObjectName = new QLineEdit(aGrpParams); + mySelButton = new QPushButton(aGrpParams); + myUseC1Check = new QCheckBox(tr("GEOM_USE_C1_CRITERION"), aGrpParams); + myTolLbl = new QLabel(tr("GEOM_ANGULAR_TOLERANCE"), aGrpParams); + mySpinTol = new SalomeApp_DoubleSpinBox(aGrpParams); + myTextView = new QTextBrowser(aGrpParams); + myListBox1 = new QListWidget(aGrpParams); + myListBox2 = new QListWidget(aGrpParams); - myGrp->PushButton1->setIcon( image1 ); - myGrp->LineEdit1->setReadOnly( true ); + myObjectName->setReadOnly(true); + mySelButton->setIcon(image1); + mySelButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + myUseC1Check->setText(tr("GEOM_USE_C1_CRITERION")); + myUseC1Check->setChecked(true); + myTextView->setReadOnly(true); + myListBox2->setSelectionMode(QAbstractItemView::ExtendedSelection); - myGrp->TextLabel2->setText( tr( "GEOM_CHECK_BLOCKS_COMPOUND_ERRORS" ) ); - myGrp->TextLabel3->setText( tr( "GEOM_CHECK_BLOCKS_COMPOUND_SUBSHAPES" ) ); + // Set text view font. + QFont aFont(TEXTEDIT_FONT_FAMILY, TEXTEDIT_FONT_SIZE); - myGrp->ListBox2->setSelectionMode( QAbstractItemView::ExtendedSelection ); + aFont.setStyleHint(QFont::TypeWriter, QFont::PreferAntialias); + myTextView->setFont(aFont); + + aParamsLayout->setMargin(9); + aParamsLayout->setSpacing(6); + aParamsLayout->addWidget(anObjLbl, 0, 0); + aParamsLayout->addWidget(mySelButton, 0, 1); + aParamsLayout->addWidget(myObjectName, 0, 2); + aParamsLayout->addWidget(myUseC1Check, 1, 0, 1, 3); + aParamsLayout->addWidget(myTolLbl, 2, 0); + aParamsLayout->addWidget(mySpinTol, 2, 1, 1, 2); + aParamsLayout->addWidget(myTextView, 3, 0, 1, 3); + aParamsLayout->addWidget(anErrorsLbl, 4, 0); + aParamsLayout->addWidget(myListBox1, 5, 0, 1, 2); + aParamsLayout->addWidget(aNonBlocksLbl, 4, 2); + aParamsLayout->addWidget(myListBox2, 5, 2); QVBoxLayout* layout = new QVBoxLayout( centralWidget() ); layout->setMargin( 0 ); layout->setSpacing( 6 ); - layout->addWidget( myGrp ); - - connect( myGrp->ListBox1, SIGNAL( itemSelectionChanged() ), SLOT( onErrorsListSelectionChanged() ) ); - connect( myGrp->ListBox2, SIGNAL( itemSelectionChanged() ), SLOT( onSubShapesListSelectionChanged() ) ); + layout->addWidget( aGrpParams ); /***************************************************************/ @@ -116,14 +151,24 @@ MeasureGUI_CheckCompoundOfBlocksDlg::~MeasureGUI_CheckCompoundOfBlocksDlg() //================================================================================= void MeasureGUI_CheckCompoundOfBlocksDlg::Init() { - myEditCurrentArgument = myGrp->LineEdit1; + /* init variables */ + double SpecificStep = 0.0001; + double aDefaultTol = Precision::Angular(); + + initSpinBox(mySpinTol, aDefaultTol, MAX_NUMBER, SpecificStep, "ang_tol_precision"); + mySpinTol->setValue(aDefaultTol); + myEditCurrentArgument = myObjectName; // signals and slots connections connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); - connect( myGrp->LineEdit1, SIGNAL( returnPressed() ), this, SLOT( LineEditReturnPressed() ) ); - connect( myGrp->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); + connect(myObjectName, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(mySelButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(myListBox1, SIGNAL(itemSelectionChanged()), this, SLOT(onErrorsListSelectionChanged())); + connect(myListBox2, SIGNAL(itemSelectionChanged()), this, SLOT(onSubShapesListSelectionChanged())); + connect(myUseC1Check, SIGNAL(clicked()), this, SLOT(SetUseC1Tolerance())); + connect(mySpinTol, SIGNAL(valueChanged(double)), this, SLOT(processObject())); connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); @@ -172,7 +217,7 @@ void MeasureGUI_CheckCompoundOfBlocksDlg::SelectionIntoArgument() aSelMgr->selectedObjects(aSelList); if (aSelList.Extent() != 1) { - myGrp->LineEdit1->setText( "" ); + myObjectName->setText( "" ); processObject(); return; } @@ -181,13 +226,13 @@ void MeasureGUI_CheckCompoundOfBlocksDlg::SelectionIntoArgument() GEOMBase::ConvertIOinGEOMObject( aSelList.First() ); if ( aSelectedObject->_is_nil() ) { - myGrp->LineEdit1->setText( "" ); + myObjectName->setText( "" ); processObject(); return; } myObj = aSelectedObject; - myGrp->LineEdit1->setText( GEOMBase::GetName( myObj ) ); + myObjectName->setText( GEOMBase::GetName( myObj ) ); processObject(); DISPLAY_PREVIEW_MACRO; } @@ -198,11 +243,22 @@ void MeasureGUI_CheckCompoundOfBlocksDlg::SelectionIntoArgument() //================================================================================= void MeasureGUI_CheckCompoundOfBlocksDlg::SetEditCurrentArgument() { - myGrp->LineEdit1->setFocus(); - myEditCurrentArgument = myGrp->LineEdit1; + myObjectName->setFocus(); + myEditCurrentArgument = myObjectName; SelectionIntoArgument(); } +//================================================================================= +// function : SetUseC1Tolerance() +// purpose : +//================================================================================= +void MeasureGUI_CheckCompoundOfBlocksDlg::SetUseC1Tolerance() +{ + myTolLbl->setEnabled(myUseC1Check->isChecked()); + mySpinTol->setEnabled(myUseC1Check->isChecked()); + processObject(); +} + //================================================================================= // function : LineEditReturnPressed() // purpose : @@ -210,8 +266,8 @@ void MeasureGUI_CheckCompoundOfBlocksDlg::SetEditCurrentArgument() void MeasureGUI_CheckCompoundOfBlocksDlg::LineEditReturnPressed() { QLineEdit* send = (QLineEdit*)sender(); - if ( send == myGrp->LineEdit1 ) { - myEditCurrentArgument = myGrp->LineEdit1; + if ( send == myObjectName ) { + myEditCurrentArgument = myObjectName; GEOMBase_Skeleton::LineEditReturnPressed(); } } @@ -245,7 +301,13 @@ bool MeasureGUI_CheckCompoundOfBlocksDlg::getBCErrors( bool& theIsCompoundOfBloc GEOM::GEOM_IBlocksOperations_var anOper = GEOM::GEOM_IBlocksOperations::_narrow( getOperation() ); try { GEOM::GEOM_IBlocksOperations::BCErrors_var aErrs; - theIsCompoundOfBlocks = anOper->CheckCompoundOfBlocks( myObj, aErrs ); + double aC1Tol = -1.; + + if (myUseC1Check->isChecked()) { + aC1Tol = mySpinTol->value(); + } + + theIsCompoundOfBlocks = anOper->CheckCompoundOfBlocks( myObj, aC1Tol, aErrs ); if (anOper->IsDone() && aErrs->length() > 0) //if (anOper->IsDone() && !aErrs._is_nil()) theErrors = aErrs; @@ -270,9 +332,9 @@ void MeasureGUI_CheckCompoundOfBlocksDlg::processObject() GEOM::GEOM_IBlocksOperations::BCErrors aErrs; if ( !getBCErrors( isCompoundOfBlocks, aErrs ) ) { aMsg += tr( "GEOM_CHECK_BLOCKS_COMPOUND_FAILED" ); - myGrp->TextView1->setText( aMsg ); - myGrp->ListBox1->clear(); - myGrp->ListBox2->clear(); + myTextView->setText( aMsg ); + myListBox1->clear(); + myListBox2->clear(); erasePreview(); return; } @@ -287,7 +349,7 @@ void MeasureGUI_CheckCompoundOfBlocksDlg::processObject() buttonOk()->setEnabled( true ); buttonApply()->setEnabled( true ); } - myGrp->TextView1->setText( aMsg ); + myTextView->setText( aMsg ); QStringList aErrList; QString aErrStr( "" ); @@ -321,9 +383,9 @@ void MeasureGUI_CheckCompoundOfBlocksDlg::processObject() aErrList.append( aErrStr ); } - myGrp->ListBox1->clear(); - myGrp->ListBox2->clear(); - myGrp->ListBox1->addItems( aErrList ); + myListBox1->clear(); + myListBox2->clear(); + myListBox1->addItems( aErrList ); } //================================================================================= @@ -342,19 +404,19 @@ GEOM::GEOM_IOperations_ptr MeasureGUI_CheckCompoundOfBlocksDlg::createOperation( void MeasureGUI_CheckCompoundOfBlocksDlg::onErrorsListSelectionChanged() { erasePreview(); - int aCurItem = myGrp->ListBox1->currentRow(); + int aCurItem = myListBox1->currentRow(); if ( aCurItem < 0 ) return; bool isCompoundOfBlocks; GEOM::GEOM_IBlocksOperations::BCErrors aErrs; if ( !getBCErrors( isCompoundOfBlocks, aErrs ) ) { - myGrp->TextView1->setText( "" ); - myGrp->ListBox1->clear(); - myGrp->ListBox2->clear(); + myTextView->setText( "" ); + myListBox1->clear(); + myListBox2->clear(); return; } - myGrp->ListBox2->clear(); + myListBox2->clear(); if (aCurItem < aErrs.length()) { GEOM::GEOM_IBlocksOperations::BCError aErr = aErrs[aCurItem]; @@ -371,7 +433,7 @@ void MeasureGUI_CheckCompoundOfBlocksDlg::onErrorsListSelectionChanged() aSubShapeList.append( QString( "%1_%2" ).arg( aType ).arg( aObjLst[i] ) ); } } - myGrp->ListBox2->addItems( aSubShapeList ); + myListBox2->addItems( aSubShapeList ); } } @@ -382,12 +444,12 @@ void MeasureGUI_CheckCompoundOfBlocksDlg::onErrorsListSelectionChanged() void MeasureGUI_CheckCompoundOfBlocksDlg::onSubShapesListSelectionChanged() { erasePreview(); - int aErrCurItem = myGrp->ListBox1->currentRow(); + int aErrCurItem = myListBox1->currentRow(); if ( aErrCurItem < 0 ) return; QList aIds; - for ( int i = 0, n = myGrp->ListBox2->count(); i < n; i++ ) { - if ( myGrp->ListBox2->item( i )->isSelected() ) + for ( int i = 0, n = myListBox2->count(); i < n; i++ ) { + if ( myListBox2->item( i )->isSelected() ) aIds.append( i ); } if ( aIds.count() < 1 ) @@ -395,9 +457,9 @@ void MeasureGUI_CheckCompoundOfBlocksDlg::onSubShapesListSelectionChanged() bool isCompoundOfBlocks; GEOM::GEOM_IBlocksOperations::BCErrors aErrs; if ( !getBCErrors( isCompoundOfBlocks, aErrs ) ) { - myGrp->TextView1->setText( "" ); - myGrp->ListBox1->clear(); - myGrp->ListBox2->clear(); + myTextView->setText( "" ); + myListBox1->clear(); + myListBox2->clear(); return; } @@ -433,6 +495,15 @@ void MeasureGUI_CheckCompoundOfBlocksDlg::onSubShapesListSelectionChanged() } } +//================================================================================= +// function : onDisplayPreview +// purpose : +//================================================================================= +void MeasureGUI_CheckCompoundOfBlocksDlg::onDisplayPreview() +{ + DISPLAY_PREVIEW_MACRO; +} + //================================================================================= // function : activateSelection // purpose : activate selection of faces, shells, and solids @@ -459,9 +530,9 @@ void MeasureGUI_CheckCompoundOfBlocksDlg::enterEvent( QEvent* ) // function : isValid // purpose : //================================================================================= -bool MeasureGUI_CheckCompoundOfBlocksDlg::isValid( QString& ) +bool MeasureGUI_CheckCompoundOfBlocksDlg::isValid( QString &msg) { - return !myObj->_is_nil(); + return !myObj->_is_nil() && mySpinTol->isValid(msg, !IsPreview()); } //================================================================================= diff --git a/src/MeasureGUI/MeasureGUI_CheckCompoundOfBlocksDlg.h b/src/MeasureGUI/MeasureGUI_CheckCompoundOfBlocksDlg.h index e6a93c4f0..b2d43ca1f 100644 --- a/src/MeasureGUI/MeasureGUI_CheckCompoundOfBlocksDlg.h +++ b/src/MeasureGUI/MeasureGUI_CheckCompoundOfBlocksDlg.h @@ -29,7 +29,13 @@ #include -class MeasureGUI_1Sel1TextView2ListBox; +class QCheckBox; +class QLabel; +class QLineEdit; +class QListWidget; +class QPushButton; +class QTextBrowser; +class SalomeApp_DoubleSpinBox; //================================================================================= // class : MeasureGUI_CheckCompoundOfBlocksDlg @@ -47,7 +53,7 @@ public: protected: // redefined from GEOMBase_Helper and GEOMBase_Skeleton virtual GEOM::GEOM_IOperations_ptr createOperation(); - virtual bool isValid( QString& ); + virtual bool isValid( QString &msg ); virtual bool execute( ObjectList& ); virtual void processObject(); @@ -61,6 +67,8 @@ private slots: void onErrorsListSelectionChanged(); void onSubShapesListSelectionChanged(); + void SetUseC1Tolerance(); + void onDisplayPreview(); private: void Init(); @@ -71,7 +79,14 @@ private: private: GEOM::GEOM_Object_var myObj; - MeasureGUI_1Sel1TextView2ListBox* myGrp; + QLineEdit *myObjectName; + QPushButton *mySelButton; + QCheckBox *myUseC1Check; + QLabel *myTolLbl; + SalomeApp_DoubleSpinBox *mySpinTol; + QTextBrowser *myTextView; + QListWidget *myListBox1; + QListWidget *myListBox2; }; #endif // MEASUREGUI_CHECKCOMPOUNDOFBLOCKSDLG_H diff --git a/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx b/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx index 5c04f273a..6ef248017 100644 --- a/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx @@ -25,7 +25,6 @@ #include "MeasureGUI_GetNonBlocksDlg.h" -#include #include #include @@ -33,9 +32,18 @@ #include #include #include +#include #include #include +#include +#include +#include +#include +#include +#include +#include + //================================================================================= // class : MeasureGUI_GetNonBlocksDlg() // purpose : Constructs a MeasureGUI_GetNonBlocksDlg which is a child of 'parent', @@ -44,7 +52,12 @@ // true to construct a modal dialog. //================================================================================= MeasureGUI_GetNonBlocksDlg::MeasureGUI_GetNonBlocksDlg (GeometryGUI* theGeometryGUI, QWidget* parent) - : GEOMBase_Skeleton(theGeometryGUI, parent, false) + : GEOMBase_Skeleton(theGeometryGUI, parent, false), + myObjectName (0), + mySelButton (0), + myUseC1Check (0), + myTolLbl (0), + mySpinTol (0) { QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GETNONBLOCKS"))); QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT"))); @@ -58,16 +71,36 @@ MeasureGUI_GetNonBlocksDlg::MeasureGUI_GetNonBlocksDlg (GeometryGUI* theGeometry mainFrame()->RadioButton2->close(); mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose); mainFrame()->RadioButton3->close(); + + QGroupBox *aGrpParams = + new QGroupBox(tr("GEOM_GETNONBLOCKS"), centralWidget()); + QGridLayout *aParamsLayout = new QGridLayout(aGrpParams); + QLabel *anObjLbl = new QLabel(tr("GEOM_OBJECT"), aGrpParams); - myGrp = new DlgRef_1Sel (centralWidget()); - myGrp->GroupBox1->setTitle(tr("GEOM_GETNONBLOCKS")); - myGrp->TextLabel1->setText(tr("GEOM_OBJECT")); - myGrp->PushButton1->setIcon(image1); - myGrp->LineEdit1->setReadOnly(true); + myObjectName = new QLineEdit(aGrpParams); + mySelButton = new QPushButton(aGrpParams); + myUseC1Check = new QCheckBox(tr("GEOM_USE_C1_CRITERION"), aGrpParams); + myTolLbl = new QLabel(tr("GEOM_ANGULAR_TOLERANCE"), aGrpParams); + mySpinTol = new SalomeApp_DoubleSpinBox(aGrpParams); + + myObjectName->setReadOnly(true); + mySelButton->setIcon(image1); + mySelButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + myUseC1Check->setText(tr("GEOM_USE_C1_CRITERION")); + myUseC1Check->setChecked(true); + + aParamsLayout->setMargin(9); + aParamsLayout->setSpacing(6); + aParamsLayout->addWidget(anObjLbl, 0, 0); + aParamsLayout->addWidget(mySelButton, 0, 1); + aParamsLayout->addWidget(myObjectName, 0, 2); + aParamsLayout->addWidget(myUseC1Check, 1, 0, 1, 3); + aParamsLayout->addWidget(myTolLbl, 2, 0); + aParamsLayout->addWidget(mySpinTol, 2, 1, 1, 2); QVBoxLayout* layout = new QVBoxLayout(centralWidget()); layout->setMargin(0); layout->setSpacing(6); - layout->addWidget(myGrp); + layout->addWidget(aGrpParams); /***************************************************************/ @@ -94,14 +127,20 @@ void MeasureGUI_GetNonBlocksDlg::Init() showOnlyPreviewControl(); /* init variables */ - myEditCurrentArgument = myGrp->LineEdit1; + double SpecificStep = 0.0001; + double aDefaultTol = Precision::Angular(); + + initSpinBox(mySpinTol, aDefaultTol, MAX_NUMBER, SpecificStep, "ang_tol_precision"); + mySpinTol->setValue(aDefaultTol); + myEditCurrentArgument = myObjectName; /* signals and slots connections */ - connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); - connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); - - connect(myGrp->LineEdit1, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); - connect(myGrp->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); + connect(buttonOk(), SIGNAL(clicked()), this, SLOT(ClickOnOk())); + connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply())); + connect(myUseC1Check, SIGNAL(clicked()), this, SLOT(SetUseC1Tolerance())); + connect(mySpinTol, SIGNAL(valueChanged(double)), this, SLOT(processPreview())); + connect(myObjectName, SIGNAL(returnPressed()), this, SLOT(LineEditReturnPressed())); + connect(mySelButton, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument())); connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); @@ -171,11 +210,22 @@ void MeasureGUI_GetNonBlocksDlg::SelectionIntoArgument() //================================================================================= void MeasureGUI_GetNonBlocksDlg::SetEditCurrentArgument() { - myGrp->LineEdit1->setFocus(); - myEditCurrentArgument = myGrp->LineEdit1; + myObjectName->setFocus(); + myEditCurrentArgument = myObjectName; SelectionIntoArgument(); } +//================================================================================= +// function : SetUseC1Tolerance() +// purpose : +//================================================================================= +void MeasureGUI_GetNonBlocksDlg::SetUseC1Tolerance() +{ + myTolLbl->setEnabled(myUseC1Check->isChecked()); + mySpinTol->setEnabled(myUseC1Check->isChecked()); + processPreview(); +} + //================================================================================= // function : LineEditReturnPressed() // purpose : @@ -183,8 +233,8 @@ void MeasureGUI_GetNonBlocksDlg::SetEditCurrentArgument() void MeasureGUI_GetNonBlocksDlg::LineEditReturnPressed() { QLineEdit* send = (QLineEdit*)sender(); - if (send == myGrp->LineEdit1) { - myEditCurrentArgument = myGrp->LineEdit1; + if (send == myObjectName) { + myEditCurrentArgument = myObjectName; GEOMBase_Skeleton::LineEditReturnPressed(); } } @@ -211,10 +261,11 @@ void MeasureGUI_GetNonBlocksDlg::ActivateThisDialog() void MeasureGUI_GetNonBlocksDlg::processObject() { if (myObj->_is_nil()) { + myObjectName->setText(""); erasePreview(); } else { - myGrp->LineEdit1->setText(GEOMBase::GetName(myObj)); + myObjectName->setText(GEOMBase::GetName(myObj)); processPreview(); } @@ -243,9 +294,9 @@ GEOM::GEOM_IOperations_ptr MeasureGUI_GetNonBlocksDlg::createOperation() // function : isValid // purpose : //================================================================================= -bool MeasureGUI_GetNonBlocksDlg::isValid (QString&) +bool MeasureGUI_GetNonBlocksDlg::isValid (QString &msg) { - return !myObj->_is_nil(); + return !myObj->_is_nil() && mySpinTol->isValid(msg, !IsPreview()); } //================================================================================= @@ -256,7 +307,13 @@ bool MeasureGUI_GetNonBlocksDlg::execute (ObjectList& objects) { GEOM::GEOM_IBlocksOperations_var anOper = GEOM::GEOM_IBlocksOperations::_narrow(getOperation()); GEOM::GEOM_Object_var aNonQuads; - GEOM::GEOM_Object_var anObj = anOper->GetNonBlocks(myObj, aNonQuads); + double aC1Tol = -1.; + + if (myUseC1Check->isChecked()) { + aC1Tol = mySpinTol->value(); + } + + GEOM::GEOM_Object_var anObj = anOper->GetNonBlocks(myObj, aC1Tol, aNonQuads); //mainFrame()->ResultName->setText(tr("GEOM_NONBLOCKS")); if (!anObj->_is_nil()) diff --git a/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h b/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h index 5282c8cd6..f6f59b680 100644 --- a/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h +++ b/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h @@ -28,7 +28,11 @@ #include -class DlgRef_1Sel; +class QCheckBox; +class QLabel; +class QLineEdit; +class QPushButton; +class SalomeApp_DoubleSpinBox; //================================================================================= // class : MeasureGUI_GetNonBlocksDlg @@ -45,7 +49,7 @@ public: protected: // redefined from GEOMBase_Helper virtual GEOM::GEOM_IOperations_ptr createOperation(); - virtual bool isValid (QString&); + virtual bool isValid (QString &msg); virtual bool execute (ObjectList&); virtual GEOM::GEOM_Object_ptr getFather (GEOM::GEOM_Object_ptr); @@ -56,6 +60,7 @@ private slots: void LineEditReturnPressed(); void SelectionIntoArgument(); void SetEditCurrentArgument(); + void SetUseC1Tolerance(); private: void Init(); @@ -64,7 +69,11 @@ private: private: GEOM::GEOM_Object_var myObj; - DlgRef_1Sel* myGrp; + QLineEdit *myObjectName; + QPushButton *mySelButton; + QCheckBox *myUseC1Check; + QLabel *myTolLbl; + SalomeApp_DoubleSpinBox *mySpinTol; }; #endif // MEASUREGUI_GETNONBLOCKSDLG_H