]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
0022754: [EDF] Surface of a face
authorskv <skv@opencascade.com>
Tue, 28 Oct 2014 10:19:15 +0000 (13:19 +0300)
committervsr <vsr@opencascade.com>
Thu, 13 Nov 2014 13:01:21 +0000 (16:01 +0300)
26 files changed:
doc/salome/examples/CMakeLists.txt
doc/salome/examples/basic_geom_objs_ex10.py [new file with mode: 0644]
doc/salome/gui/GEOM/images/surface_from_face1.png [new file with mode: 0644]
doc/salome/gui/GEOM/images/surface_from_face_example.png [new file with mode: 0644]
doc/salome/gui/GEOM/input/creating_basic_go.doc
doc/salome/gui/GEOM/input/creating_surface_from_face.doc [new file with mode: 0644]
doc/salome/gui/GEOM/input/tui_basic_geom_objs.doc
idl/GEOM_Gen.idl
resources/CMakeLists.txt
resources/facetosurface.png [new file with mode: 0644]
src/EntityGUI/CMakeLists.txt
src/EntityGUI/EntityGUI.cxx
src/EntityGUI/EntityGUI_SurfFromFaceDlg.cxx [new file with mode: 0644]
src/EntityGUI/EntityGUI_SurfFromFaceDlg.h [new file with mode: 0644]
src/GEOMGUI/GEOM_images.ts
src/GEOMGUI/GEOM_msg_en.ts
src/GEOMGUI/GeometryGUI.cxx
src/GEOMGUI/GeometryGUI_Operations.h
src/GEOMImpl/GEOMImpl_IShapesOperations.cxx
src/GEOMImpl/GEOMImpl_IShapesOperations.hxx
src/GEOMImpl/GEOMImpl_ShapeDriver.cxx
src/GEOMImpl/GEOMImpl_Types.hxx
src/GEOM_I/GEOM_IShapesOperations_i.cc
src/GEOM_I/GEOM_IShapesOperations_i.hh
src/GEOM_SWIG/GEOM_TestAll.py
src/GEOM_SWIG/geomBuilder.py

