Salome HOME
Mantis issue 0021565: [CEA 557] Opposite of the pipe
authorjfa <jfa@opencascade.com>
Thu, 18 Oct 2012 13:04:45 +0000 (13:04 +0000)
committerjfa <jfa@opencascade.com>
Thu, 18 Oct 2012 13:04:45 +0000 (13:04 +0000)
28 files changed:
doc/salome/gui/GEOM/images/pipe_path.png [new file with mode: 0644]
doc/salome/gui/GEOM/images/pipe_path_dlg.png [new file with mode: 0644]
doc/salome/gui/GEOM/input/creating_complex_obj.doc
doc/salome/gui/GEOM/input/creating_pipe_path.doc [new file with mode: 0644]
doc/salome/gui/GEOM/input/tui_complex_objs.doc
idl/GEOM_Gen.idl
src/GEOMGUI/GEOM_images.ts
src/GEOMGUI/GEOM_msg_en.ts
src/GEOMGUI/GeometryGUI.cxx
src/GEOMGUI/GeometryGUI_Operations.h
src/GEOMImpl/GEOMImpl_Gen.cxx
src/GEOMImpl/GEOMImpl_I3DPrimOperations.cxx
src/GEOMImpl/GEOMImpl_I3DPrimOperations.hxx
src/GEOMImpl/GEOMImpl_IPipePath.hxx [new file with mode: 0644]
src/GEOMImpl/GEOMImpl_PipeDriver.cxx
src/GEOMImpl/GEOMImpl_PipePathDriver.cxx [new file with mode: 0644]
src/GEOMImpl/GEOMImpl_PipePathDriver.hxx [new file with mode: 0644]
src/GEOMImpl/GEOMImpl_ShapeDriver.cxx
src/GEOMImpl/GEOMImpl_ShapeDriver.hxx
src/GEOMImpl/GEOMImpl_Types.hxx
src/GEOMImpl/Makefile.am
src/GEOM_I/GEOM_I3DPrimOperations_i.cc
src/GEOM_I/GEOM_I3DPrimOperations_i.hh
src/GEOM_SWIG/geompyDC.py
src/GenerationGUI/GenerationGUI.cxx
src/GenerationGUI/GenerationGUI_PipePathDlg.cxx [new file with mode: 0644]
src/GenerationGUI/GenerationGUI_PipePathDlg.h [new file with mode: 0644]
src/GenerationGUI/Makefile.am

diff --git a/doc/salome/gui/GEOM/images/pipe_path.png b/doc/salome/gui/GEOM/images/pipe_path.png
new file mode 100644 (file)
index 0000000..92d5d62
Binary files /dev/null and b/doc/salome/gui/GEOM/images/pipe_path.png differ
diff --git a/doc/salome/gui/GEOM/images/pipe_path_dlg.png b/doc/salome/gui/GEOM/images/pipe_path_dlg.png
new file mode 100644 (file)
index 0000000..e2f969d
Binary files /dev/null and b/doc/salome/gui/GEOM/images/pipe_path_dlg.png differ
index 0d0404336d4291db69e32ff63d9b13b47cd33598..46c4baa908a30d02b87924a4f963311f575e66e5 100644 (file)
@@ -14,7 +14,7 @@ axis, creating a body of revolution.</li>
 <li>\subpage create_filling_page  "Create a surface" from a set of edges.</li>
 <li>\subpage create_extrusion_alongpath_page "Extrude an object along a path", 
 creating a more complex trajectory object.</li>
-
+<li>\subpage create_pipe_path_page "Restore Path" of a pipe-like shape.</li>
 </ul>
 
 */
diff --git a/doc/salome/gui/GEOM/input/creating_pipe_path.doc b/doc/salome/gui/GEOM/input/creating_pipe_path.doc
new file mode 100644 (file)
index 0000000..abf97b5
--- /dev/null
@@ -0,0 +1,44 @@
+/*!
+
+\page create_pipe_path_page Restore Path
+
+To generate a \b Path in the <b>Main Menu</b> select <b>New Entity - > Generation - > Restore Path</b>
+
+\image html pipe_path_dlg.png
+
+\n To obtain a \b Path of a pipe-like shape, you should define the
+<b>Pipe-like shell or solid</b> and two pipe \b Bases, each of them can
+be set as a wire, a face or a list of edges.<br>
+\n <b>Select unpublished edges</b> checkbox - if checked, allows
+selection of edges in the viewer, that are not published in the Object
+Browser.<br>
+\n The \b Result of the operation will be a GEOM_Object (edge or wire).<br>
+
+\n <b>Advanced options</b>:
+<ul>
+<li>\ref preview_anchor "Preview"</li>
+</ul><br>
+
+\note It is not assumed that exact or approximate copy of the Shape
+      can be obtained by applying existing Pipe operation on the
+      resulting "Path" wire taking the first Base as the base - it is
+      not always possible; though in some particular cases it might
+      work it is not guaranteed. Thus, RestorePath function should not
+      be considered as an exact reverse operation of the Pipe.<br>
+
+\n <b>Example:</b>
+
+\image html pipe_path.png "Path (red) between two faces (green)"
+
+\n <b>TUI Command:</b> <em>geompy.RestorePath(aShape, aBase1, aBase2)</em>
+\n <b>Arguments:</b> Name + 1 pipe-like shape (shell or solid) + 1
+shape (edge, wire or face) for the first base + 1 shape (edge, wire or
+face) for the last base.
+\n <b>TUI Command:</b> <em>geompy.RestorePathEdges(aShape, listEdges1, listEdges2)</em>
+\n <b>Arguments:</b> Name + 1 pipe-like shape (shell or solid) + 1
+list of edges for the first base + 1 list of edges for the last base.
+
+Our <b>TUI Scripts</b> provide you with useful examples of creation of
+\ref tui_creation_pipe_path "Complex Geometric Objects".
+
+*/
index 7dcf151c177d518e3b08630001047186926f2784..2cdcf156a135612b5fedd0321fd92c1bbeb25cd4 100644 (file)
@@ -623,31 +623,78 @@ from math import pi
 spring = MakeSpring(50, 100, 2*pi, 1, 5, pi/2)
 \endcode
 
-<br><h2>Creation of Tangent Plane On Face</h2>
+
+\anchor tui_creation_pipe_path
+<br><h2>Creation of a Middle Path</h2>
+
 \code
 import salome
 import geompy
 
-    # Create Vertexes for curve
-    Vertex_1 = geompy.MakeVertex(0, 0, 0)
-    Vertex_2 = geompy.MakeVertex(0, 90, 30)
-    Vertex_3 = geompy.MakeVertex(100, 90, 0)
-    Vertex_4 = geompy.MakeVertex(-100, 90, 0)
-    # Create curve
-    Curve_1 = geompy.MakeInterpol([Vertex_4, Vertex_2, Vertex_3, Vertex_1])
-    # Create Face by Extrusion of the Curve
-    Extrusion_1 = geompy.MakePrismDXDYDZ(Curve_1, 0, 30, -60)
-    # Make Tangent on this Extrusion (Face)
-    Tangent_1 = geompy.MakeTangentPlaneOnFace(Extrusion_1, 0.7, 0.5, 150)
-    # Publish in the study
-    geompy.addToStudy( Vertex_1, "Vertex_1" )
-    geompy.addToStudy( Vertex_2, "Vertex_2" )
-    geompy.addToStudy( Vertex_3, "Vertex_3" )
-    geompy.addToStudy( Vertex_4, "Vertex_4" )
-    geompy.addToStudy( Curve_1, "Curve_1" )
-    geompy.addToStudy( Extrusion_1, "Extrusion_1" )
-    geompy.addToStudy( Tangent_1, "Tangent_1" )
+# Create a box
+Box_1 = geompy.MakeBoxDXDYDZ(200, 200, 200)
+
+# Get two opposite faces
+[Face_1,Face_2] = geompy.SubShapes(Box_1, [31, 33])
+
+# Get edges
+Box_1_edge_12 = geompy.GetSubShape(Box_1, [12])
+Box_1_edge_22 = geompy.GetSubShape(Box_1, [22])
+Box_1_edge_25 = geompy.GetSubShape(Box_1, [25])
+Box_1_edge_29 = geompy.GetSubShape(Box_1, [29])
+Box_1_edge_8 = geompy.GetSubShape(Box_1, [8])
+Box_1_edge_18 = geompy.GetSubShape(Box_1, [18])
+Box_1_edge_26 = geompy.GetSubShape(Box_1, [26])
+Box_1_edge_30 = geompy.GetSubShape(Box_1, [30])
+
+# These three calls to RestorePath return the same result
+Path_1 = geompy.RestorePath(Box_1, Face_1, Face_2)
+Path_2 = geompy.RestorePathEdges(Box_1, [Face_1], [Face_2])
+Path_3 = geompy.RestorePathEdges(Box_1,
+                                 [Box_1_edge_12, Box_1_edge_22, Box_1_edge_25, Box_1_edge_29],
+                                 [Box_1_edge_8, Box_1_edge_18, Box_1_edge_26, Box_1_edge_30])
+
+# Publish created objects
+geompy.addToStudy( Box_1, 'Box_1' )
+geompy.addToStudyInFather( Box_1, Face_1, 'Face_1' )
+geompy.addToStudyInFather( Box_1, Face_2, 'Face_2' )
+geompy.addToStudyInFather( Box_1, Box_1_edge_25, 'Box_1:edge_25' )
+geompy.addToStudyInFather( Box_1, Box_1_edge_22, 'Box_1:edge_22' )
+geompy.addToStudyInFather( Box_1, Box_1_edge_12, 'Box_1:edge_12' )
+geompy.addToStudyInFather( Box_1, Box_1_edge_29, 'Box_1:edge_29' )
+geompy.addToStudyInFather( Box_1, Box_1_edge_18, 'Box_1:edge_18' )
+geompy.addToStudyInFather( Box_1, Box_1_edge_26, 'Box_1:edge_26' )
+geompy.addToStudyInFather( Box_1, Box_1_edge_8, 'Box_1:edge_8' )
+geompy.addToStudyInFather( Box_1, Box_1_edge_30, 'Box_1:edge_30' )
+geompy.addToStudy( Path_1, 'Path_1' )
+geompy.addToStudy( Path_2, 'Path_2' )
+geompy.addToStudy( Path_3, 'Path_3' )
 \endcode
 
+<br><h2>Creation of Tangent Plane On Face</h2>
+\code
+import salome
+import geompy
+
+# Create Vertexes for curve
+Vertex_1 = geompy.MakeVertex(0, 0, 0)
+Vertex_2 = geompy.MakeVertex(0, 90, 30)
+Vertex_3 = geompy.MakeVertex(100, 90, 0)
+Vertex_4 = geompy.MakeVertex(-100, 90, 0)
+# Create curve
+Curve_1 = geompy.MakeInterpol([Vertex_4, Vertex_2, Vertex_3, Vertex_1])
+# Create Face by Extrusion of the Curve
+Extrusion_1 = geompy.MakePrismDXDYDZ(Curve_1, 0, 30, -60)
+# Make Tangent on this Extrusion (Face)
+Tangent_1 = geompy.MakeTangentPlaneOnFace(Extrusion_1, 0.7, 0.5, 150)
+# Publish in the study
+geompy.addToStudy( Vertex_1, "Vertex_1" )
+geompy.addToStudy( Vertex_2, "Vertex_2" )
+geompy.addToStudy( Vertex_3, "Vertex_3" )
+geompy.addToStudy( Vertex_4, "Vertex_4" )
+geompy.addToStudy( Curve_1, "Curve_1" )
+geompy.addToStudy( Extrusion_1, "Extrusion_1" )
+geompy.addToStudy( Tangent_1, "Tangent_1" )
+\endcode
 
 */
index 8f90021eb75fdc531bd9e2afb90a426f80fd0fce..9c6896aad104cb100c4ca54e697b7972f4742746 100644 (file)
@@ -715,6 +715,11 @@ module GEOM
                                        in double theTrimSize);
   };
 
+  /*!
+   *  \brief Interface for shapes transforming.
+   *
+   *  Translation, rotation, scaling, mirroring, offset, projection, recomputing.
+   */
   interface GEOM_ITransformOperations : GEOM_IOperations
   {
     /*!
@@ -1077,7 +1082,8 @@ module GEOM
      *  \param  thePath Wire or Edge along that the object will be translated.
      *  \param  theDistance progress of Path (0 = actual location, 1 = end of path location).
      *  \param  theCopy is a true or false parameter. true is to create a copy, false to move the object.
-     *  \param  theReverse is a true or false parameter. true is to reverse direction, false is to move normal direction.
+     *  \param  theReverse is a true or false parameter. True is to reverse
+     *                     direction, false is to move normal direction.
      *  \return New GEOM_Object, containing the displaced shape.
      */
     GEOM_Object PositionAlongPath (in GEOM_Object theObject,
@@ -1105,7 +1111,6 @@ module GEOM
     GEOM_Object RecomputeObject (in GEOM_Object theObject);
   };
   
- // # GEOM_I3DPrimOperations:
   /*!
    *  \brief Interface for 3D primitives creation
    *
@@ -1485,9 +1490,49 @@ module GEOM
                                              in GEOM_Object thePath,
                                              in GEOM_Object theVec);
 
+    /*!
+     *  \brief Build a middle path of a pipe-like shape.
+     *
+     *  The path shape can be a wire or an edge.
+     *  \param theShape It can be closed or unclosed pipe-like shell
+     *                  or a pipe-like solid.
+     *  \param theBase1, theBase2 Two bases of the supposed pipe. This
+     *                            should be wires or faces of \a theShape.
+     *  \note It is not assumed that exact or approximate copy of \a theShape
+     *        can be obtained by applying existing Pipe operation on the
+     *        resulting "Path" wire taking \a theBase1 as the base - it is not
+     *        always possible; though in some particular cases it might work
+     *        it is not guaranteed. Thus, RestorePath function should not be
+     *        considered as an exact reverse operation of the Pipe.
+     *  \return New GEOM_Object, containing an edge or wire that represent
+     *                           source pipe's "path".
+     */
+    GEOM_Object RestorePath (in GEOM_Object theShape,
+                             in GEOM_Object theBase1,
+                             in GEOM_Object theBase2);
+
+    /*!
+     *  \brief Build a middle path of a pipe-like shape.
+     *
+     *  The path shape can be a wire or an edge.
+     *  \param theShape It can be closed or unclosed pipe-like shell
+     *                  or a pipe-like solid.
+     *  \param theBase1, theBase2 Two bases of the supposed pipe. This
+     *                            should be lists of edges of \a theShape.
+     *  \note It is not assumed that exact or approximate copy of \a theShape
+     *        can be obtained by applying existing Pipe operation on the
+     *        resulting "Path" wire taking \a theBase1 as the base - it is not
+     *        always possible; though in some particular cases it might work
+     *        it is not guaranteed. Thus, RestorePath function should not be
+     *        considered as an exact reverse operation of the Pipe.
+     *  \return New GEOM_Object, containing an edge or wire that represent
+     *                           source pipe's "path".
+     */
+    GEOM_Object RestorePathEdges (in GEOM_Object theShape,
+                                  in ListOfGO theBase1,
+                                  in ListOfGO theBase2);
   };
 
