From 84efe007063f2bb3189cd59031de4d56d9505e33 Mon Sep 17 00:00:00 2001 From: vsr Date: Tue, 19 Apr 2022 19:54:37 +0300 Subject: [PATCH] bos #29484 Add a test service to build tesselation on a shape --- idl/GEOM_Gen.idl | 21 ++++- src/GEOMImpl/CMakeLists.txt | 2 + src/GEOMImpl/GEOMImpl_Gen.cxx | 11 +++ src/GEOMImpl/GEOMImpl_Gen.hxx | 4 + src/GEOMImpl/GEOMImpl_ITestOperations.cxx | 108 ++++++++++++++++++++++ src/GEOMImpl/GEOMImpl_ITestOperations.hxx | 42 +++++++++ src/GEOM_I/CMakeLists.txt | 2 + src/GEOM_I/GEOM_Gen_i.cc | 19 ++++ src/GEOM_I/GEOM_Gen_i.hh | 5 + src/GEOM_I/GEOM_ITestOperations_i.cc | 75 +++++++++++++++ src/GEOM_I/GEOM_ITestOperations_i.hh | 54 +++++++++++ src/GEOM_SWIG/geomBuilder.py | 34 +++++++ 12 files changed, 376 insertions(+), 1 deletion(-) create mode 100644 src/GEOMImpl/GEOMImpl_ITestOperations.cxx create mode 100644 src/GEOMImpl/GEOMImpl_ITestOperations.hxx create mode 100644 src/GEOM_I/GEOM_ITestOperations_i.cc create mode 100644 src/GEOM_I/GEOM_ITestOperations_i.hh diff --git a/idl/GEOM_Gen.idl b/idl/GEOM_Gen.idl index c9b0664e0..b28c461ec 100644 --- a/idl/GEOM_Gen.idl +++ b/idl/GEOM_Gen.idl @@ -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); diff --git a/src/GEOMImpl/CMakeLists.txt b/src/GEOMImpl/CMakeLists.txt index fc7e09291..96fdde01f 100644 --- a/src/GEOMImpl/CMakeLists.txt +++ b/src/GEOMImpl/CMakeLists.txt @@ -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 diff --git a/src/GEOMImpl/GEOMImpl_Gen.cxx b/src/GEOMImpl/GEOMImpl_Gen.cxx index aac8f9f46..99f93be00 100644 --- a/src/GEOMImpl/GEOMImpl_Gen.cxx +++ b/src/GEOMImpl/GEOMImpl_Gen.cxx @@ -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; +} diff --git a/src/GEOMImpl/GEOMImpl_Gen.hxx b/src/GEOMImpl/GEOMImpl_Gen.hxx index 517922d54..4fad2a9d9 100644 --- a/src/GEOMImpl/GEOMImpl_Gen.hxx +++ b/src/GEOMImpl/GEOMImpl_Gen.hxx @@ -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 index 000000000..1fc7098e3 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ITestOperations.cxx @@ -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 + +#include +#include +#include +#include +#include +#include + +#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 index 000000000..cb94e1343 --- /dev/null +++ b/src/GEOMImpl/GEOMImpl_ITestOperations.hxx @@ -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_ diff --git a/src/GEOM_I/CMakeLists.txt b/src/GEOM_I/CMakeLists.txt index 35c1e58c2..bd9d4b94b 100644 --- a/src/GEOM_I/CMakeLists.txt +++ b/src/GEOM_I/CMakeLists.txt @@ -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 diff --git a/src/GEOM_I/GEOM_Gen_i.cc b/src/GEOM_I/GEOM_Gen_i.cc index 32f638ba0..00c865c45 100644 --- a/src/GEOM_I/GEOM_Gen_i.cc +++ b/src/GEOM_I/GEOM_Gen_i.cc @@ -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 : diff --git a/src/GEOM_I/GEOM_Gen_i.hh b/src/GEOM_I/GEOM_Gen_i.hh index cc1abbad4..a9b8141c2 100644 --- a/src/GEOM_I/GEOM_Gen_i.hh +++ b/src/GEOM_I/GEOM_Gen_i.hh @@ -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 @@ -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 index 000000000..83680d33e --- /dev/null +++ b/src/GEOM_I/GEOM_ITestOperations_i.cc @@ -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 index 000000000..4da6696be --- /dev/null +++ b/src/GEOM_I/GEOM_ITestOperations_i.hh @@ -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 + +#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 diff --git a/src/GEOM_SWIG/geomBuilder.py b/src/GEOM_SWIG/geomBuilder.py index efb57f127..6f3f010d6 100644 --- a/src/GEOM_SWIG/geomBuilder.py +++ b/src/GEOM_SWIG/geomBuilder.py @@ -237,6 +237,7 @@ ## @} ## @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) -- 2.39.2