index 67721de680685bd017589058c8b4e8a5978dd17b..76c3883e125f51b8ae0f6de40a7b5d632d362bf1 100644 (file)
@@ -37,6 +37,7 @@ SET(GOOD_TESTS
   basic_geom_objs_ex07.py  
   basic_geom_objs_ex08.py  
   basic_geom_objs_ex09.py  
+  basic_geom_objs_ex10.py  
   basic_operations_ex01.py  
   basic_operations_ex02.py  
   basic_operations_ex03.py  
diff --git a/doc/salome/examples/basic_geom_objs_ex10.py b/doc/salome/examples/basic_geom_objs_ex10.py
new file mode 100644 (file)
index 0000000..f9f7f01
--- /dev/null
@@ -0,0 +1,37 @@
+# Creation of a Surface From Face
+
+import salome
+salome.salome_init()
+import GEOM
+from salome.geom import geomBuilder
+geompy = geomBuilder.New(salome.myStudy)
+import math
+import SALOMEDS
+
+# Create Vertices, Edges, Wire, Face and Disk
+Vertex_1 = geompy.MakeVertex(0,    0, 0)
+Vertex_2 = geompy.MakeVertex(100,  0, 0)
+Vertex_3 = geompy.MakeVertex(50, 100, 0)
+Edge_1   = geompy.MakeEdge(Vertex_1, Vertex_2)
+Edge_2   = geompy.MakeEdge(Vertex_2, Vertex_3)
+Edge_3   = geompy.MakeEdge(Vertex_3, Vertex_1)
+Wire_1   = geompy.MakeWire([Edge_1, Edge_2, Edge_3])
+Face_1   = geompy.MakeFace(Wire_1, True)
+Disk_1   = geompy.MakeDiskR(100, 1)
+
+# Create Surfaces From Faces.
+SurfaceFromFace_1 = geompy.MakeSurfaceFromFace(Face_1)
+SurfaceFromFace_2 = geompy.MakeSurfaceFromFace(Disk_1)
+
+#Add created object to study
+geompy.addToStudy( Vertex_1,          "Vertex_1" )
+geompy.addToStudy( Vertex_2,          "Vertex_2" )
+geompy.addToStudy( Vertex_3,          "Vertex_3" )
+geompy.addToStudy( Edge_1,            "Edge_1" )
+geompy.addToStudy( Edge_2,            "Edge_2" )
+geompy.addToStudy( Edge_3,            "Edge_3" )
+geompy.addToStudy( Wire_1,            "Wire_1" )
+geompy.addToStudy( Face_1,            "Face_1" )
+geompy.addToStudy( Disk_1,            "Disk_1" )
+geompy.addToStudy( SurfaceFromFace_1, "SurfaceFromFace_1" )
+geompy.addToStudy( SurfaceFromFace_2, "SurfaceFromFace_2" )
diff --git a/doc/salome/gui/GEOM/images/surface_from_face1.png b/doc/salome/gui/GEOM/images/surface_from_face1.png
new file mode 100644 (file)
index 0000000..ba039fd
Binary files /dev/null and b/doc/salome/gui/GEOM/images/surface_from_face1.png differ
diff --git a/doc/salome/gui/GEOM/images/surface_from_face_example.png b/doc/salome/gui/GEOM/images/surface_from_face_example.png
new file mode 100644 (file)
index 0000000..db22d6f
Binary files /dev/null and b/doc/salome/gui/GEOM/images/surface_from_face_example.png differ
index efdff95118b5804968425b48b56f36189cf8316e..cebd3be5ca225706129f57fe8d0357a95a491d5d 100644 (file)
@@ -16,6 +16,7 @@ geometrical objects as:
 <li>\subpage create_sketcher_page</li>
 <li>\subpage create_3dsketcher_page</li>
 <li>\subpage create_polyline_page</li>
+<li>\subpage create_surface_from_face_page</li>
 <li>\subpage create_vector_page</li>
 <li>\subpage create_plane_page</li>
 <li>\subpage create_lcs_page</li>
diff --git a/doc/salome/gui/GEOM/input/creating_surface_from_face.doc b/doc/salome/gui/GEOM/input/creating_surface_from_face.doc
new file mode 100644 (file)
index 0000000..6034ed5
--- /dev/null
@@ -0,0 +1,27 @@
+/*!
+
+\page create_surface_from_face_page Surface From Face
+
+To create a <b>Surface From Face</B> in the <b>Main Menu</b> select <b>New Entity - > Basic - > Surface From Face</b>
+
+\n This function takes some face as input parameter and creates new
+GEOM_Object, i.e. topological shape by extracting underlying surface
+of the source face and limiting it by the Umin, Umax, Vmin, Vmax
+parameters of the source face (in the parametrical space).
+\n
+\ref restore_presentation_parameters_page "Advanced options".
+
+\n <b>TUI Command:</b> <em>geompy.MakeSurfaceFromFace(theFace)</em>,
+where \em theFace the input face.
+\n <b>Arguments:</b> Name + Object (Face).
+
+\image html surface_from_face1.png "Surface From Face"
+
+\n <b>Example:</b>
+
+\image html surface_from_face_example.png "Original Face (white) and Created Surface"
+
+Our <b>TUI Scripts</b> provide you with useful examples of the use of
+\ref tui_creation_surface "Surface From Face" creation.
+
+*/
index 89be6f64b4bb13c51c72a33057bc4f25f9bc6553..2083bcc461cf3cb4493b01b2c2ca2fc8750c105d 100644 (file)
@@ -38,4 +38,8 @@
 <br><h2>Creation of a Local Coordinate System</h2>
 \tui_script{basic_geom_objs_ex09.py}
 
+\anchor tui_creation_surface
+<br><h2>Creation of a Surface From Face</h2>
+\tui_script{basic_geom_objs_ex10.py}
+
 */
index 1440b1dca55d3eeea2c1a1b3b8aa265a6de43630..72504d151a0e533ad900355cb6a407aabe5f5134 100644 (file)
@@ -2575,6 +2575,17 @@ module GEOM
                            in double      theVMin,
                            in double      theVMax);
 
+    /*!
+     *  \brief Make a surface from a face. This function takes some face as
+     *  input parameter and creates new GEOM_Object, i.e. topological shape
+     *  by extracting underlying surface of the source face and limiting it
+     *  by the Umin, Umax, Vmin, Vmax parameters of the source face (in the
+     *  parametrical space).
+     *  \param theFace the input face.
+     *  \return a newly created face.
+     */
+    GEOM_Object MakeSurfaceFromFace(in GEOM_Object theFace);
+
   };
 
  // # GEOM_IBlocksOperations: 