- // # GEOM_IShapesOperations
   /*!
    *  \brief Interface for Shapes creation:
    *
index 96b164f7bc053034eb16a836c70689ee635b104e..9cd7e615e968e0c4e1d41bc00dedd39e19d2ed7a 100644 (file)
             <source>ICON_DLG_PARTITION_PLANE</source>
             <translation>partitionplane.png</translation>
         </message>
+        <message>
+            <source>ICON_DLG_PIPE_PATH</source>
+            <translation>pipe.png</translation>
+        </message>
         <message>
             <source>ICON_DLG_PIPE</source>
             <translation>pipe.png</translation>
             <source>ICO_PIPE</source>
             <translation>pipe.png</translation>
         </message>
+        <message>
+            <source>ICO_PIPE_PATH</source>
+            <translation>pipe.png</translation>
+        </message>
         <message>
             <source>ICO_PLANE</source>
             <translation>plane.png</translation>
index 19b71ca9e0f86566e67089532e3e150d17929232..20c80d6b67e57d603a5308fe0771c0024cabedac 100644 (file)
@@ -1278,6 +1278,26 @@ Please, select face, shell or solid and try again</translation>
         <source>GEOM_PIPE_TITLE</source>
         <translation>Pipe Construction</translation>
     </message>
+    <message>
+        <source>GEOM_PIPE_PATH</source>
+        <translation>Path</translation>
+    </message>
+    <message>
+        <source>GEOM_PIPE_PATH_TITLE</source>
+        <translation>Restore Path</translation>
+    </message>
+    <message>
+        <source>GEOM_PIPE_LIKE_SHAPE</source>
+        <translation>Pipe-like shell or solid</translation>
+    </message>
+    <message>
+        <source>GEOM_PIPE_BASE1_OBJECT</source>
+        <translation>First base face/wire/edges</translation>
+    </message>
+    <message>
+        <source>GEOM_PIPE_BASE2_OBJECT</source>
+        <translation>Last base face/wire/edges</translation>
+    </message>
     <message>
         <source>GEOM_PROFILE</source>
         <translation>Profile</translation>
@@ -2714,6 +2734,10 @@ Please, select face, shell or solid and try again</translation>
         <source>MEN_PIPE</source>
         <translation>Extrusion Along Path</translation>
     </message>
+    <message>
+        <source>MEN_PIPE_PATH</source>
+        <translation>Restore Path</translation>
+    </message>
     <message>
         <source>MEN_PLANE</source>
         <translation>Plane</translation>
@@ -3494,6 +3518,10 @@ Please, select face, shell or solid and try again</translation>
         <source>STB_PIPE</source>
         <translation>Create a shape by extrusion along a path</translation>
     </message>
+    <message>
+        <source>STB_PIPE_PATH</source>
+        <translation>Restore path from a pipe-like shape</translation>
+    </message>
     <message>
         <source>STB_PLANE</source>
         <translation>Create a plane</translation>
@@ -4114,6 +4142,10 @@ Please, select face, shell or solid and try again</translation>
         <source>TOP_PIPE</source>
         <translation>Extrusion along path</translation>
     </message>
+    <message>
+        <source>TOP_PIPE_PATH</source>
+        <translation>Restore path</translation>
+    </message>
     <message>
         <source>TOP_PLANE</source>
         <translation>Create a plane</translation>
index cfb646debbcc1af0ea482144e18e75bb04f426ad..d13a0fd99da80993ea3e627af4c169ae0728955d 100644 (file)
 
 #include <GEOM_version.h>
 
-
 #include "GEOMImpl_Types.hxx"
 
 extern "C" {
@@ -135,7 +134,7 @@ GEOM::GEOM_Gen_var GeometryGUI::GetGeomGen()
 bool GeometryGUI::InitGeomGen()
 {
   GeometryGUI aGG;
-  if( CORBA::is_nil( myComponentGeom ) ) return false;
+  if ( CORBA::is_nil( myComponentGeom ) ) return false;
   return true;
 }
 
@@ -173,12 +172,12 @@ SALOMEDS::Study_var GeometryGUI::ClientStudyToStudy (_PTR(Study) theStudy)
   return aDSStudy._retn();
 }
 
-void GeometryGUI::Modified( bool theIsUpdateActions )
+void GeometryGUI::Modified (bool theIsUpdateActions)
 {
-  if( SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() ) ) {
-    if( SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) ) {
+  if ( SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() ) ) {
+    if ( SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) ) {
       appStudy->Modified();
-      if( theIsUpdateActions )
+      if ( theIsUpdateActions )
         app->updateActions();
     }
   }
@@ -281,17 +280,17 @@ void GeometryGUI::ActiveWorkingPlane()
   bool ViewOCC = ( window && window->getViewManager()->getType() == OCCViewer_Viewer::Type() );
   bool ViewVTK = ( window && window->getViewManager()->getType() == SVTK_Viewer::Type() );
 
-  if( ViewOCC ) {
+  if ( ViewOCC ) {
     OCCViewer_ViewWindow* vw = dynamic_cast<OCCViewer_ViewWindow*>( window );
     if ( vw ) {
       Handle(V3d_View) view3d =  vw->getViewPort()->getView();
 
       view3d->SetProj(DZ.X(), DZ.Y(), DZ.Z());
       view3d->SetUp(DY.X(), DY.Y(), DY.Z());
-      vw->onViewFitAll(); 
+      vw->onViewFitAll();
     }
   }
-  else if( ViewVTK ) {
+  else if ( ViewVTK ) {
     SVTK_ViewWindow* vw = dynamic_cast<SVTK_ViewWindow*>( window );
     if ( vw ) {
       vtkCamera* camera = vw->getRenderer()->GetActiveCamera();
@@ -473,6 +472,7 @@ void GeometryGUI::OnGUIEvent( int id )
   case GEOMOp::OpRevolution:         // MENU GENERATION - REVOLUTION
   case GEOMOp::OpFilling:            // MENU GENERATION - FILLING
   case GEOMOp::OpPipe:               // MENU GENERATION - PIPE
+  case GEOMOp::OpPipePath:           // MENU GENERATION - RESTORE PATH
     libName = "GenerationGUI";
     break;
   case GEOMOp::Op2dSketcher:         // MENU ENTITY - SKETCHER
@@ -596,15 +596,15 @@ void GeometryGUI::OnGUIEvent( int id )
   // call method of corresponding GUI library
   if ( library ) {
     library->OnGUIEvent( id, desk );
-    
+
     // Update a list of materials for "Preferences" dialog
     if ( id == GEOMOp::OpMaterialProperties ) {
       LightApp_Preferences* pref = preferences();
       if ( pref ) {
-       Material_ResourceMgr aMatResMgr;
-       setPreferenceProperty( pref->rootItem()->findItem( tr( "PREF_MATERIAL" ), true )->id(),
-                              "strings",
-                              aMatResMgr.materials() );
+        Material_ResourceMgr aMatResMgr;
+        setPreferenceProperty( pref->rootItem()->findItem( tr( "PREF_MATERIAL" ), true )->id(),
+                               "strings",
+                               aMatResMgr.materials() );
       }
     }
   }
@@ -689,11 +689,11 @@ void GeometryGUI::createGeomAction( const int id, const QString& label, const QS
 void GeometryGUI::createOriginAndBaseVectors()
 {
   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
-  if( appStudy ) {
+  if ( appStudy ) {
     _PTR(Study) studyDS = appStudy->studyDS();
-    if( studyDS && !CORBA::is_nil( GetGeomGen() ) ) {
+    if ( studyDS && !CORBA::is_nil( GetGeomGen() ) ) {
       GEOM::GEOM_IBasicOperations_var aBasicOperations = GetGeomGen()->GetIBasicOperations( studyDS->StudyId() );
-      if( !aBasicOperations->_is_nil() ) {
+      if ( !aBasicOperations->_is_nil() ) {
         SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
         double aLength = aResourceMgr->doubleValue( "Geometry", "base_vectors_length", 1.0 );
         GEOM::GEOM_Object_var anOrigin = aBasicOperations->MakePointXYZ( 0.0, 0.0, 0.0 );
@@ -751,6 +751,7 @@ void GeometryGUI::initialize( CAM_Application* app )
   createGeomAction( GEOMOp::OpRevolution,  "REVOLUTION" );
   createGeomAction( GEOMOp::OpFilling,     "FILLING" );
   createGeomAction( GEOMOp::OpPipe,        "PIPE" );
+  createGeomAction( GEOMOp::OpPipePath,    "PIPE_PATH" );
 
   createGeomAction( GEOMOp::OpGroupCreate, "GROUP_CREATE" );
   createGeomAction( GEOMOp::OpGroupEdit,   "GROUP_EDIT" );
@@ -950,6 +951,9 @@ void GeometryGUI::initialize( CAM_Application* app )
   createMenu( GEOMOp::OpRevolution, genId, -1 );
   createMenu( GEOMOp::OpFilling,    genId, -1 );
   createMenu( GEOMOp::OpPipe,       genId, -1 );
+#if OCC_VERSION_LARGE > 0x06050300
+  createMenu( GEOMOp::OpPipePath,   genId, -1 );
+#endif
 
 //   int advId = createMenu( tr( "MEN_ADVANCED" ), newEntId, -1 );
 
@@ -983,9 +987,9 @@ void GeometryGUI::initialize( CAM_Application* app )
   createMenu( GEOMOp::OpShell,    buildId, -1 );
   createMenu( GEOMOp::OpSolid,    buildId, -1 );
   createMenu( GEOMOp::OpCompound, buildId, -1 );
-  
+
   createMenu( separator(),          newEntId, -1 );
-  
+
   createMenu( GEOMOp::OpPictureImport, newEntId, -1 );
 #ifdef WITH_OPENCV
   createMenu( GEOMOp::OpFeatureDetect, newEntId, -1 );
@@ -1110,7 +1114,7 @@ void GeometryGUI::initialize( CAM_Application* app )
 */
 
   // ---- create toolbars --------------------------
-  
+
   int basicTbId = createTool( tr( "TOOL_BASIC" ) );
   createTool( GEOMOp::OpPoint,      basicTbId );
   createTool( GEOMOp::OpLine,       basicTbId );
@@ -1124,11 +1128,11 @@ void GeometryGUI::initialize( CAM_Application* app )
   createTool( GEOMOp::OpPlane,      basicTbId );
   createTool( GEOMOp::OpLCS,        basicTbId );
   createTool( GEOMOp::OpOriginAndVectors, basicTbId );
-  
+
 //   int sketchTbId = createTool( tr( "TOOL_SKETCH" ) );
 //   createTool( GEOMOp::Op2dSketcher,  sketchTbId );
 //   createTool( GEOMOp::Op3dSketcher,  sketchTbId );
-  
+
   int primTbId = createTool( tr( "TOOL_PRIMITIVES" ) );
   createTool( GEOMOp::OpBox,        primTbId );
   createTool( GEOMOp::OpCylinder,   primTbId );
@@ -1138,26 +1142,29 @@ void GeometryGUI::initialize( CAM_Application* app )
   createTool( GEOMOp::OpRectangle,  primTbId );
   createTool( GEOMOp::OpDisk,       primTbId );
   createTool( GEOMOp::OpPipeTShape, primTbId ); //rnc
-  
+
   int blocksTbId = createTool( tr( "TOOL_BLOCKS" ) );
   createTool( GEOMOp::OpDividedDisk, blocksTbId );
   createTool( GEOMOp::OpDividedCylinder, blocksTbId );
-  
+
 //   int advancedTbId = createTool( tr( "TOOL_ADVANCED" ) ); //rnc
 //   createTool( GEOMOp::OpPipeTShape, advancedTbId );
-  
+
   int boolTbId = createTool( tr( "TOOL_BOOLEAN" ) );
   createTool( GEOMOp::OpFuse,       boolTbId );
   createTool( GEOMOp::OpCommon,     boolTbId );
   createTool( GEOMOp::OpCut,        boolTbId );
   createTool( GEOMOp::OpSection,    boolTbId );
-  
-   int genTbId = createTool( tr( "TOOL_GENERATION" ) );
+
+  int genTbId = createTool( tr( "TOOL_GENERATION" ) );
   createTool( GEOMOp::OpPrism,      genTbId );
   createTool( GEOMOp::OpRevolution, genTbId );
   createTool( GEOMOp::OpFilling,    genTbId );
   createTool( GEOMOp::OpPipe,       genTbId );
-  
+#if OCC_VERSION_LARGE > 0x06050300
+  createTool( GEOMOp::OpPipePath,   genTbId );
+#endif
+
   int transTbId = createTool( tr( "TOOL_TRANSFORMATION" ) );
   createTool( GEOMOp::OpTranslate,      transTbId );
   createTool( GEOMOp::OpRotate,         transTbId );
@@ -1169,14 +1176,14 @@ void GeometryGUI::initialize( CAM_Application* app )
   createTool( separator(),              transTbId );
   createTool( GEOMOp::OpMultiTranslate, transTbId );
   createTool( GEOMOp::OpMultiRotate,    transTbId );
-  
+
   int operTbId = createTool( tr( "TOOL_OPERATIONS" ) );
   createTool( GEOMOp::OpExplode,         operTbId );
   createTool( GEOMOp::OpPartition,       operTbId );
   createTool( GEOMOp::OpArchimede,       operTbId );
   createTool( GEOMOp::OpShapesOnShape,   operTbId );
   createTool( GEOMOp::OpSharedShapes,    operTbId );
-  
+
   int featTbId = createTool( tr( "TOOL_FEATURES" ) );
   createTool( GEOMOp::OpFillet1d,        featTbId );
   createTool( GEOMOp::OpFillet2d,        featTbId );
@@ -1184,7 +1191,7 @@ void GeometryGUI::initialize( CAM_Application* app )
   createTool( GEOMOp::OpChamfer,         featTbId );
   createTool( GEOMOp::OpExtrudedBoss,    featTbId );
   createTool( GEOMOp::OpExtrudedCut,     featTbId );
-  
+
   int buildTbId = createTool( tr( "TOOL_BUILD" ) );
   createTool( GEOMOp::OpEdge,     buildTbId );
   createTool( GEOMOp::OpWire,     buildTbId );
@@ -1219,7 +1226,7 @@ void GeometryGUI::initialize( CAM_Application* app )
   #ifdef WITH_OPENCV
     createTool( GEOMOp::OpFeatureDetect,  picturesTbId );
   #endif
-  
+
 //   int advancedTbId = createTool( tr( "TOOL_ADVANCED" ) );
 
   //@@ insert new functions before this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@ do not remove this line @@//
@@ -1261,7 +1268,7 @@ void GeometryGUI::initialize( CAM_Application* app )
   mgr->setRule(action(GEOMOp::OpBringToFront), bringRule, QtxPopupMgr::VisibleRule );
   mgr->setRule(action(GEOMOp::OpBringToFront), "topLevel=true", QtxPopupMgr::ToggleRule );
   mgr->insert( action(GEOMOp::OpClsBringToFront ), -1, -1 ); // clear bring to front
-  mgr->setRule( action(GEOMOp::OpClsBringToFront ), clientOCC, QtxPopupMgr::VisibleRule );  
+  mgr->setRule( action(GEOMOp::OpClsBringToFront ), clientOCC, QtxPopupMgr::VisibleRule );
 #endif
   mgr->insert( separator(), -1, -1 );     // -----------
   dispmodeId = mgr->insert(  tr( "MEN_DISPLAY_MODE" ), -1, -1 ); // display mode menu
@@ -1293,7 +1300,7 @@ void GeometryGUI::initialize( CAM_Application* app )
   mgr->insert( action(  GEOMOp::OpPointMarker ), -1, -1 ); // point marker
   //mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and $typeid in {%1}" ).arg(GEOM_POINT ), QtxPopupMgr::VisibleRule );
   mgr->setRule( action( GEOMOp::OpPointMarker ), QString( "selcount>0 and ( $typeid in {%1} or compoundOfVertices=true ) " ).arg(GEOM::VERTEX).arg(GEOM::COMPOUND), QtxPopupMgr::VisibleRule );
-  mgr->insert( action(  GEOMOp::OpMaterialProperties ), -1, -1 ); // material properties  
+  mgr->insert( action(  GEOMOp::OpMaterialProperties ), -1, -1 ); // material properties
   mgr->setRule( action( GEOMOp::OpMaterialProperties ), clientOCCorVTK_AndSomeVisible + " and ($component={'GEOM'}) and selcount>0 and isVisible", QtxPopupMgr::VisibleRule );
   mgr->insert( action(  GEOMOp::OpSetTexture ), -1, -1 ); // texture
   mgr->setRule( action( GEOMOp::OpSetTexture ), clientOCCorOB_AndSomeVisible + " and ($component={'GEOM'})", QtxPopupMgr::VisibleRule );
