Adding SetNbThreads in Python to set if compute will be done in parallel

This commit is contained in:
Yoann Audouin 2022-08-30 09:42:21 +02:00
parent b27f64c6ec
commit 5176bafcd3
7 changed files with 139 additions and 119 deletions

View File

@ -156,7 +156,7 @@ module SMESH
Geom_BALL, Geom_BALL,
Geom_LAST Geom_LAST
}; };
/*! /*!
* ElementOrder points out entities of what order are requested * ElementOrder points out entities of what order are requested
*/ */
@ -238,7 +238,7 @@ module SMESH
DRS_FAIL // general failure (exception etc.) DRS_FAIL // general failure (exception etc.)
}; };
/*! /*!
* \brief A structure containing information about MED file * \brief A structure containing information about MED file
*/ */
struct MedFileInfo struct MedFileInfo
@ -263,7 +263,7 @@ module SMESH
*/ */
const long EXTRUSION_FLAG_BOUNDARY = 1; const long EXTRUSION_FLAG_BOUNDARY = 1;
const long EXTRUSION_FLAG_SEW = 2; const long EXTRUSION_FLAG_SEW = 2;
/*! /*!
* Structure used in mesh edit preview data (MeshPreviewStruct) * Structure used in mesh edit preview data (MeshPreviewStruct)
*/ */
@ -344,7 +344,7 @@ module SMESH
/*! /*!
* Get geom shape to mesh. A result should not be nil. Use HasShapeToMesh() * Get geom shape to mesh. A result should not be nil. Use HasShapeToMesh()
* to know if a returned shape * to know if a returned shape
*/ */
GEOM::GEOM_Object GetShapeToMesh() GEOM::GEOM_Object GetShapeToMesh()
raises (SALOME::SALOME_Exception); raises (SALOME::SALOME_Exception);
@ -457,7 +457,7 @@ module SMESH
in SMESH_GroupBase aGroup2, in SMESH_GroupBase aGroup2,
in string name ) in string name )
raises (SALOME::SALOME_Exception); raises (SALOME::SALOME_Exception);
/*! /*!
* Union of list of groups * Union of list of groups
* New group is created. All mesh elements that are * New group is created. All mesh elements that are
@ -476,7 +476,7 @@ module SMESH
in SMESH_GroupBase aGroup2, in SMESH_GroupBase aGroup2,
in string name ) in string name )
raises (SALOME::SALOME_Exception); raises (SALOME::SALOME_Exception);
/*! /*!
* Intersection of list of groups * Intersection of list of groups
* New group is created. All mesh elements that are * New group is created. All mesh elements that are
@ -495,7 +495,7 @@ module SMESH
in SMESH_GroupBase aToolGroup, in SMESH_GroupBase aToolGroup,
in string name ) in string name )
raises (SALOME::SALOME_Exception); raises (SALOME::SALOME_Exception);
/*! /*!
* Cut of lists of groups * Cut of lists of groups
* New group is created. All mesh elements that are present in * New group is created. All mesh elements that are present in
@ -505,14 +505,14 @@ module SMESH
in ListOfGroups aToolGroups, in ListOfGroups aToolGroups,
in string name) in string name)
raises (SALOME::SALOME_Exception); raises (SALOME::SALOME_Exception);
/*! /*!
* Create a group of entities basing on nodes of other groups. * Create a group of entities basing on nodes of other groups.
* \param [in] aListOfGroups - list of either groups, sub-meshes or filters. * \param [in] aListOfGroups - list of either groups, sub-meshes or filters.
* \param [in] anElemType - a type of elements to include to the new group. * \param [in] anElemType - a type of elements to include to the new group.
* \param [in] name - a name of the new group. * \param [in] name - a name of the new group.
* \param [in] nbCommonNodes - criterion of inclusion of an element to the new group. * \param [in] nbCommonNodes - criterion of inclusion of an element to the new group.
* \param [in] underlyingOnly - if \c True, an element is included to the * \param [in] underlyingOnly - if \c True, an element is included to the
* new group provided that it is based on nodes of an element of * new group provided that it is based on nodes of an element of
* \a aListOfGroups * \a aListOfGroups
* \return SMESH_Group - the created group * \return SMESH_Group - the created group
@ -679,12 +679,12 @@ module SMESH
* med files in 4.0.0 (default format) or 3.2.1 or 3.3.1 formats. * med files in 4.0.0 (default format) or 3.2.1 or 3.3.1 formats.
* The minor must be between 0 and the current minor version of MED file library. * The minor must be between 0 and the current minor version of MED file library.
* If version is equal to -1, the version is not changed (default). * If version is equal to -1, the version is not changed (default).
* - autoDimension : if @c True, a space dimension for export is defined by mesh * - autoDimension : if @c True, a space dimension for export is defined by mesh
* configuration; for example a planar mesh lying on XOY plane * configuration; for example a planar mesh lying on XOY plane
* will be exported as a mesh in 2D space. * will be exported as a mesh in 2D space.
* If @a autoDimension == @c False, the space dimension is 3. * If @a autoDimension == @c False, the space dimension is 3.
* - fields : list of GEOM fields defined on the shape to mesh. * - fields : list of GEOM fields defined on the shape to mesh.
* - geomAssocFields : each character of this string means a need to export a * - geomAssocFields : each character of this string means a need to export a
* corresponding field; correspondence between fields and characters is following: * corresponding field; correspondence between fields and characters is following:
* - 'v' stands for _vertices_ field; * - 'v' stands for _vertices_ field;
* - 'e' stands for _edges_ field; * - 'e' stands for _edges_ field;
@ -724,7 +724,7 @@ module SMESH
* encoded in 10*major+minor (for instance, code for med 3.2.1 is 32) * encoded in 10*major+minor (for instance, code for med 3.2.1 is 32)
*/ */
long_array GetMEDVersionsCompatibleForAppend(); long_array GetMEDVersionsCompatibleForAppend();
/*! /*!
* Export Mesh to different Formats * Export Mesh to different Formats
* (UNV supported version is I-DEAS 10) * (UNV supported version is I-DEAS 10)
@ -735,17 +735,17 @@ module SMESH
in boolean renumer ) raises (SALOME::SALOME_Exception); in boolean renumer ) raises (SALOME::SALOME_Exception);
void ExportSTL( in string file, void ExportSTL( in string file,
in boolean isascii ) raises (SALOME::SALOME_Exception); in boolean isascii ) raises (SALOME::SALOME_Exception);
void ExportCGNS( in SMESH_IDSource meshPart, void ExportCGNS( in SMESH_IDSource meshPart,
in string file, in string file,
in boolean overwrite, in boolean overwrite,
in boolean groupElemsByType) raises (SALOME::SALOME_Exception); in boolean groupElemsByType) raises (SALOME::SALOME_Exception);
void ExportGMF( in SMESH_IDSource meshPart, void ExportGMF( in SMESH_IDSource meshPart,
in string file, in string file,
in boolean withRequiredGroups) raises (SALOME::SALOME_Exception); in boolean withRequiredGroups) raises (SALOME::SALOME_Exception);
void ExportPartToDAT( in SMESH_IDSource meshPart, void ExportPartToDAT( in SMESH_IDSource meshPart,
in string file, in string file,
in boolean renumer ) raises (SALOME::SALOME_Exception); in boolean renumer ) raises (SALOME::SALOME_Exception);
void ExportPartToUNV( in SMESH_IDSource meshPart, void ExportPartToUNV( in SMESH_IDSource meshPart,
in string file, in string file,
in boolean renumer ) raises (SALOME::SALOME_Exception); in boolean renumer ) raises (SALOME::SALOME_Exception);
void ExportPartToSTL( in SMESH_IDSource meshPart, void ExportPartToSTL( in SMESH_IDSource meshPart,
@ -857,10 +857,10 @@ module SMESH
smIdType_array GetNodesId() smIdType_array GetNodesId()
raises (SALOME::SALOME_Exception); raises (SALOME::SALOME_Exception);
/*! /*!
* Returns type of mesh element * Returns type of mesh element
*/ */
ElementType GetElementType( in smIdType id, in boolean iselem ) ElementType GetElementType( in smIdType id, in boolean iselem )
raises (SALOME::SALOME_Exception); raises (SALOME::SALOME_Exception);
@ -875,7 +875,7 @@ module SMESH
smIdType_array GetSubMeshNodesId(in long ShapeID, in boolean all ) smIdType_array GetSubMeshNodesId(in long ShapeID, in boolean all )
raises (SALOME::SALOME_Exception); raises (SALOME::SALOME_Exception);
ElementType GetSubMeshElementType(in long ShapeID) ElementType GetSubMeshElementType(in long ShapeID)
raises (SALOME::SALOME_Exception); raises (SALOME::SALOME_Exception);
@ -899,6 +899,10 @@ module SMESH
*/ */
boolean SetMeshOrder(in submesh_array_array theSubMeshArray); boolean SetMeshOrder(in submesh_array_array theSubMeshArray);
/*!
* \brief Set Number of Threads
*/
void SetNbThreads(in long nbThreads);
/*! /*!
* Get mesh description * Get mesh description
@ -939,7 +943,7 @@ module SMESH
long GetShapeID(in smIdType id); long GetShapeID(in smIdType id);
/*! /*!
* For given element returns ID of result shape after * For given element returns ID of result shape after
* ::FindShape() from SMESH_MeshEditor * ::FindShape() from SMESH_MeshEditor
* If there is not element for given ID - returns -1 * If there is not element for given ID - returns -1
*/ */
@ -1072,7 +1076,7 @@ module SMESH
*/ */
smIdType_array GetElementsByType( in ElementType theType ) smIdType_array GetElementsByType( in ElementType theType )
raises (SALOME::SALOME_Exception); raises (SALOME::SALOME_Exception);
/*! /*!
* Returns type of mesh element (same as SMESH_Mesh::GetElementType() ) * Returns type of mesh element (same as SMESH_Mesh::GetElementType() )
*/ */

