]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
Mantis issue 0021483: EDF 1638 GEOM: Retrieve non blocks solids and faces from a...
authorjfa <jfa@opencascade.com>
Wed, 15 Aug 2012 10:34:21 +0000 (10:34 +0000)
committerjfa <jfa@opencascade.com>
Wed, 15 Aug 2012 10:34:21 +0000 (10:34 +0000)
26 files changed:
doc/salome/gui/GEOM/images/measures2.png [new file with mode: 0644]
doc/salome/gui/GEOM/input/get_non_blocks.doc [new file with mode: 0644]
doc/salome/gui/GEOM/input/tui_get_non_blocks.doc [new file with mode: 0644]
doc/salome/gui/GEOM/input/tui_measurement_tools.doc
doc/salome/gui/GEOM/input/tui_test_spanner.doc
doc/salome/gui/GEOM/input/using_measurement_tools.doc
idl/GEOM_Gen.idl
resources/Makefile.am
resources/get_non_blocks.png [new file with mode: 0644]
src/GEOMGUI/GEOM_images.ts
src/GEOMGUI/GEOM_msg_en.ts
src/GEOMGUI/GeometryGUI.cxx
src/GEOMGUI/GeometryGUI_Operations.h
src/GEOMImpl/GEOMImpl_BlockDriver.cxx
src/GEOMImpl/GEOMImpl_IBlocksOperations.cxx
src/GEOMImpl/GEOMImpl_IBlocksOperations.hxx
src/GEOM_I/GEOM_IBlocksOperations_i.cc
src/GEOM_I/GEOM_IBlocksOperations_i.hh
src/GEOM_SWIG/GEOM_Spanner.py
src/GEOM_SWIG/GEOM_TestOthers.py
src/GEOM_SWIG/geompyDC.py
src/MeasureGUI/Makefile.am
src/MeasureGUI/MeasureGUI.cxx
src/MeasureGUI/MeasureGUI_CenterMassDlg.cxx
src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx [new file with mode: 0644]
src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h [new file with mode: 0644]

diff --git a/doc/salome/gui/GEOM/images/measures2.png b/doc/salome/gui/GEOM/images/measures2.png
new file mode 100644 (file)
index 0000000..21e5218
Binary files /dev/null and b/doc/salome/gui/GEOM/images/measures2.png differ
diff --git a/doc/salome/gui/GEOM/input/get_non_blocks.doc b/doc/salome/gui/GEOM/input/get_non_blocks.doc
new file mode 100644 (file)
index 0000000..8df0e32
--- /dev/null
@@ -0,0 +1,23 @@
+/*! 
+
+\page get_non_blocks_page Get Non Blocks
+
+\image html measures2.png
+
+Retrieve all non blocks solids and faces from the given shape.
+Collect them in two groups: solids and faces separately.
+
+\n <b>Result:</b> Two or less groups are published in the Object
+                  Browser under the processed object. Reports error if
+                  no bad sub-shapes (solids and faces) have been found.
+
+\n <b>TUI Command:</b>
+<em>geompy.GetNonBlocks(Compound).</em> Returns 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.
+
+See also a \ref tui_get_non_blocks_page "TUI example".
+
+*/
diff --git a/doc/salome/gui/GEOM/input/tui_get_non_blocks.doc b/doc/salome/gui/GEOM/input/tui_get_non_blocks.doc
new file mode 100644 (file)
index 0000000..6f648f9
--- /dev/null
@@ -0,0 +1,32 @@
+/*!
+
+\page tui_get_non_blocks_page Get Non Blocks
+
+\code
+import geompy
+import salome
+
+# create solids
+box = geompy.MakeBoxDXDYDZ(100, 100, 100)
+cyl = geompy.MakeCylinderRH(100, 200)
+
+geompy.addToStudy(box, 'box')
+geompy.addToStudy(cyl, 'cyl')
+
+# make a compound
+compound = geompy.MakeCompound([box1, box2])
+geompy.addToStudy(compound, 'compound')
+
+# explore the compound
+pair = geompy.GetNonBlocks(compound)
+
+if pair[0] is not None:
+  geompy.addToStudyInFather(compound, pair[0], "GrNonBlocks")
+  pass
+
+if pair[1] is not None:
+  geompy.addToStudyInFather(compound, pair[1], "GrNonQuads")
+  pass
+\endcode
+
+*/
index 4ce9b423914b2b18ce5b3e1562e67c585c19e1fa..583f3de0f56e4071941db96b1ad0f97ac10cc280 100644 (file)
@@ -17,6 +17,7 @@
 <li>\subpage tui_free_faces_page</li>
 <li>\subpage tui_check_shape_page</li>
 <li>\subpage tui_check_compound_of_blocks_page</li>
+<li>\subpage tui_get_non_blocks_page</li>
 <li>\subpage tui_check_self_intersections_page</li>
 </ul>
 
index 5c9df4651b7fa4a1d16479acad44a152b519cc75..81b212de6683bfae936ee243e8378354fa6b90a5 100644 (file)
 \anchor swig_GetOppositeFace
 \until id_face41
 
+\until id_glueALL
+
+\anchor swig_GetNonBlocks
+\until Spanner is a
+
 \anchor spanner_continue
 \until return Spanner
 
index 7e18a1ddf5aa39384e5dac56674527d5131d118e..513f6077f41f6783447bd74c0d00deb2a191b3d7 100644 (file)
@@ -25,6 +25,7 @@ concerning created or imported geometrical objects :
 <li>\subpage free_faces_page "Check Free Faces"</li>
 <li>\subpage check_shape_page "Check Shape"</li>
 <li>\subpage check_compound_of_blocks_page "Check compound of blocks"</li>
+<li>\subpage get_non_blocks_page "Get non blocks"</li>
 <li>\subpage check_self_intersections_page "Detect Self-intersections"</li>
 </ul>
 
@@ -32,4 +33,4 @@ concerning created or imported geometrical objects :
 \ref tui_measurement_tools_page "Measurement Tools" with <b>TUI
 commands</b>.
 
-*/
\ No newline at end of file
+*/
index f3a41ad16011e42f7dd4069fd7b07be6e0a65f88..209ac2bd3971a378b3594a402df5cd16cc2e7555 100644 (file)
@@ -2403,6 +2403,17 @@ module GEOM
     string PrintBCErrors (in GEOM_Object theCompound,
                           in BCErrors    theErrors);
 
