bos #29484 Add a test service to build tesselation on a shape

This commit is contained in:
vsr 2022-04-19 19:54:37 +03:00
parent 736d34a14f
commit 84efe00706
12 changed files with 376 additions and 1 deletions

View File

@ -4890,6 +4890,24 @@ module GEOM
long GetNbSubShapes(in GEOM_Object shape, in short fieldDim);
};
// # 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);

View 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

View 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;
}

View 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

View File

@ -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;
}

View File

@ -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_

View 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

View 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 :

View 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)
;

View File

@ -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);
}

View File

@ -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

View File

@ -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)