index f2e64385a43fded67d5f88fd39ea7ae927cf4a78..7a664456296751b096583f40e4918243b4a47a7f 100755 (executable)
@@ -94,6 +94,7 @@ SET( _res_files
   eraseall.png
   extruded_boss.png
   extruded_cut.png
+  facetosurface.png
   faceextension.png
   face_hw.png
   face_vechw.png
diff --git a/resources/facetosurface.png b/resources/facetosurface.png
new file mode 100644 (file)
index 0000000..ecd57cf
Binary files /dev/null and b/resources/facetosurface.png differ
index 79668add1cf4b08310c41def8e5807d3c7522f88..3bb8e56f86c31d7cfe90a2d63bfc0f7c584c7fdb 100755 (executable)
@@ -108,6 +108,7 @@ SET(EntityGUI_HEADERS
   EntityGUI_PolylineDlg.h
   EntityGUI_3DSketcherDlg.h
   EntityGUI_IsolineDlg.h
+  EntityGUI_SurfFromFaceDlg.h
   EntityGUI_SubShapeDlg.h
   EntityGUI_FeatureDetectorDlg.h
   EntityGUI_PictureImportDlg.h
@@ -121,6 +122,7 @@ SET(_moc_HEADERS
   EntityGUI_PolylineDlg.h
   EntityGUI_3DSketcherDlg.h
   EntityGUI_IsolineDlg.h
+  EntityGUI_SurfFromFaceDlg.h
   EntityGUI_SubShapeDlg.h
   EntityGUI_PictureImportDlg.h
   ${FeatureDetectorDlg_moc_h}
@@ -142,6 +144,7 @@ SET(EntityGUI_SOURCES
   EntityGUI_PolylineDlg.cxx
   EntityGUI_3DSketcherDlg.cxx
   EntityGUI_IsolineDlg.cxx
+  EntityGUI_SurfFromFaceDlg.cxx
   EntityGUI_SubShapeDlg.cxx
   EntityGUI_PictureImportDlg.cxx
   ${FeatureDetectorDlg_Sources}
index 95e5f1565291de8638c77c8662733be89872fec9..55d92893026e5cdc5bb0dd81741e2639f9eab2b4 100644 (file)
@@ -55,6 +55,7 @@
 #include "EntityGUI_SketcherDlg.h"        // Sketcher
 #include "EntityGUI_3DSketcherDlg.h"      // Sketcher
 #include "EntityGUI_IsolineDlg.h"         // Isoline
+#include "EntityGUI_SurfFromFaceDlg.h"    // Surface From Face
 #include "EntityGUI_SubShapeDlg.h"        // Method SUBSHAPE
 #include "EntityGUI_FeatureDetectorDlg.h" // Feature Detection
 #include "EntityGUI_PictureImportDlg.h"   // Import Picture in viewer
@@ -106,6 +107,9 @@ bool EntityGUI::OnGUIEvent( int theCommandID, SUIT_Desktop* parent )
   case GEOMOp::OpIsoline:    // ISOLINE
     aDlg = new EntityGUI_IsolineDlg( getGeometryGUI(), parent );
     break;
+  case GEOMOp::OpSurfaceFromFace:    // SURFACE FROM FACE
+    aDlg = new EntityGUI_SurfFromFaceDlg( getGeometryGUI(), parent );
+    break;
   case GEOMOp::OpExplode:    // EXPLODE
     aDlg = new EntityGUI_SubShapeDlg( getGeometryGUI(), parent );
     break;
diff --git a/src/EntityGUI/EntityGUI_SurfFromFaceDlg.cxx b/src/EntityGUI/EntityGUI_SurfFromFaceDlg.cxx
new file mode 100644 (file)
index 0000000..3d217e4
--- /dev/null
@@ -0,0 +1,225 @@
+// Copyright (C) 2007-2014  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, or (at your option) any later version.
+//
+// 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   : EntityGUI_SurfFromFaceDlg.cxx
+
+#include "EntityGUI_SurfFromFaceDlg.h"
+#include <GeometryGUI.h>
+#include <DlgRef.h>
+#include <GEOMBase.h>
+
+#include <SUIT_Session.h>
+#include <SUIT_ResourceMgr.h>
+#include <SalomeApp_Application.h>
+#include <LightApp_SelectionMgr.h>
+
+
+//=================================================================================
+// class    : EntityGUI_SurfFromFaceDlg
+// purpose  : 
+//=================================================================================
+EntityGUI_SurfFromFaceDlg::EntityGUI_SurfFromFaceDlg
+                                           (GeometryGUI     *theGeometryGUI,
+                                            QWidget         *parent,
+                                            bool             modal,
+                                            Qt::WindowFlags  fl)
+  : GEOMBase_Skeleton (theGeometryGUI, parent, modal, fl),
+    myGroup           (0)
+{
+  QPixmap image0(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SURFACE_FROM_FACE")));
+  QPixmap image1(SUIT_Session::session()->resourceMgr()->loadPixmap("GEOM", tr("ICON_SELECT")));
+
+  setWindowTitle(tr("GEOM_SURF_FROM_FACE_TITLE"));
+
+  /***************************************************************/
+
+  mainFrame()->GroupConstructors->setTitle(tr("GEOM_SURF_FROM_FACE"));
+  mainFrame()->RadioButton1->setIcon(image0);
+  mainFrame()->RadioButton2->close();
+  mainFrame()->RadioButton3->close();
+
+  // Construct a group.
+  myGroup = new DlgRef_1Sel(centralWidget());
+  myGroup->GroupBox1->setTitle(tr("GEOM_ARGUMENTS"));
+  myGroup->TextLabel1->setText(tr("GEOM_FACE"));
+  myGroup->PushButton1->setIcon(image1);
+  myGroup->LineEdit1->setReadOnly(true);
+
+  QVBoxLayout* layout = new QVBoxLayout(centralWidget());
+  layout->setMargin(0); layout->setSpacing(6);
+  layout->addWidget(myGroup);
+
+  setHelpFileName("create_surface_from_face_page.html");
+
+  Init();
+}
+
+//=================================================================================
+// function : ~EntityGUI_SurfFromFaceDlg()
+// purpose  : 
+//=================================================================================
+EntityGUI_SurfFromFaceDlg::~EntityGUI_SurfFromFaceDlg()
+{
+}
+
+//=================================================================================
+// function : Init()
+// purpose  :
+//=================================================================================
+void EntityGUI_SurfFromFaceDlg::Init()
+{
+  initName(tr("GEOM_SURF_FROM_FACE_NAME"));
+  showOnlyPreviewControl();
+
+  /* signals and slots connections */
+  connect(myGroup->PushButton1, SIGNAL(clicked()),
+          this,                 SLOT(SetEditCurrentArgument()));
+  connect(myGeomGUI->getApp()->selectionMgr(),
+                                SIGNAL(currentSelectionChanged()),
+          this,                 SLOT(SelectionIntoArgument()));
+  connect(myGeomGUI,            SIGNAL(SignalDeactivateActiveDialog()),
+          this,                 SLOT(DeactivateActiveDialog()));
+  connect(myGeomGUI,            SIGNAL(SignalCloseAllDialogs()),
+          this,                 SLOT(ClickOnCancel()));
+  connect(buttonOk(),           SIGNAL(clicked()), this, SLOT(ClickOnOk()));
+  connect(buttonApply(),        SIGNAL(clicked()), this, SLOT(ClickOnApply()));
+
+  myEditCurrentArgument = myGroup->LineEdit1;
+  myGroup->LineEdit1->setReadOnly(true);
+  SelectionIntoArgument();
+}
+
+//=================================================================================
+// function : SelectionIntoArgument
+// purpose  : Called when selection is changed
+//=================================================================================
+void EntityGUI_SurfFromFaceDlg::SelectionIntoArgument()
+{
+  erasePreview();
+  myEditCurrentArgument->setText("");
+  myFace.nullify();
+
+  GEOM::GeomObjPtr aSelectedObject = getSelected(TopAbs_FACE);
+
+  if (aSelectedObject) {
+    myEditCurrentArgument->setText(GEOMBase::GetName(aSelectedObject.get()));
+    myFace = aSelectedObject;
+  }
+
+  processPreview();
+}
+
+//=================================================================================
+// function : SetEditCurrentArgument()
+// purpose  :
+//=================================================================================
+void EntityGUI_SurfFromFaceDlg::SetEditCurrentArgument()
+{
+  QPushButton* send = (QPushButton*)sender();
+
+  if (send == myGroup->PushButton1) {
+    myEditCurrentArgument->setFocus();
+    SelectionIntoArgument();
+  }
+}
+
+//=================================================================================
+// function : ActivateThisDialog
+// purpose  :
+//=================================================================================
+void EntityGUI_SurfFromFaceDlg::ActivateThisDialog()
+{
+  GEOMBase_Skeleton::ActivateThisDialog();
+  connect(myGeomGUI->getApp()->selectionMgr(),
+                       SIGNAL(currentSelectionChanged()),
+          this,        SLOT(SelectionIntoArgument()));
+  SelectionIntoArgument();
+}
+
+//=================================================================================
+// function : enterEvent()
+// purpose  :
+//=================================================================================
+void EntityGUI_SurfFromFaceDlg::enterEvent (QEvent*)
+{
+  if (!mainFrame()->GroupConstructors->isEnabled())
+    ActivateThisDialog();
+}
+
+//=================================================================================
+// function : createOperation
+// purpose  :
+//=================================================================================
+GEOM::GEOM_IOperations_ptr EntityGUI_SurfFromFaceDlg::createOperation()
+{
+  return myGeomGUI->GetGeomGen()->GetIShapesOperations(getStudyId());
+}
+
+//=================================================================================
+// function : isValid
+// purpose  :
+//=================================================================================
+bool EntityGUI_SurfFromFaceDlg::isValid (QString& msg)
+{
+  return myFace;
+}
+
+//=================================================================================
+// function : execute
+// purpose  :
+//=================================================================================
+bool EntityGUI_SurfFromFaceDlg::execute (ObjectList& objects)
+{
+  GEOM::GEOM_IShapesOperations_var anOper =
+    GEOM::GEOM_IShapesOperations::_narrow(getOperation());
+  GEOM::GEOM_Object_var anObj = anOper->MakeSurfaceFromFace(myFace.get());
+
+  if (!anObj->_is_nil()) {
+    objects.push_back(anObj._retn());
+  }
+
+  return true;
+}
+
+//=================================================================================
+// function : ClickOnOk()
+// purpose  :
+//=================================================================================
+void EntityGUI_SurfFromFaceDlg::ClickOnOk()
+{
+  setIsApplyAndClose(true);
+
+  if (ClickOnApply())
+    ClickOnCancel();
+}
+
+//=================================================================================
+// function : ClickOnApply()
+// purpose  :
+//=================================================================================
+bool EntityGUI_SurfFromFaceDlg::ClickOnApply()
+{
+  if (!onAccept())
+    return false;
+
+  initName();
+
+  return true;
+}
diff --git a/src/EntityGUI/EntityGUI_SurfFromFaceDlg.h b/src/EntityGUI/EntityGUI_SurfFromFaceDlg.h
new file mode 100644 (file)
index 0000000..130a4d2
--- /dev/null
@@ -0,0 +1,75 @@
+// Copyright (C) 2007-2014  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, or (at your option) any later version.
+//
+// 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   : EntityGUI_SurfFromFaceDlg.h
+
+#ifndef ENTITYGUI_SURFFROMFACEDLG_H
+#define ENTITYGUI_SURFFROMFACEDLG_H
+
+
+#include <GEOMBase_Skeleton.h>
+
+class DlgRef_1Sel;
+
+//=================================================================================
+// class    : EntityGUI_SurfFromFaceDlg
+// purpose  :
+//=================================================================================
+class EntityGUI_SurfFromFaceDlg : public GEOMBase_Skeleton
+{ 
+  Q_OBJECT
+
+public:
+
+  EntityGUI_SurfFromFaceDlg (GeometryGUI     *theGeometryGUI,
+                             QWidget         *parent = 0,
+                             bool             modal  = false,
+                             Qt::WindowFlags  fl     = 0);
+
+  ~EntityGUI_SurfFromFaceDlg();
+
+protected:
+  // redefined from GEOMBase_Helper
+  virtual GEOM::GEOM_IOperations_ptr createOperation();
+  virtual bool                       isValid( QString& );
+  virtual bool                       execute( ObjectList& );
+
+private:
+
+  void                               Init();
+  void                               enterEvent( QEvent* );
+
+private:
+
+  DlgRef_1Sel                       *myGroup;
+  GEOM::GeomObjPtr                   myFace;
+
+private slots:
+
+  void                               ClickOnOk();
+  bool                               ClickOnApply();
+  void                               SelectionIntoArgument();
+  void                               SetEditCurrentArgument();
+  void                               ActivateThisDialog();
+
+};
+
+#endif // ENTITYGUI_SURFFROMFACEDLG_H
index 2e5d49e1e800e5e31ee8dff650aa8e559827ca3e..67ed0460e28520fc1c8de5cb1b472839aad0e807 100644 (file)
             <source>ICON_VERTEX_MARKER_13</source>
             <translation>marker_13.png</translation>
         </message>
+        <message>
+            <source>ICON_SURFACE_FROM_FACE</source>
+            <translation>facetosurface.png</translation>
+        </message>
         <message>
             <source>ICO_ARC</source>
             <translation>arc.png</translation>
             <source>ICO_ISOLINE_V</source>
             <translation>isoline_v.png</translation>
         </message>
+        <message>
+            <source>ICO_SURFACE_FROM_FACE</source>
+            <translation>facetosurface.png</translation>
+        </message>
         <message>
             <source>ICO_SOLID</source>
             <translation>build_solid.png</translation>
index 0ec8db3291d04a285c5f1fcf1e4f7f82ddb5b81c..6f80399afc03c11140c1465f6f267a4db40b94e1 100644 (file)
@@ -2996,6 +2996,10 @@ Please, select face, shell or solid and try again</translation>
         <source>MEN_ISOLINE</source>
         <translation>Isoline</translation>
     </message>
+    <message>
+        <source>MEN_SURFACE_FROM_FACE</source>
+        <translation>Surface From Face</translation>
+    </message>
     <message>
         <source>MEN_SOLID</source>
         <translation>Solid</translation>
@@ -3880,6 +3884,10 @@ Please, select face, shell or solid and try again</translation>
         <source>STB_ISOLINE</source>
         <translation>Create U- or V-Isoline</translation>
     </message>
+    <message>
+        <source>STB_SURFACE_FROM_FACE</source>
+        <translation>Create a Surface From Face</translation>
+    </message>
     <message>
         <source>STB_SOLID</source>
         <translation>Build a solid</translation>
@@ -4444,6 +4452,10 @@ Please, select face, shell or solid and try again</translation>
         <source>TOP_ISOLINE</source>
         <translation>Isoline</translation>
     </message>
+    <message>
+        <source>TOP_SURFACE_FROM_FACE</source>
+        <translation>Surface From Face</translation>
+    </message>
     <message>
         <source>TOP_SOLID</source>
         <translation>Build solid</translation>
@@ -7053,4 +7065,19 @@ Do you want to create new material?</translation>
         <translation>ExtendedFace</translation>
     </message>
 </context>
+<context>
+    <name>EntityGUI_SurfFromFaceDlg</name>
+    <message>
+        <source>GEOM_SURF_FROM_FACE_TITLE</source>
+        <translation>Surface From Face Construction</translation>
+    </message>
+    <message>
+        <source>GEOM_SURF_FROM_FACE</source>
+        <translation>Surface From Face</translation>
+    </message>
+    <message>
+        <source>GEOM_SURF_FROM_FACE_NAME</source>
+        <translation>SurfaceFromFace</translation>
+    </message>
+</context>
 </TS>
index 76af3e5c6fea2b432d3e13acc2c195e0892e58e4..be77999a921eca992d6c7e782cee09108a7f5c7e 100644 (file)
@@ -553,6 +553,7 @@ void GeometryGUI::OnGUIEvent( int id, const QVariant& theParam )
   case GEOMOp::Op3dSketcher:         // MENU ENTITY - 3D SKETCHER
   case GEOMOp::OpIsoline:            // MENU BASIC  - ISOLINE
   case GEOMOp::OpExplode:            // MENU ENTITY - EXPLODE
+  case GEOMOp::OpSurfaceFromFace:    // MENU ENTITY - SURFACE FROM FACE
 #ifdef WITH_OPENCV
   case GEOMOp::OpFeatureDetect:      // MENU ENTITY - FEATURE DETECTION
 #endif
@@ -901,6 +902,7 @@ void GeometryGUI::initialize( CAM_Application* app )
   createGeomAction( GEOMOp::OpPlane,      "PLANE" );
   createGeomAction( GEOMOp::OpLCS,        "LOCAL_CS" );
   createGeomAction( GEOMOp::OpOriginAndVectors, "ORIGIN_AND_VECTORS" );
+  createGeomAction( GEOMOp::OpSurfaceFromFace,  "SURFACE_FROM_FACE" );
 
   createGeomAction( GEOMOp::OpBox,        "BOX" );
   createGeomAction( GEOMOp::OpCylinder,   "CYLINDER" );
@@ -932,7 +934,6 @@ void GeometryGUI::initialize( CAM_Application* app )
 
   createGeomAction( GEOMOp::Op2dSketcher,  "SKETCH" );
   createGeomAction( GEOMOp::Op3dSketcher,  "3DSKETCH" );
-  createGeomAction( GEOMOp::OpIsoline,     "ISOLINE" );
   createGeomAction( GEOMOp::OpExplode,     "EXPLODE" );
 #ifdef WITH_OPENCV
   createGeomAction( GEOMOp::OpFeatureDetect,"FEATURE_DETECTION" );
@@ -1111,6 +1112,7 @@ void GeometryGUI::initialize( CAM_Application* app )
   createMenu( GEOMOp::Op2dPolylineEditor, basicId, -1 );
   createMenu( GEOMOp::Op3dSketcher,       basicId, -1 );
   createMenu( GEOMOp::OpIsoline,          basicId, -1 );
+  createMenu( GEOMOp::OpSurfaceFromFace, basicId, -1 );
   createMenu( separator(),                basicId, -1 );
   createMenu( GEOMOp::OpVector,           basicId, -1 );
   createMenu( GEOMOp::OpPlane,            basicId, -1 );
@@ -1322,6 +1324,7 @@ void GeometryGUI::initialize( CAM_Application* app )
   createTool( GEOMOp::Op2dPolylineEditor, basicTbId ); 
   createTool( GEOMOp::Op3dSketcher,       basicTbId ); //rnc
   createTool( GEOMOp::OpIsoline,          basicTbId );
+  createTool( GEOMOp::OpSurfaceFromFace,  basicTbId );
   createTool( GEOMOp::OpPlane,            basicTbId );
   createTool( GEOMOp::OpLCS,              basicTbId );
   createTool( GEOMOp::OpOriginAndVectors, basicTbId );
index ac13135cf9adf25ea7d2410c628acb0a7b948f2e..9a1e4fd40032c3b7ae09b575aae3d54405e865b3 100644 (file)
@@ -94,6 +94,7 @@ namespace GEOMOp {
     OpLCS                 = 3008,   // MENU NEW ENTITY - BASIC - LOCAL COORDINATE SYSTEM
     OpOriginAndVectors    = 3009,   // MENU NEW ENTITY - BASIC - ORIGIN AND BASE VECTORS
     OpIsoline             = 3010,   // MENU NEW ENTITY - BASIC - ISOLINE
+    OpSurfaceFromFace     = 3011,   // MENU NEW ENTITY - BASIC - SURFACE FROM FACE
     // PrimitiveGUI ----------------//--------------------------------
     OpBox                 = 3100,   // MENU NEW ENTITY - PRIMITIVES - BOX
     OpCylinder            = 3101,   // MENU NEW ENTITY - PRIMITIVES - CYLINDER
index ce0fa360ffcce3ba1cd193ca4d5594eb913f120b..a68e3dbc466385219c317fb5e0bb0d5e04cf6b5d 100644 (file)
@@ -4921,3 +4921,64 @@ Handle(GEOM_Object) GEOMImpl_IShapesOperations::ExtendFace
 
   return aResFace;
 }
+
+//=======================================================================
+//function : MakeSurfaceFromFace
+//purpose  :
+//=======================================================================
+Handle(GEOM_Object) GEOMImpl_IShapesOperations::MakeSurfaceFromFace
+                                      (const Handle(GEOM_Object) &theFace)
+{
+  SetErrorCode(KO);
+
+  if (theFace.IsNull()) {
+    return NULL;
+  }
+
+  //Add a new Face object
+  Handle(GEOM_Object) aResFace = GetEngine()->AddObject(GetDocID(), GEOM_FACE);
+
+  //Add a new Vector function
+  Handle(GEOM_Function) aFunction =
+    aResFace->AddFunction(GEOMImpl_ShapeDriver::GetID(), SURFACE_FROM_FACE);
+
+  //Check if the function is set correctly
+  if (aFunction->GetDriverGUID() != GEOMImpl_ShapeDriver::GetID()) {
+    return NULL;
+  }
+
+  GEOMImpl_IShapeExtend aCI (aFunction);
+
+  Handle(GEOM_Function) aFace = theFace->GetLastFunction();
+
+  if (aFace.IsNull()) {
+    return NULL;
+  }
+
+  aCI.SetShape(aFace);
+
+  //Compute the Face value
+  try {
+    OCC_CATCH_SIGNALS;
+    if (!GetSolver()->ComputeFunction(aFunction)) {
+      SetErrorCode("Shape 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)
+             << aResFace  << " = geompy.MakeSurfaceFromFace("
+             << theFace << ")";
+
+  SetErrorCode(OK);
+
+  return aResFace;
+}
index 22b3211ecdd0b17732c9d1692cfb9140afc027be..025646331d6bf5b0c2db1dc46ac6e4b00e16cbcc 100644 (file)
@@ -396,6 +396,9 @@ class GEOMImpl_IShapesOperations : public GEOM_IOperations
                                        const Standard_Real        theVMin,
                                        const Standard_Real        theVMax);
 
+  Standard_EXPORT Handle(GEOM_Object)
+                   MakeSurfaceFromFace(const Handle(GEOM_Object) &theFace);
+
  private:
   Handle(GEOM_Object) MakeShape (std::list<Handle(GEOM_Object)>      theShapes,
                                  const Standard_Integer         theObjectType,
index 868a33bd228e9890cdfda1b3952811d23004758b..c220237e94ff3e67600645cf6d2f271505f26c8a 100644 (file)
@@ -603,6 +603,47 @@ Standard_Integer GEOMImpl_ShapeDriver::Execute(TFunction_Logbook& log) const
       aShape = ExtendFace(aFace, aSE.GetUMin(), aSE.GetUMax(),
                           aSE.GetVMin(), aSE.GetVMax()); 
     }
+  } else if (aType == SURFACE_FROM_FACE) {
+#ifdef RESULT_TYPE_CHECK
+    anExpectedType = TopAbs_FACE;
+#endif
+
+    GEOMImpl_IShapeExtend aSE (aFunction);
+    Handle(GEOM_Function) aRefFace   = aSE.GetShape();
+    TopoDS_Shape          aShapeFace = aRefFace->GetValue();
+
+    if (aShapeFace.ShapeType() == TopAbs_FACE) {
+      TopoDS_Face          aFace    = TopoDS::Face(aShapeFace);
+      Handle(Geom_Surface) aSurface = BRep_Tool::Surface(aFace);
+
+      if (aSurface.IsNull() == Standard_False) {
+        Handle(Standard_Type) aType = aSurface->DynamicType();
+        Standard_Real         aU1;
+        Standard_Real         aU2;
+        Standard_Real         aV1;
+        Standard_Real         aV2;
+
+         // Get U, V bounds of the face.
+        aFace.Orientation(TopAbs_FORWARD);
+        ShapeAnalysis::GetFaceUVBounds(aFace, aU1, aU2, aV1, aV2);
+
+        // Get the surface of original type
+        while (aType == STANDARD_TYPE(Geom_RectangularTrimmedSurface)) {
+          Handle(Geom_RectangularTrimmedSurface) aTrSurface =
+            Handle(Geom_RectangularTrimmedSurface)::DownCast(aSurface);
+
+          aSurface = aTrSurface->BasisSurface();
+          aType    = aSurface->DynamicType();
+        }
+
+        const Standard_Real     aTol = BRep_Tool::Tolerance(aFace);
+        BRepBuilderAPI_MakeFace aMF(aSurface, aU1, aU2, aV1, aV2, aTol);
+
+        if (aMF.IsDone()) {
+          aShape = aMF.Shape();
+        }
+      }
+    }
   }
   else {
   }
@@ -1538,6 +1579,14 @@ GetCreationInformation(std::string&             theOperationName,
     AddParam(theParams, "VMax", aSE.GetVMax());
     break;
   }
+  case SURFACE_FROM_FACE:
+  {
+    GEOMImpl_IShapeExtend aSE (function);
+
+    theOperationName = "SURFACE_FROM_FACE";
+    AddParam(theParams, "Face", aSE.GetShape());
+    break;
+  }
   default:
     return false;
   }
index 293deb108cea136999c198c29bcd3f94248d9c8c..d79349d3982a085c6cbcff3b1988bc0a2d68a669 100644 (file)
 #define FACE_FROM_SURFACE   15
 #define EDGE_UV             16
 #define FACE_UV             17
+#define SURFACE_FROM_FACE   18
 
 
 #define ARCHIMEDE_TYPE 1
index b2fae9ae4c24137d1eab36fc1042551ba0c3ad07..4e619573cb55f31622667cc07a8e3ba3ab22cbd1 100644 (file)
@@ -2000,3 +2000,33 @@ GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::ExtendFace
 
   return GetObject(aNewFace);
 }
+
+//=============================================================================
+/*!
+ *  MakeSurfaceFromFace
+ */
+//=============================================================================
+GEOM::GEOM_Object_ptr GEOM_IShapesOperations_i::MakeSurfaceFromFace
+                                  (GEOM::GEOM_Object_ptr theFace)
+{
+  GEOM::GEOM_Object_var aGEOMObject;
+
+  //Set a not done flag
+  GetOperations()->SetNotDone();
+
+  //Get the reference object
+  Handle(GEOM_Object) aFace = GetObjectImpl(theFace);
+
+  if (aFace.IsNull()) {
+    return aGEOMObject._retn();
+  }
+
+  //Get Shapes in place of aShapeWhat
+  Handle(GEOM_Object) aNewFace = GetOperations()->MakeSurfaceFromFace(aFace);
+
+  if (!GetOperations()->IsDone() || aNewFace.IsNull()) {
+    return aGEOMObject._retn();
+  }
+
+  return GetObject(aNewFace);
+}
index 72ac7b07451427c64bc44ca1341f49f69f66bd1f..7587a6a2d190d9fdb55ff0c1441c0bab76a02d8d 100644 (file)
@@ -284,6 +284,8 @@ class GEOM_I_EXPORT GEOM_IShapesOperations_i :
                                    CORBA::Double         theVMin,
                                    CORBA::Double         theVMax);
 
+  GEOM::GEOM_Object_ptr MakeSurfaceFromFace(GEOM::GEOM_Object_ptr theFace);
+
   ::GEOMImpl_IShapesOperations* GetOperations()
   { return (::GEOMImpl_IShapesOperations*)GetImpl(); }
 };
index 9766171a1f5fbed2e20ccf9708740c6404c7b02b..cb9a9720a35dc916a8f425c5a43d94e16a879ad6 100644 (file)
@@ -257,6 +257,7 @@ def TestAll (geompy, math):
   ProjOnWire  = geompy.MakeProjectionOnWire(p0, Wire)
   ExtEdge     = geompy.ExtendEdge(Edge1, -0.3, 1.3)
   ExtFace     = geompy.ExtendFace(Face5, -0.3, 1.3, -0.1, 1.1)
+  Surface     = geompy.MakeSurfaceFromFace(Face5)
 
   #IDList for Fillet/Chamfer
   prism_edges = geompy.ExtractShapes(Prism, geompy.ShapeType["EDGE"], True)
@@ -473,6 +474,7 @@ def TestAll (geompy, math):
   id_ProjOnWire  = geompy.addToStudy(ProjOnWire[1], "ProjOnWire")
   id_ExtEdge     = geompy.addToStudy(ExtEdge,       "ExtendedEdge")
   id_ExtFace     = geompy.addToStudy(ExtFace,       "ExtendedFace")
+  id_Surface     = geompy.addToStudy(Surface,       "Surface From Face")
 
   id_Fillet   = geompy.addToStudy(Fillet,   "Fillet")
   id_Fillet2  = geompy.addToStudy(Fillet2,  "Fillet2")
index 46cfb23a9384e34afab345ee2f65a16815555bb2..a50216635d49227f13e461e0a4cfbb4ec0618636 100644 (file)
@@ -5774,6 +5774,39 @@ class geomBuilder(object, GEOM._objref_GEOM_Gen):
             self._autoPublish(anObj, theName, "face")
             return anObj
 
+        ## This function takes some face as input parameter and creates new
+        #  GEOM_Object, i.e. topological shape by extracting underlying surface
+        #  of the source face and limiting it by the Umin, Umax, Vmin, Vmax
+        #  parameters of the source face (in the parametrical space).
+        #  @param theFace the input face.
+        #  @param theName Object name; when specified, this parameter is used
+        #         for result publication in the study. Otherwise, if automatic
+        #         publication is switched on, default value is used for result name.
+        #  @return New GEOM.GEOM_Object, containing the created face.
+        #
+        #  @ref tui_creation_surface "Example"
+        @ManageTransactions("ShapesOp")
+        def MakeSurfaceFromFace(self, theFace, theName=None):
+            """
+            This function takes some face as input parameter and creates new
+            GEOM_Object, i.e. topological shape by extracting underlying surface
+            of the source face and limiting it by the Umin, Umax, Vmin, Vmax
+            parameters of the source face (in the parametrical space).
+
+            Parameters:
+                theFace the input face.
+                theName Object name; when specified, this parameter is used
+                        for result publication in the study. Otherwise, if automatic
+                        publication is switched on, default value is used for result name.
+
+            Returns:
+                New GEOM.GEOM_Object, containing the created face.
+            """
+            anObj = self.ShapesOp.MakeSurfaceFromFace(theFace)
+            RaiseIfFailed("MakeSurfaceFromFace", self.ShapesOp)
+            self._autoPublish(anObj, theName, "surface")
+            return anObj
+
         # end of l4_obtain
         ## @}