+    /*!
+     *  \brief Retrieve all non blocks solids and faces from a shape.
+     *
+     *  \param theShape The shape to explore.
+     *  \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);
+
     /*!
      *  \brief Remove all seam and degenerated edges from \a theShape.
      *
index d5aab779ca87db29719d67a97fd2e1ef8da64ccf..57c92dd2d02afad08d27bf0bda501bcef1c51aca 100644 (file)
@@ -232,6 +232,7 @@ group_new.png                       \
 group_edit.png                 \
 glue.png                       \
 check_blocks_compound.png      \
+get_non_blocks.png             \
 check_self_intersections.png   \
 free_faces.png                 \
 propagate.png                  \
diff --git a/resources/get_non_blocks.png b/resources/get_non_blocks.png
new file mode 100644 (file)
index 0000000..b13b294
Binary files /dev/null and b/resources/get_non_blocks.png differ
index d15ade1d2a0f2f27da6c6e53b85f481c6f963f8d..d9459fdc23d630dab355a05eb77c8d0fd809d5c3 100644 (file)
             <source>ICON_DLG_CHECK_COMPOUND_OF_BLOCKS</source>
             <translation>check_blocks_compound.png</translation>
         </message>
+        <message>
+            <source>ICON_DLG_GETNONBLOCKS</source>
+            <translation>get_non_blocks.png</translation>
+        </message>
         <message>
             <source>ICON_DLG_CHECK_SELF_INTERSECTIONS</source>
             <translation>check_self_intersections.png</translation>
             <source>ICO_CHECK_COMPOUND</source>
             <translation>check_blocks_compound.png</translation>
         </message>
+        <message>
+            <source>ICO_GET_NON_BLOCKS</source>
+            <translation>get_non_blocks.png</translation>
+        </message>
         <message>
             <source>ICO_CHECK_SELF_INTERSECTIONS</source>
             <translation>check_self_intersections.png</translation>
index cf4c13db2a3231ba6550aabf8e9230c43fea9928..4f503aae272177242bb0143b2ef8b2a1c2291fa3 100644 (file)
@@ -357,6 +357,18 @@ Please, select face, shell or solid and try again</translation>
         <source>GEOM_CHECK_BLOCKS_COMPOUND_SUBSHAPES</source>
         <translation>Incriminated Sub-shapes</translation>
     </message>
+    <message>
+        <source>GEOM_GETNONBLOCKS_TITLE</source>
+        <translation>Get non-hexahedral solids and non-quadrangular faces</translation>
+    </message>
+    <message>
+        <source>GEOM_GETNONBLOCKS</source>
+        <translation>Get non blocks</translation>
+    </message>
+    <message>
+        <source>GEOM_NONBLOCKS</source>
+        <translation>NonBlocksGroup</translation>
+    </message>
     <message>
         <source>GEOM_CHECK_INFOS</source>
         <translation>Object And Its Topological Information</translation>
@@ -2310,6 +2322,10 @@ Please, select face, shell or solid and try again</translation>
         <source>MEN_CHECK_COMPOUND</source>
         <translation>Check Compound of Blocks</translation>
     </message>
+    <message>
+        <source>MEN_GET_NON_BLOCKS</source>
+        <translation>Get Non Blocks</translation>
+    </message>
     <message>
         <source>MEN_CHECK_SELF_INTERSECTIONS</source>
         <translation>Detect Self-intersections</translation>
@@ -3154,6 +3170,10 @@ Please, select face, shell or solid and try again</translation>
         <source>STB_CHECK_COMPOUND</source>
         <translation>Check compound of blocks</translation>
     </message>
+    <message>
+        <source>STB_GET_NON_BLOCKS</source>
+        <translation>Get non blocks</translation>
+    </message>
     <message>
         <source>STB_CHECK_SELF_INTERSECTIONS</source>
         <translation>Detect Self-intersections</translation>
@@ -3762,6 +3782,10 @@ Please, select face, shell or solid and try again</translation>
         <source>TOP_CHECK_COMPOUND</source>
         <translation>Check compound of blocks</translation>
     </message>
+    <message>
+        <source>TOP_GET_NON_BLOCKS</source>
+        <translation>Get non blocks</translation>
+    </message>
     <message>
         <source>TOP_CHECK_SELF_INTERSECTIONS</source>
         <translation>Detect Self-intersections</translation>
index 23694246d53be3d77688dcfaaf77fb1f6f29c10f..6ae6b95e636747fa4b6e0646d9228fd2c043842f 100644 (file)
@@ -549,6 +549,7 @@ void GeometryGUI::OnGUIEvent( int id )
   case GEOMOp::OpWhatIs:             // MENU MEASURE - WHATIS
   case GEOMOp::OpCheckShape:         // MENU MEASURE - CHECK
   case GEOMOp::OpCheckCompound:      // MENU MEASURE - CHECK COMPOUND OF BLOCKS
+  case GEOMOp::OpGetNonBlocks:       // MENU MEASURE - Get NON BLOCKS
   case GEOMOp::OpPointCoordinates:   // MENU MEASURE - POINT COORDINATES
   case GEOMOp::OpCheckSelfInters:    // MENU MEASURE - CHECK SELF INTERSECTIONS
     libName = "MeasureGUI";
@@ -829,6 +830,7 @@ void GeometryGUI::initialize( CAM_Application* app )
   createGeomAction( GEOMOp::OpWhatIs,           "WHAT_IS" );
   createGeomAction( GEOMOp::OpCheckShape,       "CHECK" );
   createGeomAction( GEOMOp::OpCheckCompound,    "CHECK_COMPOUND" );
+  createGeomAction( GEOMOp::OpGetNonBlocks,     "GET_NON_BLOCKS" );
   createGeomAction( GEOMOp::OpCheckSelfInters,  "CHECK_SELF_INTERSECTIONS" );
 
 #ifdef _DEBUG_ // PAL16821
@@ -1059,6 +1061,7 @@ void GeometryGUI::initialize( CAM_Application* app )
   createMenu( GEOMOp::OpWhatIs,          measurId, -1 );
   createMenu( GEOMOp::OpCheckShape,      measurId, -1 );
   createMenu( GEOMOp::OpCheckCompound,   measurId, -1 );
+  createMenu( GEOMOp::OpGetNonBlocks,    measurId, -1 );
   createMenu( GEOMOp::OpCheckSelfInters, measurId, -1 );
 
 #ifdef _DEBUG_ // PAL16821
@@ -1196,6 +1199,7 @@ void GeometryGUI::initialize( CAM_Application* app )
   createTool( GEOMOp::OpWhatIs,           measureTbId );
   createTool( GEOMOp::OpCheckShape,       measureTbId );
   createTool( GEOMOp::OpCheckCompound,    measureTbId );
+  createTool( GEOMOp::OpGetNonBlocks,     measureTbId );
   createTool( GEOMOp::OpCheckSelfInters,  measureTbId );
   
   int picturesTbId = createTool( tr( "TOOL_PICTURES" ) );
index 3d8a41d4e9efd8941c2f60807e759ce0e9fd8dda..9cb259b5d1771117a33b14fa8da44644db2cb051 100644 (file)
@@ -24,7 +24,7 @@
 
 namespace GEOMOp {
   enum {
-    // ToolsGUI ------------------//--------------------------------
+    // ToolsGUI --------------------//--------------------------------
     OpImport              = 1000,   // MENU FILE  - IMPORT
     OpExport              = 1001,   // MENU FILE  - EXPORT
     OpDelete              = 1020,   // MENU EDIT  - DELETE
@@ -57,7 +57,7 @@ namespace GEOMOp {
     OpEdgeWidth           = 1260,   // POPUP MENU - LINE WIDTH - EDGE WIDTH
     OpIsosWidth           = 1261,   // POPUP MENU - LINE WIDTH - ISOS WIDTH
 
-    // DisplayGUI ----------------//--------------------------------
+    // DisplayGUI ------------------//--------------------------------
     OpSwitchVectors       = 2001,   // MENU VIEW  - DISPLAY MODE - SHOW/HIDE EDGE DIRECTION
     OpShowAll             = 2002,   // MENU VIEW  - SHOW ALL
     OpHideAll             = 2003,   // MENU VIEW  - HIDE ALL
@@ -74,7 +74,7 @@ namespace GEOMOp {
     OpTexture             = 2204,   // POPUP MENU - DISPLAY MODE - TEXTURE
     OpBringToFront        = 2205,   // POPUP MENU - BRING TO FRONT
     OpClsBringToFront     = 2206,
-    // BasicGUI ------------------//--------------------------------
+    // BasicGUI --------------------//--------------------------------
     OpPoint               = 3000,   // MENU NEW ENTITY - BASIC - POINT
     OpLine                = 3001,   // MENU NEW ENTITY - BASIC - LINE
     OpCircle              = 3002,   // MENU NEW ENTITY - BASIC - CIRCLE
@@ -85,7 +85,7 @@ namespace GEOMOp {
     OpCurve               = 3007,   // MENU NEW ENTITY - BASIC - CURVE
     OpLCS                 = 3008,   // MENU NEW ENTITY - BASIC - LOCAL COORDINATE SYSTEM
     OpOriginAndVectors    = 3009,   // MENU NEW ENTITY - BASIC - ORIGIN AND BASE VECTORS
-    // PrimitiveGUI --------------//--------------------------------
+    // PrimitiveGUI ----------------//--------------------------------
     OpBox                 = 3100,   // MENU NEW ENTITY - PRIMITIVES - BOX
     OpCylinder            = 3101,   // MENU NEW ENTITY - PRIMITIVES - CYLINDER
     OpSphere              = 3102,   // MENU NEW ENTITY - PRIMITIVES - SPHERE
@@ -93,12 +93,12 @@ namespace GEOMOp {
     OpCone                = 3104,   // MENU NEW ENTITY - PRIMITIVES - CONE
     OpRectangle           = 3105,   // MENU NEW ENTITY - PRIMITIVES - FACE
     OpDisk                = 3106,   // MENU NEW ENTITY - PRIMITIVES - DISK
-    // GenerationGUI -------------//--------------------------------
+    // GenerationGUI ---------------//--------------------------------
     OpPrism               = 3200,   // MENU NEW ENTITY - GENERATION - EXTRUSION
     OpRevolution          = 3201,   // MENU NEW ENTITY - GENERATION - REVOLUTION
     OpFilling             = 3202,   // MENU NEW ENTITY - GENERATION - FILLING
     OpPipe                = 3203,   // MENU NEW ENTITY - GENERATION - EXTRUSION ALONG PATH
-    // EntityGUI -----------------//--------------------------------
+    // EntityGUI -------------------//--------------------------------
     Op2dSketcher          = 3300,   // MENU NEW ENTITY - SKETCHER
     Op3dSketcher          = 3301,   // MENU NEW ENTITY - 3D SKETCHER
     OpExplode             = 3302,   // MENU NEW ENTITY - EXPLODE
@@ -106,20 +106,19 @@ namespace GEOMOp {
     OpFeatureDetect       = 3303,   // MENU NEW ENTITY - FEATURE DETECTION
 #endif
     OpPictureImport       = 3304,   // MENU NEW ENTITY - IMPORT PICTURE IN VIEWER
-
-    // BuildGUI ------------------//--------------------------------
+    // BuildGUI --------------------//--------------------------------
     OpEdge                = 3400,   // MENU NEW ENTITY - BUILD - EDGE
     OpWire                = 3401,   // MENU NEW ENTITY - BUILD - WIRE
     OpFace                = 3402,   // MENU NEW ENTITY - BUILD - FACE
     OpShell               = 3403,   // MENU NEW ENTITY - BUILD - SHELL
     OpSolid               = 3404,   // MENU NEW ENTITY - BUILD - SOLID
     OpCompound            = 3405,   // MENU NEW ENTITY - BUILD - COMPOUND
-    // BooleanGUI ----------------//--------------------------------
+    // BooleanGUI ------------------//--------------------------------
     OpFuse                = 3500,   // MENU OPERATIONS - BOOLEAN - FUSE
     OpCommon              = 3501,   // MENU OPERATIONS - BOOLEAN - COMMON
     OpCut                 = 3502,   // MENU OPERATIONS - BOOLEAN - CUT
     OpSection             = 3503,   // MENU OPERATIONS - BOOLEAN - SECTION
-    // TransformationGUI ---------//--------------------------------
+    // TransformationGUI -----------//--------------------------------
     OpTranslate           = 3600,   // MENU OPERATIONS - TRANSFORMATION - TRANSLATION
     OpRotate              = 3601,   // MENU OPERATIONS - TRANSFORMATION - ROTATION
     OpChangeLoc           = 3602,   // MENU OPERATIONS - TRANSFORMATION - LOCATION
@@ -130,7 +129,7 @@ namespace GEOMOp {
     OpMultiRotate         = 3607,   // MENU OPERATIONS - TRANSFORMATION - MULTI-ROTATION
     OpReimport            = 3608,   // POPUP MENU - RELOAD IMPORTED
     OpProjection          = 3609,   // MENU OPERATIONS - TRANSFORMATION - PROJECTION
-    // OperationGUI
+    // OperationGUI ----------------//--------------------------------
     OpPartition           = 3700,   // MENU OPERATION - PARTITION
     OpArchimede           = 3701,   // MENU OPERATION - ARCHIMEDE
     OpFillet3d            = 3702,   // MENU OPERATION - FILLET
@@ -142,7 +141,7 @@ namespace GEOMOp {
     OpSharedShapes        = 3708,   // MENU OPERATION - GET SHARED SHAPES
     OpExtrudedBoss        = 3709,   // MENU OPERATION - ETRUDED BOSS
     OpExtrudedCut         = 3710,   // MENU OPERATION - ETRUDED CUT
-    // RepairGUI -----------------//--------------------------------
+    // RepairGUI -------------------//--------------------------------
     OpSewing              = 4000,   // MENU REPAIR - SEWING
     OpSuppressFaces       = 4001,   // MENU REPAIR - SUPPRESS FACES
     OpSuppressHoles       = 4002,   // MENU REPAIR - SUPPRESS HOLES
@@ -158,7 +157,7 @@ namespace GEOMOp {
     OpLimitTolerance      = 4012,   // MENU REPAIR - LIMIT TOLERANCE
     OpGlueEdges           = 4013,   // MENU REPAIR - GLUE EDGES
     OpFuseEdges           = 4014,   // MENU REPAIR - FUSE COLLINEAR EDGES
-    // MeasureGUI ----------------//--------------------------------
+    // MeasureGUI ------------------//--------------------------------
     OpProperties          = 5000,   // MENU MEASURES - PROPERTIES
     OpCenterMass          = 5001,   // MENU MEASURES - CENTRE OF MASS
     OpInertia             = 5002,   // MENU MEASURES - INERTIA
@@ -172,22 +171,23 @@ namespace GEOMOp {
     OpCheckCompound       = 5010,   // MENU MEASURES - CHECK COMPOUND OF BLOCKS
     OpPointCoordinates    = 5011,   // MENU MEASURES - POINT COORDINATES
     OpCheckSelfInters     = 5012,   // MENU MEASURES - CHECK SELF INTERSECTIONS
-    // GroupGUI ------------------//--------------------------------
+    OpGetNonBlocks        = 5013,   // MENU MEASURES - GET NON BLOCKS
+    // GroupGUI --------------------//--------------------------------
     OpGroupCreate         = 6000,   // MENU GROUP - CREATE
     OpGroupEdit           = 6001,   // MENU GROUP - EDIT
     OpGroupCreatePopup    = 6002,   // POPUP MENU - CREATE GROUP
-    // BlocksGUI -----------------//--------------------------------
+    // BlocksGUI -------------------//--------------------------------
     OpHexaSolid           = 6100,   // MENU BLOCKS - HEXAHEDRAL SOLID
     OpMultiTransform      = 6101,   // MENU BLOCKS - MULTI-TRANSFORMATION
     OpQuadFace            = 6102,   // MENU BLOCKS - QUADRANGLE FACE
     OpPropagate           = 6103,   // MENU BLOCKS - PROPAGATE
     OpExplodeBlock        = 6104,   // MENU BLOCKS - EXPLODE ON BLOCKS
-    // AdvancedGUI ---------------//--------------------------------
+    // AdvancedGUI -----------------//--------------------------------
     OpAdvancedNoOp        = 10000,  // NO OPERATION (advanced operations base)
     OpPipeTShape          = 10001,  // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE
-//     OpPipeTShapeGroups  = 10002,  // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS
-    OpDividedDisk            = 10003,  // MENU NEW ENTITY - ADVANCED - DIVIDEDDISK
-    OpDividedCylinder            = 10004,  // MENU NEW ENTITY - ADVANCED - DIVIDEDCYLINDER
+    //OpPipeTShapeGroups  = 10002,  // MENU NEW ENTITY - ADVANCED - PIPE TSHAPE GROUPS
+    OpDividedDisk         = 10003,  // MENU NEW ENTITY - ADVANCED - DIVIDEDDISK
+    OpDividedCylinder     = 10004,  // MENU NEW ENTITY - ADVANCED - DIVIDEDCYLINDER
     //@@ insert new functions before this line @@ do not remove this line @@//
   };
 }
index 95c2dbf08b9d9212c6a194b3ec1e535ecef7dba3..d50d24858461d5e98483ab6415b9fa1c91d9beda 100644 (file)
@@ -600,7 +600,8 @@ Standard_Integer GEOMImpl_BlockDriver::Execute(TFunction_Logbook& log) const
         TopTools_ListOfShape BLO; // All blocks from the given compound
         TopTools_ListOfShape NOT; // Not blocks
         TopTools_ListOfShape EXT; // Hexahedral solids, having degenerated and/or seam edges
-        GEOMImpl_IBlocksOperations::AddBlocksFrom(aFixedExtra, BLO, NOT, EXT);
+        TopTools_ListOfShape NOQ; // All non-quadrangular faces
+        GEOMImpl_IBlocksOperations::AddBlocksFrom(aFixedExtra, BLO, NOT, EXT, NOQ);
 
         if (NOT.Extent() > 0) {
           MESSAGE("Some non-blocks have been removed");
index 42aaa42607c172af81b2161367ab7e8ba6de2e53..efb69f42c5f3759a527bf95614a1e9f98dd0f68c 100644 (file)
@@ -18,7 +18,6 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 #ifdef WNT
 #pragma warning( disable:4786 )
@@ -1735,7 +1734,8 @@ Standard_Boolean GEOMImpl_IBlocksOperations::IsCompoundOfBlocks
 void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape&   theShape,
                                                 TopTools_ListOfShape& BLO,
                                                 TopTools_ListOfShape& NOT,
-                                                TopTools_ListOfShape& EXT)
+                                                TopTools_ListOfShape& EXT,
+                                                TopTools_ListOfShape& NOQ)
 {
   TopAbs_ShapeEnum aType = theShape.ShapeType();
   switch (aType) {
@@ -1744,7 +1744,7 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape&   theShape,
     {
       TopoDS_Iterator It (theShape);
       for (; It.More(); It.Next()) {
-        AddBlocksFrom(It.Value(), BLO, NOT, EXT);
+        AddBlocksFrom(It.Value(), BLO, NOT, EXT, NOQ);
       }
     }
     break;
@@ -1766,7 +1766,7 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape&   theShape,
         for (; expF.More(); expF.Next()) {
           if (mapFaces.Add(expF.Current())) {
             nbFaces++;
-            if (nbFaces > 6) break;
+            //0021483//if (nbFaces > 6) break;
 
             // get wire
             TopoDS_Shape aF = expF.Current();
@@ -1774,14 +1774,18 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape&   theShape,
             if (!wires.More()) {
               // no wire in the face
               hasNonQuadr = Standard_True;
-              break;
+              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;
-              break;
+              NOQ.Append(aF);//0021483
+              //0021483//break;
+              continue;
             }
 
             // Check number of edges in the face
@@ -1796,6 +1800,7 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape&   theShape,
             }
             if (nbEdges != 4) {
               hasNonQuadr = Standard_True;
+              NOQ.Append(aF);//0021483
             }
           }
         }
@@ -1808,6 +1813,47 @@ void GEOMImpl_IBlocksOperations::AddBlocksFrom (const TopoDS_Shape&   theShape,
       }
     }
     break;
+  case TopAbs_SHELL: //0021483
+  case TopAbs_FACE: //0021483
+    {
+      // Count edges in each face
+      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;
+          }
+
+          // 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) {
+            NOQ.Append(aF);//0021483
+          }
+        }
+      }
+    }
+    break;
   default:
     NOT.Append(theShape);
   }
@@ -2353,7 +2399,8 @@ Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocks
   TopTools_ListOfShape NOT; // Not blocks
   TopTools_ListOfShape EXT; // Hexahedral solids, having degenerated and/or seam edges
   TopTools_ListOfShape BLO; // All blocks from the given compound
-  AddBlocksFrom(aBlockOrComp, BLO, NOT, EXT);
+  TopTools_ListOfShape NOQ; // All non-quadrangular faces
+  AddBlocksFrom(aBlockOrComp, BLO, NOT, EXT, NOQ);
 
   // Report non-blocks
   if (NOT.Extent() > 0) {
@@ -2513,6 +2560,100 @@ Standard_Boolean GEOMImpl_IBlocksOperations::CheckCompoundOfBlocks
   return isCompOfBlocks;
 }
 
+//=============================================================================
+/*!
+ *  GetNonBlocks
+ */
+//=============================================================================
+Handle(GEOM_Object) GEOMImpl_IBlocksOperations::GetNonBlocks
+                                     (Handle(GEOM_Object) theShape,
+                                      Handle(GEOM_Object)& theNonQuads)
+{
+  SetErrorCode(KO);
+
+  if (theShape.IsNull()) return NULL;
+  TopoDS_Shape aShape = theShape->GetValue();
+
+  // Separate blocks from non-blocks
+  TopTools_ListOfShape BLO; // All blocks from the given compound
+  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);
+
+  if (NOT.IsEmpty() && EXT.IsEmpty() && NOQ.IsEmpty()) {
+    SetErrorCode("NOT_FOUND_ANY");
+    return NULL;
+  }
+
+  // Map sub-shapes and their indices
+  TopTools_IndexedMapOfShape anIndices;
+  TopExp::MapShapes(aShape, anIndices);
+
+  // Non-blocks
+  Handle(GEOM_Object) aNonBlocks;
+  if (NOT.Extent() > 0 || EXT.Extent() > 0) {
+    Handle(TColStd_HArray1OfInteger) anArray =
+      new TColStd_HArray1OfInteger (1, NOT.Extent() + EXT.Extent());
+    Standard_Integer ii = 1;
+    TopTools_ListIteratorOfListOfShape it1 (NOT);
+    for (; it1.More(); it1.Next(), ii++) {
+      anArray->SetValue(ii, anIndices.FindIndex(it1.Value()));
+    }
+    TopTools_ListIteratorOfListOfShape it2 (EXT);
+    for (; it2.More(); it2.Next(), ii++) {
+      anArray->SetValue(ii, anIndices.FindIndex(it2.Value()));
+    }
+
+    aNonBlocks = GetEngine()->AddSubShape(theShape, anArray);
+    if (aNonBlocks.IsNull()) {
+      SetErrorCode("Error in algorithm: result found, but cannot be returned.");
+      return NULL;
+    }
+    aNonBlocks->SetType(GEOM_GROUP);
+    TDF_Label aFreeLabel = aNonBlocks->GetFreeLabel();
+    TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)TopAbs_SOLID);
+  }
+
+  // Non-quadrangles
+  if (NOQ.Extent() > 0) {
+    Handle(TColStd_HArray1OfInteger) anArray =
+      new TColStd_HArray1OfInteger (1, NOQ.Extent());
+    Standard_Integer ii = 1;
+    TopTools_ListIteratorOfListOfShape it1 (NOQ);
+    for (; it1.More(); it1.Next(), ii++) {
+      anArray->SetValue(ii, anIndices.FindIndex(it1.Value()));
+    }
+
+    theNonQuads = GetEngine()->AddSubShape(theShape, anArray);
+    if (theNonQuads.IsNull()) {
+      SetErrorCode("Error in algorithm: result found, but cannot be returned.");
+      return NULL;
+    }
+    theNonQuads->SetType(GEOM_GROUP);
+    TDF_Label aFreeLabel = theNonQuads->GetFreeLabel();
+    TDataStd_Integer::Set(aFreeLabel, (Standard_Integer)TopAbs_FACE);
+  }
+
+  //Make a Python command
+  Handle(GEOM_Function) aMainShape = theShape->GetLastFunction();
+  GEOM::TPythonDump pd (aMainShape, /*append=*/true);
+  pd << "(";
+  if (aNonBlocks.IsNull())
+    pd << "no_bad_solids";
+  else
+    pd << aNonBlocks;
+  pd << ", ";
+  if (theNonQuads.IsNull())
+    pd << "no_bad_faces";
+  else
+    pd << theNonQuads;
+  pd << ") = geompy.GetNonBlocks(" << theShape << ")";
+
+  SetErrorCode(OK);
+  return aNonBlocks;
+}
+
 //=============================================================================
 /*!
  *  RemoveExtraEdges
index f702da4026c65867143d1261df1b3890b5062aaf..8a34d5510afe2669f36259785434e604e6319316 100644 (file)
@@ -18,7 +18,6 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 #ifndef _GEOMImpl_IBlocksOperations_HXX_
 #define _GEOMImpl_IBlocksOperations_HXX_
@@ -126,14 +125,17 @@ class GEOMImpl_IBlocksOperations : public GEOM_IOperations {
   };
 
   Standard_EXPORT Standard_Boolean CheckCompoundOfBlocksOld (Handle(GEOM_Object) theCompound,
-                                                             std::list<BCError>&      theErrors);
+                                                             std::list<BCError>& theErrors);
 
   Standard_EXPORT Standard_Boolean CheckCompoundOfBlocks (Handle(GEOM_Object) theCompound,
-                                                          std::list<BCError>&      theErrors);
+                                                          std::list<BCError>& theErrors);
 
-  Standard_EXPORT TCollection_AsciiString PrintBCErrors (Handle(GEOM_Object)  theCompound,
+  Standard_EXPORT TCollection_AsciiString PrintBCErrors (Handle(GEOM_Object)       theCompound,
                                                          const std::list<BCError>& theErrors);
 
+  Standard_EXPORT Handle(GEOM_Object) GetNonBlocks (Handle(GEOM_Object) theShape,
+                                                    Handle(GEOM_Object)& theNonQuads);
+
   Standard_EXPORT Handle(GEOM_Object) RemoveExtraEdges (Handle(GEOM_Object) theShape,
                                                         const Standard_Integer theOptimumNbFaces = 6);
 
@@ -142,7 +144,8 @@ class GEOMImpl_IBlocksOperations : public GEOM_IOperations {
   Standard_EXPORT static void AddBlocksFrom (const TopoDS_Shape&   theShape,
                                              TopTools_ListOfShape& BLO,
                                              TopTools_ListOfShape& NOT,
-                                             TopTools_ListOfShape& EXT);
+                                             TopTools_ListOfShape& EXT,
+                                             TopTools_ListOfShape& NOQ);
 
   // Extract blocks from blocks compounds
   Standard_EXPORT Handle(TColStd_HSequenceOfTransient) ExplodeCompoundOfBlocks
index 0c1917d46ca96d78e93a33c1903b99f6f922ade9..c71432528a43e0597f7e7fbc411e0332bab9365f 100644 (file)
@@ -18,7 +18,6 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 #include <Standard_Stream.hxx>
 
@@ -742,6 +741,39 @@ char* GEOM_IBlocksOperations_i::PrintBCErrors
   return CORBA::string_dup(aDescr.ToCString());
 }
 
+//=============================================================================
+/*!
+ *  GetNonBlocks
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_IBlocksOperations_i::GetNonBlocks
+                                      (GEOM::GEOM_Object_ptr theShape,
+                                       GEOM::GEOM_Object_out theNonQuads)
+{
+  GEOM::GEOM_Object_var aGEOMObject;
+  GEOM::GEOM_Object_var aNonQuads;
+
+  theNonQuads = aNonQuads._retn();
+
+  //Set a not done flag
+  GetOperations()->SetNotDone();
+
+  //Get the reference Objects
+  Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
+  if (aShape.IsNull()) return aGEOMObject._retn();
+
+  //Get the result
+  Handle(GEOM_Object) aFaces;
+  Handle(GEOM_Object) anObject = GetOperations()->GetNonBlocks(aShape, aFaces);
+  if (!GetOperations()->IsDone() || anObject.IsNull())
+    return aGEOMObject._retn();
+
+  if (!aFaces.IsNull())
+    theNonQuads = GetObject(aFaces);
+
+  return GetObject(anObject);
+}
+
 //=============================================================================
 /*!
  *  RemoveExtraEdges
index a801a1e7e5008d88a11b45a515a8b4192684c0e7..6f57650923bd58d990989574d4b7574260341b57 100644 (file)
@@ -18,7 +18,6 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 #ifndef _GEOM_IBlocksOperations_i_HeaderFile
 #define _GEOM_IBlocksOperations_i_HeaderFile
@@ -121,6 +120,9 @@ class GEOM_I_EXPORT GEOM_IBlocksOperations_i :
   char* PrintBCErrors (GEOM::GEOM_Object_ptr theCompound,
                       const GEOM::GEOM_IBlocksOperations::BCErrors& theErrors);
 
+  GEOM::GEOM_Object_ptr GetNonBlocks (GEOM::GEOM_Object_ptr theShape,
+                                      GEOM::GEOM_Object_out theNonQuads);
+
   GEOM::GEOM_Object_ptr RemoveExtraEdges (GEOM::GEOM_Object_ptr theShape,
                                           CORBA::Long           theOptimumNbFaces);
 
index 05c23aed66f4127f2bcf315e4822682a75ccf3bc..7c17db76a92cdcfc72a1e56604c9115d22585bff 100644 (file)
 #
 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
-
 #  GEOM GEOM_SWIG : binding of C++ implementaion with Python
 #  File   : GEOM_Spanner.py
 #  Author : Julia DOROVSKIKH
 #  Module : GEOM
-#  $Header$
+#
 # ! Please, if you edit this example file, update also
 # ! GEOM_SRC/doc/salome/gui/GEOM/input/tui_test_spanner.doc
 # ! as some sequences of symbols from this example are used during
 # ! documentation generation to identify certain places of this file
-############# MakeSpanner #############
 #
+############# MakeSpanner #############
 def MakeSpanner (geompy, math, isBlocksTest = 0, isMeshTest = 0, smesh = None):
 
   ### Variables ###
@@ -304,6 +303,11 @@ def MakeSpanner (geompy, math, isBlocksTest = 0, isMeshTest = 0, smesh = None):
   isCompOfBlocks6 = BlocksOp.CheckCompoundOfBlocks(Spanner)
   if isCompOfBlocks6 == 0:
     print "Spanner is not a compound of hexahedral solids"
+    (NonBlocks, NonQuads) = geompy.GetNonBlocks(Spanner)
+    if NonBlocks is not None:
+      geompy.addToStudyInFather(Spanner, NonBlocks, "Group of non-hexahedral solids")
+    if NonQuads is not None:
+      geompy.addToStudyInFather(Spanner, NonQuads, "Group of non-quadrangular faces")
   else:
     print "Spanner is a compound of hexahedral solids"
 
index 8e65788e2b5d6dde49e5c1f91491114bbc6ef5fb..73d91287d3483359cbffd71b065950ad8e772493 100644 (file)
@@ -243,6 +243,11 @@ def TestOtherOperations (geompy, math):
   IsValid = geompy.CheckCompoundOfBlocks(Compound1)
   if IsValid == 0:
     print "The Blocks Compound is NOT VALID"
+    (NonBlocks, NonQuads) = geompy.GetNonBlocks(Compound1)
+    if NonBlocks is not None:
+      geompy.addToStudyInFather(Compound1, NonBlocks, "Group of non-hexahedral solids")
+    if NonQuads is not None:
+      geompy.addToStudyInFather(Compound1, NonQuads, "Group of non-quadrangular faces")
   else:
     print "The Blocks Compound is VALID"
 
index ca34d88932208da5a4e5bdb4caa1e9203a724ba9..b7e5a4a922ff572b1febece20d79fe9617182b3b 100644 (file)
@@ -7774,6 +7774,36 @@ class geompyDC(GEOM._objref_GEOM_Gen):
                 print Descr
             return IsValid
 
+        ## Retrieve all non blocks solids and faces from \a theShape.
+        #  @param theShape The shape to explore.
+        #  @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.
+        #
+        #  @ref tui_measurement_tools_page "Example 1"
+        #  \n @ref swig_GetNonBlocks "Example 2"
+        def GetNonBlocks (self, theShape):
+            """
+            Retrieve all non blocks solids and faces from theShape.
+
+            Parameters:
+                theShape The shape to explore.
+
+            Returns:
+                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.
+
+            Usage:
+                (res_sols, res_faces) = geompy.GetNonBlocks(myShape1)
+            """
+            # Example: see GEOM_Spanner.py
+            aTuple = self.BlocksOp.GetNonBlocks(theShape)
+            RaiseIfFailed("GetNonBlocks", self.BlocksOp)
+            return aTuple
+
         ## Remove all seam and degenerated edges from \a theShape.
         #  Unite faces and edges, sharing one surface. It means that
         #  this faces must have references to one C++ surface object (handle).
index 8b0541a9af480125dda4238be3b12be724cbfcac..55cfcf7a5a899aaeac31136f770d7f19a1ad4a23 100644 (file)
@@ -40,6 +40,7 @@ salomeinclude_HEADERS =                               \
        MeasureGUI_WhatisDlg.h                  \
        MeasureGUI_CheckShapeDlg.h              \
        MeasureGUI_CheckCompoundOfBlocksDlg.h   \
+       MeasureGUI_GetNonBlocksDlg.h            \
        MeasureGUI_CheckSelfIntersectionsDlg.h  \
        MeasureGUI_PointDlg.h
 
@@ -61,6 +62,7 @@ dist_libMeasureGUI_la_SOURCES =                       \
        MeasureGUI_WhatisDlg.cxx                \
        MeasureGUI_CheckShapeDlg.cxx            \
        MeasureGUI_CheckCompoundOfBlocksDlg.cxx \
+       MeasureGUI_GetNonBlocksDlg.cxx          \
        MeasureGUI_CheckSelfIntersectionsDlg.cxx \
        MeasureGUI_PointDlg.cxx
 
@@ -78,6 +80,7 @@ MOC_FILES =                                           \
        MeasureGUI_WhatisDlg_moc.cxx                    \
        MeasureGUI_CheckShapeDlg_moc.cxx                \
        MeasureGUI_CheckCompoundOfBlocksDlg_moc.cxx     \
+       MeasureGUI_GetNonBlocksDlg_moc.cxx              \
        MeasureGUI_CheckSelfIntersectionsDlg_moc.cxx    \
        MeasureGUI_PointDlg_moc.cxx
 
@@ -122,4 +125,3 @@ libMeasureGUI_la_CPPFLAGS =         \
 libMeasureGUI_la_LDFLAGS  =            \
        $(CAS_LDFLAGS) -lTKGeomBase \
        ../GEOMBase/libGEOMBase.la ../DlgRef/libDlgRef.la
-
index e1ddbfcfff31b4b53818b073223d32ec163657dc..f31cf71615de934031c272a523b2035aea60d32b 100644 (file)
@@ -18,7 +18,6 @@
 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
 
 // GEOM GEOMGUI : GUI for Geometry component
 // File   : MeasureGUI.cxx
@@ -42,6 +41,7 @@
 #include "MeasureGUI_WhatisDlg.h"        // Method WHATIS
 #include "MeasureGUI_CheckShapeDlg.h"    // Method CHECKSHAPE
 #include "MeasureGUI_CheckCompoundOfBlocksDlg.h" // Method CHECKCOMPOUND
+#include "MeasureGUI_GetNonBlocksDlg.h"  // Method GET NON BLOCKS
 #include "MeasureGUI_CheckSelfIntersectionsDlg.h" // Method CHECK SELF INTERSCTIONS
 #include "MeasureGUI_PointDlg.h"         // Method POINTCOORDINATES
 
@@ -110,6 +110,9 @@ bool MeasureGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent )
   case GEOMOp::OpCheckCompound:
     dlg = new MeasureGUI_CheckCompoundOfBlocksDlg( getGeometryGUI(), parent );
     break; // CHECKCOMPOUND
+  case GEOMOp::OpGetNonBlocks:
+    dlg = new MeasureGUI_GetNonBlocksDlg(getGeometryGUI(), parent);
+    break; // GET NON BLOCKS
   case GEOMOp::OpCheckSelfInters:
     dlg = new MeasureGUI_CheckSelfIntersectionsDlg( getGeometryGUI(), parent );
     break; // CHECK SELF INTERSCTIONS
index 84676e669b4c5490a28ffcc60e74732b151cdf5e..df20f449cc8dbb0136ad2d1189a59079f1d534cb 100644 (file)
@@ -84,7 +84,7 @@ MeasureGUI_CenterMassDlg::MeasureGUI_CenterMassDlg( GeometryGUI* theGeometryGUI,
 
   /***************************************************************/
 
