]> SALOME platform Git repositories - modules/geom.git/commitdiff
Salome HOME
bos #29484 Add a test service to build tesselation on a shape
authorvsr <vsr@opencascade.com>
Tue, 19 Apr 2022 16:54:37 +0000 (19:54 +0300)
committervsr <vsr@opencascade.com>
Wed, 20 Apr 2022 08:19:03 +0000 (11:19 +0300)
12 files changed:
idl/GEOM_Gen.idl
src/GEOMImpl/CMakeLists.txt
src/GEOMImpl/GEOMImpl_Gen.cxx
src/GEOMImpl/GEOMImpl_Gen.hxx
src/GEOMImpl/GEOMImpl_ITestOperations.cxx [new file with mode: 0644]
src/GEOMImpl/GEOMImpl_ITestOperations.hxx [new file with mode: 0644]
src/GEOM_I/CMakeLists.txt
src/GEOM_I/GEOM_Gen_i.cc
src/GEOM_I/GEOM_Gen_i.hh
src/GEOM_I/GEOM_ITestOperations_i.cc [new file with mode: 0644]
src/GEOM_I/GEOM_ITestOperations_i.hh [new file with mode: 0644]
src/GEOM_SWIG/geomBuilder.py

index c9b0664e07d56b4c30129c043ec4ac3a717aa21c..b28c461ec77ecfabf20f3e374e4db94889d56af4 100644 (file)
@@ -4890,7 +4890,25 @@ module GEOM
     long GetNbSubShapes(in GEOM_Object shape, in short fieldDim);
   };
 
- // # GEOM_Gen:
+  // # GEOM_ITestOperations:
+  /*!
+   *  \brief Interface for testing operations.
+   */
+  interface GEOM_ITestOperations : GEOM_IOperations
+  {
+    /*!
+     *  \brief Build a mesh on the given shape.
+     *  \param shape is a source object
+     *  \param linearDeflection is a linear deflection
+     *  \param isRelative says if given value of deflection is relative to shape's bounding box
+     *  \param angularDeflection is an angular deflection for edges in radians
+     *  \return true in case of success; otherwise false.
+     */
+    boolean Tesselate(in GEOM_Object shape, in double linearDeflection,
+                      in boolean isRelative, in double angularDeflection);
+  };
+
+  // # GEOM_Gen:
   /*!
    *  \brief Interface to access other GEOM interfaces.
    *
@@ -5016,6 +5034,7 @@ module GEOM
     GEOM_IBlocksOperations    GetIBlocksOperations   () raises (SALOME::SALOME_Exception);
     GEOM_IGroupOperations     GetIGroupOperations    () raises (SALOME::SALOME_Exception);
     GEOM_IFieldOperations     GetIFieldOperations    () raises (SALOME::SALOME_Exception);
+    GEOM_ITestOperations      GetITestOperations     () raises (SALOME::SALOME_Exception);
 
     GEOM_IOperations GetPluginOperations (in string theLibName) raises (SALOME::SALOME_Exception);
 
index fc7e092915f4f499c2a8d3366eae4c2d675e9aa5..96fdde01f3d8ba5a807bb24fe79a7e21b94d99ed 100644 (file)
@@ -70,6 +70,7 @@ SET(GEOMImpl_HEADERS
   GEOMImpl_IGroupOperations.hxx
   GEOMImpl_IFieldOperations.hxx
   GEOMImpl_IBaseIEOperations.hxx
+  GEOMImpl_ITestOperations.hxx
   GEOMImpl_IGlue.hxx
   GEOMImpl_PointDriver.hxx
   GEOMImpl_IPoint.hxx
@@ -198,6 +199,7 @@ SET(GEOMImpl_SOURCES
   GEOMImpl_IGroupOperations.cxx
   GEOMImpl_IFieldOperations.cxx
   GEOMImpl_IBaseIEOperations.cxx
+  GEOMImpl_ITestOperations.cxx
   GEOMImpl_IPolyline2D.cxx
   GEOMImpl_ITransferData.cxx
   GEOMImpl_Gen.cxx
index aac8f9f460f4a7cbecc0a4cb4c0d65a83395bbbb..99f93be005689e3b49bfde090c2e65c590e46aec 100644 (file)
@@ -182,6 +182,7 @@ GEOMImpl_Gen::GEOMImpl_Gen()
    _MeasureOperations = new GEOMImpl_IMeasureOperations( this );
    _GroupOperations = new GEOMImpl_IGroupOperations( this );
    _FieldOperations = new GEOMImpl_IFieldOperations( this );
+   _TestOperations = new GEOMImpl_ITestOperations( this );
 }
 
 //=============================================================================
@@ -338,3 +339,13 @@ GEOMImpl_IFieldOperations* GEOMImpl_Gen::GetIFieldOperations()
 {
   return _FieldOperations;
 }
+
+//=============================================================================
+/*!
+ * GetITestOperations
+ */
+//=============================================================================
+GEOMImpl_ITestOperations* GEOMImpl_Gen::GetITestOperations()
+{
+  return _TestOperations;
+}
index 517922d5475e8d2b31d65675f8174ba15d8a96f1..4fad2a9d9dabbfe8f88f097b777128fe33cbfb57 100644 (file)
@@ -40,6 +40,7 @@
 #include "GEOMImpl_IMeasureOperations.hxx"
 #include "GEOMImpl_IGroupOperations.hxx"
 #include "GEOMImpl_IFieldOperations.hxx"
