mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2024-12-26 01:10:35 +05:00
66c7e4a32d
added new eControl added new case for 3DWarp Added new class for 3D Warp Added 3D warp for use as filter Threshold of criteria Fix problem when the Threshold checkbox on Scalar Bar Properties does not remove elements outside of the range
178 lines
5.1 KiB
Python
178 lines
5.1 KiB
Python
#!/usr/bin/env python
|
|
|
|
import os
|
|
import sys
|
|
import salome
|
|
import tempfile
|
|
|
|
salome.salome_init()
|
|
|
|
|
|
def getTmpFileName(ext):
|
|
"""
|
|
get a tmp file name
|
|
"""
|
|
tempdir = tempfile.gettempdir()
|
|
tmp_file = tempfile.NamedTemporaryFile(suffix=".%s"%ext , dir=tempdir, delete=False)
|
|
tmp_filename = tmp_file.name
|
|
return tmp_filename
|
|
|
|
###
|
|
### SHAPER component
|
|
###
|
|
|
|
from salome.shaper import model
|
|
|
|
model.begin()
|
|
partSet = model.moduleDocument()
|
|
Part_1 = model.addPart(partSet)
|
|
Part_1_doc = Part_1.document()
|
|
Cylinder_1 = model.addCylinder(Part_1_doc, model.selection("VERTEX", "PartSet/Origin"), model.selection("EDGE", "PartSet/OZ"), 1, 7)
|
|
Point_2 = model.addPoint(Part_1_doc, 1, 0, 1.5)
|
|
Point_3 = model.addPoint(Part_1_doc, 0.5, 0, 3.5)
|
|
Sphere_1 = model.addSphere(Part_1_doc, model.selection("VERTEX", "Point_1"), 0.75)
|
|
Cylinder_2 = model.addCylinder(Part_1_doc, model.selection("VERTEX", "Point_2"), model.selection("EDGE", "PartSet/OX"), 0.6, 3)
|
|
Fuse_1_objects_1 = [model.selection("SOLID", "Cylinder_2_1"),
|
|
model.selection("SOLID", "Cylinder_1_1"),
|
|
model.selection("SOLID", "Sphere_1_1")]
|
|
Fuse_1 = model.addFuse(Part_1_doc, Fuse_1_objects_1, keepSubResults = True)
|
|
model.end()
|
|
|
|
expected_volume = 25.881416712512
|
|
model.testResultsVolumes(Fuse_1, [expected_volume])
|
|
|
|
###
|
|
### SHAPERSTUDY component
|
|
###
|
|
|
|
model.publishToShaperStudy()
|
|
import SHAPERSTUDY
|
|
Fuse_1_1, = SHAPERSTUDY.shape(model.featureStringId(Fuse_1))
|
|
|
|
###
|
|
### SMESH component
|
|
###
|
|
|
|
import SMESH, SALOMEDS
|
|
from salome.smesh import smeshBuilder
|
|
|
|
smesh = smeshBuilder.New()
|
|
# Surface Mesh
|
|
# ============
|
|
|
|
Mesh_1 = smesh.Mesh(Fuse_1_1, "Mesh_1")
|
|
NETGEN_1D_2D = Mesh_1.Triangle(algo=smeshBuilder.NETGEN_1D2D)
|
|
NETGEN_2D_Parameters_1 = NETGEN_1D_2D.Parameters()
|
|
NETGEN_2D_Parameters_1.SetMaxSize( 0.75 )
|
|
NETGEN_2D_Parameters_1.SetMinSize( 0 )
|
|
NETGEN_2D_Parameters_1.SetSecondOrder( 0 )
|
|
NETGEN_2D_Parameters_1.SetOptimize( 1 )
|
|
NETGEN_2D_Parameters_1.SetFineness( 5 )
|
|
NETGEN_2D_Parameters_1.SetGrowthRate( 0.1 )
|
|
NETGEN_2D_Parameters_1.SetNbSegPerEdge( 2 )
|
|
NETGEN_2D_Parameters_1.SetNbSegPerRadius( 4 )
|
|
|
|
isDone = Mesh_1.Compute()
|
|
|
|
if not isDone:
|
|
raise Exception("Error when computing the surface mesh")
|
|
|
|
# MG-Hexa mesh
|
|
# ============
|
|
|
|
MG_Hexa = Mesh_1.Hexahedron(algo=smeshBuilder.MG_Hexa)
|
|
isDone = Mesh_1.Compute()
|
|
|
|
if not isDone:
|
|
raise Exception("Error when computing volumes with MG-Hexa")
|
|
|
|
volume = smesh.GetVolume(Mesh_1)
|
|
#print("volume: ", volume)
|
|
assert abs(volume-expected_volume)/expected_volume < 0.03
|
|
|
|
assert Mesh_1.NbTriangles() == 0
|
|
|
|
nb_hexa = Mesh_1.NbHexas()
|
|
assert Mesh_1.NbVolumes() == nb_hexa
|
|
|
|
# MG-Hexa mesh with layers
|
|
# ========================
|
|
|
|
MG_Hexa_Parameters = MG_Hexa.Parameters()
|
|
MG_Hexa_Parameters.SetNbLayers( 3 )
|
|
MG_Hexa_Parameters.SetFirstLayerSize( 0.01 )
|
|
MG_Hexa_Parameters.SetGrowth( 1.1 )
|
|
MG_Hexa_Parameters.SetFacesWithLayers( [ 10, 3 ] )
|
|
MG_Hexa_Parameters.SetImprintedFaces( [ 18, 20, 22 ] )
|
|
|
|
isDone = Mesh_1.Compute()
|
|
|
|
if not isDone:
|
|
raise Exception("Error when computing volumes with MG-Hexa and layers")
|
|
|
|
nb_hexa_with_layers = Mesh_1.NbHexas()
|
|
assert Mesh_1.NbVolumes() == nb_hexa_with_layers
|
|
assert nb_hexa < nb_hexa_with_layers
|
|
|
|
volume_with_layers = smesh.GetVolume(Mesh_1)
|
|
#print("volume_with_layers: ", volume_with_layers)
|
|
assert abs(volume_with_layers-expected_volume)/expected_volume < 0.05
|
|
|
|
gr_small_volume = Mesh_1.MakeGroup("small_volumes_layers",
|
|
SMESH.VOLUME,
|
|
CritType=SMESH.FT_Volume3D,
|
|
Compare=SMESH.FT_LessThan,
|
|
Threshold=8e-5,
|
|
Tolerance=1e-07)
|
|
|
|
layers_volume = smesh.GetVolume(gr_small_volume)
|
|
#print("layers_volume: ", layers_volume)
|
|
assert layers_volume < 0.9
|
|
|
|
# check max Warp3D
|
|
max_warp3D = Mesh_1.GetMinMax(SMESH.FT_Warping3D)[1]
|
|
print("max_warp3D: ", max_warp3D)
|
|
# Check that some elements are warped
|
|
assert max_warp3D > 1
|
|
|
|
gr_warp3D = Mesh_1.MakeGroup("warp3D",
|
|
SMESH.VOLUME,
|
|
CritType=SMESH.FT_Warping3D,
|
|
Compare=SMESH.FT_MoreThan,
|
|
Threshold=1,
|
|
Tolerance=1e-07)
|
|
|
|
# Check the group has some elements
|
|
assert gr_warp3D.Size() > 0
|
|
|
|
# create a mesh with the faces of the hexaedra thanks to medcoupling
|
|
umesh_3D = Mesh_1.ExportMEDCoupling()[0]
|
|
# create faces
|
|
umesh_2D,d0,d1,d2,d3=umesh_3D.buildDescendingConnectivity()
|
|
|
|
# export the 2D mesh in a tmp file
|
|
tmp_filename = getTmpFileName("med")
|
|
umesh_2D.write(tmp_filename)
|
|
|
|
# import it in SMESH
|
|
([Mesh_faces], status) = smesh.CreateMeshesFromMED( tmp_filename )
|
|
|
|
gr_warp2D = Mesh_faces.MakeGroup("warp2D",
|
|
SMESH.FACE,
|
|
CritType=SMESH.FT_Warping,
|
|
Compare=SMESH.FT_MoreThan,
|
|
Threshold=1,
|
|
Tolerance=1e-07)
|
|
|
|
# check max Warp3D
|
|
max_warp2D = Mesh_faces.GetMinMax(SMESH.FT_Warping)[1]
|
|
print("max_warp2D: ", max_warp2D)
|
|
assert max_warp2D > 1
|
|
|
|
assert abs(max_warp2D-max_warp3D)/max_warp2D < 1e-5
|
|
|
|
os.remove(tmp_filename)
|
|
|
|
if salome.sg.hasDesktop():
|
|
salome.sg.updateObjBrowser()
|