2016-03-18 22:10:20 +05:00
# Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
2009-02-17 10:27:49 +05:00
#
2012-08-09 16:03:55 +06:00
# 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
2014-02-20 18:25:37 +06:00
# version 2.1 of the License, or (at your option) any later version.
2008-03-07 12:47:05 +05:00
#
2012-08-09 16:03:55 +06:00
# 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.
2008-03-07 12:47:05 +05:00
#
2012-08-09 16:03:55 +06:00
# 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
2008-03-07 12:47:05 +05:00
#
2012-08-09 16:03:55 +06:00
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
2008-03-07 12:47:05 +05:00
#
2013-04-04 13:08:19 +06:00
# File : smeshBuilder.py
2008-03-07 12:47:05 +05:00
# Author : Francis KLOSS, OCC
# Module : SMESH
2012-08-09 16:03:55 +06:00
2008-03-07 12:47:05 +05:00
import salome
2013-04-04 13:08:19 +06:00
from salome . geom import geomBuilder
2008-03-07 12:47:05 +05:00
2009-02-17 10:27:49 +05:00
import SMESH # This is necessary for back compatibility
2016-04-06 19:24:26 +05:00
import omniORB # back compatibility
SMESH . MED_V2_1 = omniORB . EnumItem ( " MED_V2_1 " , 0 ) # back compatibility
SMESH . MED_V2_2 = omniORB . EnumItem ( " MED_V2_2 " , 1 ) # back compatibility
2008-03-07 12:47:05 +05:00
from SMESH import *
2013-04-04 13:08:19 +06:00
from salome . smesh . smesh_algorithm import Mesh_Algorithm
2008-03-07 12:47:05 +05:00
import SALOME
2012-08-09 16:03:55 +06:00
import SALOMEDS
2013-04-04 13:08:19 +06:00
import os
2017-03-29 18:54:42 +05:00
import inspect
2008-03-07 12:47:05 +05:00
2017-05-09 19:30:56 +05:00
# In case the omniORBpy EnumItem class does not fully support Python 3
# (for instance in version 4.2.1-2), the comparison ordering methods must be
# defined
#
try :
SMESH . Entity_Triangle < SMESH . Entity_Quadrangle
except TypeError :
def enumitem_eq ( self , other ) :
try :
if isinstance ( other , omniORB . EnumItem ) :
if other . _parent_id == self . _parent_id :
return self . _v == other . _v
else :
return self . _parent_id == other . _parent_id
else :
return id ( self ) == id ( other )
except :
return id ( self ) == id ( other )
def enumitem_lt ( self , other ) :
try :
if isinstance ( other , omniORB . EnumItem ) :
if other . _parent_id == self . _parent_id :
return self . _v < other . _v
else :
return self . _parent_id < other . _parent_id
else :
return id ( self ) < id ( other )
except :
return id ( self ) < id ( other )
def enumitem_le ( self , other ) :
try :
if isinstance ( other , omniORB . EnumItem ) :
if other . _parent_id == self . _parent_id :
return self . _v < = other . _v
else :
return self . _parent_id < = other . _parent_id
else :
return id ( self ) < = id ( other )
except :
return id ( self ) < = id ( other )
def enumitem_gt ( self , other ) :
try :
if isinstance ( other , omniORB . EnumItem ) :
if other . _parent_id == self . _parent_id :
return self . _v > other . _v
else :
return self . _parent_id > other . _parent_id
else :
return id ( self ) > id ( other )
except :
return id ( self ) > id ( other )
def enumitem_ge ( self , other ) :
try :
if isinstance ( other , omniORB . EnumItem ) :
if other . _parent_id == self . _parent_id :
return self . _v > = other . _v
else :
return self . _parent_id > = other . _parent_id
else :
return id ( self ) > = id ( other )
except :
return id ( self ) > = id ( other )
omniORB . EnumItem . __eq__ = enumitem_eq
omniORB . EnumItem . __lt__ = enumitem_lt
omniORB . EnumItem . __le__ = enumitem_le
omniORB . EnumItem . __gt__ = enumitem_gt
omniORB . EnumItem . __ge__ = enumitem_ge
2008-03-07 12:47:05 +05:00
2014-02-05 14:08:10 +06:00
class MeshMeta ( type ) :
2017-12-08 19:09:48 +05:00
""" Private class used to workaround a problem that sometimes isinstance(m, Mesh) returns False
"""
2014-02-05 14:08:10 +06:00
def __instancecheck__ ( cls , inst ) :
""" Implement isinstance(inst, cls). """
return any ( cls . __subclasscheck__ ( c )
for c in { type ( inst ) , inst . __class__ } )
def __subclasscheck__ ( cls , sub ) :
""" Implement issubclass(sub, cls). """
return type . __subclasscheck__ ( cls , sub ) or ( cls . __name__ == sub . __name__ and cls . __module__ == sub . __module__ )
2009-02-17 10:27:49 +05:00
def DegreesToRadians ( AngleInDegrees ) :
2017-12-08 19:09:48 +05:00
""" Convert an angle from degrees to radians
"""
2009-02-17 10:27:49 +05:00
from math import pi
return AngleInDegrees * pi / 180.0
2012-08-09 16:03:55 +06:00
import salome_notebook
notebook = salome_notebook . notebook
2009-02-17 10:27:49 +05:00
# Salome notebook variable separator
var_separator = " : "
2012-08-09 16:03:55 +06:00
def ParseParameters ( * args ) :
2017-12-08 19:09:48 +05:00
"""
Return list of variable values from salome notebook .
The last argument , if is callable , is used to modify values got from notebook
"""
2009-02-17 10:27:49 +05:00
Result = [ ]
Parameters = " "
2012-08-09 16:03:55 +06:00
hasVariables = False
varModifFun = None
2017-03-29 18:54:42 +05:00
if args and callable ( args [ - 1 ] ) :
2012-08-09 16:03:55 +06:00
args , varModifFun = args [ : - 1 ] , args [ - 1 ]
for parameter in args :
Parameters + = str ( parameter ) + var_separator
if isinstance ( parameter , str ) :
# check if there is an inexistent variable name
if not notebook . isVariable ( parameter ) :
2017-03-20 17:27:30 +05:00
raise ValueError ( " Variable with name ' " + parameter + " ' doesn ' t exist!!! " )
2012-08-09 16:03:55 +06:00
parameter = notebook . get ( parameter )
hasVariables = True
if varModifFun :
parameter = varModifFun ( parameter )
pass
2009-02-17 10:27:49 +05:00
pass
2012-08-09 16:03:55 +06:00
Result . append ( parameter )
2009-02-17 10:27:49 +05:00
pass
2012-08-09 16:03:55 +06:00
Parameters = Parameters [ : - 1 ]
Result . append ( Parameters )
Result . append ( hasVariables )
return Result
def ParseAngles ( * args ) :
2017-12-08 19:09:48 +05:00
"""
Parse parameters while converting variables to radians
"""
2012-08-09 16:03:55 +06:00
return ParseParameters ( * ( args + ( DegreesToRadians , ) ) )
def __initPointStruct ( point , * args ) :
2017-12-08 19:09:48 +05:00
"""
Substitute PointStruct . __init__ ( ) to create SMESH . PointStruct using notebook variables .
Parameters are stored in PointStruct . parameters attribute
"""
2012-08-09 16:03:55 +06:00
point . x , point . y , point . z , point . parameters , hasVars = ParseParameters ( * args )
pass
SMESH . PointStruct . __init__ = __initPointStruct
def __initAxisStruct ( ax , * args ) :
2017-12-08 19:09:48 +05:00
"""
Substitute AxisStruct . __init__ ( ) to create SMESH . AxisStruct using notebook variables .
Parameters are stored in AxisStruct . parameters attribute
"""
2015-03-17 17:06:56 +05:00
if len ( args ) != 6 :
2017-03-20 17:27:30 +05:00
raise RuntimeError ( " Bad nb args ( %s ) passed in SMESH.AxisStruct(x,y,z,dx,dy,dz) " % ( len ( args ) ) )
2012-08-09 16:03:55 +06:00
ax . x , ax . y , ax . z , ax . vx , ax . vy , ax . vz , ax . parameters , hasVars = ParseParameters ( * args )
pass
SMESH . AxisStruct . __init__ = __initAxisStruct
2013-04-04 13:08:19 +06:00
smeshPrecisionConfusion = 1.e-07
def IsEqual ( val1 , val2 , tol = smeshPrecisionConfusion ) :
2017-12-08 19:09:48 +05:00
""" Compare real values using smeshPrecisionConfusion as tolerance
"""
2008-03-07 12:47:05 +05:00
if abs ( val1 - val2 ) < tol :
return True
return False
NO_NAME = " NoName "
def GetName ( obj ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Return a name of an object
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
object name
2017-12-08 19:09:48 +05:00
"""
2012-08-09 16:03:55 +06:00
if obj :
# object not null
if isinstance ( obj , SALOMEDS . _objref_SObject ) :
# study object
return obj . GetName ( )
2013-02-12 20:37:44 +06:00
try :
ior = salome . orb . object_to_string ( obj )
except :
ior = None
2012-08-09 16:03:55 +06:00
if ior :
2017-06-13 15:01:10 +05:00
sobj = salome . myStudy . FindObjectIOR ( ior )
if sobj :
2012-08-09 16:03:55 +06:00
return sobj . GetName ( )
if hasattr ( obj , " GetName " ) :
# unknown CORBA object, having GetName() method
return obj . GetName ( )
else :
# unknown CORBA object, no GetName() method
return NO_NAME
pass
if hasattr ( obj , " GetName " ) :
# unknown non-CORBA object, having GetName() method
return obj . GetName ( )
pass
2017-03-20 17:27:30 +05:00
raise RuntimeError ( " Null or invalid object " )
2008-03-07 12:47:05 +05:00
2014-08-21 17:15:12 +06:00
def TreatHypoStatus ( status , hypName , geomName , isAlgo , mesh ) :
2017-12-08 19:09:48 +05:00
"""
Print error message if a hypothesis was not assigned .
"""
2008-03-07 12:47:05 +05:00
if isAlgo :
hypType = " algorithm "
else :
hypType = " hypothesis "
pass
2014-08-21 17:15:12 +06:00
reason = " "
if hasattr ( status , " __getitem__ " ) :
2017-05-09 19:30:56 +05:00
status , reason = status [ 0 ] , status [ 1 ]
if status == HYP_UNKNOWN_FATAL :
2008-03-07 12:47:05 +05:00
reason = " for unknown reason "
2017-05-09 19:30:56 +05:00
elif status == HYP_INCOMPATIBLE :
2009-02-17 10:27:49 +05:00
reason = " this hypothesis mismatches the algorithm "
2017-05-09 19:30:56 +05:00
elif status == HYP_NOTCONFORM :
2009-02-17 10:27:49 +05:00
reason = " a non-conform mesh would be built "
2017-05-09 19:30:56 +05:00
elif status == HYP_ALREADY_EXIST :
2012-08-09 16:03:55 +06:00
if isAlgo : return # it does not influence anything
2009-02-17 10:27:49 +05:00
reason = hypType + " of the same dimension is already assigned to this shape "
2017-05-09 19:30:56 +05:00
elif status == HYP_BAD_DIM :
2009-02-17 10:27:49 +05:00
reason = hypType + " mismatches the shape "
2018-02-27 16:23:35 +05:00
elif status == HYP_CONCURRENT :
2008-03-07 12:47:05 +05:00
reason = " there are concurrent hypotheses on sub-shapes "
2017-05-09 19:30:56 +05:00
elif status == HYP_BAD_SUBSHAPE :
2012-08-09 16:03:55 +06:00
reason = " the shape is neither the main one, nor its sub-shape, nor a valid group "
2008-03-07 12:47:05 +05:00
elif status == HYP_BAD_GEOMETRY :
2015-08-19 19:32:58 +05:00
reason = " the algorithm is not applicable to this geometry "
2008-03-07 12:47:05 +05:00
elif status == HYP_HIDDEN_ALGO :
2009-02-17 10:27:49 +05:00
reason = " it is hidden by an algorithm of an upper dimension, which generates elements of all dimensions "
2008-03-07 12:47:05 +05:00
elif status == HYP_HIDING_ALGO :
2009-02-17 10:27:49 +05:00
reason = " it hides algorithms of lower dimensions by generating elements of all dimensions "
elif status == HYP_NEED_SHAPE :
2014-08-21 17:15:12 +06:00
reason = " algorithm can ' t work without shape "
elif status == HYP_INCOMPAT_HYPS :
pass
2008-03-07 12:47:05 +05:00
else :
return
2014-08-21 17:15:12 +06:00
where = geomName
if where :
where = ' " %s " ' % geomName
if mesh :
meshName = GetName ( mesh )
if meshName and meshName != NO_NAME :
2016-03-04 22:54:10 +05:00
where = ' " %s " shape in " %s " mesh ' % ( geomName , meshName )
2014-08-21 17:15:12 +06:00
if status < HYP_UNKNOWN_FATAL and where :
2017-03-20 17:27:30 +05:00
print ( ' " %s " was assigned to %s but %s ' % ( hypName , where , reason ) )
2014-08-21 17:15:12 +06:00
elif where :
2017-03-20 17:27:30 +05:00
print ( ' " %s " was not assigned to %s : %s ' % ( hypName , where , reason ) )
2012-08-09 16:03:55 +06:00
else :
2017-03-20 17:27:30 +05:00
print ( ' " %s " was not assigned : %s ' % ( hypName , reason ) )
2008-03-07 12:47:05 +05:00
pass
2012-08-09 16:03:55 +06:00
def AssureGeomPublished ( mesh , geom , name = ' ' ) :
2017-12-08 19:09:48 +05:00
"""
Private method . Add geom ( sub - shape of the main shape ) into the study if not yet there
"""
2013-04-04 13:08:19 +06:00
if not isinstance ( geom , geomBuilder . GEOM . _objref_GEOM_Object ) :
2012-08-09 16:03:55 +06:00
return
2017-06-13 15:01:10 +05:00
if not geom . GetStudyEntry ( ) :
2012-08-09 16:03:55 +06:00
## get a name
2013-04-04 13:08:19 +06:00
if not name and geom . GetShapeType ( ) != geomBuilder . GEOM . COMPOUND :
2016-12-16 21:17:51 +05:00
# for all groups SubShapeName() return "Compound_-1"
2012-08-09 16:03:55 +06:00
name = mesh . geompyD . SubShapeName ( geom , mesh . geom )
if not name :
name = " %s _ %s " % ( geom . GetShapeType ( ) , id ( geom ) % 10000 )
## publish
mesh . geompyD . addToStudyInFather ( mesh . geom , geom , name )
return
2013-04-17 17:34:31 +06:00
def FirstVertexOnCurve ( mesh , edge ) :
2017-12-08 19:09:48 +05:00
"""
Returns :
2018-05-25 22:04:48 +05:00
the first vertex of a geometrical edge by ignoring orientation
2017-12-08 19:09:48 +05:00
"""
2013-04-17 17:34:31 +06:00
vv = mesh . geompyD . SubShapeAll ( edge , geomBuilder . geomBuilder . ShapeType [ " VERTEX " ] )
2012-08-09 16:03:55 +06:00
if not vv :
2017-03-20 17:27:30 +05:00
raise TypeError ( " Given object has no vertices " )
2012-08-09 16:03:55 +06:00
if len ( vv ) == 1 : return vv [ 0 ]
2013-04-17 17:34:31 +06:00
v0 = mesh . geompyD . MakeVertexOnCurve ( edge , 0. )
xyz = mesh . geompyD . PointCoordinates ( v0 ) # coords of the first vertex
xyz1 = mesh . geompyD . PointCoordinates ( vv [ 0 ] )
xyz2 = mesh . geompyD . PointCoordinates ( vv [ 1 ] )
2012-08-09 16:03:55 +06:00
dist1 , dist2 = 0 , 0
for i in range ( 3 ) :
dist1 + = abs ( xyz [ i ] - xyz1 [ i ] )
dist2 + = abs ( xyz [ i ] - xyz2 [ i ] )
if dist1 < dist2 :
return vv [ 0 ]
else :
return vv [ 1 ]
2013-04-04 13:08:19 +06:00
smeshInst = None
2017-12-08 19:09:48 +05:00
"""
Warning :
smeshInst is a singleton
"""
2013-04-04 13:08:19 +06:00
engine = None
doLcc = False
2013-04-10 22:33:43 +06:00
created = False
2013-04-04 13:08:19 +06:00
2018-06-14 16:56:19 +05:00
class smeshBuilder ( SMESH . _objref_SMESH_Gen , object ) :
2017-12-08 19:09:48 +05:00
"""
This class allows to create , load or manipulate meshes .
It has a set of methods to create , load or copy meshes , to combine several meshes , etc .
It also has methods to get infos and measure meshes .
"""
2013-04-04 13:08:19 +06:00
# MirrorType enumeration
POINT = SMESH_MeshEditor . POINT
AXIS = SMESH_MeshEditor . AXIS
PLANE = SMESH_MeshEditor . PLANE
# Smooth_Method enumeration
LAPLACIAN_SMOOTH = SMESH_MeshEditor . LAPLACIAN_SMOOTH
CENTROIDAL_SMOOTH = SMESH_MeshEditor . CENTROIDAL_SMOOTH
PrecisionConfusion = smeshPrecisionConfusion
# TopAbs_State enumeration
2017-03-20 17:27:30 +05:00
[ TopAbs_IN , TopAbs_OUT , TopAbs_ON , TopAbs_UNKNOWN ] = list ( range ( 4 ) )
2013-04-04 13:08:19 +06:00
# Methods of splitting a hexahedron into tetrahedra
2014-01-20 16:31:23 +06:00
Hex_5Tet , Hex_6Tet , Hex_24Tet , Hex_2Prisms , Hex_4Prisms = 1 , 2 , 3 , 1 , 2
2013-04-04 13:08:19 +06:00
2017-03-20 22:01:59 +05:00
def __new__ ( cls , * args ) :
2013-04-04 13:08:19 +06:00
global engine
global smeshInst
global doLcc
2018-06-14 16:56:19 +05:00
#print("==== __new__", engine, smeshInst, doLcc)
2013-04-04 13:08:19 +06:00
if smeshInst is None :
# smesh engine is either retrieved from engine, or created
smeshInst = engine
# Following test avoids a recursive loop
if doLcc :
if smeshInst is not None :
# smesh engine not created: existing engine found
doLcc = False
if doLcc :
doLcc = False
# FindOrLoadComponent called:
# 1. CORBA resolution of server
# 2. the __new__ method is called again
2018-06-14 16:56:19 +05:00
#print("==== smeshInst = lcc.FindOrLoadComponent ", engine, smeshInst, doLcc)
2013-04-04 13:08:19 +06:00
smeshInst = salome . lcc . FindOrLoadComponent ( " FactoryServer " , " SMESH " )
else :
# FindOrLoadComponent not called
if smeshInst is None :
# smeshBuilder instance is created from lcc.FindOrLoadComponent
2018-06-14 16:56:19 +05:00
#print("==== smeshInst = super(smeshBuilder,cls).__new__(cls) ", engine, smeshInst, doLcc)
2013-04-04 13:08:19 +06:00
smeshInst = super ( smeshBuilder , cls ) . __new__ ( cls )
else :
# smesh engine not created: existing engine found
2018-06-14 16:56:19 +05:00
#print("==== existing ", engine, smeshInst, doLcc)
2013-04-04 13:08:19 +06:00
pass
2018-06-14 16:56:19 +05:00
#print("====1 ", smeshInst)
2013-04-04 13:08:19 +06:00
return smeshInst
2018-06-14 16:56:19 +05:00
#print("====2 ", smeshInst)
2013-04-04 13:08:19 +06:00
return smeshInst
2017-03-20 22:01:59 +05:00
def __init__ ( self , * args ) :
2013-04-10 22:33:43 +06:00
global created
2018-06-14 16:56:19 +05:00
#print("--------------- smeshbuilder __init__ ---", created)
2013-04-10 22:33:43 +06:00
if not created :
2017-03-20 17:22:47 +05:00
created = True
2017-03-20 22:01:59 +05:00
SMESH . _objref_SMESH_Gen . __init__ ( self , * args )
2008-03-07 12:47:05 +05:00
2012-08-09 16:03:55 +06:00
def DumpPython ( self , theStudy , theIsPublished = True , theIsMultiFile = True ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Dump component to the Python script .
This method overrides IDL function to allow default values for the parameters .
2017-12-08 19:09:48 +05:00
"""
2012-08-09 16:03:55 +06:00
return SMESH . _objref_SMESH_Gen . DumpPython ( self , theStudy , theIsPublished , theIsMultiFile )
def SetDumpPythonHistorical ( self , isHistorical ) :
2017-12-08 19:09:48 +05:00
"""
Set mode of DumpPython ( ) , * historical * or * snapshot * .
2018-05-25 22:04:48 +05:00
In the * historical * mode , the Python Dump script includes all commands
performed by SMESH engine . In the * snapshot * mode , commands
relating to objects removed from the Study are excluded from the script
as well as commands not influencing the current state of meshes
2017-12-08 19:09:48 +05:00
"""
2012-08-09 16:03:55 +06:00
if isHistorical : val = " true "
else : val = " false "
SMESH . _objref_SMESH_Gen . SetOption ( self , " historical_python_dump " , val )
2018-06-14 16:56:19 +05:00
def init_smesh ( self , geompyD = None ) :
2017-12-08 19:09:48 +05:00
"""
2018-06-14 16:56:19 +05:00
Set Geometry component
"""
#print("init_smesh")
2017-06-13 15:01:10 +05:00
self . UpdateStudy ( geompyD )
2018-06-14 16:56:19 +05:00
notebook . myStudy = salome . myStudy
2009-02-17 10:27:49 +05:00
2008-03-07 12:47:05 +05:00
def Mesh ( self , obj = 0 , name = 0 ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Create a mesh . This mesh can be either
* an empty mesh not bound to geometry , if * obj * == 0
* 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 .
2017-12-08 19:09:48 +05:00
Parameters :
2018-05-25 22:04:48 +05:00
obj : either
1. a : class : ` CORBA mesh < SMESH . SMESH_Mesh > ` got by calling e . g .
: :
salome . myStudy . FindObjectID ( " 0:1:2:3 " ) . GetObject ( )
2. a geometrical object for meshing
3. none .
2017-12-08 19:09:48 +05:00
name : the name for the new mesh .
Returns :
2018-05-25 22:04:48 +05:00
an instance of class : class : ` Mesh ` .
2017-12-08 19:09:48 +05:00
"""
2012-08-09 16:03:55 +06:00
if isinstance ( obj , str ) :
obj , name = name , obj
2018-06-14 16:56:19 +05:00
return Mesh ( self , self . geompyD , obj , name )
2008-03-07 12:47:05 +05:00
def EnumToLong ( self , theItem ) :
2017-12-08 19:09:48 +05:00
"""
Return a long value from enumeration
"""
2008-03-07 12:47:05 +05:00
return theItem . _v
2012-08-09 16:03:55 +06:00
def ColorToString ( self , c ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Convert SALOMEDS . Color to string .
2017-12-08 19:09:48 +05:00
To be used with filters .
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
c : color value ( SALOMEDS . Color )
2018-05-25 22:04:48 +05:00
Returns :
a string representation of the color .
2017-12-08 19:09:48 +05:00
"""
2012-08-09 16:03:55 +06:00
val = " "
if isinstance ( c , SALOMEDS . Color ) :
val = " %s ; %s ; %s " % ( c . R , c . G , c . B )
elif isinstance ( c , str ) :
val = c
else :
2017-03-20 17:27:30 +05:00
raise ValueError ( " Color value should be of string or SALOMEDS.Color type " )
2012-08-09 16:03:55 +06:00
return val
2008-03-07 12:47:05 +05:00
def GetPointStruct ( self , theVertex ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Get : class : ` SMESH . PointStruct ` from vertex
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theVertex ( GEOM . GEOM_Object ) : vertex
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . PointStruct `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
[ x , y , z ] = self . geompyD . PointCoordinates ( theVertex )
return PointStruct ( x , y , z )
def GetDirStruct ( self , theVector ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Get : class : ` SMESH . DirStruct ` from vector
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theVector ( GEOM . GEOM_Object ) : vector
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . DirStruct `
"""
2017-12-08 19:09:48 +05:00
2013-04-04 13:08:19 +06:00
vertices = self . geompyD . SubShapeAll ( theVector , geomBuilder . geomBuilder . ShapeType [ " VERTEX " ] )
2008-03-07 12:47:05 +05:00
if ( len ( vertices ) != 2 ) :
2017-03-20 17:27:30 +05:00
print ( " Error: vector object is incorrect. " )
2008-03-07 12:47:05 +05:00
return None
p1 = self . geompyD . PointCoordinates ( vertices [ 0 ] )
p2 = self . geompyD . PointCoordinates ( vertices [ 1 ] )
pnt = PointStruct ( p2 [ 0 ] - p1 [ 0 ] , p2 [ 1 ] - p1 [ 1 ] , p2 [ 2 ] - p1 [ 2 ] )
dirst = DirStruct ( pnt )
return dirst
def MakeDirStruct ( self , x , y , z ) :
2018-05-25 22:04:48 +05:00
"""
Make : class : ` SMESH . DirStruct ` from a triplet of floats
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
x , y , z ( float ) : vector components
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . DirStruct `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
pnt = PointStruct ( x , y , z )
return DirStruct ( pnt )
def GetAxisStruct ( self , theObj ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Get : class : ` SMESH . AxisStruct ` from a geometrical object
2017-12-08 19:09:48 +05:00
Parameters :
2018-05-25 22:04:48 +05:00
theObj ( GEOM . GEOM_Object ) : line or plane
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . AxisStruct `
2017-12-08 19:09:48 +05:00
"""
2014-06-26 18:15:06 +06:00
import GEOM
2013-04-04 13:08:19 +06:00
edges = self . geompyD . SubShapeAll ( theObj , geomBuilder . geomBuilder . ShapeType [ " EDGE " ] )
2014-06-26 18:15:06 +06:00
axis = None
2008-03-07 12:47:05 +05:00
if len ( edges ) > 1 :
2013-04-04 13:08:19 +06:00
vertex1 , vertex2 = self . geompyD . SubShapeAll ( edges [ 0 ] , geomBuilder . geomBuilder . ShapeType [ " VERTEX " ] )
vertex3 , vertex4 = self . geompyD . SubShapeAll ( edges [ 1 ] , geomBuilder . geomBuilder . ShapeType [ " VERTEX " ] )
2008-03-07 12:47:05 +05:00
vertex1 = self . geompyD . PointCoordinates ( vertex1 )
vertex2 = self . geompyD . PointCoordinates ( vertex2 )
vertex3 = self . geompyD . PointCoordinates ( vertex3 )
vertex4 = self . geompyD . PointCoordinates ( vertex4 )
v1 = [ vertex2 [ 0 ] - vertex1 [ 0 ] , vertex2 [ 1 ] - vertex1 [ 1 ] , vertex2 [ 2 ] - vertex1 [ 2 ] ]
v2 = [ vertex4 [ 0 ] - vertex3 [ 0 ] , vertex4 [ 1 ] - vertex3 [ 1 ] , vertex4 [ 2 ] - vertex3 [ 2 ] ]
normal = [ v1 [ 1 ] * v2 [ 2 ] - v2 [ 1 ] * v1 [ 2 ] , v1 [ 2 ] * v2 [ 0 ] - v2 [ 2 ] * v1 [ 0 ] , v1 [ 0 ] * v2 [ 1 ] - v2 [ 0 ] * v1 [ 1 ] ]
axis = AxisStruct ( vertex1 [ 0 ] , vertex1 [ 1 ] , vertex1 [ 2 ] , normal [ 0 ] , normal [ 1 ] , normal [ 2 ] )
2014-06-26 18:15:06 +06:00
axis . _mirrorType = SMESH . SMESH_MeshEditor . PLANE
2008-03-07 12:47:05 +05:00
elif len ( edges ) == 1 :
2013-04-04 13:08:19 +06:00
vertex1 , vertex2 = self . geompyD . SubShapeAll ( edges [ 0 ] , geomBuilder . geomBuilder . ShapeType [ " VERTEX " ] )
2008-03-07 12:47:05 +05:00
p1 = self . geompyD . PointCoordinates ( vertex1 )
p2 = self . geompyD . PointCoordinates ( vertex2 )
axis = AxisStruct ( p1 [ 0 ] , p1 [ 1 ] , p1 [ 2 ] , p2 [ 0 ] - p1 [ 0 ] , p2 [ 1 ] - p1 [ 1 ] , p2 [ 2 ] - p1 [ 2 ] )
2014-06-26 18:15:06 +06:00
axis . _mirrorType = SMESH . SMESH_MeshEditor . AXIS
elif theObj . GetShapeType ( ) == GEOM . VERTEX :
x , y , z = self . geompyD . PointCoordinates ( theObj )
axis = AxisStruct ( x , y , z , 1 , 0 , 0 , )
axis . _mirrorType = SMESH . SMESH_MeshEditor . POINT
return axis
2008-03-07 12:47:05 +05:00
# From SMESH_Gen interface:
# ------------------------
2009-02-17 10:27:49 +05:00
def SetName ( self , obj , name ) :
2018-05-25 22:04:48 +05:00
"""
Set the given name to an object
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
obj : the object to rename
name : a new object name
"""
2017-12-08 19:09:48 +05:00
2009-02-17 10:27:49 +05:00
if isinstance ( obj , Mesh ) :
obj = obj . GetMesh ( )
elif isinstance ( obj , Mesh_Algorithm ) :
obj = obj . GetAlgorithm ( )
ior = salome . orb . object_to_string ( obj )
SMESH . _objref_SMESH_Gen . SetName ( self , ior , name )
2008-03-07 12:47:05 +05:00
def SetEmbeddedMode ( self , theMode ) :
2018-05-25 22:04:48 +05:00
"""
Set the current mode
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
SMESH . _objref_SMESH_Gen . SetEmbeddedMode ( self , theMode )
def IsEmbeddedMode ( self ) :
2018-05-25 22:04:48 +05:00
"""
Get the current mode
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return SMESH . _objref_SMESH_Gen . IsEmbeddedMode ( self )
2017-06-13 15:01:10 +05:00
def UpdateStudy ( self , geompyD = None ) :
2018-06-19 21:58:29 +05:00
"""
Update the current study . Calling UpdateStudy ( ) allows to
update meshes at switching GEOM - > SMESH
"""
2017-06-13 15:01:10 +05:00
#self.UpdateStudy()
2018-06-19 21:58:29 +05:00
if not geompyD :
2013-04-04 13:08:19 +06:00
from salome . geom import geomBuilder
geompyD = geomBuilder . geom
2018-07-04 16:39:04 +05:00
if not geompyD :
geompyD = geomBuilder . New ( )
2009-02-17 10:27:49 +05:00
pass
2018-06-19 21:58:29 +05:00
self . geompyD = geompyD
self . SetGeomEngine ( geompyD )
SMESH . _objref_SMESH_Gen . UpdateStudy ( self )
sb = salome . myStudy . NewBuilder ( )
sc = salome . myStudy . FindComponent ( " SMESH " )
if sc :
2018-06-14 16:56:19 +05:00
sb . LoadWith ( sc , self )
2018-06-19 21:58:29 +05:00
pass
2018-06-14 16:56:19 +05:00
2017-06-13 15:01:10 +05:00
def SetEnablePublish ( self , theIsEnablePublish ) :
2018-06-19 21:58:29 +05:00
"""
Set enable publishing in the study . Calling SetEnablePublish ( False ) allows to
switch * * off * * publishing in the Study of mesh objects .
"""
#self.SetEnablePublish(theIsEnablePublish)
SMESH . _objref_SMESH_Gen . SetEnablePublish ( self , theIsEnablePublish )
global notebook
notebook = salome_notebook . NoteBook ( theIsEnablePublish )
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
def CreateMeshesFromUNV ( self , theFileName ) :
2018-05-25 22:04:48 +05:00
"""
Create a Mesh object importing data from the given UNV file
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
an instance of class : class : ` Mesh `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
aSmeshMesh = SMESH . _objref_SMESH_Gen . CreateMeshesFromUNV ( self , theFileName )
aMesh = Mesh ( self , self . geompyD , aSmeshMesh )
return aMesh
def CreateMeshesFromMED ( self , theFileName ) :
2018-05-25 22:04:48 +05:00
"""
Create a Mesh object ( s ) importing data from the given MED file
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
a tuple ( list of class : class : ` Mesh ` instances ,
: class : ` SMESH . DriverMED_ReadStatus ` )
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
aSmeshMeshes , aStatus = SMESH . _objref_SMESH_Gen . CreateMeshesFromMED ( self , theFileName )
2013-05-16 22:55:14 +06:00
aMeshes = [ Mesh ( self , self . geompyD , m ) for m in aSmeshMeshes ]
2008-03-07 12:47:05 +05:00
return aMeshes , aStatus
2012-08-09 16:03:55 +06:00
def CreateMeshesFromSAUV ( self , theFileName ) :
2018-05-25 22:04:48 +05:00
"""
Create a Mesh object ( s ) importing data from the given SAUV file
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
a tuple ( list of class : class : ` Mesh ` instances , : class : ` SMESH . DriverMED_ReadStatus ` )
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
aSmeshMeshes , aStatus = SMESH . _objref_SMESH_Gen . CreateMeshesFromSAUV ( self , theFileName )
2013-05-16 22:55:14 +06:00
aMeshes = [ Mesh ( self , self . geompyD , m ) for m in aSmeshMeshes ]
2012-08-09 16:03:55 +06:00
return aMeshes , aStatus
2008-03-07 12:47:05 +05:00
def CreateMeshesFromSTL ( self , theFileName ) :
2018-05-25 22:04:48 +05:00
"""
Create a Mesh object importing data from the given STL file
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
an instance of class : class : ` Mesh `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
aSmeshMesh = SMESH . _objref_SMESH_Gen . CreateMeshesFromSTL ( self , theFileName )
aMesh = Mesh ( self , self . geompyD , aSmeshMesh )
return aMesh
2012-08-09 16:03:55 +06:00
def CreateMeshesFromCGNS ( self , theFileName ) :
2018-05-25 22:04:48 +05:00
"""
Create Mesh objects importing data from the given CGNS file
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
a tuple ( list of class : class : ` Mesh ` instances , : class : ` SMESH . DriverMED_ReadStatus ` )
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
aSmeshMeshes , aStatus = SMESH . _objref_SMESH_Gen . CreateMeshesFromCGNS ( self , theFileName )
2013-05-16 22:55:14 +06:00
aMeshes = [ Mesh ( self , self . geompyD , m ) for m in aSmeshMeshes ]
2012-08-09 16:03:55 +06:00
return aMeshes , aStatus
2012-10-08 17:56:59 +06:00
def CreateMeshesFromGMF ( self , theFileName ) :
2018-05-25 22:04:48 +05:00
"""
Create a Mesh object importing data from the given GMF file .
GMF files must have . mesh extension for the ASCII format and . meshb for
the binary format .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
( an instance of class : class : ` Mesh ` , : class : ` SMESH . ComputeError ` )
"""
2017-12-08 19:09:48 +05:00
2012-12-13 17:41:29 +06:00
aSmeshMesh , error = SMESH . _objref_SMESH_Gen . CreateMeshesFromGMF ( self ,
theFileName ,
True )
2017-03-20 17:27:30 +05:00
if error . comment : print ( " *** CreateMeshesFromGMF() errors: \n " , error . comment )
2012-10-08 17:56:59 +06:00
return Mesh ( self , self . geompyD , aSmeshMesh ) , error
2009-02-17 10:27:49 +05:00
def Concatenate ( self , meshes , uniteIdenticalGroups ,
2013-02-12 20:37:44 +06:00
mergeNodesAndElements = False , mergeTolerance = 1e-5 , allGroups = False ,
name = " " ) :
2018-05-25 22:04:48 +05:00
"""
Concatenate the given meshes into one mesh . All groups of input meshes will be
present in the new mesh .
Parameters :
meshes : : class : ` meshes , sub - meshes , groups or filters < SMESH . SMESH_IDSource > ` to combine into one mesh
uniteIdenticalGroups : if True , groups with same names are united , else they are renamed
mergeNodesAndElements : if True , equal nodes and elements are merged
mergeTolerance : tolerance for merging nodes
allGroups : forces creation of groups corresponding to every input mesh
name : name of a new mesh
Returns :
an instance of class : class : ` Mesh `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if not meshes : return None
for i , m in enumerate ( meshes ) :
if isinstance ( m , Mesh ) :
meshes [ i ] = m . GetMesh ( )
mergeTolerance , Parameters , hasVars = ParseParameters ( mergeTolerance )
meshes [ 0 ] . SetParameters ( Parameters )
2009-02-17 10:27:49 +05:00
if allGroups :
aSmeshMesh = SMESH . _objref_SMESH_Gen . ConcatenateWithGroups (
self , meshes , uniteIdenticalGroups , mergeNodesAndElements , mergeTolerance )
else :
aSmeshMesh = SMESH . _objref_SMESH_Gen . Concatenate (
self , meshes , uniteIdenticalGroups , mergeNodesAndElements , mergeTolerance )
2013-02-12 20:37:44 +06:00
aMesh = Mesh ( self , self . geompyD , aSmeshMesh , name = name )
2009-02-17 10:27:49 +05:00
return aMesh
2012-08-09 16:03:55 +06:00
def CopyMesh ( self , meshPart , meshName , toCopyGroups = False , toKeepIDs = False ) :
2018-05-25 22:04:48 +05:00
"""
Create a mesh by copying a part of another mesh .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
meshPart : a part of mesh to copy , either
: class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > ` .
To copy nodes or elements not forming any mesh object ,
pass result of : meth : ` Mesh . GetIDSource ` as * meshPart *
meshName : a name of the new mesh
toCopyGroups : to create in the new mesh groups the copied elements belongs to
toKeepIDs : to preserve order of the copied elements or not
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
an instance of class : class : ` Mesh `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if ( isinstance ( meshPart , Mesh ) ) :
meshPart = meshPart . GetMesh ( )
mesh = SMESH . _objref_SMESH_Gen . CopyMesh ( self , meshPart , meshName , toCopyGroups , toKeepIDs )
return Mesh ( self , self . geompyD , mesh )
2008-03-07 12:47:05 +05:00
def GetSubShapesId ( self , theMainObject , theListOfSubObjects ) :
2018-05-25 22:04:48 +05:00
"""
Return IDs of sub - shapes
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theMainObject ( GEOM . GEOM_Object ) : a shape
theListOfSubObjects : sub - shapes ( list of GEOM . GEOM_Object )
Returns :
the list of integer values
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return SMESH . _objref_SMESH_Gen . GetSubShapesId ( self , theMainObject , theListOfSubObjects )
def GetPattern ( self ) :
2018-05-25 22:04:48 +05:00
"""
Create a pattern mapper .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
an instance of : class : ` SMESH . SMESH_Pattern `
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
: ref : ` Example of Patterns usage < tui_pattern_mapping > `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return SMESH . _objref_SMESH_Gen . GetPattern ( self )
2009-02-17 10:27:49 +05:00
def SetBoundaryBoxSegmentation ( self , nbSegments ) :
2017-12-08 19:09:48 +05:00
"""
Set number of segments per diagonal of boundary box of geometry , by which
default segment length of appropriate 1 D hypotheses is defined in GUI .
Default value is 10.
"""
2009-02-17 10:27:49 +05:00
SMESH . _objref_SMESH_Gen . SetBoundaryBoxSegmentation ( self , nbSegments )
2008-03-07 12:47:05 +05:00
# Filtering. Auxiliary functions:
# ------------------------------
def GetEmptyCriterion ( self ) :
2018-05-25 22:04:48 +05:00
"""
Create an empty criterion
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . Filter . Criterion `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
Type = self . EnumToLong ( FT_Undefined )
Compare = self . EnumToLong ( FT_Undefined )
Threshold = 0
ThresholdStr = " "
ThresholdID = " "
UnaryOp = self . EnumToLong ( FT_Undefined )
BinaryOp = self . EnumToLong ( FT_Undefined )
Tolerance = 1e-07
TypeOfElement = ALL
Precision = - 1 ##@1e-07
return Filter . Criterion ( Type , Compare , Threshold , ThresholdStr , ThresholdID ,
UnaryOp , BinaryOp , Tolerance , TypeOfElement , Precision )
def GetCriterion ( self , elementType ,
CritType ,
Compare = FT_EqualTo ,
2012-08-09 16:03:55 +06:00
Threshold = " " ,
2008-03-07 12:47:05 +05:00
UnaryOp = FT_Undefined ,
2012-08-09 16:03:55 +06:00
BinaryOp = FT_Undefined ,
Tolerance = 1e-07 ) :
2018-05-25 22:04:48 +05:00
"""
Create a criterion by the given parameters
Criterion structures allow to define complex filters by combining them with logical operations ( AND / OR ) ( see example below )
Parameters :
elementType : the : class : ` type of elements < SMESH . ElementType > ` ( SMESH . NODE , SMESH . EDGE , SMESH . FACE , SMESH . VOLUME )
CritType : the type of criterion : class : ` SMESH . FunctorType ` ( SMESH . FT_Taper , SMESH . FT_Area , etc . ) .
Note that the items starting from FT_LessThan are not suitable for * CritType * .
Compare : belongs to { SMESH . FT_LessThan , SMESH . FT_MoreThan , SMESH . FT_EqualTo }
Threshold : the threshold value ( range of ids as string , shape , numeric )
UnaryOp : SMESH . FT_LogicalNOT or SMESH . FT_Undefined
BinaryOp : a binary logical operation SMESH . FT_LogicalAND , SMESH . FT_LogicalOR or
SMESH . FT_Undefined
Tolerance : the tolerance used by SMESH . FT_BelongToGeom , SMESH . FT_BelongToSurface ,
SMESH . FT_LyingOnGeom , SMESH . FT_CoplanarFaces criteria
Returns :
: class : ` SMESH . Filter . Criterion `
Example : : ref : ` combining_filters `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if not CritType in SMESH . FunctorType . _items :
2017-03-20 17:27:30 +05:00
raise TypeError ( " CritType should be of SMESH.FunctorType " )
2013-05-16 22:55:14 +06:00
aCriterion = self . GetEmptyCriterion ( )
2008-03-07 12:47:05 +05:00
aCriterion . TypeOfElement = elementType
2013-05-16 22:55:14 +06:00
aCriterion . Type = self . EnumToLong ( CritType )
aCriterion . Tolerance = Tolerance
2008-03-07 12:47:05 +05:00
2012-08-09 16:03:55 +06:00
aThreshold = Threshold
2008-03-07 12:47:05 +05:00
if Compare in [ FT_LessThan , FT_MoreThan , FT_EqualTo ] :
aCriterion . Compare = self . EnumToLong ( Compare )
elif Compare == " = " or Compare == " == " :
aCriterion . Compare = self . EnumToLong ( FT_EqualTo )
elif Compare == " < " :
aCriterion . Compare = self . EnumToLong ( FT_LessThan )
elif Compare == " > " :
aCriterion . Compare = self . EnumToLong ( FT_MoreThan )
2012-08-09 16:03:55 +06:00
elif Compare != FT_Undefined :
2008-03-07 12:47:05 +05:00
aCriterion . Compare = self . EnumToLong ( FT_EqualTo )
2012-08-09 16:03:55 +06:00
aThreshold = Compare
2008-03-07 12:47:05 +05:00
if CritType in [ FT_BelongToGeom , FT_BelongToPlane , FT_BelongToGenSurface ,
FT_BelongToCylinder , FT_LyingOnGeom ] :
2015-04-14 17:39:28 +05:00
# Check that Threshold is GEOM object
2013-04-04 13:08:19 +06:00
if isinstance ( aThreshold , geomBuilder . GEOM . _objref_GEOM_Object ) :
2012-08-09 16:03:55 +06:00
aCriterion . ThresholdStr = GetName ( aThreshold )
2012-12-13 17:41:29 +06:00
aCriterion . ThresholdID = aThreshold . GetStudyEntry ( )
2012-08-09 16:03:55 +06:00
if not aCriterion . ThresholdID :
2012-12-13 17:41:29 +06:00
name = aCriterion . ThresholdStr
if not name :
name = " %s _ %s " % ( aThreshold . GetShapeType ( ) , id ( aThreshold ) % 10000 )
aCriterion . ThresholdID = self . geompyD . addToStudy ( aThreshold , name )
2015-03-03 17:03:38 +05:00
# or a name of GEOM object
elif isinstance ( aThreshold , str ) :
aCriterion . ThresholdStr = aThreshold
2008-03-07 12:47:05 +05:00
else :
2017-03-20 17:27:30 +05:00
raise TypeError ( " The Threshold should be a shape. " )
2012-08-09 16:03:55 +06:00
if isinstance ( UnaryOp , float ) :
aCriterion . Tolerance = UnaryOp
UnaryOp = FT_Undefined
pass
2015-04-14 17:39:28 +05:00
elif CritType == FT_BelongToMeshGroup :
# Check that Threshold is a group
if isinstance ( aThreshold , SMESH . _objref_SMESH_GroupBase ) :
if aThreshold . GetType ( ) != elementType :
2017-03-20 17:27:30 +05:00
raise ValueError ( " Group type mismatches Element type " )
2015-04-14 17:39:28 +05:00
aCriterion . ThresholdStr = aThreshold . GetName ( )
aCriterion . ThresholdID = salome . orb . object_to_string ( aThreshold )
2017-06-13 15:01:10 +05:00
study = salome . myStudy
2015-04-14 19:18:18 +05:00
if study :
so = study . FindObjectIOR ( aCriterion . ThresholdID )
if so :
entry = so . GetID ( )
if entry :
aCriterion . ThresholdID = entry
2015-04-14 17:39:28 +05:00
else :
2017-03-20 17:27:30 +05:00
raise TypeError ( " The Threshold should be a Mesh Group " )
2008-03-07 12:47:05 +05:00
elif CritType == FT_RangeOfIds :
2015-04-14 17:39:28 +05:00
# Check that Threshold is string
2012-08-09 16:03:55 +06:00
if isinstance ( aThreshold , str ) :
aCriterion . ThresholdStr = aThreshold
2008-03-07 12:47:05 +05:00
else :
2017-03-20 17:27:30 +05:00
raise TypeError ( " The Threshold should be a string. " )
2012-08-09 16:03:55 +06:00
elif CritType == FT_CoplanarFaces :
2015-04-14 17:39:28 +05:00
# Check the Threshold
2012-08-09 16:03:55 +06:00
if isinstance ( aThreshold , int ) :
aCriterion . ThresholdID = str ( aThreshold )
elif isinstance ( aThreshold , str ) :
ID = int ( aThreshold )
if ID < 1 :
2017-03-20 17:27:30 +05:00
raise ValueError ( " Invalid ID of mesh face: ' %s ' " % aThreshold )
2012-08-09 16:03:55 +06:00
aCriterion . ThresholdID = aThreshold
else :
2017-03-20 17:27:30 +05:00
raise TypeError ( " The Threshold should be an ID of mesh face and not ' %s ' " % aThreshold )
2013-05-16 22:55:14 +06:00
elif CritType == FT_ConnectedElements :
2015-04-14 17:39:28 +05:00
# Check the Threshold
2013-05-16 22:55:14 +06:00
if isinstance ( aThreshold , geomBuilder . GEOM . _objref_GEOM_Object ) : # shape
aCriterion . ThresholdID = aThreshold . GetStudyEntry ( )
if not aCriterion . ThresholdID :
name = aThreshold . GetName ( )
if not name :
name = " %s _ %s " % ( aThreshold . GetShapeType ( ) , id ( aThreshold ) % 10000 )
aCriterion . ThresholdID = self . geompyD . addToStudy ( aThreshold , name )
elif isinstance ( aThreshold , int ) : # node id
aCriterion . Threshold = aThreshold
elif isinstance ( aThreshold , list ) : # 3 point coordinates
if len ( aThreshold ) < 3 :
2017-03-20 17:27:30 +05:00
raise ValueError ( " too few point coordinates, must be 3 " )
2013-05-16 22:55:14 +06:00
aCriterion . ThresholdStr = " " . join ( [ str ( c ) for c in aThreshold [ : 3 ] ] )
elif isinstance ( aThreshold , str ) :
if aThreshold . isdigit ( ) :
aCriterion . Threshold = aThreshold # node id
else :
aCriterion . ThresholdStr = aThreshold # hope that it's point coordinates
else :
2017-03-20 17:27:30 +05:00
raise TypeError ( " The Threshold should either a VERTEX, or a node ID, " \
" or a list of point coordinates and not ' %s ' " % aThreshold )
2012-08-09 16:03:55 +06:00
elif CritType == FT_ElemGeomType :
2015-04-14 17:39:28 +05:00
# Check the Threshold
2012-08-09 16:03:55 +06:00
try :
aCriterion . Threshold = self . EnumToLong ( aThreshold )
assert ( aThreshold in SMESH . GeometryType . _items )
except :
if isinstance ( aThreshold , int ) :
aCriterion . Threshold = aThreshold
else :
2017-03-20 17:27:30 +05:00
raise TypeError ( " The Threshold should be an integer or SMESH.GeometryType. " )
2012-08-09 16:03:55 +06:00
pass
pass
2013-03-06 19:57:01 +06:00
elif CritType == FT_EntityType :
2015-04-14 17:39:28 +05:00
# Check the Threshold
2013-03-06 19:57:01 +06:00
try :
aCriterion . Threshold = self . EnumToLong ( aThreshold )
assert ( aThreshold in SMESH . EntityType . _items )
except :
if isinstance ( aThreshold , int ) :
aCriterion . Threshold = aThreshold
else :
2017-03-20 17:27:30 +05:00
raise TypeError ( " The Threshold should be an integer or SMESH.EntityType. " )
2013-03-06 19:57:01 +06:00
pass
pass
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
elif CritType == FT_GroupColor :
2015-04-14 17:39:28 +05:00
# Check the Threshold
2012-08-09 16:03:55 +06:00
try :
aCriterion . ThresholdStr = self . ColorToString ( aThreshold )
except :
2017-03-20 17:27:30 +05:00
raise TypeError ( " The threshold value should be of SALOMEDS.Color type " )
2012-08-09 16:03:55 +06:00
pass
elif CritType in [ FT_FreeBorders , FT_FreeEdges , FT_FreeNodes , FT_FreeFaces ,
FT_LinearOrQuadratic , FT_BadOrientedVolume ,
FT_BareBorderFace , FT_BareBorderVolume ,
FT_OverConstrainedFace , FT_OverConstrainedVolume ,
FT_EqualNodes , FT_EqualEdges , FT_EqualFaces , FT_EqualVolumes ] :
# At this point the Threshold is unnecessary
if aThreshold == FT_LogicalNOT :
2008-03-07 12:47:05 +05:00
aCriterion . UnaryOp = self . EnumToLong ( FT_LogicalNOT )
2012-08-09 16:03:55 +06:00
elif aThreshold in [ FT_LogicalAND , FT_LogicalOR ] :
aCriterion . BinaryOp = aThreshold
2008-03-07 12:47:05 +05:00
else :
2012-08-09 16:03:55 +06:00
# Check Threshold
2008-03-07 12:47:05 +05:00
try :
2012-08-09 16:03:55 +06:00
aThreshold = float ( aThreshold )
aCriterion . Threshold = aThreshold
2008-03-07 12:47:05 +05:00
except :
2017-03-20 17:27:30 +05:00
raise TypeError ( " The Threshold should be a number. " )
2008-03-07 12:47:05 +05:00
return None
2012-08-09 16:03:55 +06:00
if Threshold == FT_LogicalNOT or UnaryOp == FT_LogicalNOT :
2008-03-07 12:47:05 +05:00
aCriterion . UnaryOp = self . EnumToLong ( FT_LogicalNOT )
2012-08-09 16:03:55 +06:00
if Threshold in [ FT_LogicalAND , FT_LogicalOR ] :
aCriterion . BinaryOp = self . EnumToLong ( Threshold )
2008-03-07 12:47:05 +05:00
if UnaryOp in [ FT_LogicalAND , FT_LogicalOR ] :
aCriterion . BinaryOp = self . EnumToLong ( UnaryOp )
if BinaryOp in [ FT_LogicalAND , FT_LogicalOR ] :
aCriterion . BinaryOp = self . EnumToLong ( BinaryOp )
return aCriterion
def GetFilter ( self , elementType ,
CritType = FT_Undefined ,
Compare = FT_EqualTo ,
2012-08-09 16:03:55 +06:00
Threshold = " " ,
UnaryOp = FT_Undefined ,
2013-05-16 22:55:14 +06:00
Tolerance = 1e-07 ,
mesh = None ) :
2018-05-25 22:04:48 +05:00
"""
Create a filter with the given parameters
Parameters :
elementType : the : class : ` type of elements < SMESH . ElementType > ` ( SMESH . NODE , SMESH . EDGE , SMESH . FACE , SMESH . VOLUME )
CritType : the : class : ` type of criterion < SMESH . FunctorType > ` ( SMESH . FT_Taper , SMESH . FT_Area , etc . ) .
Note that the items starting from FT_LessThan are not suitable for CritType .
Compare : belongs to { SMESH . FT_LessThan , SMESH . FT_MoreThan , SMESH . FT_EqualTo }
Threshold : the threshold value ( range of ids as string , shape , numeric )
UnaryOp : SMESH . FT_LogicalNOT or SMESH . FT_Undefined
Tolerance : the tolerance used by SMESH . FT_BelongToGeom , SMESH . FT_BelongToSurface ,
SMESH . FT_LyingOnGeom , SMESH . FT_CoplanarFaces and SMESH . FT_EqualNodes criteria
mesh : the mesh to initialize the filter with
Returns :
: class : ` SMESH . Filter `
Examples :
See : doc : ` Filters usage examples < tui_filters > `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
aCriterion = self . GetCriterion ( elementType , CritType , Compare , Threshold , UnaryOp , FT_Undefined , Tolerance )
2008-03-07 12:47:05 +05:00
aFilterMgr = self . CreateFilterManager ( )
aFilter = aFilterMgr . CreateFilter ( )
aCriteria = [ ]
aCriteria . append ( aCriterion )
aFilter . SetCriteria ( aCriteria )
2013-05-16 22:55:14 +06:00
if mesh :
if isinstance ( mesh , Mesh ) : aFilter . SetMesh ( mesh . GetMesh ( ) )
else : aFilter . SetMesh ( mesh )
2012-08-09 16:03:55 +06:00
aFilterMgr . UnRegister ( )
return aFilter
2014-01-20 16:31:23 +06:00
def GetFilterFromCriteria ( self , criteria , binOp = SMESH . FT_LogicalAND ) :
2018-05-25 22:04:48 +05:00
"""
Create a filter from criteria
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
criteria : a list of : class : ` SMESH . Filter . Criterion `
binOp : binary operator used when binary operator of criteria is undefined
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . Filter `
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Examples :
See : doc : ` Filters usage examples < tui_filters > `
"""
2017-12-08 19:09:48 +05:00
2014-01-20 16:31:23 +06:00
for i in range ( len ( criteria ) - 1 ) :
if criteria [ i ] . BinaryOp == self . EnumToLong ( SMESH . FT_Undefined ) :
criteria [ i ] . BinaryOp = self . EnumToLong ( binOp )
2012-08-09 16:03:55 +06:00
aFilterMgr = self . CreateFilterManager ( )
aFilter = aFilterMgr . CreateFilter ( )
aFilter . SetCriteria ( criteria )
aFilterMgr . UnRegister ( )
2008-03-07 12:47:05 +05:00
return aFilter
def GetFunctor ( self , theCriterion ) :
2018-05-25 22:04:48 +05:00
"""
Create a numerical functor by its type
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theCriterion ( SMESH . FunctorType ) : functor type .
Note that not all items correspond to numerical functors .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . NumericalFunctor `
"""
2017-12-08 19:09:48 +05:00
2012-12-13 17:41:29 +06:00
if isinstance ( theCriterion , SMESH . _objref_NumericalFunctor ) :
return theCriterion
2008-03-07 12:47:05 +05:00
aFilterMgr = self . CreateFilterManager ( )
2013-02-12 20:37:44 +06:00
functor = None
2008-03-07 12:47:05 +05:00
if theCriterion == FT_AspectRatio :
2013-02-12 20:37:44 +06:00
functor = aFilterMgr . CreateAspectRatio ( )
2008-03-07 12:47:05 +05:00
elif theCriterion == FT_AspectRatio3D :
2013-02-12 20:37:44 +06:00
functor = aFilterMgr . CreateAspectRatio3D ( )
2008-03-07 12:47:05 +05:00
elif theCriterion == FT_Warping :
2013-02-12 20:37:44 +06:00
functor = aFilterMgr . CreateWarping ( )
2008-03-07 12:47:05 +05:00
elif theCriterion == FT_MinimumAngle :
2013-02-12 20:37:44 +06:00
functor = aFilterMgr . CreateMinimumAngle ( )
2008-03-07 12:47:05 +05:00
elif theCriterion == FT_Taper :
2013-02-12 20:37:44 +06:00
functor = aFilterMgr . CreateTaper ( )
2008-03-07 12:47:05 +05:00
elif theCriterion == FT_Skew :
2013-02-12 20:37:44 +06:00
functor = aFilterMgr . CreateSkew ( )
2008-03-07 12:47:05 +05:00
elif theCriterion == FT_Area :
2013-02-12 20:37:44 +06:00
functor = aFilterMgr . CreateArea ( )
2008-03-07 12:47:05 +05:00
elif theCriterion == FT_Volume3D :
2013-02-12 20:37:44 +06:00
functor = aFilterMgr . CreateVolume3D ( )
2012-08-09 16:03:55 +06:00
elif theCriterion == FT_MaxElementLength2D :
2013-02-12 20:37:44 +06:00
functor = aFilterMgr . CreateMaxElementLength2D ( )
2012-08-09 16:03:55 +06:00
elif theCriterion == FT_MaxElementLength3D :
2013-02-12 20:37:44 +06:00
functor = aFilterMgr . CreateMaxElementLength3D ( )
2008-03-07 12:47:05 +05:00
elif theCriterion == FT_MultiConnection :
2013-02-12 20:37:44 +06:00
functor = aFilterMgr . CreateMultiConnection ( )
2008-03-07 12:47:05 +05:00
elif theCriterion == FT_MultiConnection2D :
2013-02-12 20:37:44 +06:00
functor = aFilterMgr . CreateMultiConnection2D ( )
2008-03-07 12:47:05 +05:00
elif theCriterion == FT_Length :
2013-02-12 20:37:44 +06:00
functor = aFilterMgr . CreateLength ( )
2008-03-07 12:47:05 +05:00
elif theCriterion == FT_Length2D :
2013-02-12 20:37:44 +06:00
functor = aFilterMgr . CreateLength2D ( )
2017-10-12 21:52:03 +05:00
elif theCriterion == FT_Deflection2D :
functor = aFilterMgr . CreateDeflection2D ( )
2016-08-11 18:44:16 +05:00
elif theCriterion == FT_NodeConnectivityNumber :
functor = aFilterMgr . CreateNodeConnectivityNumber ( )
elif theCriterion == FT_BallDiameter :
functor = aFilterMgr . CreateBallDiameter ( )
2008-03-07 12:47:05 +05:00
else :
2017-03-20 17:27:30 +05:00
print ( " Error: given parameter is not numerical functor type. " )
2013-02-12 20:37:44 +06:00
aFilterMgr . UnRegister ( )
return functor
2008-03-07 12:47:05 +05:00
2009-02-17 10:27:49 +05:00
def CreateHypothesis ( self , theHType , theLibName = " libStdMeshersEngine.so " ) :
2018-05-25 22:04:48 +05:00
"""
Create hypothesis
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theHType ( string ) : mesh hypothesis type
theLibName ( string ) : mesh plug - in library name
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
created hypothesis instance
"""
2012-08-09 16:03:55 +06:00
hyp = SMESH . _objref_SMESH_Gen . CreateHypothesis ( self , theHType , theLibName )
if isinstance ( hyp , SMESH . _objref_SMESH_Algo ) :
return hyp
# wrap hypothesis methods
for meth_name in dir ( hyp . __class__ ) :
if not meth_name . startswith ( " Get " ) and \
not meth_name in dir ( SMESH . _objref_SMESH_Hypothesis ) :
method = getattr ( hyp . __class__ , meth_name )
if callable ( method ) :
setattr ( hyp , meth_name , hypMethodWrapper ( hyp , method ) )
return hyp
def GetMeshInfo ( self , obj ) :
2018-05-25 22:04:48 +05:00
"""
Get the mesh statistic .
Use : meth : ` smeshBuilder . EnumToLong ` to get an integer from
an item of : class : ` SMESH . EntityType ` .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
dictionary { : class : ` SMESH . EntityType ` - " count of elements " }
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if isinstance ( obj , Mesh ) :
obj = obj . GetMesh ( )
d = { }
if hasattr ( obj , " GetMeshInfo " ) :
values = obj . GetMeshInfo ( )
for i in range ( SMESH . Entity_Last . _v ) :
if i < len ( values ) : d [ SMESH . EntityType . _item ( i ) ] = values [ i ]
pass
return d
def MinDistance ( self , src1 , src2 = None , id1 = 0 , id2 = 0 , isElem1 = False , isElem2 = False ) :
2018-05-25 22:04:48 +05:00
"""
Get minimum distance between two objects
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
* If * src2 * is None , and * id2 * = 0 , distance from * src1 * / * id1 * to the origin is computed .
* If * src2 * is None , and * id2 * != 0 , it is assumed that both * id1 * and * id2 * belong to * src1 * .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
src1 ( SMESH . SMESH_IDSource ) : first source object
src2 ( SMESH . SMESH_IDSource ) : second source object
id1 ( int ) : node / element id from the first source
id2 ( int ) : node / element id from the second ( or first ) source
isElem1 ( boolean ) : * True * if * id1 * is element id , * False * if it is node id
isElem2 ( boolean ) : * True * if * id2 * is element id , * False * if it is node id
Returns :
minimum distance value
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
See also :
: meth : ` GetMinDistance `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
result = self . GetMinDistance ( src1 , src2 , id1 , id2 , isElem1 , isElem2 )
if result is None :
result = 0.0
else :
result = result . value
return result
def GetMinDistance ( self , src1 , src2 = None , id1 = 0 , id2 = 0 , isElem1 = False , isElem2 = False ) :
2018-05-25 22:04:48 +05:00
"""
Get : class : ` SMESH . Measure ` structure specifying minimum distance data between two objects
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
* If * src2 * is None , and * id2 * = 0 , distance from * src1 * / * id1 * to the origin is computed .
* If * src2 * is None , and * id2 * != 0 , it is assumed that both * id1 * and * id2 * belong to * src1 * .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
src1 ( SMESH . SMESH_IDSource ) : first source object
src2 ( SMESH . SMESH_IDSource ) : second source object
id1 ( int ) : node / element id from the first source
id2 ( int ) : node / element id from the second ( or first ) source
isElem1 ( boolean ) : * True * if * * id1 * * is element id , * False * if it is node id
isElem2 ( boolean ) : * True * if * * id2 * * is element id , * False * if it is node id
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . Measure ` structure or None if input data is invalid
See also :
: meth : ` MinDistance `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if isinstance ( src1 , Mesh ) : src1 = src1 . mesh
if isinstance ( src2 , Mesh ) : src2 = src2 . mesh
if src2 is None and id2 != 0 : src2 = src1
if not hasattr ( src1 , " _narrow " ) : return None
src1 = src1 . _narrow ( SMESH . SMESH_IDSource )
if not src1 : return None
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2012-08-09 16:03:55 +06:00
if id1 != 0 :
m = src1 . GetMesh ( )
e = m . GetMeshEditor ( )
if isElem1 :
src1 = e . MakeIDSource ( [ id1 ] , SMESH . FACE )
else :
src1 = e . MakeIDSource ( [ id1 ] , SMESH . NODE )
2013-08-07 20:06:39 +06:00
unRegister . set ( src1 )
2012-08-09 16:03:55 +06:00
pass
if hasattr ( src2 , " _narrow " ) :
src2 = src2 . _narrow ( SMESH . SMESH_IDSource )
if src2 and id2 != 0 :
m = src2 . GetMesh ( )
e = m . GetMeshEditor ( )
if isElem2 :
src2 = e . MakeIDSource ( [ id2 ] , SMESH . FACE )
else :
src2 = e . MakeIDSource ( [ id2 ] , SMESH . NODE )
2013-08-07 20:06:39 +06:00
unRegister . set ( src2 )
2012-08-09 16:03:55 +06:00
pass
pass
aMeasurements = self . CreateMeasurements ( )
2013-08-07 20:06:39 +06:00
unRegister . set ( aMeasurements )
2012-08-09 16:03:55 +06:00
result = aMeasurements . MinDistance ( src1 , src2 )
return result
def BoundingBox ( self , objects ) :
2018-05-25 22:04:48 +05:00
"""
Get bounding box of the specified object ( s )
Parameters :
objects ( SMESH . SMESH_IDSource ) : single source object or list of source objects
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
tuple of six values ( minX , minY , minZ , maxX , maxY , maxZ )
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
See also :
: meth : ` GetBoundingBox `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
result = self . GetBoundingBox ( objects )
if result is None :
result = ( 0.0 , ) * 6
else :
result = ( result . minX , result . minY , result . minZ , result . maxX , result . maxY , result . maxZ )
return result
def GetBoundingBox ( self , objects ) :
2018-05-25 22:04:48 +05:00
"""
Get : class : ` SMESH . Measure ` structure specifying bounding box data of the specified object ( s )
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
objects ( SMESH . SMESH_IDSource ) : single source object or list of source objects
Returns :
: class : ` SMESH . Measure ` structure
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
See also :
: meth : ` BoundingBox `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if isinstance ( objects , tuple ) :
objects = list ( objects )
if not isinstance ( objects , list ) :
objects = [ objects ]
srclist = [ ]
for o in objects :
if isinstance ( o , Mesh ) :
srclist . append ( o . mesh )
elif hasattr ( o , " _narrow " ) :
src = o . _narrow ( SMESH . SMESH_IDSource )
if src : srclist . append ( src )
pass
pass
aMeasurements = self . CreateMeasurements ( )
result = aMeasurements . BoundingBox ( srclist )
aMeasurements . UnRegister ( )
return result
2009-02-17 10:27:49 +05:00
2013-08-20 19:48:54 +06:00
def GetLength ( self , obj ) :
2018-05-25 22:04:48 +05:00
"""
Get sum of lengths of all 1 D elements in the mesh object .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
obj : : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
sum of lengths of all 1 D elements
"""
2017-12-08 19:09:48 +05:00
2013-08-20 19:48:54 +06:00
if isinstance ( obj , Mesh ) : obj = obj . mesh
if isinstance ( obj , Mesh_Algorithm ) : obj = obj . GetSubMesh ( )
aMeasurements = self . CreateMeasurements ( )
value = aMeasurements . Length ( obj )
aMeasurements . UnRegister ( )
return value
def GetArea ( self , obj ) :
2018-05-25 22:04:48 +05:00
"""
Get sum of areas of all 2 D elements in the mesh object .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
obj : : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
sum of areas of all 2 D elements
"""
2017-12-08 19:09:48 +05:00
2013-08-20 19:48:54 +06:00
if isinstance ( obj , Mesh ) : obj = obj . mesh
if isinstance ( obj , Mesh_Algorithm ) : obj = obj . GetSubMesh ( )
aMeasurements = self . CreateMeasurements ( )
value = aMeasurements . Area ( obj )
aMeasurements . UnRegister ( )
return value
def GetVolume ( self , obj ) :
2018-05-25 22:04:48 +05:00
"""
Get sum of volumes of all 3 D elements in the mesh object .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
obj : : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
sum of volumes of all 3 D elements
"""
2017-12-08 19:09:48 +05:00
2013-08-20 19:48:54 +06:00
if isinstance ( obj , Mesh ) : obj = obj . mesh
if isinstance ( obj , Mesh_Algorithm ) : obj = obj . GetSubMesh ( )
aMeasurements = self . CreateMeasurements ( )
value = aMeasurements . Volume ( obj )
aMeasurements . UnRegister ( )
return value
2018-01-15 19:20:17 +05:00
def GetGravityCenter ( self , obj ) :
2017-12-08 19:09:48 +05:00
"""
Get gravity center of all nodes of the mesh object .
Parameters :
2018-05-25 22:04:48 +05:00
obj : : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
Three components of the gravity center ( x , y , z )
2017-12-08 19:09:48 +05:00
"""
2018-01-15 19:20:17 +05:00
if isinstance ( obj , Mesh ) : obj = obj . mesh
if isinstance ( obj , Mesh_Algorithm ) : obj = obj . GetSubMesh ( )
aMeasurements = self . CreateMeasurements ( )
pointStruct = aMeasurements . GravityCenter ( obj )
aMeasurements . UnRegister ( )
return pointStruct . x , pointStruct . y , pointStruct . z
2013-08-20 19:48:54 +06:00
pass # end of class smeshBuilder
2008-03-07 12:47:05 +05:00
import omniORB
2013-04-04 13:08:19 +06:00
omniORB . registerObjref ( SMESH . _objref_SMESH_Gen . _NP_RepositoryId , smeshBuilder )
2018-05-25 22:04:48 +05:00
""" Registering the new proxy for SMESH.SMESH_Gen """
2013-04-04 13:08:19 +06:00
2018-06-14 16:56:19 +05:00
def New ( instance = None , instanceGeom = None ) :
2013-04-04 13:08:19 +06:00
"""
2018-05-25 22:04:48 +05:00
Create a new smeshBuilder instance . The smeshBuilder class provides the Python
2013-04-04 13:08:19 +06:00
interface to create or load meshes .
2018-06-19 21:58:29 +05:00
Typical use is : :
2018-05-25 22:04:48 +05:00
2013-04-04 13:08:19 +06:00
import salome
salome . salome_init ( )
from salome . smesh import smeshBuilder
2017-06-13 15:01:10 +05:00
smesh = smeshBuilder . New ( )
2013-04-04 13:08:19 +06:00
Parameters :
2018-06-19 21:58:29 +05:00
study : SALOME study , generally obtained by salome . myStudy .
instance : CORBA proxy of SMESH Engine . If None , the default Engine is used .
instanceGeom : CORBA proxy of GEOM Engine . If None , the default Engine is used .
2013-04-04 13:08:19 +06:00
Returns :
2018-05-25 22:04:48 +05:00
: class : ` smeshBuilder ` instance
2013-04-04 13:08:19 +06:00
"""
global engine
global smeshInst
global doLcc
engine = instance
if engine is None :
2017-03-20 17:22:47 +05:00
doLcc = True
2013-04-04 13:08:19 +06:00
smeshInst = smeshBuilder ( )
assert isinstance ( smeshInst , smeshBuilder ) , " Smesh engine class is %s but should be smeshBuilder.smeshBuilder. Import salome.smesh.smeshBuilder before creating the instance. " % smeshInst . __class__
2018-06-14 16:56:19 +05:00
smeshInst . init_smesh ( instanceGeom )
2013-04-04 13:08:19 +06:00
return smeshInst
2008-03-07 12:47:05 +05:00
# Public class: Mesh
# ==================
2018-06-14 16:56:19 +05:00
class Mesh ( metaclass = MeshMeta ) :
2017-12-08 19:09:48 +05:00
"""
This class allows defining and managing a mesh .
It has a set of methods to build a mesh on the given geometry , including the definition of sub - meshes .
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
about a mesh and to export a mesh in different formats .
2018-06-14 16:56:19 +05:00
"""
2008-03-07 12:47:05 +05:00
geom = 0
mesh = 0
editor = 0
def __init__ ( self , smeshpyD , geompyD , obj = 0 , name = 0 ) :
2018-06-14 16:56:19 +05:00
2018-05-25 22:04:48 +05:00
"""
Constructor
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Create a mesh on the shape * obj * ( or an empty mesh if * obj * is equal to 0 ) and
sets the GUI name of this mesh to * name * .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
smeshpyD : an instance of smeshBuilder class
geompyD : an instance of geomBuilder class
obj : Shape to be meshed or : class : ` SMESH . SMESH_Mesh ` object
name : Study name of the mesh
"""
2017-12-08 19:09:48 +05:00
2017-03-29 19:58:59 +05:00
self . smeshpyD = smeshpyD
self . geompyD = geompyD
2008-03-07 12:47:05 +05:00
if obj is None :
obj = 0
2013-02-12 20:37:44 +06:00
objHasName = False
2008-03-07 12:47:05 +05:00
if obj != 0 :
2013-04-04 13:08:19 +06:00
if isinstance ( obj , geomBuilder . GEOM . _objref_GEOM_Object ) :
2008-03-07 12:47:05 +05:00
self . geom = obj
2013-02-12 20:37:44 +06:00
objHasName = True
2012-08-09 16:03:55 +06:00
# publish geom of mesh (issue 0021122)
2017-06-13 15:01:10 +05:00
if not self . geom . GetStudyEntry ( ) :
2012-08-09 16:03:55 +06:00
objHasName = False
2017-06-13 15:01:10 +05:00
geompyD . init_geom ( )
2012-10-08 17:56:59 +06:00
if name :
2013-02-12 20:37:44 +06:00
geo_name = name + " shape "
2012-10-08 17:56:59 +06:00
else :
2013-02-12 20:37:44 +06:00
geo_name = " %s _ %s to mesh " % ( self . geom . GetShapeType ( ) , id ( self . geom ) % 100 )
2012-08-09 16:03:55 +06:00
geompyD . addToStudy ( self . geom , geo_name )
2013-09-13 12:35:30 +06:00
self . SetMesh ( self . smeshpyD . CreateMesh ( self . geom ) )
2012-08-09 16:03:55 +06:00
2008-03-07 12:47:05 +05:00
elif isinstance ( obj , SMESH . _objref_SMESH_Mesh ) :
self . SetMesh ( obj )
else :
2013-09-13 12:58:16 +06:00
self . SetMesh ( self . smeshpyD . CreateEmptyMesh ( ) )
2013-02-12 20:37:44 +06:00
if name :
2009-02-17 10:27:49 +05:00
self . smeshpyD . SetName ( self . mesh , name )
2013-02-12 20:37:44 +06:00
elif objHasName :
self . smeshpyD . SetName ( self . mesh , GetName ( obj ) ) # + " mesh"
2009-02-17 10:27:49 +05:00
if not self . geom :
self . geom = self . mesh . GetShapeToMesh ( )
2008-03-07 12:47:05 +05:00
2012-12-13 17:41:29 +06:00
self . editor = self . mesh . GetMeshEditor ( )
self . functors = [ None ] * SMESH . FT_Undefined . _v
2008-03-07 12:47:05 +05:00
2012-08-09 16:03:55 +06:00
# set self to algoCreator's
for attrName in dir ( self ) :
attr = getattr ( self , attrName )
if isinstance ( attr , algoCreator ) :
setattr ( self , attrName , attr . copy ( self ) )
2013-09-13 12:35:30 +06:00
pass
pass
pass
2012-08-09 16:03:55 +06:00
2013-09-13 12:35:30 +06:00
def __del__ ( self ) :
2018-05-25 22:04:48 +05:00
"""
Destructor . Clean - up resources
"""
2013-09-13 12:35:30 +06:00
if self . mesh :
2013-09-19 18:44:24 +06:00
#self.mesh.UnRegister()
2013-09-13 12:35:30 +06:00
pass
pass
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
def SetMesh ( self , theMesh ) :
2018-05-25 22:04:48 +05:00
"""
Initialize the Mesh object from an instance of : class : ` SMESH . SMESH_Mesh ` interface
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theMesh : a : class : ` SMESH . SMESH_Mesh ` object
"""
2017-12-08 19:09:48 +05:00
2013-09-19 18:44:24 +06:00
# do not call Register() as this prevents mesh servant deletion at closing study
#if self.mesh: self.mesh.UnRegister()
2008-03-07 12:47:05 +05:00
self . mesh = theMesh
2013-02-12 20:37:44 +06:00
if self . mesh :
2013-09-19 18:44:24 +06:00
#self.mesh.Register()
2013-02-12 20:37:44 +06:00
self . geom = self . mesh . GetShapeToMesh ( )
2013-09-13 12:58:16 +06:00
pass
2008-03-07 12:47:05 +05:00
def GetMesh ( self ) :
2018-05-25 22:04:48 +05:00
"""
Return the mesh , that is an encapsulated instance of : class : ` SMESH . SMESH_Mesh ` interface
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
a : class : ` SMESH . SMESH_Mesh ` object
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh
def GetName ( self ) :
2018-05-25 22:04:48 +05:00
"""
Get the name of the mesh
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
the name of the mesh as a string
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
name = GetName ( self . GetMesh ( ) )
return name
def SetName ( self , name ) :
2018-05-25 22:04:48 +05:00
"""
Set a name to the mesh
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
name : a new name of the mesh
"""
2017-12-08 19:09:48 +05:00
2009-02-17 10:27:49 +05:00
self . smeshpyD . SetName ( self . GetMesh ( ) , name )
2012-08-09 16:03:55 +06:00
def GetSubMesh ( self , geom , name ) :
2018-05-25 22:04:48 +05:00
"""
Get a sub - mesh object associated to a * geom * geometrical object .
Parameters :
geom : a geometrical object ( shape )
name : a name for the sub - mesh in the Object Browser
Returns :
an object of type : class : ` SMESH . SMESH_subMesh ` , representing a part of mesh ,
which lies on the given shape
Note :
A sub - mesh is implicitly created when a sub - shape is specified at
creating an algorithm , for example : :
algo1D = mesh . Segment ( geom = Edge_1 )
creates a sub - mesh on * Edge_1 * and assign Wire Discretization algorithm to it .
The created sub - mesh can be retrieved from the algorithm : :
submesh = algo1D . GetSubMesh ( )
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
AssureGeomPublished ( self , geom , name )
submesh = self . mesh . GetSubMesh ( geom , name )
2008-03-07 12:47:05 +05:00
return submesh
def GetShape ( self ) :
2018-05-25 22:04:48 +05:00
"""
Return the shape associated to the mesh
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
a GEOM_Object
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . geom
def SetShape ( self , geom ) :
2018-05-25 22:04:48 +05:00
"""
Associate the given shape to the mesh ( entails the recreation of the mesh )
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
geom : the shape to be meshed ( GEOM_Object )
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
self . mesh = self . smeshpyD . CreateMesh ( geom )
2012-08-09 16:03:55 +06:00
def Load ( self ) :
2018-05-25 22:04:48 +05:00
"""
Load mesh from the study after opening the study
"""
2012-08-09 16:03:55 +06:00
self . mesh . Load ( )
2008-03-07 12:47:05 +05:00
def IsReadyToCompute ( self , theSubObject ) :
2018-05-25 22:04:48 +05:00
"""
Return true if the hypotheses are defined well
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theSubObject : a sub - shape of a mesh shape
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
True or False
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . smeshpyD . IsReadyToCompute ( self . mesh , theSubObject )
def GetAlgoState ( self , theSubObject ) :
2018-05-25 22:04:48 +05:00
"""
Return errors of hypotheses definition .
The list of errors is empty if everything is OK .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theSubObject : a sub - shape of a mesh shape
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
a list of errors
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . smeshpyD . GetAlgoState ( self . mesh , theSubObject )
def GetGeometryByMeshElement ( self , theElementID , theGeomName ) :
2017-12-08 19:09:48 +05:00
"""
Return a geometrical object on which the given element was built .
The returned geometrical object , if not nil , is either found in the
study or published by this method with the given name
Parameters :
theElementID : the id of the mesh element
theGeomName : the user - defined name of the geometrical object
Returns :
2018-05-25 22:04:48 +05:00
GEOM . GEOM_Object instance
2017-12-08 19:09:48 +05:00
"""
2008-03-07 12:47:05 +05:00
return self . smeshpyD . GetGeometryByMeshElement ( self . mesh , theElementID , theGeomName )
def MeshDimension ( self ) :
2018-05-25 22:04:48 +05:00
"""
Return the mesh dimension depending on the dimension of the underlying shape
or , if the mesh is not based on any shape , basing on deimension of elements
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
mesh dimension as an integer value [ 0 , 3 ]
"""
2017-12-08 19:09:48 +05:00
2013-02-12 20:37:44 +06:00
if self . mesh . HasShapeToMesh ( ) :
2013-04-04 13:08:19 +06:00
shells = self . geompyD . SubShapeAllIDs ( self . geom , self . geompyD . ShapeType [ " SOLID " ] )
2013-02-12 20:37:44 +06:00
if len ( shells ) > 0 :
return 3
elif self . geompyD . NumberOfFaces ( self . geom ) > 0 :
return 2
elif self . geompyD . NumberOfEdges ( self . geom ) > 0 :
return 1
else :
return 0 ;
2008-03-07 12:47:05 +05:00
else :
2013-02-12 20:37:44 +06:00
if self . NbVolumes ( ) > 0 : return 3
if self . NbFaces ( ) > 0 : return 2
if self . NbEdges ( ) > 0 : return 1
return 0
2008-03-07 12:47:05 +05:00
2012-08-09 16:03:55 +06:00
def Evaluate ( self , geom = 0 ) :
2018-05-25 22:04:48 +05:00
"""
Evaluate size of prospective mesh on a shape
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
a list where i - th element is a number of elements of i - th : class : ` SMESH . EntityType ` .
To know predicted number of e . g . edges , inquire it this way : :
Evaluate ( ) [ smesh . EnumToLong ( SMESH . Entity_Edge ) ]
"""
2017-12-08 19:09:48 +05:00
2013-04-04 13:08:19 +06:00
if geom == 0 or not isinstance ( geom , geomBuilder . GEOM . _objref_GEOM_Object ) :
2012-08-09 16:03:55 +06:00
if self . geom == 0 :
geom = self . mesh . GetShapeToMesh ( )
else :
geom = self . geom
return self . smeshpyD . Evaluate ( self . mesh , geom )
2008-03-07 12:47:05 +05:00
2015-02-20 12:08:10 +05:00
def Compute ( self , geom = 0 , discardModifs = False , refresh = False ) :
2018-05-25 22:04:48 +05:00
"""
Compute the mesh and return the status of the computation
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
geom : geomtrical shape on which mesh data should be computed
discardModifs : if True and the mesh has been edited since
a last total re - compute and that may prevent successful partial re - compute ,
then the mesh is cleaned before Compute ( )
refresh : if * True * , Object Browser is automatically updated ( when running in GUI )
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
True or False
"""
2017-12-08 19:09:48 +05:00
2013-04-04 13:08:19 +06:00
if geom == 0 or not isinstance ( geom , geomBuilder . GEOM . _objref_GEOM_Object ) :
2008-03-07 12:47:05 +05:00
if self . geom == 0 :
2009-02-17 10:27:49 +05:00
geom = self . mesh . GetShapeToMesh ( )
2008-03-07 12:47:05 +05:00
else :
geom = self . geom
ok = False
try :
2012-08-09 16:03:55 +06:00
if discardModifs and self . mesh . HasModificationsToDiscard ( ) : # issue 0020693
self . mesh . Clear ( )
2008-03-07 12:47:05 +05:00
ok = self . smeshpyD . Compute ( self . mesh , geom )
2017-03-20 17:27:30 +05:00
except SALOME . SALOME_Exception as ex :
print ( " Mesh computation failed, exception caught: " )
print ( " " , ex . details . text )
2008-03-07 12:47:05 +05:00
except :
import traceback
2017-03-20 17:27:30 +05:00
print ( " Mesh computation failed, exception caught: " )
2008-03-07 12:47:05 +05:00
traceback . print_exc ( )
2009-02-17 10:27:49 +05:00
if True : #not ok:
2008-03-07 12:47:05 +05:00
allReasons = " "
2012-08-09 16:03:55 +06:00
# Treat compute errors
computeErrors = self . smeshpyD . GetComputeErrors ( self . mesh , geom )
2016-01-29 17:47:48 +05:00
shapeText = " "
2012-08-09 16:03:55 +06:00
for err in computeErrors :
2016-01-29 17:47:48 +05:00
if self . mesh . HasShapeToMesh ( ) :
shapeText = " on %s " % self . GetSubShapeName ( err . subShapeID )
2012-08-09 16:03:55 +06:00
errText = " "
2012-10-08 17:56:59 +06:00
stdErrors = [ " OK " , #COMPERR_OK
" Invalid input mesh " , #COMPERR_BAD_INPUT_MESH
" std::exception " , #COMPERR_STD_EXCEPTION
" OCC exception " , #COMPERR_OCC_EXCEPTION
2013-02-12 20:37:44 +06:00
" .. " , #COMPERR_SLM_EXCEPTION
2012-10-08 17:56:59 +06:00
" Unknown exception " , #COMPERR_EXCEPTION
2012-08-09 16:03:55 +06:00
" Memory allocation problem " , #COMPERR_MEMORY_PB
2012-10-08 17:56:59 +06:00
" Algorithm failed " , #COMPERR_ALGO_FAILED
" Unexpected geometry " , #COMPERR_BAD_SHAPE
" Warning " , #COMPERR_WARNING
" Computation cancelled " , #COMPERR_CANCELED
" No mesh on sub-shape " ] #COMPERR_NO_MESH_ON_SHAPE
2012-08-09 16:03:55 +06:00
if err . code > 0 :
if err . code < len ( stdErrors ) : errText = stdErrors [ err . code ]
else :
errText = " code %s " % - err . code
if errText : errText + = " . "
errText + = err . comment
2017-02-10 23:20:38 +05:00
if allReasons : allReasons + = " \n "
2013-05-24 18:00:21 +06:00
if ok :
allReasons + = ' - " %s " %s - %s ' % ( err . algoName , shapeText , errText )
else :
allReasons + = ' - " %s " failed %s . Error: %s ' % ( err . algoName , shapeText , errText )
2012-08-09 16:03:55 +06:00
pass
# Treat hyp errors
errors = self . smeshpyD . GetAlgoState ( self . mesh , geom )
2008-03-07 12:47:05 +05:00
for err in errors :
if err . isGlobalAlgo :
glob = " global "
else :
glob = " local "
pass
dim = err . algoDim
name = err . algoName
if len ( name ) == 0 :
reason = ' %s %s D algorithm is missing ' % ( glob , dim )
elif err . state == HYP_MISSING :
reason = ( ' %s %s D algorithm " %s " misses %s D hypothesis '
% ( glob , dim , name , dim ) )
elif err . state == HYP_NOTCONFORM :
reason = ' Global " Not Conform mesh allowed " hypothesis is missing '
elif err . state == HYP_BAD_PARAMETER :
reason = ( ' Hypothesis of %s %s D algorithm " %s " has a bad parameter value '
% ( glob , dim , name ) )
elif err . state == HYP_BAD_GEOMETRY :
2009-02-17 10:27:49 +05:00
reason = ( ' %s %s D algorithm " %s " is assigned to mismatching '
' geometry ' % ( glob , dim , name ) )
2012-12-13 17:41:29 +06:00
elif err . state == HYP_HIDDEN_ALGO :
reason = ( ' %s %s D algorithm " %s " is ignored due to presence of a %s '
' algorithm of upper dimension generating %s D mesh '
% ( glob , dim , name , glob , dim ) )
2008-03-07 12:47:05 +05:00
else :
2012-12-13 17:41:29 +06:00
reason = ( " For unknown reason. "
2013-04-04 13:08:19 +06:00
" Developer, revise Mesh.Compute() implementation in smeshBuilder.py! " )
2008-03-07 12:47:05 +05:00
pass
2017-02-10 23:20:38 +05:00
if allReasons : allReasons + = " \n "
2012-08-09 16:03:55 +06:00
allReasons + = " - " + reason
2008-03-07 12:47:05 +05:00
pass
2012-08-09 16:03:55 +06:00
if not ok or allReasons != " " :
msg = ' " ' + GetName ( self . mesh ) + ' " '
if ok : msg + = " has been computed with warnings "
else : msg + = " has not been computed "
if allReasons != " " : msg + = " : "
else : msg + = " . "
2017-03-20 17:27:30 +05:00
print ( msg )
print ( allReasons )
2008-03-07 12:47:05 +05:00
pass
2017-06-13 15:01:10 +05:00
if salome . sg . hasDesktop ( ) :
2016-08-02 00:15:36 +05:00
if not isinstance ( refresh , list ) : # not a call from subMesh.Compute()
smeshgui = salome . ImportComponentGUI ( " SMESH " )
2017-06-13 15:01:10 +05:00
smeshgui . Init ( )
2016-08-02 00:15:36 +05:00
smeshgui . SetMeshIcon ( salome . ObjectToID ( self . mesh ) , ok , ( self . NbNodes ( ) == 0 ) )
2017-06-13 15:01:10 +05:00
if refresh : salome . sg . updateObjBrowser ( )
2016-08-02 00:15:36 +05:00
2008-03-07 12:47:05 +05:00
return ok
2016-06-16 18:23:35 +05:00
def GetComputeErrors ( self , shape = 0 ) :
2018-05-25 22:04:48 +05:00
"""
Return a list of error messages ( : class : ` SMESH . ComputeError ` ) of the last : meth : ` Compute `
"""
2017-12-08 19:09:48 +05:00
2016-06-16 18:23:35 +05:00
if shape == 0 :
shape = self . mesh . GetShapeToMesh ( )
return self . smeshpyD . GetComputeErrors ( self . mesh , shape )
2015-07-11 00:34:27 +05:00
def GetSubShapeName ( self , subShapeID ) :
2018-05-25 22:04:48 +05:00
"""
Return a name of a sub - shape by its ID .
Possible variants ( for * subShapeID * == 3 ) :
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
- * * " Face_12 " * * - published sub - shape
- * * FACE #3** - not published sub-shape
- * * sub - shape #3** - invalid sub-shape ID
- * * #3** - error in this function
Parameters :
subShapeID : a unique ID of a sub - shape
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
a string describing the sub - shape
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2015-07-11 00:34:27 +05:00
if not self . mesh . HasShapeToMesh ( ) :
return " "
try :
shapeText = " "
mainIOR = salome . orb . object_to_string ( self . GetShape ( ) )
2017-06-13 15:01:10 +05:00
s = salome . myStudy
mainSO = s . FindObjectIOR ( mainIOR )
if mainSO :
2015-07-11 00:34:27 +05:00
if subShapeID == 1 :
shapeText = ' " %s " ' % mainSO . GetName ( )
subIt = s . NewChildIterator ( mainSO )
while subIt . More ( ) :
subSO = subIt . Value ( )
subIt . Next ( )
obj = subSO . GetObject ( )
if not obj : continue
go = obj . _narrow ( geomBuilder . GEOM . _objref_GEOM_Object )
if not go : continue
try :
ids = self . geompyD . GetSubShapeID ( self . GetShape ( ) , go )
except :
continue
if ids == subShapeID :
shapeText = ' " %s " ' % subSO . GetName ( )
2018-06-19 21:58:29 +05:00
break
2015-07-11 00:34:27 +05:00
if not shapeText :
shape = self . geompyD . GetSubShape ( self . GetShape ( ) , [ subShapeID ] )
if shape :
shapeText = ' %s # %s ' % ( shape . GetShapeType ( ) , subShapeID )
else :
shapeText = ' sub-shape # %s ' % ( subShapeID )
except :
shapeText = " # %s " % ( subShapeID )
return shapeText
def GetFailedShapes ( self , publish = False ) :
2018-05-25 22:04:48 +05:00
"""
Return a list of sub - shapes meshing of which failed , grouped into GEOM groups by
error of an algorithm
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
publish : if * True * , the returned groups will be published in the study
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
a list of GEOM groups each named after a failed algorithm
"""
2017-12-08 19:09:48 +05:00
2015-07-11 00:34:27 +05:00
algo2shapes = { }
computeErrors = self . smeshpyD . GetComputeErrors ( self . mesh , self . GetShape ( ) )
for err in computeErrors :
shape = self . geompyD . GetSubShape ( self . GetShape ( ) , [ err . subShapeID ] )
if not shape : continue
if err . algoName in algo2shapes :
algo2shapes [ err . algoName ] . append ( shape )
else :
algo2shapes [ err . algoName ] = [ shape ]
pass
groups = [ ]
2017-03-20 17:27:30 +05:00
for algoName , shapes in list ( algo2shapes . items ( ) ) :
2015-07-11 00:34:27 +05:00
while shapes :
groupType = self . smeshpyD . EnumToLong ( shapes [ 0 ] . GetShapeType ( ) )
otherTypeShapes = [ ]
sameTypeShapes = [ ]
group = self . geompyD . CreateGroup ( self . geom , groupType )
for shape in shapes :
if shape . GetShapeType ( ) == shapes [ 0 ] . GetShapeType ( ) :
sameTypeShapes . append ( shape )
else :
otherTypeShapes . append ( shape )
self . geompyD . UnionList ( group , sameTypeShapes )
if otherTypeShapes :
group . SetName ( " %s %s " % ( algoName , shapes [ 0 ] . GetShapeType ( ) ) )
else :
group . SetName ( algoName )
groups . append ( group )
shapes = otherTypeShapes
pass
if publish :
for group in groups :
self . geompyD . addToStudyInFather ( self . geom , group , group . GetName ( ) )
return groups
2012-08-09 16:03:55 +06:00
def GetMeshOrder ( self ) :
2018-05-25 22:04:48 +05:00
"""
Return sub - mesh objects list in meshing order
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
list of lists of : class : ` sub - meshes < SMESH . SMESH_subMesh > `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . mesh . GetMeshOrder ( )
def SetMeshOrder ( self , submeshes ) :
2018-05-25 22:04:48 +05:00
"""
Set order in which concurrent sub - meshes should be meshed
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
submeshes : list of lists of : class : ` sub - meshes < SMESH . SMESH_subMesh > `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . mesh . SetMeshOrder ( submeshes )
2015-02-20 12:08:10 +05:00
def Clear ( self , refresh = False ) :
2018-05-25 22:04:48 +05:00
"""
Remove all nodes and elements generated on geometry . Imported elements remain .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
refresh : if * True * , Object browser is automatically updated ( when running in GUI )
"""
2017-12-08 19:09:48 +05:00
2009-02-17 10:27:49 +05:00
self . mesh . Clear ( )
2017-06-13 15:01:10 +05:00
if ( salome . sg . hasDesktop ( ) ) :
2009-02-17 10:27:49 +05:00
smeshgui = salome . ImportComponentGUI ( " SMESH " )
2017-06-13 15:01:10 +05:00
smeshgui . Init ( )
2009-02-17 10:27:49 +05:00
smeshgui . SetMeshIcon ( salome . ObjectToID ( self . mesh ) , False , True )
2017-06-13 15:01:10 +05:00
if refresh : salome . sg . updateObjBrowser ( )
2009-02-17 10:27:49 +05:00
2015-02-20 12:08:10 +05:00
def ClearSubMesh ( self , geomId , refresh = False ) :
2018-05-25 22:04:48 +05:00
"""
Remove all nodes and elements of indicated shape
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
geomId : the ID of a sub - shape to remove elements on
refresh : if * True * , Object browser is automatically updated ( when running in GUI )
"""
2017-12-08 19:09:48 +05:00
2009-02-17 10:27:49 +05:00
self . mesh . ClearSubMesh ( geomId )
if salome . sg . hasDesktop ( ) :
smeshgui = salome . ImportComponentGUI ( " SMESH " )
2017-06-13 15:01:10 +05:00
smeshgui . Init ( )
2009-02-17 10:27:49 +05:00
smeshgui . SetMeshIcon ( salome . ObjectToID ( self . mesh ) , False , True )
2017-06-13 15:01:10 +05:00
if refresh : salome . sg . updateObjBrowser ( )
2009-02-17 10:27:49 +05:00
2008-03-07 12:47:05 +05:00
def AutomaticTetrahedralization ( self , fineness = 0 ) :
2018-05-25 22:04:48 +05:00
"""
Compute a tetrahedral mesh using AutomaticLength + MEFISTO + Tetrahedron
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
fineness : [ 0.0 , 1.0 ] defines mesh fineness
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
True or False
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
dim = self . MeshDimension ( )
# assign hypotheses
self . RemoveGlobalHypotheses ( )
self . Segment ( ) . AutomaticLength ( fineness )
if dim > 1 :
self . Triangle ( ) . LengthFromEdges ( )
pass
if dim > 2 :
2014-06-24 18:58:45 +06:00
self . Tetrahedron ( )
2008-03-07 12:47:05 +05:00
pass
return self . Compute ( )
def AutomaticHexahedralization ( self , fineness = 0 ) :
2018-05-25 22:04:48 +05:00
"""
Compute an hexahedral mesh using AutomaticLength + Quadrangle + Hexahedron
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
fineness : [ 0.0 , 1.0 ] defines mesh fineness
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
True or False
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
dim = self . MeshDimension ( )
2009-02-17 10:27:49 +05:00
# assign the hypotheses
2008-03-07 12:47:05 +05:00
self . RemoveGlobalHypotheses ( )
self . Segment ( ) . AutomaticLength ( fineness )
if dim > 1 :
self . Quadrangle ( )
pass
if dim > 2 :
self . Hexahedron ( )
pass
return self . Compute ( )
def AddHypothesis ( self , hyp , geom = 0 ) :
2018-05-25 22:04:48 +05:00
"""
Assign a hypothesis
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
hyp : a hypothesis to assign
geom : a subhape of mesh geometry
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . Hypothesis_Status `
"""
2017-12-08 19:09:48 +05:00
2015-07-10 21:39:03 +05:00
if isinstance ( hyp , geomBuilder . GEOM . _objref_GEOM_Object ) :
hyp , geom = geom , hyp
2008-03-07 12:47:05 +05:00
if isinstance ( hyp , Mesh_Algorithm ) :
hyp = hyp . GetAlgorithm ( )
pass
if not geom :
geom = self . geom
2009-02-17 10:27:49 +05:00
if not geom :
geom = self . mesh . GetShapeToMesh ( )
2008-03-07 12:47:05 +05:00
pass
2014-02-28 20:58:28 +06:00
isApplicable = True
if self . mesh . HasShapeToMesh ( ) :
2014-03-05 19:42:42 +06:00
hyp_type = hyp . GetName ( )
lib_name = hyp . GetLibName ( )
2015-12-01 16:32:09 +05:00
# checkAll = ( not geom.IsSame( self.mesh.GetShapeToMesh() ))
# if checkAll and geom:
# checkAll = geom.GetType() == 37
checkAll = False
2014-03-12 17:12:59 +06:00
isApplicable = self . smeshpyD . IsApplicable ( hyp_type , lib_name , geom , checkAll )
2014-02-28 20:58:28 +06:00
if isApplicable :
AssureGeomPublished ( self , geom , " shape for %s " % hyp . GetName ( ) )
status = self . mesh . AddHypothesis ( geom , hyp )
else :
2017-05-04 21:34:49 +05:00
status = HYP_BAD_GEOMETRY , " "
2014-03-11 21:46:54 +06:00
hyp_name = GetName ( hyp )
geom_name = " "
if geom :
geom_name = geom . GetName ( )
isAlgo = hyp . _narrow ( SMESH_Algo )
2014-08-21 17:15:12 +06:00
TreatHypoStatus ( status , hyp_name , geom_name , isAlgo , self )
2014-03-11 21:46:54 +06:00
return status
2008-03-07 12:47:05 +05:00
2012-08-09 16:03:55 +06:00
def IsUsedHypothesis ( self , hyp , geom ) :
2018-05-25 22:04:48 +05:00
"""
Return True if an algorithm or hypothesis is assigned to a given shape
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
hyp : an algorithm or hypothesis to check
geom : a subhape of mesh geometry
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
True of False
"""
2017-12-08 19:09:48 +05:00
2013-02-12 20:37:44 +06:00
if not hyp : # or not geom
2012-08-09 16:03:55 +06:00
return False
if isinstance ( hyp , Mesh_Algorithm ) :
hyp = hyp . GetAlgorithm ( )
pass
hyps = self . GetHypothesisList ( geom )
for h in hyps :
if h . GetId ( ) == hyp . GetId ( ) :
return True
return False
2008-03-07 12:47:05 +05:00
def RemoveHypothesis ( self , hyp , geom = 0 ) :
2018-05-25 22:04:48 +05:00
"""
Unassign a hypothesis
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
hyp ( SMESH . SMESH_Hypothesis ) : a hypothesis to unassign
geom ( GEOM . GEOM_Object ) : a sub - shape of mesh geometry
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . Hypothesis_Status `
"""
2017-12-08 19:09:48 +05:00
2013-04-22 16:37:55 +06:00
if not hyp :
return None
2008-03-07 12:47:05 +05:00
if isinstance ( hyp , Mesh_Algorithm ) :
hyp = hyp . GetAlgorithm ( )
pass
2013-02-12 20:37:44 +06:00
shape = geom
if not shape :
shape = self . geom
2008-03-07 12:47:05 +05:00
pass
2013-02-12 20:37:44 +06:00
if self . IsUsedHypothesis ( hyp , shape ) :
return self . mesh . RemoveHypothesis ( shape , hyp )
hypName = GetName ( hyp )
geoName = GetName ( shape )
2017-03-20 17:27:30 +05:00
print ( " WARNING: RemoveHypothesis() failed as ' %s ' is not assigned to ' %s ' shape " % ( hypName , geoName ) )
2013-02-12 20:37:44 +06:00
return None
2008-03-07 12:47:05 +05:00
def GetHypothesisList ( self , geom ) :
2018-05-25 22:04:48 +05:00
"""
Get the list of hypotheses added on a geometry
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
geom ( GEOM . GEOM_Object ) : a sub - shape of mesh geometry
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
the sequence of : class : ` SMESH . SMESH_Hypothesis `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetHypothesisList ( geom )
def RemoveGlobalHypotheses ( self ) :
2018-05-25 22:04:48 +05:00
"""
Remove all global hypotheses
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
current_hyps = self . mesh . GetHypothesisList ( self . geom )
for hyp in current_hyps :
self . mesh . RemoveHypothesis ( self . geom , hyp )
pass
pass
2016-04-06 19:24:26 +05:00
def ExportMED ( self , * args , * * kwargs ) :
2018-05-25 22:04:48 +05:00
"""
Export the mesh in a file in MED format
allowing to overwrite the file if it exists or add the exported data to its contents
Parameters :
2018-06-14 16:56:19 +05:00
fileName : is the file name
auto_groups ( boolean ) : parameter for creating / not creating
2018-06-19 21:58:29 +05:00
the groups Group_On_All_Nodes , Group_On_All_Faces , . . . ;
the typical use is auto_groups = False .
2018-06-14 16:56:19 +05:00
overwrite ( boolean ) : parameter for overwriting / not overwriting the file
2018-06-19 21:58:29 +05:00
meshPart : a part of mesh ( : class : ` sub - mesh , group or filter < SMESH . SMESH_IDSource > ` ) to export instead of the mesh
autoDimension : if * True * ( default ) , a space dimension of a MED mesh can be either
- 1 D if all mesh nodes lie on OX coordinate axis , or
- 2 D if all mesh nodes lie on XOY coordinate plane , or
- 3 D in the rest cases .
2018-05-25 22:04:48 +05:00
If * autoDimension * is * False * , the space dimension is always 3.
fields : list of GEOM fields defined on the shape to mesh .
geomAssocFields : each character of this string means a need to export a
corresponding field ; correspondence between fields and characters is following :
- ' v ' stands for " _vertices _ " field ;
- ' e ' stands for " _edges _ " field ;
- ' f ' stands for " _faces _ " field ;
- ' s ' stands for " _solids _ " field .
"""
2016-04-06 19:24:26 +05:00
# process positional arguments
args = [ i for i in args if i not in [ SMESH . MED_V2_1 , SMESH . MED_V2_2 ] ] # backward compatibility
fileName = args [ 0 ]
auto_groups = args [ 1 ] if len ( args ) > 1 else False
overwrite = args [ 2 ] if len ( args ) > 2 else True
meshPart = args [ 3 ] if len ( args ) > 3 else None
autoDimension = args [ 4 ] if len ( args ) > 4 else True
fields = args [ 5 ] if len ( args ) > 5 else [ ]
geomAssocFields = args [ 6 ] if len ( args ) > 6 else ' '
# process keywords arguments
auto_groups = kwargs . get ( " auto_groups " , auto_groups )
overwrite = kwargs . get ( " overwrite " , overwrite )
meshPart = kwargs . get ( " meshPart " , meshPart )
autoDimension = kwargs . get ( " autoDimension " , autoDimension )
fields = kwargs . get ( " fields " , fields )
geomAssocFields = kwargs . get ( " geomAssocFields " , geomAssocFields )
# invoke engine's function
2014-03-05 19:42:42 +06:00
if meshPart or fields or geomAssocFields :
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2012-08-09 16:03:55 +06:00
if isinstance ( meshPart , list ) :
meshPart = self . GetIDSource ( meshPart , SMESH . ALL )
2013-08-07 20:06:39 +06:00
unRegister . set ( meshPart )
2016-04-06 19:24:26 +05:00
self . mesh . ExportPartToMED ( meshPart , fileName , auto_groups , overwrite , autoDimension ,
2014-03-05 19:42:42 +06:00
fields , geomAssocFields )
2012-08-09 16:03:55 +06:00
else :
2016-04-06 19:24:26 +05:00
self . mesh . ExportMED ( fileName , auto_groups , overwrite , autoDimension )
2008-03-07 12:47:05 +05:00
2012-08-09 16:03:55 +06:00
def ExportSAUV ( self , f , auto_groups = 0 ) :
2018-05-25 22:04:48 +05:00
"""
Export the mesh in a file in SAUV format
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
f : is the file name
auto_groups : boolean parameter for creating / not creating
the groups Group_On_All_Nodes , Group_On_All_Faces , . . . ;
the typical use is auto_groups = False .
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
self . mesh . ExportSAUV ( f , auto_groups )
2008-03-07 12:47:05 +05:00
2012-08-09 16:03:55 +06:00
def ExportDAT ( self , f , meshPart = None ) :
2018-05-25 22:04:48 +05:00
"""
Export the mesh in a file in DAT format
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
f : the file name
meshPart : a part of mesh ( : class : ` sub - mesh , group or filter < SMESH . SMESH_IDSource > ` ) to export instead of the mesh
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if meshPart :
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2012-08-09 16:03:55 +06:00
if isinstance ( meshPart , list ) :
meshPart = self . GetIDSource ( meshPart , SMESH . ALL )
2013-08-07 20:06:39 +06:00
unRegister . set ( meshPart )
2012-08-09 16:03:55 +06:00
self . mesh . ExportPartToDAT ( meshPart , f )
else :
self . mesh . ExportDAT ( f )
2008-03-07 12:47:05 +05:00
2012-08-09 16:03:55 +06:00
def ExportUNV ( self , f , meshPart = None ) :
2018-05-25 22:04:48 +05:00
"""
Export the mesh in a file in UNV format
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
f : the file name
meshPart : a part of mesh ( : class : ` sub - mesh , group or filter < SMESH . SMESH_IDSource > ` ) to export instead of the mesh
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if meshPart :
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2012-08-09 16:03:55 +06:00
if isinstance ( meshPart , list ) :
meshPart = self . GetIDSource ( meshPart , SMESH . ALL )
2013-08-07 20:06:39 +06:00
unRegister . set ( meshPart )
2012-08-09 16:03:55 +06:00
self . mesh . ExportPartToUNV ( meshPart , f )
else :
self . mesh . ExportUNV ( f )
2008-03-07 12:47:05 +05:00
2012-08-09 16:03:55 +06:00
def ExportSTL ( self , f , ascii = 1 , meshPart = None ) :
2018-05-25 22:04:48 +05:00
"""
Export the mesh in a file in STL format
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
f : the file name
ascii : defines the file encoding
meshPart : a part of mesh ( : class : ` sub - mesh , group or filter < SMESH . SMESH_IDSource > ` ) to export instead of the mesh
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if meshPart :
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2012-08-09 16:03:55 +06:00
if isinstance ( meshPart , list ) :
meshPart = self . GetIDSource ( meshPart , SMESH . ALL )
2013-08-07 20:06:39 +06:00
unRegister . set ( meshPart )
2012-08-09 16:03:55 +06:00
self . mesh . ExportPartToSTL ( meshPart , f , ascii )
else :
self . mesh . ExportSTL ( f , ascii )
2008-03-07 12:47:05 +05:00
2017-08-25 18:45:03 +05:00
def ExportCGNS ( self , f , overwrite = 1 , meshPart = None , groupElemsByType = False ) :
2018-05-25 22:04:48 +05:00
"""
Export the mesh in a file in CGNS format
Parameters :
f : is the file name
overwrite : boolean parameter for overwriting / not overwriting the file
meshPart : a part of mesh ( : class : ` sub - mesh , group or filter < SMESH . SMESH_IDSource > ` ) to export instead of the mesh
groupElemsByType : if True all elements of same entity type are exported at ones ,
else elements are exported in order of their IDs which can cause creation
of multiple cgns sections
"""
2017-12-08 19:09:48 +05:00
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2012-08-09 16:03:55 +06:00
if isinstance ( meshPart , list ) :
meshPart = self . GetIDSource ( meshPart , SMESH . ALL )
2013-08-07 20:06:39 +06:00
unRegister . set ( meshPart )
2012-08-09 16:03:55 +06:00
if isinstance ( meshPart , Mesh ) :
meshPart = meshPart . mesh
elif not meshPart :
meshPart = self . mesh
2017-08-25 18:45:03 +05:00
self . mesh . ExportCGNS ( meshPart , f , overwrite , groupElemsByType )
2012-08-09 16:03:55 +06:00
2012-10-08 17:56:59 +06:00
def ExportGMF ( self , f , meshPart = None ) :
2018-05-25 22:04:48 +05:00
"""
Export the mesh in a file in GMF format .
GMF files must have . mesh extension for the ASCII format and . meshb for
the bynary format . Other extensions are not allowed .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
f : is the file name
meshPart : a part of mesh ( : class : ` sub - mesh , group or filter < SMESH . SMESH_IDSource > ` ) to export instead of the mesh
"""
2017-12-08 19:09:48 +05:00
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2012-10-08 17:56:59 +06:00
if isinstance ( meshPart , list ) :
meshPart = self . GetIDSource ( meshPart , SMESH . ALL )
2013-08-07 20:06:39 +06:00
unRegister . set ( meshPart )
2012-10-08 17:56:59 +06:00
if isinstance ( meshPart , Mesh ) :
meshPart = meshPart . mesh
elif not meshPart :
meshPart = self . mesh
2012-12-13 17:41:29 +06:00
self . mesh . ExportGMF ( meshPart , f , True )
2012-10-08 17:56:59 +06:00
2016-04-06 19:24:26 +05:00
def ExportToMED ( self , * args , * * kwargs ) :
2018-05-25 22:04:48 +05:00
"""
Deprecated , used only for compatibility ! Please , use : meth : ` ExportMED ` method instead .
Export the mesh in a file in MED format
allowing to overwrite the file if it exists or add the exported data to its contents
Parameters :
2018-06-14 16:56:19 +05:00
fileName : the file name
opt ( boolean ) : parameter for creating / not creating
2018-05-25 22:04:48 +05:00
the groups Group_On_All_Nodes , Group_On_All_Faces , . . .
overwrite : boolean parameter for overwriting / not overwriting the file
autoDimension : if * True * ( default ) , a space dimension of a MED mesh can be either
- 1 D if all mesh nodes lie on OX coordinate axis , or
- 2 D if all mesh nodes lie on XOY coordinate plane , or
- 3 D in the rest cases .
If * * autoDimension * * is * False * , the space dimension is always 3.
"""
2018-06-14 16:56:19 +05:00
2016-04-06 19:24:26 +05:00
print ( " WARNING: ExportToMED() is deprecated, use ExportMED() instead " )
# process positional arguments
args = [ i for i in args if i not in [ SMESH . MED_V2_1 , SMESH . MED_V2_2 ] ] # backward compatibility
fileName = args [ 0 ]
auto_groups = args [ 1 ] if len ( args ) > 1 else False
overwrite = args [ 2 ] if len ( args ) > 2 else True
autoDimension = args [ 3 ] if len ( args ) > 3 else True
# process keywords arguments
auto_groups = kwargs . get ( " opt " , auto_groups ) # old keyword name
auto_groups = kwargs . get ( " auto_groups " , auto_groups ) # new keyword name
overwrite = kwargs . get ( " overwrite " , overwrite )
autoDimension = kwargs . get ( " autoDimension " , autoDimension )
# invoke engine's function
self . mesh . ExportMED ( fileName , auto_groups , overwrite , autoDimension )
def ExportToMEDX ( self , * args , * * kwargs ) :
2018-06-14 16:56:19 +05:00
"""
Deprecated , used only for compatibility ! Please , use ExportMED ( ) method instead .
Export the mesh in a file in MED format
Parameters :
fileName : the file name
opt ( boolean ) : parameter for creating / not creating
the groups Group_On_All_Nodes , Group_On_All_Faces , . . .
overwrite : boolean parameter for overwriting / not overwriting the file
autoDimension : if * True * ( default ) , a space dimension of a MED mesh can be either
2017-12-08 19:09:48 +05:00
2018-06-14 16:56:19 +05:00
- 1 D if all mesh nodes lie on OX coordinate axis , or
- 2 D if all mesh nodes lie on XOY coordinate plane , or
- 3 D in the rest cases .
If * * autoDimension * * is * False * , the space dimension is always 3.
2018-06-19 21:58:29 +05:00
"""
2018-06-14 16:56:19 +05:00
2016-04-06 19:24:26 +05:00
print ( " WARNING: ExportToMEDX() is deprecated, use ExportMED() instead " )
# process positional arguments
args = [ i for i in args if i not in [ SMESH . MED_V2_1 , SMESH . MED_V2_2 ] ] # backward compatibility
fileName = args [ 0 ]
auto_groups = args [ 1 ] if len ( args ) > 1 else False
overwrite = args [ 2 ] if len ( args ) > 2 else True
autoDimension = args [ 3 ] if len ( args ) > 3 else True
# process keywords arguments
auto_groups = kwargs . get ( " auto_groups " , auto_groups )
overwrite = kwargs . get ( " overwrite " , overwrite )
autoDimension = kwargs . get ( " autoDimension " , autoDimension )
# invoke engine's function
self . mesh . ExportMED ( fileName , auto_groups , overwrite , autoDimension )
2008-03-07 12:47:05 +05:00
# Operations with groups:
# ----------------------
def CreateEmptyGroup ( self , elementType , name ) :
2018-05-25 22:04:48 +05:00
"""
Create an empty mesh group
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
elementType : the : class : ` type < SMESH . ElementType > ` of elements in the group ;
either of ( SMESH . NODE , SMESH . EDGE , SMESH . FACE , SMESH . VOLUME )
name : the name of the mesh group
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . SMESH_Group `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . CreateGroup ( elementType , name )
2012-08-09 16:03:55 +06:00
def Group ( self , grp , name = " " ) :
2018-05-25 22:04:48 +05:00
"""
Create a mesh group based on the geometric object * grp *
and give it a * name * .
If * name * is not defined the name of the geometric group is used
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Note :
Works like : meth : ` GroupOnGeom ` .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
grp : a geometric group , a vertex , an edge , a face or a solid
name : the name of the mesh group
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . SMESH_GroupOnGeom `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . GroupOnGeom ( grp , name )
2008-03-07 12:47:05 +05:00
def GroupOnGeom ( self , grp , name = " " , typ = None ) :
2018-05-25 22:04:48 +05:00
"""
Create a mesh group based on the geometrical object * grp *
and gives a * name * .
if * name * is not defined the name of the geometric group is used
Parameters :
grp : a geometrical group , a vertex , an edge , a face or a solid
name : the name of the mesh group
typ : the type of elements in the group ; either of
( SMESH . NODE , SMESH . EDGE , SMESH . FACE , SMESH . VOLUME ) . If not set , it is
automatically detected by the type of the geometry
Returns :
: class : ` SMESH . SMESH_GroupOnGeom `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
AssureGeomPublished ( self , grp , name )
2008-03-07 12:47:05 +05:00
if name == " " :
name = grp . GetName ( )
2012-08-09 16:03:55 +06:00
if not typ :
typ = self . _groupTypeFromShape ( grp )
return self . mesh . CreateGroupFromGEOM ( typ , name , grp )
def _groupTypeFromShape ( self , shape ) :
2018-05-25 22:04:48 +05:00
"""
Pivate method to get a type of group on geometry
"""
2012-08-09 16:03:55 +06:00
tgeo = str ( shape . GetShapeType ( ) )
if tgeo == " VERTEX " :
typ = NODE
elif tgeo == " EDGE " :
typ = EDGE
elif tgeo == " FACE " or tgeo == " SHELL " :
typ = FACE
elif tgeo == " SOLID " or tgeo == " COMPSOLID " :
typ = VOLUME
elif tgeo == " COMPOUND " :
2013-04-04 13:08:19 +06:00
sub = self . geompyD . SubShapeAll ( shape , self . geompyD . ShapeType [ " SHAPE " ] )
2012-08-09 16:03:55 +06:00
if not sub :
2017-03-20 17:27:30 +05:00
raise ValueError ( " _groupTypeFromShape(): empty geometric group or compound ' %s ' " % GetName ( shape ) )
2012-08-09 16:03:55 +06:00
return self . _groupTypeFromShape ( sub [ 0 ] )
2008-03-07 12:47:05 +05:00
else :
2017-03-20 17:27:30 +05:00
raise ValueError ( " _groupTypeFromShape(): invalid geometry ' %s ' " % GetName ( shape ) )
2012-08-09 16:03:55 +06:00
return typ
def GroupOnFilter ( self , typ , name , filter ) :
2018-05-25 22:04:48 +05:00
"""
Create a mesh group with given * name * based on the * filter * which
is a special type of group dynamically updating it ' s contents during
mesh modification
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
typ : the type of elements in the group ; either of
( SMESH . NODE , SMESH . EDGE , SMESH . FACE , SMESH . VOLUME ) .
name : the name of the mesh group
filter ( SMESH . Filter ) : the filter defining group contents
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . SMESH_GroupOnFilter `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . mesh . CreateGroupFromFilter ( typ , name , filter )
2008-03-07 12:47:05 +05:00
def MakeGroupByIds ( self , groupName , elementType , elemIDs ) :
2018-05-25 22:04:48 +05:00
"""
Create a mesh group by the given ids of elements
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
groupName : the name of the mesh group
elementType : the type of elements in the group ; either of
( SMESH . NODE , SMESH . EDGE , SMESH . FACE , SMESH . VOLUME ) .
elemIDs : either the list of ids , : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . SMESH_Group `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
group = self . mesh . CreateGroup ( elementType , groupName )
2017-08-25 18:45:03 +05:00
if isinstance ( elemIDs , Mesh ) :
elemIDs = elemIDs . GetMesh ( )
2014-08-26 17:58:38 +06:00
if hasattr ( elemIDs , " GetIDs " ) :
if hasattr ( elemIDs , " SetMesh " ) :
elemIDs . SetMesh ( self . GetMesh ( ) )
group . AddFrom ( elemIDs )
else :
group . Add ( elemIDs )
2008-03-07 12:47:05 +05:00
return group
def MakeGroup ( self ,
groupName ,
elementType ,
CritType = FT_Undefined ,
Compare = FT_EqualTo ,
2012-08-09 16:03:55 +06:00
Threshold = " " ,
UnaryOp = FT_Undefined ,
Tolerance = 1e-07 ) :
2018-05-25 22:04:48 +05:00
"""
Create a mesh group by the given conditions
Parameters :
groupName : the name of the mesh group
elementType ( SMESH . ElementType ) : the type of elements ( SMESH . NODE , SMESH . EDGE , SMESH . FACE , SMESH . VOLUME )
CritType ( SMESH . FunctorType ) : the type of criterion ( SMESH . FT_Taper , SMESH . FT_Area , etc . ) .
Note that the items starting from FT_LessThan are not suitable for CritType .
Compare ( SMESH . FunctorType ) : belongs to { SMESH . FT_LessThan , SMESH . FT_MoreThan , SMESH . FT_EqualTo }
Threshold : the threshold value ( range of ids as string , shape , numeric , depending on * CritType * )
UnaryOp ( SMESH . FunctorType ) : SMESH . FT_LogicalNOT or SMESH . FT_Undefined
Tolerance ( float ) : the tolerance used by SMESH . FT_BelongToGeom , SMESH . FT_BelongToSurface ,
SMESH . FT_LyingOnGeom , SMESH . FT_CoplanarFaces criteria
Returns :
: class : ` SMESH . SMESH_GroupOnFilter `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
aCriterion = self . smeshpyD . GetCriterion ( elementType , CritType , Compare , Threshold , UnaryOp , FT_Undefined , Tolerance )
2008-03-07 12:47:05 +05:00
group = self . MakeGroupByCriterion ( groupName , aCriterion )
return group
def MakeGroupByCriterion ( self , groupName , Criterion ) :
2018-05-25 22:04:48 +05:00
"""
Create a mesh group by the given criterion
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
groupName : the name of the mesh group
Criterion : the instance of : class : ` SMESH . Filter . Criterion ` class
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . SMESH_GroupOnFilter `
See Also :
: meth : ` smeshBuilder . GetCriterion `
"""
2017-12-08 19:09:48 +05:00
2014-08-22 23:16:01 +06:00
return self . MakeGroupByCriteria ( groupName , [ Criterion ] )
2008-03-07 12:47:05 +05:00
2014-08-22 23:16:01 +06:00
def MakeGroupByCriteria ( self , groupName , theCriteria , binOp = SMESH . FT_LogicalAND ) :
2018-05-25 22:04:48 +05:00
"""
Create a mesh group by the given criteria ( list of : class : ` SMESH . Filter . Criterion ` )
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
groupName : the name of the mesh group
theCriteria : the list of : class : ` SMESH . Filter . Criterion `
binOp : binary operator ( SMESH . FT_LogicalAND or SMESH . FT_LogicalOR ) used when binary operator of criteria is undefined
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
: class : ` SMESH . SMESH_GroupOnFilter `
See Also :
: meth : ` smeshBuilder . GetCriterion `
"""
2017-12-08 19:09:48 +05:00
2014-08-22 23:16:01 +06:00
aFilter = self . smeshpyD . GetFilterFromCriteria ( theCriteria , binOp )
2008-03-07 12:47:05 +05:00
group = self . MakeGroupByFilter ( groupName , aFilter )
return group
def MakeGroupByFilter ( self , groupName , theFilter ) :
2018-05-25 22:04:48 +05:00
"""
Create a mesh group by the given filter
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
groupName ( string ) : the name of the mesh group
theFilter ( SMESH . Filter ) : the filter
Returns :
: class : ` SMESH . SMESH_GroupOnFilter `
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
See Also :
: meth : ` smeshBuilder . GetFilter `
"""
2017-12-08 19:09:48 +05:00
2014-08-21 17:15:12 +06:00
#group = self.CreateEmptyGroup(theFilter.GetElementType(), groupName)
#theFilter.SetMesh( self.mesh )
#group.AddFrom( theFilter )
group = self . GroupOnFilter ( theFilter . GetElementType ( ) , groupName , theFilter )
2008-03-07 12:47:05 +05:00
return group
def RemoveGroup ( self , group ) :
2018-05-25 22:04:48 +05:00
"""
Remove a group
Parameters :
group ( SMESH . SMESH_GroupBase ) : group to remove
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
self . mesh . RemoveGroup ( group )
def RemoveGroupWithContents ( self , group ) :
2018-05-25 22:04:48 +05:00
"""
Remove a group with its contents
Parameters :
group ( SMESH . SMESH_GroupBase ) : group to remove
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
self . mesh . RemoveGroupWithContents ( group )
2015-07-09 14:41:53 +05:00
def GetGroups ( self , elemType = SMESH . ALL ) :
2018-05-25 22:04:48 +05:00
"""
Get the list of groups existing in the mesh in the order
of creation ( starting from the oldest one )
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
elemType ( SMESH . ElementType ) : type of elements the groups contain ;
by default groups of elements of all types are returned
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
a sequence of : class : ` SMESH . SMESH_GroupBase `
"""
2017-12-08 19:09:48 +05:00
2015-07-09 14:41:53 +05:00
groups = self . mesh . GetGroups ( )
if elemType == SMESH . ALL :
return groups
typedGroups = [ ]
for g in groups :
if g . GetType ( ) == elemType :
typedGroups . append ( g )
pass
pass
return typedGroups
2008-03-07 12:47:05 +05:00
def NbGroups ( self ) :
2018-05-25 22:04:48 +05:00
"""
Get the number of groups existing in the mesh
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
the quantity of groups as an integer value
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbGroups ( )
def GetGroupNames ( self ) :
2018-05-25 22:04:48 +05:00
"""
Get the list of names of groups existing in the mesh
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
list of strings
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
groups = self . GetGroups ( )
names = [ ]
for group in groups :
names . append ( group . GetName ( ) )
return names
2015-07-09 14:41:53 +05:00
def GetGroupByName ( self , name , elemType = None ) :
2018-05-25 22:04:48 +05:00
"""
Find groups by name and type
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
name ( string ) : name of the group of interest
elemType ( SMESH . ElementType ) : type of elements the groups contain ;
by default one group of any type is returned ;
if elemType == SMESH . ALL then all groups of any type are returned
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
a list of : class : ` SMESH . SMESH_GroupBase `
"""
2017-12-08 19:09:48 +05:00
2015-07-09 14:41:53 +05:00
groups = [ ]
for group in self . GetGroups ( ) :
if group . GetName ( ) == name :
if elemType is None :
return [ group ]
2017-12-08 19:09:48 +05:00
if ( elemType == SMESH . ALL or
2015-07-09 14:41:53 +05:00
group . GetType ( ) == elemType ) :
groups . append ( group )
return groups
2008-03-07 12:47:05 +05:00
def UnionGroups ( self , group1 , group2 , name ) :
2018-05-25 22:04:48 +05:00
"""
Produce a union of two groups .
A new group is created . All mesh elements that are
present in the initial groups are added to the new one
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
group1 ( SMESH . SMESH_GroupBase ) : a group
group2 ( SMESH . SMESH_GroupBase ) : another group
Returns :
instance of : class : ` SMESH . SMESH_Group `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . UnionGroups ( group1 , group2 , name )
2012-08-09 16:03:55 +06:00
2009-02-17 10:27:49 +05:00
def UnionListOfGroups ( self , groups , name ) :
2018-05-25 22:04:48 +05:00
"""
Produce a union list of groups .
New group is created . All mesh elements that are present in
initial groups are added to the new one
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
groups : list of : class : ` SMESH . SMESH_GroupBase `
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
instance of : class : ` SMESH . SMESH_Group `
"""
2017-12-08 19:09:48 +05:00
return self . mesh . UnionListOfGroups ( groups , name )
2012-08-09 16:03:55 +06:00
2008-03-07 12:47:05 +05:00
def IntersectGroups ( self , group1 , group2 , name ) :
2018-05-25 22:04:48 +05:00
"""
Prodice an intersection of two groups .
A new group is created . All mesh elements that are common
for the two initial groups are added to the new one .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
group1 ( SMESH . SMESH_GroupBase ) : a group
group2 ( SMESH . SMESH_GroupBase ) : another group
Returns :
instance of : class : ` SMESH . SMESH_Group `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . IntersectGroups ( group1 , group2 , name )
2012-08-09 16:03:55 +06:00
2009-02-17 10:27:49 +05:00
def IntersectListOfGroups ( self , groups , name ) :
2018-05-25 22:04:48 +05:00
"""
Produce an intersection of groups .
New group is created . All mesh elements that are present in all
initial groups simultaneously are added to the new one
Parameters :
groups : a list of : class : ` SMESH . SMESH_GroupBase `
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
instance of : class : ` SMESH . SMESH_Group `
"""
2017-12-08 19:09:48 +05:00
return self . mesh . IntersectListOfGroups ( groups , name )
2008-03-07 12:47:05 +05:00
2009-02-17 10:27:49 +05:00
def CutGroups ( self , main_group , tool_group , name ) :
2018-05-25 22:04:48 +05:00
"""
Produce a cut of two groups .
A new group is created . All mesh elements that are present in
the main group but are not present in the tool group are added to the new one
Parameters :
main_group ( SMESH . SMESH_GroupBase ) : a group to cut from
tool_group ( SMESH . SMESH_GroupBase ) : a group to cut by
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
an instance of : class : ` SMESH . SMESH_Group `
"""
2017-12-08 19:09:48 +05:00
2009-02-17 10:27:49 +05:00
return self . mesh . CutGroups ( main_group , tool_group , name )
2012-08-09 16:03:55 +06:00
2009-02-17 10:27:49 +05:00
def CutListOfGroups ( self , main_groups , tool_groups , name ) :
2018-05-25 22:04:48 +05:00
"""
Produce a cut of groups .
A new group is created . All mesh elements that are present in main groups
but do not present in tool groups are added to the new one
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
main_group : groups to cut from ( list of : class : ` SMESH . SMESH_GroupBase ` )
tool_group : groups to cut by ( list of : class : ` SMESH . SMESH_GroupBase ` )
Returns :
an instance of : class : ` SMESH . SMESH_Group `
"""
2017-12-08 19:09:48 +05:00
2015-03-03 17:03:38 +05:00
return self . mesh . CutListOfGroups ( main_groups , tool_groups , name )
def CreateDimGroup ( self , groups , elemType , name ,
nbCommonNodes = SMESH . ALL_NODES , underlyingOnly = True ) :
2018-05-25 22:04:48 +05:00
"""
Create a standalone group of entities basing on nodes of other groups .
Parameters :
groups : list of reference : class : ` sub - meshes , groups or filters < SMESH . SMESH_IDSource > ` , of any type .
elemType : a type of elements to include to the new group ; either of
( SMESH . NODE , SMESH . EDGE , SMESH . FACE , SMESH . VOLUME ) .
name : a name of the new group .
nbCommonNodes : a criterion of inclusion of an element to the new group
basing on number of element nodes common with reference * groups * .
Meaning of possible values are :
- SMESH . ALL_NODES - include if all nodes are common ,
- SMESH . MAIN - include if all corner nodes are common ( meaningful for a quadratic mesh ) ,
- SMESH . AT_LEAST_ONE - include if one or more node is common ,
- SMEHS . MAJORITY - include if half of nodes or more are common .
underlyingOnly : if * True * ( default ) , an element is included to the
new group provided that it is based on nodes of an element of * groups * ;
in this case the reference * groups * are supposed to be of higher dimension
than * elemType * , which can be useful for example to get all faces lying on
volumes of the reference * groups * .
Returns :
an instance of : class : ` SMESH . SMESH_Group `
"""
2017-12-08 19:09:48 +05:00
2015-03-03 17:03:38 +05:00
if isinstance ( groups , SMESH . _objref_SMESH_IDSource ) :
groups = [ groups ]
return self . mesh . CreateDimGroup ( groups , elemType , name , nbCommonNodes , underlyingOnly )
2009-02-17 10:27:49 +05:00
2008-03-07 12:47:05 +05:00
2009-02-17 10:27:49 +05:00
def ConvertToStandalone ( self , group ) :
2018-05-25 22:04:48 +05:00
"""
Convert group on geom into standalone group
"""
2017-12-08 19:09:48 +05:00
2009-02-17 10:27:49 +05:00
return self . mesh . ConvertToStandalone ( group )
2008-03-07 12:47:05 +05:00
# Get some info about mesh:
# ------------------------
def GetLog ( self , clearAfterGet ) :
2018-05-25 22:04:48 +05:00
"""
Return the log of nodes and elements added or removed
since the previous clear of the log .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
clearAfterGet : log is emptied after Get ( safe if concurrents access )
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
list of SMESH . log_block structures { commandType , number , coords , indexes }
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetLog ( clearAfterGet )
def ClearLog ( self ) :
2018-05-25 22:04:48 +05:00
"""
Clear the log of nodes and elements added or removed since the previous
clear . Must be used immediately after : meth : ` GetLog ` if clearAfterGet is false .
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
self . mesh . ClearLog ( )
def SetAutoColor ( self , theAutoColor ) :
2018-05-25 22:04:48 +05:00
"""
Toggle auto color mode on the object .
If switched on , a default color of a new group in Create Group dialog is chosen randomly .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theAutoColor ( boolean ) : the flag which toggles auto color mode .
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
self . mesh . SetAutoColor ( theAutoColor )
def GetAutoColor ( self ) :
2018-05-25 22:04:48 +05:00
"""
Get flag of object auto color mode .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
True or False
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetAutoColor ( )
def GetId ( self ) :
2018-05-25 22:04:48 +05:00
"""
Get the internal ID
2017-12-08 19:09:48 +05:00
Returns :
integer value , which is the internal Id of the mesh
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetId ( )
def HasDuplicatedGroupNamesMED ( self ) :
2018-05-25 22:04:48 +05:00
"""
Check the group names for duplications .
Consider the maximum group name length stored in MED file .
2017-12-08 19:09:48 +05:00
Returns :
True or False
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . HasDuplicatedGroupNamesMED ( )
def GetMeshEditor ( self ) :
2018-05-25 22:04:48 +05:00
"""
Obtain the mesh editor tool
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
an instance of : class : ` SMESH . SMESH_MeshEditor `
"""
2017-12-08 19:09:48 +05:00
2012-10-08 17:56:59 +06:00
return self . editor
2008-03-07 12:47:05 +05:00
2015-07-09 14:41:53 +05:00
def GetIDSource ( self , ids , elemType = SMESH . ALL ) :
2018-05-25 22:04:48 +05:00
"""
Wrap a list of IDs of elements or nodes into : class : ` SMESH . SMESH_IDSource ` which
can be passed as argument to a method accepting : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
ids : list of IDs
elemType : type of elements ; this parameter is used to distinguish
IDs of nodes from IDs of elements ; by default ids are treated as
IDs of elements ; use SMESH . NODE if ids are IDs of nodes .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
an instance of : class : ` SMESH . SMESH_IDSource `
Warning :
call UnRegister ( ) for the returned object as soon as it is no more useful : :
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
idSrc = mesh . GetIDSource ( [ 1 , 3 , 5 ] , SMESH . NODE )
mesh . DoSomething ( idSrc )
idSrc . UnRegister ( )
"""
2017-12-08 19:09:48 +05:00
2016-08-11 22:13:30 +05:00
if isinstance ( ids , int ) :
ids = [ ids ]
2012-10-08 17:56:59 +06:00
return self . editor . MakeIDSource ( ids , elemType )
2012-08-09 16:03:55 +06:00
2008-03-07 12:47:05 +05:00
2017-11-28 16:15:48 +05:00
# Get information about mesh contents:
2008-03-07 12:47:05 +05:00
# ------------------------------------
2012-08-09 16:03:55 +06:00
def GetMeshInfo ( self , obj = None ) :
2018-05-25 22:04:48 +05:00
"""
Get the mesh statistic .
Use : meth : ` smeshBuilder . EnumToLong ` to get an integer from
an item of : class : ` SMESH . EntityType ` .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
dictionary { : class : ` SMESH . EntityType ` - " count of elements " }
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if not obj : obj = self . mesh
return self . smeshpyD . GetMeshInfo ( obj )
2008-03-07 12:47:05 +05:00
def NbNodes ( self ) :
2018-05-25 22:04:48 +05:00
"""
Return the number of nodes in the mesh
2017-12-08 19:09:48 +05:00
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbNodes ( )
def NbElements ( self ) :
2018-05-25 22:04:48 +05:00
"""
Return the number of elements in the mesh
2017-12-08 19:09:48 +05:00
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbElements ( )
2012-08-09 16:03:55 +06:00
def Nb0DElements ( self ) :
2018-05-25 22:04:48 +05:00
"""
Return the number of 0 d elements in the mesh
2017-12-08 19:09:48 +05:00
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . mesh . Nb0DElements ( )
def NbBalls ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of ball discrete elements in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . mesh . NbBalls ( )
2008-03-07 12:47:05 +05:00
def NbEdges ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of edges in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbEdges ( )
def NbEdgesOfOrder ( self , elementOrder ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of edges with the given order in the mesh
2018-05-25 22:04:48 +05:00
Parameters :
elementOrder : the order of elements
( SMESH . ORDER_ANY , SMESH . ORDER_LINEAR or SMESH . ORDER_QUADRATIC )
2017-12-08 19:09:48 +05:00
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbEdgesOfOrder ( elementOrder )
def NbFaces ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of faces in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbFaces ( )
def NbFacesOfOrder ( self , elementOrder ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of faces with the given order in the mesh
2018-05-25 22:04:48 +05:00
Parameters :
elementOrder : the order of elements
( SMESH . ORDER_ANY , SMESH . ORDER_LINEAR or SMESH . ORDER_QUADRATIC )
2017-12-08 19:09:48 +05:00
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbFacesOfOrder ( elementOrder )
def NbTriangles ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of triangles in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbTriangles ( )
def NbTrianglesOfOrder ( self , elementOrder ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of triangles with the given order in the mesh
2018-05-25 22:04:48 +05:00
Parameters :
elementOrder : is the order of elements
( SMESH . ORDER_ANY , SMESH . ORDER_LINEAR or SMESH . ORDER_QUADRATIC )
2017-12-08 19:09:48 +05:00
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbTrianglesOfOrder ( elementOrder )
2013-05-16 22:55:14 +06:00
def NbBiQuadTriangles ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of biquadratic triangles in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2013-05-16 22:55:14 +06:00
return self . mesh . NbBiQuadTriangles ( )
2008-03-07 12:47:05 +05:00
def NbQuadrangles ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of quadrangles in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbQuadrangles ( )
def NbQuadranglesOfOrder ( self , elementOrder ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of quadrangles with the given order in the mesh
2018-05-25 22:04:48 +05:00
Parameters :
elementOrder : the order of elements
( SMESH . ORDER_ANY , SMESH . ORDER_LINEAR or SMESH . ORDER_QUADRATIC )
2017-12-08 19:09:48 +05:00
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbQuadranglesOfOrder ( elementOrder )
2012-08-09 16:03:55 +06:00
def NbBiQuadQuadrangles ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of biquadratic quadrangles in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . mesh . NbBiQuadQuadrangles ( )
2015-06-24 14:17:07 +05:00
def NbPolygons ( self , elementOrder = SMESH . ORDER_ANY ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of polygons of given order in the mesh
2018-05-25 22:04:48 +05:00
Parameters :
elementOrder : the order of elements
( SMESH . ORDER_ANY , SMESH . ORDER_LINEAR or SMESH . ORDER_QUADRATIC )
2017-12-08 19:09:48 +05:00
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2015-07-15 19:05:14 +05:00
return self . mesh . NbPolygonsOfOrder ( elementOrder )
2008-03-07 12:47:05 +05:00
def NbVolumes ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of volumes in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbVolumes ( )
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
def NbVolumesOfOrder ( self , elementOrder ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of volumes with the given order in the mesh
2018-05-25 22:04:48 +05:00
Parameters :
elementOrder : the order of elements
( SMESH . ORDER_ANY , SMESH . ORDER_LINEAR or SMESH . ORDER_QUADRATIC )
2017-12-08 19:09:48 +05:00
Returns :
an integer value
"""
2008-03-07 12:47:05 +05:00
return self . mesh . NbVolumesOfOrder ( elementOrder )
def NbTetras ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of tetrahedrons in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbTetras ( )
def NbTetrasOfOrder ( self , elementOrder ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of tetrahedrons with the given order in the mesh
2018-05-25 22:04:48 +05:00
Parameters :
elementOrder : the order of elements
( SMESH . ORDER_ANY , SMESH . ORDER_LINEAR or SMESH . ORDER_QUADRATIC )
2017-12-08 19:09:48 +05:00
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbTetrasOfOrder ( elementOrder )
def NbHexas ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of hexahedrons in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbHexas ( )
def NbHexasOfOrder ( self , elementOrder ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of hexahedrons with the given order in the mesh
2018-05-25 22:04:48 +05:00
Parameters :
elementOrder : the order of elements
( SMESH . ORDER_ANY , SMESH . ORDER_LINEAR or SMESH . ORDER_QUADRATIC )
2017-12-08 19:09:48 +05:00
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbHexasOfOrder ( elementOrder )
2012-08-09 16:03:55 +06:00
def NbTriQuadraticHexas ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of triquadratic hexahedrons in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . mesh . NbTriQuadraticHexas ( )
2008-03-07 12:47:05 +05:00
def NbPyramids ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of pyramids in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbPyramids ( )
def NbPyramidsOfOrder ( self , elementOrder ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of pyramids with the given order in the mesh
2018-05-25 22:04:48 +05:00
Parameters :
elementOrder : the order of elements
( SMESH . ORDER_ANY , SMESH . ORDER_LINEAR or SMESH . ORDER_QUADRATIC )
2017-12-08 19:09:48 +05:00
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbPyramidsOfOrder ( elementOrder )
def NbPrisms ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of prisms in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbPrisms ( )
def NbPrismsOfOrder ( self , elementOrder ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of prisms with the given order in the mesh
2018-05-25 22:04:48 +05:00
Parameters :
elementOrder : the order of elements
( SMESH . ORDER_ANY , SMESH . ORDER_LINEAR or SMESH . ORDER_QUADRATIC )
2017-12-08 19:09:48 +05:00
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbPrismsOfOrder ( elementOrder )
2012-08-09 16:03:55 +06:00
def NbHexagonalPrisms ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of hexagonal prisms in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . mesh . NbHexagonalPrisms ( )
2008-03-07 12:47:05 +05:00
def NbPolyhedrons ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of polyhedrons in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbPolyhedrons ( )
def NbSubMesh ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of submeshes in the mesh
Returns :
an integer value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . NbSubMesh ( )
def GetElementsId ( self ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Return the list of all mesh elements IDs
2017-12-08 19:09:48 +05:00
Returns :
the list of integer values
2018-05-25 22:04:48 +05:00
See Also :
: meth : ` GetElementsByType `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetElementsId ( )
def GetElementsByType ( self , elementType ) :
2017-12-08 19:09:48 +05:00
"""
Return the list of IDs of mesh elements with the given type
2018-05-25 22:04:48 +05:00
Parameters :
elementType ( SMESH . ElementType ) : the required type of elements
2017-12-08 19:09:48 +05:00
Returns :
list of integer values
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetElementsByType ( elementType )
def GetNodesId ( self ) :
2017-12-08 19:09:48 +05:00
"""
Return the list of mesh nodes IDs
Returns :
the list of integer values
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetNodesId ( )
2009-02-17 10:27:49 +05:00
# Get the information about mesh elements:
2008-03-07 12:47:05 +05:00
# ------------------------------------
2015-06-24 14:17:07 +05:00
def GetElementType ( self , id , iselem = True ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Return the type of mesh element or node
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
the value from : class : ` SMESH . ElementType ` enumeration .
Return SMESH . ALL if element or node with the given ID does not exist
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetElementType ( id , iselem )
2012-08-09 16:03:55 +06:00
def GetElementGeomType ( self , id ) :
2017-12-08 19:09:48 +05:00
"""
Return the geometric type of mesh element
Returns :
2018-05-25 22:04:48 +05:00
the value from : class : ` SMESH . EntityType ` enumeration .
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . mesh . GetElementGeomType ( id )
2014-01-20 16:31:23 +06:00
def GetElementShape ( self , id ) :
2017-12-08 19:09:48 +05:00
"""
Return the shape type of mesh element
Returns :
2018-05-25 22:04:48 +05:00
the value from : class : ` SMESH . GeometryType ` enumeration .
"""
2017-12-08 19:09:48 +05:00
2014-01-20 16:31:23 +06:00
return self . mesh . GetElementShape ( id )
2008-03-07 12:47:05 +05:00
def GetSubMeshElementsId ( self , Shape ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Return the list of sub - mesh elements IDs
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
Shape ( GEOM . GEOM_Object ) : a geom object ( sub - shape ) .
* Shape * must be the sub - shape of the : meth : ` main shape < GetShape > `
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
list of integer values
"""
2017-12-08 19:09:48 +05:00
2015-07-16 22:52:26 +05:00
if isinstance ( Shape , geomBuilder . GEOM . _objref_GEOM_Object ) :
ShapeID = self . geompyD . GetSubShapeID ( self . geom , Shape )
2008-03-07 12:47:05 +05:00
else :
ShapeID = Shape
return self . mesh . GetSubMeshElementsId ( ShapeID )
def GetSubMeshNodesId ( self , Shape , all ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Return the list of sub - mesh nodes IDs
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
Shape : a geom object ( sub - shape ) .
* Shape * must be the sub - shape of a : meth : ` GetShape `
all : If True , gives all nodes of sub - mesh elements , otherwise gives only sub - mesh nodes
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
list of integer values
"""
2017-12-08 19:09:48 +05:00
2015-07-16 22:52:26 +05:00
if isinstance ( Shape , geomBuilder . GEOM . _objref_GEOM_Object ) :
2012-08-09 16:03:55 +06:00
ShapeID = self . geompyD . GetSubShapeID ( self . geom , Shape )
2008-03-07 12:47:05 +05:00
else :
ShapeID = Shape
return self . mesh . GetSubMeshNodesId ( ShapeID , all )
def GetSubMeshElementType ( self , Shape ) :
2017-12-08 19:09:48 +05:00
"""
Return type of elements on given shape
2018-05-25 22:04:48 +05:00
Parameters :
Shape : a geom object ( sub - shape ) .
* Shape * must be a sub - shape of a ShapeToMesh ( )
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
: class : ` SMESH . ElementType `
"""
2017-12-08 19:09:48 +05:00
2015-07-16 22:52:26 +05:00
if isinstance ( Shape , geomBuilder . GEOM . _objref_GEOM_Object ) :
ShapeID = self . geompyD . GetSubShapeID ( self . geom , Shape )
2008-03-07 12:47:05 +05:00
else :
ShapeID = Shape
return self . mesh . GetSubMeshElementType ( ShapeID )
def Dump ( self ) :
2017-12-08 19:09:48 +05:00
"""
Get the mesh description
Returns :
string value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . Dump ( )
2009-02-17 10:27:49 +05:00
# Get the information about nodes and elements of a mesh by its IDs:
2008-03-07 12:47:05 +05:00
# -----------------------------------------------------------
def GetNodeXYZ ( self , id ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Get XYZ coordinates of a node .
If there is no node for the given ID - return an empty list
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
list of float values
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetNodeXYZ ( id )
def GetNodeInverseElements ( self , id ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Return list of IDs of inverse elements for the given node .
If there is no node for the given ID - return an empty list
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
list of integer values
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetNodeInverseElements ( id )
def GetNodePosition ( self , NodeID ) :
2017-12-08 19:09:48 +05:00
"""
Return the position of a node on the shape
Returns :
2018-05-25 22:04:48 +05:00
: class : ` SMESH . NodePosition `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetNodePosition ( NodeID )
2013-02-12 20:37:44 +06:00
def GetElementPosition ( self , ElemID ) :
2017-12-08 19:09:48 +05:00
"""
Return the position of an element on the shape
Returns :
2018-05-25 22:04:48 +05:00
: class : ` SMESH . ElementPosition `
"""
2017-12-08 19:09:48 +05:00
2013-02-12 20:37:44 +06:00
return self . mesh . GetElementPosition ( ElemID )
2008-03-07 12:47:05 +05:00
def GetShapeID ( self , id ) :
2017-12-08 19:09:48 +05:00
"""
Return the ID of the shape , on which the given node was generated .
Returns :
an integer value > 0 or - 1 if there is no node for the given
2018-05-25 22:04:48 +05:00
ID or the node is not assigned to any geometry
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetShapeID ( id )
def GetShapeIDForElem ( self , id ) :
2017-12-08 19:09:48 +05:00
"""
Return the ID of the shape , on which the given element was generated .
Returns :
an integer value > 0 or - 1 if there is no element for the given
2018-05-25 22:04:48 +05:00
ID or the element is not assigned to any geometry
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetShapeIDForElem ( id )
def GetElemNbNodes ( self , id ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of nodes of the given element
Returns :
an integer value > 0 or - 1 if there is no element for the given ID
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetElemNbNodes ( id )
def GetElemNode ( self , id , index ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Return the node ID the given ( zero based ) index for the given element .
* If there is no element for the given ID - return - 1.
* If there is no node for the given index - return - 2.
Parameters :
id ( int ) : element ID
index ( int ) : node index within the element
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
an integer value ( ID )
See Also :
: meth : ` GetElemNodes `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetElemNode ( id , index )
def GetElemNodes ( self , id ) :
2017-12-08 19:09:48 +05:00
"""
Return the IDs of nodes of the given element
Returns :
a list of integer values
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . GetElemNodes ( id )
def IsMediumNode ( self , elementID , nodeID ) :
2017-12-08 19:09:48 +05:00
"""
Return true if the given node is the medium node in the given quadratic element
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . IsMediumNode ( elementID , nodeID )
2015-06-24 14:17:07 +05:00
def IsMediumNodeOfAnyElem ( self , nodeID , elementType = SMESH . ALL ) :
2017-12-08 19:09:48 +05:00
"""
Return true if the given node is the medium node in one of quadratic elements
2018-05-25 22:04:48 +05:00
Parameters :
nodeID : ID of the node
elementType : the type of elements to check a state of the node , either of
( SMESH . ALL , SMESH . NODE , SMESH . EDGE , SMESH . FACE or SMESH . VOLUME )
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . IsMediumNodeOfAnyElem ( nodeID , elementType )
def ElemNbEdges ( self , id ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of edges for the given element
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . ElemNbEdges ( id )
def ElemNbFaces ( self , id ) :
2017-12-08 19:09:48 +05:00
"""
Return the number of faces for the given element
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . ElemNbFaces ( id )
2012-08-09 16:03:55 +06:00
def GetElemFaceNodes ( self , elemId , faceIndex ) :
2017-12-08 19:09:48 +05:00
"""
Return nodes of given face ( counted from zero ) for given volumic element .
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . mesh . GetElemFaceNodes ( elemId , faceIndex )
2014-01-20 23:42:20 +06:00
def GetFaceNormal ( self , faceId , normalized = False ) :
2017-12-08 19:09:48 +05:00
"""
Return three components of normal of given mesh face
2018-05-25 22:04:48 +05:00
( or an empty array in KO case )
"""
2017-12-08 19:09:48 +05:00
2014-01-20 23:42:20 +06:00
return self . mesh . GetFaceNormal ( faceId , normalized )
2014-01-15 15:41:17 +06:00
2017-04-17 17:42:28 +05:00
def FindElementByNodes ( self , nodes ) :
2017-12-08 19:09:48 +05:00
"""
Return an element based on all given nodes .
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . mesh . FindElementByNodes ( nodes )
2017-04-17 17:42:28 +05:00
def GetElementsByNodes ( self , nodes , elemType = SMESH . ALL ) :
2017-12-08 19:09:48 +05:00
"""
Return elements including all given nodes .
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2017-04-17 17:42:28 +05:00
return self . mesh . GetElementsByNodes ( nodes , elemType )
2008-03-07 12:47:05 +05:00
def IsPoly ( self , id ) :
2017-12-08 19:09:48 +05:00
"""
Return true if the given element is a polygon
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . IsPoly ( id )
def IsQuadratic ( self , id ) :
2017-12-08 19:09:48 +05:00
"""
Return true if the given element is quadratic
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . IsQuadratic ( id )
2012-08-09 16:03:55 +06:00
def GetBallDiameter ( self , id ) :
2017-12-08 19:09:48 +05:00
"""
Return diameter of a ball discrete element or zero in case of an invalid * id *
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . mesh . GetBallDiameter ( id )
2008-03-07 12:47:05 +05:00
def BaryCenter ( self , id ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Return XYZ coordinates of the barycenter of the given element .
If there is no element for the given ID - return an empty list
2017-12-08 19:09:48 +05:00
Returns :
a list of three double values
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . mesh . BaryCenter ( id )
2012-08-09 16:03:55 +06:00
def GetIdsFromFilter ( self , theFilter ) :
2017-12-08 19:09:48 +05:00
"""
Pass mesh elements through the given filter and return IDs of fitting elements
2018-05-25 22:04:48 +05:00
Parameters :
theFilter : : class : ` SMESH . Filter `
2017-12-08 19:09:48 +05:00
Returns :
a list of ids
2018-05-25 22:04:48 +05:00
See Also :
: meth : ` SMESH . Filter . GetIDs `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
theFilter . SetMesh ( self . mesh )
return theFilter . GetIDs ( )
2016-12-16 21:17:51 +05:00
# Get mesh measurements information:
# ------------------------------------
2012-08-09 16:03:55 +06:00
def GetFreeBorders ( self ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Verify whether a 2 D mesh element has free edges ( edges connected to one face only ) .
Return a list of special structures ( borders ) .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
a list of : class : ` SMESH . FreeEdges . Border `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
aFilterMgr = self . smeshpyD . CreateFilterManager ( )
aPredicate = aFilterMgr . CreateFreeEdges ( )
aPredicate . SetMesh ( self . mesh )
aBorders = aPredicate . GetBorders ( )
aFilterMgr . UnRegister ( )
return aBorders
def MinDistance ( self , id1 , id2 = 0 , isElem1 = False , isElem2 = False ) :
2017-12-08 19:09:48 +05:00
"""
Get minimum distance between two nodes , elements or distance to the origin
2018-05-25 22:04:48 +05:00
Parameters :
id1 : first node / element id
id2 : second node / element id ( if 0 , distance from * id1 * to the origin is computed )
isElem1 : * True * if * id1 * is element id , * False * if it is node id
isElem2 : * True * if * id2 * is element id , * False * if it is node id
2017-12-08 19:09:48 +05:00
Returns :
minimum distance value * * GetMinDistance ( ) * *
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
aMeasure = self . GetMinDistance ( id1 , id2 , isElem1 , isElem2 )
return aMeasure . value
def GetMinDistance ( self , id1 , id2 = 0 , isElem1 = False , isElem2 = False ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Get : class : ` SMESH . Measure ` structure specifying minimum distance data between two objects
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
id1 : first node / element id
id2 : second node / element id ( if 0 , distance from * id1 * to the origin is computed )
isElem1 : * True * if * id1 * is element id , * False * if it is node id
isElem2 : * True * if * id2 * is element id , * False * if it is node id
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
: class : ` SMESH . Measure ` structure
See Also :
: meth : ` MinDistance `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if isElem1 :
id1 = self . editor . MakeIDSource ( [ id1 ] , SMESH . FACE )
else :
id1 = self . editor . MakeIDSource ( [ id1 ] , SMESH . NODE )
if id2 != 0 :
if isElem2 :
id2 = self . editor . MakeIDSource ( [ id2 ] , SMESH . FACE )
else :
id2 = self . editor . MakeIDSource ( [ id2 ] , SMESH . NODE )
pass
else :
id2 = None
aMeasurements = self . smeshpyD . CreateMeasurements ( )
aMeasure = aMeasurements . MinDistance ( id1 , id2 )
2013-08-07 20:06:39 +06:00
genObjUnRegister ( [ aMeasurements , id1 , id2 ] )
2012-08-09 16:03:55 +06:00
return aMeasure
def BoundingBox ( self , objects = None , isElem = False ) :
2017-12-08 19:09:48 +05:00
"""
Get bounding box of the specified object ( s )
2018-05-25 22:04:48 +05:00
Parameters :
objects : single : class : ` source object < SMESH . SMESH_IDSource > ` or list of source objects or list of nodes / elements IDs
isElem : if * objects * is a list of IDs , * True * value in this parameters specifies that * objects * are elements ,
* False * specifies that * objects * are nodes
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
tuple of six values ( minX , minY , minZ , maxX , maxY , maxZ )
See Also :
: meth : ` GetBoundingBox ( ) `
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
result = self . GetBoundingBox ( objects , isElem )
if result is None :
result = ( 0.0 , ) * 6
else :
result = ( result . minX , result . minY , result . minZ , result . maxX , result . maxY , result . maxZ )
return result
2018-05-25 22:04:48 +05:00
def GetBoundingBox ( self , objects = None , isElem = False ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Get : class : ` SMESH . Measure ` structure specifying bounding box data of the specified object ( s )
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
objects : single : class : ` source object < SMESH . SMESH_IDSource > ` or list of source objects or list of nodes / elements IDs
isElem : if * objects * is a list of IDs , True means that * objects * are elements ,
False means that * objects * are nodes
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
: class : ` SMESH . Measure ` structure
See Also :
: meth : ` BoundingBox ( ) `
"""
2017-12-08 19:09:48 +05:00
2018-06-01 12:21:02 +05:00
if objects is None :
objects = [ self . mesh ]
elif isinstance ( objects , tuple ) :
objects = list ( objects )
if not isinstance ( objects , list ) :
objects = [ objects ]
if len ( objects ) > 0 and isinstance ( objects [ 0 ] , int ) :
objects = [ objects ]
2012-08-09 16:03:55 +06:00
srclist = [ ]
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2018-06-01 12:21:02 +05:00
for o in objects :
2012-08-09 16:03:55 +06:00
if isinstance ( o , Mesh ) :
srclist . append ( o . mesh )
elif hasattr ( o , " _narrow " ) :
src = o . _narrow ( SMESH . SMESH_IDSource )
if src : srclist . append ( src )
pass
elif isinstance ( o , list ) :
if isElem :
srclist . append ( self . editor . MakeIDSource ( o , SMESH . FACE ) )
else :
srclist . append ( self . editor . MakeIDSource ( o , SMESH . NODE ) )
2013-08-07 20:06:39 +06:00
unRegister . set ( srclist [ - 1 ] )
2012-08-09 16:03:55 +06:00
pass
pass
aMeasurements = self . smeshpyD . CreateMeasurements ( )
2013-08-07 20:06:39 +06:00
unRegister . set ( aMeasurements )
2012-08-09 16:03:55 +06:00
aMeasure = aMeasurements . BoundingBox ( srclist )
return aMeasure
2008-03-07 12:47:05 +05:00
# Mesh edition (SMESH_MeshEditor functionality):
# ---------------------------------------------
def RemoveElements ( self , IDsOfElements ) :
2017-12-08 19:09:48 +05:00
"""
Remove the elements from the mesh by ids
2018-05-25 22:04:48 +05:00
Parameters :
IDsOfElements : is a list of ids of elements to remove
2017-12-08 19:09:48 +05:00
Returns :
True or False
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . RemoveElements ( IDsOfElements )
def RemoveNodes ( self , IDsOfNodes ) :
2017-12-08 19:09:48 +05:00
"""
Remove nodes from mesh by ids
2018-05-25 22:04:48 +05:00
Parameters :
IDsOfNodes : is a list of ids of nodes to remove
2017-12-08 19:09:48 +05:00
Returns :
True or False
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . RemoveNodes ( IDsOfNodes )
2012-08-09 16:03:55 +06:00
def RemoveOrphanNodes ( self ) :
2017-12-08 19:09:48 +05:00
"""
Remove all orphan ( free ) nodes from mesh
Returns :
number of the removed nodes
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . editor . RemoveOrphanNodes ( )
2008-03-07 12:47:05 +05:00
def AddNode ( self , x , y , z ) :
2017-12-08 19:09:48 +05:00
"""
Add a node to the mesh by coordinates
Returns :
2018-05-25 22:04:48 +05:00
ID of the new node
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
x , y , z , Parameters , hasVars = ParseParameters ( x , y , z )
if hasVars : self . mesh . SetParameters ( Parameters )
2008-03-07 12:47:05 +05:00
return self . editor . AddNode ( x , y , z )
2016-08-11 22:13:30 +05:00
def Add0DElement ( self , IDOfNode , DuplicateElements = True ) :
2017-12-08 19:09:48 +05:00
"""
Create a 0 D element on a node with given number .
2018-05-25 22:04:48 +05:00
Parameters :
IDOfNode : the ID of node for creation of the element .
DuplicateElements : to add one more 0 D element to a node or not
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
ID of the new 0 D element
"""
2017-12-08 19:09:48 +05:00
2016-08-11 22:13:30 +05:00
return self . editor . Add0DElement ( IDOfNode , DuplicateElements )
2012-08-09 16:03:55 +06:00
2016-08-11 22:13:30 +05:00
def Add0DElementsToAllNodes ( self , theObject , theGroupName = " " , DuplicateElements = False ) :
2017-12-08 19:09:48 +05:00
"""
Create 0 D elements on all nodes of the given elements except those
2018-05-25 22:04:48 +05:00
nodes on which a 0 D element already exists .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theObject : an object on whose nodes 0 D elements will be created .
It can be list of element IDs , : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
theGroupName : optional name of a group to add 0 D elements created
and / or found on nodes of * theObject * .
DuplicateElements : to add one more 0 D element to a node or not
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
an object ( a new group or a temporary : class : ` SMESH . SMESH_IDSource ` ) holding
IDs of new and / or found 0 D elements . IDs of 0 D elements
can be retrieved from the returned object by
calling : meth : ` GetIDs ( ) < SMESH . SMESH_IDSource . GetIDs > `
"""
2017-12-08 19:09:48 +05:00
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2012-12-13 17:41:29 +06:00
if isinstance ( theObject , Mesh ) :
theObject = theObject . GetMesh ( )
2016-08-11 22:13:30 +05:00
elif isinstance ( theObject , list ) :
2012-12-13 17:41:29 +06:00
theObject = self . GetIDSource ( theObject , SMESH . ALL )
2013-08-07 20:06:39 +06:00
unRegister . set ( theObject )
2016-08-11 22:13:30 +05:00
return self . editor . Create0DElementsOnAllNodes ( theObject , theGroupName , DuplicateElements )
2012-12-13 17:41:29 +06:00
2012-08-09 16:03:55 +06:00
def AddBall ( self , IDOfNode , diameter ) :
2017-12-08 19:09:48 +05:00
"""
Create a ball element on a node with given ID .
2018-05-25 22:04:48 +05:00
Parameters :
IDOfNode : the ID of node for creation of the element .
diameter : the bal diameter .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
ID of the new ball element
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . editor . AddBall ( IDOfNode , diameter )
2008-03-07 12:47:05 +05:00
def AddEdge ( self , IDsOfNodes ) :
2017-12-08 19:09:48 +05:00
"""
Create a linear or quadratic edge ( this is determined
2018-05-25 22:04:48 +05:00
by the number of given nodes ) .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
IDsOfNodes : list of node IDs for creation of the element .
The order of nodes in this list should correspond to
the : ref : ` connectivity convention < connectivity_page > ` .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
ID of the new edge
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . AddEdge ( IDsOfNodes )
def AddFace ( self , IDsOfNodes ) :
2017-12-08 19:09:48 +05:00
"""
Create a linear or quadratic face ( this is determined
2018-05-25 22:04:48 +05:00
by the number of given nodes ) .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
IDsOfNodes : list of node IDs for creation of the element .
The order of nodes in this list should correspond to
the : ref : ` connectivity convention < connectivity_page > ` .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
ID of the new face
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . AddFace ( IDsOfNodes )
def AddPolygonalFace ( self , IdsOfNodes ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Add a polygonal face defined by a list of node IDs
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
IdsOfNodes : the list of node IDs for creation of the element .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
ID of the new face
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . AddPolygonalFace ( IdsOfNodes )
2015-06-24 14:17:07 +05:00
def AddQuadPolygonalFace ( self , IdsOfNodes ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Add a quadratic polygonal face defined by a list of node IDs
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
IdsOfNodes : the list of node IDs for creation of the element ;
corner nodes follow first .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
ID of the new face
"""
2017-12-08 19:09:48 +05:00
2015-06-24 14:17:07 +05:00
return self . editor . AddQuadPolygonalFace ( IdsOfNodes )
2008-03-07 12:47:05 +05:00
def AddVolume ( self , IDsOfNodes ) :
2017-12-08 19:09:48 +05:00
"""
Create both simple and quadratic volume ( this is determined
2018-05-25 22:04:48 +05:00
by the number of given nodes ) .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
IDsOfNodes : list of node IDs for creation of the element .
The order of nodes in this list should correspond to
the : ref : ` connectivity convention < connectivity_page > ` .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
ID of the new volumic element
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . AddVolume ( IDsOfNodes )
def AddPolyhedralVolume ( self , IdsOfNodes , Quantities ) :
2017-12-08 19:09:48 +05:00
"""
Create a volume of many faces , giving nodes for each face .
2018-05-25 22:04:48 +05:00
Parameters :
IdsOfNodes : list of node IDs for volume creation , face by face .
Quantities : list of integer values , Quantities [ i ]
gives the quantity of nodes in face number i .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
ID of the new volumic element
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . AddPolyhedralVolume ( IdsOfNodes , Quantities )
def AddPolyhedralVolumeByFaces ( self , IdsOfFaces ) :
2017-12-08 19:09:48 +05:00
"""
Create a volume of many faces , giving the IDs of the existing faces .
2018-05-25 22:04:48 +05:00
Note :
The created volume will refer only to the nodes
of the given faces , not to the faces themselves .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
IdsOfFaces : the list of face IDs for volume creation .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
ID of the new volumic element
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . AddPolyhedralVolumeByFaces ( IdsOfFaces )
def SetNodeOnVertex ( self , NodeID , Vertex ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Binds a node to a vertex
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
NodeID : a node ID
Vertex : a vertex ( GEOM . GEOM_Object ) or vertex ID
2017-12-08 19:09:48 +05:00
Returns :
True if succeed else raises an exception
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2013-04-04 13:08:19 +06:00
if ( isinstance ( Vertex , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
2015-07-16 22:52:26 +05:00
VertexID = self . geompyD . GetSubShapeID ( self . geom , Vertex )
2008-03-07 12:47:05 +05:00
else :
VertexID = Vertex
try :
self . editor . SetNodeOnVertex ( NodeID , VertexID )
2017-03-20 17:27:30 +05:00
except SALOME . SALOME_Exception as inst :
raise ValueError ( inst . details . text )
2008-03-07 12:47:05 +05:00
return True
def SetNodeOnEdge ( self , NodeID , Edge , paramOnEdge ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Stores the node position on an edge
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
NodeID : a node ID
Edge : an edge ( GEOM . GEOM_Object ) or edge ID
paramOnEdge : a parameter on the edge where the node is located
2017-12-08 19:09:48 +05:00
Returns :
True if succeed else raises an exception
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2013-04-04 13:08:19 +06:00
if ( isinstance ( Edge , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
2015-07-16 22:52:26 +05:00
EdgeID = self . geompyD . GetSubShapeID ( self . geom , Edge )
2008-03-07 12:47:05 +05:00
else :
EdgeID = Edge
try :
self . editor . SetNodeOnEdge ( NodeID , EdgeID , paramOnEdge )
2017-03-20 17:27:30 +05:00
except SALOME . SALOME_Exception as inst :
raise ValueError ( inst . details . text )
2008-03-07 12:47:05 +05:00
return True
def SetNodeOnFace ( self , NodeID , Face , u , v ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Stores node position on a face
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
NodeID : a node ID
Face : a face ( GEOM . GEOM_Object ) or face ID
u : U parameter on the face where the node is located
v : V parameter on the face where the node is located
2017-12-08 19:09:48 +05:00
Returns :
True if succeed else raises an exception
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2013-04-04 13:08:19 +06:00
if ( isinstance ( Face , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
2015-07-16 22:52:26 +05:00
FaceID = self . geompyD . GetSubShapeID ( self . geom , Face )
2008-03-07 12:47:05 +05:00
else :
FaceID = Face
try :
self . editor . SetNodeOnFace ( NodeID , FaceID , u , v )
2017-03-20 17:27:30 +05:00
except SALOME . SALOME_Exception as inst :
raise ValueError ( inst . details . text )
2008-03-07 12:47:05 +05:00
return True
def SetNodeInVolume ( self , NodeID , Solid ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Binds a node to a solid
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
NodeID : a node ID
Solid : a solid ( GEOM . GEOM_Object ) or solid ID
2017-12-08 19:09:48 +05:00
Returns :
True if succeed else raises an exception
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2013-04-04 13:08:19 +06:00
if ( isinstance ( Solid , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
2015-07-16 22:52:26 +05:00
SolidID = self . geompyD . GetSubShapeID ( self . geom , Solid )
2008-03-07 12:47:05 +05:00
else :
SolidID = Solid
try :
self . editor . SetNodeInVolume ( NodeID , SolidID )
2017-03-20 17:27:30 +05:00
except SALOME . SALOME_Exception as inst :
raise ValueError ( inst . details . text )
2008-03-07 12:47:05 +05:00
return True
def SetMeshElementOnShape ( self , ElementID , Shape ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Bind an element to a shape
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
ElementID : an element ID
Shape : a shape ( GEOM . GEOM_Object ) or shape ID
2017-12-08 19:09:48 +05:00
Returns :
True if succeed else raises an exception
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2013-04-04 13:08:19 +06:00
if ( isinstance ( Shape , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
2015-07-16 22:52:26 +05:00
ShapeID = self . geompyD . GetSubShapeID ( self . geom , Shape )
2008-03-07 12:47:05 +05:00
else :
ShapeID = Shape
try :
self . editor . SetMeshElementOnShape ( ElementID , ShapeID )
2017-03-20 17:27:30 +05:00
except SALOME . SALOME_Exception as inst :
raise ValueError ( inst . details . text )
2008-03-07 12:47:05 +05:00
return True
def MoveNode ( self , NodeID , x , y , z ) :
2017-12-08 19:09:48 +05:00
"""
Move the node with the given id
2018-05-25 22:04:48 +05:00
Parameters :
NodeID : the id of the node
x : a new X coordinate
y : a new Y coordinate
z : a new Z coordinate
2017-12-08 19:09:48 +05:00
Returns :
True if succeed else False
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
x , y , z , Parameters , hasVars = ParseParameters ( x , y , z )
if hasVars : self . mesh . SetParameters ( Parameters )
2008-03-07 12:47:05 +05:00
return self . editor . MoveNode ( NodeID , x , y , z )
2009-02-17 10:27:49 +05:00
def MoveClosestNodeToPoint ( self , x , y , z , NodeID ) :
2017-12-08 19:09:48 +05:00
"""
Find the node closest to a point and moves it to a point location
2018-05-25 22:04:48 +05:00
Parameters :
x : the X coordinate of a point
y : the Y coordinate of a point
z : the Z coordinate of a point
NodeID : if specified ( > 0 ) , the node with this ID is moved ,
otherwise , the node closest to point ( * x * , * y * , * z * ) is moved
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
the ID of a moved node
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
x , y , z , Parameters , hasVars = ParseParameters ( x , y , z )
if hasVars : self . mesh . SetParameters ( Parameters )
2009-02-17 10:27:49 +05:00
return self . editor . MoveClosestNodeToPoint ( x , y , z , NodeID )
2008-03-07 12:47:05 +05:00
def FindNodeClosestTo ( self , x , y , z ) :
2017-12-08 19:09:48 +05:00
"""
Find the node closest to a point
2018-05-25 22:04:48 +05:00
Parameters :
x : the X coordinate of a point
y : the Y coordinate of a point
z : the Z coordinate of a point
2017-12-08 19:09:48 +05:00
Returns :
the ID of a node
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
#preview = self.mesh.GetMeshEditPreviewer()
#return preview.MoveClosestNodeToPoint(x, y, z, -1)
return self . editor . FindNodeClosestTo ( x , y , z )
def FindElementsByPoint ( self , x , y , z , elementType = SMESH . ALL , meshPart = None ) :
2017-12-08 19:09:48 +05:00
"""
Find the elements where a point lays IN or ON
2018-05-25 22:04:48 +05:00
Parameters :
x , y , z ( float ) : coordinates of the point
elementType ( SMESH . ElementType ) : type of elements to find ; SMESH . ALL type
means elements of any type excluding nodes , discrete and 0 D elements .
meshPart : a part of mesh ( : class : ` sub - mesh , group or filter < SMESH . SMESH_IDSource > ` ) to search within
2017-12-08 19:09:48 +05:00
Returns :
list of IDs of found elements
2018-05-25 22:04:48 +05:00
"""
2012-08-09 16:03:55 +06:00
if meshPart :
return self . editor . FindAmongElementsByPoint ( meshPart , x , y , z , elementType ) ;
else :
return self . editor . FindElementsByPoint ( x , y , z , elementType )
def GetPointState ( self , x , y , z ) :
2017-12-08 19:09:48 +05:00
"""
Return point state in a closed 2 D mesh in terms of TopAbs_State enumeration :
2018-05-25 22:04:48 +05:00
0 - IN , 1 - OUT , 2 - ON , 3 - UNKNOWN .
UNKNOWN state means that either mesh is wrong or the analysis fails .
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . editor . GetPointState ( x , y , z )
2008-03-07 12:47:05 +05:00
2017-10-12 21:52:03 +05:00
def IsManifold ( self ) :
2017-12-08 19:09:48 +05:00
"""
Check if a 2 D mesh is manifold
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2017-10-12 21:52:03 +05:00
return self . editor . IsManifold ( )
def IsCoherentOrientation2D ( self ) :
2017-12-08 19:09:48 +05:00
"""
Check if orientation of 2 D elements is coherent
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2017-10-12 21:52:03 +05:00
return self . editor . IsCoherentOrientation2D ( )
2008-03-07 12:47:05 +05:00
def MeshToPassThroughAPoint ( self , x , y , z ) :
2017-12-08 19:09:48 +05:00
"""
Find the node closest to a point and moves it to a point location
2018-05-25 22:04:48 +05:00
Parameters :
x : the X coordinate of a point
y : the Y coordinate of a point
z : the Z coordinate of a point
2017-12-08 19:09:48 +05:00
Returns :
the ID of a moved node
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . MoveClosestNodeToPoint ( x , y , z , - 1 )
def InverseDiag ( self , NodeID1 , NodeID2 ) :
2017-12-08 19:09:48 +05:00
"""
Replace two neighbour triangles sharing Node1 - Node2 link
2018-05-25 22:04:48 +05:00
with the triangles built on the same 4 nodes but having other common link .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
NodeID1 : the ID of the first node
NodeID2 : the ID of the second node
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
False if proper faces were not found
"""
2008-03-07 12:47:05 +05:00
return self . editor . InverseDiag ( NodeID1 , NodeID2 )
def DeleteDiag ( self , NodeID1 , NodeID2 ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Replace two neighbour triangles sharing * Node1 - Node2 * link
with a quadrangle built on the same 4 nodes .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
NodeID1 : ID of the first node
NodeID2 : ID of the second node
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
False if proper faces were not found
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . DeleteDiag ( NodeID1 , NodeID2 )
def Reorient ( self , IDsOfElements = None ) :
2017-12-08 19:09:48 +05:00
"""
Reorient elements by ids
2018-05-25 22:04:48 +05:00
Parameters :
IDsOfElements : if undefined reorients all mesh elements
2017-12-08 19:09:48 +05:00
Returns :
True if succeed else False
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if IDsOfElements == None :
IDsOfElements = self . GetElementsId ( )
return self . editor . Reorient ( IDsOfElements )
def ReorientObject ( self , theObject ) :
2017-12-08 19:09:48 +05:00
"""
Reorient all elements of the object
2018-05-25 22:04:48 +05:00
Parameters :
theObject : : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
2017-12-08 19:09:48 +05:00
Returns :
True if succeed else False
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if ( isinstance ( theObject , Mesh ) ) :
theObject = theObject . GetMesh ( )
return self . editor . ReorientObject ( theObject )
2012-08-09 16:03:55 +06:00
def Reorient2D ( self , the2DObject , theDirection , theFaceOrPoint ) :
2017-12-08 19:09:48 +05:00
"""
Reorient faces contained in * the2DObject * .
2018-05-25 22:04:48 +05:00
Parameters :
the2DObject : is a : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > ` or list of IDs of 2 D elements
theDirection : is a desired direction of normal of * theFace * .
It can be either a GEOM vector or a list of coordinates [ x , y , z ] .
theFaceOrPoint : defines a face of * the2DObject * whose normal will be
compared with theDirection . It can be either ID of face or a point
by which the face will be found . The point can be given as either
a GEOM vertex or a list of point coordinates .
2017-12-08 19:09:48 +05:00
Returns :
number of reoriented faces
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2012-08-09 16:03:55 +06:00
# check the2DObject
if isinstance ( the2DObject , Mesh ) :
the2DObject = the2DObject . GetMesh ( )
if isinstance ( the2DObject , list ) :
the2DObject = self . GetIDSource ( the2DObject , SMESH . FACE )
2013-08-07 20:06:39 +06:00
unRegister . set ( the2DObject )
2012-08-09 16:03:55 +06:00
# check theDirection
2013-04-04 13:08:19 +06:00
if isinstance ( theDirection , geomBuilder . GEOM . _objref_GEOM_Object ) :
2012-08-09 16:03:55 +06:00
theDirection = self . smeshpyD . GetDirStruct ( theDirection )
if isinstance ( theDirection , list ) :
theDirection = self . smeshpyD . MakeDirStruct ( * theDirection )
# prepare theFace and thePoint
theFace = theFaceOrPoint
thePoint = PointStruct ( 0 , 0 , 0 )
2013-04-04 13:08:19 +06:00
if isinstance ( theFaceOrPoint , geomBuilder . GEOM . _objref_GEOM_Object ) :
2012-08-09 16:03:55 +06:00
thePoint = self . smeshpyD . GetPointStruct ( theFaceOrPoint )
theFace = - 1
if isinstance ( theFaceOrPoint , list ) :
thePoint = PointStruct ( * theFaceOrPoint )
theFace = - 1
if isinstance ( theFaceOrPoint , PointStruct ) :
thePoint = theFaceOrPoint
theFace = - 1
return self . editor . Reorient2D ( the2DObject , theDirection , theFace , thePoint )
2014-08-11 19:30:26 +06:00
def Reorient2DBy3D ( self , the2DObject , the3DObject , theOutsideNormal = True ) :
2017-12-08 19:09:48 +05:00
"""
Reorient faces according to adjacent volumes .
2018-05-25 22:04:48 +05:00
Parameters :
the2DObject : is a : class : ` mesh , sub - mesh , group , filter < SMESH . SMESH_IDSource > ` or list of
either IDs of faces or face groups .
the3DObject : is a : class : ` mesh , sub - mesh , group , filter < SMESH . SMESH_IDSource > ` or list of IDs of volumes .
theOutsideNormal : to orient faces to have their normals
pointing either * outside * or * inside * the adjacent volumes .
2017-12-08 19:09:48 +05:00
Returns :
number of reoriented faces .
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2014-08-11 19:30:26 +06:00
unRegister = genObjUnRegister ( )
# check the2DObject
if not isinstance ( the2DObject , list ) :
the2DObject = [ the2DObject ]
elif the2DObject and isinstance ( the2DObject [ 0 ] , int ) :
the2DObject = self . GetIDSource ( the2DObject , SMESH . FACE )
unRegister . set ( the2DObject )
the2DObject = [ the2DObject ]
for i , obj2D in enumerate ( the2DObject ) :
if isinstance ( obj2D , Mesh ) :
the2DObject [ i ] = obj2D . GetMesh ( )
if isinstance ( obj2D , list ) :
the2DObject [ i ] = self . GetIDSource ( obj2D , SMESH . FACE )
unRegister . set ( the2DObject [ i ] )
# check the3DObject
if isinstance ( the3DObject , Mesh ) :
the3DObject = the3DObject . GetMesh ( )
if isinstance ( the3DObject , list ) :
the3DObject = self . GetIDSource ( the3DObject , SMESH . VOLUME )
unRegister . set ( the3DObject )
return self . editor . Reorient2DBy3D ( the2DObject , the3DObject , theOutsideNormal )
2008-03-07 12:47:05 +05:00
def TriToQuad ( self , IDsOfElements , theCriterion , MaxAngle ) :
2017-12-08 19:09:48 +05:00
"""
Fuse the neighbouring triangles into quadrangles .
2018-05-25 22:04:48 +05:00
Parameters :
IDsOfElements : The triangles to be fused .
theCriterion : a numerical functor , in terms of enum : class : ` SMESH . FunctorType ` , used to
applied to possible quadrangles to choose a neighbour to fuse with .
Note that not all items of : class : ` SMESH . FunctorType ` corresponds
to numerical functors .
MaxAngle : is the maximum angle between element normals at which the fusion
is still performed ; theMaxAngle is measured in radians .
Also it could be a name of variable which defines angle in degrees .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True in case of success , False otherwise .
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
MaxAngle , Parameters , hasVars = ParseAngles ( MaxAngle )
2009-02-17 10:27:49 +05:00
self . mesh . SetParameters ( Parameters )
2012-08-09 16:03:55 +06:00
if not IDsOfElements :
IDsOfElements = self . GetElementsId ( )
2012-12-13 17:41:29 +06:00
Functor = self . smeshpyD . GetFunctor ( theCriterion )
2009-02-17 10:27:49 +05:00
return self . editor . TriToQuad ( IDsOfElements , Functor , MaxAngle )
2008-03-07 12:47:05 +05:00
def TriToQuadObject ( self , theObject , theCriterion , MaxAngle ) :
2017-12-08 19:09:48 +05:00
"""
Fuse the neighbouring triangles of the object into quadrangles
2018-05-25 22:04:48 +05:00
Parameters :
theObject : is : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
theCriterion : is a numerical functor , in terms of enum : class : ` SMESH . FunctorType ` ,
applied to possible quadrangles to choose a neighbour to fuse with .
Note that not all items of : class : ` SMESH . FunctorType ` corresponds
to numerical functors .
MaxAngle : a max angle between element normals at which the fusion
is still performed ; theMaxAngle is measured in radians .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True in case of success , False otherwise .
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
MaxAngle , Parameters , hasVars = ParseAngles ( MaxAngle )
self . mesh . SetParameters ( Parameters )
2012-12-13 17:41:29 +06:00
if isinstance ( theObject , Mesh ) :
2008-03-07 12:47:05 +05:00
theObject = theObject . GetMesh ( )
2012-12-13 17:41:29 +06:00
Functor = self . smeshpyD . GetFunctor ( theCriterion )
return self . editor . TriToQuadObject ( theObject , Functor , MaxAngle )
2008-03-07 12:47:05 +05:00
2012-12-13 17:41:29 +06:00
def QuadToTri ( self , IDsOfElements , theCriterion = None ) :
2017-12-08 19:09:48 +05:00
"""
Split quadrangles into triangles .
2018-05-25 22:04:48 +05:00
Parameters :
IDsOfElements : the faces to be splitted .
theCriterion : is a numerical functor , in terms of enum : class : ` SMESH . FunctorType ` , used to
choose a diagonal for splitting . If * theCriterion * is None , which is a default
value , then quadrangles will be split by the smallest diagonal .
Note that not all items of : class : ` SMESH . FunctorType ` corresponds
to numerical functors .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True in case of success , False otherwise .
"""
2008-03-07 12:47:05 +05:00
if IDsOfElements == [ ] :
IDsOfElements = self . GetElementsId ( )
2012-12-13 17:41:29 +06:00
if theCriterion is None :
theCriterion = FT_MaxElementLength2D
Functor = self . smeshpyD . GetFunctor ( theCriterion )
return self . editor . QuadToTri ( IDsOfElements , Functor )
2008-03-07 12:47:05 +05:00
2012-12-13 17:41:29 +06:00
def QuadToTriObject ( self , theObject , theCriterion = None ) :
2017-12-08 19:09:48 +05:00
"""
Split quadrangles into triangles .
2018-05-25 22:04:48 +05:00
Parameters :
theObject : the object from which the list of elements is taken ,
this is : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
theCriterion : is a numerical functor , in terms of enum : class : ` SMESH . FunctorType ` , used to
choose a diagonal for splitting . If * theCriterion * is None , which is a default
value , then quadrangles will be split by the smallest diagonal .
Note that not all items of : class : ` SMESH . FunctorType ` corresponds
to numerical functors .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True in case of success , False otherwise .
"""
2008-03-07 12:47:05 +05:00
if ( isinstance ( theObject , Mesh ) ) :
theObject = theObject . GetMesh ( )
2012-12-13 17:41:29 +06:00
if theCriterion is None :
theCriterion = FT_MaxElementLength2D
Functor = self . smeshpyD . GetFunctor ( theCriterion )
return self . editor . QuadToTriObject ( theObject , Functor )
2008-03-07 12:47:05 +05:00
2013-05-22 21:35:28 +06:00
def QuadTo4Tri ( self , theElements = [ ] ) :
2017-12-08 19:09:48 +05:00
"""
Split each of given quadrangles into 4 triangles . A node is added at the center of
2018-05-25 22:04:48 +05:00
a quadrangle .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theElements : the faces to be splitted . This can be either
: class : ` mesh , sub - mesh , group , filter < SMESH . SMESH_IDSource > `
or a list of face IDs . By default all quadrangles are split
"""
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2013-05-22 21:35:28 +06:00
if isinstance ( theElements , Mesh ) :
theElements = theElements . mesh
elif not theElements :
theElements = self . mesh
elif isinstance ( theElements , list ) :
theElements = self . GetIDSource ( theElements , SMESH . FACE )
2013-08-07 20:06:39 +06:00
unRegister . set ( theElements )
2013-05-22 21:35:28 +06:00
return self . editor . QuadTo4Tri ( theElements )
2008-03-07 12:47:05 +05:00
def SplitQuad ( self , IDsOfElements , Diag13 ) :
2017-12-08 19:09:48 +05:00
"""
Split quadrangles into triangles .
2018-05-25 22:04:48 +05:00
Parameters :
IDsOfElements : the faces to be splitted
Diag13 : is used to choose a diagonal for splitting .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True in case of success , False otherwise .
"""
2008-03-07 12:47:05 +05:00
if IDsOfElements == [ ] :
IDsOfElements = self . GetElementsId ( )
return self . editor . SplitQuad ( IDsOfElements , Diag13 )
def SplitQuadObject ( self , theObject , Diag13 ) :
2017-12-08 19:09:48 +05:00
"""
Split quadrangles into triangles .
2018-05-25 22:04:48 +05:00
Parameters :
theObject : the object from which the list of elements is taken ,
this is : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
Diag13 : is used to choose a diagonal for splitting .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True in case of success , False otherwise .
"""
2008-03-07 12:47:05 +05:00
if ( isinstance ( theObject , Mesh ) ) :
theObject = theObject . GetMesh ( )
return self . editor . SplitQuadObject ( theObject , Diag13 )
def BestSplit ( self , IDOfQuad , theCriterion ) :
2017-12-08 19:09:48 +05:00
"""
Find a better splitting of the given quadrangle .
2018-05-25 22:04:48 +05:00
Parameters :
IDOfQuad : the ID of the quadrangle to be splitted .
theCriterion : is a numerical functor , in terms of enum : class : ` SMESH . FunctorType ` , used to
choose a diagonal for splitting .
Note that not all items of : class : ` SMESH . FunctorType ` corresponds
to numerical functors .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
* 1 if 1 - 3 diagonal is better ,
* 2 if 2 - 4 diagonal is better ,
* 0 if error occurs .
"""
2008-03-07 12:47:05 +05:00
return self . editor . BestSplit ( IDOfQuad , self . smeshpyD . GetFunctor ( theCriterion ) )
2014-01-20 16:31:23 +06:00
def SplitVolumesIntoTetra ( self , elems , method = smeshBuilder . Hex_5Tet ) :
2017-12-08 19:09:48 +05:00
"""
Split volumic elements into tetrahedrons
2018-05-25 22:04:48 +05:00
Parameters :
elems : either a list of elements or a : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
method : flags passing splitting method :
smesh . Hex_5Tet , smesh . Hex_6Tet , smesh . Hex_24Tet .
smesh . Hex_5Tet - to split the hexahedron into 5 tetrahedrons , etc .
"""
2014-01-20 16:31:23 +06:00
unRegister = genObjUnRegister ( )
if isinstance ( elems , Mesh ) :
elems = elems . GetMesh ( )
if ( isinstance ( elems , list ) ) :
elems = self . editor . MakeIDSource ( elems , SMESH . VOLUME )
unRegister . set ( elems )
self . editor . SplitVolumesIntoTetra ( elems , method )
2015-07-09 14:41:53 +05:00
return
def SplitBiQuadraticIntoLinear ( self , elems = None ) :
2017-12-08 19:09:48 +05:00
"""
Split bi - quadratic elements into linear ones without creation of additional nodes :
- bi - quadratic triangle will be split into 3 linear quadrangles ;
- bi - quadratic quadrangle will be split into 4 linear quadrangles ;
- tri - quadratic hexahedron will be split into 8 linear hexahedra .
Quadratic elements of lower dimension adjacent to the split bi - quadratic element
will be split in order to keep the mesh conformal .
Parameters :
2018-05-25 22:04:48 +05:00
elems : elements to split \: : class : ` mesh , sub - mesh , group , filter < SMESH . SMESH_IDSource > ` or element IDs ;
2017-12-08 19:09:48 +05:00
if None ( default ) , all bi - quadratic elements will be split
"""
2015-07-09 14:41:53 +05:00
unRegister = genObjUnRegister ( )
if elems and isinstance ( elems , list ) and isinstance ( elems [ 0 ] , int ) :
elems = self . editor . MakeIDSource ( elems , SMESH . ALL )
unRegister . set ( elems )
if elems is None :
elems = [ self . GetMesh ( ) ]
if isinstance ( elems , Mesh ) :
elems = [ elems . GetMesh ( ) ]
if not isinstance ( elems , list ) :
elems = [ elems ]
self . editor . SplitBiQuadraticIntoLinear ( elems )
2014-01-20 16:31:23 +06:00
def SplitHexahedraIntoPrisms ( self , elems , startHexPoint , facetNormal ,
method = smeshBuilder . Hex_2Prisms , allDomains = False ) :
2017-12-08 19:09:48 +05:00
"""
Split hexahedra into prisms
2018-05-25 22:04:48 +05:00
Parameters :
elems : either a list of elements or a : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
startHexPoint : a point used to find a hexahedron for which * facetNormal *
gives a normal vector defining facets to split into triangles .
* startHexPoint * can be either a triple of coordinates or a vertex .
facetNormal : a normal to a facet to split into triangles of a
hexahedron found by * startHexPoint * .
* facetNormal * can be either a triple of coordinates or an edge .
method : flags passing splitting method : smesh . Hex_2Prisms , smesh . Hex_4Prisms .
smesh . Hex_2Prisms - to split the hexahedron into 2 prisms , etc .
allDomains : if : code : ` False ` , only hexahedra adjacent to one closest
to * startHexPoint * are split , else * startHexPoint *
is used to find the facet to split in all domains present in * elems * .
"""
2014-01-20 16:31:23 +06:00
# IDSource
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2014-01-20 16:31:23 +06:00
if isinstance ( elems , Mesh ) :
elems = elems . GetMesh ( )
if ( isinstance ( elems , list ) ) :
elems = self . editor . MakeIDSource ( elems , SMESH . VOLUME )
unRegister . set ( elems )
pass
# axis
if isinstance ( startHexPoint , geomBuilder . GEOM . _objref_GEOM_Object ) :
2014-01-21 22:37:16 +06:00
startHexPoint = self . smeshpyD . GetPointStruct ( startHexPoint )
elif isinstance ( startHexPoint , list ) :
startHexPoint = SMESH . PointStruct ( startHexPoint [ 0 ] ,
startHexPoint [ 1 ] ,
startHexPoint [ 2 ] )
2014-01-20 16:31:23 +06:00
if isinstance ( facetNormal , geomBuilder . GEOM . _objref_GEOM_Object ) :
2014-01-21 22:37:16 +06:00
facetNormal = self . smeshpyD . GetDirStruct ( facetNormal )
elif isinstance ( facetNormal , list ) :
facetNormal = self . smeshpyD . MakeDirStruct ( facetNormal [ 0 ] ,
facetNormal [ 1 ] ,
facetNormal [ 2 ] )
self . mesh . SetParameters ( startHexPoint . parameters + facetNormal . PS . parameters )
self . editor . SplitHexahedraIntoPrisms ( elems , startHexPoint , facetNormal , method , allDomains )
2012-08-09 16:03:55 +06:00
2008-03-07 12:47:05 +05:00
def SplitQuadsNearTriangularFacets ( self ) :
2017-12-08 19:09:48 +05:00
"""
Split quadrangle faces near triangular facets of volumes
2018-05-25 22:04:48 +05:00
"""
2008-03-07 12:47:05 +05:00
faces_array = self . GetElementsByType ( SMESH . FACE )
for face_id in faces_array :
if self . GetElemNbNodes ( face_id ) == 4 : # quadrangle
quad_nodes = self . mesh . GetElemNodes ( face_id )
node1_elems = self . GetNodeInverseElements ( quad_nodes [ 1 - 1 ] )
isVolumeFound = False
for node1_elem in node1_elems :
if not isVolumeFound :
if self . GetElementType ( node1_elem , True ) == SMESH . VOLUME :
nb_nodes = self . GetElemNbNodes ( node1_elem )
if 3 < nb_nodes and nb_nodes < 7 : # tetra or penta, or prism
volume_elem = node1_elem
volume_nodes = self . mesh . GetElemNodes ( volume_elem )
if volume_nodes . count ( quad_nodes [ 2 - 1 ] ) > 0 : # 1,2
if volume_nodes . count ( quad_nodes [ 4 - 1 ] ) > 0 : # 1,2,4
isVolumeFound = True
if volume_nodes . count ( quad_nodes [ 3 - 1 ] ) == 0 : # 1,2,4 & !3
self . SplitQuad ( [ face_id ] , False ) # diagonal 2-4
elif volume_nodes . count ( quad_nodes [ 3 - 1 ] ) > 0 : # 1,2,3 & !4
isVolumeFound = True
self . SplitQuad ( [ face_id ] , True ) # diagonal 1-3
elif volume_nodes . count ( quad_nodes [ 4 - 1 ] ) > 0 : # 1,4 & !2
if volume_nodes . count ( quad_nodes [ 3 - 1 ] ) > 0 : # 1,4,3 & !2
isVolumeFound = True
self . SplitQuad ( [ face_id ] , True ) # diagonal 1-3
def SplitHexaToTetras ( self , theObject , theNode000 , theNode001 ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Split hexahedrons into tetrahedrons .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
This operation uses : doc : ` pattern_mapping ` functionality for splitting .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theObject : the object from which the list of hexahedrons is taken ;
this is : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
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
will be mapped into * theNode000 * - th node of each volume , the ( 0 , 0 , 1 )
key - point will be mapped into * theNode001 * - th node of each volume .
The ( 0 , 0 , 0 ) key - point of the used pattern corresponds to a non - split corner .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True in case of success , False otherwise .
"""
2017-12-08 19:09:48 +05:00
# Pattern:
# 5.---------.6
# /|#* /|
# / | #* / |
# / | # * / |
# / | # /* |
# (0,0,1) 4.---------.7 * |
# |#* |1 | # *|
# | # *.----|---#.2
# | #/ * | /
# | /# * | /
# | / # * | /
# |/ #*|/
# (0,0,0) 0.---------.3
2008-03-07 12:47:05 +05:00
pattern_tetra = " !!! Nb of points: \n 8 \n \
! ! ! Points : \n \
0 0 0 ! - 0 \n \
0 1 0 ! - 1 \n \
1 1 0 ! - 2 \n \
1 0 0 ! - 3 \n \
0 0 1 ! - 4 \n \
0 1 1 ! - 5 \n \
1 1 1 ! - 6 \n \
1 0 1 ! - 7 \n \
! ! ! Indices of points of 6 tetras : \n \
0 3 4 1 \n \
7 4 3 1 \n \
4 7 5 1 \n \
6 2 5 7 \n \
1 5 2 7 \n \
2 3 1 7 \n "
pattern = self . smeshpyD . GetPattern ( )
isDone = pattern . LoadFromFile ( pattern_tetra )
if not isDone :
2017-03-20 17:27:30 +05:00
print ( ' Pattern.LoadFromFile : ' , pattern . GetErrorCode ( ) )
2008-03-07 12:47:05 +05:00
return isDone
pattern . ApplyToHexahedrons ( self . mesh , theObject . GetIDs ( ) , theNode000 , theNode001 )
isDone = pattern . MakeMesh ( self . mesh , False , False )
2017-03-20 17:27:30 +05:00
if not isDone : print ( ' Pattern.MakeMesh : ' , pattern . GetErrorCode ( ) )
2008-03-07 12:47:05 +05:00
# split quafrangle faces near triangular facets of volumes
self . SplitQuadsNearTriangularFacets ( )
return isDone
def SplitHexaToPrisms ( self , theObject , theNode000 , theNode001 ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Split hexahedrons into prisms .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Uses the : doc : ` pattern_mapping ` functionality for splitting .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theObject : the object ( : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > ` ) from where the list of hexahedrons is taken ;
theNode000 , theNode001 : ( within the range [ 0 , 7 ] ) gives the orientation of the
pattern relatively each hexahedron : keypoint ( 0 , 0 , 0 ) of the pattern
will be mapped into the * theNode000 * - th node of each volume , keypoint ( 0 , 0 , 1 )
will be mapped into the * theNode001 * - th node of each volume .
Edge ( 0 , 0 , 0 ) - ( 0 , 0 , 1 ) of used pattern connects two not split corners .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True in case of success , False otherwise .
"""
2017-12-08 19:09:48 +05:00
# Pattern: 5.---------.6
# /|# /|
# / | # / |
# / | # / |
# / | # / |
# (0,0,1) 4.---------.7 |
# | | | |
# | 1.----|----.2
# | / * | /
# | / * | /
# | / * | /
# |/ *|/
# (0,0,0) 0.---------.3
2008-03-07 12:47:05 +05:00
pattern_prism = " !!! Nb of points: \n 8 \n \
! ! ! Points : \n \
0 0 0 ! - 0 \n \
0 1 0 ! - 1 \n \
1 1 0 ! - 2 \n \
1 0 0 ! - 3 \n \
0 0 1 ! - 4 \n \
0 1 1 ! - 5 \n \
1 1 1 ! - 6 \n \
1 0 1 ! - 7 \n \
! ! ! Indices of points of 2 prisms : \n \
0 1 3 4 5 7 \n \
2 3 1 6 7 5 \n "
pattern = self . smeshpyD . GetPattern ( )
isDone = pattern . LoadFromFile ( pattern_prism )
if not isDone :
2017-03-20 17:27:30 +05:00
print ( ' Pattern.LoadFromFile : ' , pattern . GetErrorCode ( ) )
2008-03-07 12:47:05 +05:00
return isDone
pattern . ApplyToHexahedrons ( self . mesh , theObject . GetIDs ( ) , theNode000 , theNode001 )
isDone = pattern . MakeMesh ( self . mesh , False , False )
2017-03-20 17:27:30 +05:00
if not isDone : print ( ' Pattern.MakeMesh : ' , pattern . GetErrorCode ( ) )
2008-03-07 12:47:05 +05:00
2016-12-16 21:17:51 +05:00
# Split quafrangle faces near triangular facets of volumes
2008-03-07 12:47:05 +05:00
self . SplitQuadsNearTriangularFacets ( )
return isDone
def Smooth ( self , IDsOfElements , IDsOfFixedNodes ,
MaxNbOfIterations , MaxAspectRatio , Method ) :
2017-12-08 19:09:48 +05:00
"""
Smooth elements
2018-05-25 22:04:48 +05:00
Parameters :
IDsOfElements : the list if ids of elements to smooth
IDsOfFixedNodes : the list of ids of fixed nodes .
Note that nodes built on edges and boundary nodes are always fixed .
MaxNbOfIterations : the maximum number of iterations
MaxAspectRatio : varies in range [ 1.0 , inf ]
Method : is either Laplacian ( smesh . LAPLACIAN_SMOOTH )
or Centroidal ( smesh . CENTROIDAL_SMOOTH )
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True in case of success , False otherwise .
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if IDsOfElements == [ ] :
IDsOfElements = self . GetElementsId ( )
2012-08-09 16:03:55 +06:00
MaxNbOfIterations , MaxAspectRatio , Parameters , hasVars = ParseParameters ( MaxNbOfIterations , MaxAspectRatio )
2009-02-17 10:27:49 +05:00
self . mesh . SetParameters ( Parameters )
2008-03-07 12:47:05 +05:00
return self . editor . Smooth ( IDsOfElements , IDsOfFixedNodes ,
MaxNbOfIterations , MaxAspectRatio , Method )
def SmoothObject ( self , theObject , IDsOfFixedNodes ,
2009-02-17 10:27:49 +05:00
MaxNbOfIterations , MaxAspectRatio , Method ) :
2017-12-08 19:09:48 +05:00
"""
Smooth elements which belong to the given object
2018-05-25 22:04:48 +05:00
Parameters :
theObject : the object to smooth
IDsOfFixedNodes : the list of ids of fixed nodes .
Note that nodes built on edges and boundary nodes are always fixed .
MaxNbOfIterations : the maximum number of iterations
MaxAspectRatio : varies in range [ 1.0 , inf ]
Method : is either Laplacian ( smesh . LAPLACIAN_SMOOTH )
or Centroidal ( smesh . CENTROIDAL_SMOOTH )
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True in case of success , False otherwise .
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if ( isinstance ( theObject , Mesh ) ) :
theObject = theObject . GetMesh ( )
return self . editor . SmoothObject ( theObject , IDsOfFixedNodes ,
2009-02-17 10:27:49 +05:00
MaxNbOfIterations , MaxAspectRatio , Method )
2008-03-07 12:47:05 +05:00
def SmoothParametric ( self , IDsOfElements , IDsOfFixedNodes ,
MaxNbOfIterations , MaxAspectRatio , Method ) :
2017-12-08 19:09:48 +05:00
"""
Parametrically smooth the given elements
2018-05-25 22:04:48 +05:00
Parameters :
IDsOfElements : the list if ids of elements to smooth
IDsOfFixedNodes : the list of ids of fixed nodes .
Note that nodes built on edges and boundary nodes are always fixed .
MaxNbOfIterations : the maximum number of iterations
MaxAspectRatio : varies in range [ 1.0 , inf ]
Method : is either Laplacian ( smesh . LAPLACIAN_SMOOTH )
or Centroidal ( smesh . CENTROIDAL_SMOOTH )
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True in case of success , False otherwise .
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if IDsOfElements == [ ] :
IDsOfElements = self . GetElementsId ( )
2012-08-09 16:03:55 +06:00
MaxNbOfIterations , MaxAspectRatio , Parameters , hasVars = ParseParameters ( MaxNbOfIterations , MaxAspectRatio )
2009-02-17 10:27:49 +05:00
self . mesh . SetParameters ( Parameters )
2008-03-07 12:47:05 +05:00
return self . editor . SmoothParametric ( IDsOfElements , IDsOfFixedNodes ,
MaxNbOfIterations , MaxAspectRatio , Method )
def SmoothParametricObject ( self , theObject , IDsOfFixedNodes ,
MaxNbOfIterations , MaxAspectRatio , Method ) :
2017-12-08 19:09:48 +05:00
"""
Parametrically smooth the elements which belong to the given object
2018-05-25 22:04:48 +05:00
Parameters :
theObject : the object to smooth
IDsOfFixedNodes : the list of ids of fixed nodes .
Note that nodes built on edges and boundary nodes are always fixed .
MaxNbOfIterations : the maximum number of iterations
MaxAspectRatio : varies in range [ 1.0 , inf ]
Method : is either Laplacian ( smesh . LAPLACIAN_SMOOTH )
or Centroidal ( smesh . CENTROIDAL_SMOOTH )
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True in case of success , False otherwise .
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if ( isinstance ( theObject , Mesh ) ) :
theObject = theObject . GetMesh ( )
return self . editor . SmoothParametricObject ( theObject , IDsOfFixedNodes ,
MaxNbOfIterations , MaxAspectRatio , Method )
2014-12-08 22:18:59 +05:00
def ConvertToQuadratic ( self , theForce3d = False , theSubMesh = None , theToBiQuad = False ) :
2017-12-08 19:09:48 +05:00
"""
Convert the mesh to quadratic or bi - quadratic , deletes old elements , replacing
2018-05-25 22:04:48 +05:00
them with quadratic with the same id .
Parameters :
theForce3d : method of new node creation :
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
* False - the medium node lies at the geometrical entity from which the mesh element is built
* True - the medium node lies at the middle of the line segments connecting two nodes of a mesh element
theSubMesh : a : class : ` sub - mesh , group or filter < SMESH . SMESH_IDSource > ` to convert
theToBiQuad : If True , converts the mesh to bi - quadratic
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
: class : ` SMESH . ComputeError ` which can hold a warning
Warning :
If * theSubMesh * is provided , the mesh can become non - conformal
"""
2017-12-08 19:09:48 +05:00
2013-05-22 21:35:28 +06:00
if isinstance ( theSubMesh , Mesh ) :
theSubMesh = theSubMesh . mesh
2013-03-06 19:57:01 +06:00
if theToBiQuad :
self . editor . ConvertToBiQuadratic ( theForce3d , theSubMesh )
2012-08-09 16:03:55 +06:00
else :
2013-03-06 19:57:01 +06:00
if theSubMesh :
self . editor . ConvertToQuadraticObject ( theForce3d , theSubMesh )
else :
self . editor . ConvertToQuadratic ( theForce3d )
2013-05-22 21:35:28 +06:00
error = self . editor . GetLastError ( )
if error and error . comment :
2017-03-20 17:27:30 +05:00
print ( error . comment )
2016-12-13 22:30:15 +05:00
return error
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
def ConvertFromQuadratic ( self , theSubMesh = None ) :
2017-12-08 19:09:48 +05:00
"""
Convert the mesh from quadratic to ordinary ,
deletes old quadratic elements ,
replacing them with ordinary mesh elements with the same id .
Parameters :
2018-05-25 22:04:48 +05:00
theSubMesh : a : class : ` sub - mesh , group or filter < SMESH . SMESH_IDSource > ` to convert
2017-12-08 19:09:48 +05:00
Warning :
2018-05-25 22:04:48 +05:00
If * theSubMesh * is provided , the mesh can become non - conformal
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if theSubMesh :
self . editor . ConvertFromQuadraticObject ( theSubMesh )
else :
return self . editor . ConvertFromQuadratic ( )
2015-08-28 22:03:25 +05:00
def Make2DMeshFrom3D ( self ) :
2017-12-08 19:09:48 +05:00
"""
Create 2 D mesh as skin on boundary faces of a 3 D mesh
Returns :
2018-05-25 22:04:48 +05:00
True if operation has been completed successfully , False otherwise
"""
2017-12-08 19:09:48 +05:00
2015-08-28 22:03:25 +05:00
return self . editor . Make2DMeshFrom3D ( )
2012-08-09 16:03:55 +06:00
def MakeBoundaryMesh ( self , elements , dimension = SMESH . BND_2DFROM3D , groupName = " " , meshName = " " ,
toCopyElements = False , toCopyExistingBondary = False ) :
2017-12-08 19:09:48 +05:00
"""
Create missing boundary elements
2018-05-25 22:04:48 +05:00
Parameters :
elements : elements whose boundary is to be checked :
: class : ` mesh , sub - mesh , group , filter < SMESH . SMESH_IDSource > ` or list of elements .
If * elements * is mesh , it must be the mesh whose MakeBoundaryMesh ( ) is called
dimension : defines type of boundary elements to create , either of
{ SMESH . BND_2DFROM3D , SMESH . BND_1DFROM3D , SMESH . BND_1DFROM2D } .
SMESH . BND_1DFROM3D create mesh edges on all borders of free facets of 3 D cells
groupName : a name of group to store created boundary elements in ,
" " means not to create the group
meshName : a name of new mesh to store created boundary elements in ,
" " means not to create the new mesh
toCopyElements : if True , the checked elements will be copied into
the new mesh else only boundary elements will be copied into the new mesh
toCopyExistingBondary : if True , not only new but also pre - existing
boundary elements will be copied into the new mesh
Returns :
tuple ( : class : ` Mesh ` , : class : ` group < SMESH . SMESH_Group > ` ) where boundary elements were added to
"""
2017-12-08 19:09:48 +05:00
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2012-08-09 16:03:55 +06:00
if isinstance ( elements , Mesh ) :
elements = elements . GetMesh ( )
if ( isinstance ( elements , list ) ) :
elemType = SMESH . ALL
if elements : elemType = self . GetElementType ( elements [ 0 ] , iselem = True )
elements = self . editor . MakeIDSource ( elements , elemType )
2013-08-07 20:06:39 +06:00
unRegister . set ( elements )
2012-08-09 16:03:55 +06:00
mesh , group = self . editor . MakeBoundaryMesh ( elements , dimension , groupName , meshName ,
toCopyElements , toCopyExistingBondary )
if mesh : mesh = self . smeshpyD . Mesh ( mesh )
return mesh , group
def MakeBoundaryElements ( self , dimension = SMESH . BND_2DFROM3D , groupName = " " , meshName = " " ,
toCopyAll = False , groups = [ ] ) :
2018-05-25 22:04:48 +05:00
"""
Create missing boundary elements around either the whole mesh or
groups of elements
Parameters :
dimension : defines type of boundary elements to create , either of
{ SMESH . BND_2DFROM3D , SMESH . BND_1DFROM3D , SMESH . BND_1DFROM2D }
groupName : a name of group to store all boundary elements in ,
" " means not to create the group
meshName : a name of a new mesh , which is a copy of the initial
mesh + created boundary elements ; " " means not to create the new mesh
toCopyAll : if True , the whole initial mesh will be copied into
the new mesh else only boundary elements will be copied into the new mesh
groups : list of : class : ` sub - meshes , groups or filters < SMESH . SMESH_IDSource > ` of elements to make boundary around
Returns :
tuple ( long , mesh , groups )
- long - number of added boundary elements
- mesh - the : class : ` Mesh ` where elements were added to
- group - the : class : ` group < SMESH . SMESH_Group > ` of boundary elements or None
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
nb , mesh , group = self . editor . MakeBoundaryElements ( dimension , groupName , meshName ,
toCopyAll , groups )
if mesh : mesh = self . smeshpyD . Mesh ( mesh )
return nb , mesh , group
2008-03-07 12:47:05 +05:00
def RenumberNodes ( self ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Renumber mesh nodes to remove unused node IDs
"""
2008-03-07 12:47:05 +05:00
self . editor . RenumberNodes ( )
def RenumberElements ( self ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Renumber mesh elements to remove unused element IDs
"""
2008-03-07 12:47:05 +05:00
self . editor . RenumberElements ( )
2015-03-17 17:06:56 +05:00
def _getIdSourceList ( self , arg , idType , unRegister ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Private method converting * arg * into a list of : class : ` SMESH . SMESH_IDSource `
"""
2015-03-17 17:06:56 +05:00
if arg and isinstance ( arg , list ) :
if isinstance ( arg [ 0 ] , int ) :
arg = self . GetIDSource ( arg , idType )
unRegister . set ( arg )
elif isinstance ( arg [ 0 ] , Mesh ) :
arg [ 0 ] = arg [ 0 ] . GetMesh ( )
elif isinstance ( arg , Mesh ) :
arg = arg . GetMesh ( )
if arg and isinstance ( arg , SMESH . _objref_SMESH_IDSource ) :
arg = [ arg ]
return arg
def RotationSweepObjects ( self , nodes , edges , faces , Axis , AngleInRadians , NbOfSteps , Tolerance ,
MakeGroups = False , TotalAngle = False ) :
2017-12-08 19:09:48 +05:00
"""
Generate new elements by rotation of the given elements and nodes around the axis
2018-05-25 22:04:48 +05:00
Parameters :
nodes : nodes to revolve : a list including ids , : class : ` a mesh , sub - meshes , groups or filters < SMESH . SMESH_IDSource > `
edges : edges to revolve : a list including ids , : class : ` a mesh , sub - meshes , groups or filters < SMESH . SMESH_IDSource > `
faces : faces to revolve : a list including ids , : class : ` a mesh , sub - meshes , groups or filters < SMESH . SMESH_IDSource > `
Axis : the axis of rotation : : class : ` SMESH . AxisStruct ` , line ( geom object ) or [ x , y , z , dx , dy , dz ]
AngleInRadians : the angle of Rotation ( in radians ) or a name of variable
which defines angle in degrees
NbOfSteps : the number of steps
Tolerance : tolerance
MakeGroups : forces the generation of new groups from existing ones
TotalAngle : gives meaning of AngleInRadians : if True then it is an angular size
of all steps , else - size of each step
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
the list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True , empty list otherwise
"""
2017-12-08 19:09:48 +05:00
2015-03-17 17:06:56 +05:00
unRegister = genObjUnRegister ( )
nodes = self . _getIdSourceList ( nodes , SMESH . NODE , unRegister )
edges = self . _getIdSourceList ( edges , SMESH . EDGE , unRegister )
faces = self . _getIdSourceList ( faces , SMESH . FACE , unRegister )
if isinstance ( Axis , geomBuilder . GEOM . _objref_GEOM_Object ) :
2015-03-18 21:07:40 +05:00
Axis = self . smeshpyD . GetAxisStruct ( Axis )
2015-03-17 17:06:56 +05:00
if isinstance ( Axis , list ) :
Axis = SMESH . AxisStruct ( * Axis )
AngleInRadians , AngleParameters , hasVars = ParseAngles ( AngleInRadians )
NbOfSteps , Tolerance , Parameters , hasVars = ParseParameters ( NbOfSteps , Tolerance )
Parameters = Axis . parameters + var_separator + AngleParameters + var_separator + Parameters
self . mesh . SetParameters ( Parameters )
if TotalAngle and NbOfSteps :
AngleInRadians / = NbOfSteps
return self . editor . RotationSweepObjects ( nodes , edges , faces ,
Axis , AngleInRadians ,
NbOfSteps , Tolerance , MakeGroups )
2009-02-17 10:27:49 +05:00
def RotationSweep ( self , IDsOfElements , Axis , AngleInRadians , NbOfSteps , Tolerance ,
MakeGroups = False , TotalAngle = False ) :
2017-12-08 19:09:48 +05:00
"""
Generate new elements by rotation of the elements around the axis
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
IDsOfElements : the list of ids of elements to sweep
2018-05-25 22:04:48 +05:00
Axis : the axis of rotation , : class : ` SMESH . AxisStruct ` or line ( geom object )
2017-12-08 19:09:48 +05:00
AngleInRadians : the angle of Rotation ( in radians ) or a name of variable which defines angle in degrees
NbOfSteps : the number of steps
Tolerance : tolerance
MakeGroups : forces the generation of new groups from existing ones
TotalAngle : gives meaning of AngleInRadians : if True then it is an angular size
2018-05-25 22:04:48 +05:00
of all steps , else - size of each step
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
the list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True , empty list otherwise
"""
2017-12-08 19:09:48 +05:00
2015-03-18 21:07:40 +05:00
return self . RotationSweepObjects ( [ ] , IDsOfElements , IDsOfElements , Axis ,
AngleInRadians , NbOfSteps , Tolerance ,
MakeGroups , TotalAngle )
2008-03-07 12:47:05 +05:00
2009-02-17 10:27:49 +05:00
def RotationSweepObject ( self , theObject , Axis , AngleInRadians , NbOfSteps , Tolerance ,
MakeGroups = False , TotalAngle = False ) :
2017-12-08 19:09:48 +05:00
"""
Generate new elements by rotation of the elements of object around the axis
2018-05-25 22:04:48 +05:00
theObject object which elements should be sweeped .
It can be a mesh , a sub mesh or a group .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
Axis : the axis of rotation , : class : ` SMESH . AxisStruct ` or line ( geom object )
2017-12-08 19:09:48 +05:00
AngleInRadians : the angle of Rotation
NbOfSteps : number of steps
Tolerance : tolerance
MakeGroups : forces the generation of new groups from existing ones
TotalAngle : gives meaning of AngleInRadians : if True then it is an angular size
2018-05-25 22:04:48 +05:00
of all steps , else - size of each step
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
the list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True , empty list otherwise
"""
2017-12-08 19:09:48 +05:00
2015-03-18 21:07:40 +05:00
return self . RotationSweepObjects ( [ ] , theObject , theObject , Axis ,
AngleInRadians , NbOfSteps , Tolerance ,
MakeGroups , TotalAngle )
2009-02-17 10:27:49 +05:00
def RotationSweepObject1D ( self , theObject , Axis , AngleInRadians , NbOfSteps , Tolerance ,
MakeGroups = False , TotalAngle = False ) :
2017-12-08 19:09:48 +05:00
"""
Generate new elements by rotation of the elements of object around the axis
2018-05-25 22:04:48 +05:00
theObject object which elements should be sweeped .
It can be a mesh , a sub mesh or a group .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
Axis : the axis of rotation , : class : ` SMESH . AxisStruct ` or line ( geom object )
2017-12-08 19:09:48 +05:00
AngleInRadians : the angle of Rotation
NbOfSteps : number of steps
Tolerance : tolerance
MakeGroups : forces the generation of new groups from existing ones
TotalAngle : gives meaning of AngleInRadians : if True then it is an angular size
2018-05-25 22:04:48 +05:00
of all steps , else - size of each step
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
the list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True ,
empty list otherwise
"""
2017-12-08 19:09:48 +05:00
2015-03-18 21:07:40 +05:00
return self . RotationSweepObjects ( [ ] , theObject , [ ] , Axis ,
AngleInRadians , NbOfSteps , Tolerance ,
MakeGroups , TotalAngle )
2009-02-17 10:27:49 +05:00
def RotationSweepObject2D ( self , theObject , Axis , AngleInRadians , NbOfSteps , Tolerance ,
MakeGroups = False , TotalAngle = False ) :
2017-12-08 19:09:48 +05:00
"""
Generate new elements by rotation of the elements of object around the axis
2018-05-25 22:04:48 +05:00
theObject object which elements should be sweeped .
It can be a mesh , a sub mesh or a group .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
Axis : the axis of rotation , : class : ` SMESH . AxisStruct ` or line ( geom object )
2017-12-08 19:09:48 +05:00
AngleInRadians : the angle of Rotation
NbOfSteps : number of steps
Tolerance : tolerance
MakeGroups : forces the generation of new groups from existing ones
TotalAngle : gives meaning of AngleInRadians : if True then it is an angular size
2018-05-25 22:04:48 +05:00
of all steps , else - size of each step
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
the list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True , empty list otherwise
"""
2017-12-08 19:09:48 +05:00
2015-03-18 21:07:40 +05:00
return self . RotationSweepObjects ( [ ] , [ ] , theObject , Axis , AngleInRadians ,
NbOfSteps , Tolerance , MakeGroups , TotalAngle )
2008-03-07 12:47:05 +05:00
2016-08-01 17:42:08 +05:00
def ExtrusionSweepObjects ( self , nodes , edges , faces , StepVector , NbOfSteps , MakeGroups = False ,
scaleFactors = [ ] , linearVariation = False , basePoint = [ ] ) :
2017-12-08 19:09:48 +05:00
"""
Generate new elements by extrusion of the given elements and nodes
2018-05-25 22:04:48 +05:00
Parameters :
nodes : nodes to extrude : a list including ids , : class : ` a mesh , sub - meshes , groups or filters < SMESH . SMESH_IDSource > `
edges : edges to extrude : a list including ids , : class : ` a mesh , sub - meshes , groups or filters < SMESH . SMESH_IDSource > `
faces : faces to extrude : a list including ids , : class : ` a mesh , sub - meshes , groups or filters < SMESH . SMESH_IDSource > `
StepVector : vector or : class : ` SMESH . DirStruct ` or 3 vector components , defining
the direction and value of extrusion for one step ( the total extrusion
length will be NbOfSteps * | | StepVector | | )
2017-12-08 19:09:48 +05:00
NbOfSteps : the number of steps
MakeGroups : forces the generation of new groups from existing ones
scaleFactors : optional scale factors to apply during extrusion
linearVariation : if * True * , scaleFactors are spread over all * scaleFactors * ,
2018-05-25 22:04:48 +05:00
else scaleFactors [ i ] is applied to nodes at the i - th extrusion step
2017-12-08 19:09:48 +05:00
basePoint : optional scaling center ; if not provided , a gravity center of
2018-05-25 22:04:48 +05:00
nodes and elements being extruded is used as the scaling center .
It can be either
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
- a list of tree components of the point or
- a node ID or
- a GEOM point
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
the list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True , empty list otherwise
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Example : : ref : ` tui_extrusion `
"""
2015-03-17 17:06:56 +05:00
unRegister = genObjUnRegister ( )
nodes = self . _getIdSourceList ( nodes , SMESH . NODE , unRegister )
edges = self . _getIdSourceList ( edges , SMESH . EDGE , unRegister )
faces = self . _getIdSourceList ( faces , SMESH . FACE , unRegister )
2013-04-04 13:08:19 +06:00
if isinstance ( StepVector , geomBuilder . GEOM . _objref_GEOM_Object ) :
2008-03-07 12:47:05 +05:00
StepVector = self . smeshpyD . GetDirStruct ( StepVector )
2013-02-12 20:37:44 +06:00
if isinstance ( StepVector , list ) :
StepVector = self . smeshpyD . MakeDirStruct ( * StepVector )
2015-03-17 17:06:56 +05:00
2016-08-01 17:42:08 +05:00
if isinstance ( basePoint , int ) :
xyz = self . GetNodeXYZ ( basePoint )
if not xyz :
2017-03-20 17:27:30 +05:00
raise RuntimeError ( " Invalid node ID: %s " % basePoint )
2016-08-01 17:42:08 +05:00
basePoint = xyz
if isinstance ( basePoint , geomBuilder . GEOM . _objref_GEOM_Object ) :
basePoint = self . geompyD . PointCoordinates ( basePoint )
2012-08-09 16:03:55 +06:00
NbOfSteps , Parameters , hasVars = ParseParameters ( NbOfSteps )
Parameters = StepVector . PS . parameters + var_separator + Parameters
2009-02-17 10:27:49 +05:00
self . mesh . SetParameters ( Parameters )
2015-03-17 17:06:56 +05:00
2015-03-18 21:07:40 +05:00
return self . editor . ExtrusionSweepObjects ( nodes , edges , faces ,
2016-08-01 17:42:08 +05:00
StepVector , NbOfSteps ,
scaleFactors , linearVariation , basePoint ,
MakeGroups )
2015-03-17 17:06:56 +05:00
2008-03-07 12:47:05 +05:00
2015-03-17 17:06:56 +05:00
def ExtrusionSweep ( self , IDsOfElements , StepVector , NbOfSteps , MakeGroups = False , IsNodes = False ) :
2017-12-08 19:09:48 +05:00
"""
Generate new elements by extrusion of the elements with given ids
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
IDsOfElements : the list of ids of elements or nodes for extrusion
2018-05-25 22:04:48 +05:00
StepVector : vector or : class : ` SMESH . DirStruct ` or 3 vector components , defining
the direction and value of extrusion for one step ( the total extrusion
length will be NbOfSteps * | | StepVector | | )
2017-12-08 19:09:48 +05:00
NbOfSteps : the number of steps
MakeGroups : forces the generation of new groups from existing ones
IsNodes : is True if elements with given ids are nodes
Returns :
2018-05-25 22:04:48 +05:00
the list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True , empty list otherwise
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Example : : ref : ` tui_extrusion `
"""
2015-03-17 17:06:56 +05:00
n , e , f = [ ] , [ ] , [ ]
2015-03-18 21:07:40 +05:00
if IsNodes : n = IDsOfElements
else : e , f , = IDsOfElements , IDsOfElements
return self . ExtrusionSweepObjects ( n , e , f , StepVector , NbOfSteps , MakeGroups )
2008-03-07 12:47:05 +05:00
2015-01-23 20:49:49 +05:00
def ExtrusionByNormal ( self , Elements , StepSize , NbOfSteps ,
ByAverageNormal = False , UseInputElemsOnly = True , MakeGroups = False , Dim = 2 ) :
2017-12-08 19:09:48 +05:00
"""
Generate new elements by extrusion along the normal to a discretized surface or wire
2018-05-25 22:04:48 +05:00
Parameters :
Elements : elements to extrude - a list including ids , : class : ` a mesh , sub - meshes , groups or filters < SMESH . SMESH_IDSource > ` .
Only faces can be extruded so far . A sub - mesh should be a sub - mesh on geom faces .
2017-12-08 19:09:48 +05:00
StepSize : length of one extrusion step ( the total extrusion
2018-05-25 22:04:48 +05:00
length will be * NbOfSteps * * StepSize * ) .
2017-12-08 19:09:48 +05:00
NbOfSteps : number of extrusion steps .
ByAverageNormal : if True each node is translated by * StepSize *
2018-05-25 22:04:48 +05:00
along the average of the normal vectors to the faces sharing the node ;
else each node is translated along the same average normal till
intersection with the plane got by translation of the face sharing
the node along its own normal by * StepSize * .
2017-12-08 19:09:48 +05:00
UseInputElemsOnly : to use only * Elements * when computing extrusion direction
2018-05-25 22:04:48 +05:00
for every node of * Elements * .
2017-12-08 19:09:48 +05:00
MakeGroups : forces generation of new groups from existing ones .
Dim : dimension of elements to extrude : 2 - faces or 1 - edges . Extrusion of edges
2018-05-25 22:04:48 +05:00
is not yet implemented . This parameter is used if * Elements * contains
both faces and edges , i . e . * Elements * is a Mesh .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
the list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True ,
empty list otherwise .
Example : : ref : ` tui_extrusion `
"""
2017-12-08 19:09:48 +05:00
2015-01-23 20:49:49 +05:00
unRegister = genObjUnRegister ( )
if isinstance ( Elements , Mesh ) :
2015-03-17 17:06:56 +05:00
Elements = [ Elements . GetMesh ( ) ]
2015-01-23 20:49:49 +05:00
if isinstance ( Elements , list ) :
if not Elements :
2017-03-20 17:27:30 +05:00
raise RuntimeError ( " Elements empty! " )
2015-03-17 17:06:56 +05:00
if isinstance ( Elements [ 0 ] , int ) :
Elements = self . GetIDSource ( Elements , SMESH . ALL )
unRegister . set ( Elements )
2015-03-18 21:07:40 +05:00
if not isinstance ( Elements , list ) :
2015-03-17 17:06:56 +05:00
Elements = [ Elements ]
2015-01-23 20:49:49 +05:00
StepSize , NbOfSteps , Parameters , hasVars = ParseParameters ( StepSize , NbOfSteps )
self . mesh . SetParameters ( Parameters )
return self . editor . ExtrusionByNormal ( Elements , StepSize , NbOfSteps ,
2015-03-18 21:07:40 +05:00
ByAverageNormal , UseInputElemsOnly , MakeGroups , Dim )
2015-01-23 20:49:49 +05:00
2012-08-09 16:03:55 +06:00
def ExtrusionSweepObject ( self , theObject , StepVector , NbOfSteps , MakeGroups = False , IsNodes = False ) :
2017-12-08 19:09:48 +05:00
"""
Generate new elements by extrusion of the elements or nodes which belong to the object
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
theObject : the object whose elements or nodes should be processed .
2018-05-25 22:04:48 +05:00
It can be a : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > ` .
StepVector : vector or : class : ` SMESH . DirStruct ` or 3 vector components , defining
the direction and value of extrusion for one step ( the total extrusion
length will be NbOfSteps * | | StepVector | | )
2017-12-08 19:09:48 +05:00
NbOfSteps : the number of steps
MakeGroups : forces the generation of new groups from existing ones
IsNodes : is True if elements to extrude are nodes
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True , empty list otherwise
Example : : ref : ` tui_extrusion `
"""
2017-12-08 19:09:48 +05:00
2015-03-17 17:06:56 +05:00
n , e , f = [ ] , [ ] , [ ]
2015-03-18 21:07:40 +05:00
if IsNodes : n = theObject
else : e , f , = theObject , theObject
return self . ExtrusionSweepObjects ( n , e , f , StepVector , NbOfSteps , MakeGroups )
2008-03-07 12:47:05 +05:00
def ExtrusionSweepObject1D ( self , theObject , StepVector , NbOfSteps , MakeGroups = False ) :
2017-12-08 19:09:48 +05:00
"""
Generate new elements by extrusion of edges which belong to the object
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
theObject : object whose 1 D elements should be processed .
2018-05-25 22:04:48 +05:00
It can be a : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > ` .
StepVector : vector or : class : ` SMESH . DirStruct ` or 3 vector components , defining
the direction and value of extrusion for one step ( the total extrusion
length will be NbOfSteps * | | StepVector | | )
2017-12-08 19:09:48 +05:00
NbOfSteps : the number of steps
MakeGroups : to generate new groups from existing ones
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True , empty list otherwise
Example : : ref : ` tui_extrusion `
"""
2017-12-08 19:09:48 +05:00
2015-03-18 21:07:40 +05:00
return self . ExtrusionSweepObjects ( [ ] , theObject , [ ] , StepVector , NbOfSteps , MakeGroups )
2008-03-07 12:47:05 +05:00
def ExtrusionSweepObject2D ( self , theObject , StepVector , NbOfSteps , MakeGroups = False ) :
2017-12-08 19:09:48 +05:00
"""
Generate new elements by extrusion of faces which belong to the object
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
theObject : object whose 2 D elements should be processed .
2018-05-25 22:04:48 +05:00
It can be a : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > ` .
StepVector : vector or : class : ` SMESH . DirStruct ` or 3 vector components , defining
the direction and value of extrusion for one step ( the total extrusion
length will be NbOfSteps * | | StepVector | | )
2017-12-08 19:09:48 +05:00
NbOfSteps : the number of steps
MakeGroups : forces the generation of new groups from existing ones
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True , empty list otherwise
Example : : ref : ` tui_extrusion `
"""
2017-12-08 19:09:48 +05:00
2015-03-18 21:07:40 +05:00
return self . ExtrusionSweepObjects ( [ ] , [ ] , theObject , StepVector , NbOfSteps , MakeGroups )
2008-03-07 12:47:05 +05:00
2015-03-17 17:06:56 +05:00
def AdvancedExtrusion ( self , IDsOfElements , StepVector , NbOfSteps ,
ExtrFlags , SewTolerance , MakeGroups = False ) :
2017-12-08 19:09:48 +05:00
"""
Generate new elements by extrusion of the elements with given ids
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
IDsOfElements : is ids of elements
2018-05-25 22:04:48 +05:00
StepVector : vector or : class : ` SMESH . DirStruct ` or 3 vector components , defining
the direction and value of extrusion for one step ( the total extrusion
length will be NbOfSteps * | | StepVector | | )
2017-12-08 19:09:48 +05:00
NbOfSteps : the number of steps
ExtrFlags : sets flags for extrusion
SewTolerance : uses for comparing locations of nodes if flag
2018-05-25 22:04:48 +05:00
EXTRUSION_FLAG_SEW is set
2017-12-08 19:09:48 +05:00
MakeGroups : forces the generation of new groups from existing ones
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True , empty list otherwise
"""
2017-12-08 19:09:48 +05:00
2015-03-17 17:06:56 +05:00
if isinstance ( StepVector , geomBuilder . GEOM . _objref_GEOM_Object ) :
StepVector = self . smeshpyD . GetDirStruct ( StepVector )
if isinstance ( StepVector , list ) :
StepVector = self . smeshpyD . MakeDirStruct ( * StepVector )
return self . editor . AdvancedExtrusion ( IDsOfElements , StepVector , NbOfSteps ,
ExtrFlags , SewTolerance , MakeGroups )
def ExtrusionAlongPathObjects ( self , Nodes , Edges , Faces , PathMesh , PathShape = None ,
2015-03-17 22:40:17 +05:00
NodeStart = 1 , HasAngles = False , Angles = [ ] , LinearVariation = False ,
HasRefPoint = False , RefPoint = [ 0 , 0 , 0 ] , MakeGroups = False ) :
2017-12-08 19:09:48 +05:00
"""
Generate new elements by extrusion of the given elements and nodes along the path .
The path of extrusion must be a meshed edge .
Parameters :
2018-05-25 22:04:48 +05:00
Nodes : nodes to extrude : a list including ids , : class : ` a mesh , sub - meshes , groups or filters < SMESH . SMESH_IDSource > `
Edges : edges to extrude : a list including ids , : class : ` a mesh , sub - meshes , groups or filters < SMESH . SMESH_IDSource > `
Faces : faces to extrude : a list including ids , : class : ` a mesh , sub - meshes , groups or filters < SMESH . SMESH_IDSource > `
2017-12-08 19:09:48 +05:00
PathMesh : 1 D mesh or 1 D sub - mesh , along which proceeds the extrusion
PathShape : shape ( edge ) defines the sub - mesh of PathMesh if PathMesh
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
HasAngles : allows the shape to be rotated around the path
to get the resulting mesh in a helical fashion
Angles : list of angles
LinearVariation : forces the computation of rotation angles as linear
variation of the given Angles along path steps
HasRefPoint : allows using the reference point
2018-05-25 22:04:48 +05:00
RefPoint : the reference point around which the shape is rotated ( the mass center of the
shape 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 `
2017-12-08 19:09:48 +05:00
MakeGroups : forces the generation of new groups from existing ones
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` and
: class : ` error code < SMESH . SMESH_MeshEditor . Extrusion_Error > `
Example : : ref : ` tui_extrusion_along_path `
2017-12-08 19:09:48 +05:00
"""
2015-03-17 17:06:56 +05:00
unRegister = genObjUnRegister ( )
Nodes = self . _getIdSourceList ( Nodes , SMESH . NODE , unRegister )
Edges = self . _getIdSourceList ( Edges , SMESH . EDGE , unRegister )
Faces = self . _getIdSourceList ( Faces , SMESH . FACE , unRegister )
2012-08-09 16:03:55 +06:00
2015-03-17 17:06:56 +05:00
if isinstance ( RefPoint , geomBuilder . GEOM . _objref_GEOM_Object ) :
RefPoint = self . smeshpyD . GetPointStruct ( RefPoint )
if isinstance ( RefPoint , list ) :
2015-10-09 19:47:17 +05:00
if not RefPoint : RefPoint = [ 0 , 0 , 0 ]
2015-03-17 17:06:56 +05:00
RefPoint = SMESH . PointStruct ( * RefPoint )
if isinstance ( PathMesh , Mesh ) :
PathMesh = PathMesh . GetMesh ( )
Angles , AnglesParameters , hasVars = ParseAngles ( Angles )
Parameters = AnglesParameters + var_separator + RefPoint . parameters
self . mesh . SetParameters ( Parameters )
return self . editor . ExtrusionAlongPathObjects ( Nodes , Edges , Faces ,
PathMesh , PathShape , NodeStart ,
HasAngles , Angles , LinearVariation ,
HasRefPoint , RefPoint , MakeGroups )
2012-08-09 16:03:55 +06:00
def ExtrusionAlongPathX ( self , Base , Path , NodeStart ,
2015-10-09 19:47:17 +05:00
HasAngles = False , Angles = [ ] , LinearVariation = False ,
HasRefPoint = False , RefPoint = [ 0 , 0 , 0 ] , MakeGroups = False ,
ElemType = SMESH . FACE ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Generate new elements by extrusion of the given elements .
The path of extrusion must be a meshed edge .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
Base : : class : ` mesh , sub - mesh , group , filter < SMESH . SMESH_IDSource > ` , or list of ids of elements for extrusion
2017-12-08 19:09:48 +05:00
Path : 1 D mesh or 1 D sub - mesh , along which proceeds the extrusion
NodeStart : the start node from Path . Defines the direction of extrusion
HasAngles : allows the shape to be rotated around the path
2018-05-25 22:04:48 +05:00
to get the resulting mesh in a helical fashion
2017-12-08 19:09:48 +05:00
Angles : list of angles in radians
LinearVariation : forces the computation of rotation angles as linear
2018-05-25 22:04:48 +05:00
variation of the given Angles along path steps
2017-12-08 19:09:48 +05:00
HasRefPoint : allows using the reference point
2018-05-25 22:04:48 +05:00
RefPoint : the reference point around which the elements are rotated ( the mass
center of the 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 `
2017-12-08 19:09:48 +05:00
MakeGroups : forces the generation of new groups from existing ones
ElemType : type of elements for extrusion ( if param Base is a mesh )
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` and
: class : ` error code < SMESH . SMESH_MeshEditor . Extrusion_Error > `
if * MakeGroups * == True , only : class : ` error code < SMESH . SMESH_MeshEditor . Extrusion_Error > `
otherwise
Example : : ref : ` tui_extrusion_along_path `
"""
2017-12-08 19:09:48 +05:00
2015-03-18 21:07:40 +05:00
n , e , f = [ ] , [ ] , [ ]
if ElemType == SMESH . NODE : n = Base
if ElemType == SMESH . EDGE : e = Base
if ElemType == SMESH . FACE : f = Base
gr , er = self . ExtrusionAlongPathObjects ( n , e , f , Path , None , NodeStart ,
HasAngles , Angles , LinearVariation ,
HasRefPoint , RefPoint , MakeGroups )
if MakeGroups : return gr , er
return er
2012-08-09 16:03:55 +06:00
2008-03-07 12:47:05 +05:00
def ExtrusionAlongPath ( self , IDsOfElements , PathMesh , PathShape , NodeStart ,
2015-10-09 19:47:17 +05:00
HasAngles = False , Angles = [ ] , HasRefPoint = False , RefPoint = [ ] ,
2008-03-07 12:47:05 +05:00
MakeGroups = False , LinearVariation = False ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Generate new elements by extrusion of the given elements .
The path of extrusion must be a meshed edge .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
IDsOfElements : ids of elements
PathMesh : mesh containing a 1 D sub - mesh on the edge , along which proceeds the extrusion
2018-05-25 22:04:48 +05:00
PathShape : shape ( edge ) defines the sub - mesh for the path
2017-12-08 19:09:48 +05:00
NodeStart : the first or the last node on the edge . Defines the direction of extrusion
HasAngles : allows the shape to be rotated around the path
2018-05-25 22:04:48 +05:00
to get the resulting mesh in a helical fashion
2017-12-08 19:09:48 +05:00
Angles : list of angles in radians
HasRefPoint : allows using the reference point
2018-05-25 22:04:48 +05:00
RefPoint : the reference point around which the shape is rotated ( the mass center of the shape 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 `
2017-12-08 19:09:48 +05:00
MakeGroups : forces the generation of new groups from existing ones
LinearVariation : forces the computation of rotation angles as linear
2018-05-25 22:04:48 +05:00
variation of the given Angles along path steps
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` and
: class : ` error code < SMESH . SMESH_MeshEditor . Extrusion_Error > `
if * MakeGroups * == True , only : class : ` error code < SMESH . SMESH_MeshEditor . Extrusion_Error > ` otherwise
Example : : ref : ` tui_extrusion_along_path `
"""
2017-12-08 19:09:48 +05:00
2015-03-18 21:07:40 +05:00
n , e , f = [ ] , IDsOfElements , IDsOfElements
gr , er = self . ExtrusionAlongPathObjects ( n , e , f , PathMesh , PathShape ,
NodeStart , HasAngles , Angles ,
LinearVariation ,
HasRefPoint , RefPoint , MakeGroups )
2015-03-17 17:06:56 +05:00
if MakeGroups : return gr , er
return er
2008-03-07 12:47:05 +05:00
def ExtrusionAlongPathObject ( self , theObject , PathMesh , PathShape , NodeStart ,
2015-10-09 19:47:17 +05:00
HasAngles = False , Angles = [ ] , HasRefPoint = False , RefPoint = [ ] ,
2008-03-07 12:47:05 +05:00
MakeGroups = False , LinearVariation = False ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Generate new elements by extrusion of the elements which belong to the object .
The path of extrusion must be a meshed edge .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
theObject : the object whose elements should be processed .
2018-05-25 22:04:48 +05:00
It can be a : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > ` .
2017-12-08 19:09:48 +05:00
PathMesh : mesh containing a 1 D sub - mesh on the edge , along which the extrusion proceeds
2018-05-25 22:04:48 +05:00
PathShape : shape ( edge ) defines the sub - mesh for the path
2017-12-08 19:09:48 +05:00
NodeStart : the first or the last node on the edge . Defines the direction of extrusion
HasAngles : allows the shape to be rotated around the path
2018-05-25 22:04:48 +05:00
to get the resulting mesh in a helical fashion
2017-12-08 19:09:48 +05:00
Angles : list of angles
HasRefPoint : allows using the reference point
2018-05-25 22:04:48 +05:00
RefPoint : the reference point around which the shape is rotated ( the mass center of the shape 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 `
2017-12-08 19:09:48 +05:00
MakeGroups : forces the generation of new groups from existing ones
LinearVariation : forces the computation of rotation angles as linear
2018-05-25 22:04:48 +05:00
variation of the given Angles along path steps
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` and
: class : ` error code < SMESH . SMESH_MeshEditor . Extrusion_Error > ` if * MakeGroups * == True ,
only : class : ` error code < SMESH . SMESH_MeshEditor . Extrusion_Error > ` otherwise
Example : : ref : ` tui_extrusion_along_path `
"""
2017-12-08 19:09:48 +05:00
2015-03-18 21:07:40 +05:00
n , e , f = [ ] , theObject , theObject
gr , er = self . ExtrusionAlongPathObjects ( n , e , f , PathMesh , PathShape , NodeStart ,
HasAngles , Angles , LinearVariation ,
HasRefPoint , RefPoint , MakeGroups )
2015-03-17 17:06:56 +05:00
if MakeGroups : return gr , er
return er
2008-03-07 12:47:05 +05:00
2009-02-17 10:27:49 +05:00
def ExtrusionAlongPathObject1D ( self , theObject , PathMesh , PathShape , NodeStart ,
2015-10-09 19:47:17 +05:00
HasAngles = False , Angles = [ ] , HasRefPoint = False , RefPoint = [ ] ,
2009-02-17 10:27:49 +05:00
MakeGroups = False , LinearVariation = False ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Generate new elements by extrusion of mesh segments which belong to the object .
The path of extrusion must be a meshed edge .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
theObject : the object whose 1 D elements should be processed .
2018-05-25 22:04:48 +05:00
It can be a : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > ` .
2017-12-08 19:09:48 +05:00
PathMesh : mesh containing a 1 D sub - mesh on the edge , along which the extrusion proceeds
2018-05-25 22:04:48 +05:00
PathShape : shape ( edge ) defines the sub - mesh for the path
2017-12-08 19:09:48 +05:00
NodeStart : the first or the last node on the edge . Defines the direction of extrusion
HasAngles : allows the shape to be rotated around the path
2018-05-25 22:04:48 +05:00
to get the resulting mesh in a helical fashion
2017-12-08 19:09:48 +05:00
Angles : list of angles
HasRefPoint : allows using the reference point
2018-05-25 22:04:48 +05:00
RefPoint : the reference point around which the shape is rotated ( the mass center of the shape 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 `
2017-12-08 19:09:48 +05:00
MakeGroups : forces the generation of new groups from existing ones
LinearVariation : forces the computation of rotation angles as linear
2018-05-25 22:04:48 +05:00
variation of the given Angles along path steps
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` and
: class : ` error code < SMESH . SMESH_MeshEditor . Extrusion_Error > ` if * MakeGroups * == True ,
only : class : ` error code < SMESH . SMESH_MeshEditor . Extrusion_Error > ` otherwise
Example : : ref : ` tui_extrusion_along_path `
"""
2017-12-08 19:09:48 +05:00
2015-03-18 21:07:40 +05:00
n , e , f = [ ] , theObject , [ ]
gr , er = self . ExtrusionAlongPathObjects ( n , e , f , PathMesh , PathShape , NodeStart ,
HasAngles , Angles , LinearVariation ,
HasRefPoint , RefPoint , MakeGroups )
2015-03-17 17:06:56 +05:00
if MakeGroups : return gr , er
return er
2009-02-17 10:27:49 +05:00
def ExtrusionAlongPathObject2D ( self , theObject , PathMesh , PathShape , NodeStart ,
2015-10-09 19:47:17 +05:00
HasAngles = False , Angles = [ ] , HasRefPoint = False , RefPoint = [ ] ,
2009-02-17 10:27:49 +05:00
MakeGroups = False , LinearVariation = False ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Generate new elements by extrusion of faces which belong to the object .
The path of extrusion must be a meshed edge .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
theObject : the object whose 2 D elements should be processed .
2018-05-25 22:04:48 +05:00
It can be a : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > ` .
2017-12-08 19:09:48 +05:00
PathMesh : mesh containing a 1 D sub - mesh on the edge , along which the extrusion proceeds
2018-05-25 22:04:48 +05:00
PathShape : shape ( edge ) defines the sub - mesh for the path
2017-12-08 19:09:48 +05:00
NodeStart : the first or the last node on the edge . Defines the direction of extrusion
HasAngles : allows the shape to be rotated around the path
2018-05-25 22:04:48 +05:00
to get the resulting mesh in a helical fashion
2017-12-08 19:09:48 +05:00
Angles : list of angles
HasRefPoint : allows using the reference point
2018-05-25 22:04:48 +05:00
RefPoint : the reference point around which the shape is rotated ( the mass center of the shape 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 `
2017-12-08 19:09:48 +05:00
MakeGroups : forces the generation of new groups from existing ones
LinearVariation : forces the computation of rotation angles as linear
2018-05-25 22:04:48 +05:00
variation of the given Angles along path steps
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` and
: class : ` error code < SMESH . SMESH_MeshEditor . Extrusion_Error > ` if * MakeGroups * == True ,
only : class : ` error code < SMESH . SMESH_MeshEditor . Extrusion_Error > ` otherwise
Example : : ref : ` tui_extrusion_along_path `
"""
2017-12-08 19:09:48 +05:00
2015-03-18 21:07:40 +05:00
n , e , f = [ ] , [ ] , theObject
gr , er = self . ExtrusionAlongPathObjects ( n , e , f , PathMesh , PathShape , NodeStart ,
HasAngles , Angles , LinearVariation ,
HasRefPoint , RefPoint , MakeGroups )
2015-03-17 17:06:56 +05:00
if MakeGroups : return gr , er
return er
2009-02-17 10:27:49 +05:00
2014-06-26 18:15:06 +06:00
def Mirror ( self , IDsOfElements , Mirror , theMirrorType = None , Copy = 0 , MakeGroups = False ) :
2017-12-08 19:09:48 +05:00
"""
Create a symmetrical copy of mesh elements
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
IDsOfElements : list of elements ids
2018-05-25 22:04:48 +05:00
Mirror : is : class : ` SMESH . AxisStruct ` or geom object ( point , line , plane )
theMirrorType : smeshBuilder . POINT , smeshBuilder . AXIS or smeshBuilder . PLANE .
If the * Mirror * is a geom object this parameter is unnecessary
2017-12-08 19:09:48 +05:00
Copy : allows to copy element ( Copy is 1 ) or to replace with its mirroring ( Copy is 0 )
MakeGroups : forces the generation of new groups from existing ones ( if Copy )
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True , empty list otherwise
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if IDsOfElements == [ ] :
IDsOfElements = self . GetElementsId ( )
2013-04-04 13:08:19 +06:00
if ( isinstance ( Mirror , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
2014-06-26 18:15:06 +06:00
Mirror = self . smeshpyD . GetAxisStruct ( Mirror )
theMirrorType = Mirror . _mirrorType
else :
self . mesh . SetParameters ( Mirror . parameters )
2008-03-07 12:47:05 +05:00
if Copy and MakeGroups :
return self . editor . MirrorMakeGroups ( IDsOfElements , Mirror , theMirrorType )
self . editor . Mirror ( IDsOfElements , Mirror , theMirrorType , Copy )
return [ ]
2014-06-26 18:15:06 +06:00
def MirrorMakeMesh ( self , IDsOfElements , Mirror , theMirrorType = 0 , MakeGroups = 0 , NewMeshName = " " ) :
2017-12-08 19:09:48 +05:00
"""
Create a new mesh by a symmetrical copy of mesh elements
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
IDsOfElements : the list of elements ids
2018-05-25 22:04:48 +05:00
Mirror : is : class : ` SMESH . AxisStruct ` or geom object ( point , line , plane )
theMirrorType : smeshBuilder . POINT , smeshBuilder . AXIS or smeshBuilder . PLANE .
If the * Mirror * is a geom object this parameter is unnecessary
2017-12-08 19:09:48 +05:00
MakeGroups : to generate new groups from existing ones
NewMeshName : a name of the new mesh to create
Returns :
2018-05-25 22:04:48 +05:00
instance of class : class : ` Mesh `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if IDsOfElements == [ ] :
IDsOfElements = self . GetElementsId ( )
2013-04-04 13:08:19 +06:00
if ( isinstance ( Mirror , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
2014-06-26 18:15:06 +06:00
Mirror = self . smeshpyD . GetAxisStruct ( Mirror )
theMirrorType = Mirror . _mirrorType
else :
self . mesh . SetParameters ( Mirror . parameters )
2008-03-07 12:47:05 +05:00
mesh = self . editor . MirrorMakeMesh ( IDsOfElements , Mirror , theMirrorType ,
MakeGroups , NewMeshName )
return Mesh ( self . smeshpyD , self . geompyD , mesh )
2014-06-26 18:15:06 +06:00
def MirrorObject ( self , theObject , Mirror , theMirrorType = None , Copy = 0 , MakeGroups = False ) :
2017-12-08 19:09:48 +05:00
"""
Create a symmetrical copy of the object
2018-05-25 22:04:48 +05:00
Parameters :
theObject : : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
Mirror : : class : ` SMESH . AxisStruct ` or geom object ( point , line , plane )
theMirrorType : smeshBuilder . POINT , smeshBuilder . AXIS or smeshBuilder . PLANE .
If the * Mirror * is a geom object this parameter is unnecessary
Copy : allows copying the element ( Copy == True ) or replacing it with its mirror ( Copy == False )
2017-12-08 19:09:48 +05:00
MakeGroups : forces the generation of new groups from existing ones ( if Copy )
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True , empty list otherwise
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if ( isinstance ( theObject , Mesh ) ) :
theObject = theObject . GetMesh ( )
2013-04-04 13:08:19 +06:00
if ( isinstance ( Mirror , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
2014-06-26 18:15:06 +06:00
Mirror = self . smeshpyD . GetAxisStruct ( Mirror )
theMirrorType = Mirror . _mirrorType
else :
self . mesh . SetParameters ( Mirror . parameters )
2008-03-07 12:47:05 +05:00
if Copy and MakeGroups :
return self . editor . MirrorObjectMakeGroups ( theObject , Mirror , theMirrorType )
self . editor . MirrorObject ( theObject , Mirror , theMirrorType , Copy )
return [ ]
2014-06-26 18:15:06 +06:00
def MirrorObjectMakeMesh ( self , theObject , Mirror , theMirrorType = 0 , MakeGroups = 0 , NewMeshName = " " ) :
2017-12-08 19:09:48 +05:00
"""
Create a new mesh by a symmetrical copy of the object
2018-05-25 22:04:48 +05:00
Parameters :
theObject : : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
Mirror : : class : ` SMESH . AxisStruct ` or geom object ( point , line , plane )
theMirrorType : smeshBuilder . POINT , smeshBuilder . AXIS or smeshBuilder . PLANE .
If the * Mirror * is a geom object this parameter is unnecessary
2017-12-08 19:09:48 +05:00
MakeGroups : forces the generation of new groups from existing ones
NewMeshName : the name of the new mesh to create
Returns :
2018-05-25 22:04:48 +05:00
instance of class : class : ` Mesh `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if ( isinstance ( theObject , Mesh ) ) :
theObject = theObject . GetMesh ( )
2014-06-26 18:15:06 +06:00
if ( isinstance ( Mirror , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
Mirror = self . smeshpyD . GetAxisStruct ( Mirror )
theMirrorType = Mirror . _mirrorType
else :
self . mesh . SetParameters ( Mirror . parameters )
2008-03-07 12:47:05 +05:00
mesh = self . editor . MirrorObjectMakeMesh ( theObject , Mirror , theMirrorType ,
MakeGroups , NewMeshName )
return Mesh ( self . smeshpyD , self . geompyD , mesh )
def Translate ( self , IDsOfElements , Vector , Copy , MakeGroups = False ) :
2017-12-08 19:09:48 +05:00
"""
Translate the elements
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
IDsOfElements : list of elements ids
2018-05-25 22:04:48 +05:00
Vector : the direction of translation ( : class : ` SMESH . DirStruct ` or vector or 3 vector components )
2017-12-08 19:09:48 +05:00
Copy : allows copying the translated elements
MakeGroups : forces the generation of new groups from existing ones ( if Copy )
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True , empty list otherwise
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if IDsOfElements == [ ] :
IDsOfElements = self . GetElementsId ( )
2013-04-04 13:08:19 +06:00
if ( isinstance ( Vector , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
2008-03-07 12:47:05 +05:00
Vector = self . smeshpyD . GetDirStruct ( Vector )
2013-03-15 20:59:29 +06:00
if isinstance ( Vector , list ) :
Vector = self . smeshpyD . MakeDirStruct ( * Vector )
2012-08-09 16:03:55 +06:00
self . mesh . SetParameters ( Vector . PS . parameters )
2008-03-07 12:47:05 +05:00
if Copy and MakeGroups :
return self . editor . TranslateMakeGroups ( IDsOfElements , Vector )
self . editor . Translate ( IDsOfElements , Vector , Copy )
return [ ]
def TranslateMakeMesh ( self , IDsOfElements , Vector , MakeGroups = False , NewMeshName = " " ) :
2017-12-08 19:09:48 +05:00
"""
Create a new mesh of translated elements
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
IDsOfElements : list of elements ids
2018-05-25 22:04:48 +05:00
Vector : the direction of translation ( : class : ` SMESH . DirStruct ` or vector or 3 vector components )
2017-12-08 19:09:48 +05:00
MakeGroups : forces the generation of new groups from existing ones
NewMeshName : the name of the newly created mesh
Returns :
2018-05-25 22:04:48 +05:00
instance of class : class : ` Mesh `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if IDsOfElements == [ ] :
IDsOfElements = self . GetElementsId ( )
2013-04-04 13:08:19 +06:00
if ( isinstance ( Vector , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
2008-03-07 12:47:05 +05:00
Vector = self . smeshpyD . GetDirStruct ( Vector )
2013-03-15 20:59:29 +06:00
if isinstance ( Vector , list ) :
Vector = self . smeshpyD . MakeDirStruct ( * Vector )
2012-08-09 16:03:55 +06:00
self . mesh . SetParameters ( Vector . PS . parameters )
2008-03-07 12:47:05 +05:00
mesh = self . editor . TranslateMakeMesh ( IDsOfElements , Vector , MakeGroups , NewMeshName )
return Mesh ( self . smeshpyD , self . geompyD , mesh )
def TranslateObject ( self , theObject , Vector , Copy , MakeGroups = False ) :
2017-12-08 19:09:48 +05:00
"""
Translate the object
2018-05-25 22:04:48 +05:00
Parameters :
theObject : the object to translate ( : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > ` )
Vector : direction of translation ( : class : ` SMESH . DirStruct ` or geom vector or 3 vector components )
2017-12-08 19:09:48 +05:00
Copy : allows copying the translated elements
MakeGroups : forces the generation of new groups from existing ones ( if Copy )
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True , empty list otherwise
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if ( isinstance ( theObject , Mesh ) ) :
theObject = theObject . GetMesh ( )
2013-04-04 13:08:19 +06:00
if ( isinstance ( Vector , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
2008-03-07 12:47:05 +05:00
Vector = self . smeshpyD . GetDirStruct ( Vector )
2013-03-15 20:59:29 +06:00
if isinstance ( Vector , list ) :
Vector = self . smeshpyD . MakeDirStruct ( * Vector )
2012-08-09 16:03:55 +06:00
self . mesh . SetParameters ( Vector . PS . parameters )
2008-03-07 12:47:05 +05:00
if Copy and MakeGroups :
return self . editor . TranslateObjectMakeGroups ( theObject , Vector )
self . editor . TranslateObject ( theObject , Vector , Copy )
return [ ]
def TranslateObjectMakeMesh ( self , theObject , Vector , MakeGroups = False , NewMeshName = " " ) :
2017-12-08 19:09:48 +05:00
"""
Create a new mesh from the translated object
2018-05-25 22:04:48 +05:00
Parameters :
theObject : the object to translate ( : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > ` )
Vector : the direction of translation ( : class : ` SMESH . DirStruct ` or geom vector or 3 vector components )
2017-12-08 19:09:48 +05:00
MakeGroups : forces the generation of new groups from existing ones
NewMeshName : the name of the newly created mesh
Returns :
2018-05-25 22:04:48 +05:00
instance of class : class : ` Mesh `
"""
2017-12-08 19:09:48 +05:00
2013-03-15 20:59:29 +06:00
if isinstance ( theObject , Mesh ) :
2008-03-07 12:47:05 +05:00
theObject = theObject . GetMesh ( )
2013-04-04 13:08:19 +06:00
if isinstance ( Vector , geomBuilder . GEOM . _objref_GEOM_Object ) :
2008-03-07 12:47:05 +05:00
Vector = self . smeshpyD . GetDirStruct ( Vector )
2013-03-15 20:59:29 +06:00
if isinstance ( Vector , list ) :
Vector = self . smeshpyD . MakeDirStruct ( * Vector )
2012-08-09 16:03:55 +06:00
self . mesh . SetParameters ( Vector . PS . parameters )
2008-03-07 12:47:05 +05:00
mesh = self . editor . TranslateObjectMakeMesh ( theObject , Vector , MakeGroups , NewMeshName )
return Mesh ( self . smeshpyD , self . geompyD , mesh )
2012-08-09 16:03:55 +06:00
def Scale ( self , theObject , thePoint , theScaleFact , Copy , MakeGroups = False ) :
2017-12-08 19:09:48 +05:00
"""
Scale the object
2018-05-25 22:04:48 +05:00
Parameters :
theObject : the object to translate ( : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > ` )
thePoint : base point for scale ( : class : ` SMESH . PointStruct ` or list of 3 coordinates )
2017-12-08 19:09:48 +05:00
theScaleFact : list of 1 - 3 scale factors for axises
Copy : allows copying the translated elements
MakeGroups : forces the generation of new groups from existing
2018-05-25 22:04:48 +05:00
ones ( if Copy )
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True ,
empty list otherwise
"""
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2012-08-09 16:03:55 +06:00
if ( isinstance ( theObject , Mesh ) ) :
theObject = theObject . GetMesh ( )
if ( isinstance ( theObject , list ) ) :
theObject = self . GetIDSource ( theObject , SMESH . ALL )
2013-08-07 20:06:39 +06:00
unRegister . set ( theObject )
2015-02-11 18:52:57 +05:00
if ( isinstance ( thePoint , list ) ) :
thePoint = PointStruct ( thePoint [ 0 ] , thePoint [ 1 ] , thePoint [ 2 ] )
2012-12-13 17:41:29 +06:00
if ( isinstance ( theScaleFact , float ) ) :
2017-03-20 17:22:47 +05:00
theScaleFact = [ theScaleFact ]
2012-12-13 17:41:29 +06:00
if ( isinstance ( theScaleFact , int ) ) :
2017-03-20 17:22:47 +05:00
theScaleFact = [ float ( theScaleFact ) ]
2012-08-09 16:03:55 +06:00
self . mesh . SetParameters ( thePoint . parameters )
if Copy and MakeGroups :
return self . editor . ScaleMakeGroups ( theObject , thePoint , theScaleFact )
self . editor . Scale ( theObject , thePoint , theScaleFact , Copy )
return [ ]
def ScaleMakeMesh ( self , theObject , thePoint , theScaleFact , MakeGroups = False , NewMeshName = " " ) :
2017-12-08 19:09:48 +05:00
"""
Create a new mesh from the translated object
2018-05-25 22:04:48 +05:00
Parameters :
theObject : the object to translate ( : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > ` )
thePoint : base point for scale ( : class : ` SMESH . PointStruct ` or list of 3 coordinates )
2017-12-08 19:09:48 +05:00
theScaleFact : list of 1 - 3 scale factors for axises
MakeGroups : forces the generation of new groups from existing ones
NewMeshName : the name of the newly created mesh
Returns :
2018-05-25 22:04:48 +05:00
instance of class : class : ` Mesh `
"""
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2012-08-09 16:03:55 +06:00
if ( isinstance ( theObject , Mesh ) ) :
theObject = theObject . GetMesh ( )
if ( isinstance ( theObject , list ) ) :
theObject = self . GetIDSource ( theObject , SMESH . ALL )
2013-08-07 20:06:39 +06:00
unRegister . set ( theObject )
2015-02-11 18:52:57 +05:00
if ( isinstance ( thePoint , list ) ) :
thePoint = PointStruct ( thePoint [ 0 ] , thePoint [ 1 ] , thePoint [ 2 ] )
2012-12-13 17:41:29 +06:00
if ( isinstance ( theScaleFact , float ) ) :
2017-03-20 17:22:47 +05:00
theScaleFact = [ theScaleFact ]
2012-12-13 17:41:29 +06:00
if ( isinstance ( theScaleFact , int ) ) :
2017-03-20 17:22:47 +05:00
theScaleFact = [ float ( theScaleFact ) ]
2012-08-09 16:03:55 +06:00
self . mesh . SetParameters ( thePoint . parameters )
mesh = self . editor . ScaleMakeMesh ( theObject , thePoint , theScaleFact ,
MakeGroups , NewMeshName )
return Mesh ( self . smeshpyD , self . geompyD , mesh )
2008-03-07 12:47:05 +05:00
def Rotate ( self , IDsOfElements , Axis , AngleInRadians , Copy , MakeGroups = False ) :
2017-12-08 19:09:48 +05:00
"""
Rotate the elements
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
IDsOfElements : list of elements ids
2018-05-25 22:04:48 +05:00
Axis : the axis of rotation ( : class : ` SMESH . AxisStruct ` or geom line )
2017-12-08 19:09:48 +05:00
AngleInRadians : the angle of rotation ( in radians ) or a name of variable which defines angle in degrees
Copy : allows copying the rotated elements
MakeGroups : forces the generation of new groups from existing ones ( if Copy )
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if * MakeGroups * == True , empty list otherwise
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if IDsOfElements == [ ] :
IDsOfElements = self . GetElementsId ( )
2013-04-04 13:08:19 +06:00
if ( isinstance ( Axis , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
2008-03-07 12:47:05 +05:00
Axis = self . smeshpyD . GetAxisStruct ( Axis )
2012-08-09 16:03:55 +06:00
AngleInRadians , Parameters , hasVars = ParseAngles ( AngleInRadians )
Parameters = Axis . parameters + var_separator + Parameters
2009-02-17 10:27:49 +05:00
self . mesh . SetParameters ( Parameters )
2008-03-07 12:47:05 +05:00
if Copy and MakeGroups :
return self . editor . RotateMakeGroups ( IDsOfElements , Axis , AngleInRadians )
self . editor . Rotate ( IDsOfElements , Axis , AngleInRadians , Copy )
return [ ]
def RotateMakeMesh ( self , IDsOfElements , Axis , AngleInRadians , MakeGroups = 0 , NewMeshName = " " ) :
2017-12-08 19:09:48 +05:00
"""
Create a new mesh of rotated elements
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
IDsOfElements : list of element ids
2018-05-25 22:04:48 +05:00
Axis : the axis of rotation ( : class : ` SMESH . AxisStruct ` or geom line )
2017-12-08 19:09:48 +05:00
AngleInRadians : the angle of rotation ( in radians ) or a name of variable which defines angle in degrees
MakeGroups : forces the generation of new groups from existing ones
NewMeshName : the name of the newly created mesh
Returns :
2018-05-25 22:04:48 +05:00
instance of class : class : ` Mesh `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if IDsOfElements == [ ] :
IDsOfElements = self . GetElementsId ( )
2013-04-04 13:08:19 +06:00
if ( isinstance ( Axis , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
2008-03-07 12:47:05 +05:00
Axis = self . smeshpyD . GetAxisStruct ( Axis )
2012-08-09 16:03:55 +06:00
AngleInRadians , Parameters , hasVars = ParseAngles ( AngleInRadians )
Parameters = Axis . parameters + var_separator + Parameters
self . mesh . SetParameters ( Parameters )
2008-03-07 12:47:05 +05:00
mesh = self . editor . RotateMakeMesh ( IDsOfElements , Axis , AngleInRadians ,
MakeGroups , NewMeshName )
return Mesh ( self . smeshpyD , self . geompyD , mesh )
def RotateObject ( self , theObject , Axis , AngleInRadians , Copy , MakeGroups = False ) :
2017-12-08 19:09:48 +05:00
"""
Rotate the object
2018-05-25 22:04:48 +05:00
Parameters :
theObject : the object to rotate ( : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > ` )
Axis : the axis of rotation ( : class : ` SMESH . AxisStruct ` or geom line )
2017-12-08 19:09:48 +05:00
AngleInRadians : the angle of rotation ( in radians ) or a name of variable which defines angle in degrees
Copy : allows copying the rotated elements
MakeGroups : forces the generation of new groups from existing ones ( if Copy )
Returns :
2018-05-25 22:04:48 +05:00
list of created : class : ` groups < SMESH . SMESH_GroupBase > ` if MakeGroups == True , empty list otherwise
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if ( isinstance ( theObject , Mesh ) ) :
theObject = theObject . GetMesh ( )
2013-04-04 13:08:19 +06:00
if ( isinstance ( Axis , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
2008-03-07 12:47:05 +05:00
Axis = self . smeshpyD . GetAxisStruct ( Axis )
2012-08-09 16:03:55 +06:00
AngleInRadians , Parameters , hasVars = ParseAngles ( AngleInRadians )
Parameters = Axis . parameters + " : " + Parameters
2009-02-17 10:27:49 +05:00
self . mesh . SetParameters ( Parameters )
2008-03-07 12:47:05 +05:00
if Copy and MakeGroups :
return self . editor . RotateObjectMakeGroups ( theObject , Axis , AngleInRadians )
self . editor . RotateObject ( theObject , Axis , AngleInRadians , Copy )
return [ ]
def RotateObjectMakeMesh ( self , theObject , Axis , AngleInRadians , MakeGroups = 0 , NewMeshName = " " ) :
2017-12-08 19:09:48 +05:00
"""
Create a new mesh from the rotated object
2018-05-25 22:04:48 +05:00
Parameters :
theObject : the object to rotate ( : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > ` )
Axis : the axis of rotation ( : class : ` SMESH . AxisStruct ` or geom line )
2017-12-08 19:09:48 +05:00
AngleInRadians : the angle of rotation ( in radians ) or a name of variable which defines angle in degrees
MakeGroups : forces the generation of new groups from existing ones
NewMeshName : the name of the newly created mesh
Returns :
2018-05-25 22:04:48 +05:00
instance of class : class : ` Mesh `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
if ( isinstance ( theObject , Mesh ) ) :
theObject = theObject . GetMesh ( )
2013-04-04 13:08:19 +06:00
if ( isinstance ( Axis , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
2008-03-07 12:47:05 +05:00
Axis = self . smeshpyD . GetAxisStruct ( Axis )
2012-08-09 16:03:55 +06:00
AngleInRadians , Parameters , hasVars = ParseAngles ( AngleInRadians )
Parameters = Axis . parameters + " : " + Parameters
2008-03-07 12:47:05 +05:00
mesh = self . editor . RotateObjectMakeMesh ( theObject , Axis , AngleInRadians ,
MakeGroups , NewMeshName )
2012-08-09 16:03:55 +06:00
self . mesh . SetParameters ( Parameters )
2008-03-07 12:47:05 +05:00
return Mesh ( self . smeshpyD , self . geompyD , mesh )
2018-05-25 22:04:48 +05:00
def Offset ( self , theObject , Value , MakeGroups = False , CopyElements = False , NewMeshName = ' ' ) :
2017-12-08 19:09:48 +05:00
"""
Create an offset mesh from the given 2 D object
2018-05-25 22:04:48 +05:00
Parameters :
theObject ( SMESH . SMESH_IDSource ) : the source object ( mesh , sub - mesh , group or filter )
theValue ( float ) : signed offset size
MakeGroups ( boolean ) : forces the generation of new groups from existing ones
CopyElements ( boolean ) : if * NewMeshName * is empty , True means to keep 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
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
A tuple ( : class : ` Mesh ` , list of : class : ` groups < SMESH . SMESH_Group > ` )
2017-12-08 19:09:48 +05:00
"""
2018-02-10 00:41:01 +05:00
if isinstance ( theObject , Mesh ) :
theObject = theObject . GetMesh ( )
2018-05-25 22:04:48 +05:00
theValue , Parameters , hasVars = ParseParameters ( Value )
mesh_groups = self . editor . Offset ( theObject , Value , MakeGroups , CopyElements , NewMeshName )
2018-02-10 00:41:01 +05:00
self . mesh . SetParameters ( Parameters )
# if mesh_groups[0]:
# return Mesh( self.smeshpyD, self.geompyD, mesh_groups[0] ), mesh_groups[1]
return mesh_groups
2015-07-01 16:59:24 +05:00
def FindCoincidentNodes ( self , Tolerance , SeparateCornerAndMediumNodes = False ) :
2017-12-08 19:09:48 +05:00
"""
Find groups of adjacent nodes within Tolerance .
2018-05-25 22:04:48 +05:00
Parameters :
Tolerance ( float ) : the value of tolerance
SeparateCornerAndMediumNodes ( boolean ) : if * True * , in quadratic mesh puts
corner and medium nodes in separate groups thus preventing
their further merge .
2017-12-08 19:09:48 +05:00
Returns :
the list of groups of nodes IDs ( e . g . [ [ 1 , 12 , 13 ] , [ 4 , 25 ] ] )
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2015-07-01 16:59:24 +05:00
return self . editor . FindCoincidentNodes ( Tolerance , SeparateCornerAndMediumNodes )
2008-03-07 12:47:05 +05:00
2015-07-01 16:59:24 +05:00
def FindCoincidentNodesOnPart ( self , SubMeshOrGroup , Tolerance ,
exceptNodes = [ ] , SeparateCornerAndMediumNodes = False ) :
2017-12-08 19:09:48 +05:00
"""
2018-06-25 16:38:55 +05:00
Find groups of adjacent nodes within Tolerance .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
Tolerance : the value of tolerance
2018-05-25 22:04:48 +05:00
SubMeshOrGroup : : class : ` sub - mesh , group or filter < SMESH . SMESH_IDSource > `
2017-12-08 19:09:48 +05:00
exceptNodes : list of either SubMeshes , Groups or node IDs to exclude from search
SeparateCornerAndMediumNodes : if * True * , in quadratic mesh puts
2018-05-25 22:04:48 +05:00
corner and medium nodes in separate groups thus preventing
their further merge .
2017-12-08 19:09:48 +05:00
Returns :
the list of groups of nodes IDs ( e . g . [ [ 1 , 12 , 13 ] , [ 4 , 25 ] ] )
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2012-08-09 16:03:55 +06:00
if ( isinstance ( SubMeshOrGroup , Mesh ) ) :
SubMeshOrGroup = SubMeshOrGroup . GetMesh ( )
2015-07-01 16:59:24 +05:00
if not isinstance ( exceptNodes , list ) :
2012-08-09 16:03:55 +06:00
exceptNodes = [ exceptNodes ]
2015-07-01 16:59:24 +05:00
if exceptNodes and isinstance ( exceptNodes [ 0 ] , int ) :
exceptNodes = [ self . GetIDSource ( exceptNodes , SMESH . NODE ) ]
2013-08-07 20:06:39 +06:00
unRegister . set ( exceptNodes )
2015-07-01 16:59:24 +05:00
return self . editor . FindCoincidentNodesOnPartBut ( SubMeshOrGroup , Tolerance ,
exceptNodes , SeparateCornerAndMediumNodes )
2008-03-07 12:47:05 +05:00
2017-03-14 17:43:27 +05:00
def MergeNodes ( self , GroupsOfNodes , NodesToKeep = [ ] , AvoidMakingHoles = False ) :
2017-12-08 19:09:48 +05:00
"""
Merge nodes
2018-05-25 22:04:48 +05:00
Parameters :
GroupsOfNodes : a list of groups of nodes IDs for merging .
E . g . [ [ 1 , 12 , 13 ] , [ 25 , 4 ] ] means that nodes 12 , 13 and 4 will be removed and replaced
in all elements and groups by nodes 1 and 25 correspondingly
2017-12-08 19:09:48 +05:00
NodesToKeep : nodes to keep in the mesh : a list of groups , sub - meshes or node IDs .
2018-05-25 22:04:48 +05:00
If * NodesToKeep * does not include a node to keep for some group to merge ,
then the first node in the group is kept .
2017-12-08 19:09:48 +05:00
AvoidMakingHoles : prevent merging nodes which cause removal of elements becoming
2018-05-25 22:04:48 +05:00
invalid
"""
# NodesToKeep are converted to SMESH.SMESH_IDSource in meshEditor.MergeNodes()
2017-03-14 17:43:27 +05:00
self . editor . MergeNodes ( GroupsOfNodes , NodesToKeep , AvoidMakingHoles )
2008-03-07 12:47:05 +05:00
2015-03-17 17:06:56 +05:00
def FindEqualElements ( self , MeshOrSubMeshOrGroup = None ) :
2017-12-08 19:09:48 +05:00
"""
Find the elements built on the same nodes .
2018-05-25 22:04:48 +05:00
Parameters :
MeshOrSubMeshOrGroup : : class : ` mesh , sub - mesh , group or filter < SMESH . SMESH_IDSource > `
2017-12-08 19:09:48 +05:00
Returns :
the list of groups of equal elements IDs ( e . g . [ [ 1 , 12 , 13 ] , [ 4 , 25 ] ] )
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2015-03-17 17:06:56 +05:00
if not MeshOrSubMeshOrGroup :
MeshOrSubMeshOrGroup = self . mesh
elif isinstance ( MeshOrSubMeshOrGroup , Mesh ) :
2012-08-09 16:03:55 +06:00
MeshOrSubMeshOrGroup = MeshOrSubMeshOrGroup . GetMesh ( )
2015-03-17 17:06:56 +05:00
return self . editor . FindEqualElements ( MeshOrSubMeshOrGroup )
2008-03-07 12:47:05 +05:00
def MergeElements ( self , GroupsOfElementsID ) :
2017-12-08 19:09:48 +05:00
"""
Merge elements in each given group .
2018-05-25 22:04:48 +05:00
Parameters :
GroupsOfElementsID : a list of groups ( lists ) of elements IDs for merging
( e . g . [ [ 1 , 12 , 13 ] , [ 25 , 4 ] ] means that elements 12 , 13 and 4 will be removed and
replaced in all groups by elements 1 and 25 )
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
self . editor . MergeElements ( GroupsOfElementsID )
def MergeEqualElements ( self ) :
2017-12-08 19:09:48 +05:00
"""
Leave one element and remove all other elements built on the same nodes .
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
self . editor . MergeEqualElements ( )
2017-10-12 21:52:03 +05:00
def FindFreeBorders ( self , ClosedOnly = True ) :
2017-12-08 19:09:48 +05:00
"""
Returns all or only closed free borders
Returns :
list of SMESH . FreeBorder ' s
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2017-10-12 21:52:03 +05:00
return self . editor . FindFreeBorders ( ClosedOnly )
def FillHole ( self , holeNodes ) :
2017-12-08 19:09:48 +05:00
"""
Fill with 2 D elements a hole defined by a SMESH . FreeBorder .
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
FreeBorder : either a SMESH . FreeBorder or a list on node IDs . These nodes
2018-05-25 22:04:48 +05:00
must describe all sequential nodes of the hole border . The first and the last
nodes must be the same . Use : meth : ` FindFreeBorders ` to get nodes of holes .
"""
2017-12-08 19:09:48 +05:00
2017-10-12 21:52:03 +05:00
if holeNodes and isinstance ( holeNodes , list ) and isinstance ( holeNodes [ 0 ] , int ) :
holeNodes = SMESH . FreeBorder ( nodeIDs = holeNodes )
if not isinstance ( holeNodes , SMESH . FreeBorder ) :
2017-12-29 18:20:32 +05:00
raise TypeError ( " holeNodes must be either SMESH.FreeBorder or list of integer and not %s " % holeNodes )
2017-10-12 21:52:03 +05:00
self . editor . FillHole ( holeNodes )
2015-09-18 19:10:34 +05:00
def FindCoincidentFreeBorders ( self , tolerance = 0. ) :
2017-12-08 19:09:48 +05:00
"""
Return groups of FreeBorder ' s coincident within the given tolerance.
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
tolerance : the tolerance . If the tolerance < = 0.0 then one tenth of an average
2018-05-25 22:04:48 +05:00
size of elements adjacent to free borders being compared is used .
2017-12-08 19:09:48 +05:00
Returns :
SMESH . CoincidentFreeBorders structure
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2015-09-18 19:10:34 +05:00
return self . editor . FindCoincidentFreeBorders ( tolerance )
2017-12-08 19:09:48 +05:00
2015-09-18 19:10:34 +05:00
def SewCoincidentFreeBorders ( self , freeBorders , createPolygons = False , createPolyhedra = False ) :
2017-12-08 19:09:48 +05:00
"""
Sew FreeBorder ' s of each group
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
freeBorders : either a SMESH . CoincidentFreeBorders structure or a list of lists
2018-05-25 22:04:48 +05:00
where each enclosed list contains node IDs of a group of coincident free
borders such that each consequent triple of IDs within a group describes
a free border in a usual way : n1 , n2 , nLast - i . e . 1 st node , 2 nd node and
last node of a border .
For example [ [ 1 , 2 , 10 , 20 , 21 , 40 ] , [ 11 , 12 , 15 , 55 , 54 , 41 ] ] describes two
groups of coincident free borders , each group including two borders .
2017-12-08 19:09:48 +05:00
createPolygons : if : code : ` True ` faces adjacent to free borders are converted to
2018-05-25 22:04:48 +05:00
polygons if a node of opposite border falls on a face edge , else such
faces are split into several ones .
2017-12-08 19:09:48 +05:00
createPolyhedra : if : code : ` True ` volumes adjacent to free borders are converted to
2018-05-25 22:04:48 +05:00
polyhedra if a node of opposite border falls on a volume edge , else such
volumes , if any , remain intact and the mesh becomes non - conformal .
2017-12-08 19:09:48 +05:00
Returns :
a number of successfully sewed groups
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2015-09-18 19:10:34 +05:00
if freeBorders and isinstance ( freeBorders , list ) :
# construct SMESH.CoincidentFreeBorders
if isinstance ( freeBorders [ 0 ] , int ) :
freeBorders = [ freeBorders ]
borders = [ ]
coincidentGroups = [ ]
for nodeList in freeBorders :
if not nodeList or len ( nodeList ) % 3 :
2017-03-20 17:27:30 +05:00
raise ValueError ( " Wrong number of nodes in this group: %s " % nodeList )
2015-09-18 19:10:34 +05:00
group = [ ]
while nodeList :
group . append ( SMESH . FreeBorderPart ( len ( borders ) , 0 , 1 , 2 ) )
borders . append ( SMESH . FreeBorder ( nodeList [ : 3 ] ) )
nodeList = nodeList [ 3 : ]
pass
coincidentGroups . append ( group )
pass
freeBorders = SMESH . CoincidentFreeBorders ( borders , coincidentGroups )
return self . editor . SewCoincidentFreeBorders ( freeBorders , createPolygons , createPolyhedra )
2008-03-07 12:47:05 +05:00
def SewFreeBorders ( self , FirstNodeID1 , SecondNodeID1 , LastNodeID1 ,
FirstNodeID2 , SecondNodeID2 , LastNodeID2 ,
CreatePolygons , CreatePolyedrs ) :
2017-12-08 19:09:48 +05:00
"""
Sew free borders
Returns :
2018-05-25 22:04:48 +05:00
: class : ` error code < SMESH . SMESH_MeshEditor . Sew_Error > `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . SewFreeBorders ( FirstNodeID1 , SecondNodeID1 , LastNodeID1 ,
FirstNodeID2 , SecondNodeID2 , LastNodeID2 ,
CreatePolygons , CreatePolyedrs )
def SewConformFreeBorders ( self , FirstNodeID1 , SecondNodeID1 , LastNodeID1 ,
FirstNodeID2 , SecondNodeID2 ) :
2017-12-08 19:09:48 +05:00
"""
Sew conform free borders
Returns :
2018-05-25 22:04:48 +05:00
: class : ` error code < SMESH . SMESH_MeshEditor . Sew_Error > `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . SewConformFreeBorders ( FirstNodeID1 , SecondNodeID1 , LastNodeID1 ,
FirstNodeID2 , SecondNodeID2 )
def SewBorderToSide ( self , FirstNodeIDOnFreeBorder , SecondNodeIDOnFreeBorder , LastNodeIDOnFreeBorder ,
FirstNodeIDOnSide , LastNodeIDOnSide , CreatePolygons , CreatePolyedrs ) :
2017-12-08 19:09:48 +05:00
"""
Sew border to side
Returns :
2018-05-25 22:04:48 +05:00
: class : ` error code < SMESH . SMESH_MeshEditor . Sew_Error > `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . SewBorderToSide ( FirstNodeIDOnFreeBorder , SecondNodeIDOnFreeBorder , LastNodeIDOnFreeBorder ,
FirstNodeIDOnSide , LastNodeIDOnSide , CreatePolygons , CreatePolyedrs )
def SewSideElements ( self , IDsOfSide1Elements , IDsOfSide2Elements ,
NodeID1OfSide1ToMerge , NodeID1OfSide2ToMerge ,
NodeID2OfSide1ToMerge , NodeID2OfSide2ToMerge ) :
2017-12-08 19:09:48 +05:00
"""
Sew two sides of a mesh . The nodes belonging to Side1 are
2018-05-25 22:04:48 +05:00
merged with the nodes of elements of Side2 .
The number of elements in theSide1 and in theSide2 must be
equal and they should have similar nodal connectivity .
The nodes to merge should belong to side borders and
the first node should be linked to the second .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
: class : ` error code < SMESH . SMESH_MeshEditor . Sew_Error > `
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . SewSideElements ( IDsOfSide1Elements , IDsOfSide2Elements ,
NodeID1OfSide1ToMerge , NodeID1OfSide2ToMerge ,
NodeID2OfSide1ToMerge , NodeID2OfSide2ToMerge )
def ChangeElemNodes ( self , ide , newIDs ) :
2017-12-08 19:09:48 +05:00
"""
Set new nodes for the given element .
2018-05-25 22:04:48 +05:00
Parameters :
ide : the element ID
newIDs : nodes IDs
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
False if the number of nodes does not correspond to the type of element
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . ChangeElemNodes ( ide , newIDs )
def GetLastCreatedNodes ( self ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
If during the last operation of : class : ` SMESH . SMESH_MeshEditor ` some nodes were
created , this method return the list of their IDs .
If new nodes were not created - return empty list
2017-12-08 19:09:48 +05:00
Returns :
the list of integer values ( can be empty )
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . GetLastCreatedNodes ( )
def GetLastCreatedElems ( self ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
If during the last operation of : class : ` SMESH . SMESH_MeshEditor ` some elements were
created this method return the list of their IDs .
If new elements were not created - return empty list
2017-12-08 19:09:48 +05:00
Returns :
the list of integer values ( can be empty )
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2008-03-07 12:47:05 +05:00
return self . editor . GetLastCreatedElems ( )
2012-08-09 16:03:55 +06:00
2013-05-16 22:55:14 +06:00
def ClearLastCreated ( self ) :
2017-12-08 19:09:48 +05:00
"""
Forget what nodes and elements were created by the last mesh edition operation
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2013-05-16 22:55:14 +06:00
self . editor . ClearLastCreated ( )
2013-05-28 22:49:24 +06:00
def DoubleElements ( self , theElements , theGroupName = " " ) :
2017-12-08 19:09:48 +05:00
"""
Create duplicates of given elements , i . e . create new elements based on the
2018-05-25 22:04:48 +05:00
same nodes as the given ones .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theElements : container of elements to duplicate . It can be a
: class : ` mesh , sub - mesh , group , filter < SMESH . SMESH_IDSource > `
or a list of element IDs . If * theElements * is
a : class : ` Mesh ` , elements of highest dimension are duplicated
2017-12-08 19:09:48 +05:00
theGroupName : a name of group to contain the generated elements .
2018-05-25 22:04:48 +05:00
If a group with such a name already exists , the new elements
2018-06-19 21:58:29 +05:00
are added to the existing group , else a new group is created .
2018-05-25 22:04:48 +05:00
If * theGroupName * is empty , new elements are not added
in any group .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Returns :
a : class : ` group < SMESH . SMESH_Group > ` where the new elements are added .
None if * theGroupName * == " " .
"""
2017-12-08 19:09:48 +05:00
2013-08-07 20:06:39 +06:00
unRegister = genObjUnRegister ( )
2013-05-28 22:49:24 +06:00
if isinstance ( theElements , Mesh ) :
theElements = theElements . mesh
elif isinstance ( theElements , list ) :
theElements = self . GetIDSource ( theElements , SMESH . ALL )
2013-08-07 20:06:39 +06:00
unRegister . set ( theElements )
2013-05-28 22:49:24 +06:00
return self . editor . DoubleElements ( theElements , theGroupName )
2009-02-17 10:27:49 +05:00
def DoubleNodes ( self , theNodes , theModifiedElems ) :
2017-12-08 19:09:48 +05:00
"""
Create a hole in a mesh by doubling the nodes of some particular elements
2018-05-25 22:04:48 +05:00
Parameters :
theNodes : IDs of nodes to be doubled
theModifiedElems : IDs of elements to be updated by the new ( doubled )
nodes . If list of element identifiers is empty then nodes are doubled but
they not assigned to elements
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True if operation has been completed successfully , False otherwise
"""
2017-12-08 19:09:48 +05:00
2009-02-17 10:27:49 +05:00
return self . editor . DoubleNodes ( theNodes , theModifiedElems )
2012-08-09 16:03:55 +06:00
2009-02-17 10:27:49 +05:00
def DoubleNode ( self , theNodeId , theModifiedElems ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Create a hole in a mesh by doubling the nodes of some particular elements .
This method provided for convenience works as : meth : ` DoubleNodes ` .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theNodeId : IDs of node to double
theModifiedElems : IDs of elements to update
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True if operation has been completed successfully , False otherwise
"""
2017-12-08 19:09:48 +05:00
2009-02-17 10:27:49 +05:00
return self . editor . DoubleNode ( theNodeId , theModifiedElems )
2012-08-09 16:03:55 +06:00
def DoubleNodeGroup ( self , theNodes , theModifiedElems , theMakeGroup = False ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Create a hole in a mesh by doubling the nodes of some particular elements .
This method provided for convenience works as : meth : ` DoubleNodes ` .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theNodes : group of nodes to double .
theModifiedElems : group of elements to update .
2017-12-08 19:09:48 +05:00
theMakeGroup : forces the generation of a group containing new nodes .
Returns :
2018-05-25 22:04:48 +05:00
True or a created group if operation has been completed successfully ,
False or None otherwise
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if theMakeGroup :
return self . editor . DoubleNodeGroupNew ( theNodes , theModifiedElems )
2009-02-17 10:27:49 +05:00
return self . editor . DoubleNodeGroup ( theNodes , theModifiedElems )
2012-08-09 16:03:55 +06:00
def DoubleNodeGroups ( self , theNodes , theModifiedElems , theMakeGroup = False ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Create a hole in a mesh by doubling the nodes of some particular elements .
This method provided for convenience works as : meth : ` DoubleNodes ` .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theNodes : list of groups of nodes to double .
theModifiedElems : list of groups of elements to update .
2017-12-08 19:09:48 +05:00
theMakeGroup : forces the generation of a group containing new nodes .
Returns :
2018-05-25 22:04:48 +05:00
True if operation has been completed successfully , False otherwise
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if theMakeGroup :
return self . editor . DoubleNodeGroupsNew ( theNodes , theModifiedElems )
2009-02-17 10:27:49 +05:00
return self . editor . DoubleNodeGroups ( theNodes , theModifiedElems )
2012-08-09 16:03:55 +06:00
def DoubleNodeElem ( self , theElems , theNodesNot , theAffectedElems ) :
2017-12-08 19:09:48 +05:00
"""
Create a hole in a mesh by doubling the nodes of some particular elements
2018-05-25 22:04:48 +05:00
Parameters :
theElems : the list of elements ( edges or faces ) to replicate .
The nodes for duplication could be found from these elements
theNodesNot : list of nodes NOT to replicate
2017-12-08 19:09:48 +05:00
theAffectedElems : the list of elements ( cells and edges ) to which the
2018-05-25 22:04:48 +05:00
replicated nodes should be associated to
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True if operation has been completed successfully , False otherwise
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . editor . DoubleNodeElem ( theElems , theNodesNot , theAffectedElems )
def DoubleNodeElemInRegion ( self , theElems , theNodesNot , theShape ) :
2017-12-08 19:09:48 +05:00
"""
Create a hole in a mesh by doubling the nodes of some particular elements
2018-05-25 22:04:48 +05:00
Parameters :
theElems : the list of elements ( edges or faces ) to replicate .
The nodes for duplication could be found from these elements
theNodesNot : list of nodes NOT to replicate
2017-12-08 19:09:48 +05:00
theShape : shape to detect affected elements ( element which geometric center
2018-05-25 22:04:48 +05:00
located on or inside shape ) .
The replicated nodes should be associated to affected elements .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True if operation has been completed successfully , False otherwise
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . editor . DoubleNodeElemInRegion ( theElems , theNodesNot , theShape )
def DoubleNodeElemGroup ( self , theElems , theNodesNot , theAffectedElems ,
theMakeGroup = False , theMakeNodeGroup = False ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Create a hole in a mesh by doubling the nodes of some particular elements .
This method provided for convenience works as : meth : ` DoubleNodes ` .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theElems : group of of elements ( edges or faces ) to replicate .
theNodesNot : group of nodes NOT to replicate .
2017-12-08 19:09:48 +05:00
theAffectedElems : group of elements to which the replicated nodes
2018-05-25 22:04:48 +05:00
should be associated to .
2017-12-08 19:09:48 +05:00
theMakeGroup : forces the generation of a group containing new elements .
theMakeNodeGroup : forces the generation of a group containing new nodes .
Returns :
2018-05-25 22:04:48 +05:00
True or created groups ( one or two ) if operation has been completed successfully ,
False or None otherwise
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if theMakeGroup or theMakeNodeGroup :
twoGroups = self . editor . DoubleNodeElemGroup2New ( theElems , theNodesNot ,
theAffectedElems ,
theMakeGroup , theMakeNodeGroup )
if theMakeGroup and theMakeNodeGroup :
return twoGroups
else :
return twoGroups [ int ( theMakeNodeGroup ) ]
return self . editor . DoubleNodeElemGroup ( theElems , theNodesNot , theAffectedElems )
def DoubleNodeElemGroupInRegion ( self , theElems , theNodesNot , theShape ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Create a hole in a mesh by doubling the nodes of some particular elements .
This method provided for convenience works as : meth : ` DoubleNodes ` .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theElems : group of of elements ( edges or faces ) to replicate
theNodesNot : group of nodes not to replicate
2017-12-08 19:09:48 +05:00
theShape : shape to detect affected elements ( element which geometric center
2018-05-25 22:04:48 +05:00
located on or inside shape ) .
The replicated nodes should be associated to affected elements
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . editor . DoubleNodeElemGroupInRegion ( theElems , theNodesNot , theShape )
def DoubleNodeElemGroups ( self , theElems , theNodesNot , theAffectedElems ,
theMakeGroup = False , theMakeNodeGroup = False ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Create a hole in a mesh by doubling the nodes of some particular elements .
This method provided for convenience works as : meth : ` DoubleNodes ` .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theElems : list of groups of elements ( edges or faces ) to replicate
theNodesNot : list of groups of nodes NOT to replicate
2017-12-08 19:09:48 +05:00
theAffectedElems : group of elements to which the replicated nodes
2018-05-25 22:04:48 +05:00
should be associated to
theMakeGroup : forces generation of a group containing new elements .
theMakeNodeGroup : forces generation of a group containing new nodes
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True or created groups ( one or two ) if operation has been completed successfully ,
False or None otherwise
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if theMakeGroup or theMakeNodeGroup :
twoGroups = self . editor . DoubleNodeElemGroups2New ( theElems , theNodesNot ,
theAffectedElems ,
theMakeGroup , theMakeNodeGroup )
if theMakeGroup and theMakeNodeGroup :
return twoGroups
else :
return twoGroups [ int ( theMakeNodeGroup ) ]
return self . editor . DoubleNodeElemGroups ( theElems , theNodesNot , theAffectedElems )
def DoubleNodeElemGroupsInRegion ( self , theElems , theNodesNot , theShape ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Create a hole in a mesh by doubling the nodes of some particular elements .
This method provided for convenience works as : meth : ` DoubleNodes ` .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theElems : list of groups of elements ( edges or faces ) to replicate
theNodesNot : list of groups of nodes NOT to replicate
2017-12-08 19:09:48 +05:00
theShape : shape to detect affected elements ( element which geometric center
2018-05-25 22:04:48 +05:00
located on or inside shape ) .
The replicated nodes should be associated to affected elements
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True if operation has been completed successfully , False otherwise
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . editor . DoubleNodeElemGroupsInRegion ( theElems , theNodesNot , theShape )
2012-10-08 17:56:59 +06:00
def AffectedElemGroupsInRegion ( self , theElems , theNodesNot , theShape ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Identify the elements that will be affected by node duplication ( actual duplication is not performed ) .
This method is the first step of : meth : ` DoubleNodeElemGroupsInRegion ` .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
theElems : list of groups of nodes or elements ( edges or faces ) to replicate
theNodesNot : list of groups of nodes NOT to replicate
2017-12-08 19:09:48 +05:00
theShape : shape to detect affected elements ( element which geometric center
2018-05-25 22:04:48 +05:00
located on or inside shape ) .
The replicated nodes should be associated to affected elements
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
groups of affected elements in order : volumes , faces , edges
"""
2017-12-08 19:09:48 +05:00
2012-10-08 17:56:59 +06:00
return self . editor . AffectedElemGroupsInRegion ( theElems , theNodesNot , theShape )
2014-03-19 20:29:49 +06:00
def DoubleNodesOnGroupBoundaries ( self , theDomains , createJointElems , onAllBoundaries = False ) :
2018-06-14 16:56:19 +05:00
2017-12-08 19:09:48 +05:00
"""
Double nodes on shared faces between groups of volumes and create flat elements on demand .
2018-05-25 22:04:48 +05:00
The list of groups must describe a partition of the mesh volumes .
The nodes of the internal faces at the boundaries of the groups are doubled .
In option , the internal faces are replaced by flat elements .
Triangles are transformed to prisms , and quadrangles to hexahedrons .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
theDomains : list of groups of volumes
2018-05-25 22:04:48 +05:00
createJointElems : if True , create the elements
onAllBoundaries : if True , the nodes and elements are also created on
the boundary between * theDomains * and the rest mesh
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
True if operation has been completed successfully , False otherwise
"""
2017-12-08 19:09:48 +05:00
return self . editor . DoubleNodesOnGroupBoundaries ( theDomains , createJointElems , onAllBoundaries )
2012-08-09 16:03:55 +06:00
def CreateFlatElementsOnFacesGroups ( self , theGroupsOfFaces ) :
2017-12-08 19:09:48 +05:00
"""
Double nodes on some external faces and create flat elements .
2018-05-25 22:04:48 +05:00
Flat elements are mainly used by some types of mechanic calculations .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Each group of the list must be constituted of faces .
Triangles are transformed in prisms , and quadrangles in hexahedrons .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
Parameters :
2017-12-08 19:09:48 +05:00
theGroupsOfFaces : list of groups of faces
Returns :
2018-05-25 22:04:48 +05:00
True if operation has been completed successfully , False otherwise
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
return self . editor . CreateFlatElementsOnFacesGroups ( theGroupsOfFaces )
2017-12-08 19:09:48 +05:00
2012-10-08 17:56:59 +06:00
def CreateHoleSkin ( self , radius , theShape , groupName , theNodesCoords ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Identify all the elements around a geom shape , get the faces delimiting the hole
"""
2012-10-08 17:56:59 +06:00
return self . editor . CreateHoleSkin ( radius , theShape , groupName , theNodesCoords )
2012-08-09 16:03:55 +06:00
2017-12-19 20:56:16 +05:00
def MakePolyLine ( self , segments , groupName = ' ' , isPreview = False ) :
2017-12-08 19:09:48 +05:00
"""
Create a polyline consisting of 1 D mesh elements each lying on a 2 D element of
the initial mesh . Positions of new nodes are found by cutting the mesh by the
2018-05-25 22:04:48 +05:00
plane passing through pairs of points specified by each : class : ` SMESH . PolySegment ` structure .
2017-12-08 19:09:48 +05:00
If there are several paths connecting a pair of points , the shortest path is
selected by the module . Position of the cutting plane is defined by the two
points and an optional vector lying on the plane specified by a PolySegment .
By default the vector is defined by Mesh module as following . A middle point
of the two given points is computed . The middle point is projected to the mesh .
The vector goes from the middle point to the projection point . In case of planar
mesh , the vector is normal to the mesh .
2018-05-25 22:04:48 +05:00
* segments * [ i ] . vector returns the used vector which goes from the middle point to its projection .
Parameters :
segments : list of : class : ` SMESH . PolySegment ` defining positions of cutting planes .
groupName : optional name of a group where created mesh segments will be added .
2017-12-08 19:09:48 +05:00
2018-05-25 22:04:48 +05:00
"""
2017-12-19 20:56:16 +05:00
editor = self . editor
if isPreview :
editor = self . mesh . GetMeshEditPreviewer ( )
segmentsRes = editor . MakePolyLine ( segments , groupName )
for i , seg in enumerate ( segmentsRes ) :
segments [ i ] . vector = seg . vector
if isPreview :
return editor . GetPreviewData ( )
return None
2017-10-12 21:52:03 +05:00
def GetFunctor ( self , funcType ) :
2017-12-08 19:09:48 +05:00
"""
Return a cached numerical functor by its type .
2018-05-25 22:04:48 +05:00
Parameters :
funcType : functor type : an item of : class : ` SMESH . FunctorType ` enumeration .
Note that not all items correspond to numerical functors .
2017-12-08 19:09:48 +05:00
Returns :
2018-05-25 22:04:48 +05:00
: class : ` SMESH . NumericalFunctor ` . The functor is already initialized with a mesh
"""
2017-12-08 19:09:48 +05:00
2012-12-13 17:41:29 +06:00
fn = self . functors [ funcType . _v ]
if not fn :
fn = self . smeshpyD . GetFunctor ( funcType )
fn . SetMesh ( self . mesh )
self . functors [ funcType . _v ] = fn
return fn
2015-03-17 22:40:17 +05:00
def FunctorValue ( self , funcType , elemId , isElem = True ) :
2017-12-08 19:09:48 +05:00
"""
Return value of a functor for a given element
2018-05-25 22:04:48 +05:00
Parameters :
funcType : an item of : class : ` SMESH . FunctorType ` enum .
2017-12-08 19:09:48 +05:00
elemId : element or node ID
isElem : * elemId * is ID of element or node
Returns :
the functor value or zero in case of invalid arguments
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2017-10-12 21:52:03 +05:00
fn = self . GetFunctor ( funcType )
2015-03-17 22:40:17 +05:00
if fn . GetElementType ( ) == self . GetElementType ( elemId , isElem ) :
2012-08-09 16:03:55 +06:00
val = fn . GetValue ( elemId )
else :
val = 0
return val
2013-08-08 21:17:00 +06:00
def GetLength ( self , elemId = None ) :
2017-12-08 19:09:48 +05:00
"""
Get length of 1 D element or sum of lengths of all 1 D mesh elements
Parameters :
2018-05-25 22:04:48 +05:00
elemId : mesh element ID ( if not defined - sum of length of all 1 D elements will be calculated )
2017-12-08 19:09:48 +05:00
Returns :
element ' s length value if *elemId* is specified or sum of all 1D mesh elements ' lengths otherwise
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2013-08-08 21:17:00 +06:00
length = 0
if elemId == None :
2013-08-20 19:48:54 +06:00
length = self . smeshpyD . GetLength ( self )
2013-08-08 21:17:00 +06:00
else :
2015-03-17 22:40:17 +05:00
length = self . FunctorValue ( SMESH . FT_Length , elemId )
2013-08-08 21:17:00 +06:00
return length
2012-08-09 16:03:55 +06:00
2013-08-08 21:17:00 +06:00
def GetArea ( self , elemId = None ) :
2017-12-08 19:09:48 +05:00
"""
Get area of 2 D element or sum of areas of all 2 D mesh elements
2018-05-25 22:04:48 +05:00
elemId mesh element ID ( if not defined - sum of areas of all 2 D elements will be calculated )
2017-12-08 19:09:48 +05:00
Returns :
element ' s area value if *elemId* is specified or sum of all 2D mesh elements ' areas otherwise
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2013-08-08 21:17:00 +06:00
area = 0
if elemId == None :
2013-08-20 19:48:54 +06:00
area = self . smeshpyD . GetArea ( self )
2013-08-08 21:17:00 +06:00
else :
2015-03-17 22:40:17 +05:00
area = self . FunctorValue ( SMESH . FT_Area , elemId )
2013-08-08 21:17:00 +06:00
return area
2012-08-09 16:03:55 +06:00
2013-08-08 21:17:00 +06:00
def GetVolume ( self , elemId = None ) :
2017-12-08 19:09:48 +05:00
"""
Get volume of 3 D element or sum of volumes of all 3 D mesh elements
2018-05-25 22:04:48 +05:00
Parameters :
elemId : mesh element ID ( if not defined - sum of volumes of all 3 D elements will be calculated )
2017-12-08 19:09:48 +05:00
Returns :
element ' s volume value if *elemId* is specified or sum of all 3D mesh elements ' volumes otherwise
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2013-08-08 21:17:00 +06:00
volume = 0
if elemId == None :
2013-08-20 19:48:54 +06:00
volume = self . smeshpyD . GetVolume ( self )
2013-08-08 21:17:00 +06:00
else :
2015-03-17 22:40:17 +05:00
volume = self . FunctorValue ( SMESH . FT_Volume3D , elemId )
2013-08-08 21:17:00 +06:00
return volume
2012-08-09 16:03:55 +06:00
def GetMaxElementLength ( self , elemId ) :
2017-12-08 19:09:48 +05:00
"""
Get maximum element length .
Parameters :
2018-05-25 22:04:48 +05:00
elemId : mesh element ID
2017-12-08 19:09:48 +05:00
Returns :
element ' s maximum length value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if self . GetElementType ( elemId , True ) == SMESH . VOLUME :
ftype = SMESH . FT_MaxElementLength3D
else :
ftype = SMESH . FT_MaxElementLength2D
2015-03-17 22:40:17 +05:00
return self . FunctorValue ( ftype , elemId )
2012-08-09 16:03:55 +06:00
def GetAspectRatio ( self , elemId ) :
2017-12-08 19:09:48 +05:00
"""
Get aspect ratio of 2 D or 3 D element .
Parameters :
2018-05-25 22:04:48 +05:00
elemId : mesh element ID
2017-12-08 19:09:48 +05:00
Returns :
element ' s aspect ratio value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if self . GetElementType ( elemId , True ) == SMESH . VOLUME :
ftype = SMESH . FT_AspectRatio3D
else :
ftype = SMESH . FT_AspectRatio
2015-03-17 22:40:17 +05:00
return self . FunctorValue ( ftype , elemId )
2012-08-09 16:03:55 +06:00
def GetWarping ( self , elemId ) :
2017-12-08 19:09:48 +05:00
"""
Get warping angle of 2 D element .
Parameters :
2018-05-25 22:04:48 +05:00
elemId : mesh element ID
2017-12-08 19:09:48 +05:00
Returns :
element ' s warping angle value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2015-03-17 22:40:17 +05:00
return self . FunctorValue ( SMESH . FT_Warping , elemId )
2012-08-09 16:03:55 +06:00
def GetMinimumAngle ( self , elemId ) :
2017-12-08 19:09:48 +05:00
"""
Get minimum angle of 2 D element .
Parameters :
2018-05-25 22:04:48 +05:00
elemId : mesh element ID
2017-12-08 19:09:48 +05:00
Returns :
element ' s minimum angle value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2015-03-17 22:40:17 +05:00
return self . FunctorValue ( SMESH . FT_MinimumAngle , elemId )
2012-08-09 16:03:55 +06:00
def GetTaper ( self , elemId ) :
2017-12-08 19:09:48 +05:00
"""
Get taper of 2 D element .
Parameters :
2018-05-25 22:04:48 +05:00
elemId : mesh element ID
2017-12-08 19:09:48 +05:00
Returns :
element ' s taper value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2015-03-17 22:40:17 +05:00
return self . FunctorValue ( SMESH . FT_Taper , elemId )
2012-08-09 16:03:55 +06:00
def GetSkew ( self , elemId ) :
2017-12-08 19:09:48 +05:00
"""
Get skew of 2 D element .
Parameters :
2018-05-25 22:04:48 +05:00
elemId : mesh element ID
2017-12-08 19:09:48 +05:00
Returns :
element ' s skew value
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2015-03-17 22:40:17 +05:00
return self . FunctorValue ( SMESH . FT_Skew , elemId )
2012-08-09 16:03:55 +06:00
2014-05-30 22:24:08 +06:00
def GetMinMax ( self , funType , meshPart = None ) :
2017-12-08 19:09:48 +05:00
"""
Return minimal and maximal value of a given functor .
2018-05-25 22:04:48 +05:00
Parameters :
funType ( SMESH . FunctorType ) : a functor type .
Note that not all items of : class : ` SMESH . FunctorType ` corresponds
to numerical functors .
meshPart : a part of mesh ( : class : ` sub - mesh , group or filter < SMESH . SMESH_IDSource > ` ) to treat
2017-12-08 19:09:48 +05:00
Returns :
tuple ( min , max )
2018-05-25 22:04:48 +05:00
"""
2017-12-08 19:09:48 +05:00
2014-05-30 22:24:08 +06:00
unRegister = genObjUnRegister ( )
if isinstance ( meshPart , list ) :
meshPart = self . GetIDSource ( meshPart , SMESH . ALL )
unRegister . set ( meshPart )
if isinstance ( meshPart , Mesh ) :
meshPart = meshPart . mesh
2017-10-12 21:52:03 +05:00
fun = self . GetFunctor ( funType )
2014-04-17 17:56:40 +06:00
if fun :
2014-05-30 22:24:08 +06:00
if meshPart :
2015-08-28 22:03:25 +05:00
if hasattr ( meshPart , " SetMesh " ) :
meshPart . SetMesh ( self . mesh ) # set mesh to filter
2014-05-30 22:24:08 +06:00
hist = fun . GetLocalHistogram ( 1 , False , meshPart )
else :
hist = fun . GetHistogram ( 1 , False )
2014-04-17 17:56:40 +06:00
if hist :
return hist [ 0 ] . min , hist [ 0 ] . max
return None
2012-10-08 17:56:59 +06:00
pass # end of Mesh class
2014-02-05 14:08:10 +06:00
2015-08-06 19:13:42 +05:00
class meshProxy ( SMESH . _objref_SMESH_Mesh ) :
2017-12-08 19:09:48 +05:00
"""
Private class used to compensate change of CORBA API of SMESH_Mesh for backward compatibility
with old dump scripts which call SMESH_Mesh directly and not via smeshBuilder . Mesh
"""
2018-06-14 16:56:19 +05:00
def __init__ ( self , * args ) :
SMESH . _objref_SMESH_Mesh . __init__ ( self , * args )
2015-08-06 19:13:42 +05:00
def __deepcopy__ ( self , memo = None ) :
2017-06-01 19:07:32 +05:00
new = self . __class__ ( self )
2015-08-06 19:13:42 +05:00
return new
def CreateDimGroup ( self , * args ) : # 2 args added: nbCommonNodes, underlyingOnly
if len ( args ) == 3 :
args + = SMESH . ALL_NODES , True
2016-04-06 19:24:26 +05:00
return SMESH . _objref_SMESH_Mesh . CreateDimGroup ( self , * args )
def ExportToMEDX ( self , * args ) : # function removed
print ( " WARNING: ExportToMEDX() is deprecated, use ExportMED() instead " )
args = [ i for i in args if i not in [ SMESH . MED_V2_1 , SMESH . MED_V2_2 ] ]
SMESH . _objref_SMESH_Mesh . ExportMED ( self , * args )
def ExportToMED ( self , * args ) : # function removed
print ( " WARNING: ExportToMED() is deprecated, use ExportMED() instead " )
args = [ i for i in args if i not in [ SMESH . MED_V2_1 , SMESH . MED_V2_2 ] ]
while len ( args ) < 4 : # !!!! nb of parameters for ExportToMED IDL's method
args . append ( True )
SMESH . _objref_SMESH_Mesh . ExportMED ( self , * args )
def ExportPartToMED ( self , * args ) : # 'version' parameter removed
args = [ i for i in args if i not in [ SMESH . MED_V2_1 , SMESH . MED_V2_2 ] ]
SMESH . _objref_SMESH_Mesh . ExportPartToMED ( self , * args )
def ExportMED ( self , * args ) : # signature of method changed
args = [ i for i in args if i not in [ SMESH . MED_V2_1 , SMESH . MED_V2_2 ] ]
while len ( args ) < 4 : # !!!! nb of parameters for ExportToMED IDL's method
args . append ( True )
SMESH . _objref_SMESH_Mesh . ExportMED ( self , * args )
2015-08-06 19:13:42 +05:00
pass
omniORB . registerObjref ( SMESH . _objref_SMESH_Mesh . _NP_RepositoryId , meshProxy )
2016-08-02 00:15:36 +05:00
class submeshProxy ( SMESH . _objref_SMESH_subMesh ) :
2018-06-14 16:56:19 +05:00
2017-12-08 19:09:48 +05:00
"""
Private class wrapping SMESH . SMESH_SubMesh in order to add Compute ( )
"""
2018-06-14 16:56:19 +05:00
def __init__ ( self , * args ) :
SMESH . _objref_SMESH_subMesh . __init__ ( self , * args )
2016-08-02 00:15:36 +05:00
self . mesh = None
def __deepcopy__ ( self , memo = None ) :
2017-06-01 19:07:32 +05:00
new = self . __class__ ( self )
2016-08-02 00:15:36 +05:00
return new
def Compute ( self , refresh = False ) :
2017-12-08 19:09:48 +05:00
"""
Compute the sub - mesh and return the status of the computation
2018-05-25 22:04:48 +05:00
Parameters :
refresh : if * True * , Object Browser is automatically updated ( when running in GUI )
2017-12-08 19:09:48 +05:00
Returns :
True or False
2018-05-25 22:04:48 +05:00
This is a method of SMESH . SMESH_submesh that can be obtained via Mesh . GetSubMesh ( ) or
: meth : ` smeshBuilder . Mesh . GetSubMesh ` .
"""
2017-12-08 19:09:48 +05:00
2016-08-02 00:15:36 +05:00
if not self . mesh :
self . mesh = Mesh ( smeshBuilder ( ) , None , self . GetMesh ( ) )
ok = self . mesh . Compute ( self . GetSubShape ( ) , refresh = [ ] )
2017-06-13 15:01:10 +05:00
if salome . sg . hasDesktop ( ) :
2016-08-02 00:15:36 +05:00
smeshgui = salome . ImportComponentGUI ( " SMESH " )
2017-06-13 15:01:10 +05:00
smeshgui . Init ( )
2016-08-02 00:15:36 +05:00
smeshgui . SetMeshIcon ( salome . ObjectToID ( self ) , ok , ( self . GetNumberOfElements ( ) == 0 ) )
2017-06-13 15:01:10 +05:00
if refresh : salome . sg . updateObjBrowser ( )
2016-08-02 00:15:36 +05:00
pass
return ok
pass
omniORB . registerObjref ( SMESH . _objref_SMESH_subMesh . _NP_RepositoryId , submeshProxy )
2015-03-19 19:08:42 +05:00
class meshEditor ( SMESH . _objref_SMESH_MeshEditor ) :
2017-12-08 19:09:48 +05:00
"""
Private class used to compensate change of CORBA API of SMESH_MeshEditor for backward
compatibility with old dump scripts which call SMESH_MeshEditor directly and not via
smeshBuilder . Mesh
"""
2018-06-14 16:56:19 +05:00
def __init__ ( self , * args ) :
SMESH . _objref_SMESH_MeshEditor . __init__ ( self , * args )
2015-03-19 19:08:42 +05:00
self . mesh = None
def __getattr__ ( self , name ) : # method called if an attribute not found
2015-03-19 20:26:38 +05:00
if not self . mesh : # look for name() method in Mesh class
2015-03-19 19:08:42 +05:00
self . mesh = Mesh ( None , None , SMESH . _objref_SMESH_MeshEditor . GetMesh ( self ) )
if hasattr ( self . mesh , name ) :
return getattr ( self . mesh , name )
if name == " ExtrusionAlongPathObjX " :
2015-07-13 22:52:43 +05:00
return getattr ( self . mesh , " ExtrusionAlongPathX " ) # other method name
2017-03-20 17:27:30 +05:00
print ( " meshEditor: attribute ' %s ' NOT FOUND " % name )
2015-03-19 19:08:42 +05:00
return None
2015-07-06 18:41:46 +05:00
def __deepcopy__ ( self , memo = None ) :
2017-06-01 19:07:32 +05:00
new = self . __class__ ( self )
2015-07-06 18:41:46 +05:00
return new
2015-07-13 22:52:43 +05:00
def FindCoincidentNodes ( self , * args ) : # a 2nd arg added (SeparateCornerAndMediumNodes)
2015-08-06 19:13:42 +05:00
if len ( args ) == 1 : args + = False ,
2015-07-13 22:52:43 +05:00
return SMESH . _objref_SMESH_MeshEditor . FindCoincidentNodes ( self , * args )
2015-07-15 19:05:14 +05:00
def FindCoincidentNodesOnPart ( self , * args ) : # a 3d arg added (SeparateCornerAndMediumNodes)
2015-08-06 19:13:42 +05:00
if len ( args ) == 2 : args + = False ,
2015-07-15 19:05:14 +05:00
return SMESH . _objref_SMESH_MeshEditor . FindCoincidentNodesOnPart ( self , * args )
2017-03-14 17:43:27 +05:00
def MergeNodes ( self , * args ) : # 2 args added (NodesToKeep,AvoidMakingHoles)
2015-07-13 22:52:43 +05:00
if len ( args ) == 1 :
2017-03-14 17:43:27 +05:00
return SMESH . _objref_SMESH_MeshEditor . MergeNodes ( self , args [ 0 ] , [ ] , False )
2015-07-13 22:52:43 +05:00
NodesToKeep = args [ 1 ]
2017-03-14 17:43:27 +05:00
AvoidMakingHoles = args [ 2 ] if len ( args ) == 3 else False
2015-07-13 22:52:43 +05:00
unRegister = genObjUnRegister ( )
if NodesToKeep :
if isinstance ( NodesToKeep , list ) and isinstance ( NodesToKeep [ 0 ] , int ) :
NodesToKeep = self . MakeIDSource ( NodesToKeep , SMESH . NODE )
if not isinstance ( NodesToKeep , list ) :
NodesToKeep = [ NodesToKeep ]
2017-03-14 17:43:27 +05:00
return SMESH . _objref_SMESH_MeshEditor . MergeNodes ( self , args [ 0 ] , NodesToKeep , AvoidMakingHoles )
2015-03-19 19:08:42 +05:00
pass
omniORB . registerObjref ( SMESH . _objref_SMESH_MeshEditor . _NP_RepositoryId , meshEditor )
2012-08-09 16:03:55 +06:00
class Pattern ( SMESH . _objref_SMESH_Pattern ) :
2017-12-08 19:09:48 +05:00
"""
Private class wrapping SMESH . SMESH_Pattern CORBA class in order to treat Notebook
variables in some methods
"""
2008-03-07 12:47:05 +05:00
2015-09-10 22:50:31 +05:00
def LoadFromFile ( self , patternTextOrFile ) :
text = patternTextOrFile
if os . path . exists ( text ) :
text = open ( patternTextOrFile ) . read ( )
pass
return SMESH . _objref_SMESH_Pattern . LoadFromFile ( self , text )
2012-08-09 16:03:55 +06:00
def ApplyToMeshFaces ( self , theMesh , theFacesIDs , theNodeIndexOnKeyPoint1 , theReverse ) :
decrFun = lambda i : i - 1
theNodeIndexOnKeyPoint1 , Parameters , hasVars = ParseParameters ( theNodeIndexOnKeyPoint1 , decrFun )
theMesh . SetParameters ( Parameters )
return SMESH . _objref_SMESH_Pattern . ApplyToMeshFaces ( self , theMesh , theFacesIDs , theNodeIndexOnKeyPoint1 , theReverse )
2008-03-07 12:47:05 +05:00
2012-08-09 16:03:55 +06:00
def ApplyToHexahedrons ( self , theMesh , theVolumesIDs , theNode000Index , theNode001Index ) :
decrFun = lambda i : i - 1
theNode000Index , theNode001Index , Parameters , hasVars = ParseParameters ( theNode000Index , theNode001Index , decrFun )
theMesh . SetParameters ( Parameters )
return SMESH . _objref_SMESH_Pattern . ApplyToHexahedrons ( self , theMesh , theVolumesIDs , theNode000Index , theNode001Index )
2008-03-07 12:47:05 +05:00
2015-09-10 22:50:31 +05:00
def MakeMesh ( self , mesh , CreatePolygons = False , CreatePolyhedra = False ) :
if isinstance ( mesh , Mesh ) :
mesh = mesh . GetMesh ( )
return SMESH . _objref_SMESH_Pattern . MakeMesh ( self , mesh , CreatePolygons , CreatePolyhedra )
2012-08-09 16:03:55 +06:00
omniORB . registerObjref ( SMESH . _objref_SMESH_Pattern . _NP_RepositoryId , Pattern )
2017-12-08 19:09:48 +05:00
"""
Registering the new proxy for Pattern
"""
2008-03-07 12:47:05 +05:00
2012-08-09 16:03:55 +06:00
class algoCreator :
2017-12-08 19:09:48 +05:00
"""
Private class used to bind methods creating algorithms to the class Mesh
"""
2017-04-20 16:16:23 +05:00
def __init__ ( self , method ) :
2012-08-09 16:03:55 +06:00
self . mesh = None
self . defaultAlgoType = " "
self . algoTypeToClass = { }
2017-04-20 16:16:23 +05:00
self . method = method
2012-08-09 16:03:55 +06:00
def add ( self , algoClass ) :
2017-12-08 19:09:48 +05:00
"""
2018-05-25 22:04:48 +05:00
Store a python class of algorithm
"""
2017-03-29 18:54:42 +05:00
if inspect . isclass ( algoClass ) and \
2012-08-09 16:03:55 +06:00
hasattr ( algoClass , " algoType " ) :
self . algoTypeToClass [ algoClass . algoType ] = algoClass
if not self . defaultAlgoType and \
hasattr ( algoClass , " isDefault " ) and algoClass . isDefault :
self . defaultAlgoType = algoClass . algoType
2018-06-14 16:56:19 +05:00
#print("Add",algoClass.algoType, "dflt",self.defaultAlgoType)
2012-08-09 16:03:55 +06:00
def copy ( self , mesh ) :
2018-05-25 22:04:48 +05:00
"""
Create a copy of self and assign mesh to the copy
"""
2017-12-08 19:09:48 +05:00
2017-04-20 16:16:23 +05:00
other = algoCreator ( self . method )
2012-08-09 16:03:55 +06:00
other . defaultAlgoType = self . defaultAlgoType
2017-04-20 16:16:23 +05:00
other . algoTypeToClass = self . algoTypeToClass
2012-08-09 16:03:55 +06:00
other . mesh = mesh
return other
def __call__ ( self , algo = " " , geom = 0 , * args ) :
2018-05-25 22:04:48 +05:00
"""
Create an instance of algorithm
"""
2017-04-20 16:16:23 +05:00
algoType = " "
shape = 0
if isinstance ( algo , str ) :
algoType = algo
elif ( isinstance ( algo , geomBuilder . GEOM . _objref_GEOM_Object ) and \
not isinstance ( geom , geomBuilder . GEOM . _objref_GEOM_Object ) ) :
shape = algo
elif algo :
args + = ( algo , )
if isinstance ( geom , geomBuilder . GEOM . _objref_GEOM_Object ) :
shape = geom
elif not algoType and isinstance ( geom , str ) :
algoType = geom
elif geom :
args + = ( geom , )
for arg in args :
if isinstance ( arg , geomBuilder . GEOM . _objref_GEOM_Object ) and not shape :
shape = arg
elif isinstance ( arg , str ) and not algoType :
2012-08-09 16:03:55 +06:00
algoType = arg
2017-04-20 16:16:23 +05:00
else :
import traceback , sys
msg = " Warning. Unexpected argument in mesh. %s () ---> %s " % ( self . method , arg )
sys . stderr . write ( msg + ' \n ' )
tb = traceback . extract_stack ( None , 2 )
traceback . print_list ( [ tb [ 0 ] ] )
if not algoType :
algoType = self . defaultAlgoType
2012-08-09 16:03:55 +06:00
if not algoType and self . algoTypeToClass :
2017-10-19 17:30:51 +05:00
algoType = sorted ( self . algoTypeToClass . keys ( ) ) [ 0 ]
2017-03-20 17:27:30 +05:00
if algoType in self . algoTypeToClass :
2018-06-14 16:56:19 +05:00
#print("Create algo",algoType)
2017-04-20 16:16:23 +05:00
return self . algoTypeToClass [ algoType ] ( self . mesh , shape )
2017-06-22 20:09:29 +05:00
raise RuntimeError ( " No class found for algo type %s " % algoType )
2009-02-17 10:27:49 +05:00
return None
2012-08-09 16:03:55 +06:00
class hypMethodWrapper :
2017-12-08 19:09:48 +05:00
"""
Private class used to substitute and store variable parameters of hypotheses .
"""
2012-08-09 16:03:55 +06:00
def __init__ ( self , hyp , method ) :
self . hyp = hyp
self . method = method
2018-06-14 16:56:19 +05:00
#print("REBIND:", method.__name__)
2012-08-09 16:03:55 +06:00
return
2009-02-17 10:27:49 +05:00
2012-08-09 16:03:55 +06:00
def __call__ ( self , * args ) :
2018-05-25 22:04:48 +05:00
"""
call a method of hypothesis with calling SetVarParameter ( ) before
"""
2017-12-08 19:09:48 +05:00
2012-08-09 16:03:55 +06:00
if not args :
return self . method ( self . hyp , * args ) # hypothesis method with no args
2009-02-17 10:27:49 +05:00
2018-06-14 16:56:19 +05:00
#print("MethWrapper.__call__", self.method.__name__, args)
2012-08-09 16:03:55 +06:00
try :
parsed = ParseParameters ( * args ) # replace variables with their values
self . hyp . SetVarParameter ( parsed [ - 2 ] , self . method . __name__ )
result = self . method ( self . hyp , * parsed [ : - 2 ] ) # call hypothesis method
except omniORB . CORBA . BAD_PARAM : # raised by hypothesis method call
# maybe there is a replaced string arg which is not variable
result = self . method ( self . hyp , * args )
2017-03-20 17:27:30 +05:00
except ValueError as detail : # raised by ParseParameters()
2012-08-09 16:03:55 +06:00
try :
result = self . method ( self . hyp , * args )
except omniORB . CORBA . BAD_PARAM :
2017-03-20 17:27:30 +05:00
raise ValueError ( detail ) # wrong variable name
2009-02-17 10:27:49 +05:00
2012-08-09 16:03:55 +06:00
return result
2013-08-07 20:06:39 +06:00
pass
class genObjUnRegister :
2017-12-08 19:09:48 +05:00
"""
A helper class that calls UnRegister ( ) of SALOME . GenericObj ' es stored in it
"""
2013-08-07 20:06:39 +06:00
def __init__ ( self , genObj = None ) :
self . genObjList = [ ]
self . set ( genObj )
return
def set ( self , genObj ) :
" Store one or a list of of SALOME.GenericObj ' es "
if isinstance ( genObj , list ) :
self . genObjList . extend ( genObj )
else :
self . genObjList . append ( genObj )
return
def __del__ ( self ) :
for genObj in self . genObjList :
if genObj and hasattr ( genObj , " UnRegister " ) :
genObj . UnRegister ( )
2013-04-04 13:08:19 +06:00
for pluginName in os . environ [ " SMESH_MeshersList " ] . split ( " : " ) :
2017-12-08 19:09:48 +05:00
"""
Bind methods creating mesher plug - ins to the Mesh class
"""
2018-06-14 16:56:19 +05:00
# print("pluginName: ", pluginName)
2013-04-04 13:08:19 +06:00
pluginBuilderName = pluginName + " Builder "
try :
exec ( " from salome. %s . %s import * " % ( pluginName , pluginBuilderName ) )
2017-03-20 17:27:30 +05:00
except Exception as e :
2018-05-25 22:04:48 +05:00
from salome_utils import verbose
2017-03-20 17:27:30 +05:00
if verbose ( ) : print ( " Exception while loading %s : %s " % ( pluginBuilderName , e ) )
2013-04-04 13:08:19 +06:00
continue
exec ( " from salome. %s import %s " % ( pluginName , pluginBuilderName ) )
plugin = eval ( pluginBuilderName )
2018-06-14 16:56:19 +05:00
# print(" plugin:" , str(plugin))
2013-04-04 13:08:19 +06:00
# add methods creating algorithms to Mesh
for k in dir ( plugin ) :
if k [ 0 ] == ' _ ' : continue
algo = getattr ( plugin , k )
2018-06-14 16:56:19 +05:00
#print(" algo:", str(algo))
2017-03-29 18:54:42 +05:00
if inspect . isclass ( algo ) and hasattr ( algo , " meshMethod " ) :
2018-06-14 16:56:19 +05:00
#print(" meshMethod:" , str(algo.meshMethod))
2013-04-04 13:08:19 +06:00
if not hasattr ( Mesh , algo . meshMethod ) :
2017-04-20 16:16:23 +05:00
setattr ( Mesh , algo . meshMethod , algoCreator ( algo . meshMethod ) )
2013-04-04 13:08:19 +06:00
pass
2017-12-08 19:09:48 +05:00
_mmethod = getattr ( Mesh , algo . meshMethod )
if hasattr ( _mmethod , " add " ) :
_mmethod . add ( algo )
2013-04-04 13:08:19 +06:00
pass
pass
pass
del pluginName