@@ -1304,7 +1311,7 @@ void GeometryGUI::initialize( CAM_Application* app )
 
   mgr->insert( action(  GEOMOp::OpIsosWidth ), lineW, -1 ); // isos width
   mgr->setRule( action( GEOMOp::OpIsosWidth ), clientOCCorVTK_AndSomeVisible, QtxPopupMgr::VisibleRule );
-  
+
   mgr->insert( separator(), -1, -1 );     // -----------
   mgr->insert( action(  GEOMOp::OpAutoColor ), -1, -1 ); // auto color
   mgr->setRule( action( GEOMOp::OpAutoColor ), autoColorPrefix + " and isAutoColor=false", QtxPopupMgr::VisibleRule );
@@ -1363,7 +1370,6 @@ void GeometryGUI::initialize( CAM_Application* app )
   mgr->insert( action(  GEOMOp::OpUnpublishObject ), -1, -1 ); // Unpublish object
   mgr->setRule( action( GEOMOp::OpUnpublishObject ), QString("client='ObjectBrowser' and $type in {'Shape' 'Group'} and selcount>0"), QtxPopupMgr::VisibleRule );
 
-
   mgr->insert( action(  GEOMOp::OpPublishObject ), -1, -1 ); // Publish object
   mgr->setRule( action( GEOMOp::OpPublishObject ), QString("client='ObjectBrowser' and isComponent=true"), QtxPopupMgr::VisibleRule );
 
@@ -1372,9 +1378,8 @@ void GeometryGUI::initialize( CAM_Application* app )
 
   mgr->hide( mgr->actionId( action( myEraseAll ) ) );
 
-  
   SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
-  if(resMgr) {
+  if (resMgr) {
     GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)resMgr->integerValue("Geometry", "toplevel_dm", 0));
     QColor c = resMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
     GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
@@ -1399,16 +1404,18 @@ bool GeometryGUI::activateModule( SUIT_Study* study )
 
   // import Python module that manages GEOM plugins (need to be here because SalomePyQt API uses active module)
   PyGILState_STATE gstate = PyGILState_Ensure();
-  PyObject* pluginsmanager=PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
-  if(pluginsmanager==NULL)
+  PyObject* pluginsmanager = PyImport_ImportModuleNoBlock((char*)"salome_pluginsmanager");
+  if (pluginsmanager == NULL)
     PyErr_Print();
-  else
-    {
-      PyObject* result=PyObject_CallMethod( pluginsmanager, (char*)"initialize", (char*)"isss",1,"geom",tr("MEN_NEW_ENTITY").toStdString().c_str(),tr("GEOM_PLUGINS_OTHER").toStdString().c_str());
-      if(result==NULL)
-        PyErr_Print();
-      Py_XDECREF(result);
-    }
+  else {
+    PyObject* result =
+      PyObject_CallMethod(pluginsmanager, (char*)"initialize", (char*)"isss", 1, "geom",
+                          tr("MEN_NEW_ENTITY").toStdString().c_str(),
+                          tr("GEOM_PLUGINS_OTHER").toStdString().c_str());
+    if (result == NULL)
+      PyErr_Print();
+    Py_XDECREF(result);
+  }
   PyGILState_Release(gstate);
   // end of GEOM plugins loading
 
@@ -1466,13 +1473,13 @@ bool GeometryGUI::activateModule( SUIT_Study* study )
 
   // 0020836 (Basic vectors and origin)
   SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr();
-  if( aResourceMgr->booleanValue( "Geometry", "auto_create_base_objects", false ) ) {
+  if ( aResourceMgr->booleanValue( "Geometry", "auto_create_base_objects", false ) ) {
     SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>( application()->activeStudy() );
-    if( appStudy ) {
+    if ( appStudy ) {
       _PTR(Study) studyDS = appStudy->studyDS();
-      if( studyDS ) {
+      if ( studyDS ) {
         _PTR(SComponent) aSComponent = studyDS->FindComponent("GEOM");
-        if( !aSComponent ) // create objects automatically only if there is no GEOM component
+        if ( !aSComponent ) // create objects automatically only if there is no GEOM component
           createOriginAndBaseVectors();
       }
     }
@@ -1481,7 +1488,6 @@ bool GeometryGUI::activateModule( SUIT_Study* study )
   return true;
 }
 
-
 //=======================================================================
 // function : GeometryGUI::deactivateModule()
 // purpose  : Called when GEOM module is deactivated
@@ -1571,7 +1577,7 @@ void GeometryGUI::onViewManagerAdded( SUIT_ViewManager* vm )
              this, SLOT( OnMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) );
     connect( vm, SIGNAL( mouseRelease ( SUIT_ViewWindow*, QMouseEvent* ) ),
              this, SLOT( OnMouseRelease( SUIT_ViewWindow*, QMouseEvent* ) ) );
-    
+
     LightApp_SelectionMgr* sm = getApp()->selectionMgr();
     myOCCSelectors.append( new GEOMGUI_OCCSelector( ((OCCViewer_ViewManager*)vm)->getOCCViewer(), sm ) );
 
@@ -1741,31 +1747,30 @@ void GeometryGUI::createPreferences()
                             LightApp_Preferences::DblSpin, "Geometry", "deflection_coeff" );
 
   int material = addPreference( tr( "PREF_MATERIAL" ), genGroup,
-                                     LightApp_Preferences::Selector,
-                                     "Geometry", "material" );
-  
+                                      LightApp_Preferences::Selector,
+                                      "Geometry", "material" );
+
   const int nb = 4;
   int wd[nb];
   int iter=0;
 
   wd[iter++] = addPreference( tr( "PREF_EDGE_WIDTH" ), genGroup,
-                             LightApp_Preferences::IntSpin, "Geometry", "edge_width" );
+                              LightApp_Preferences::IntSpin, "Geometry", "edge_width" );
 
   wd[iter++] = addPreference( tr( "PREF_ISOLINES_WIDTH" ), genGroup,
-                             LightApp_Preferences::IntSpin, "Geometry", "isolines_width" );
+                              LightApp_Preferences::IntSpin, "Geometry", "isolines_width" );
 
   wd[iter++] = addPreference( tr( "PREF_PREVIEW_EDGE_WIDTH" ), genGroup,
-                                    LightApp_Preferences::IntSpin, "Geometry", "preview_edge_width" );
-  
+                                     LightApp_Preferences::IntSpin, "Geometry", "preview_edge_width" );
+
   wd[iter++] = addPreference( tr( "PREF_MEASURES_LINE_WIDTH" ), genGroup,
-                             LightApp_Preferences::IntSpin, "Geometry", "measures_line_width" );
+                              LightApp_Preferences::IntSpin, "Geometry", "measures_line_width" );
 
-  for(int i = 0; i < nb; i++) {
-    setPreferenceProperty( wd[i], "min", 1 );    
+  for (int i = 0; i < nb; i++) {
+    setPreferenceProperty( wd[i], "min", 1 );
     setPreferenceProperty( wd[i], "max", 5 );
   }
 
-
   // Quantities with individual precision settings
   int precGroup = addPreference( tr( "GEOM_PREF_GROUP_PRECISION" ), tabId );
   setPreferenceProperty( precGroup, "columns", 2 );
@@ -1819,7 +1824,6 @@ void GeometryGUI::createPreferences()
   setPreferenceProperty( dispmode, "strings", aModesList );
   setPreferenceProperty( dispmode, "indexes", anIndexesList );
 
-
   // Set property for top level display mode
   QStringList aTopModesList;
   aTopModesList.append( tr("MEN_SHOW_ADD_WACTOR") );
@@ -1891,7 +1895,6 @@ void GeometryGUI::createPreferences()
   addPreference( tr( "PREF_AUTO_CREATE" ), originGroup,
                  LightApp_Preferences::Bool, "Geometry", "auto_create_base_objects" );
 
-
   int operationsGroup = addPreference( tr( "PREF_GROUP_OPERATIONS" ), tabId );
   setPreferenceProperty( operationsGroup, "columns", 2 );
 
@@ -1906,18 +1909,20 @@ void GeometryGUI::preferencesChanged( const QString& section, const QString& par
     if (param == QString("SettingsGeomStep")) {
       double spin_step = aResourceMgr->doubleValue(section, param, 100.);
       EmitSignalDefaultStepValueChanged(spin_step);
-    } else if(param == QString("toplevel_color")) {
+    }
+    else if (param == QString("toplevel_color")) {
       QColor c = aResourceMgr->colorValue( "Geometry", "toplevel_color", QColor( 170, 85, 0 ) );
       GEOM_AISShape::setTopLevelColor(SalomeApp_Tools::color(c));
-    } else if(param == QString("toplevel_dm")) {
+    }
+    else if (param == QString("toplevel_dm")) {
       GEOM_AISShape::setTopLevelDisplayMode((GEOM_AISShape::TopLevelDispMode)aResourceMgr->integerValue("Geometry", "toplevel_dm", 0));
     }
-  } 
+  }
 }
 
 LightApp_Displayer* GeometryGUI::displayer()
 {
-  if( !myDisplayer )
+  if ( !myDisplayer )
     myDisplayer = new GEOM_Displayer( dynamic_cast<SalomeApp_Study*>( getApp()->activeStudy() ) );
   return myDisplayer;
 }
@@ -1926,6 +1931,7 @@ void GeometryGUI::setLocalSelectionMode(const int mode)
 {
   myLocalSelectionMode = mode;
 }
+
 int GeometryGUI::getLocalSelectionMode() const
 {
   return myLocalSelectionMode;
@@ -1986,7 +1992,7 @@ void GeometryGUI::storeVisualParameters (int savePoint)
         std::string entry = ip->encodeEntry(o_it.key().toLatin1().data(), componentName);
 
         _PTR(GenericAttribute) anAttr;
-        if!obj->FindAttribute(anAttr, "AttributeIOR"))
+        if (!obj->FindAttribute(anAttr, "AttributeIOR"))
           continue;
 
         std::string param,occParam = vType.toLatin1().data();
@@ -1994,17 +2000,17 @@ void GeometryGUI::storeVisualParameters (int savePoint)
         occParam += QString::number(aMgrId).toLatin1().data();
         occParam += NAME_SEPARATOR;
 