View File

@ -385,9 +385,14 @@ class SMESH_EXPORT SMESH_Mesh
std::ostream& Dump(std::ostream & save); std::ostream& Dump(std::ostream & save);
// Data for parallel computation
void Lock() {_my_lock.lock();}; void Lock() {_my_lock.lock();};
void Unlock() {_my_lock.unlock();}; void Unlock() {_my_lock.unlock();};
int GetNbThreads(){return _NbThreads;};
void SetNbThreads(int nbThreads){_NbThreads=nbThreads;};
// Temporary folder used during parallel Computation // Temporary folder used during parallel Computation
boost::filesystem::path tmp_folder; boost::filesystem::path tmp_folder;
@ -439,6 +444,7 @@ protected:
// Mutex for multhitreading write in SMESH_Mesh // Mutex for multhitreading write in SMESH_Mesh
std::mutex _my_lock; std::mutex _my_lock;
int _NbThreads=0;
protected: protected:
SMESH_Mesh(); SMESH_Mesh();

View File

@ -271,8 +271,7 @@ bool SMESH_subMesh::IsMeshComputed() const
TopExp_Explorer exp( _subShape, (TopAbs_ShapeEnum) type ); TopExp_Explorer exp( _subShape, (TopAbs_ShapeEnum) type );
for ( ; exp.More(); exp.Next() ) for ( ; exp.More(); exp.Next() )
{ {
SMESHDS_SubMesh * smDS = meshDS->MeshElements( exp.Current() ); if ( SMESHDS_SubMesh * smDS = meshDS->MeshElements( exp.Current() ) )
if ( smDS )
{ {
bool computed = (dim > 0) ? smDS->NbElements() : smDS->NbNodes(); bool computed = (dim > 0) ? smDS->NbElements() : smDS->NbNodes();
if ( computed ) if ( computed )
@ -1595,7 +1594,6 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event)
} }
else else
{ {
// TODO: Replace by call to ParallelCompute
ret = algo->Compute((*_father), shape); ret = algo->Compute((*_father), shape);
} }
// algo can set _computeError of submesh // algo can set _computeError of submesh
@ -1656,7 +1654,6 @@ bool SMESH_subMesh::ComputeStateEngine(compute_event event)
bool isComputeErrorSet = !checkComputeError( algo, ret, shape ); bool isComputeErrorSet = !checkComputeError( algo, ret, shape );
if ( isComputeErrorSet ) if ( isComputeErrorSet )
ret = false; ret = false;
// TODO: See why IsMeshCompited() returns false
// check if anything was built // check if anything was built
TopExp_Explorer subS(shape, _subShape.ShapeType()); TopExp_Explorer subS(shape, _subShape.ShapeType());
if ( ret ) if ( ret )
@ -2053,9 +2050,7 @@ bool SMESH_subMesh::checkComputeError(SMESH_Algo* theAlgo,
if ( !_computeError || _computeError->IsOK() ) if ( !_computeError || _computeError->IsOK() )
{ {
// no error description is set to this sub-mesh, check if any mesh is computed // no error description is set to this sub-mesh, check if any mesh is computed
//TODO: See why this does not work _computeState = IsMeshComputed() ? COMPUTE_OK : FAILED_TO_COMPUTE;
//_computeState = IsMeshComputed() ? COMPUTE_OK : FAILED_TO_COMPUTE;
_computeState = COMPUTE_OK;
if ( _computeState != COMPUTE_OK ) if ( _computeState != COMPUTE_OK )
{ {
if ( _subShape.ShapeType() == TopAbs_EDGE && if ( _subShape.ShapeType() == TopAbs_EDGE &&

View File

@ -458,7 +458,7 @@ namespace {
initialized = true; initialized = true;
filteredArgs.push_back( "SMESH.MED_V2_1" ); filteredArgs.push_back( "SMESH.MED_V2_1" );
filteredArgs.push_back( "SMESH.MED_V2_2" ); filteredArgs.push_back( "SMESH.MED_V2_2" );
} }
return std::find( filteredArgs.begin(), filteredArgs.end(), theArg ) != filteredArgs.end(); return std::find( filteredArgs.begin(), filteredArgs.end(), theArg ) != filteredArgs.end();
} }
} }
@ -1827,7 +1827,7 @@ _pyMesh::_pyMesh(const Handle(_pyCommand) theCreationCmd, const _pyID& meshId):
const _pyID& meshID = theCreationCmd->GetObject(); const _pyID& meshID = theCreationCmd->GetObject();
addFatherMesh( meshID ); addFatherMesh( meshID );
} }
// convert my creation command // convert my creation command
Handle(_pyCommand) creationCmd = GetCreationCmd(); Handle(_pyCommand) creationCmd = GetCreationCmd();
creationCmd->SetObject( SMESH_2smeshpy::SmeshpyName() ); creationCmd->SetObject( SMESH_2smeshpy::SmeshpyName() );
@ -2211,7 +2211,7 @@ bool _pyMesh::NeedMeshAccess( const Handle(_pyCommand)& theCommand )
"GetElemNode","IsMediumNode","IsMediumNodeOfAnyElem","ElemNbEdges","ElemNbFaces", "GetElemNode","IsMediumNode","IsMediumNodeOfAnyElem","ElemNbEdges","ElemNbFaces",
"GetElemFaceNodes", "GetFaceNormal", "FindElementByNodes", "GetElemFaceNodes", "GetFaceNormal", "FindElementByNodes",
"IsPoly","IsQuadratic","BaryCenter","GetHypothesisList", "SetAutoColor", "GetAutoColor", "IsPoly","IsQuadratic","BaryCenter","GetHypothesisList", "SetAutoColor", "GetAutoColor",
"Clear", "ConvertToStandalone", "GetMeshOrder", "SetMeshOrder" "Clear", "ConvertToStandalone", "GetMeshOrder", "SetMeshOrder", "SetNbThreads"
,"" }; // <- mark of end ,"" }; // <- mark of end
sameMethods.Insert( names ); sameMethods.Insert( names );
} }
@ -2419,7 +2419,7 @@ void _pyMesh::ClearCommands()
list< Handle(_pySubMesh) >::iterator sm = mySubmeshes.begin(); list< Handle(_pySubMesh) >::iterator sm = mySubmeshes.begin();
for ( ; sm != mySubmeshes.end(); ++sm ) for ( ; sm != mySubmeshes.end(); ++sm )
(*sm)->ClearCommands(); (*sm)->ClearCommands();
list< Handle(_pyGroup) >::iterator gr = myGroups.begin(); list< Handle(_pyGroup) >::iterator gr = myGroups.begin();
for ( ; gr != myGroups.end(); ++gr ) for ( ; gr != myGroups.end(); ++gr )
(*gr)->ClearCommands(); (*gr)->ClearCommands();
@ -2579,7 +2579,7 @@ void _pyMeshEditor::Process( const Handle(_pyCommand)& theCommand)
// 1. Remove "MakeGroups" from the Command // 1. Remove "MakeGroups" from the Command
TCollection_AsciiString aMethod = theCommand->GetMethod(); TCollection_AsciiString aMethod = theCommand->GetMethod();
int nbArgsToAdd = diffLastTwoArgsMethods.Contains(aMethod) ? 2 : 1; int nbArgsToAdd = diffLastTwoArgsMethods.Contains(aMethod) ? 2 : 1;
if(is0DmethObj) if(is0DmethObj)
pos = pos-2; //Remove "0D" from the Command too pos = pos-2; //Remove "0D" from the Command too
aMethod.Trunc(pos-1); aMethod.Trunc(pos-1);
@ -3410,7 +3410,7 @@ void _pyLayerDistributionHypo::Flush()
list< Handle(_pyCommand) >::iterator cmd = myArgCommands.begin(); list< Handle(_pyCommand) >::iterator cmd = myArgCommands.begin();
_pyID prevNewName; _pyID prevNewName;
for ( cmd = myArgCommands.begin(); cmd != myArgCommands.end(); ++cmd ) for ( cmd = myArgCommands.begin(); cmd != myArgCommands.end(); ++cmd )
{ {
const _pyID& hyp1dID = (*cmd)->GetArg( 1 ); const _pyID& hyp1dID = (*cmd)->GetArg( 1 );
if ( hyp1dID.IsEmpty() ) continue; if ( hyp1dID.IsEmpty() ) continue;
@ -3434,7 +3434,7 @@ void _pyLayerDistributionHypo::Flush()
} }
newName += "_Distribution"; newName += "_Distribution";
prevNewName = newName; prevNewName = newName;
hyp1d->GetCreationCmd()->SetResultValue( newName ); hyp1d->GetCreationCmd()->SetResultValue( newName );
} }
list< Handle(_pyCommand) >& cmds = theGen->GetCommands(); list< Handle(_pyCommand) >& cmds = theGen->GetCommands();
@ -4631,7 +4631,7 @@ _pyGroup::_pyGroup(const Handle(_pyCommand)& theCreationCmd, const _pyID & id)
//================================================================================ //================================================================================
/*! /*!
* \brief Check if "[ group1, group2 ] = mesh.GetGroups()" creation command * \brief Check if "[ group1, group2 ] = mesh.GetGroups()" creation command
* can be cleared * can be cleared
*/ */
//================================================================================ //================================================================================
@ -4802,7 +4802,7 @@ void _pyFilter::Process( const Handle(_pyCommand)& theCommand)
if ( !myNewID.IsEmpty() ) if ( !myNewID.IsEmpty() )
theCommand->SetObject( myNewID ); theCommand->SetObject( myNewID );
// Convert the following set of commands into smesh.GetFilterFromCriteria(criteria) // Convert the following set of commands into smesh.GetFilterFromCriteria(criteria)
// aFilter0x2aaab0487080 = aFilterManager.CreateFilter() // aFilter0x2aaab0487080 = aFilterManager.CreateFilter()
// aFilter0x2aaab0487080.SetCriteria(aCriteria) // aFilter0x2aaab0487080.SetCriteria(aCriteria)
@ -4845,7 +4845,7 @@ void _pyFilter::Process( const Handle(_pyCommand)& theCommand)
void _pyFilter::Flush() void _pyFilter::Flush()
{ {
if ( myNewID.IsEmpty() ) return; if ( myNewID.IsEmpty() ) return;
list< Handle(_pyCommand) >::iterator cmd = myArgCmds.begin(); list< Handle(_pyCommand) >::iterator cmd = myArgCmds.begin();
for ( ; cmd != myArgCmds.end(); ++cmd ) for ( ; cmd != myArgCmds.end(); ++cmd )
if ( !(*cmd)->IsEmpty() ) if ( !(*cmd)->IsEmpty() )
@ -4982,7 +4982,7 @@ _pyHypothesisReader::_pyHypothesisReader()
// ... // ...
// dim="2"> // dim="2">
// <python-wrap> // <python-wrap>
// <accumulative-methods> // <accumulative-methods>
// SetEnforcedVertex, // SetEnforcedVertex,
// SetEnforcedVertexNamed // SetEnforcedVertexNamed
// </accumulative-methods> // </accumulative-methods>

View File

@ -2504,7 +2504,7 @@ void SMESH_Mesh_i::CheckGeomModif( bool theIsBreakLink )
} }
old2newShapeMap.Bind( group->GetShape(), groupsData.back()._shape ); old2newShapeMap.Bind( group->GetShape(), groupsData.back()._shape );
} }
} }
} }
// store assigned hypotheses // store assigned hypotheses
@ -6168,8 +6168,8 @@ SMESH::SMESH_Mesh_ptr SMESH_Mesh_i::GetMesh()
/*! /*!
* \brief Return false if GetMeshInfo() return incorrect information that may * \brief Return false if GetMeshInfo() return incorrect information that may
* happen if mesh data is not yet fully loaded from the file of study. * happen if mesh data is not yet fully loaded from the file of study.
* *
* *
*/ */
//================================================================================ //================================================================================
@ -7035,6 +7035,16 @@ TListOfListOfInt SMESH_Mesh_i::findConcurrentSubMeshes()
return res; return res;
} }
//=============================================================================
/*!
* \brief Set the number of threads for a parallel computation
*/
//=============================================================================
void SMESH_Mesh_i::SetNbThreads(int nbThreads){
_impl->SetNbThreads(nbThreads);
}
//============================================================================= //=============================================================================
/*! /*!
* \brief Convert submesh ids into submesh interfaces * \brief Convert submesh ids into submesh interfaces
@ -7227,7 +7237,7 @@ smIdType SMESH_MeshPartDS::MinNodeID() const
{ {
if ( _meshDS ) return _meshDS->MinNodeID(); if ( _meshDS ) return _meshDS->MinNodeID();
return NbNodes() == 0 ? 0 : (*_elements[ SMDSAbs_Node ].begin())->GetID(); return NbNodes() == 0 ? 0 : (*_elements[ SMDSAbs_Node ].begin())->GetID();
} }
// ------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------
smIdType SMESH_MeshPartDS::MaxElementID() const smIdType SMESH_MeshPartDS::MaxElementID() const
{ {

View File

@ -226,7 +226,7 @@ public:
const char* file, const char* file,
CORBA::Boolean withRequiredGroups); CORBA::Boolean withRequiredGroups);
template<class SPECLS> template<class SPECLS>
void ExportPartToMEDCommon(SPECLS& speCls, void ExportPartToMEDCommon(SPECLS& speCls,
SMESH::SMESH_IDSource_ptr meshPart, SMESH::SMESH_IDSource_ptr meshPart,
@ -571,7 +571,7 @@ public:
* Persistence of geometry tick * Persistence of geometry tick
*/ */
int& MainShapeTick() { return _mainShapeTick; } int& MainShapeTick() { return _mainShapeTick; }
/*! /*!
* Sets list of notebook variables used for Mesh operations separated by ":" symbol * Sets list of notebook variables used for Mesh operations separated by ":" symbol
@ -673,6 +673,8 @@ private:
SMESH::submesh_array_array& theSubMeshOrder, SMESH::submesh_array_array& theSubMeshOrder,
const bool theIsDump); const bool theIsDump);
void SetNbThreads(int nbThreads);
/*! /*!
* \brief Finds concurrent sub-meshes * \brief Finds concurrent sub-meshes
*/ */

