From 6833ee2b3e774239b93e4d3ea1b2c3c9dfde61d3 Mon Sep 17 00:00:00 2001 From: skv Date: Fri, 4 Apr 2014 10:44:39 +0400 Subject: [PATCH] 0022373: EDF 2691 GEOM: Publish the shapes with error in Check Shape --- doc/salome/examples/check_shape.py | 3 +- doc/salome/gui/GEOM/images/measures9.png | Bin 16618 -> 26026 bytes doc/salome/gui/GEOM/input/check_shape.doc | 33 +- idl/GEOM_Gen.idl | 93 ++- src/GEOMGUI/GEOM_msg_en.ts | 183 +++- src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx | 790 +++++++++--------- src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx | 48 +- src/GEOM_I/GEOM_Gen_i.cc | 1 + src/GEOM_I/GEOM_Gen_i.hh | 1 + src/GEOM_I/GEOM_IMeasureOperations_i.cc | 354 +++++++- src/GEOM_I/GEOM_IMeasureOperations_i.hh | 14 +- src/GEOM_SWIG/GEOM_TestMeasures.py | 3 +- src/GEOM_SWIG/geomBuilder.py | 70 +- src/MeasureGUI/CMakeLists.txt | 1 + ...sureGUI_1Sel1Check1TextView2ListBox_QTD.ui | 138 +++ .../MeasureGUI_CheckCompoundOfBlocksDlg.cxx | 16 +- src/MeasureGUI/MeasureGUI_CheckShapeDlg.cxx | 527 +++++++++++- src/MeasureGUI/MeasureGUI_CheckShapeDlg.h | 32 +- src/MeasureGUI/MeasureGUI_Widgets.cxx | 15 + src/MeasureGUI/MeasureGUI_Widgets.h | 16 + 20 files changed, 1808 insertions(+), 530 deletions(-) mode change 100644 => 100755 src/GEOM_I/GEOM_Gen_i.cc create mode 100644 src/MeasureGUI/MeasureGUI_1Sel1Check1TextView2ListBox_QTD.ui diff --git a/doc/salome/examples/check_shape.py b/doc/salome/examples/check_shape.py index 30793345e..a0e728967 100644 --- a/doc/salome/examples/check_shape.py +++ b/doc/salome/examples/check_shape.py @@ -8,8 +8,9 @@ geompy = geomBuilder.New(salome.myStudy) # create a box box = geompy.MakeBoxDXDYDZ(100,30,100) -IsValid = geompy.CheckShape(box) +(IsValid, err) = geompy.CheckShape(box, 0, 2) if IsValid == 0: + geompy.PrintShapeError(box, err) raise RuntimeError, "Invalid box created" else: print "\nBox is valid" diff --git a/doc/salome/gui/GEOM/images/measures9.png b/doc/salome/gui/GEOM/images/measures9.png index 38a29bb171abc2e51a1c41814920cb1d69b987da..c5d7d331d33658ff289db3a69b01c143c9208a1b 100755 GIT binary patch literal 26026 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%0D|ZE`rR}nO|LkCv@DU|hwn{;dm;dFz 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: Boolean. -\n TUI Command: geompy.CheckShape(theShape, theIsCheckGeom = 0), -where \em theShape is the shape checked for validity. - +\n Result: Boolean; highlight in the viewer. +\n TUI Commands: +

    +
  • +geompy.CheckShape(theShape, theIsCheckGeom = 0, theReturnStatus = 0), \n +where \n +\em theShape is the shape checked for validity. \n +\em theIsCheckGeom is the flag that tells if geometry should be checked also.\n +\em theReturnStatus is the flag that can have the following values: +
      +
    • 0 - Means that if theShape is invalid, a description of problem is printed. +IsValid status is returned.
    • +
    • 1 - Means that IsValid status and the description of problem are returned.
    • +
    • 2 - Means that IsValid status and the list of error data are returned.
    • +
    +
  • +
  • +geompy.PrintShapeErrors(self, theShape, theShapeErrors, theReturnStatus = 0), \n +where \n +\em theShape Shape that was checked. \n +\em theShapeErrors the shape errors obtained by CheckShape. \n +\em theReturnStatus is the flag that can have the following values: +
      +
    • 0 - Means that a description of problem is printed. +IsValid status is returned.
    • +
    • 1 - Means that the description of problem is returned.
    • +
    +
  • +