-  myHelpFileName = "using_measurement_tools_page.html#center_mass_anchor";
+  myHelpFileName = "center_mass_page.html";
 
   /* Initialisation */
   Init();
diff --git a/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx b/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.cxx
new file mode 100644 (file)
index 0000000..517f597
--- /dev/null
@@ -0,0 +1,277 @@
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+
+// GEOM GEOMGUI : GUI for Geometry component
+// File   : MeasureGUI_GetNonBlocksDlg.cxx
+
+#include "MeasureGUI_GetNonBlocksDlg.h"
+
+#include <DlgRef.h>
+#include <GEOMBase.h>
+
+#include <GeometryGUI.h>
+
+#include <SUIT_Session.h>
+#include <SUIT_ResourceMgr.h>
+#include <SalomeApp_Application.h>
+#include <LightApp_SelectionMgr.h>
+#include <SalomeApp_Tools.h>
+
+//=================================================================================
+// class    : MeasureGUI_GetNonBlocksDlg()
+// purpose  : Constructs a MeasureGUI_GetNonBlocksDlg which is a child of 'parent',
+//            with the name 'name' and widget flags set to 'f'.
+//            The dialog will by default be modeless, unless you set 'modal' to
+//            true to construct a modal dialog.
+//=================================================================================
+MeasureGUI_GetNonBlocksDlg::MeasureGUI_GetNonBlocksDlg (GeometryGUI* theGeometryGUI, QWidget* parent)
+  : GEOMBase_Skeleton(theGeometryGUI, parent, false)
+{
+  QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_GETNONBLOCKS")));
+  QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT")));
+
+  setWindowTitle(tr("GEOM_GETNONBLOCKS_TITLE"));
+
+  /***************************************************************/
+  mainFrame()->GroupConstructors->setTitle(tr("GEOM_GETNONBLOCKS"));
+  mainFrame()->RadioButton1->setIcon(image0);
+  mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose);
+  mainFrame()->RadioButton2->close();
+  mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
+  mainFrame()->RadioButton3->close();
+
+  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);
+
+  QVBoxLayout* layout = new QVBoxLayout(centralWidget());
+  layout->setMargin(0); layout->setSpacing(6);
+  layout->addWidget(myGrp);
+
+  /***************************************************************/
+
+  myHelpFileName = "get_non_blocks_page.html";
+
+  /* Initialisation */
+  Init();
+}
+
+//=================================================================================
+// function : ~MeasureGUI_GetNonBlocksDlg()
+// purpose  : Destroys the object and frees any allocated resources
+//=================================================================================
+MeasureGUI_GetNonBlocksDlg::~MeasureGUI_GetNonBlocksDlg()
+{
+}
+
+//=================================================================================
+// function : Init()
+// purpose  :
+//=================================================================================
+void MeasureGUI_GetNonBlocksDlg::Init()
+{
+  showOnlyPreviewControl();
+
+  /* init variables */
+  myEditCurrentArgument = myGrp->LineEdit1;
+
+   /* 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(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(),
+           SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
+
+  //initName(tr("GEOM_NONBLOCKS"));
+  mainFrame()->ResultName->setText(tr("GEOM_NONBLOCKS"));
+  globalSelection();
+  SelectionIntoArgument();
+}
+
+//=================================================================================
+// function : ClickOnOk()
+// purpose  :
+//=================================================================================
+void MeasureGUI_GetNonBlocksDlg::ClickOnOk()
+{
+  if (ClickOnApply())
+    ClickOnCancel();
+}
+
+//=================================================================================
+// function : ClickOnApply()
+// purpose  :
+//=================================================================================
+bool MeasureGUI_GetNonBlocksDlg::ClickOnApply()
+{
+  if (!onAccept())
+    return false;
+
+  //initName();
+  return true;
+}
+
+//=================================================================================
+// function : SelectionIntoArgument()
+// purpose  : Called when selection as changed or other case
+//=================================================================================
+void MeasureGUI_GetNonBlocksDlg::SelectionIntoArgument()
+{
+  erasePreview();
+  myObj = GEOM::GEOM_Object::_nil();
+
+  LightApp_SelectionMgr* aSelMgr = myGeomGUI->getApp()->selectionMgr();
+  SALOME_ListIO aSelList;
+  aSelMgr->selectedObjects(aSelList);
+
+  if (aSelList.Extent() != 1) {
+    processObject();
+    return;
+  }
+
+  GEOM::GEOM_Object_var aSelectedObject =
+    GEOMBase::ConvertIOinGEOMObject(aSelList.First());
+
+  if (aSelectedObject->_is_nil()) {
+    processObject();
+    return;
+  }
+
+  myObj = aSelectedObject;
+  processObject();
+}
+
+//=================================================================================
+// function : SetEditCurrentArgument()
+// purpose  :
+//=================================================================================
+void MeasureGUI_GetNonBlocksDlg::SetEditCurrentArgument()
+{
+  myGrp->LineEdit1->setFocus();
+  myEditCurrentArgument = myGrp->LineEdit1;
+  SelectionIntoArgument();
+}
+
+//=================================================================================
+// function : LineEditReturnPressed()
+// purpose  :
+//=================================================================================
+void MeasureGUI_GetNonBlocksDlg::LineEditReturnPressed()
+{
+  QLineEdit* send = (QLineEdit*)sender();
+  if (send == myGrp->LineEdit1) {
+    myEditCurrentArgument = myGrp->LineEdit1;
+    GEOMBase_Skeleton::LineEditReturnPressed();
+  }
+}
+
+//=================================================================================
+// function : ActivateThisDialog()
+// purpose  :
+//=================================================================================
+void MeasureGUI_GetNonBlocksDlg::ActivateThisDialog()
+{
+  GEOMBase_Skeleton::ActivateThisDialog();
+
+  connect(((SalomeApp_Application*)(SUIT_Session::session()->activeApplication()))->selectionMgr(), 
+           SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
+
+  globalSelection();
+  processPreview();
+}
+
+//=================================================================================
+// function : processObject()
+// purpose  : Fill dialog fields in accordance with myObj
+//=================================================================================
+void MeasureGUI_GetNonBlocksDlg::processObject()
+{
+  if (myObj->_is_nil()) {
+    erasePreview();
+  }
+  else {
+    myGrp->LineEdit1->setText(GEOMBase::GetName(myObj));
+
+    processPreview();
+  }
+}
+
+//=================================================================================
+// function : enterEvent()
+// purpose  :
+//=================================================================================
+void MeasureGUI_GetNonBlocksDlg::enterEvent (QEvent*)
+{
+  if (!mainFrame()->GroupConstructors->isEnabled())
+    ActivateThisDialog();
+}
+
+//=================================================================================
+// function : createOperation
+// purpose  :
+//=================================================================================
+GEOM::GEOM_IOperations_ptr MeasureGUI_GetNonBlocksDlg::createOperation()
+{
+  return getGeomEngine()->GetIBlocksOperations(getStudyId());
+}
+
+//=================================================================================
+// function : isValid
+// purpose  :
+//=================================================================================
+bool MeasureGUI_GetNonBlocksDlg::isValid (QString&)
+{
+  return !myObj->_is_nil();
+}
+
+//=================================================================================
+// function : execute
+// purpose  :
+//=================================================================================
+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);
+  //mainFrame()->ResultName->setText(tr("GEOM_NONBLOCKS"));
+
+  if (!anObj->_is_nil())
+    objects.push_back(anObj._retn());
+  if (!aNonQuads->_is_nil())
+    objects.push_back(aNonQuads._retn());
+
+  return true;
+}
+
+//================================================================
+// Function : getFather
+// Purpose  : Get father object for object to be added in study
+//            ( called with addInStudy method )
+//================================================================
+GEOM::GEOM_Object_ptr MeasureGUI_GetNonBlocksDlg::getFather (GEOM::GEOM_Object_ptr)
+{
+  return myObj;
+}
diff --git a/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h b/src/MeasureGUI/MeasureGUI_GetNonBlocksDlg.h
new file mode 100644 (file)
index 0000000..438a4ec
--- /dev/null
@@ -0,0 +1,69 @@
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+
+// GEOM GEOMGUI : GUI for Geometry component
+// File   : MeasureGUI_GetNonBlocksDlg.h
+
+#ifndef MEASUREGUI_GETNONBLOCKSDLG_H
+#define MEASUREGUI_GETNONBLOCKSDLG_H
+
+#include <GEOMBase_Skeleton.h>
+
+class DlgRef_1Sel;
+
+//=================================================================================
+// class    : MeasureGUI_GetNonBlocksDlg
+// purpose  :
+//=================================================================================
+class MeasureGUI_GetNonBlocksDlg : public GEOMBase_Skeleton
+{
+  Q_OBJECT
+
+public:
+  MeasureGUI_GetNonBlocksDlg (GeometryGUI*, QWidget*);
+  ~MeasureGUI_GetNonBlocksDlg();
+
+protected:
+  // redefined from GEOMBase_Helper
+  virtual GEOM::GEOM_IOperations_ptr  createOperation();
+  virtual bool                        isValid (QString&);
+  virtual bool                        execute (ObjectList&);
+  virtual GEOM::GEOM_Object_ptr       getFather (GEOM::GEOM_Object_ptr);
+
+private slots:
+  void                                ClickOnOk();
+  bool                                ClickOnApply();
+  void                                ActivateThisDialog();
+  void                                LineEditReturnPressed();
+  void                                SelectionIntoArgument();
+  void                                SetEditCurrentArgument();
+  
+private:
+  void                                Init();
+  void                                enterEvent (QEvent*);
+  void                                processObject();
+
+private:
+  GEOM::GEOM_Object_var               myObj;
+  DlgRef_1Sel*                        myGrp;
+};
+
+#endif // MEASUREGUI_GETNONBLOCKSDLG_H