View File

@ -216,7 +216,7 @@ NO_NAME = "NoName"
def GetName(obj): def GetName(obj):
""" """
Return a name of an object Return a name of an object
Returns: Returns:
object name object name
""" """
@ -429,26 +429,26 @@ class smeshBuilder( SMESH._objref_SMESH_Gen, object ):
def init_smesh(self,geompyD = None): def init_smesh(self,geompyD = None):
""" """
Set Geometry component Set Geometry component
""" """
#print("init_smesh") #print("init_smesh")
self.UpdateStudy(geompyD) self.UpdateStudy(geompyD)
notebook.myStudy = salome.myStudy notebook.myStudy = salome.myStudy
def Mesh(self, obj=0, name=0): def Mesh(self, obj=0, name=0):
""" """
Create a mesh. This mesh can be either Create a mesh. This mesh can be either
* an empty mesh not bound to geometry, if *obj* == 0 * an empty mesh not bound to geometry, if *obj* == 0
* an empty mesh bound to geometry, if *obj* is GEOM.GEOM_Object * an empty mesh bound to geometry, if *obj* is GEOM.GEOM_Object
* a mesh wrapping a :class:`CORBA mesh <SMESH.SMESH_Mesh>` given as *obj* parameter. * a mesh wrapping a :class:`CORBA mesh <SMESH.SMESH_Mesh>` given as *obj* parameter.
Parameters: Parameters:
obj: either obj: either
1. a :class:`CORBA mesh <SMESH.SMESH_Mesh>` got by calling e.g. 1. a :class:`CORBA mesh <SMESH.SMESH_Mesh>` got by calling e.g.
:: ::
salome.myStudy.FindObjectID("0:1:2:3").GetObject() salome.myStudy.FindObjectID("0:1:2:3").GetObject()
2. a geometrical object for meshing 2. a geometrical object for meshing
3. none. 3. none.
@ -648,7 +648,7 @@ class smeshBuilder( SMESH._objref_SMESH_Gen, object ):
if sc: if sc:
sb.LoadWith(sc, self) sb.LoadWith(sc, self)
pass pass
def SetEnablePublish( self, theIsEnablePublish ): def SetEnablePublish( self, theIsEnablePublish ):
""" """
Set enable publishing in the study. Calling SetEnablePublish( False ) allows to Set enable publishing in the study. Calling SetEnablePublish( False ) allows to
@ -677,7 +677,7 @@ class smeshBuilder( SMESH._objref_SMESH_Gen, object ):
Create a Mesh object(s) importing data from the given MED file Create a Mesh object(s) importing data from the given MED file
Returns: Returns:
a tuple ( list of class :class:`Mesh` instances, a tuple ( list of class :class:`Mesh` instances,
:class:`SMESH.DriverMED_ReadStatus` ) :class:`SMESH.DriverMED_ReadStatus` )
""" """
@ -744,7 +744,7 @@ class smeshBuilder( SMESH._objref_SMESH_Gen, object ):
Returns: Returns:
an instance of class :class:`Mesh` an instance of class :class:`Mesh`
See also: See also:
:meth:`Mesh.Append` :meth:`Mesh.Append`
""" """
@ -778,7 +778,7 @@ class smeshBuilder( SMESH._objref_SMESH_Gen, object ):
Create a mesh by copying a part of another mesh. Create a mesh by copying a part of another mesh.
Parameters: Parameters:
meshPart: a part of mesh to copy, either meshPart: a part of mesh to copy, either
:class:`mesh, sub-mesh, group or filter <SMESH.SMESH_IDSource>`. :class:`mesh, sub-mesh, group or filter <SMESH.SMESH_IDSource>`.
To copy nodes or elements not forming any mesh object, To copy nodes or elements not forming any mesh object,
pass result of :meth:`Mesh.GetIDSource` as *meshPart* pass result of :meth:`Mesh.GetIDSource` as *meshPart*
@ -810,7 +810,7 @@ class smeshBuilder( SMESH._objref_SMESH_Gen, object ):
meshName: an optional name of the new mesh. If omitted, the mesh name is kept. meshName: an optional name of the new mesh. If omitted, the mesh name is kept.
toCopyGroups: to create groups in the new mesh. toCopyGroups: to create groups in the new mesh.
toReuseHypotheses: to reuse hypotheses of the *sourceMesh*. toReuseHypotheses: to reuse hypotheses of the *sourceMesh*.
toCopyElements: to copy mesh elements present on non-modified sub-shapes of toCopyElements: to copy mesh elements present on non-modified sub-shapes of
*sourceMesh*. *sourceMesh*.
Returns: Returns:
tuple ( ok, newMesh, newGroups, newSubMeshes, newHypotheses, invalidEntries ) tuple ( ok, newMesh, newGroups, newSubMeshes, newHypotheses, invalidEntries )
@ -1285,7 +1285,7 @@ class smeshBuilder( SMESH._objref_SMESH_Gen, object ):
Returns: Returns:
minimum distance value minimum distance value
See also: See also:
:meth:`GetMinDistance` :meth:`GetMinDistance`
""" """
@ -1313,7 +1313,7 @@ class smeshBuilder( SMESH._objref_SMESH_Gen, object ):
Returns: Returns:
:class:`SMESH.Measure` structure or None if input data is invalid :class:`SMESH.Measure` structure or None if input data is invalid
See also: See also:
:meth:`MinDistance` :meth:`MinDistance`
""" """
@ -1360,7 +1360,7 @@ class smeshBuilder( SMESH._objref_SMESH_Gen, object ):
Returns: Returns:
tuple of six values (minX, minY, minZ, maxX, maxY, maxZ) tuple of six values (minX, minY, minZ, maxX, maxY, maxZ)
See also: See also:
:meth:`GetBoundingBox` :meth:`GetBoundingBox`
""" """
@ -1381,7 +1381,7 @@ class smeshBuilder( SMESH._objref_SMESH_Gen, object ):
Returns: Returns:
:class:`SMESH.Measure` structure :class:`SMESH.Measure` structure
See also: See also:
:meth:`BoundingBox` :meth:`BoundingBox`
""" """
@ -1460,14 +1460,14 @@ class smeshBuilder( SMESH._objref_SMESH_Gen, object ):
def GetGravityCenter(self, obj): def GetGravityCenter(self, obj):
""" """
Get gravity center of all nodes of a mesh object. Get gravity center of all nodes of a mesh object.
Parameters: Parameters:
obj: :class:`mesh, sub-mesh, group or filter <SMESH.SMESH_IDSource>` obj: :class:`mesh, sub-mesh, group or filter <SMESH.SMESH_IDSource>`
Returns: Returns:
Three components of the gravity center (x,y,z) Three components of the gravity center (x,y,z)
See also: See also:
:meth:`Mesh.BaryCenter` :meth:`Mesh.BaryCenter`
""" """
if isinstance(obj, Mesh): obj = obj.mesh if isinstance(obj, Mesh): obj = obj.mesh
@ -1481,11 +1481,11 @@ class smeshBuilder( SMESH._objref_SMESH_Gen, object ):
""" """
Computes a radian measure of an angle defined by 3 points: <(p1,p2,p3) Computes a radian measure of an angle defined by 3 points: <(p1,p2,p3)
Parameters: Parameters:
p1,p2,p3: coordinates of 3 points defined by either SMESH.PointStruct p1,p2,p3: coordinates of 3 points defined by either SMESH.PointStruct
or list [x,y,z] or list [x,y,z]
Returns: Returns:
Angle in radians Angle in radians
""" """
if isinstance( p1, list ): p1 = PointStruct(*p1) if isinstance( p1, list ): p1 = PointStruct(*p1)
@ -1551,7 +1551,7 @@ class Mesh(metaclass = MeshMeta):
It also has methods to define groups of mesh elements, to modify a mesh (by addition of It also has methods to define groups of mesh elements, to modify a mesh (by addition of
new nodes and elements and by changing the existing entities), to get information new nodes and elements and by changing the existing entities), to get information
about a mesh and to export a mesh in different formats. about a mesh and to export a mesh in different formats.
""" """
geom = 0 geom = 0
mesh = 0 mesh = 0
@ -1843,7 +1843,7 @@ class Mesh(metaclass = MeshMeta):
return self.smeshpyD.Evaluate(self.mesh, geom) return self.smeshpyD.Evaluate(self.mesh, geom)
def Compute(self, geom=0, discardModifs=False, refresh=False): def Compute(self, geom=0, discardModifs=False, refresh=False, nbThreads=0):
""" """
Compute the mesh and return the status of the computation Compute the mesh and return the status of the computation
@ -1853,6 +1853,7 @@ class Mesh(metaclass = MeshMeta):
a last total re-compute and that may prevent successful partial re-compute, a last total re-compute and that may prevent successful partial re-compute,
then the mesh is cleaned before Compute() then the mesh is cleaned before Compute()
refresh: if *True*, Object Browser is automatically updated (when running in GUI) refresh: if *True*, Object Browser is automatically updated (when running in GUI)
nbThreads: Number of threads to use for a parallel computation
Returns: Returns:
True or False True or False
@ -1864,6 +1865,8 @@ class Mesh(metaclass = MeshMeta):
try: try:
if discardModifs and self.mesh.HasModificationsToDiscard(): # issue 0020693 if discardModifs and self.mesh.HasModificationsToDiscard(): # issue 0020693
self.mesh.Clear() self.mesh.Clear()
# Setting parallel parameters
self.mesh.SetNbThreads(nbThreads)
ok = self.smeshpyD.Compute(self.mesh, geom) ok = self.smeshpyD.Compute(self.mesh, geom)
except SALOME.SALOME_Exception as ex: except SALOME.SALOME_Exception as ex:
print("Mesh computation failed, exception caught:") print("Mesh computation failed, exception caught:")
@ -2081,12 +2084,12 @@ class Mesh(metaclass = MeshMeta):
def SetMeshOrder(self, submeshes): def SetMeshOrder(self, submeshes):
""" """
Set priority of sub-meshes. It works in two ways: Set priority of sub-meshes. It works in two ways:
* For sub-meshes with assigned algorithms of same dimension generating mesh of * For sub-meshes with assigned algorithms of same dimension generating mesh of
*several dimensions*, it sets the order in which the sub-meshes are computed. *several dimensions*, it sets the order in which the sub-meshes are computed.
* For the rest sub-meshes, it sets the order in which the sub-meshes are checked * For the rest sub-meshes, it sets the order in which the sub-meshes are checked
when looking for meshing parameters to apply to a sub-shape. To impose the when looking for meshing parameters to apply to a sub-shape. To impose the
order in which sub-meshes with uni-dimensional algorithms are computed, order in which sub-meshes with uni-dimensional algorithms are computed,
call **submesh.Compute()** in a desired order. call **submesh.Compute()** in a desired order.
Parameters: Parameters:
@ -2300,23 +2303,23 @@ class Mesh(metaclass = MeshMeta):
meshPart: a part of mesh (:class:`sub-mesh, group or filter <SMESH.SMESH_IDSource>`) meshPart: a part of mesh (:class:`sub-mesh, group or filter <SMESH.SMESH_IDSource>`)
to export instead of the mesh to export instead of the mesh
autoDimension: if *True* (default), a space dimension of a MED mesh can be either autoDimension: if *True* (default), a space dimension of a MED mesh can be either
- 1D if all mesh nodes lie on OX coordinate axis, or - 1D if all mesh nodes lie on OX coordinate axis, or
- 2D if all mesh nodes lie on XOY coordinate plane, or - 2D if all mesh nodes lie on XOY coordinate plane, or
- 3D in the rest cases. - 3D in the rest cases.
If *autoDimension* is *False*, the space dimension is always 3. If *autoDimension* is *False*, the space dimension is always 3.
fields: list of GEOM fields defined on the shape to mesh. fields: list of GEOM fields defined on the shape to mesh.
geomAssocFields: each character of this string means a need to export a geomAssocFields: each character of this string means a need to export a
corresponding field; correspondence between fields and characters corresponding field; correspondence between fields and characters
is following: is following:
- 'v' stands for "_vertices_" field; - 'v' stands for "_vertices_" field;
- 'e' stands for "_edges_" field; - 'e' stands for "_edges_" field;
- 'f' stands for "_faces_" field; - 'f' stands for "_faces_" field;
- 's' stands for "_solids_" field. - 's' stands for "_solids_" field.
zTolerance (float): tolerance in Z direction. If Z coordinate of a node is zTolerance (float): tolerance in Z direction. If Z coordinate of a node is
close to zero within a given tolerance, the coordinate is set to zero. close to zero within a given tolerance, the coordinate is set to zero.
If *ZTolerance* is negative (default), the node coordinates are kept as is. If *ZTolerance* is negative (default), the node coordinates are kept as is.
saveNumbers(boolean) : enable saving numbers of nodes and cells. saveNumbers(boolean) : enable saving numbers of nodes and cells.
@ -2371,8 +2374,8 @@ class Mesh(metaclass = MeshMeta):
the typical use is auto_groups=False. the typical use is auto_groups=False.
version (int): define the version (xy, where version is x.y.z) of MED file format. version (int): define the version (xy, where version is x.y.z) of MED file format.
For instance med 3.2.1 is coded 3*10+2 = 32, med 4.0.0 is coded 4*10+0 = 40. For instance med 3.2.1 is coded 3*10+2 = 32, med 4.0.0 is coded 4*10+0 = 40.
The rules of compatibility to write a mesh in an older version than The rules of compatibility to write a mesh in an older version than
the current version depend on the current version. For instance, the current version depend on the current version. For instance,
with med 4.0 it is possible to write/append med files in 4.0.0 (default) with med 4.0 it is possible to write/append med files in 4.0.0 (default)
or 3.2.1 or 3.3.1 formats. or 3.2.1 or 3.3.1 formats.
If the version is equal to -1, the version is not changed (default). If the version is equal to -1, the version is not changed (default).
@ -2387,8 +2390,8 @@ class Mesh(metaclass = MeshMeta):
If *autoDimension* is *False*, the space dimension is always 3. If *autoDimension* is *False*, the space dimension is always 3.
fields: list of GEOM fields defined on the shape to mesh. fields: list of GEOM fields defined on the shape to mesh.
geomAssocFields: each character of this string means a need to export a geomAssocFields: each character of this string means a need to export a
corresponding field; correspondence between fields and characters corresponding field; correspondence between fields and characters
is following: is following:
- 'v' stands for "_vertices_" field; - 'v' stands for "_vertices_" field;
@ -2396,7 +2399,7 @@ class Mesh(metaclass = MeshMeta):
- 'f' stands for "_faces_" field; - 'f' stands for "_faces_" field;
- 's' stands for "_solids_" field. - 's' stands for "_solids_" field.
zTolerance (float): tolerance in Z direction. If Z coordinate of a node is zTolerance (float): tolerance in Z direction. If Z coordinate of a node is
close to zero within a given tolerance, the coordinate is set to zero. close to zero within a given tolerance, the coordinate is set to zero.
If *ZTolerance* is negative (default), the node coordinates are kept as is. If *ZTolerance* is negative (default), the node coordinates are kept as is.
saveNumbers (boolean) : enable saving numbers of nodes and cells. saveNumbers (boolean) : enable saving numbers of nodes and cells.
@ -2564,7 +2567,7 @@ class Mesh(metaclass = MeshMeta):
If **autoDimension** is *False*, the space dimension is always 3. If **autoDimension** is *False*, the space dimension is always 3.
""" """
print("WARNING: ExportToMED() is deprecated, use ExportMED() instead") print("WARNING: ExportToMED() is deprecated, use ExportMED() instead")
# process positional arguments # process positional arguments
#args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] # backward compatibility #args = [i for i in args if i not in [SMESH.MED_V2_1, SMESH.MED_V2_2]] # backward compatibility
@ -2641,7 +2644,7 @@ class Mesh(metaclass = MeshMeta):
Create an empty standalone mesh group Create an empty standalone mesh group
Parameters: Parameters:
elementType: the :class:`type <SMESH.ElementType>` of elements in the group; elementType: the :class:`type <SMESH.ElementType>` of elements in the group;
either of (SMESH.NODE, SMESH.EDGE, SMESH.FACE, SMESH.VOLUME) either of (SMESH.NODE, SMESH.EDGE, SMESH.FACE, SMESH.VOLUME)
name: the name of the mesh group name: the name of the mesh group
@ -2881,7 +2884,7 @@ class Mesh(metaclass = MeshMeta):
def GetGroups(self, elemType = SMESH.ALL): def GetGroups(self, elemType = SMESH.ALL):
""" """
Get the list of groups existing in the mesh in the order of creation Get the list of groups existing in the mesh in the order of creation
(starting from the oldest one) (starting from the oldest one)
Parameters: Parameters:
@ -3592,7 +3595,7 @@ class Mesh(metaclass = MeshMeta):
Return the type of mesh element or node Return the type of mesh element or node
Returns: Returns:
the value from :class:`SMESH.ElementType` enumeration. the value from :class:`SMESH.ElementType` enumeration.
Return SMESH.ALL if element or node with the given ID does not exist Return SMESH.ALL if element or node with the given ID does not exist
""" """
@ -3886,7 +3889,7 @@ class Mesh(metaclass = MeshMeta):
Returns: Returns:
a list of three double values a list of three double values
See also: See also:
:meth:`smeshBuilder.GetGravityCenter` :meth:`smeshBuilder.GetGravityCenter`
""" """
@ -4004,7 +4007,7 @@ class Mesh(metaclass = MeshMeta):
Returns: Returns:
tuple of six values (minX, minY, minZ, maxX, maxY, maxZ) tuple of six values (minX, minY, minZ, maxX, maxY, maxZ)
See Also: See Also:
:meth:`GetBoundingBox()` :meth:`GetBoundingBox()`
""" """
@ -4027,7 +4030,7 @@ class Mesh(metaclass = MeshMeta):
Returns: Returns:
:class:`SMESH.Measure` structure :class:`SMESH.Measure` structure
See Also: See Also:
:meth:`BoundingBox()` :meth:`BoundingBox()`
""" """
@ -4163,7 +4166,7 @@ class Mesh(metaclass = MeshMeta):
Returns: Returns:
an object (a new group or a temporary :class:`SMESH.SMESH_IDSource`) holding an object (a new group or a temporary :class:`SMESH.SMESH_IDSource`) holding
IDs of new and/or found 0D elements. IDs of 0D elements IDs of new and/or found 0D elements. IDs of 0D elements
can be retrieved from the returned object by can be retrieved from the returned object by
calling :meth:`GetIDs() <SMESH.SMESH_IDSource.GetIDs>` calling :meth:`GetIDs() <SMESH.SMESH_IDSource.GetIDs>`
""" """
@ -4537,7 +4540,7 @@ class Mesh(metaclass = MeshMeta):
edges = self.GetIDSource( edges, SMESH.EDGE ) edges = self.GetIDSource( edges, SMESH.EDGE )
unRegister.set( edges ) unRegister.set( edges )
return self.editor.Get1DBranches( edges, startNode ) return self.editor.Get1DBranches( edges, startNode )
def FindSharpEdges( self, angle, addExisting=False ): def FindSharpEdges( self, angle, addExisting=False ):
""" """
Return sharp edges of faces and non-manifold ones. Return sharp edges of faces and non-manifold ones.
@ -4604,7 +4607,7 @@ class Mesh(metaclass = MeshMeta):
def AddNodeOnSegment(self, Node1, Node2, position = 0.5): def AddNodeOnSegment(self, Node1, Node2, position = 0.5):
""" """
Replace each triangle bound by Node1-Node2 segment with Replace each triangle bound by Node1-Node2 segment with
two triangles by connecting a node made on the link with a node two triangles by connecting a node made on the link with a node
opposite to the link. opposite to the link.
Parameters: Parameters:
@ -4874,7 +4877,7 @@ class Mesh(metaclass = MeshMeta):
a quadrangle. a quadrangle.
Parameters: Parameters:
theElements: the faces to be splitted. This can be either theElements: the faces to be splitted. This can be either
:class:`mesh, sub-mesh, group, filter <SMESH.SMESH_IDSource>` :class:`mesh, sub-mesh, group, filter <SMESH.SMESH_IDSource>`
or a list of face IDs. By default all quadrangles are split or a list of face IDs. By default all quadrangles are split
@ -4943,8 +4946,8 @@ class Mesh(metaclass = MeshMeta):
to numerical functors. to numerical functors.
Returns: Returns:
* 1 if 1-3 diagonal is better, * 1 if 1-3 diagonal is better,
* 2 if 2-4 diagonal is better, * 2 if 2-4 diagonal is better,
* 0 if error occurs. * 0 if error occurs.
Note: Note:
@ -5096,7 +5099,7 @@ class Mesh(metaclass = MeshMeta):
This operation uses :doc:`pattern_mapping` functionality for splitting. This operation uses :doc:`pattern_mapping` functionality for splitting.
Parameters: Parameters:
theObject: the object from which the list of hexahedrons is taken; theObject: the object from which the list of hexahedrons is taken;
this is :class:`mesh, sub-mesh, group or filter <SMESH.SMESH_IDSource>` this is :class:`mesh, sub-mesh, group or filter <SMESH.SMESH_IDSource>`
theNode000,theNode001: within the range [0,7]; gives the orientation of the theNode000,theNode001: within the range [0,7]; gives the orientation of the
pattern relatively each hexahedron: the (0,0,0) key-point of the pattern pattern relatively each hexahedron: the (0,0,0) key-point of the pattern
@ -5588,7 +5591,7 @@ class Mesh(metaclass = MeshMeta):
of all steps, else - size of each step of all steps, else - size of each step
Returns: Returns:
the list of created :class:`groups <SMESH.SMESH_GroupBase>` if *MakeGroups* == True, the list of created :class:`groups <SMESH.SMESH_GroupBase>` if *MakeGroups* == True,
empty list otherwise empty list otherwise
""" """
@ -5644,7 +5647,7 @@ class Mesh(metaclass = MeshMeta):
- a list of tree components of the point or - a list of tree components of the point or
- a node ID or - a node ID or
- a GEOM point - a GEOM point
angles: list of angles in radians. Nodes at each extrusion step are rotated angles: list of angles in radians. Nodes at each extrusion step are rotated
around *basePoint*, additionally to previous steps. around *basePoint*, additionally to previous steps.
anglesVariation: forces the computation of rotation angles as linear anglesVariation: forces the computation of rotation angles as linear
variation of the given *angles* along path steps variation of the given *angles* along path steps
@ -5862,13 +5865,13 @@ class Mesh(metaclass = MeshMeta):
PathShape: optional shape (edge or wire) which defines the sub-mesh of the mesh defined by *PathObject* if the mesh contains not only path segments, else it can be None PathShape: optional shape (edge or wire) which defines the sub-mesh of the mesh defined by *PathObject* if the mesh contains not only path segments, else it can be None
NodeStart: the first or the last node on the path. Defines the direction of extrusion NodeStart: the first or the last node on the path. Defines the direction of extrusion
HasAngles: not used obsolete HasAngles: not used obsolete
Angles: list of angles in radians. Nodes at each extrusion step are rotated Angles: list of angles in radians. Nodes at each extrusion step are rotated
around *basePoint*, additionally to previous steps. around *basePoint*, additionally to previous steps.
LinearVariation: forces the computation of rotation angles as linear LinearVariation: forces the computation of rotation angles as linear
variation of the given Angles along path steps variation of the given Angles along path steps
HasRefPoint: allows using the reference point HasRefPoint: allows using the reference point
RefPoint: optional scaling and rotation center (mass center of the extruded RefPoint: optional scaling and rotation center (mass center of the extruded
elements by default). The User can specify any point as the Reference Point. elements by default). The User can specify any point as the Reference Point.
*RefPoint* can be either GEOM Vertex, [x,y,z] or :class:`SMESH.PointStruct` *RefPoint* can be either GEOM Vertex, [x,y,z] or :class:`SMESH.PointStruct`
MakeGroups: forces the generation of new groups from existing ones MakeGroups: forces the generation of new groups from existing ones
ScaleFactors: optional scale factors to apply during extrusion ScaleFactors: optional scale factors to apply during extrusion
@ -5876,7 +5879,7 @@ class Mesh(metaclass = MeshMeta):
else *scaleFactors* [i] is applied to nodes at the i-th extrusion step else *scaleFactors* [i] is applied to nodes at the i-th extrusion step
Returns: Returns:
list of created :class:`groups <SMESH.SMESH_GroupBase>` and list of created :class:`groups <SMESH.SMESH_GroupBase>` and
:class:`error code <SMESH.SMESH_MeshEditor.Extrusion_Error>` :class:`error code <SMESH.SMESH_MeshEditor.Extrusion_Error>`
Example: :ref:`tui_extrusion_along_path` Example: :ref:`tui_extrusion_along_path`
""" """
@ -5896,7 +5899,7 @@ class Mesh(metaclass = MeshMeta):
Angles,AnglesParameters,hasVars = ParseAngles(Angles) Angles,AnglesParameters,hasVars = ParseAngles(Angles)
ScaleFactors,ScalesParameters,hasVars = ParseParameters(ScaleFactors) ScaleFactors,ScalesParameters,hasVars = ParseParameters(ScaleFactors)
Parameters = AnglesParameters + var_separator + \ Parameters = AnglesParameters + var_separator + \
RefPoint.parameters + var_separator + ScalesParameters RefPoint.parameters + var_separator + ScalesParameters
self.mesh.SetParameters(Parameters) self.mesh.SetParameters(Parameters)
return self.editor.ExtrusionAlongPathObjects(Nodes, Edges, Faces, return self.editor.ExtrusionAlongPathObjects(Nodes, Edges, Faces,
PathObject, PathShape, NodeStart, PathObject, PathShape, NodeStart,
@ -5917,7 +5920,7 @@ class Mesh(metaclass = MeshMeta):
Path: 1D mesh or 1D sub-mesh, along which proceeds the extrusion Path: 1D mesh or 1D sub-mesh, along which proceeds the extrusion
NodeStart: the start node from Path. Defines the direction of extrusion NodeStart: the start node from Path. Defines the direction of extrusion
HasAngles: not used obsolete HasAngles: not used obsolete
Angles: list of angles in radians. Nodes at each extrusion step are rotated Angles: list of angles in radians. Nodes at each extrusion step are rotated
around *basePoint*, additionally to previous steps. around *basePoint*, additionally to previous steps.
LinearVariation: forces the computation of rotation angles as linear LinearVariation: forces the computation of rotation angles as linear
variation of the given Angles along path steps variation of the given Angles along path steps
@ -5960,7 +5963,7 @@ class Mesh(metaclass = MeshMeta):
PathShape: shape (edge) defines the sub-mesh for the path PathShape: shape (edge) defines the sub-mesh for the path
NodeStart: the first or the last node on the edge. Defines the direction of extrusion NodeStart: the first or the last node on the edge. Defines the direction of extrusion
HasAngles: not used obsolete HasAngles: not used obsolete
Angles: list of angles in radians. Nodes at each extrusion step are rotated Angles: list of angles in radians. Nodes at each extrusion step are rotated
around *basePoint*, additionally to previous steps. around *basePoint*, additionally to previous steps.
HasRefPoint: allows using the reference point HasRefPoint: allows using the reference point
RefPoint: the reference point around which the shape is rotated (the mass center of the shape by default). RefPoint: the reference point around which the shape is rotated (the mass center of the shape by default).
@ -6001,7 +6004,7 @@ class Mesh(metaclass = MeshMeta):
PathShape: shape (edge) defines the sub-mesh for the path PathShape: shape (edge) defines the sub-mesh for the path
NodeStart: the first or the last node on the edge. Defines the direction of extrusion NodeStart: the first or the last node on the edge. Defines the direction of extrusion
HasAngles: not used obsolete HasAngles: not used obsolete
Angles: list of angles in radians. Nodes at each extrusion step are rotated Angles: list of angles in radians. Nodes at each extrusion step are rotated
around *basePoint*, additionally to previous steps. around *basePoint*, additionally to previous steps.
HasRefPoint: allows using the reference point HasRefPoint: allows using the reference point
RefPoint: the reference point around which the shape is rotated (the mass center of the shape by default). RefPoint: the reference point around which the shape is rotated (the mass center of the shape by default).
@ -6012,7 +6015,7 @@ class Mesh(metaclass = MeshMeta):
variation of the given Angles along path steps variation of the given Angles along path steps
Returns: Returns:
list of created :class:`groups <SMESH.SMESH_GroupBase>` and list of created :class:`groups <SMESH.SMESH_GroupBase>` and
:class:`error code <SMESH.SMESH_MeshEditor.Extrusion_Error>` if *MakeGroups* == True, :class:`error code <SMESH.SMESH_MeshEditor.Extrusion_Error>` if *MakeGroups* == True,
only :class:`error code <SMESH.SMESH_MeshEditor.Extrusion_Error>` otherwise only :class:`error code <SMESH.SMESH_MeshEditor.Extrusion_Error>` otherwise
Example: :ref:`tui_extrusion_along_path` Example: :ref:`tui_extrusion_along_path`
@ -6039,7 +6042,7 @@ class Mesh(metaclass = MeshMeta):
PathShape: shape (edge) defines the sub-mesh for the path PathShape: shape (edge) defines the sub-mesh for the path
NodeStart: the first or the last node on the edge. Defines the direction of extrusion NodeStart: the first or the last node on the edge. Defines the direction of extrusion
HasAngles: not used obsolete HasAngles: not used obsolete
Angles: list of angles in radians. Nodes at each extrusion step are rotated Angles: list of angles in radians. Nodes at each extrusion step are rotated
around *basePoint*, additionally to previous steps. around *basePoint*, additionally to previous steps.
HasRefPoint: allows using the reference point HasRefPoint: allows using the reference point
RefPoint: the reference point around which the shape is rotated (the mass center of the shape by default). RefPoint: the reference point around which the shape is rotated (the mass center of the shape by default).
@ -6050,7 +6053,7 @@ class Mesh(metaclass = MeshMeta):
variation of the given Angles along path steps variation of the given Angles along path steps
Returns: Returns:
list of created :class:`groups <SMESH.SMESH_GroupBase>` and list of created :class:`groups <SMESH.SMESH_GroupBase>` and
:class:`error code <SMESH.SMESH_MeshEditor.Extrusion_Error>` if *MakeGroups* == True, :class:`error code <SMESH.SMESH_MeshEditor.Extrusion_Error>` if *MakeGroups* == True,
only :class:`error code <SMESH.SMESH_MeshEditor.Extrusion_Error>` otherwise only :class:`error code <SMESH.SMESH_MeshEditor.Extrusion_Error>` otherwise
Example: :ref:`tui_extrusion_along_path` Example: :ref:`tui_extrusion_along_path`
@ -6077,7 +6080,7 @@ class Mesh(metaclass = MeshMeta):
PathShape: shape (edge) defines the sub-mesh for the path PathShape: shape (edge) defines the sub-mesh for the path
NodeStart: the first or the last node on the edge. Defines the direction of extrusion NodeStart: the first or the last node on the edge. Defines the direction of extrusion
HasAngles: not used obsolete HasAngles: not used obsolete
Angles: list of angles in radians. Nodes at each extrusion step are rotated Angles: list of angles in radians. Nodes at each extrusion step are rotated
around *basePoint*, additionally to previous steps. around *basePoint*, additionally to previous steps.
HasRefPoint: allows using the reference point HasRefPoint: allows using the reference point
RefPoint: the reference point around which the shape is rotated (the mass center of the shape by default). RefPoint: the reference point around which the shape is rotated (the mass center of the shape by default).
@ -6088,7 +6091,7 @@ class Mesh(metaclass = MeshMeta):
variation of the given Angles along path steps variation of the given Angles along path steps
Returns: Returns:
list of created :class:`groups <SMESH.SMESH_GroupBase>` and list of created :class:`groups <SMESH.SMESH_GroupBase>` and
:class:`error code <SMESH.SMESH_MeshEditor.Extrusion_Error>` if *MakeGroups* == True, :class:`error code <SMESH.SMESH_MeshEditor.Extrusion_Error>` if *MakeGroups* == True,
only :class:`error code <SMESH.SMESH_MeshEditor.Extrusion_Error>` otherwise only :class:`error code <SMESH.SMESH_MeshEditor.Extrusion_Error>` otherwise
Example: :ref:`tui_extrusion_along_path` Example: :ref:`tui_extrusion_along_path`
@ -6498,7 +6501,7 @@ class Mesh(metaclass = MeshMeta):
theObject (SMESH.SMESH_IDSource): the source object (mesh, sub-mesh, group or filter) theObject (SMESH.SMESH_IDSource): the source object (mesh, sub-mesh, group or filter)
theValue (float): signed offset size theValue (float): signed offset size
MakeGroups (boolean): forces the generation of new groups from existing ones MakeGroups (boolean): forces the generation of new groups from existing ones
CopyElements (boolean): if *NewMeshName* is empty, True means to keep original elements, CopyElements (boolean): if *NewMeshName* is empty, True means to keep original elements,
False means to remove original elements. False means to remove original elements.
NewMeshName (string): the name of a mesh to create. If empty, offset elements are added to this mesh NewMeshName (string): the name of a mesh to create. If empty, offset elements are added to this mesh
@ -6879,7 +6882,7 @@ class Mesh(metaclass = MeshMeta):
Parameters: Parameters:
theElements: container of elements to duplicate. It can be a theElements: container of elements to duplicate. It can be a
:class:`mesh, sub-mesh, group, filter <SMESH.SMESH_IDSource>` :class:`mesh, sub-mesh, group, filter <SMESH.SMESH_IDSource>`
or a list of element IDs. If *theElements* is or a list of element IDs. If *theElements* is
a :class:`Mesh`, elements of highest dimension are duplicated a :class:`Mesh`, elements of highest dimension are duplicated
theGroupName: a name of group to contain the generated elements. theGroupName: a name of group to contain the generated elements.
@ -6889,7 +6892,7 @@ class Mesh(metaclass = MeshMeta):
in any group. in any group.
Returns: Returns:
a :class:`group <SMESH.SMESH_Group>` where the new elements are added. a :class:`group <SMESH.SMESH_Group>` where the new elements are added.
None if *theGroupName* == "". None if *theGroupName* == "".
""" """
@ -7158,7 +7161,7 @@ class Mesh(metaclass = MeshMeta):
return self.editor.CreateHoleSkin( radius, theShape, groupName, theNodesCoords ) return self.editor.CreateHoleSkin( radius, theShape, groupName, theNodesCoords )
def MakePolyLine(self, segments, groupName='', isPreview=False ): def MakePolyLine(self, segments, groupName='', isPreview=False ):
""" """
Create a polyline consisting of 1D mesh elements each lying on a 2D element of Create a polyline consisting of 1D mesh elements each lying on a 2D element of
the initial triangle mesh. Positions of new nodes are found by cutting the mesh by the the initial triangle mesh. Positions of new nodes are found by cutting the mesh by the
plane passing through pairs of points specified by each :class:`SMESH.PolySegment` structure. plane passing through pairs of points specified by each :class:`SMESH.PolySegment` structure.
@ -7176,7 +7179,7 @@ class Mesh(metaclass = MeshMeta):
segments: list of :class:`SMESH.PolySegment` defining positions of cutting planes. segments: list of :class:`SMESH.PolySegment` defining positions of cutting planes.
groupName: optional name of a group where created mesh segments will be added. groupName: optional name of a group where created mesh segments will be added.
""" """
editor = self.editor editor = self.editor
if isPreview: if isPreview:
editor = self.mesh.GetMeshEditPreviewer() editor = self.mesh.GetMeshEditPreviewer()
@ -7331,10 +7334,10 @@ class Mesh(metaclass = MeshMeta):
""" """
Computes a radian measure of an angle defined by 3 nodes: <(node1,node2,node3) Computes a radian measure of an angle defined by 3 nodes: <(node1,node2,node3)
Parameters: Parameters:
node1,node2,node3: IDs of the three nodes node1,node2,node3: IDs of the three nodes
Returns: Returns:
Angle in radians [0,PI]. -1 if failure case. Angle in radians [0,PI]. -1 if failure case.
""" """
p1 = self.GetNodeXYZ( node1 ) p1 = self.GetNodeXYZ( node1 )