See also a \ref tui_check_shape_page "TUI example". \image html measures9.png diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index 9950494cb..ecf0308db 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -4002,23 +4002,104 @@ module GEOM out double EdgeMin, out double EdgeMax, out double VertMin, out double VertMax); + /*! + * \brief Enumeration of Shape defects coming from CheckShape algorithms. + */ + enum ShapeErrorType + { + /* for vertices */ + InvalidPointOnCurve, + InvalidPointOnCurveOnSurface, + InvalidPointOnSurface, + + /* for edges */ + No3DCurve, + Multiple3DCurve, + Invalid3DCurve, + NoCurveOnSurface, + InvalidCurveOnSurface, + InvalidCurveOnClosedSurface, + InvalidSameRangeFlag, + InvalidSameParameterFlag, + InvalidDegeneratedFlag, + + FreeEdge, + InvalidMultiConnexity, + InvalidRange, + + /* for wires */ + EmptyWire, + RedundantEdge, + SelfIntersectingWire, /* on a face */ + + /* for faces */ + NoSurface, + InvalidWire, + RedundantWire, + IntersectingWires, + InvalidImbricationOfWires, + + /* for shells */ + EmptyShell, + RedundantFace, + + /* for shapes */ + UnorientableShape, + NotClosed, + NotConnected, + + SubshapeNotInShape, + + BadOrientation, + BadOrientationOfSubshape, + + InvalidToleranceValue, + + /* for exception */ + CheckFail + }; + + /*! + * \brief Description of a shape defect: type and incriminated sub-shapes. + */ + struct ShapeError + { + ShapeErrorType error; + ListOfLong incriminated; + }; + + /*! + * \brief Sequence of all shape defects. + */ + typedef sequence ShapeErrors; + /*! * \brief Check a topology of the given shape. * \param theShape Shape to check validity of. - * \param theDescription Output. Description of problems in the shape, if they are. + * \param theErrors Structure, containing discovered errors and incriminated sub-shapes. * \return TRUE, if the shape "seems to be valid" from the topological point of view. */ - boolean CheckShape (in GEOM_Object theShape, - out string theDescription); + boolean CheckShape (in GEOM_Object theShape, + out ShapeErrors theErrors); /*! * \brief Check a topology and a geometry of the given shape. * \param theShape Shape to check validity of. - * \param theDescription Output. Description of problems in the shape, if they are. + * \param theErrors Structure, containing discovered errors and incriminated sub-shapes. * \return TRUE, if the shape "seems to be valid". */ - boolean CheckShapeWithGeometry (in GEOM_Object theShape, - out string theDescription); + boolean CheckShapeWithGeometry (in GEOM_Object theShape, + out ShapeErrors theErrors); + + /*! + * \brief Convert sequence of shape errors, returned by + * CheckShape() or CheckShapeWithGeometry(), into string. + * \param theShape the invalid shape. + * \param theErrors The sequence of \a theShape errors. + * \return String, describing all the errors in form, suitable for printing. + */ + string PrintShapeErrors (in GEOM_Object theShape, + in ShapeErrors theErrors); /*! * \brief Check a topology of the given shape on self-intersections presence. diff --git a/src/GEOMGUI/GEOM_msg_en.ts b/src/GEOMGUI/GEOM_msg_en.ts index 35cf49d7f..797c629ff 100644 --- a/src/GEOMGUI/GEOM_msg_en.ts +++ b/src/GEOMGUI/GEOM_msg_en.ts @@ -375,6 +375,26 @@ Please, select face, shell or solid and try again GEOM_CHECK_BLOCKS_COMPOUND_SUBSHAPES Incriminated Sub-shapes + + GEOM_CHECK_BLOCKS_NOT_BLOCK + Not a Block + + + GEOM_CHECK_BLOCKS_EXTRA_EDGE + Extra Edge + + + GEOM_CHECK_BLOCKS_INVALID_CONNECTION + Invalid Connection # %1 + + + GEOM_CHECK_BLOCKS_NOT_CONNECTED + Not Connected + + + GEOM_CHECK_BLOCKS_NOT_GLUED + Not Glued # %1 + GEOM_GETNONBLOCKS_TITLE Get non-hexahedral solids and non-quadrangular faces @@ -391,14 +411,6 @@ Please, select face, shell or solid and try again GEOM_CHECK_INFOS Object And Its Topological Information - - GEOM_CHECK_SHAPE - Check Shape - - - GEOM_CHECK_TITLE - Check Shape Information - GEOM_CHECK_SELF_INTERSECTIONS Detect Self-intersections @@ -6314,6 +6326,161 @@ Do you want to continue? Please specify suitable arguments. + + MeasureGUI_CheckShapeDlg + + GEOM_CHECK_TITLE + Check Shape Information + + + GEOM_CHECK_SHAPE + Check Shape + + + GEOM_CHECK_SHAPE_NAME + Faulty + + + GEOM_CHECK_SHAPE_VALID + This Shape seems to be valid + + + GEOM_CHECK_SHAPE_NOT_VALID + This Shape has errors: + + + CHECK_ERROR_INVALID_POINT_ON_CURVE + Invalid Point on Curve + + + CHECK_ERROR_INVALID_POINT_ON_CURVE_ON_SURFACE + Invalid Point on Curve on Surface + + + CHECK_ERROR_INVALID_POINT_ON_SURFACE + Invalid Point on Surface + + + CHECK_ERROR_NO_3D_CURVE + No 3D Curve + + + CHECK_ERROR_MULTIPLE_3D_CURVE + Multiple 3D Curve + + + CHECK_ERROR_INVALID_3D_CURVE + Invalid 3D Curve + + + CHECK_ERROR_NO_CURVE_ON_SURFACE + No Curve on Surface + + + CHECK_ERROR_INVALID_CURVE_ON_SURFACE + Invalid Curve on Surface + + + CHECK_ERROR_INVALID_CURVE_ON_CLOSED_SURFACE + Invalid Curve on Closed Surface + + + CHECK_ERROR_INVALID_SAME_RANGE_FLAG + Invalid Same Range Flag + + + CHECK_ERROR_INVALID_SAME_PARAMETER_FLAG + Invalid Same Parameter Flag + + + CHECK_ERROR_INVALID_DEGENERATED_FLAG + Invalid Degenerated Flag + + + CHECK_ERROR_FREE_EDGE + Free Edge + + + CHECK_ERROR_INVALID_MULTI_CONNEXITY + Invalid Multi Connexity + + + CHECK_ERROR_INVALID_RANGE + Invalid Range + + + CHECK_ERROR_EMPTY_WIRE + Empty Wire + + + CHECK_ERROR_REDUNDANT_EDGE + Redundant Edge + + + CHECK_ERROR_SELF_INTERSECTING_WIRE + Self-Intersecting Wire + + + CHECK_ERROR_NO_SURFACE + No Surface + + + CHECK_ERROR_INVALID_WIRE + Invalid Wire + + + CHECK_ERROR_REDUNDANT_WIRE + Redundant Wire + + + CHECK_ERROR_INTERSECTING_WIRES + Intersecting Wires + + + CHECK_ERROR_INVALID_IMBRICATION_OF_WIRES + Invalid Imbrication of Wires + + + CHECK_ERROR_EMPTY_SHELL + Empty Shell + + + CHECK_ERROR_REDUNDANT_FACE + Redundant Face + + + CHECK_ERROR_UNORIENTABLE_SHAPE + Unorientable Shape + + + CHECK_ERROR_NOT_CLOSED + Not Closed + + + CHECK_ERROR_NOT_CONNECTED + Not Connected + + + CHECK_ERROR_SUBSHAPE_NOT_IN_SHAPE + Subshape not in Shape + + + CHECK_ERROR_BAD_ORIENTATION + Bad Orientation + + + CHECK_ERROR_BAD_ORIENTATION_OF_SUBSHAPE + Bad Orientation of Subshape + + + CHECK_ERROR_INVALID_TOLERANCE_VALUE + Invalid Tolerance Value + + + CHECK_ERROR_CHECK_FAIL + Check Fail + + OperationGUI_ChamferDlg diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx index 5a191cd6b..bc7111cb2 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.cxx @@ -20,96 +20,56 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // -#include - #include - -#include -#include #include -#include +#include +#include #include -#include +#include +#include #include -#include #include -#include - #include -#include -#include // OCCT Includes -#include -#include -#include -#include - +#include +#include +#include +#include +#include #include -#include -#include -#include -#include #include -#include +#include #include -#include #include #include #include #include #include #include - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include +#include +#include #include #include - -#include - -#include -#include - #include #include - #include #include - -#include -#include - -#include -#include -#include -#include -#include -#include - -#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC //============================================================================= @@ -1298,11 +1258,12 @@ void GEOMImpl_IMeasureOperations::GetTolerance * CheckShape */ //============================================================================= -bool GEOMImpl_IMeasureOperations::CheckShape (Handle(GEOM_Object) theShape, - const Standard_Boolean theIsCheckGeom, - TCollection_AsciiString& theDump) +bool GEOMImpl_IMeasureOperations::CheckShape (Handle(GEOM_Object) theShape, + const Standard_Boolean theIsCheckGeom, + std::list &theErrors) { SetErrorCode(KO); + theErrors.clear(); if (theShape.IsNull()) return false; @@ -1323,10 +1284,9 @@ bool GEOMImpl_IMeasureOperations::CheckShape (Handle(GEOM_Object) theShape, #endif BRepCheck_Analyzer ana (aShape, theIsCheckGeom); if (ana.IsValid()) { - theDump.Clear(); isValid = true; } else { - StructuralDump(ana, aShape, theDump); + FillErrors(ana, aShape, theErrors); } } catch (Standard_Failure) { @@ -1339,6 +1299,223 @@ bool GEOMImpl_IMeasureOperations::CheckShape (Handle(GEOM_Object) theShape, return isValid; } +//============================================================================= +/*! + * PrintShapeErrors + */ +//============================================================================= +TCollection_AsciiString GEOMImpl_IMeasureOperations::PrintShapeErrors + (Handle(GEOM_Object) theShape, + const std::list &theErrors) +{ + TCollection_AsciiString aDump; + + if (theShape.IsNull()) { + return aDump; + } + + Handle(GEOM_Function) aRefShape = theShape->GetLastFunction(); + + if (aRefShape.IsNull()) { + return aDump; + } + + TopoDS_Shape aShape = aRefShape->GetValue(); + + if (aShape.IsNull()) { + SetErrorCode("The Objects has NULL Shape"); + return aDump; + } + + if (!theErrors.empty()) { + // The shape is not valid. Prepare errors for dump. + TopTools_IndexedMapOfShape anIndices; + std::list::const_iterator anIter = theErrors.begin(); + Standard_Integer nbv, nbe, nbw, nbf, nbs, nbo; + nbv = nbe = nbw = nbf = nbs = nbo = 0; + + // Map sub-shapes and their indices + TopExp::MapShapes(aShape, anIndices); + + const Standard_Integer aNbSubShapes = anIndices.Extent(); + TColStd_MapOfInteger aMapPbInd; + + aDump += " -- The Shape has problems :\n"; + aDump += " Check Count\n"; + aDump += " ------------------------------------------------\n"; + + for (; anIter != theErrors.end(); anIter++) { + Standard_Integer aNbShapes = anIter->incriminated.size(); + + switch(anIter->error) { + case BRepCheck_InvalidPointOnCurve: + aDump += " Invalid Point on Curve ................... "; + break; + case BRepCheck_InvalidPointOnCurveOnSurface: + aDump += " Invalid Point on CurveOnSurface .......... "; + break; + case BRepCheck_InvalidPointOnSurface: + aDump += " Invalid Point on Surface ................. "; + break; + case BRepCheck_No3DCurve: + aDump += " No 3D Curve .............................. "; + break; + case BRepCheck_Multiple3DCurve: + aDump += " Multiple 3D Curve ........................ "; + break; + case BRepCheck_Invalid3DCurve: + aDump += " Invalid 3D Curve ......................... "; + break; + case BRepCheck_NoCurveOnSurface: + aDump += " No Curve on Surface ...................... "; + break; + case BRepCheck_InvalidCurveOnSurface: + aDump += " Invalid Curve on Surface ................. "; + break; + case BRepCheck_InvalidCurveOnClosedSurface: + aDump += " Invalid Curve on closed Surface .......... "; + break; + case BRepCheck_InvalidSameRangeFlag: + aDump += " Invalid SameRange Flag ................... "; + break; + case BRepCheck_InvalidSameParameterFlag: + aDump += " Invalid SameParameter Flag ............... "; + break; + case BRepCheck_InvalidDegeneratedFlag: + aDump += " Invalid Degenerated Flag ................. "; + break; + case BRepCheck_FreeEdge: + aDump += " Free Edge ................................ "; + break; + case BRepCheck_InvalidMultiConnexity: + aDump += " Invalid MultiConnexity ................... "; + break; + case BRepCheck_InvalidRange: + aDump += " Invalid Range ............................ "; + break; + case BRepCheck_EmptyWire: + aDump += " Empty Wire ............................... "; + break; + case BRepCheck_RedundantEdge: + aDump += " Redundant Edge ........................... "; + break; + case BRepCheck_SelfIntersectingWire: + aDump += " Self Intersecting Wire ................... "; + break; + case BRepCheck_NoSurface: + aDump += " No Surface ............................... "; + break; + case BRepCheck_InvalidWire: + aDump += " Invalid Wire ............................. "; + break; + case BRepCheck_RedundantWire: + aDump += " Redundant Wire ........................... "; + break; + case BRepCheck_IntersectingWires: + aDump += " Intersecting Wires ....................... "; + break; + case BRepCheck_InvalidImbricationOfWires: + aDump += " Invalid Imbrication of Wires ............. "; + break; + case BRepCheck_EmptyShell: + aDump += " Empty Shell .............................. "; + break; + case BRepCheck_RedundantFace: + aDump += " Redundant Face ........................... "; + break; + case BRepCheck_UnorientableShape: + aDump += " Unorientable Shape ....................... "; + break; + case BRepCheck_NotClosed: + aDump += " Not Closed ............................... "; + break; + case BRepCheck_NotConnected: + aDump += " Not Connected ............................ "; + break; + case BRepCheck_SubshapeNotInShape: + aDump += " Sub-shape not in Shape ................... "; + break; + case BRepCheck_BadOrientation: + aDump += " Bad Orientation .......................... "; + break; + case BRepCheck_BadOrientationOfSubshape: + aDump += " Bad Orientation of Sub-shape ............. "; + break; + case BRepCheck_InvalidToleranceValue: + aDump += " Invalid Tolerance Value .................. "; + break; + case BRepCheck_CheckFail: + aDump += " Check Shape Failure ...................... "; + break; + default: + break; + } + + aDump += TCollection_AsciiString(aNbShapes) + "\n"; + + // Count types of shape. + std::list::const_iterator aShIter = anIter->incriminated.begin(); + + for (; aShIter != anIter->incriminated.end(); aShIter++) { + const Standard_Integer anIndex = *aShIter; + + if (anIndex > 0 && anIndex <= aNbSubShapes && aMapPbInd.Add(anIndex)) { + const TopoDS_Shape &aSubShape = anIndices.FindKey(anIndex); + const TopAbs_ShapeEnum aType = aSubShape.ShapeType(); + + switch (aType) { + case TopAbs_VERTEX : nbv++; break; + case TopAbs_EDGE : nbe++; break; + case TopAbs_WIRE : nbw++; break; + case TopAbs_FACE : nbf++; break; + case TopAbs_SHELL : nbs++; break; + case TopAbs_SOLID : nbo++; break; + default : break; + } + } + } + } + + const Standard_Integer aNbFaultyShapes = nbv + nbe + nbw + nbf + nbs + nbo; + aDump += " ------------------------------------------------\n"; + aDump += "*** Shapes with problems : "; + aDump += TCollection_AsciiString(aNbFaultyShapes) + "\n"; + + if (nbv > 0) { + aDump += "VERTEX : "; + if (nbv < 10) aDump += " "; + aDump += TCollection_AsciiString(nbv) + "\n"; + } + if (nbe > 0) { + aDump += "EDGE : "; + if (nbe < 10) aDump += " "; + aDump += TCollection_AsciiString(nbe) + "\n"; + } + if (nbw > 0) { + aDump += "WIRE : "; + if (nbw < 10) aDump += " "; + aDump += TCollection_AsciiString(nbw) + "\n"; + } + if (nbf > 0) { + aDump += "FACE : "; + if (nbf < 10) aDump += " "; + aDump += TCollection_AsciiString(nbf) + "\n"; + } + if (nbs > 0) { + aDump += "SHELL : "; + if (nbs < 10) aDump += " "; + aDump += TCollection_AsciiString(nbs) + "\n"; + } + if (nbo > 0) { + aDump += "SOLID : "; + if (nbo < 10) aDump += " "; + aDump += TCollection_AsciiString(nbo) + "\n"; + } + } + + return aDump; +} + //============================================================================= /*! * CheckSelfIntersections @@ -2297,362 +2474,157 @@ Standard_Real GEOMImpl_IMeasureOperations::MinSurfaceCurvatureByPoint return getSurfaceCurvatures(aSurf, UV.X(), UV.Y(), false); } - //======================================================================= -//function : StructuralDump -//purpose : Structural (data exchange) style of output. +//function : FillErrorsSub +//purpose : Fill the errors list of subshapes on shape. //======================================================================= -void GEOMImpl_IMeasureOperations::StructuralDump (const BRepCheck_Analyzer& theAna, - const TopoDS_Shape& theShape, - TCollection_AsciiString& theDump) +void GEOMImpl_IMeasureOperations::FillErrorsSub + (const BRepCheck_Analyzer &theAna, + const TopoDS_Shape &theShape, + const TopAbs_ShapeEnum theSubType, + TopTools_DataMapOfIntegerListOfShape &theMapErrors) const { - Standard_Integer i; - theDump.Clear(); - theDump += " -- The Shape has problems :\n"; - theDump += " Check Count\n"; - theDump += " ------------------------------------------------\n"; + TopExp_Explorer anExp(theShape, theSubType); + TopTools_MapOfShape aMapSubShapes; - Standard_Integer last_stat = (Standard_Integer)BRepCheck_CheckFail; - Handle(TColStd_HArray1OfInteger) NbProblems = - new TColStd_HArray1OfInteger(1, last_stat); - for (i = 1; i <= last_stat; i++) - NbProblems->SetValue(i,0); + for (; anExp.More(); anExp.Next()) { + const TopoDS_Shape &aSubShape = anExp.Current(); - Handle(TopTools_HSequenceOfShape) sl; - sl = new TopTools_HSequenceOfShape(); - TopTools_DataMapOfShapeListOfShape theMap; - theMap.Clear(); - GetProblemShapes(theAna, theShape, sl, NbProblems, theMap); - theMap.Clear(); + if (aMapSubShapes.Add(aSubShape)) { + const Handle(BRepCheck_Result) &aRes = theAna.Result(aSubShape); - Standard_Integer count = 0; - count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidPointOnCurve); - if (count > 0) { - theDump += " Invalid Point on Curve ................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidPointOnCurveOnSurface); - if (count > 0) { - theDump += " Invalid Point on CurveOnSurface .......... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidPointOnSurface); - if (count > 0) { - theDump += " Invalid Point on Surface ................. "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_No3DCurve); - if (count > 0) { - theDump += " No 3D Curve .............................. "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_Multiple3DCurve); - if (count > 0) { - theDump += " Multiple 3D Curve ........................ "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_Invalid3DCurve); - if (count > 0) { - theDump += " Invalid 3D Curve ......................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_NoCurveOnSurface); - if (count > 0) { - theDump += " No Curve on Surface ...................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidCurveOnSurface); - if (count > 0) { - theDump += " Invalid Curve on Surface ................. "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidCurveOnClosedSurface); - if (count > 0) { - theDump += " Invalid Curve on closed Surface .......... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidSameRangeFlag); - if (count > 0) { - theDump += " Invalid SameRange Flag ................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidSameParameterFlag); - if (count > 0) { - theDump += " Invalid SameParameter Flag ............... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidDegeneratedFlag); - if (count > 0) { - theDump += " Invalid Degenerated Flag ................. "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_FreeEdge); - if (count > 0) { - theDump += " Free Edge ................................ "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidMultiConnexity); - if (count > 0) { - theDump += " Invalid MultiConnexity ................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidRange); - if (count > 0) { - theDump += " Invalid Range ............................ "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_EmptyWire); - if (count > 0) { - theDump += " Empty Wire ............................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_RedundantEdge); - if (count > 0) { - theDump += " Redundant Edge ........................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_SelfIntersectingWire); - if (count > 0) { - theDump += " Self Intersecting Wire ................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_NoSurface); - if (count > 0) { - theDump += " No Surface ............................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidWire); - if (count > 0) { - theDump += " Invalid Wire ............................. "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_RedundantWire); - if (count > 0) { - theDump += " Redundant Wire ........................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_IntersectingWires); - if (count > 0) { - theDump += " Intersecting Wires ....................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_InvalidImbricationOfWires); - if (count > 0) { - theDump += " Invalid Imbrication of Wires ............. "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_EmptyShell); - if (count > 0) { - theDump += " Empty Shell .............................. "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_RedundantFace); - if (count > 0) { - theDump += " Redundant Face ........................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_UnorientableShape); - if (count > 0) { - theDump += " Unorientable Shape ....................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_NotClosed); - if (count > 0) { - theDump += " Not Closed ............................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_NotConnected); - if (count > 0) { - theDump += " Not Connected ............................ "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_SubshapeNotInShape); - if (count > 0) { - theDump += " Sub-shape not in Shape .................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_BadOrientation); - if (count > 0) { - theDump += " Bad Orientation .......................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_BadOrientationOfSubshape); - if (count > 0) { - theDump += " Bad Orientation of Sub-shape .............. "; - theDump += TCollection_AsciiString(count) + "\n"; - } - count = NbProblems->Value((Standard_Integer)BRepCheck_CheckFail); - if (count > 0) { - theDump += " checkshape failure ....................... "; - theDump += TCollection_AsciiString(count) + "\n"; - } + for (aRes->InitContextIterator(); + aRes->MoreShapeInContext(); + aRes->NextShapeInContext()) { + if (aRes->ContextualShape().IsSame(theShape)) { + BRepCheck_ListIteratorOfListOfStatus itl(aRes->StatusOnShape()); - theDump += " ------------------------------------------------\n"; - theDump += "*** Shapes with problems : "; - theDump += TCollection_AsciiString(sl->Length()) + "\n"; + if (itl.Value() != BRepCheck_NoError) { + // Add all errors for theShape and its sub-shape. + for (;itl.More(); itl.Next()) { + const Standard_Integer aStat = (Standard_Integer)itl.Value(); - Standard_Integer nbv, nbe, nbw, nbf, nbs, nbo; - nbv = nbe = nbw = nbf = nbs = nbo = 0; + if (!theMapErrors.IsBound(aStat)) { + TopTools_ListOfShape anEmpty; - for (i = 1; i <= sl->Length(); i++) { - TopoDS_Shape shi = sl->Value(i); - TopAbs_ShapeEnum sti = shi.ShapeType(); - switch (sti) { - case TopAbs_VERTEX : nbv++; break; - case TopAbs_EDGE : nbe++; break; - case TopAbs_WIRE : nbw++; break; - case TopAbs_FACE : nbf++; break; - case TopAbs_SHELL : nbs++; break; - case TopAbs_SOLID : nbo++; break; - default : break; - } - } + theMapErrors.Bind(aStat, anEmpty); + } - if (nbv > 0) { - theDump += "VERTEX : "; - if (nbv < 10) theDump += " "; - theDump += TCollection_AsciiString(nbv) + "\n"; - } - if (nbe > 0) { - theDump += "EDGE : "; - if (nbe < 10) theDump += " "; - theDump += TCollection_AsciiString(nbe) + "\n"; - } - if (nbw > 0) { - theDump += "WIRE : "; - if (nbw < 10) theDump += " "; - theDump += TCollection_AsciiString(nbw) + "\n"; - } - if (nbf > 0) { - theDump += "FACE : "; - if (nbf < 10) theDump += " "; - theDump += TCollection_AsciiString(nbf) + "\n"; - } - if (nbs > 0) { - theDump += "SHELL : "; - if (nbs < 10) theDump += " "; - theDump += TCollection_AsciiString(nbs) + "\n"; - } - if (nbo > 0) { - theDump += "SOLID : "; - if (nbo < 10) theDump += " "; - theDump += TCollection_AsciiString(nbo) + "\n"; - } -} + TopTools_ListOfShape &theShapes = theMapErrors.ChangeFind(aStat); - -//======================================================================= -//function : GetProblemShapes -// purpose : for StructuralDump -//======================================================================= -void GEOMImpl_IMeasureOperations::GetProblemShapes (const BRepCheck_Analyzer& theAna, - const TopoDS_Shape& theShape, - Handle(TopTools_HSequenceOfShape)& sl, - Handle(TColStd_HArray1OfInteger)& NbProblems, - TopTools_DataMapOfShapeListOfShape& theMap) -{ - for (TopoDS_Iterator iter(theShape); iter.More(); iter.Next()) { - GetProblemShapes(theAna, iter.Value(), sl, NbProblems, theMap); - } - TopAbs_ShapeEnum styp = theShape.ShapeType(); - BRepCheck_ListIteratorOfListOfStatus itl; - TopTools_ListOfShape empty; - if (!theMap.IsBound(theShape)) { - theMap.Bind(theShape,empty); - - if (!theAna.Result(theShape).IsNull()) { - itl.Initialize(theAna.Result(theShape)->Status()); - // !!! May be, we have to print all the problems, not only the first one ? - if (itl.Value() != BRepCheck_NoError) { - sl->Append(theShape); - BRepCheck_Status stat = itl.Value(); - NbProblems->SetValue((Standard_Integer)stat, - NbProblems->Value((Standard_Integer)stat) + 1); - } - } - } - - switch (styp) { - case TopAbs_EDGE: - GetProblemSub(theAna, theShape, sl, NbProblems, TopAbs_VERTEX, theMap); - break; - case TopAbs_FACE: - GetProblemSub(theAna, theShape, sl, NbProblems, TopAbs_WIRE, theMap); - GetProblemSub(theAna, theShape, sl, NbProblems, TopAbs_EDGE, theMap); - GetProblemSub(theAna, theShape, sl, NbProblems, TopAbs_VERTEX, theMap); - break; - case TopAbs_SHELL: - break; - case TopAbs_SOLID: - GetProblemSub(theAna, theShape, sl, NbProblems, TopAbs_SHELL, theMap); - break; - default: - break; - } -} - -//======================================================================= -//function : Contains -//======================================================================= -static Standard_Boolean Contains (const TopTools_ListOfShape& L, - const TopoDS_Shape& S) -{ - TopTools_ListIteratorOfListOfShape it; - for (it.Initialize(L); it.More(); it.Next()) { - if (it.Value().IsSame(S)) { - return Standard_True; - } - } - return Standard_False; -} - -//======================================================================= -//function : GetProblemSub -// purpose : for StructuralDump -//======================================================================= -void GEOMImpl_IMeasureOperations::GetProblemSub (const BRepCheck_Analyzer& theAna, - const TopoDS_Shape& theShape, - Handle(TopTools_HSequenceOfShape)& sl, - Handle(TColStd_HArray1OfInteger)& NbProblems, - const TopAbs_ShapeEnum Subtype, - TopTools_DataMapOfShapeListOfShape& theMap) -{ - BRepCheck_ListIteratorOfListOfStatus itl; - TopExp_Explorer exp; - for (exp.Init(theShape, Subtype); exp.More(); exp.Next()) { - const TopoDS_Shape& sub = exp.Current(); - - const Handle(BRepCheck_Result)& res = theAna.Result(sub); - for (res->InitContextIterator(); - res->MoreShapeInContext(); - res->NextShapeInContext()) { - if (res->ContextualShape().IsSame(theShape) && !Contains(theMap(sub), theShape)) { - theMap(sub).Append(theShape); - itl.Initialize(res->StatusOnShape()); - - if (itl.Value() != BRepCheck_NoError) { - Standard_Integer ii = 0; - - for (ii = 1; ii <= sl->Length(); ii++) - if (sl->Value(ii).IsSame(sub)) break; - - if (ii > sl->Length()) { - sl->Append(sub); - BRepCheck_Status stat = itl.Value(); - NbProblems->SetValue((Standard_Integer)stat, - NbProblems->Value((Standard_Integer)stat) + 1); - } - for (ii = 1; ii <= sl->Length(); ii++) - if (sl->Value(ii).IsSame(theShape)) break; - if (ii > sl->Length()) { - sl->Append(theShape); - BRepCheck_Status stat = itl.Value(); - NbProblems->SetValue((Standard_Integer)stat, - NbProblems->Value((Standard_Integer)stat) + 1); + theShapes.Append(aSubShape); + theShapes.Append(theShape); + } } } + break; } } } } + +//======================================================================= +//function : FillErrors +//purpose : Fill the errors list. +//======================================================================= +void GEOMImpl_IMeasureOperations::FillErrors + (const BRepCheck_Analyzer &theAna, + const TopoDS_Shape &theShape, + TopTools_DataMapOfIntegerListOfShape &theMapErrors, + TopTools_MapOfShape &theMapShapes) const +{ + if (theMapShapes.Add(theShape)) { + // Fill errors of child shapes. + for (TopoDS_Iterator iter(theShape); iter.More(); iter.Next()) { + FillErrors(theAna, iter.Value(), theMapErrors, theMapShapes); + } + + // Fill errors of theShape. + const Handle(BRepCheck_Result) &aRes = theAna.Result(theShape); + + if (!aRes.IsNull()) { + BRepCheck_ListIteratorOfListOfStatus itl(aRes->Status()); + + if (itl.Value() != BRepCheck_NoError) { + // Add all errors for theShape. + for (;itl.More(); itl.Next()) { + const Standard_Integer aStat = (Standard_Integer)itl.Value(); + + if (!theMapErrors.IsBound(aStat)) { + TopTools_ListOfShape anEmpty; + + theMapErrors.Bind(aStat, anEmpty); + } + + theMapErrors.ChangeFind(aStat).Append(theShape); + } + } + } + + // Add errors of subshapes on theShape. + const TopAbs_ShapeEnum aType = theShape.ShapeType(); + + switch (aType) { + case TopAbs_EDGE: + FillErrorsSub(theAna, theShape, TopAbs_VERTEX, theMapErrors); + break; + case TopAbs_FACE: + FillErrorsSub(theAna, theShape, TopAbs_WIRE, theMapErrors); + FillErrorsSub(theAna, theShape, TopAbs_EDGE, theMapErrors); + FillErrorsSub(theAna, theShape, TopAbs_VERTEX, theMapErrors); + break; + case TopAbs_SOLID: + FillErrorsSub(theAna, theShape, TopAbs_SHELL, theMapErrors); + break; + default: + break; + } + } +} + +//======================================================================= +//function : FillErrors +//purpose : Fill the errors list. +//======================================================================= +void GEOMImpl_IMeasureOperations::FillErrors + (const BRepCheck_Analyzer &theAna, + const TopoDS_Shape &theShape, + std::list &theErrors) const +{ + // Fill the errors map. + TopTools_DataMapOfIntegerListOfShape aMapErrors; + TopTools_MapOfShape aMapShapes; + + FillErrors(theAna, theShape, aMapErrors, aMapShapes); + + // Map sub-shapes and their indices + TopTools_IndexedMapOfShape anIndices; + + TopExp::MapShapes(theShape, anIndices); + + TopTools_DataMapIteratorOfDataMapOfIntegerListOfShape aMapIter(aMapErrors); + + for (; aMapIter.More(); aMapIter.Next()) { + ShapeError anError; + + anError.error = (BRepCheck_Status)aMapIter.Key(); + + TopTools_ListIteratorOfListOfShape aListIter(aMapIter.Value()); + TopTools_MapOfShape aMapUnique; + + for (; aListIter.More(); aListIter.Next()) { + const TopoDS_Shape &aShape = aListIter.Value(); + + if (aMapUnique.Add(aShape)) { + const Standard_Integer anIndex = anIndices.FindIndex(aShape); + + anError.incriminated.push_back(anIndex); + } + } + + if (!anError.incriminated.empty()) { + theErrors.push_back(anError); + } + } +} diff --git a/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx index 45015b8cb..86d0a9c7b 100644 --- a/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx +++ b/src/GEOMImpl/GEOMImpl_IMeasureOperations.hxx @@ -26,13 +26,13 @@ #include "GEOM_IOperations.hxx" #include +#include #include -#include -#include #include #include #include -#include +#include +#include #include #include @@ -127,9 +127,18 @@ class GEOMImpl_IMeasureOperations : public GEOM_IOperations { Standard_Real& EdgeMin, Standard_Real& EdgeMax, Standard_Real& VertMin, Standard_Real& VertMax); - Standard_EXPORT bool CheckShape (Handle(GEOM_Object) theShape, - const Standard_Boolean theIsCheckGeom, - TCollection_AsciiString& theDump); + struct ShapeError { + BRepCheck_Status error; + std::list incriminated; + }; + + Standard_EXPORT bool CheckShape (Handle(GEOM_Object) theShape, + const Standard_Boolean theIsCheckGeom, + std::list &theErrors); + + Standard_EXPORT TCollection_AsciiString PrintShapeErrors + (Handle(GEOM_Object) theShape, + const std::list &theErrors); Standard_EXPORT bool CheckSelfIntersections (Handle(GEOM_Object) theShape, Handle(TColStd_HSequenceOfInteger)& theIntersections); @@ -177,22 +186,21 @@ class GEOMImpl_IMeasureOperations : public GEOM_IOperations { Handle(GEOM_Object) thePoint); private: - void StructuralDump (const BRepCheck_Analyzer& theAna, - const TopoDS_Shape& theShape, - TCollection_AsciiString& theDump); - void GetProblemShapes (const BRepCheck_Analyzer& theAna, - const TopoDS_Shape& theShape, - Handle(TopTools_HSequenceOfShape)& sl, - Handle(TColStd_HArray1OfInteger)& NbProblems, - TopTools_DataMapOfShapeListOfShape& theMap); + void FillErrorsSub + (const BRepCheck_Analyzer &theAna, + const TopoDS_Shape &theShape, + const TopAbs_ShapeEnum theSubType, + TopTools_DataMapOfIntegerListOfShape &theMapErrors) const; + void FillErrors + (const BRepCheck_Analyzer &theAna, + const TopoDS_Shape &theShape, + TopTools_DataMapOfIntegerListOfShape &theMapErrors, + TopTools_MapOfShape &theMapShapes) const; - void GetProblemSub (const BRepCheck_Analyzer& theAna, - const TopoDS_Shape& theShape, - Handle(TopTools_HSequenceOfShape)& sl, - Handle(TColStd_HArray1OfInteger)& NbProblems, - const TopAbs_ShapeEnum Subtype, - TopTools_DataMapOfShapeListOfShape& theMap); + void FillErrors (const BRepCheck_Analyzer &theAna, + const TopoDS_Shape &theShape, + std::list &theErrors) const; Standard_Real getSurfaceCurvatures (const Handle(Geom_Surface)& aSurf, Standard_Real theUParam, diff --git a/src/GEOM_I/GEOM_Gen_i.cc b/src/GEOM_I/GEOM_Gen_i.cc old mode 100644 new mode 100755 index f51456c46..4732c1f5a --- a/src/GEOM_I/GEOM_Gen_i.cc +++ b/src/GEOM_I/GEOM_Gen_i.cc @@ -58,6 +58,7 @@ #include #include #include +#include #include #include diff --git a/src/GEOM_I/GEOM_Gen_i.hh b/src/GEOM_I/GEOM_Gen_i.hh index 4f12a3301..81771124b 100644 --- a/src/GEOM_I/GEOM_Gen_i.hh +++ b/src/GEOM_I/GEOM_Gen_i.hh @@ -60,6 +60,7 @@ //#include // CAREFUL ! position of this file is critic : see Lucien PIGNOLONI / OCC +class TopTools_SequenceOfShape; //===================================================================== // Generic operations creator (for plugins mechanism) diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.cc b/src/GEOM_I/GEOM_IMeasureOperations_i.cc index 7f0d3cac4..b6785bda9 100644 --- a/src/GEOM_I/GEOM_IMeasureOperations_i.cc +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.cc @@ -30,6 +30,291 @@ #include "GEOM_Engine.hxx" #include "GEOM_Object.hxx" +/** + * This function converts shape errors from theErrorsFrom to theErrorsTo. + * Note that theErrorsTo is not cleared at first. + * + * \param theErrorsFrom errors to be converted. + * \param theErrorsTo result errors. + */ +static void ConvertShapeError + (const GEOM::GEOM_IMeasureOperations::ShapeErrors &theErrorsFrom, + std::list &theErrorsTo) +{ + int aNbErr = theErrorsFrom.length(); + int i = 0; + + for (; i < aNbErr; i++) { + const GEOM::GEOM_IMeasureOperations::ShapeError anErr = theErrorsFrom[i]; + const GEOM::GEOM_IMeasureOperations::ShapeErrorType aType = anErr.error; + const GEOM::ListOfLong anIncrims = anErr.incriminated; + GEOMImpl_IMeasureOperations::ShapeError anErrStruct; + + switch (aType) { + case GEOM::GEOM_IMeasureOperations::InvalidPointOnCurve: + anErrStruct.error = BRepCheck_InvalidPointOnCurve; + break; + case GEOM::GEOM_IMeasureOperations::InvalidPointOnCurveOnSurface: + anErrStruct.error = BRepCheck_InvalidPointOnCurveOnSurface; + break; + case GEOM::GEOM_IMeasureOperations::InvalidPointOnSurface: + anErrStruct.error = BRepCheck_InvalidPointOnSurface; + break; + case GEOM::GEOM_IMeasureOperations::No3DCurve: + anErrStruct.error = BRepCheck_No3DCurve; + break; + case GEOM::GEOM_IMeasureOperations::Multiple3DCurve: + anErrStruct.error = BRepCheck_Multiple3DCurve; + break; + case GEOM::GEOM_IMeasureOperations::Invalid3DCurve: + anErrStruct.error = BRepCheck_Invalid3DCurve; + break; + case GEOM::GEOM_IMeasureOperations::NoCurveOnSurface: + anErrStruct.error = BRepCheck_NoCurveOnSurface; + break; + case GEOM::GEOM_IMeasureOperations::InvalidCurveOnSurface: + anErrStruct.error = BRepCheck_InvalidCurveOnSurface; + break; + case GEOM::GEOM_IMeasureOperations::InvalidCurveOnClosedSurface: + anErrStruct.error = BRepCheck_InvalidCurveOnClosedSurface; + break; + case GEOM::GEOM_IMeasureOperations::InvalidSameRangeFlag: + anErrStruct.error = BRepCheck_InvalidSameRangeFlag; + break; + case GEOM::GEOM_IMeasureOperations::InvalidSameParameterFlag: + anErrStruct.error = BRepCheck_InvalidSameParameterFlag; + break; + case GEOM::GEOM_IMeasureOperations::InvalidDegeneratedFlag: + anErrStruct.error = BRepCheck_InvalidDegeneratedFlag; + break; + case GEOM::GEOM_IMeasureOperations::FreeEdge: + anErrStruct.error = BRepCheck_FreeEdge; + break; + case GEOM::GEOM_IMeasureOperations::InvalidMultiConnexity: + anErrStruct.error = BRepCheck_InvalidMultiConnexity; + break; + case GEOM::GEOM_IMeasureOperations::InvalidRange: + anErrStruct.error = BRepCheck_InvalidRange; + break; + case GEOM::GEOM_IMeasureOperations::EmptyWire: + anErrStruct.error = BRepCheck_EmptyWire; + break; + case GEOM::GEOM_IMeasureOperations::RedundantEdge: + anErrStruct.error = BRepCheck_RedundantEdge; + break; + case GEOM::GEOM_IMeasureOperations::SelfIntersectingWire: + anErrStruct.error = BRepCheck_SelfIntersectingWire; + break; + case GEOM::GEOM_IMeasureOperations::NoSurface: + anErrStruct.error = BRepCheck_NoSurface; + break; + case GEOM::GEOM_IMeasureOperations::InvalidWire: + anErrStruct.error = BRepCheck_InvalidWire; + break; + case GEOM::GEOM_IMeasureOperations::RedundantWire: + anErrStruct.error = BRepCheck_RedundantWire; + break; + case GEOM::GEOM_IMeasureOperations::IntersectingWires: + anErrStruct.error = BRepCheck_IntersectingWires; + break; + case GEOM::GEOM_IMeasureOperations::InvalidImbricationOfWires: + anErrStruct.error = BRepCheck_InvalidImbricationOfWires; + break; + case GEOM::GEOM_IMeasureOperations::EmptyShell: + anErrStruct.error = BRepCheck_EmptyShell; + break; + case GEOM::GEOM_IMeasureOperations::RedundantFace: + anErrStruct.error = BRepCheck_RedundantFace; + break; + case GEOM::GEOM_IMeasureOperations::UnorientableShape: + anErrStruct.error = BRepCheck_UnorientableShape; + break; + case GEOM::GEOM_IMeasureOperations::NotClosed: + anErrStruct.error = BRepCheck_NotClosed; + break; + case GEOM::GEOM_IMeasureOperations::NotConnected: + anErrStruct.error = BRepCheck_NotConnected; + break; + case GEOM::GEOM_IMeasureOperations::SubshapeNotInShape: + anErrStruct.error = BRepCheck_SubshapeNotInShape; + break; + case GEOM::GEOM_IMeasureOperations::BadOrientation: + anErrStruct.error = BRepCheck_BadOrientation; + break; + case GEOM::GEOM_IMeasureOperations::BadOrientationOfSubshape: + anErrStruct.error = BRepCheck_BadOrientationOfSubshape; + break; + case GEOM::GEOM_IMeasureOperations::InvalidToleranceValue: + anErrStruct.error = BRepCheck_InvalidToleranceValue; + break; + case GEOM::GEOM_IMeasureOperations::CheckFail: + anErrStruct.error = BRepCheck_CheckFail; + break; + default: + break; + } + + int ii = 0; + int aLen = anIncrims.length(); + + for (; ii < aLen; ii++) { + anErrStruct.incriminated.push_back(anIncrims[ii]); + } + + theErrorsTo.push_back(anErrStruct); + } +} + +/** + * This function converts shape errors from theErrorsFrom to theErrorsTo. + * Note that theErrorsTo is not cleared at first. + * + * \param theErrorsFrom errors to be converted. + * \param theErrorsTo result errors. + */ +static void ConvertShapeError + (const std::list &theErrorsFrom, + GEOM::GEOM_IMeasureOperations::ShapeErrors_out &theErrorsTo) +{ + const int aNbErr = theErrorsFrom.size(); + GEOM::GEOM_IMeasureOperations::ShapeErrors_var anErrArray = + new GEOM::GEOM_IMeasureOperations::ShapeErrors; + + anErrArray->length(aNbErr); + + // fill the local CORBA array with values from lists + std::list::const_iterator + anIt = theErrorsFrom.begin(); + int i = 0; + + for (; anIt != theErrorsFrom.end(); i++, anIt++) { + GEOM::GEOM_IMeasureOperations::ShapeError_var anErrStruct = + new GEOM::GEOM_IMeasureOperations::ShapeError; + + switch (anIt->error) { + case BRepCheck_InvalidPointOnCurve: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::InvalidPointOnCurve; + break; + case BRepCheck_InvalidPointOnCurveOnSurface: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::InvalidPointOnCurveOnSurface; + break; + case BRepCheck_InvalidPointOnSurface: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::InvalidPointOnSurface; + break; + case BRepCheck_No3DCurve: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::No3DCurve; + break; + case BRepCheck_Multiple3DCurve: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::Multiple3DCurve; + break; + case BRepCheck_Invalid3DCurve: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::Invalid3DCurve; + break; + case BRepCheck_NoCurveOnSurface: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::NoCurveOnSurface; + break; + case BRepCheck_InvalidCurveOnSurface: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::InvalidCurveOnSurface; + break; + case BRepCheck_InvalidCurveOnClosedSurface: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::InvalidCurveOnClosedSurface; + break; + case BRepCheck_InvalidSameRangeFlag: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::InvalidSameRangeFlag; + break; + case BRepCheck_InvalidSameParameterFlag: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::InvalidSameParameterFlag; + break; + case BRepCheck_InvalidDegeneratedFlag: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::InvalidDegeneratedFlag; + break; + case BRepCheck_FreeEdge: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::FreeEdge; + break; + case BRepCheck_InvalidMultiConnexity: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::InvalidMultiConnexity; + break; + case BRepCheck_InvalidRange: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::InvalidRange; + break; + case BRepCheck_EmptyWire: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::EmptyWire; + break; + case BRepCheck_RedundantEdge: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::RedundantEdge; + break; + case BRepCheck_SelfIntersectingWire: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::SelfIntersectingWire; + break; + case BRepCheck_NoSurface: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::NoSurface; + break; + case BRepCheck_InvalidWire: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::InvalidWire; + break; + case BRepCheck_RedundantWire: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::RedundantWire; + break; + case BRepCheck_IntersectingWires: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::IntersectingWires; + break; + case BRepCheck_InvalidImbricationOfWires: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::InvalidImbricationOfWires; + break; + case BRepCheck_EmptyShell: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::EmptyShell; + break; + case BRepCheck_RedundantFace: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::RedundantFace; + break; + case BRepCheck_UnorientableShape: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::UnorientableShape; + break; + case BRepCheck_NotClosed: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::NotClosed; + break; + case BRepCheck_NotConnected: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::NotConnected; + break; + case BRepCheck_SubshapeNotInShape: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::SubshapeNotInShape; + break; + case BRepCheck_BadOrientation: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::BadOrientation; + break; + case BRepCheck_BadOrientationOfSubshape: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::BadOrientationOfSubshape; + break; + case BRepCheck_InvalidToleranceValue: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::InvalidToleranceValue; + break; + case BRepCheck_CheckFail: + anErrStruct->error = GEOM::GEOM_IMeasureOperations::CheckFail; + break; + default: + break; + } + + std::list aIndList = anIt->incriminated; + GEOM::ListOfLong_var anIncrims = new GEOM::ListOfLong(); + anIncrims->length(aIndList.size()); + + std::list::iterator anIndIt = aIndList.begin(); + int jj = 0; + + for (; anIndIt != aIndList.end(); jj++, anIndIt++) { + anIncrims[jj] = *anIndIt; + } + + anErrStruct->incriminated = anIncrims; + + anErrArray[i] = anErrStruct; + } + + // initialize out-parameter with local array + theErrorsTo = anErrArray._retn(); +} + //============================================================================= /*! * constructor: @@ -332,15 +617,15 @@ void GEOM_IMeasureOperations_i::GetTolerance * CheckShape */ //============================================================================= -CORBA::Boolean GEOM_IMeasureOperations_i::CheckShape (GEOM::GEOM_Object_ptr theShape, - CORBA::String_out theDescription) +CORBA::Boolean GEOM_IMeasureOperations_i::CheckShape + (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_IMeasureOperations::ShapeErrors_out theErrors) { //Set a not done flag GetOperations()->SetNotDone(); if (CORBA::is_nil(theShape)) { - theDescription = CORBA::string_dup("null"); return 0; } @@ -349,30 +634,26 @@ CORBA::Boolean GEOM_IMeasureOperations_i::CheckShape (GEOM::GEOM_Object_ptr theS if (aShape.IsNull()) { - theDescription = CORBA::string_dup("null2"); return 0; } - // Get shape parameters - TCollection_AsciiString aDump; - if (GetOperations()->CheckShape(aShape, /*check_geom = */false, aDump)) - { - theDescription = CORBA::string_dup("OK"); - return 1; - } - theDescription = CORBA::string_dup(aDump.ToCString()); - return 0; + std::list anErrList; + bool isOk = GetOperations()->CheckShape(aShape, false, anErrList); + + ConvertShapeError(anErrList, theErrors); + + return isOk; } -CORBA::Boolean GEOM_IMeasureOperations_i::CheckShapeWithGeometry (GEOM::GEOM_Object_ptr theShape, - CORBA::String_out theDescription) +CORBA::Boolean GEOM_IMeasureOperations_i::CheckShapeWithGeometry + (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_IMeasureOperations::ShapeErrors_out theErrors) { //Set a not done flag GetOperations()->SetNotDone(); if (CORBA::is_nil(theShape)) { - theDescription = CORBA::string_dup("null"); return 0; } @@ -381,19 +662,42 @@ CORBA::Boolean GEOM_IMeasureOperations_i::CheckShapeWithGeometry (GEOM::GEOM_Obj if (aShape.IsNull()) { - theDescription = CORBA::string_dup("null2"); return 0; } - // Get shape parameters - TCollection_AsciiString aDump; - if (GetOperations()->CheckShape(aShape, /*check_geom = */true, aDump)) - { - theDescription = CORBA::string_dup("OK"); - return 1; + std::list anErrList; + bool isOk = GetOperations()->CheckShape(aShape, true, anErrList); + + ConvertShapeError(anErrList, theErrors); + + return isOk; +} + +//============================================================================= +/*! + * PrintShapeErrors + */ +//============================================================================= +char* GEOM_IMeasureOperations_i::PrintShapeErrors + ( GEOM::GEOM_Object_ptr theShape, + const GEOM::GEOM_IMeasureOperations::ShapeErrors &theErrors) +{ + //Get the reference shape + Handle(GEOM_Object) aShape = GetObjectImpl(theShape); + + if (aShape.IsNull()) { + return NULL; } - theDescription = CORBA::string_dup(aDump.ToCString()); - return 0; + + // Convert the errors sequence + std::list anErrList; + + ConvertShapeError(theErrors, anErrList); + + TCollection_AsciiString aDescr = + GetOperations()->PrintShapeErrors(aShape, anErrList); + + return CORBA::string_dup(aDescr.ToCString()); } //============================================================================= diff --git a/src/GEOM_I/GEOM_IMeasureOperations_i.hh b/src/GEOM_I/GEOM_IMeasureOperations_i.hh index caa3de251..690ac5390 100644 --- a/src/GEOM_I/GEOM_IMeasureOperations_i.hh +++ b/src/GEOM_I/GEOM_IMeasureOperations_i.hh @@ -84,11 +84,17 @@ class GEOM_I_EXPORT GEOM_IMeasureOperations_i : CORBA::Double& EdgeMin, CORBA::Double& EdgeMax, CORBA::Double& VertMin, CORBA::Double& VertMax); - CORBA::Boolean CheckShape (GEOM::GEOM_Object_ptr theShape, - CORBA::String_out theDescription); + CORBA::Boolean CheckShape + (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_IMeasureOperations::ShapeErrors_out theErrors); - CORBA::Boolean CheckShapeWithGeometry (GEOM::GEOM_Object_ptr theShape, - CORBA::String_out theDescription); + CORBA::Boolean CheckShapeWithGeometry + (GEOM::GEOM_Object_ptr theShape, + GEOM::GEOM_IMeasureOperations::ShapeErrors_out theErrors); + + char* PrintShapeErrors + ( GEOM::GEOM_Object_ptr theShape, + const GEOM::GEOM_IMeasureOperations::ShapeErrors &theErrors); CORBA::Boolean CheckSelfIntersections (GEOM::GEOM_Object_ptr theShape, GEOM::ListOfLong_out theIntersections); diff --git a/src/GEOM_SWIG/GEOM_TestMeasures.py b/src/GEOM_SWIG/GEOM_TestMeasures.py index 817a73082..2aed6d6a5 100644 --- a/src/GEOM_SWIG/GEOM_TestMeasures.py +++ b/src/GEOM_SWIG/GEOM_TestMeasures.py @@ -41,8 +41,9 @@ def TestMeasureOperations (geompy, math): ####### CheckShape ####### - IsValid = geompy.CheckShape(box) + (IsValid, err) = geompy.CheckShape(box, 0, 2) if IsValid == 0: + geompy.PrintShapeError(box, err) raise RuntimeError, "Invalid box created" else: print "\nBox is valid" diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index 057e6b064..74d835d0a 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -10142,15 +10142,52 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): self._autoPublish(anObj, theName, "normal") return anObj + ## Print shape errors obtained from CheckShape. + # @param theShape Shape that was checked. + # @param theShapeErrors the shape errors obtained by CheckShape. + # @param theReturnStatus If 0 the description of problem is printed. + # If 1 the description of problem is returned. + # @return If theReturnStatus is equal to 1 the description is returned. + # Otherwise doesn't return anything. + # + # @ref tui_measurement_tools_page "Example" + def PrintShapeErrors(self, theShape, theShapeErrors, theReturnStatus = 0): + """ + Print shape errors obtained from CheckShape. + + Parameters: + theShape Shape that was checked. + theShapeErrors the shape errors obtained by CheckShape. + theReturnStatus If 0 the description of problem is printed. + If 1 the description of problem is returned. + + Returns: + If theReturnStatus is equal to 1 the description is returned. + Otherwise doesn't return anything. + """ + # Example: see GEOM_TestMeasures.py + Descr = self.MeasuOp.PrintShapeErrors(theShape, theShapeErrors) + if theReturnStatus == 1: + return Descr + print Descr + pass + ## Check a topology of the given shape. # @param theShape Shape to check validity of. # @param theIsCheckGeom If FALSE, only the shape's topology will be checked, \n # if TRUE, the shape's geometry will be checked also. - # @param theReturnStatus If FALSE and if theShape is invalid, a description \n - # of problem is printed. - # if TRUE and if theShape is invalid, the description - # of problem is also returned. + # @param theReturnStatus If 0 and if theShape is invalid, a description + # of problem is printed. + # If 1 isValid flag and the description of + # problem is returned. + # If 2 isValid flag and the list of error data + # is returned. # @return TRUE, if the shape "seems to be valid". + # If theShape is invalid, prints a description of problem. + # If theReturnStatus is equal to 1 the description is returned + # along with IsValid flag. + # If theReturnStatus is equal to 2 the list of error data is + # returned along with IsValid flag. # # @ref tui_measurement_tools_page "Example" def CheckShape(self,theShape, theIsCheckGeom = 0, theReturnStatus = 0): @@ -10161,28 +10198,37 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen): theShape Shape to check validity of. theIsCheckGeom If FALSE, only the shape's topology will be checked, if TRUE, the shape's geometry will be checked also. - theReturnStatus If FALSE and if theShape is invalid, a description + theReturnStatus If 0 and if theShape is invalid, a description of problem is printed. - if TRUE and if theShape is invalid, the description - of problem is returned. + If 1 IsValid flag and the description of + problem is returned. + If 2 IsValid flag and the list of error data + is returned. Returns: TRUE, if the shape "seems to be valid". If theShape is invalid, prints a description of problem. - This description can also be returned. + If theReturnStatus is equal to 1 the description is returned + along with IsValid flag. + If theReturnStatus is equal to 2 the list of error data is + returned along with IsValid flag. """ # Example: see GEOM_TestMeasures.py if theIsCheckGeom: - (IsValid, Status) = self.MeasuOp.CheckShapeWithGeometry(theShape) + (IsValid, ShapeErrors) = self.MeasuOp.CheckShapeWithGeometry(theShape) RaiseIfFailed("CheckShapeWithGeometry", self.MeasuOp) else: - (IsValid, Status) = self.MeasuOp.CheckShape(theShape) + (IsValid, ShapeErrors) = self.MeasuOp.CheckShape(theShape) RaiseIfFailed("CheckShape", self.MeasuOp) if IsValid == 0: if theReturnStatus == 0: - print Status + Descr = self.MeasuOp.PrintShapeErrors(theShape, ShapeErrors) + print Descr if theReturnStatus == 1: - return (IsValid, Status) + Descr = self.MeasuOp.PrintShapeErrors(theShape, ShapeErrors) + return (IsValid, Descr) + elif theReturnStatus == 2: + return (IsValid, ShapeErrors) return IsValid ## Detect self-intersections in the given shape. diff --git a/src/MeasureGUI/CMakeLists.txt b/src/MeasureGUI/CMakeLists.txt index 20bacd209..8f57e40ad 100755 --- a/src/MeasureGUI/CMakeLists.txt +++ b/src/MeasureGUI/CMakeLists.txt @@ -66,6 +66,7 @@ SET(_uic_files MeasureGUI_1Sel12LineEdit_QTD.ui MeasureGUI_1Sel1TextView1Check_QTD.ui MeasureGUI_1Sel1TextView2ListBox_QTD.ui + MeasureGUI_1Sel1Check1TextView2ListBox_QTD.ui MeasureGUI_1Sel1TextView_QTD.ui MeasureGUI_1Sel3LineEdit_QTD.ui MeasureGUI_1Sel6LineEdit_QTD.ui diff --git a/src/MeasureGUI/MeasureGUI_1Sel1Check1TextView2ListBox_QTD.ui b/src/MeasureGUI/MeasureGUI_1Sel1Check1TextView2ListBox_QTD.ui new file mode 100644 index 000000000..aa6a3fa3d --- /dev/null +++ b/src/MeasureGUI/MeasureGUI_1Sel1Check1TextView2ListBox_QTD.ui @@ -0,0 +1,138 @@ + + MeasureGUI_1Sel1Check1TextView2ListBox_QTD + + + + 0 + 0 + 235 + 274 + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 6 + + + 6 + + + + + + + + + 9 + + + 9 + + + 9 + + + 9 + + + 6 + + + 6 + + + + + + + + + + + + 100 + 0 + + + + + + + + Check also geometry + + + + + + + + 300 + 0 + + + + + + + + TL2 + + + + + + + TL3 + + + + + + + TL1 + + + + + + + + 0 + 0 + + + + + + + + + + + + + + PushButton1 + LineEdit1 + CheckBox1 + TextView1 + + + + diff --git a/src/MeasureGUI/MeasureGUI_CheckCompoundOfBlocksDlg.cxx b/src/MeasureGUI/MeasureGUI_CheckCompoundOfBlocksDlg.cxx index a0900cbc4..26763b814 100644 --- a/src/MeasureGUI/MeasureGUI_CheckCompoundOfBlocksDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_CheckCompoundOfBlocksDlg.cxx @@ -299,25 +299,19 @@ void MeasureGUI_CheckCompoundOfBlocksDlg::processObject() aErrStr = ""; switch ( aErrs[i].error ) { case GEOM::GEOM_IBlocksOperations::NOT_BLOCK : - aErrStr = "Not a Block"; + aErrStr = tr("GEOM_CHECK_BLOCKS_NOT_BLOCK"); break; case GEOM::GEOM_IBlocksOperations::EXTRA_EDGE : - aErrStr = "Extra Edge"; + aErrStr = tr("GEOM_CHECK_BLOCKS_EXTRA_EDGE"); break; case GEOM::GEOM_IBlocksOperations::INVALID_CONNECTION : - aErrStr = "Invalid Connection"; - aErrStr += aConSfx; - aErrStr += QString::number( aConNum ); - aConNum++; + aErrStr = tr("GEOM_CHECK_BLOCKS_INVALID_CONNECTION").arg(aConNum++); break; case GEOM::GEOM_IBlocksOperations::NOT_CONNECTED : - aErrStr = "Not Connected"; + aErrStr = tr("GEOM_CHECK_BLOCKS_NOT_CONNECTED"); break; case GEOM::GEOM_IBlocksOperations::NOT_GLUED : - aErrStr = "Not Glued"; - aErrStr += aGluedSfx; - aErrStr += QString::number( aGluedNum ); - aGluedNum++; + aErrStr = tr("GEOM_CHECK_BLOCKS_NOT_GLUED").arg(aGluedNum++); break; default : aErrStr = ""; diff --git a/src/MeasureGUI/MeasureGUI_CheckShapeDlg.cxx b/src/MeasureGUI/MeasureGUI_CheckShapeDlg.cxx index 48836f74c..42b9e3abd 100644 --- a/src/MeasureGUI/MeasureGUI_CheckShapeDlg.cxx +++ b/src/MeasureGUI/MeasureGUI_CheckShapeDlg.cxx @@ -24,12 +24,24 @@ // File : MeasureGUI_CheckShapeDlg.cxx // Author : Nicolas REJNERI, Open CASCADE S.A.S. // +#include "MeasureGUI.h" #include "MeasureGUI_CheckShapeDlg.h" #include "MeasureGUI_Widgets.h" +#include +#include +#include +#include #include #include #include +#include +#include + +#include +#include +#include +#include #define TEXTEDIT_FONT_FAMILY "Courier" #define TEXTEDIT_FONT_SIZE 11 @@ -42,7 +54,7 @@ // true to construct a modal dialog. //================================================================================= MeasureGUI_CheckShapeDlg::MeasureGUI_CheckShapeDlg( GeometryGUI* GUI, QWidget* parent ) - : MeasureGUI_Skeleton( GUI, parent ) + : GEOMBase_Skeleton( GUI, parent, false ) { QPixmap image0( SUIT_Session::session()->resourceMgr()->loadPixmap( "GEOM", tr( "ICON_DLG_CHECKSHAPE" ) ) ); @@ -55,8 +67,12 @@ MeasureGUI_CheckShapeDlg::MeasureGUI_CheckShapeDlg( GeometryGUI* GUI, QWidget* p mainFrame()->GroupConstructors->setTitle( tr( "GEOM_CHECK_SHAPE" ) ); mainFrame()->RadioButton1->setIcon( image0 ); + mainFrame()->RadioButton2->setAttribute( Qt::WA_DeleteOnClose ); + mainFrame()->RadioButton2->close(); + mainFrame()->RadioButton3->setAttribute( Qt::WA_DeleteOnClose ); + mainFrame()->RadioButton3->close(); - myGrp = new MeasureGUI_1Sel1TextView1Check( centralWidget() ); + myGrp = new MeasureGUI_1Sel1Check1TextView2ListBox( centralWidget() ); myGrp->GroupBox1->setTitle( tr( "GEOM_CHECK_INFOS" ) ); myGrp->TextLabel1->setText( tr( "GEOM_OBJECT" ) ); myGrp->TextView1->setReadOnly( true ); @@ -67,10 +83,18 @@ MeasureGUI_CheckShapeDlg::MeasureGUI_CheckShapeDlg( GeometryGUI* GUI, QWidget* p myGrp->PushButton1->setIcon( image1 ); myGrp->LineEdit1->setReadOnly( true ); + myGrp->TextLabel2->setText( tr( "GEOM_CHECK_BLOCKS_COMPOUND_ERRORS" ) ); + myGrp->TextLabel3->setText( tr( "GEOM_CHECK_BLOCKS_COMPOUND_SUBSHAPES" ) ); + + myGrp->ListBox2->setSelectionMode( QAbstractItemView::ExtendedSelection ); + 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() ) ); + /***************************************************************/ myHelpFileName = "using_measurement_tools_page.html#check_anchor"; @@ -94,32 +118,167 @@ MeasureGUI_CheckShapeDlg::~MeasureGUI_CheckShapeDlg() //================================================================================= void MeasureGUI_CheckShapeDlg::Init() { - mySelBtn = myGrp->PushButton1; - mySelEdit = myGrp->LineEdit1; - MeasureGUI_Skeleton::Init(); + // signals and slots connections + connect( buttonOk(), SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); + connect( buttonApply(), SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); + + connect( myGrp->PushButton1, SIGNAL( clicked() ), this, SLOT( SetEditCurrentArgument() ) ); + + connect( myGeomGUI->getApp()->selectionMgr(), SIGNAL( currentSelectionChanged() ), + this, SLOT( SelectionIntoArgument() ) ); connect( myGrp->CheckBox1, SIGNAL( toggled( bool) ), this, SLOT( SelectionIntoArgument() ) ); + + initName( tr( "GEOM_CHECK_SHAPE_NAME") ); + buttonOk()->setEnabled( false ); + buttonApply()->setEnabled( false ); + activateSelection(); + SelectionIntoArgument(); } //================================================================================= -// function : getParameters +// function : ClickOnOk() // purpose : //================================================================================= -bool MeasureGUI_CheckShapeDlg::getParameters ( bool& theIsValid, QString& theMsg ) +void MeasureGUI_CheckShapeDlg::ClickOnOk() { - if ( myObj->_is_nil() ) + if ( ClickOnApply() ) + ClickOnCancel(); +} + +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool MeasureGUI_CheckShapeDlg::ClickOnApply() +{ + if ( !onAccept() ) return false; - else { + + initName(); + return true; +} + +//================================================================================= +// function : SelectionIntoArgument +// purpose : +//================================================================================= +bool MeasureGUI_CheckShapeDlg::extractPrefix() const +{ + return true; +} + +//================================================================================= +// function : SelectionIntoArgument +// purpose : +//================================================================================= +void MeasureGUI_CheckShapeDlg::SelectionIntoArgument() +{ + erasePreview(); + myObj = GEOM::GEOM_Object::_nil(); + + LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr(); + SALOME_ListIO aSelList; + aSelMgr->selectedObjects(aSelList); + + if (aSelList.Extent() != 1) { + myGrp->LineEdit1->setText( "" ); + processObject(); + return; + } + + GEOM::GEOM_Object_var aSelectedObject = + GEOMBase::ConvertIOinGEOMObject( aSelList.First() ); + + if ( aSelectedObject->_is_nil() ) { + myGrp->LineEdit1->setText( "" ); + processObject(); + return; + } + + myObj = aSelectedObject; + myGrp->LineEdit1->setText( GEOMBase::GetName( myObj ) ); + processObject(); + DISPLAY_PREVIEW_MACRO; +} + +//================================================================================= +// function : SetEditCurrentArgument +// purpose : +//================================================================================= +void MeasureGUI_CheckShapeDlg::SetEditCurrentArgument() +{ + myGrp->LineEdit1->setFocus(); + SelectionIntoArgument(); +} + +//================================================================================= +// function : ActivateThisDialog() +// purpose : +//================================================================================= +void MeasureGUI_CheckShapeDlg::ActivateThisDialog() +{ + GEOMBase_Skeleton::ActivateThisDialog(); + + LightApp_SelectionMgr* aSel = myGeomGUI->getApp()->selectionMgr(); + if ( aSel ) + connect( aSel, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + + activateSelection(); + DISPLAY_PREVIEW_MACRO +} + +//================================================================================= +// function : activateSelection +// purpose : activate selection of faces, shells, and solids +//================================================================================= +void MeasureGUI_CheckShapeDlg::activateSelection() +{ + globalSelection( GEOM_ALLSHAPES ); +} + +//================================================================================= +// function : enterEvent() +// purpose : +//================================================================================= +void MeasureGUI_CheckShapeDlg::enterEvent( QEvent* ) +{ + if ( !mainFrame()->GroupConstructors->isEnabled() ) + ActivateThisDialog(); +} + +//================================================================================= +// function : isValid +// purpose : +//================================================================================= +bool MeasureGUI_CheckShapeDlg::isValid( QString& ) +{ + return !myObj->_is_nil(); +} + +//================================================================================= +// function : getErrors +// purpose : +//================================================================================= +bool MeasureGUI_CheckShapeDlg::getErrors + ( bool& theIsValid, + GEOM::GEOM_IMeasureOperations::ShapeErrors& theErrors ) +{ + if ( myObj->_is_nil() ) { + return false; + } else { GEOM::GEOM_IMeasureOperations_var anOper = GEOM::GEOM_IMeasureOperations::_narrow( getOperation() ); try { - char* aMsg; + GEOM::GEOM_IMeasureOperations::ShapeErrors_var aErrs; bool isCheckGeometry = myGrp->CheckBox1->isChecked(); if ( isCheckGeometry ) - theIsValid = anOper->CheckShapeWithGeometry( myObj, aMsg ); + theIsValid = anOper->CheckShapeWithGeometry( myObj, aErrs ); else - theIsValid = anOper->CheckShape( myObj, aMsg ); - theMsg = aMsg; + theIsValid = anOper->CheckShape( myObj, aErrs ); + + if (anOper->IsDone() && aErrs->length() > 0) + theErrors = aErrs; } catch( const SALOME::SALOME_Exception& e ) { SalomeApp_Tools::QtCatchCorbaException( e ); @@ -138,19 +297,343 @@ bool MeasureGUI_CheckShapeDlg::getParameters ( bool& theIsValid, QString& theMsg void MeasureGUI_CheckShapeDlg::processObject() { bool isShapeValid; - QString aMsg; - if ( !getParameters( isShapeValid, aMsg ) ) { + GEOM::GEOM_IMeasureOperations::ShapeErrors aErrs; + + if ( !getErrors( isShapeValid, aErrs ) ) { myGrp->TextView1->setText( "" ); + myGrp->ListBox1->clear(); + myGrp->ListBox2->clear(); + erasePreview(); + return; } if ( isShapeValid ) { - myGrp->TextView1->setText( "This Shape seems to be valid." ); - } - else { - QString aDescr ( "This Shape is not valid.\n" ); - aDescr += aMsg; - myGrp->TextView1->setText( aDescr ); -// myGrp->TextView1->setText("This Shape is not valid."); + myGrp->TextView1->setText(tr("GEOM_CHECK_SHAPE_VALID")); + buttonOk()->setEnabled( false ); + buttonApply()->setEnabled( false ); + } else { + myGrp->TextView1->setText(tr("GEOM_CHECK_SHAPE_NOT_VALID")); + buttonOk()->setEnabled( true ); + buttonApply()->setEnabled( true ); + } + + // Add Error groups + QStringList aErrList; + + for ( int i = 0, n = aErrs.length(); i < n; i++ ) { + QString aErrStr("CHECK_ERROR_"); + + switch ( aErrs[i].error ) { + case GEOM::GEOM_IMeasureOperations::InvalidPointOnCurve: + aErrStr += "INVALID_POINT_ON_CURVE"; + break; + case GEOM::GEOM_IMeasureOperations::InvalidPointOnCurveOnSurface: + aErrStr += "INVALID_POINT_ON_CURVE_ON_SURFACE"; + break; + case GEOM::GEOM_IMeasureOperations::InvalidPointOnSurface: + aErrStr += "INVALID_POINT_ON_SURFACE"; + break; + case GEOM::GEOM_IMeasureOperations::No3DCurve: + aErrStr += "NO_3D_CURVE"; + break; + case GEOM::GEOM_IMeasureOperations::Multiple3DCurve: + aErrStr += "MULTIPLE_3D_CURVE"; + break; + case GEOM::GEOM_IMeasureOperations::Invalid3DCurve: + aErrStr += "INVALID_3D_CURVE"; + break; + case GEOM::GEOM_IMeasureOperations::NoCurveOnSurface: + aErrStr += "NO_CURVE_ON_SURFACE"; + break; + case GEOM::GEOM_IMeasureOperations::InvalidCurveOnSurface: + aErrStr += "INVALID_CURVE_ON_SURFACE"; + break; + case GEOM::GEOM_IMeasureOperations::InvalidCurveOnClosedSurface: + aErrStr += "INVALID_CURVE_ON_CLOSED_SURFACE"; + break; + case GEOM::GEOM_IMeasureOperations::InvalidSameRangeFlag: + aErrStr += "INVALID_SAME_RANGE_FLAG"; + break; + case GEOM::GEOM_IMeasureOperations::InvalidSameParameterFlag: + aErrStr += "INVALID_SAME_PARAMETER_FLAG"; + break; + case GEOM::GEOM_IMeasureOperations::InvalidDegeneratedFlag: + aErrStr += "INVALID_DEGENERATED_FLAG"; + break; + case GEOM::GEOM_IMeasureOperations::FreeEdge: + aErrStr += "FREE_EDGE"; + break; + case GEOM::GEOM_IMeasureOperations::InvalidMultiConnexity: + aErrStr += "INVALID_MULTI_CONNEXITY"; + break; + case GEOM::GEOM_IMeasureOperations::InvalidRange: + aErrStr += "INVALID_RANGE"; + break; + case GEOM::GEOM_IMeasureOperations::EmptyWire: + aErrStr += "EMPTY_WIRE"; + break; + case GEOM::GEOM_IMeasureOperations::RedundantEdge: + aErrStr += "REDUNDANT_EDGE"; + break; + case GEOM::GEOM_IMeasureOperations::SelfIntersectingWire: + aErrStr += "SELF_INTERSECTING_WIRE"; + break; + case GEOM::GEOM_IMeasureOperations::NoSurface: + aErrStr += "NO_SURFACE"; + break; + case GEOM::GEOM_IMeasureOperations::InvalidWire: + aErrStr += "INVALID_WIRE"; + break; + case GEOM::GEOM_IMeasureOperations::RedundantWire: + aErrStr += "REDUNDANT_WIRE"; + break; + case GEOM::GEOM_IMeasureOperations::IntersectingWires: + aErrStr += "INTERSECTING_WIRES"; + break; + case GEOM::GEOM_IMeasureOperations::InvalidImbricationOfWires: + aErrStr += "INVALID_IMBRICATION_OF_WIRES"; + break; + case GEOM::GEOM_IMeasureOperations::EmptyShell: + aErrStr += "EMPTY_SHELL"; + break; + case GEOM::GEOM_IMeasureOperations::RedundantFace: + aErrStr += "REDUNDANT_FACE"; + break; + case GEOM::GEOM_IMeasureOperations::UnorientableShape: + aErrStr += "UNORIENTABLE_SHAPE"; + break; + case GEOM::GEOM_IMeasureOperations::NotClosed: + aErrStr += "NOT_CLOSED"; + break; + case GEOM::GEOM_IMeasureOperations::NotConnected: + aErrStr += "NOT_CONNECTED"; + break; + case GEOM::GEOM_IMeasureOperations::SubshapeNotInShape: + aErrStr += "SUBSHAPE_NOT_IN_SHAPE"; + break; + case GEOM::GEOM_IMeasureOperations::BadOrientation: + aErrStr += "BAD_ORIENTATION"; + break; + case GEOM::GEOM_IMeasureOperations::BadOrientationOfSubshape: + aErrStr += "BAD_ORIENTATION_OF_SUBSHAPE"; + break; + case GEOM::GEOM_IMeasureOperations::InvalidToleranceValue: + aErrStr += "INVALID_TOLERANCE_VALUE"; + break; + case GEOM::GEOM_IMeasureOperations::CheckFail: + aErrStr += "CHECK_FAIL"; + break; + default: + aErrStr.clear(); + break; + } + + if (!aErrStr.isEmpty()) { + aErrList.append(tr(aErrStr.toLatin1().constData())); + } + } + + myGrp->ListBox1->clear(); + myGrp->ListBox2->clear(); + myGrp->ListBox1->addItems( aErrList ); +} + +//================================================================================= +// function : createOperation +// purpose : +//================================================================================= +GEOM::GEOM_IOperations_ptr MeasureGUI_CheckShapeDlg::createOperation() +{ + return getGeomEngine()->GetIMeasureOperations( getStudyId() ); +} + +//================================================================================= +// function : onErrorsListSelectionChanged +// purpose : +//================================================================================= +void MeasureGUI_CheckShapeDlg::onErrorsListSelectionChanged() +{ + erasePreview(); + + int aCurItem = myGrp->ListBox1->currentRow(); + + if ( aCurItem < 0 ) { + return; + } + + bool isShapeValid; + GEOM::GEOM_IMeasureOperations::ShapeErrors aErrs; + + if ( !getErrors( isShapeValid, aErrs ) ) { + myGrp->TextView1->setText( "" ); + myGrp->ListBox1->clear(); + myGrp->ListBox2->clear(); + + return; + } + + myGrp->ListBox2->clear(); + + if (aCurItem < aErrs.length()) { + GEOM::GEOM_IMeasureOperations::ShapeError aErr = aErrs[aCurItem]; + GEOM::ListOfLong aObjLst = aErr.incriminated; + QStringList aSubShapeList; + TopoDS_Shape aSelShape; + + if ( !myObj->_is_nil() && GEOMBase::GetShape( myObj, aSelShape ) ) { + TopTools_IndexedMapOfShape anIndices; + + TopExp::MapShapes( aSelShape, anIndices ); + + for ( int i = 0, n = aObjLst.length(); i < n; i++ ) { + TopoDS_Shape aSubShape = anIndices.FindKey( aObjLst[i] ); + QString aType = GEOMBase::GetShapeTypeString( aSubShape ); + + if ( !aType.isEmpty() ) { + aSubShapeList.append( QString( "%1_%2" ).arg( aType ).arg( aObjLst[i] ) ); + } + } + } + + myGrp->ListBox2->addItems( aSubShapeList ); } } + +//================================================================================= +// function : onSubShapesListSelectionChanged +// purpose : +//================================================================================= +void MeasureGUI_CheckShapeDlg::onSubShapesListSelectionChanged() +{ + erasePreview(); + + int aErrCurItem = myGrp->ListBox1->currentRow(); + + if (aErrCurItem < 0) { + return; + } + + QList aIds; + + for (int i = 0, n = myGrp->ListBox2->count(); i < n; i++) { + if (myGrp->ListBox2->item( i )->isSelected()) { + aIds.append(i); + } + } + + if (aIds.count() < 1) { + return; + } + + bool isShapeValid; + GEOM::GEOM_IMeasureOperations::ShapeErrors aErrs; + + if (!getErrors(isShapeValid, aErrs)) { + myGrp->TextView1->setText(""); + myGrp->ListBox1->clear(); + myGrp->ListBox2->clear(); + + return; + } + + GEOM::GEOM_IMeasureOperations::ShapeError aErr = aErrs[aErrCurItem]; + GEOM::ListOfLong aObjLst = aErr.incriminated; + TopoDS_Shape aSelShape; + TopoDS_Shape aSubShape; + TopTools_IndexedMapOfShape anIndices; + + if (!myObj->_is_nil() && GEOMBase::GetShape(myObj, aSelShape)) { + QString aMess; + + if (!isValid(aMess)) { + return; + } + + SALOME_Prs* aPrs = 0; + QList::iterator it; + + TopExp::MapShapes(aSelShape, anIndices); + + for (it = aIds.begin(); it != aIds.end(); ++it) { + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + int w = resMgr->integerValue("Geometry", "measures_line_width", 1); + + aSubShape = anIndices.FindKey(aObjLst[(*it)]); + + try { + getDisplayer()->SetColor( Quantity_NOC_RED ); + getDisplayer()->SetWidth( w ); + getDisplayer()->SetToActivate( false ); + aPrs = !aSubShape.IsNull() ? getDisplayer()->BuildPrs(aSubShape) : 0; + + if (aPrs) { + displayPreview(aPrs, true); + } + } + catch (const SALOME::SALOME_Exception& e) { + SalomeApp_Tools::QtCatchCorbaException(e); + } + } + } +} + +//================================================================================= +// function : execute +// purpose : +//================================================================================= +bool MeasureGUI_CheckShapeDlg::execute( ObjectList& objects ) +{ + bool isShapeValid; + GEOM::GEOM_IMeasureOperations::ShapeErrors aErrs; + + if (!getErrors(isShapeValid, aErrs)) { + return false; + } + + const int aNbErrsSelected = myGrp->ListBox1->selectedItems().size(); + const bool isPublishAllErrors = (aNbErrsSelected < 1); + const bool isPublishAllShapes = + (aNbErrsSelected != 1 || myGrp->ListBox2->selectedItems().empty()); + TColStd_IndexedMapOfInteger aMapIndex; + const int aNbErrs = aErrs.length(); + int i; + + // Collect indices of shapes to be published. + for (i = 0; i < aNbErrs; i++) { + if (isPublishAllErrors || myGrp->ListBox1->item(i)->isSelected()) { + GEOM::ListOfLong aObjLst = aErrs[i].incriminated; + const int aNbShapes = aObjLst.length(); + int j; + + for (j = 0; j < aNbShapes; j++) { + if (isPublishAllShapes || myGrp->ListBox2->item(j)->isSelected()) { + aMapIndex.Add(aObjLst[j]); + } + } + } + } + + // Create objects. + GEOM::ListOfLong_var anArray = new GEOM::ListOfLong; + const int aNbShapes = aMapIndex.Extent(); + + anArray->length(aNbShapes); + + for (i = 1; i <= aNbShapes; i++) { + anArray[i - 1] = aMapIndex.FindKey(i); + } + + if (myShapesOper->_is_nil()) { + myShapesOper = getGeomEngine()->GetIShapesOperations(getStudyId()); + } + + GEOM::ListOfGO_var aList = myShapesOper->MakeSubShapes(myObj, anArray); + const int aNbObj = aList->length(); + + for (i = 0; i < aNbObj; i++) { + objects.push_back(GEOM::GEOM_Object::_duplicate(aList[i])); + } + + return true; +} diff --git a/src/MeasureGUI/MeasureGUI_CheckShapeDlg.h b/src/MeasureGUI/MeasureGUI_CheckShapeDlg.h index ade60714d..a2ace0ae2 100644 --- a/src/MeasureGUI/MeasureGUI_CheckShapeDlg.h +++ b/src/MeasureGUI/MeasureGUI_CheckShapeDlg.h @@ -27,15 +27,15 @@ #ifndef MEASUREGUI_CHECKSHAPEDLG_H #define MEASUREGUI_CHECKSHAPEDLG_H -#include "MeasureGUI_Skeleton.h" +#include -class MeasureGUI_1Sel1TextView1Check; +class MeasureGUI_1Sel1Check1TextView2ListBox; //================================================================================= // class : MeasureGUI_CheckShapeDlg // purpose : //================================================================================= -class MeasureGUI_CheckShapeDlg : public MeasureGUI_Skeleton +class MeasureGUI_CheckShapeDlg : public GEOMBase_Skeleton { Q_OBJECT @@ -45,14 +45,32 @@ public: protected: // redefined from GEOMBase_Helper and MeasureGUI_Skeleton - virtual void processObject(); + virtual GEOM::GEOM_IOperations_ptr createOperation(); + virtual bool execute( ObjectList& ); + virtual void processObject(); + virtual void activateSelection(); + virtual bool isValid( QString& ); + virtual bool extractPrefix() const; + +private slots: + void SelectionIntoArgument(); + void ClickOnOk(); + bool ClickOnApply(); + void ActivateThisDialog(); + void SetEditCurrentArgument(); + void onErrorsListSelectionChanged(); + void onSubShapesListSelectionChanged(); private: - void Init(); - bool getParameters( bool&, QString& ); + void Init(); + void enterEvent( QEvent* ); + bool getErrors + ( bool&, GEOM::GEOM_IMeasureOperations::ShapeErrors&); private: - MeasureGUI_1Sel1TextView1Check* myGrp; + GEOM::GEOM_Object_var myObj; + MeasureGUI_1Sel1Check1TextView2ListBox* myGrp; + GEOM::GEOM_IShapesOperations_var myShapesOper; }; #endif // MEASUREGUI_CHECKSHAPEDLG_H diff --git a/src/MeasureGUI/MeasureGUI_Widgets.cxx b/src/MeasureGUI/MeasureGUI_Widgets.cxx index 2cbbeec46..77cdd68f3 100644 --- a/src/MeasureGUI/MeasureGUI_Widgets.cxx +++ b/src/MeasureGUI/MeasureGUI_Widgets.cxx @@ -65,6 +65,21 @@ MeasureGUI_1Sel1TextView2ListBox::~MeasureGUI_1Sel1TextView2ListBox() { } +////////////////////////////////////////// +// MeasureGUI_1Sel1Check1TextView2ListBox +////////////////////////////////////////// + +MeasureGUI_1Sel1Check1TextView2ListBox::MeasureGUI_1Sel1Check1TextView2ListBox( QWidget* parent, + Qt::WindowFlags f ) +: QWidget( parent, f ) +{ + setupUi( this ); +} + +MeasureGUI_1Sel1Check1TextView2ListBox::~MeasureGUI_1Sel1Check1TextView2ListBox() +{ +} + ////////////////////////////////////////// // MeasureGUI_1Sel1TextView ////////////////////////////////////////// diff --git a/src/MeasureGUI/MeasureGUI_Widgets.h b/src/MeasureGUI/MeasureGUI_Widgets.h index 02fe6ea92..1f1f38824 100644 --- a/src/MeasureGUI/MeasureGUI_Widgets.h +++ b/src/MeasureGUI/MeasureGUI_Widgets.h @@ -71,6 +71,22 @@ public: ~MeasureGUI_1Sel1TextView2ListBox(); }; +////////////////////////////////////////// +// MeasureGUI_1Sel1Check1TextView2ListBox +////////////////////////////////////////// + +#include "ui_MeasureGUI_1Sel1Check1TextView2ListBox_QTD.h" + +class MeasureGUI_1Sel1Check1TextView2ListBox : public QWidget, + public Ui::MeasureGUI_1Sel1Check1TextView2ListBox_QTD +{ + Q_OBJECT + +public: + MeasureGUI_1Sel1Check1TextView2ListBox( QWidget* = 0, Qt::WindowFlags = 0 ); + ~MeasureGUI_1Sel1Check1TextView2ListBox(); +}; + ////////////////////////////////////////// // MeasureGUI_1Sel1TextView //////////////////////////////////////////