-        if(aProps.contains(VISIBILITY_PROP)) {
+        if (aProps.contains(VISIBILITY_PROP)) {
           param = occParam + VISIBILITY_PROP;
           ip->setParameter(entry, param, aProps.value(VISIBILITY_PROP).toInt() == 1 ? "On" : "Off");
         }
 
-        if(aProps.contains(DISPLAY_MODE_PROP)) {
+        if (aProps.contains(DISPLAY_MODE_PROP)) {
           param = occParam + DISPLAY_MODE_PROP;
           ip->setParameter(entry, param, QString::number(aProps.value(DISPLAY_MODE_PROP).toInt()).toLatin1().data());
         }
 
-        if(aProps.contains(COLOR_PROP)) {
+        if (aProps.contains(COLOR_PROP)) {
           QColor c = aProps.value(COLOR_PROP).value<QColor>();
           QString colorStr = QString::number(c.red()/255.);
           colorStr += DIGIT_SEPARATOR; colorStr += QString::number(c.green()/255.);
@@ -2013,59 +2019,59 @@ void GeometryGUI::storeVisualParameters (int savePoint)
           ip->setParameter(entry, param, colorStr.toLatin1().data());
         }
 
-        if(vType == SVTK_Viewer::Type()) {
-          if(aProps.contains(OPACITY_PROP)) {
+        if (vType == SVTK_Viewer::Type()) {
+          if (aProps.contains(OPACITY_PROP)) {
             param = occParam + OPACITY_PROP;
             ip->setParameter(entry, param, QString::number(1. - aProps.value(TRANSPARENCY_PROP).toDouble()).toLatin1().data());
           }
         } else if (vType == SOCC_Viewer::Type()) {
-          if(aProps.contains(TRANSPARENCY_PROP)) {
+          if (aProps.contains(TRANSPARENCY_PROP)) {
             param = occParam + TRANSPARENCY_PROP;
             ip->setParameter(entry, param, QString::number(aProps.value(TRANSPARENCY_PROP).toDouble()).toLatin1().data());
           }
 
-          if(aProps.contains(TOP_LEVEL_PROP)) {
+          if (aProps.contains(TOP_LEVEL_PROP)) {
             param = occParam + TOP_LEVEL_PROP;
-           Standard_Boolean val = aProps.value(TOP_LEVEL_PROP).value<Standard_Boolean>();
-           if (val == Standard_True) 
-             ip->setParameter(entry, param, "1");
-          }      
+            Standard_Boolean val = aProps.value(TOP_LEVEL_PROP).value<Standard_Boolean>();
+            if (val == Standard_True)
+              ip->setParameter(entry, param, "1");
+          }
         }
 
-        if(aProps.contains(ISOS_PROP)) {
+        if (aProps.contains(ISOS_PROP)) {
           param = occParam + ISOS_PROP;
           ip->setParameter(entry, param, aProps.value(ISOS_PROP).toString().toLatin1().data());
         }
 
-        if(aProps.contains(VECTOR_MODE_PROP)) {
+        if (aProps.contains(VECTOR_MODE_PROP)) {
           param = occParam + VECTOR_MODE_PROP;
           ip->setParameter(entry, param, QString::number(aProps.value(VECTOR_MODE_PROP).toInt()).toLatin1().data());
         }
 
-        if(aProps.contains(DEFLECTION_COEFF_PROP)) {
+        if (aProps.contains(DEFLECTION_COEFF_PROP)) {
           param = occParam + DEFLECTION_COEFF_PROP;
           ip->setParameter(entry, param, QString::number(aProps.value(DEFLECTION_COEFF_PROP).toDouble()).toLatin1().data());
         }
 
         //Marker type of the vertex - ONLY for the "Vertex" and "Compound of the Vertex"
-        if(aProps.contains(MARKER_TYPE_PROP)) {
+        if (aProps.contains(MARKER_TYPE_PROP)) {
           param = occParam + MARKER_TYPE_PROP;
           ip->setParameter(entry, param, aProps.value(MARKER_TYPE_PROP).toString().toLatin1().data());
         }
 
-       if(aProps.contains(MATERIAL_PROP)) {
+        if (aProps.contains(MATERIAL_PROP)) {
           param = occParam + MATERIAL_PROP;
           ip->setParameter(entry, param, aProps.value(MATERIAL_PROP).toString().toLatin1().data());
         }
 
-       if(aProps.contains( EDGE_WIDTH_PROP )) {
+        if (aProps.contains(EDGE_WIDTH_PROP)) {
              param = occParam + EDGE_WIDTH_PROP;
-           ip->setParameter(entry, param, aProps.value(EDGE_WIDTH_PROP).toString().toLatin1().data());                              
+           ip->setParameter(entry, param, aProps.value(EDGE_WIDTH_PROP).toString().toLatin1().data());
         }
-       
-       if(aProps.contains( ISOS_WIDTH_PROP )) {
-         param = occParam + ISOS_WIDTH_PROP;
-         ip->setParameter(entry, param, aProps.value(ISOS_WIDTH_PROP).toString().toLatin1().data());
+
+        if (aProps.contains(ISOS_WIDTH_PROP)) {
+          param = occParam + ISOS_WIDTH_PROP;
+          ip->setParameter(entry, param, aProps.value(ISOS_WIDTH_PROP).toString().toLatin1().data());
         }
       } // object iterator
     } // for (views)
@@ -2141,52 +2147,42 @@ void GeometryGUI::restoreVisualParameters (int savePoint)
       if (!ok) // bad conversion of view index to integer
         continue;
 
-      if((viewIndex + 1) > aListOfMap.count()) {
+      if ((viewIndex + 1) > aListOfMap.count()) {
         aListOfMap.resize(viewIndex + 1);
       }
 
       QString val((*valuesIt).c_str());
-      if(paramNameStr == VISIBILITY_PROP){
+      if (paramNameStr == VISIBILITY_PROP) {
         aListOfMap[viewIndex].insert(VISIBILITY_PROP, val == "On" ? 1 : 0);
-
-      } else if(paramNameStr == OPACITY_PROP) {
+      } else if (paramNameStr == OPACITY_PROP) {
         aListOfMap[viewIndex].insert(TRANSPARENCY_PROP, 1. - val.toDouble());
-
-      } else if(paramNameStr == TRANSPARENCY_PROP) {
+      } else if (paramNameStr == TRANSPARENCY_PROP) {
         aListOfMap[viewIndex].insert( TRANSPARENCY_PROP, val.toDouble() );
-
-      }        else if(paramNameStr == TOP_LEVEL_PROP) {
-         aListOfMap[viewIndex].insert( TRANSPARENCY_PROP, val == "1" ? Standard_True : Standard_False );
-         
-      } else if(paramNameStr == DISPLAY_MODE_PROP) {
+      } else if (paramNameStr == TOP_LEVEL_PROP) {
+          aListOfMap[viewIndex].insert( TRANSPARENCY_PROP, val == "1" ? Standard_True : Standard_False );
+      } else if (paramNameStr == DISPLAY_MODE_PROP) {
         aListOfMap[viewIndex].insert( DISPLAY_MODE_PROP, val.toInt());
-
-      } else if(paramNameStr == ISOS_PROP) {
+      } else if (paramNameStr == ISOS_PROP) {
         aListOfMap[viewIndex].insert( ISOS_PROP, val);
-
-      } else if(paramNameStr == COLOR_PROP) {
+      } else if (paramNameStr == COLOR_PROP) {
         QStringList rgb = val.split(DIGIT_SEPARATOR);
-        if(rgb.count() == 3) {
+        if (rgb.count() == 3) {
           QColor c(int(rgb[0].toDouble()*255), int(rgb[1].toDouble()*255), int(rgb[2].toDouble()*255));
           aListOfMap[viewIndex].insert( COLOR_PROP, c);
         }
-      } else if(paramNameStr == VECTOR_MODE_PROP) {
+      } else if (paramNameStr == VECTOR_MODE_PROP) {
         aListOfMap[viewIndex].insert( VECTOR_MODE_PROP, val.toInt());
-
-      }  else if(paramNameStr == DEFLECTION_COEFF_PROP) {
+      } else if (paramNameStr == DEFLECTION_COEFF_PROP) {
         aListOfMap[viewIndex].insert( DEFLECTION_COEFF_PROP, val.toDouble());
-      }  else if(paramNameStr == MARKER_TYPE_PROP) {
+      } else if (paramNameStr == MARKER_TYPE_PROP) {
         aListOfMap[viewIndex].insert( MARKER_TYPE_PROP, val);
-      } else if(paramNameStr == MATERIAL_PROP) {
+      } else if (paramNameStr == MATERIAL_PROP) {
         aListOfMap[viewIndex].insert( MATERIAL_PROP, val);
-      }  else if(paramNameStr == EDGE_WIDTH_PROP) {
-       aListOfMap[viewIndex].insert( EDGE_WIDTH_PROP , val);
-      }  else if(paramNameStr == ISOS_WIDTH_PROP) {
-       aListOfMap[viewIndex].insert( ISOS_WIDTH_PROP , val);
+      } else if (paramNameStr == EDGE_WIDTH_PROP) {
+        aListOfMap[viewIndex].insert( EDGE_WIDTH_PROP, val);
+      } else if (paramNameStr == ISOS_WIDTH_PROP) {
+        aListOfMap[viewIndex].insert( ISOS_WIDTH_PROP, val);
       }
-
-                   
-
     } // for names/parameters iterator
 
     QList<SUIT_ViewManager*> lst = getApp()->viewManagers();
@@ -2202,7 +2198,6 @@ void GeometryGUI::restoreVisualParameters (int savePoint)
         displayer()->Display(entry, true, dynamic_cast<SALOME_View*>(vmodel));
       }
     }
-
   } // for entries iterator
 
   // update all VTK and OCC views
@@ -2243,7 +2238,7 @@ void GeometryGUI::onViewAboutToShow()
 /*!
   \brief Return action by id
   \param id identifier of the action
-  \return action 
+  \return action
 */
 QAction* GeometryGUI::getAction(const int id) {
   return action(id);
@@ -2261,32 +2256,32 @@ QAction* GeometryGUI::getAction(const int id) {
 bool GeometryGUI::renameAllowed( const QString& entry) const {
 
   SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication() );
-  SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0; 
+  SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
   SalomeApp_DataObject* obj = appStudy ? dynamic_cast<SalomeApp_DataObject*>(appStudy->findObjectByEntry(entry)) : 0;
-  
+
   return (app && appStudy && obj && !appStudy->isComponent(entry) && !obj->isReference());
 }
 
-
 /*!
   Rename object by entry.
   \param entry entry of the object
   \param name new name of the object
   \brief Return \c true if rename operation finished successfully, \c false otherwise.
 */
-bool GeometryGUI::renameObject( const QString& entry, const QString& name) {
-  
+bool GeometryGUI::renameObject( const QString& entry, const QString& name)
+{
   bool result = false;
-  
-  SalomeApp_Application* app = dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication());
+
+  SalomeApp_Application* app =
+    dynamic_cast< SalomeApp_Application* >( SUIT_Session::session()->activeApplication());
   SalomeApp_Study* appStudy = app ? dynamic_cast<SalomeApp_Study*>( app->activeStudy() ) : 0;
-  
-  if(!appStudy)
+
+  if (!appStudy)
     return result;
-  
+
   _PTR(Study) aStudy = appStudy->studyDS();
-  
-  if(!aStudy)
+
+  if (!aStudy)
     return result;
 
   bool aLocked = (_PTR(AttributeStudyProperties)(appStudy->studyDS()->GetProperties()))->IsLocked();
@@ -2311,4 +2306,3 @@ bool GeometryGUI::renameObject( const QString& entry, const QString& name) {
   }
   return result;
 }
-
index 75e45e43f0614b06e3b3cc2b403fda987bd9171e..e17172e490f00ba6660175118f1dda070d238d08 100644 (file)
@@ -98,6 +98,7 @@ namespace GEOMOp {
     OpRevolution          = 3201,   // MENU NEW ENTITY - GENERATION - REVOLUTION
     OpFilling             = 3202,   // MENU NEW ENTITY - GENERATION - FILLING
     OpPipe                = 3203,   // MENU NEW ENTITY - GENERATION - EXTRUSION ALONG PATH
+    OpPipePath            = 3204,   // MENU NEW ENTITY - GENERATION - RESTORE PATH
     // EntityGUI -------------------//--------------------------------
     Op2dSketcher          = 3300,   // MENU NEW ENTITY - SKETCHER
     Op3dSketcher          = 3301,   // MENU NEW ENTITY - 3D SKETCHER
index 884da5cb13cbd5a0c5d8614997519af8d7d8e6dd..f8f02247d73195add7f31cd40fa3d78b9e808d14 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 )
@@ -54,6 +53,7 @@
 #include <GEOMImpl_CylinderDriver.hxx>
 #include <GEOMImpl_PrismDriver.hxx>
 #include <GEOMImpl_PipeDriver.hxx>
+#include <GEOMImpl_PipePathDriver.hxx>
 #include <GEOMImpl_ThruSectionsDriver.hxx>
 #include <GEOMImpl_RevolutionDriver.hxx>
 #include <GEOMImpl_ShapeDriver.hxx>
@@ -122,6 +122,7 @@ GEOMImpl_Gen::GEOMImpl_Gen()
    TFunction_DriverTable::Get()->AddDriver(GEOMImpl_CylinderDriver::GetID(), new GEOMImpl_CylinderDriver());
    TFunction_DriverTable::Get()->AddDriver(GEOMImpl_PrismDriver::GetID(), new GEOMImpl_PrismDriver());
    TFunction_DriverTable::Get()->AddDriver(GEOMImpl_PipeDriver::GetID(), new GEOMImpl_PipeDriver());
+   TFunction_DriverTable::Get()->AddDriver(GEOMImpl_PipePathDriver::GetID(), new GEOMImpl_PipePathDriver());
    TFunction_DriverTable::Get()->AddDriver(GEOMImpl_ThruSectionsDriver::GetID(), new GEOMImpl_ThruSectionsDriver());
    TFunction_DriverTable::Get()->AddDriver(GEOMImpl_RevolutionDriver::GetID(), new GEOMImpl_RevolutionDriver());
    TFunction_DriverTable::Get()->AddDriver(GEOMImpl_SphereDriver::GetID(), new GEOMImpl_SphereDriver());
index dc2ab3599da8ef0093c69ea791e77131b087d851..b4103f9fa5576a2846c924159ca47508cbeabe35 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>
 
@@ -49,6 +48,7 @@
 #include <GEOMImpl_TorusDriver.hxx>
 #include <GEOMImpl_PrismDriver.hxx>
 #include <GEOMImpl_PipeDriver.hxx>
+#include <GEOMImpl_PipePathDriver.hxx>
 #include <GEOMImpl_RevolutionDriver.hxx>
 #include <GEOMImpl_ShapeDriver.hxx>
 #include <GEOMImpl_FillingDriver.hxx>
@@ -69,6 +69,7 @@
 #include <GEOMImpl_IPipeDiffSect.hxx>
 #include <GEOMImpl_IPipeShellSect.hxx>
 #include <GEOMImpl_IPipeBiNormal.hxx>
+#include <GEOMImpl_IPipePath.hxx>
 
 #include <Precision.hxx>
 
@@ -2176,7 +2177,6 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeShellsWithoutPath(
 
 }
 
-
 //=============================================================================
 /*!
  *  MakePipeBiNormalAlongVector
@@ -2236,3 +2236,173 @@ Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::MakePipeBiNormalAlongVector (Han
   SetErrorCode(OK);
   return aPipe;
 }
+
+//=============================================================================
+/*!
+ *  RestorePath
+ */
+//=============================================================================
+Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::RestorePath (Handle(GEOM_Object) theShape,
+                                                             Handle(GEOM_Object) theBase1,
+                                                             Handle(GEOM_Object) theBase2)
+{
+  SetErrorCode(KO);
+
+  if (theShape.IsNull() || theBase1.IsNull() || theBase2.IsNull()) return NULL;
+
+  // Add a new Path object
+  Handle(GEOM_Object) aPath = GetEngine()->AddObject(GetDocID(), GEOM_PIPE_PATH);
+
+  // Add a new Path function
+  Handle(GEOM_Function) aFunction =
+    aPath->AddFunction(GEOMImpl_PipePathDriver::GetID(), PIPE_PATH_TWO_BASES);
+  if (aFunction.IsNull()) return NULL;
+
+  // Check if the function is set correctly
+  if (aFunction->GetDriverGUID() != GEOMImpl_PipePathDriver::GetID()) return NULL;
+
+  GEOMImpl_IPipePath aCI (aFunction);
+
+  Handle(GEOM_Function) aRefShape = theShape->GetLastFunction();
+  Handle(GEOM_Function) aRefBase1 = theBase1->GetLastFunction();
+  Handle(GEOM_Function) aRefBase2 = theBase2->GetLastFunction();
+
+  if (aRefShape.IsNull() || aRefBase1.IsNull() || aRefBase2.IsNull()) return NULL;
+
+  aCI.SetShape(aRefShape);
+  aCI.SetBase1(aRefBase1);
+  aCI.SetBase2(aRefBase2);
+
+  // Compute the Path value
+  try {
+#if OCC_VERSION_LARGE > 0x06010000
+    OCC_CATCH_SIGNALS;
+#endif
+    if (!GetSolver()->ComputeFunction(aFunction)) {
+      SetErrorCode("PipePath driver failed");
+      return NULL;
+    }
+  }
+  catch (Standard_Failure) {
+    Handle(Standard_Failure) aFail = Standard_Failure::Caught();
+    SetErrorCode(aFail->GetMessageString());
+    return NULL;
+  }
+
+  // Make a Python command
+  GEOM::TPythonDump(aFunction) << aPath << " = geompy.RestorePath("
+    << theShape << ", " << theBase1 << ", " << theBase2 << ")";
+
+  SetErrorCode(OK);
+  return aPath;
+}
+
+//=============================================================================
+/*!
+ *  RestorePath
+ */
+//=============================================================================
+Handle(GEOM_Object) GEOMImpl_I3DPrimOperations::RestorePath
+                         (Handle(GEOM_Object) theShape,
+                          const Handle(TColStd_HSequenceOfTransient)& theBase1,
+                          const Handle(TColStd_HSequenceOfTransient)& theBase2)
+{
+  SetErrorCode(KO);
+
+  if (theShape.IsNull() || theBase1.IsNull() || theBase2.IsNull()) return NULL;
+
+  Standard_Integer nbBases1 = theBase1->Length();
+  Standard_Integer nbBases2 = theBase2->Length();
+
+  if (!nbBases1 || !nbBases2)
+    return NULL;
+
+  // Add a new Path object
+  Handle(GEOM_Object) aPath = GetEngine()->AddObject(GetDocID(), GEOM_PIPE_PATH);
+
+  // Add a new Path function
+  Handle(GEOM_Function) aFunction =
+    aPath->AddFunction(GEOMImpl_PipePathDriver::GetID(), PIPE_PATH_TWO_SEQS);
+  if (aFunction.IsNull()) return NULL;
+
+  // Check if the function is set correctly
+  if (aFunction->GetDriverGUID() != GEOMImpl_PipePathDriver::GetID()) return NULL;
+
+  GEOMImpl_IPipePath aCI (aFunction);
+
+  Handle(GEOM_Function) aRefShape = theShape->GetLastFunction();
+  if (aRefShape.IsNull()) return NULL;
+
+  Handle(TColStd_HSequenceOfTransient) aSeqBases1 = new TColStd_HSequenceOfTransient;
+  Handle(TColStd_HSequenceOfTransient) aSeqBases2 = new TColStd_HSequenceOfTransient;
+
+  Standard_Integer i;
+  for (i = 1; i <= nbBases1; i++) {
+    Handle(Standard_Transient) anItem = theBase1->Value(i);
+    if (!anItem.IsNull()) {
+      Handle(GEOM_Object) aBase = Handle(GEOM_Object)::DownCast(anItem);
+      if (!aBase.IsNull()) {
+        Handle(GEOM_Function) aRefBase = aBase->GetLastFunction();
+        if (!aRefBase.IsNull())
+          aSeqBases1->Append(aRefBase);
+      }
+    }
+  }
+  for (i = 1; i <= nbBases2; i++) {
+    Handle(Standard_Transient) anItem = theBase2->Value(i);
+    if (!anItem.IsNull()) {
+      Handle(GEOM_Object) aBase = Handle(GEOM_Object)::DownCast(anItem);
+      if (!aBase.IsNull()) {
+        Handle(GEOM_Function) aRefBase = aBase->GetLastFunction();
+        if (!aRefBase.IsNull())
+          aSeqBases2->Append(aRefBase);
+      }
+    }
+  }
+  if (!aSeqBases1->Length() || !aSeqBases2->Length()) return NULL;
+
+  aCI.SetShape(aRefShape);
+  aCI.SetBaseSeq1(aSeqBases1);
+  aCI.SetBaseSeq2(aSeqBases2);
+
+  // Compute the Path value
+  try {
+#if OCC_VERSION_LARGE > 0x06010000
+    OCC_CATCH_SIGNALS;
+#endif
+    if (!GetSolver()->ComputeFunction(aFunction)) {
+      SetErrorCode("PipePath driver failed");
+      return NULL;
+    }
+  }
+  catch (Standard_Failure) {
+    Handle(Standard_Failure) aFail = Standard_Failure::Caught();
+    SetErrorCode(aFail->GetMessageString());
+    return NULL;
+  }
+
+  // Make a Python command
+  GEOM::TPythonDump pyDump (aFunction);
+  pyDump << aPath << " = geompy.RestorePathEdges(" << theShape << ", [";
+  for (i = 1; i <= nbBases1; i++) {
+    Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theBase1->Value(i));
+    if (!anObj.IsNull()) {
+      pyDump << anObj;
+      if (i < nbBases1)
+        pyDump << ", ";
+    }
+  }
+  pyDump<< "], [";
+  for (i = 1; i <= nbBases2; i++) {
+    Handle(GEOM_Object) anObj = Handle(GEOM_Object)::DownCast(theBase2->Value(i));
+    if (!anObj.IsNull()) {
+      pyDump << anObj;
+      if (i < nbBases2)
+        pyDump << ", ";
+    }
+  }
+  pyDump << "])";
+
+  SetErrorCode(OK);
+  return aPath;
+}
index c567d03339d7391cb395402d7b5b1ab769c25c0f..6cd2dd25db152fc1a0da69e8b9928b8b43536c06 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_I3DPrimOperations_HXX_
 #define _GEOMImpl_I3DPrimOperations_HXX_
@@ -131,14 +130,21 @@ class GEOMImpl_I3DPrimOperations : public GEOM_IOperations {
                 bool theWithContact,
                 bool theWithCorrections);
 
-  Standard_EXPORT Handle(GEOM_Object) MakePipeShellsWithoutPath(
-                const Handle(TColStd_HSequenceOfTransient)& theBases,
-                const Handle(TColStd_HSequenceOfTransient)& theLocations);
+  Standard_EXPORT Handle(GEOM_Object) MakePipeShellsWithoutPath
+                (const Handle(TColStd_HSequenceOfTransient)& theBases,
+                 const Handle(TColStd_HSequenceOfTransient)& theLocations);
 
   Standard_EXPORT Handle(GEOM_Object) MakePipeBiNormalAlongVector (Handle(GEOM_Object) theBase,
                                                                    Handle(GEOM_Object) thePath,
                                                                    Handle(GEOM_Object) theVec);
 
+  Standard_EXPORT Handle(GEOM_Object) RestorePath (Handle(GEOM_Object) theShape,
+                                                   Handle(GEOM_Object) theBase1,
+                                                   Handle(GEOM_Object) theBase2);
+
+  Standard_EXPORT Handle(GEOM_Object) RestorePath (Handle(GEOM_Object) theShape,
+                                                   const Handle(TColStd_HSequenceOfTransient)& theBase1,
+                                                   const Handle(TColStd_HSequenceOfTransient)& theBase2);
 };
 
 #endif
diff --git a/src/GEOMImpl/GEOMImpl_IPipePath.hxx b/src/GEOMImpl/GEOMImpl_IPipePath.hxx
new file mode 100644 (file)
index 0000000..028ab2f
--- /dev/null
@@ -0,0 +1,61 @@
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// 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
+
+// NOTE: This is an interface to the function RestorePath.
+
+#ifndef _GEOMImpl_IPIPEPATH_HXX_
+#define _GEOMImpl_IPIPEPATH_HXX_
+
+#include "GEOM_Function.hxx"
+
+class GEOMImpl_IPipePath
+{
+ public:
+
+  enum {
+    PIPE_PATH_SHAPE = 1,
+    PIPE_PATH_BASE1 = 2,
+    PIPE_PATH_BASE2 = 3,
+    PIPE_PATH_SEQ1  = 4,
+    PIPE_PATH_SEQ2  = 5
+  };
+
+  GEOMImpl_IPipePath (Handle(GEOM_Function)& theFunction): _func(theFunction) {}
+  
+  void SetShape (Handle(GEOM_Function) theShape) { _func->SetReference(PIPE_PATH_SHAPE, theShape); }
+  void SetBase1 (Handle(GEOM_Function) theBase1) { _func->SetReference(PIPE_PATH_BASE1, theBase1); }
+  void SetBase2 (Handle(GEOM_Function) theBase2) { _func->SetReference(PIPE_PATH_BASE2, theBase2); }
+  void SetBaseSeq1 (const Handle(TColStd_HSequenceOfTransient)& theBase1)
+                                              { _func->SetReferenceList(PIPE_PATH_SEQ1, theBase1); }
+  void SetBaseSeq2 (const Handle(TColStd_HSequenceOfTransient)& theBase2)
+                                              { _func->SetReferenceList(PIPE_PATH_SEQ2, theBase2); }
+
+  Handle(GEOM_Function) GetShape() { return _func->GetReference(PIPE_PATH_SHAPE); }
+  Handle(GEOM_Function) GetBase1() { return _func->GetReference(PIPE_PATH_BASE1); }
+  Handle(GEOM_Function) GetBase2() { return _func->GetReference(PIPE_PATH_BASE2); }
+  Handle(TColStd_HSequenceOfTransient) GetBaseSeq1 ()
+                                   { return _func->GetReferenceList(PIPE_PATH_SEQ1); }
+  Handle(TColStd_HSequenceOfTransient) GetBaseSeq2 ()
+                                   { return _func->GetReferenceList(PIPE_PATH_SEQ2); }
+
+ protected:
+
+  Handle(GEOM_Function) _func;
+};
+
+#endif
index 21475ee427f61ef7124d705f724cfcb134cd73cd..400c2a03c31b3c54d9bd217b9e5164e5c4c8facc 100644 (file)
@@ -28,6 +28,7 @@
 #include <GEOMImpl_IPipeShellSect.hxx>
 #include <GEOMImpl_IPipeBiNormal.hxx>
 #include <GEOMImpl_IPipe.hxx>
+#include <GEOMImpl_IPipePath.hxx>
 #include <GEOMImpl_GlueDriver.hxx>
 #include <GEOMImpl_Types.hxx>
 #include <GEOM_Function.hxx>
 
 #include <BRep_Tool.hxx>
 #include <BRep_Builder.hxx>
+#include <BRepBuilderAPI_Copy.hxx>
+#include <BRepBuilderAPI_MakeFace.hxx>
 #include <BRepBuilderAPI_MakeWire.hxx>
 #include <BRepBuilderAPI_Sewing.hxx>
 #include <BRepCheck_Analyzer.hxx>
+#include <BRepGProp.hxx>
 #include <BRepOffsetAPI_MakePipe.hxx>
 #include <BRepOffsetAPI_MakePipeShell.hxx>
-#include <GProp_GProps.hxx>
-#include <BRepGProp.hxx>
-#include <BRepBuilderAPI_MakeFace.hxx>
-#include <BRepBuilderAPI_Copy.hxx>
 
 #include <TopAbs.hxx>
 #include <TopExp.hxx>
@@ -68,6 +68,8 @@
 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
 #include <TopTools_ListIteratorOfListOfShape.hxx>
 
+#include <GProp_GProps.hxx>
+
 #include <GeomAPI_ProjectPointOnCurve.hxx>
 #include <GeomAPI_Interpolate.hxx>
 #include <Geom_TrimmedCurve.hxx>
@@ -88,6 +90,7 @@
 #include <TColStd_HSequenceOfTransient.hxx>
 
 #include <Precision.hxx>
+
 #include <Standard_NullObject.hxx>
 #include <Standard_TypeMismatch.hxx>
 #include <Standard_ConstructionError.hxx>
 //=======================================================================
 const Standard_GUID& GEOMImpl_PipeDriver::GetID()
 {
-  static Standard_GUID aPipeDriver("FF1BBB19-5D14-4df2-980B-3A668264EA16");
+  static Standard_GUID aPipeDriver ("FF1BBB19-5D14-4df2-980B-3A668264EA16");
   return aPipeDriver;
 }
 
@@ -2277,23 +2280,23 @@ static TopoDS_Shape CreatePipeBiNormalAlongVector(const TopoDS_Wire& aWirePath,
 //function : Execute
 //purpose  :
 //=======================================================================
-Standard_Integer GEOMImpl_PipeDriver::Execute(TFunction_Logbook& log) const
+Standard_Integer GEOMImpl_PipeDriver::Execute (TFunction_Logbook& log) const
 {
-  //cout<<"PipeDriver::Execute"<<endl;
   if (Label().IsNull()) return 0;
   Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label());
-  GEOMImpl_IPipe* aCI= 0;
   Standard_Integer aType = aFunction->GetType();
+
+  GEOMImpl_IPipe* aCI = 0;
   if (aType == PIPE_BASE_PATH)
-    aCI = new GEOMImpl_IPipe(aFunction);
+    aCI = new GEOMImpl_IPipe (aFunction);
   else if (aType == PIPE_DIFFERENT_SECTIONS)
-    aCI = new GEOMImpl_IPipeDiffSect(aFunction);
+    aCI = new GEOMImpl_IPipeDiffSect (aFunction);
   else if (aType == PIPE_SHELL_SECTIONS)
-    aCI = new GEOMImpl_IPipeShellSect(aFunction);
+    aCI = new GEOMImpl_IPipeShellSect (aFunction);
   else if (aType == PIPE_SHELLS_WITHOUT_PATH)
-    aCI = new GEOMImpl_IPipeShellSect(aFunction);
+    aCI = new GEOMImpl_IPipeShellSect (aFunction);
   else if (aType == PIPE_BI_NORMAL_ALONG_VECTOR)
-    aCI = new GEOMImpl_IPipeBiNormal(aFunction);
+    aCI = new GEOMImpl_IPipeBiNormal (aFunction);
   else
     return 0;
 
diff --git a/src/GEOMImpl/GEOMImpl_PipePathDriver.cxx b/src/GEOMImpl/GEOMImpl_PipePathDriver.cxx
new file mode 100644 (file)
index 0000000..5acf28f
--- /dev/null
@@ -0,0 +1,242 @@
+// 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
+
+#include <Standard_Stream.hxx>
+
+#include <Basics_OCCTVersion.hxx>
+
+#include <GEOMImpl_PipePathDriver.hxx>
+
+#include <GEOMImpl_IShapesOperations.hxx>
+#include <GEOMImpl_ShapeDriver.hxx>
+#include <GEOMImpl_IPipePath.hxx>
+#include <GEOMImpl_Types.hxx>
+#include <GEOM_Function.hxx>
+
+#include <ShapeAnalysis_FreeBounds.hxx>
+#include <ShapeAnalysis_Edge.hxx>
+#include <ShapeFix_Face.hxx>
+#include <ShapeFix_Shell.hxx>
+#include <ShapeFix_Shape.hxx>
+#include <ShapeFix_ShapeTolerance.hxx>
+
+#include <BRep_Tool.hxx>
+#include <BRep_Builder.hxx>
+#include <BRepBuilderAPI_Copy.hxx>
+#include <BRepBuilderAPI_MakeFace.hxx>
+#include <BRepBuilderAPI_MakeWire.hxx>
+#include <BRepBuilderAPI_Sewing.hxx>
+#include <BRepCheck_Analyzer.hxx>
+#include <BRepGProp.hxx>
+#include <BRepOffsetAPI_MakePipe.hxx>
+#include <BRepOffsetAPI_MakePipeShell.hxx>
+
+#if OCC_VERSION_LARGE > 0x06050300
+#include <BRepOffsetAPI_MiddlePath.hxx>
+#endif
+
+#include <TopAbs.hxx>
+#include <TopExp.hxx>
+#include <TopExp_Explorer.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Wire.hxx>
+#include <TopoDS_Edge.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopoDS_Solid.hxx>
+#include <TopoDS_Shell.hxx>
+#include <TopoDS_Face.hxx>
+#include <TopoDS_Compound.hxx>
+#include <TopTools_SequenceOfShape.hxx>
+#include <TopTools_HSequenceOfShape.hxx>
+#include <TopTools_IndexedDataMapOfShapeShape.hxx>
+#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
+#include <TopTools_ListIteratorOfListOfShape.hxx>
+
+#include <GProp_GProps.hxx>
+
+#include <GeomAPI_ProjectPointOnCurve.hxx>
+#include <GeomAPI_Interpolate.hxx>
+#include <Geom_TrimmedCurve.hxx>
+#include <Geom_Plane.hxx>
+#include <Geom_RectangularTrimmedSurface.hxx>
+#include <Geom_BezierSurface.hxx>
+#include <Geom_Line.hxx>
+#include <Geom_Conic.hxx>
+#include <Geom_BSplineCurve.hxx>
+#include <Geom_BSplineSurface.hxx>
+#include <GeomFill_BSplineCurves.hxx>
+#include <GeomConvert_ApproxCurve.hxx>
+#include <GeomConvert.hxx>
+
+#include <TColgp_SequenceOfPnt.hxx>
+#include <TColgp_HArray1OfPnt.hxx>
+#include <TColgp_Array2OfPnt.hxx>
+#include <TColStd_HSequenceOfTransient.hxx>
+
+#include <Precision.hxx>
+
+#include <Standard_NullObject.hxx>
+#include <Standard_TypeMismatch.hxx>
+#include <Standard_ConstructionError.hxx>
+
+#include "utilities.h"
+
+//=======================================================================
+//function : GetID
+//purpose  :
+//=======================================================================
+const Standard_GUID& GEOMImpl_PipePathDriver::GetID()
+{
+  static Standard_GUID aPipePathDriver ("FF1BBB19-5D14-4df2-980B-3A668264EA17");
+  return aPipePathDriver;
+}
+
+//=======================================================================
+//function : GEOMImpl_PipePathDriver
+//purpose  :
+//=======================================================================
+GEOMImpl_PipePathDriver::GEOMImpl_PipePathDriver()
+{
+}
+
+//=======================================================================
+//function : Execute
+//purpose  :
+//=======================================================================
+Standard_Integer GEOMImpl_PipePathDriver::Execute (TFunction_Logbook& log) const
+{
+  if (Label().IsNull()) return 0;
+  Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label());
+  Standard_Integer aType = aFunction->GetType();
+
+  TopoDS_Shape aRes;
+
+  // RestorePath
+  if (aType == PIPE_PATH_TWO_BASES) {
+    GEOMImpl_IPipePath aPI (aFunction);
+
+    Handle(GEOM_Function) aRefShape = aPI.GetShape();
+    Handle(GEOM_Function) aRefBase1 = aPI.GetBase1();
+    Handle(GEOM_Function) aRefBase2 = aPI.GetBase2();
+
+    TopoDS_Shape aShape = aRefShape->GetValue();
+    TopoDS_Shape aBase1 = aRefBase1->GetValue();
+    TopoDS_Shape aBase2 = aRefBase2->GetValue();
+
+    if (aShape.IsNull() || aBase1.IsNull() || aBase2.IsNull())
+      Standard_NullObject::Raise("RestorePath aborted : null argument");
+
+#if OCC_VERSION_LARGE > 0x06050300
+    BRepOffsetAPI_MiddlePath aMPB (aShape, aBase1, aBase2);
+    aMPB.Build();
+    if (aMPB.IsDone()) {
+      aRes = aMPB.Shape();
+    }
+#else
+    Standard_NullObject::Raise("RestorePath is not implemented in used OCCT version");
+#endif
+  }
+  else if (aType == PIPE_PATH_TWO_SEQS) {
+    GEOMImpl_IPipePath aPI (aFunction);
+
+    Handle(GEOM_Function) aRefShape = aPI.GetShape();
+    TopoDS_Shape aShape = aRefShape->GetValue();
+
+    Handle(TColStd_HSequenceOfTransient) aBaseSeq1 = aPI.GetBaseSeq1();
+    Handle(TColStd_HSequenceOfTransient) aBaseSeq2 = aPI.GetBaseSeq2();
+
+    TopoDS_Shape aBase1;
+    TopoDS_Shape aBase2;
+
+    if (aBaseSeq1->Length() == 1 && aBaseSeq2->Length() == 1) {
+      Handle(GEOM_Function) aRefShape1 = Handle(GEOM_Function)::DownCast(aBaseSeq1->Value(1));
+      Handle(GEOM_Function) aRefShape2 = Handle(GEOM_Function)::DownCast(aBaseSeq2->Value(1));
+      aBase1 = aRefShape1->GetValue();
+      aBase2 = aRefShape2->GetValue();
+    }
+    else {
+      aBase1 = GEOMImpl_ShapeDriver::MakeWireFromEdges(aBaseSeq1, Precision::Confusion());
+      aBase2 = GEOMImpl_ShapeDriver::MakeWireFromEdges(aBaseSeq2, Precision::Confusion());
+    }
+
+    if (aShape.IsNull() || aBase1.IsNull() || aBase2.IsNull())
+      Standard_NullObject::Raise("RestorePath aborted : null argument");
+
+#if OCC_VERSION_LARGE > 0x06050300
+    BRepOffsetAPI_MiddlePath aMPB (aShape, aBase1, aBase2);
+    aMPB.Build();
+    if (aMPB.IsDone()) {
+      aRes = aMPB.Shape();
+    }
+#else
+    Standard_NullObject::Raise("RestorePath is not implemented in used OCCT version");
+#endif
+  }
+  else {
+  }
+
+  if (aRes.IsNull()) return 0;
+
+  aFunction->SetValue(aRes);
+  log.SetTouched(Label());
+
+  return 1;
+}
+
+//=======================================================================
+//function :  GEOMImpl_PipePathDriver_Type_
+//purpose  :
+//=======================================================================
+Standard_EXPORT Handle_Standard_Type& GEOMImpl_PipePathDriver_Type_()
+{
+  static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver);
+  if (aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver);
+  static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared);
+  if (aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared);
+  static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient);
+  if (aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient);
+
+  static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL};
+  static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_PipePathDriver",
+                                                         sizeof(GEOMImpl_PipePathDriver),
+                                                         1,
+                                                         (Standard_Address)_Ancestors,
+                                                         (Standard_Address)NULL);
+
+  return _aType;
+}
+
+//=======================================================================
+//function : DownCast
+//purpose  :
+//=======================================================================
+const Handle(GEOMImpl_PipePathDriver) Handle(GEOMImpl_PipePathDriver)::DownCast(const Handle(Standard_Transient)& AnObject)
+{
+  Handle(GEOMImpl_PipePathDriver) _anOtherObject;
+
+  if (!AnObject.IsNull()) {
+     if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_PipePathDriver))) {
+       _anOtherObject = Handle(GEOMImpl_PipePathDriver)((Handle(GEOMImpl_PipePathDriver)&)AnObject);
+     }
+  }
+
+  return _anOtherObject;
+}
diff --git a/src/GEOMImpl/GEOMImpl_PipePathDriver.hxx b/src/GEOMImpl/GEOMImpl_PipePathDriver.hxx
new file mode 100644 (file)
index 0000000..36bf363
--- /dev/null
@@ -0,0 +1,167 @@
+// 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
+
+//  File   : GEOMImpl_PipePathDriver.ixx
+//  Module : GEOMImpl
+
+#ifndef _GEOMImpl_PipePathDriver_HeaderFile
+#define _GEOMImpl_PipePathDriver_HeaderFile
+
+#ifndef _TColStd_SequenceOfExtendedString_HeaderFile
+#include <TColStd_SequenceOfExtendedString.hxx>
+#endif
+#ifndef _Standard_TypeMismatch_HeaderFile
+#include <Standard_TypeMismatch.hxx>
+#endif
+
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+
+#ifndef _Standard_Macro_HeaderFile
+#include <Standard_Macro.hxx>
+#endif
+#ifndef _Standard_HeaderFile
+#include <Standard.hxx>
+#endif
+#ifndef _Standard_GUID_HeaderFile
+#include <Standard_GUID.hxx>
+#endif 
+
+#ifndef _Handle_TFunction_Driver_HeaderFile
+#include <Handle_TFunction_Driver.hxx>
+#endif
+
+
+class Standard_Transient;
+class Handle_Standard_Type;
+class Handle(TFunction_Driver);
+class GEOMImpl_PipePathDriver;
+
+Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(GEOMImpl_PipePathDriver);
+
+class Handle(GEOMImpl_PipePathDriver) : public Handle(TFunction_Driver) {
+  public:
+    inline void* operator new(size_t,void* anAddress) 
+      {
+        return anAddress;
+      }
+    inline void* operator new(size_t size) 
+      { 
+        return Standard::Allocate(size); 
+      }
+    inline void  operator delete(void *anAddress) 
+      { 
+        if (anAddress) Standard::Free((Standard_Address&)anAddress); 
+      }
+
+    Handle(GEOMImpl_PipePathDriver)():Handle(TFunction_Driver)() {} 
+    Handle(GEOMImpl_PipePathDriver)(const Handle(GEOMImpl_PipePathDriver)& aHandle) : Handle(TFunction_Driver)(aHandle) 
+     {
+     }
+
+    Handle(GEOMImpl_PipePathDriver)(const GEOMImpl_PipePathDriver* anItem) : Handle(TFunction_Driver)((TFunction_Driver *)anItem) 
+     {
+     }
+
+    Handle(GEOMImpl_PipePathDriver)& operator=(const Handle(GEOMImpl_PipePathDriver)& aHandle)
+     {
+      Assign(aHandle.Access());
+      return *this;
+     }
+
+    Handle(GEOMImpl_PipePathDriver)& operator=(const GEOMImpl_PipePathDriver* anItem)
+     {
+      Assign((Standard_Transient *)anItem);
+      return *this;
+     }
+
+    GEOMImpl_PipePathDriver* operator->() 
+     {
+      return (GEOMImpl_PipePathDriver *)ControlAccess();
+     }
+
+    GEOMImpl_PipePathDriver* operator->() const 
+     {
+      return (GEOMImpl_PipePathDriver *)ControlAccess();
+     }
+
+   Standard_EXPORT ~Handle(GEOMImpl_PipePathDriver)() {};
+   Standard_EXPORT static const Handle(GEOMImpl_PipePathDriver) DownCast(const Handle(Standard_Transient)& AnObject);
+};
+
+#ifndef _TFunction_Driver_HeaderFile
+#include <TFunction_Driver.hxx>
+#endif
+#ifndef _TFunction_Logbook_HeaderFile
+#include <TFunction_Logbook.hxx>
+#endif
+#ifndef _Standard_CString_HeaderFile
+#include <Standard_CString.hxx>
+#endif
+
+#include <TopoDS_Wire.hxx>
+#include <TopoDS_Shape.hxx>
+#include <TopTools_HSequenceOfShape.hxx>
+
+class TColStd_SequenceOfExtendedString;
+
+
+class GEOMImpl_PipePathDriver : public TFunction_Driver {
+
+public:
+
+    inline void* operator new(size_t,void* anAddress) 
+      {
+        return anAddress;
+      }
+    inline void* operator new(size_t size) 
+      { 
+        return Standard::Allocate(size); 
+      }
+    inline void  operator delete(void *anAddress) 
+      { 
+        if (anAddress) Standard::Free((Standard_Address&)anAddress); 
+      }
+
+  // Methods PUBLIC
+  // 
+  Standard_EXPORT GEOMImpl_PipePathDriver();
+  Standard_EXPORT virtual  Standard_Integer Execute(TFunction_Logbook& log) const; 
+  Standard_EXPORT virtual void Validate(TFunction_Logbook&) const {}
+  Standard_EXPORT Standard_Boolean MustExecute(const TFunction_Logbook&) const
+  { return Standard_True; }
+  Standard_EXPORT static const Standard_GUID& GetID();
+  Standard_EXPORT ~GEOMImpl_PipePathDriver() {};
+
+  // Type management
+  //
+  Standard_EXPORT friend Handle_Standard_Type& GEOMImpl_PipePathDriver_Type_();
+  Standard_EXPORT const Handle(Standard_Type)& DynamicType() const
+  { return STANDARD_TYPE(GEOMImpl_PipePathDriver) ; }
+  Standard_EXPORT Standard_Boolean IsKind(const Handle(Standard_Type)& AType) const
+  { return (STANDARD_TYPE(GEOMImpl_PipePathDriver) == AType ||
+            TFunction_Driver::IsKind(AType)); } 
+
+};
+
+#endif
index c83f91417bb4e65a3e45c795799c4ac2f4783e20..12962ffc711c97b1f62510ab9211262d3cf8e7d8 100644 (file)
@@ -133,66 +133,12 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const
 
   if (aType == WIRE_EDGES) {
     Handle(TColStd_HSequenceOfTransient) aShapes = aCI.GetShapes();
-    TopoDS_Wire aWire;
-    B.MakeWire(aWire);
 
-    // add edges
-    for (unsigned int ind = 1; ind <= aShapes->Length(); ind++) {
-      Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(aShapes->Value(ind));
-      TopoDS_Shape aShape_i = aRefShape->GetValue();
-      if (aShape_i.IsNull()) {
-        Standard_NullObject::Raise("Shape for wire construction is null");
-      }
-      if (aShape_i.ShapeType() == TopAbs_EDGE || aShape_i.ShapeType() == TopAbs_WIRE) {
-        TopExp_Explorer exp (aShape_i, TopAbs_EDGE);
-        for (; exp.More(); exp.Next())
-          B.Add(aWire, TopoDS::Edge(exp.Current()));
-      } else {
-        Standard_TypeMismatch::Raise
-          ("Shape for wire construction is neither an edge nor a wire");
-      }
-    }
-
-    // fix edges order
-    Handle(ShapeFix_Wire) aFW = new ShapeFix_Wire;
-    aFW->Load(aWire);
-    aFW->FixReorder();
-
-    if (aFW->StatusReorder(ShapeExtend_FAIL1)) {
-      Standard_ConstructionError::Raise("Wire construction failed: several loops detected");
-    } else if (aFW->StatusReorder(ShapeExtend_FAIL)) {
-      Standard_ConstructionError::Raise("Wire construction failed");
-    } else {
-    }
-
-    // IMP 0019766: Building a Wire from unconnected edges by introducing a tolerance
     Standard_Real aTolerance = aCI.GetTolerance();
     if (aTolerance < Precision::Confusion())
       aTolerance = Precision::Confusion();
 
-    aFW->ClosedWireMode() = Standard_False;
-    aFW->FixConnected(aTolerance);
-    if (aFW->StatusConnected(ShapeExtend_FAIL)) {
-      Standard_ConstructionError::Raise("Wire construction failed: cannot build connected wire");
-    }
-    // IMP 0019766
-    if (aFW->StatusConnected(ShapeExtend_DONE3)) {
-      // Confused with <prec> but not Analyzer.Precision(), set the same
-      aFW->FixGapsByRangesMode() = Standard_True;
-      if (aFW->FixGaps3d()) {
-        Handle(ShapeExtend_WireData) sbwd = aFW->WireData();
-        Handle(ShapeFix_Edge) aFe = new ShapeFix_Edge;
-        for (Standard_Integer iedge = 1; iedge <= sbwd->NbEdges(); iedge++) {
-          TopoDS_Edge aEdge = TopoDS::Edge(sbwd->Edge(iedge));
-          aFe->FixVertexTolerance(aEdge);
-          aFe->FixSameParameter(aEdge);
-        }
-      }
-      else if (aFW->StatusGaps3d(ShapeExtend_FAIL)) {
-        Standard_ConstructionError::Raise("Wire construction failed: cannot fix 3d gaps");
-      }
-    }
-      aShape = aFW->WireAPIMake();
+    aShape = MakeWireFromEdges(aShapes, aTolerance);
   }
   else if (aType == FACE_WIRE) {
     Handle(GEOM_Function) aRefBase = aCI.GetBase();
@@ -610,6 +556,73 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const
   return 1;
 }
 
+TopoDS_Wire GEOMImpl_ShapeDriver::MakeWireFromEdges(const Handle(TColStd_HSequenceOfTransient)& theEdgesFuncs,
+                                                    const Standard_Real theTolerance)
+{
+  BRep_Builder B;
+
+  TopoDS_Wire aWire;
+  B.MakeWire(aWire);
+
+  // add edges
+  for (unsigned int ind = 1; ind <= theEdgesFuncs->Length(); ind++) {
+    Handle(GEOM_Function) aRefShape = Handle(GEOM_Function)::DownCast(theEdgesFuncs->Value(ind));
+    TopoDS_Shape aShape_i = aRefShape->GetValue();
+    if (aShape_i.IsNull()) {
+      Standard_NullObject::Raise("Shape for wire construction is null");
+    }
+    if (aShape_i.ShapeType() == TopAbs_EDGE || aShape_i.ShapeType() == TopAbs_WIRE) {
+      TopExp_Explorer exp (aShape_i, TopAbs_EDGE);
+      for (; exp.More(); exp.Next())
+        B.Add(aWire, TopoDS::Edge(exp.Current()));
+    } else {
+      Standard_TypeMismatch::Raise
+        ("Shape for wire construction is neither an edge nor a wire");
+    }
+  }
+
+  // fix edges order
+  Handle(ShapeFix_Wire) aFW = new ShapeFix_Wire;
+  aFW->Load(aWire);
+  aFW->FixReorder();
+
+  if (aFW->StatusReorder(ShapeExtend_FAIL1)) {
+    Standard_ConstructionError::Raise("Wire construction failed: several loops detected");
+  }
+  else if (aFW->StatusReorder(ShapeExtend_FAIL)) {
+    Standard_ConstructionError::Raise("Wire construction failed");
+  }
+  else {
+  }
+
+  // IMP 0019766: Building a Wire from unconnected edges by introducing a tolerance
+  aFW->ClosedWireMode() = Standard_False;
+  aFW->FixConnected(theTolerance);
+  if (aFW->StatusConnected(ShapeExtend_FAIL)) {
+    Standard_ConstructionError::Raise("Wire construction failed: cannot build connected wire");
+  }
+  // IMP 0019766
+  if (aFW->StatusConnected(ShapeExtend_DONE3)) {
+    // Confused with <prec> but not Analyzer.Precision(), set the same
+    aFW->FixGapsByRangesMode() = Standard_True;
+    if (aFW->FixGaps3d()) {
+      Handle(ShapeExtend_WireData) sbwd = aFW->WireData();
+      Handle(ShapeFix_Edge) aFe = new ShapeFix_Edge;
+      for (Standard_Integer iedge = 1; iedge <= sbwd->NbEdges(); iedge++) {
+        TopoDS_Edge aEdge = TopoDS::Edge(sbwd->Edge(iedge));
+        aFe->FixVertexTolerance(aEdge);
+        aFe->FixSameParameter(aEdge);
+      }
+    }
+    else if (aFW->StatusGaps3d(ShapeExtend_FAIL)) {
+      Standard_ConstructionError::Raise("Wire construction failed: cannot fix 3d gaps");
+    }
+  }
+  aWire = aFW->WireAPIMake();
+
+  return aWire;
+}
+
 TopoDS_Edge GEOMImpl_ShapeDriver::MakeEdgeFromWire(const TopoDS_Shape& aWire,
                                                    const Standard_Real LinTol,
                                                    const Standard_Real AngTol)
index 653ad7e13a821b984787c18d441a6c162b66843b..87c55c501bb3603b44ed621289f095f491310546 100644 (file)
@@ -120,6 +120,8 @@ class Handle(GEOMImpl_ShapeDriver) : public Handle(TFunction_Driver) {
 
 #include <TopoDS_Shape.hxx>
 #include <TopoDS_Edge.hxx>
+#include <TopoDS_Wire.hxx>
+#include <TColStd_HSequenceOfTransient.hxx>
 
 class TColStd_SequenceOfExtendedString;
 
@@ -151,9 +153,13 @@ public:
   Standard_EXPORT Standard_Boolean MustExecute(const TFunction_Logbook&) const { return Standard_True; }
   Standard_EXPORT static const Standard_GUID& GetID();
 
-  Standard_EXPORT static TopoDS_Edge MakeEdgeFromWire(const TopoDS_Shape& aWire,
-                                                      const Standard_Real LinTol,
-                                                      const Standard_Real AngTol);
+  Standard_EXPORT static TopoDS_Edge MakeEdgeFromWire (const TopoDS_Shape& aWire,
+                                                       const Standard_Real LinTol,
+                                                       const Standard_Real AngTol);
+
+  Standard_EXPORT static TopoDS_Wire MakeWireFromEdges
+                                     (const Handle(TColStd_HSequenceOfTransient)& theEdgesFuncs,
+                                      const Standard_Real theTolerance);
 
   // Type management
   //
index 5182f8cdc818a4410db7106122751a1ac34f20e3..4aeed6398ffe4f2f495939bdb7568ebe4b05811f 100755 (executable)
 
 #define GEOM_EXTRUDED_BOSS 47
 
+#define GEOM_PIPE_PATH 48
+
 //GEOM_Function types
 
 #define COPY_WITH_REF    1
 #define PIPE_SHELLS_WITHOUT_PATH 4
 #define PIPE_BI_NORMAL_ALONG_VECTOR 5
 
+// RestorePath
+#define PIPE_PATH_TWO_BASES 1
+#define PIPE_PATH_TWO_SEQS  2
+
 #define THRUSECTIONS_RULED 1
 #define THRUSECTIONS_SMOOTHED 2
 
index 69cda82da32fc96aeae8fa87b19698cd08df71cc..8ce12ca2e7d0aef3207eeed8b0492f20f0dc7ecb 100644 (file)
@@ -83,6 +83,7 @@ salomeinclude_HEADERS =                               \
        GEOMImpl_ITorus.hxx                     \
        GEOMImpl_IPrism.hxx                     \
        GEOMImpl_IPipe.hxx                      \
+       GEOMImpl_IPipePath.hxx                  \
        GEOMImpl_IRevolution.hxx                \
        GEOMImpl_IMeasure.hxx                   \
        GEOMImpl_IShapes.hxx                    \
@@ -111,6 +112,7 @@ salomeinclude_HEADERS =                             \
        GEOMImpl_TorusDriver.hxx                \
        GEOMImpl_PrismDriver.hxx                \
        GEOMImpl_PipeDriver.hxx                 \
+       GEOMImpl_PipePathDriver.hxx             \
        GEOMImpl_ThruSectionsDriver.hxx         \
        GEOMImpl_RevolutionDriver.hxx           \
        GEOMImpl_ShapeDriver.hxx                \
@@ -185,6 +187,7 @@ dist_libGEOMimpl_la_SOURCES =                       \
        GEOMImpl_TorusDriver.cxx                \
        GEOMImpl_PrismDriver.cxx                \
        GEOMImpl_PipeDriver.cxx                 \
+       GEOMImpl_PipePathDriver.cxx             \
        GEOMImpl_ThruSectionsDriver.cxx         \
        GEOMImpl_RevolutionDriver.cxx           \
        GEOMImpl_ShapeDriver.cxx                \
index 76febf8360d3cb54bc1a20e5798da52e53cecb86..95948ed249580031a06345d6162eaf0140f509f2 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>
 
@@ -1096,7 +1095,6 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeShellsWithoutPath
   return GetObject(anObject);
 }
 
-
 //=============================================================================
 /*!
  *  MakePipeBiNormalAlongVector
@@ -1127,3 +1125,81 @@ GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::MakePipeBiNormalAlongVector
 
   return GetObject(anObject);
 }
+
+//=============================================================================
+/*!
+ *  RestorePath
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::RestorePath
+                 (GEOM::GEOM_Object_ptr theShape,
+                  GEOM::GEOM_Object_ptr theBase1,
+                  GEOM::GEOM_Object_ptr theBase2)
+{
+  GEOM::GEOM_Object_var aGEOMObject;
+
+  // Set a not done flag
+  GetOperations()->SetNotDone();
+
+  // Get the reference objects
+  Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
+  Handle(GEOM_Object) aBase1 = GetObjectImpl(theBase1);
+  Handle(GEOM_Object) aBase2 = GetObjectImpl(theBase2);
+
+  if (aShape.IsNull() || aBase1.IsNull() || aBase2.IsNull()) return aGEOMObject._retn();
+
+  // Create the Path
+  Handle(GEOM_Object) anObject = GetOperations()->RestorePath(aShape, aBase1, aBase2);
+  if (!GetOperations()->IsDone() || anObject.IsNull())
+    return aGEOMObject._retn();
+
+  return GetObject(anObject);
+}
+
+//=============================================================================
+/*!
+ *  RestorePathEdges
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_I3DPrimOperations_i::RestorePathEdges
+                 (GEOM::GEOM_Object_ptr theShape,
+                  const GEOM::ListOfGO& theBase1,
+                  const GEOM::ListOfGO& theBase2)
+{
+  GEOM::GEOM_Object_var aGEOMObject;
+
+  // Set a not done flag
+  GetOperations()->SetNotDone();
+
+  // Get the reference objects
+  Handle(GEOM_Object) aShape = GetObjectImpl(theShape);
+  if (aShape.IsNull()) return aGEOMObject._retn();
+
+  Handle(TColStd_HSequenceOfTransient) aSeqBases1 = new TColStd_HSequenceOfTransient;
+  Handle(TColStd_HSequenceOfTransient) aSeqBases2 = new TColStd_HSequenceOfTransient;
+
+  int ind;
+  int aNbBases1 = theBase1.length();
+  int aNbBases2 = theBase2.length();
+
+  for (ind = 0; ind < aNbBases1; ind++) {
+    Handle(GEOM_Object) aBase = GetObjectImpl(theBase1[ind]);
+    if (!aBase.IsNull())
+      aSeqBases1->Append(aBase);
+  }
+  for (ind = 0; ind < aNbBases2; ind++) {
+    Handle(GEOM_Object) aBase = GetObjectImpl(theBase2[ind]);
+    if (!aBase.IsNull())
+      aSeqBases2->Append(aBase);
+  }
+
+  if (!aSeqBases1->Length() || !aSeqBases2->Length())
+    return aGEOMObject._retn();
+
+  // Create the Path
+  Handle(GEOM_Object) anObject = GetOperations()->RestorePath(aShape, aSeqBases1, aSeqBases2);
+  if (!GetOperations()->IsDone() || anObject.IsNull())
+    return aGEOMObject._retn();
+
+  return GetObject(anObject);
+}
index 05a748932a5b9b3ec086c4e53502ca0b2dea0aad..5b274671bd9e96682afb41aee8c7499fc2a936c9 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_I3DPrimOperations_i_HeaderFile
 #define _GEOM_I3DPrimOperations_i_HeaderFile
@@ -188,6 +187,13 @@ class GEOM_I_EXPORT GEOM_I3DPrimOperations_i :
                                                     GEOM::GEOM_Object_ptr thePath,
                                                     GEOM::GEOM_Object_ptr theVec);
 
+  GEOM::GEOM_Object_ptr RestorePath (GEOM::GEOM_Object_ptr theShape,
+                                     GEOM::GEOM_Object_ptr theBase1,
+                                     GEOM::GEOM_Object_ptr theBase2);
+  GEOM::GEOM_Object_ptr RestorePathEdges (GEOM::GEOM_Object_ptr theShape,
+                                          const GEOM::ListOfGO& theBase1,
+                                          const GEOM::ListOfGO& theBase2);
+
   ::GEOMImpl_I3DPrimOperations* GetOperations()
   { return (::GEOMImpl_I3DPrimOperations*)GetImpl(); }
 };
index 0dd628e5a1c91ceb683701e0bb0ed46bbb13ffdf..8833a4de9353673d05f8ddb7460e6038e1f96f62 100644 (file)
@@ -2867,6 +2867,76 @@ class geompyDC(GEOM._objref_GEOM_Gen):
             RaiseIfFailed("MakePipeBiNormalAlongVector", self.PrimOp)
             return anObj
 
+        ## Build a middle path of a pipe-like shape.
+        #  The path shape can be a wire or an edge.
+        #  @param theShape It can be closed or unclosed pipe-like shell
+        #                  or a pipe-like solid.
+        #  @param theBase1, theBase2 Two bases of the supposed pipe. This
+        #                            should be wires or faces of theShape.
+        #  @note It is not assumed that exact or approximate copy of theShape
+        #        can be obtained by applying existing Pipe operation on the
+        #        resulting "Path" wire taking theBase1 as the base - it is not
+        #        always possible; though in some particular cases it might work
+        #        it is not guaranteed. Thus, RestorePath function should not be
+        #        considered as an exact reverse operation of the Pipe.
+        #  @return New GEOM.GEOM_Object, containing an edge or wire that represent
+        #                                source pipe's "path".
+        #
+        #  @ref tui_creation_pipe_path "Example"
+        def RestorePath (self, theShape, theBase1, theBase2):
+            """
+            Build a middle path of a pipe-like shape.
+            The path shape can be a wire or an edge.
+
+            Parameters:
+                theShape It can be closed or unclosed pipe-like shell
+                         or a pipe-like solid.
+                theBase1, theBase2 Two bases of the supposed pipe. This
+                                   should be wires or faces of theShape.
+
+            Returns:
+                New GEOM_Object, containing an edge or wire that represent
+                                 source pipe's path.
+            """
+            anObj = self.PrimOp.RestorePath(theShape, theBase1, theBase2)
+            RaiseIfFailed("RestorePath", self.PrimOp)
+            return anObj
+
+        ## Build a middle path of a pipe-like shape.
+        #  The path shape can be a wire or an edge.
+        #  @param theShape It can be closed or unclosed pipe-like shell
+        #                  or a pipe-like solid.
+        #  @param listEdges1, listEdges2 Two bases of the supposed pipe. This
+        #                                should be lists of edges of theShape.
+        #  @note It is not assumed that exact or approximate copy of theShape
+        #        can be obtained by applying existing Pipe operation on the
+        #        resulting "Path" wire taking theBase1 as the base - it is not
+        #        always possible; though in some particular cases it might work
+        #        it is not guaranteed. Thus, RestorePath function should not be
+        #        considered as an exact reverse operation of the Pipe.
+        #  @return New GEOM.GEOM_Object, containing an edge or wire that represent
+        #                                source pipe's "path".
+        #
+        #  @ref tui_creation_pipe_path "Example"
+        def RestorePathEdges (self, theShape, listEdges1, listEdges2):
+            """
+            Build a middle path of a pipe-like shape.
+            The path shape can be a wire or an edge.
+
+            Parameters:
+                theShape It can be closed or unclosed pipe-like shell
+                         or a pipe-like solid.
+                listEdges1, listEdges2 Two bases of the supposed pipe. This
+                                       should be lists of edges of theShape.
+
+            Returns:
+                New GEOM_Object, containing an edge or wire that represent
+                                 source pipe's path.
+            """
+            anObj = self.PrimOp.RestorePathEdges(theShape, listEdges1, listEdges2)
+            RaiseIfFailed("RestorePath", self.PrimOp)
+            return anObj
+
         # end of l3_complex
         ## @}
 
index b341a92b002d10dc1466de1113b8ea46f7c32347..3f94071ec7e35f329957c880a7246079b54b9295 100644 (file)
 // 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   : GenerationGUI.cxx
 // Author : Damien COQUERET, Open CASCADE S.A.S.
-//
+
 #include "GenerationGUI.h"
 
 #include <GeometryGUI.h>
@@ -36,6 +35,7 @@
 #include "GenerationGUI_RevolDlg.h"     // Method REVOL
 #include "GenerationGUI_FillingDlg.h"   // Method FILLING
 #include "GenerationGUI_PipeDlg.h"      // Method PIPE
+#include "GenerationGUI_PipePathDlg.h"  // Method RESTORE PATH
 
 //=======================================================================
 // function : GenerationGUI()
@@ -73,6 +73,7 @@ bool GenerationGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent )
   case GEOMOp::OpRevolution: aDlg = new GenerationGUI_RevolDlg   ( getGeometryGUI(), parent ); break;
   case GEOMOp::OpFilling:    aDlg = new GenerationGUI_FillingDlg ( getGeometryGUI(), parent ); break;
   case GEOMOp::OpPipe:       aDlg = new GenerationGUI_PipeDlg    ( getGeometryGUI(), parent ); break;
+  case GEOMOp::OpPipePath:   aDlg = new GenerationGUI_PipePathDlg( getGeometryGUI(), parent ); break;
     
   default: app->putInfo( tr( "GEOM_PRP_COMMAND" ).arg( theCommandID ) ); break;
   }
diff --git a/src/GenerationGUI/GenerationGUI_PipePathDlg.cxx b/src/GenerationGUI/GenerationGUI_PipePathDlg.cxx
new file mode 100644 (file)
index 0000000..b2d2d8d
--- /dev/null
@@ -0,0 +1,392 @@
+// 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   : GenerationGUI_PipePathDlg.cxx
+
+#include "GenerationGUI_PipePathDlg.h"
+
+#include <DlgRef.h>
+#include <GeometryGUI.h>
+#include <GEOMBase.h>
+
+#include <SUIT_Session.h>
+#include <SUIT_ResourceMgr.h>
+#include <SalomeApp_Application.h>
+#include <LightApp_SelectionMgr.h>
+
+#include <TopoDS_Shape.hxx>
+#include <TopoDS.hxx>
+#include <TopExp.hxx>
+#include <TColStd_IndexedMapOfInteger.hxx>
+#include <TopTools_IndexedMapOfShape.hxx>
+#include <TColStd_IndexedMapOfInteger.hxx>
+#include <TColStd_MapOfInteger.hxx>
+
+#include <GEOMImpl_Types.hxx>
+
+//=================================================================================
+// class    : GenerationGUI_PipePathDlg()
+// purpose  : Constructs a GenerationGUI_PipePathDlg 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.
+//=================================================================================
+GenerationGUI_PipePathDlg::GenerationGUI_PipePathDlg (GeometryGUI* theGeometryGUI, QWidget* parent,
+                                                      bool modal, Qt::WindowFlags fl)
+  : GEOMBase_Skeleton(theGeometryGUI, parent, modal, fl)
+{
+  QPixmap image0 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_DLG_PIPE_PATH")));
+  QPixmap image1 (SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT")));
+
+  setWindowTitle(tr("GEOM_PIPE_PATH_TITLE"));
+
+  /***************************************************************/
+  mainFrame()->GroupConstructors->setTitle(tr("GEOM_PIPE_PATH"));
+  mainFrame()->RadioButton1->setIcon(image0);
+  mainFrame()->RadioButton2->setAttribute(Qt::WA_DeleteOnClose);
+  mainFrame()->RadioButton3->setAttribute(Qt::WA_DeleteOnClose);
+  mainFrame()->RadioButton2->close();
+  mainFrame()->RadioButton3->close();
+
+  GroupPoints = new DlgRef_3Sel1Check(centralWidget());
+
+  GroupPoints->GroupBox1->setTitle(tr("GEOM_ARGUMENTS"));
+  GroupPoints->TextLabel1->setText(tr("GEOM_PIPE_LIKE_SHAPE"));
+  GroupPoints->TextLabel2->setText(tr("GEOM_PIPE_BASE1_OBJECT"));
+  GroupPoints->TextLabel3->setText(tr("GEOM_PIPE_BASE2_OBJECT"));
+  GroupPoints->PushButton1->setIcon(image1);
+  GroupPoints->PushButton2->setIcon(image1);
+  GroupPoints->PushButton3->setIcon(image1);
+  GroupPoints->CheckButton1->setText(tr("GEOM_SELECT_UNPUBLISHED_EDGES"));
+
+  QVBoxLayout* layout = new QVBoxLayout (centralWidget());
+  layout->setMargin(0);
+  layout->setSpacing(6);
+  layout->addWidget(GroupPoints);
+  /***************************************************************/
+
+  setHelpFileName("create_pipe_path_page.html");
+
+  // Initialisation
+  Init();
+}
+
+//=================================================================================
+// function : ~GenerationGUI_PipePathDlg()
+// purpose  : Destroys the object and frees any allocated resources
+//=================================================================================
+GenerationGUI_PipePathDlg::~GenerationGUI_PipePathDlg()
+{
+  // no need to delete child widgets, Qt does it all for us
+}
+
+//=================================================================================
+// function : Init()
+// purpose  :
+//=================================================================================
+void GenerationGUI_PipePathDlg::Init()
+{
+  // init variables
+  GroupPoints->LineEdit1->setReadOnly(true);
+  GroupPoints->LineEdit2->setReadOnly(true);
+  GroupPoints->LineEdit3->setReadOnly(true);
+
+  GroupPoints->LineEdit1->setText("");
+  GroupPoints->LineEdit2->setText("");
+  GroupPoints->LineEdit3->setText("");
+
+  myShape.nullify();
+
+  GroupPoints->CheckButton1->setEnabled(false);
+
+  showOnlyPreviewControl();
+
+  // signals and slots connections
+  connect(buttonOk(),    SIGNAL(clicked()), this, SLOT(ClickOnOk()));
+  connect(buttonApply(), SIGNAL(clicked()), this, SLOT(ClickOnApply()));
+
+  connect(GroupPoints->PushButton1, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
+  connect(GroupPoints->PushButton2, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
+  connect(GroupPoints->PushButton3, SIGNAL(clicked()), this, SLOT(SetEditCurrentArgument()));
+
+  connect(GroupPoints->CheckButton1,   SIGNAL(toggled(bool)), this, SLOT(SelectionTypeButtonClicked()));
+
+  initName(tr("GEOM_PIPE_PATH"));
+
+  updateGeometry();
+  resize(100,100);
+
+  GroupPoints->PushButton1->click();
+  SelectionIntoArgument();
+}
+
+//=================================================================================
+// function : SelectionBittonClicked()
+// purpose  : Selection type Radio button management
+//=================================================================================
+void GenerationGUI_PipePathDlg::SelectionTypeButtonClicked()
+{
+  globalSelection();
+  if (GroupPoints->CheckButton1->isChecked()) {
+    localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
+  }
+  else {
+    TColStd_MapOfInteger aMap;
+    aMap.Add(GEOM_FACE);
+    aMap.Add(GEOM_WIRE);
+    aMap.Add(GEOM_EDGE);
+    globalSelection(aMap);
+  }
+  processPreview();
+}
+
+//=================================================================================
+// function : ClickOnOk()
+// purpose  :
+//=================================================================================
+void GenerationGUI_PipePathDlg::ClickOnOk()
+{
+  setIsApplyAndClose(true);
+  if (ClickOnApply())
+    ClickOnCancel();
+}
+
+//=================================================================================
+// function : ClickOnApply()
+// purpose  :
+//=================================================================================
+bool GenerationGUI_PipePathDlg::ClickOnApply()
+{
+  if (!onAccept())
+    return false;
+
+  initName();
+  // activate selection and connect selection manager
+  GroupPoints->PushButton1->click();
+  return true;
+}
+
+//=================================================================================
+// function : SelectionIntoArgument()
+// purpose  : Called when selection is changed or on dialog initialization or activation
+//=================================================================================
+void GenerationGUI_PipePathDlg::SelectionIntoArgument()
+{
+  erasePreview();
+  myEditCurrentArgument->setText("");
+
+  if (myEditCurrentArgument == GroupPoints->LineEdit1) {
+    QList<TopAbs_ShapeEnum> types;
+    types << TopAbs_SOLID << TopAbs_SHELL << TopAbs_FACE;
+    myShape = getSelected(types);
+    if (myShape) {
+      QString aName = GEOMBase::GetName(myShape.get());
+      myEditCurrentArgument->setText(aName);
+      if (myBase1Objects.isEmpty())
+       GroupPoints->PushButton2->click();
+      else if (myBase2Objects.isEmpty())
+       GroupPoints->PushButton3->click();
+    }
+  }
+  else if (myEditCurrentArgument == GroupPoints->LineEdit2) {
+    myBase1Objects.clear();
+    QList<GEOM::GeomObjPtr> objects = getSelected(TopAbs_SHAPE, -1);
+    for (int i = 0; i < objects.count(); i++) {
+      GEOM::shape_type stype = objects[i]->GetMaxShapeType();
+     if (GEOM::FACE <= stype && stype <= GEOM::EDGE)
+        myBase1Objects << objects[i];
+    }
+    int nbObj = myBase1Objects.count();
+    if (nbObj) {
+      QString aName =
+        nbObj > 1 ? QString("%1_objects").arg(nbObj) : GEOMBase::GetName(myBase1Objects[0].get());
+      myEditCurrentArgument->setText(aName);
+    }
+  }
+  else if (myEditCurrentArgument == GroupPoints->LineEdit3) {
+    myBase2Objects.clear();
+    QList<GEOM::GeomObjPtr> objects = getSelected(TopAbs_SHAPE, -1);
+    for (int i = 0; i < objects.count(); i++) {
+      GEOM::shape_type stype = objects[i]->GetMaxShapeType();
+      if (GEOM::FACE <= stype && stype <= GEOM::EDGE)
+        myBase2Objects << objects[i];
+    }
+    int nbObj = myBase2Objects.count();
+    if (nbObj) {
+      QString aName =
+        nbObj > 1 ? QString("%1_objects").arg(nbObj) : GEOMBase::GetName(myBase2Objects[0].get());
+      myEditCurrentArgument->setText(aName);
+    }
+  }
+
+  processPreview();
+}
+
+//=================================================================================
+// function : SetEditCurrentArgument()
+// purpose  :
+//=================================================================================
+void GenerationGUI_PipePathDlg::SetEditCurrentArgument()
+{
+  QPushButton* send = (QPushButton*)sender();
+
+  disconnect(myGeomGUI->getApp()->selectionMgr(), 0, this, 0);
+
+  globalSelection(GEOM_ALLSHAPES);
+
+  GroupPoints->PushButton1->setDown(false);
+  GroupPoints->PushButton2->setDown(false);
+  GroupPoints->PushButton3->setDown(false);
+  GroupPoints->LineEdit1->setEnabled(false);
+  GroupPoints->LineEdit2->setEnabled(false);
+  GroupPoints->LineEdit3->setEnabled(false);
+
+  if (send == GroupPoints->PushButton1) {
+    myEditCurrentArgument = GroupPoints->LineEdit1;
+    GroupPoints->CheckButton1->setEnabled(false);
+  }
+  else if (send == GroupPoints->PushButton2) {
+    myEditCurrentArgument = GroupPoints->LineEdit2;
+
+    if (GroupPoints->CheckButton1->isChecked()) {
+      localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
+    }
+    else {
+      TColStd_MapOfInteger aMap;
+      aMap.Add(GEOM_FACE);
+      aMap.Add(GEOM_WIRE);
+      aMap.Add(GEOM_EDGE);
+      globalSelection(aMap);
+    }
+    GroupPoints->CheckButton1->setEnabled(true);
+  }
+  else if (send == GroupPoints->PushButton3) {
+    myEditCurrentArgument = GroupPoints->LineEdit3;
+
+    if (GroupPoints->CheckButton1->isChecked()) {
+      localSelection(GEOM::GEOM_Object::_nil(), TopAbs_EDGE);
+    }
+    else {
+      TColStd_MapOfInteger aMap;
+      aMap.Add(GEOM_FACE);
+      aMap.Add(GEOM_WIRE);
+      aMap.Add(GEOM_EDGE);
+      globalSelection(aMap);
+    }
+    GroupPoints->CheckButton1->setEnabled(true);
+  }
+  connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
+          this, SLOT(SelectionIntoArgument()));
+
+  // enable line edit
+  myEditCurrentArgument->setEnabled(true);
+  myEditCurrentArgument->setFocus();
+  // after setFocus(), because it will be setDown(false) when loses focus
+  send->setDown(true);
+
+  // seems we need it only to avoid preview disappearing, caused by selection mode change
+  processPreview();
+}
+
+//=================================================================================
+// function : ActivateThisDialog()
+// purpose  :
+//=================================================================================
+void GenerationGUI_PipePathDlg::ActivateThisDialog()
+{
+  GEOMBase_Skeleton::ActivateThisDialog();
+
+  connect(myGeomGUI->getApp()->selectionMgr(), SIGNAL(currentSelectionChanged()),
+          this, SLOT(SelectionIntoArgument()));
+
+  GroupPoints->PushButton1->click();
+  SelectionIntoArgument();
+}
+
+//=================================================================================
+// function : enterEvent()
+// purpose  : when mouse enter onto the QWidget
+//=================================================================================
+void GenerationGUI_PipePathDlg::enterEvent (QEvent*)
+{
+  if (!mainFrame()->GroupConstructors->isEnabled())
+    ActivateThisDialog();
+}
+
+//=================================================================================
+// function : createOperation
+// purpose  :
+//=================================================================================
+GEOM::GEOM_IOperations_ptr GenerationGUI_PipePathDlg::createOperation()
+{
+  return getGeomEngine()->GetI3DPrimOperations(getStudyId());
+}
+
+//=================================================================================
+// function : isValid
+// purpose  :
+//=================================================================================
+bool GenerationGUI_PipePathDlg::isValid (QString&)
+{
+  bool ok = myShape && !myBase1Objects.isEmpty() && !myBase2Objects.isEmpty();
+  return ok;
+}
+
+//=================================================================================
+// function : execute
+// purpose  :
+//=================================================================================
+bool GenerationGUI_PipePathDlg::execute (ObjectList& objects)
+{
+  GEOM::ListOfGO_var aBase1 = new GEOM::ListOfGO();
+  GEOM::ListOfGO_var aBase2 = new GEOM::ListOfGO();
+
+  aBase1->length(myBase1Objects.count());
+  aBase2->length(myBase2Objects.count());
+
+  int i;
+  for (i = 0; i < myBase1Objects.count(); i++)
+    aBase1[i] = myBase1Objects[i].copy();
+  for (i = 0; i < myBase2Objects.count(); i++)
+    aBase2[i] = myBase2Objects[i].copy();
+
+  GEOM::GEOM_I3DPrimOperations_var anOper = GEOM::GEOM_I3DPrimOperations::_narrow(getOperation());
+  GEOM::GEOM_Object_var anObj = anOper->RestorePathEdges(myShape.get(), aBase1.in(), aBase2.in());
+    
+  if (!anObj->_is_nil())
+    objects.push_back(anObj._retn());
+
+  return true;
+}
+
+//=================================================================================
+// function : addSubshapeToStudy
+// purpose  : virtual method to add new SubObjects if local selection
+//=================================================================================
+void GenerationGUI_PipePathDlg::addSubshapesToStudy()
+{
+  int i;
+  for (i = 0; i < myBase1Objects.count(); i++)
+    GEOMBase::PublishSubObject(myBase1Objects[i].get());
+  for (i = 0; i < myBase2Objects.count(); i++)
+    GEOMBase::PublishSubObject(myBase2Objects[i].get());
+}
diff --git a/src/GenerationGUI/GenerationGUI_PipePathDlg.h b/src/GenerationGUI/GenerationGUI_PipePathDlg.h
new file mode 100644 (file)
index 0000000..2c900bb
--- /dev/null
@@ -0,0 +1,72 @@
+// 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   : GenerationGUI_PipePathDlg.h
+
+#ifndef GENERATIONGUI_PIPEPATHDLG_H
+#define GENERATIONGUI_PIPEPATHDLG_H
+
+#include "GEOMBase_Skeleton.h"
+#include "GEOM_GenericObjPtr.h"
+
+class DlgRef_3Sel1Check;
+
+//=================================================================================
+// class    : GenerationGUI_PipePathDlg
+// purpose  :
+//=================================================================================
+class GenerationGUI_PipePathDlg : public GEOMBase_Skeleton
+{ 
+  Q_OBJECT
+
+public:
+  GenerationGUI_PipePathDlg (GeometryGUI*, QWidget* = 0, bool = false, Qt::WindowFlags = 0);
+  ~GenerationGUI_PipePathDlg();
+
+protected:
+  // redefined from GEOMBase_Helper
+  virtual GEOM::GEOM_IOperations_ptr createOperation();
+  virtual bool                       isValid (QString&);
+  virtual bool                       execute (ObjectList&);    
+  virtual void                       addSubshapesToStudy();
+
+private:
+  void                               Init();
+  void                               enterEvent (QEvent*);
+
+private:
+  GEOM::GeomObjPtr                   myShape; /* Pipe-like shape */
+  QList<GEOM::GeomObjPtr>            myBase1Objects; /* Base 1 edges / wire / face */
+  QList<GEOM::GeomObjPtr>            myBase2Objects; /* Base 2 edges / wire / face */
+
+  DlgRef_3Sel1Check*                 GroupPoints;
+
+private slots:
+  void                               ClickOnOk();
+  bool                               ClickOnApply();
+  void                               ActivateThisDialog();
+  void                               SelectionIntoArgument();
+  void                               SetEditCurrentArgument();
+  void                               SelectionTypeButtonClicked();
+};
+
+#endif // GENERATIONGUI_PIPEPATHDLG_H
index 35afde04d2d8f81f44eaa273d57de8618d4147c0..cda0fad023c89aa380e9bdbd58deb9400c1faa07 100644 (file)
 # 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 GENERATIONGUI : 
 # File    : Makefile.am
 # Author  : Alexander BORODIN, Open CASCADE S.A.S. (alexander.borodin@opencascade.com)
 # Package : GenerationGUI
-#
+
 include $(top_srcdir)/adm_local/unix/make_common_starter.am
 
 # Libraries targets
@@ -33,7 +32,8 @@ salomeinclude_HEADERS =                       \
        GenerationGUI_PrismDlg.h        \
        GenerationGUI_RevolDlg.h        \
        GenerationGUI_FillingDlg.h      \
-       GenerationGUI_PipeDlg.h
+       GenerationGUI_PipeDlg.h         \
+       GenerationGUI_PipePathDlg.h
 
 dist_libGenerationGUI_la_SOURCES =     \
        GenerationGUI.h                 \
@@ -41,18 +41,21 @@ dist_libGenerationGUI_la_SOURCES =  \
        GenerationGUI_RevolDlg.h        \
        GenerationGUI_FillingDlg.h      \
        GenerationGUI_PipeDlg.h         \
+       GenerationGUI_PipePathDlg.h     \
                                        \
        GenerationGUI.cxx               \
        GenerationGUI_PrismDlg.cxx      \
        GenerationGUI_RevolDlg.cxx      \
        GenerationGUI_FillingDlg.cxx    \
-       GenerationGUI_PipeDlg.cxx
+       GenerationGUI_PipeDlg.cxx       \
+       GenerationGUI_PipePathDlg.cxx
 
 MOC_FILES =                                    \
        GenerationGUI_PrismDlg_moc.cxx          \
        GenerationGUI_RevolDlg_moc.cxx          \
        GenerationGUI_FillingDlg_moc.cxx        \
-       GenerationGUI_PipeDlg_moc.cxx
+       GenerationGUI_PipeDlg_moc.cxx           \
+       GenerationGUI_PipePathDlg_moc.cxx
 
 nodist_libGenerationGUI_la_SOURCES =   \
        $(MOC_FILES)