+#include "GEOMImpl_ITestOperations.hxx"
 #include "GEOM_Engine.hxx"
 
 class GEOMIMPL_EXPORT GEOMImpl_Gen : public GEOM_Engine
@@ -74,6 +75,8 @@ class GEOMIMPL_EXPORT GEOMImpl_Gen : public GEOM_Engine
 
   GEOMImpl_IFieldOperations* GetIFieldOperations();
 
+  GEOMImpl_ITestOperations* GetITestOperations();
+
  private:
 
   GEOMImpl_IBasicOperations*     _BasicOperations;
@@ -89,6 +92,7 @@ class GEOMIMPL_EXPORT GEOMImpl_Gen : public GEOM_Engine
   GEOMImpl_IMeasureOperations*   _MeasureOperations;
   GEOMImpl_IGroupOperations*     _GroupOperations;
   GEOMImpl_IFieldOperations*     _FieldOperations;
+  GEOMImpl_ITestOperations*      _TestOperations;
 };
 
 #endif
diff --git a/src/GEOMImpl/GEOMImpl_ITestOperations.cxx b/src/GEOMImpl/GEOMImpl_ITestOperations.cxx
new file mode 100644 (file)
index 0000000..1fc7098
--- /dev/null
@@ -0,0 +1,108 @@
+// Copyright (C) 2007-2021  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, 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
+//
+
+#include <GEOMImpl_ITestOperations.hxx>
+
+#include <BRepBndLib.hxx>
+#include <BRepBuilderAPI_Copy.hxx>
+#include <BRepMesh_IncrementalMesh.hxx>
+#include <BRepTools.hxx>
+#include <Bnd_Box.hxx>
+#include <utilities.h>
+
+#ifndef MAX2
+#define MAX2(X, Y)    (Abs(X) > Abs(Y) ? Abs(X) : Abs(Y))
+#endif
+#ifndef MAX3
+#define MAX3(X, Y, Z) (MAX2(MAX2(X, Y), Z))
+#endif
+
+//=============================================================================
+/*!
+ *   constructor:
+ */
+//=============================================================================
+GEOMImpl_ITestOperations::GEOMImpl_ITestOperations(GEOM_Engine* theEngine)
+: GEOM_IOperations(theEngine)
+{
+  MESSAGE("GEOMImpl_ITestOperations::GEOMImpl_ITestOperations");
+}
+
+//=============================================================================
+/*!
+ *  destructor
+ */
+//=============================================================================
+GEOMImpl_ITestOperations::~GEOMImpl_ITestOperations()
+{
+  MESSAGE("GEOMImpl_ITestOperations::~GEOMImpl_ITestOperations");
+}
+
+
+//=============================================================================
+/*!
+ *  \brief Build a mesh on (a copy of ) the given shape.
+ *
+ *  This test function is aimed for checking performance of OCCT tesselation
+ *  algorithm on particlar geometrical shapes.
+ *
+ *  \param theShape is a source object
+ *  \param theLinearDeflection is a value of deflection coefficient
+ *  \param theIsRelative says if given value of deflection is relative to shape's bounding box
+ *  \param theAngularDeflection is a angular deflection for edges in radians
+ *  \return \c true in case of success; otherwise \c false.
+ */
+//=============================================================================
+bool GEOMImpl_ITestOperations::Tesselate(Handle(GEOM_Object) theShape,
+                                        double theLinearDeflection,
+                                        bool theIsRelative,
+                                        double theAngularDeflection)
+{
+  // ATTENTION!
+  // We don't need results of this method to be present in the data tree;
+  // so we don't need a driver for it.
+
+  // reset error code
+  SetErrorCode(KO);
+  // create a copy of the source shape
+  TopoDS_Shape aShape = BRepBuilderAPI_Copy(theShape->GetValue()).Shape();
+  // use default deflection if necessary
+  if (theLinearDeflection <= 0)
+    theLinearDeflection = 0.001;
+  // compute absolute deflection if necessary: 0.001
+  if (theIsRelative) {
+    Standard_Real aXmin, aYmin, aZmin, aXmax, aYmax, aZmax;
+    Bnd_Box bndBox;
+    BRepBndLib::Add(aShape, bndBox);
+    bndBox.Get(aXmin, aYmin, aZmin, aXmax, aYmax, aZmax);
+    theLinearDeflection = MAX3(aXmax-aXmin, aYmax-aYmin, aZmax-aZmin) * theLinearDeflection * 4;
+  }
+  // use default deviation angle if necessary: 20 degrees
+  if (theAngularDeflection <= 0)
+    theAngularDeflection = 20. * M_PI / 180.;
+  // compute triangulation
+  BRepTools::Clean(aShape);
+  BRepMesh_IncrementalMesh aMesh(aShape, theLinearDeflection, Standard_False, theAngularDeflection);
+  // set OK status and return
+  SetErrorCode(OK);
+  return true;
+}
diff --git a/src/GEOMImpl/GEOMImpl_ITestOperations.hxx b/src/GEOMImpl/GEOMImpl_ITestOperations.hxx
new file mode 100644 (file)
index 0000000..cb94e13
--- /dev/null
@@ -0,0 +1,42 @@
+// Copyright (C) 2007-2021  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, 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
+//
+
+#ifndef _GEOMImpl_ITestOperations_HXX_
+#define _GEOMImpl_ITestOperations_HXX_
+
+#include "Utils_SALOME_Exception.hxx"
+#include "GEOM_IOperations.hxx"
+#include "GEOM_Engine.hxx"
+#include "GEOM_Object.hxx"
+
+class GEOMImpl_ITestOperations : public GEOM_IOperations {
+ public:
+  Standard_EXPORT GEOMImpl_ITestOperations(GEOM_Engine* theEngine);
+  Standard_EXPORT ~GEOMImpl_ITestOperations();
+
+  Standard_EXPORT bool Tesselate(Handle(GEOM_Object) theShape,
+                                double theLinearDeflection,
+                                bool theIsRelative,
+                                double theAngularDeflection);
+};
+
+#endif // _GEOMImpl_ITestOperations_HXX_
index 35c1e58c2922067f4d558dc036405cb98c6a3348..bd9d4b94b115cdb3e6d54b745124f672a4adbc1f 100644 (file)
@@ -77,6 +77,7 @@ SET(GEOMEngine_HEADERS
   GEOM_ITransformOperations_i.hh
   GEOM_IMeasureOperations_i.hh
   GEOM_IGroupOperations_i.hh
+  GEOM_ITestOperations_i.hh
   GEOM_Gen_i.hh
   GEOM_Gen_Session_i.hh
   GEOM_Gen_No_Session_i.hh
@@ -104,6 +105,7 @@ SET(GEOMEngine_SOURCES
   GEOM_IMeasureOperations_i.cc
   GEOM_IGroupOperations_i.cc
   GEOM_IFieldOperations_i.cc
+  GEOM_ITestOperations_i.cc
   GEOM_Gen_i.cc
   GEOM_Gen_Session_i.cc
   GEOM_Gen_No_Session_i.cc
index 32f638ba0a17e0f5e6f6cdd1a8336ec22cc56813..00c865c457e1fc682fcd6b861b3ddd6423d297b7 100644 (file)
@@ -2466,6 +2466,25 @@ GEOM::GEOM_IFieldOperations_ptr GEOM_Gen_i::GetIFieldOperations()
   return operations._retn();
 }
 
+//============================================================================
+// function : GetITestOperations
+// purpose  :
+//============================================================================
+GEOM::GEOM_ITestOperations_ptr GEOM_Gen_i::GetITestOperations()
+{
+  Unexpect aCatch(SALOME_SalomeException);
+  MESSAGE( "GEOM_Gen_i::GetITestOperations" );
+
+  GEOM::GEOM_Gen_ptr engine = _this();
+
+  GEOM_ITestOperations_i* aServant =
+    new GEOM_ITestOperations_i(_poa, engine, _impl->GetITestOperations());
+
+  // activate the CORBA servant
+  GEOM::GEOM_ITestOperations_var operations = aServant->_this();
+  return operations._retn();
+}
+
 //============================================================================
 // function : GetPluginOperations
 // purpose  :
index cc1abbad416bd3ae6ecc1d0fba98be6b3c94ad1d..a9b8141c259b2b90c0c398267d901d122b969847 100644 (file)
@@ -51,6 +51,7 @@
 #include "GEOM_IMeasureOperations_i.hh"
 #include "GEOM_IGroupOperations_i.hh"
 #include "GEOM_IFieldOperations_i.hh"
+#include "GEOM_ITestOperations_i.hh"
 #include "GEOMUtils.hxx"
 
 #include <TopTools_IndexedMapOfShape.hxx>
@@ -254,6 +255,10 @@ class GEOM_I_EXPORT GEOM_Gen_i : public POA_GEOM::GEOM_Gen, public Engines_Compo
   virtual GEOM::GEOM_IFieldOperations_ptr GetIFieldOperations()
     ;
 
+  //Returns a pointer to TestOperations interface
+  virtual GEOM::GEOM_ITestOperations_ptr GetITestOperations()
+    ;
+
   //Returns a pointer to corresponding plugin operations interface
   virtual GEOM::GEOM_IOperations_ptr GetPluginOperations (const char* theLibName)
     ;
diff --git a/src/GEOM_I/GEOM_ITestOperations_i.cc b/src/GEOM_I/GEOM_ITestOperations_i.cc
new file mode 100644 (file)
index 0000000..83680d3
--- /dev/null
@@ -0,0 +1,75 @@
+// Copyright (C) 2007-2021  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, 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
+//
+
+#include "GEOM_ITestOperations_i.hh"
+
+#include "utilities.h"
+#include "OpUtil.hxx"
+#include "Utils_ExceptHandlers.hxx"
+
+#include "GEOM_Engine.hxx"
+#include "GEOM_Object.hxx"
+
+//=============================================================================
+/*!
+ *   constructor:
+ */
+//=============================================================================
+GEOM_ITestOperations_i::GEOM_ITestOperations_i (PortableServer::POA_ptr thePOA,
+                                               GEOM::GEOM_Gen_ptr theEngine,
+                                               ::GEOMImpl_ITestOperations* theImpl)
+  :GEOM_IOperations_i(thePOA, theEngine, theImpl)
+{
+  MESSAGE("GEOM_ITestOperations_i::GEOM_ITestOperations_i");
+}
+
+//=============================================================================
+/*!
+ *  destructor
+ */
+//=============================================================================
+GEOM_ITestOperations_i::~GEOM_ITestOperations_i()
+{
+  MESSAGE("GEOM_ITestOperations_i::~GEOM_ITestOperations_i");
+}
+
+
+//=============================================================================
+/*!
+ *  Tesselate
+ */
+//=============================================================================
+CORBA::Boolean GEOM_ITestOperations_i::Tesselate(GEOM::GEOM_Object_ptr theShape,
+                                                CORBA::Double theLinearDeflection,
+                                                CORBA::Boolean theIsRelative,
+                                                CORBA::Double theAngularDeflection)
+{
+  // Set a not done flag
+  GetOperations()->SetNotDone();
+
+  // Get the source object
+  Handle(::GEOM_Object) aShape = GetObjectImpl(theShape);
+  if (aShape.IsNull()) return false;
+
+  // Tesselate
+  return GetOperations()->Tesselate(aShape, theLinearDeflection, theIsRelative, theAngularDeflection);
+}
diff --git a/src/GEOM_I/GEOM_ITestOperations_i.hh b/src/GEOM_I/GEOM_ITestOperations_i.hh
new file mode 100644 (file)
index 0000000..4da6696
--- /dev/null
@@ -0,0 +1,54 @@
+// Copyright (C) 2007-2021  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, 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
+//
+
+#ifndef _GEOM_ITestOperations_i_HeaderFile
+#define _GEOM_ITestOperations_i_HeaderFile
+
+#include "GEOMImpl_Gen.hxx"
+
+#include <SALOMEconfig.h>
+
+#include CORBA_SERVER_HEADER(GEOM_Gen)
+#include "GEOM_IOperations_i.hh"
+#include "GEOM_Object_i.hh"
+
+#include "GEOMImpl_ITestOperations.hxx"
+
+class GEOM_I_EXPORT GEOM_ITestOperations_i :
+    public virtual POA_GEOM::GEOM_ITestOperations,
+    public virtual GEOM_IOperations_i
+{
+ public:
+   GEOM_ITestOperations_i(PortableServer::POA_ptr thePOA,
+                          GEOM::GEOM_Gen_ptr theEngine,
+                          ::GEOMImpl_ITestOperations* theImpl);
+   ~GEOM_ITestOperations_i();
+
+   CORBA::Boolean Tesselate(GEOM::GEOM_Object_ptr theShape,
+                            CORBA::Double theLinearDeflection,
+                            CORBA::Boolean theIsRelative,
+                            CORBA::Double theAngularDeflection);
+
+   ::GEOMImpl_ITestOperations* GetOperations() { return (::GEOMImpl_ITestOperations*)GetImpl(); }
+};
+
+#endif // _GEOM_ITestOperations_i_HeaderFile
index efb57f1270a91ac59e0246edb2c25a66799ce205..6f3f010d61addce619abc40a8990d3ebe4a99dfa 100644 (file)
 ##   @}
 ##   @defgroup l2_measure       Using measurement tools
 ##   @defgroup l2_field         Field on Geometry
+##   @defgroup l2_testing       Testing
 
 ## @}
 
@@ -745,6 +746,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen):
               self.BlocksOp = None
               self.GroupOp  = None
               self.FieldOp  = None
+              self.TestOp   = None
             pass
 
         ## Process object publication in the study, as follows:
@@ -852,6 +854,7 @@ class geomBuilder(GEOM._objref_GEOM_Gen):
             self.BlocksOp = self.GetIBlocksOperations   ()
             self.GroupOp  = self.GetIGroupOperations    ()
             self.FieldOp  = self.GetIFieldOperations    ()
+            self.TestOp   = self.GetITestOperations     ()
 
             notebook.myStudy = self.myStudy
             pass
@@ -13898,6 +13901,37 @@ class geomBuilder(GEOM._objref_GEOM_Gen):
         # end of l2_field
         ## @}
 
+        ## @addtogroup l2_testing
+        ## @{
+
+        ## Build a mesh on the given shape.
+        # @param shape the source shape
+        # @param linear_deflection linear deflection coefficient
+        # @param is_relative says if given value of deflection is relative to shape's bounding box
+        # @param angular_deflection angular deflection for edges in degrees
+        # @return True in case of success; otherwise False.
+        @ManageTransactions("TestOp")
+        def Tesselate(self, shape, linear_deflection=0, is_relative=True, angular_deflection=0):
+            """Build a mesh on the given shape.
+
+            Parameters:
+                shape the source shape
+                linear_deflection linear deflection coefficient
+                is_relative says if given value of deflection is relative to shape's bounding box
+                angular_deflection angular deflection for edges in degrees
+
+            Returns:
+                True in case of success; otherwise False.
+            """
+            if angular_deflection > 0:
+                angular_deflection = angular_deflection * math.pi / 180.
+            r = self.TestOp.Tesselate(shape, linear_deflection, is_relative, angular_deflection)
+            RaiseIfFailed("Tesselate", self.TestOp)
+            return r
+
+        # end of l2_testing
+        ## @}
+
 
 # Register the new proxy for GEOM_Gen
 omniORB.registerObjref(GEOM._objref_GEOM_Gen._NP_RepositoryId, geomBuilder)