2021-09-24 18:44:49 +05:00
|
|
|
#!/usr/bin/env python
|
|
|
|
|
|
|
|
import sys
|
|
|
|
import salome
|
|
|
|
|
|
|
|
salome.standalone()
|
|
|
|
salome.salome_init()
|
|
|
|
|
|
|
|
###
|
|
|
|
### SHAPER component
|
|
|
|
###
|
|
|
|
|
|
|
|
from salome.shaper import model
|
|
|
|
|
|
|
|
model.begin()
|
|
|
|
partSet = model.moduleDocument()
|
|
|
|
|
|
|
|
### Create Part
|
|
|
|
Part_1 = model.addPart(partSet)
|
|
|
|
Part_1_doc = Part_1.document()
|
|
|
|
|
|
|
|
### Create Sketch
|
|
|
|
Sketch_1 = model.addSketch(Part_1_doc, model.defaultPlane("XOZ"))
|
|
|
|
|
|
|
|
### Create SketchLine
|
|
|
|
SketchLine_1 = Sketch_1.addLine(100, 0, 0, 0)
|
|
|
|
|
|
|
|
### Create SketchProjection
|
|
|
|
SketchProjection_1 = Sketch_1.addProjection(model.selection("VERTEX", "PartSet/Origin"), False)
|
|
|
|
SketchPoint_1 = SketchProjection_1.createdFeature()
|
|
|
|
Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchPoint_1.result())
|
|
|
|
|
|
|
|
### Create SketchLine
|
|
|
|
SketchLine_2 = Sketch_1.addLine(0, 0, 0, 100)
|
|
|
|
|
|
|
|
### Create SketchLine
|
|
|
|
SketchLine_3 = Sketch_1.addLine(0, 100, 100, 100)
|
|
|
|
|
|
|
|
### Create SketchLine
|
|
|
|
SketchLine_4 = Sketch_1.addLine(100, 100, 100, 0)
|
|
|
|
Sketch_1.setCoincident(SketchLine_4.endPoint(), SketchLine_1.startPoint())
|
|
|
|
Sketch_1.setCoincident(SketchLine_1.endPoint(), SketchLine_2.startPoint())
|
|
|
|
Sketch_1.setCoincident(SketchLine_2.endPoint(), SketchLine_3.startPoint())
|
|
|
|
Sketch_1.setCoincident(SketchLine_3.endPoint(), SketchLine_4.startPoint())
|
|
|
|
Sketch_1.setHorizontal(SketchLine_1.result())
|
|
|
|
Sketch_1.setVertical(SketchLine_2.result())
|
|
|
|
Sketch_1.setHorizontal(SketchLine_3.result())
|
|
|
|
Sketch_1.setVertical(SketchLine_4.result())
|
|
|
|
Sketch_1.setEqual(SketchLine_3.result(), SketchLine_4.result())
|
|
|
|
Sketch_1.setLength(SketchLine_1.result(), 100)
|
|
|
|
|
|
|
|
### Create SketchLine
|
|
|
|
SketchLine_5 = Sketch_1.addLine(0, 50, 100, 50)
|
|
|
|
Sketch_1.setCoincident(SketchLine_5.startPoint(), SketchLine_2.result())
|
|
|
|
Sketch_1.setCoincident(SketchLine_5.endPoint(), SketchLine_4.result())
|
|
|
|
Sketch_1.setHorizontal(SketchLine_5.result())
|
|
|
|
|
|
|
|
### Create SketchLine
|
|
|
|
SketchLine_6 = Sketch_1.addLine(50, 50.00000000000001, 50, 0)
|
|
|
|
Sketch_1.setCoincident(SketchLine_6.endPoint(), SketchLine_1.result())
|
|
|
|
Sketch_1.setVertical(SketchLine_6.result())
|
|
|
|
Sketch_1.setCoincident(SketchLine_6.startPoint(), SketchLine_5.result())
|
|
|
|
Sketch_1.setMiddlePoint(SketchLine_6.startPoint(), SketchLine_5.result())
|
|
|
|
Sketch_1.setMiddlePoint(SketchLine_5.startPoint(), SketchLine_2.result())
|
|
|
|
model.do()
|
|
|
|
|
|
|
|
### Create Extrusion
|
|
|
|
Extrusion_1 = model.addExtrusion(Part_1_doc, [model.selection("COMPOUND", "Sketch_1")], model.selection(), 100, 0, "Faces|Wires")
|
|
|
|
|
|
|
|
### Create Group
|
|
|
|
Group_1 = model.addGroup(Part_1_doc, "Faces", [model.selection("FACE", "Extrusion_1_1_1/Generated_Face&Sketch_1/SketchLine_5"), model.selection("FACE", "(Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_4)(Extrusion_1_1_3/From_Face)(Extrusion_1_1_3/To_Face)(Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_3)2(Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_2)2")])
|
|
|
|
Group_1.setName("crack_1")
|
|
|
|
Group_1.result().setName("crack_1")
|
|
|
|
|
|
|
|
### Create Group
|
|
|
|
Group_2 = model.addGroup(Part_1_doc, "Faces", [model.selection("FACE", "Extrusion_1_1_1/Generated_Face&Sketch_1/SketchLine_6")])
|
|
|
|
Group_2.setName("crack_2")
|
|
|
|
Group_2.result().setName("crack_2")
|
|
|
|
|
|
|
|
### Create Group
|
|
|
|
Group_3 = model.addGroup(Part_1_doc, "Faces", [model.selection("COMPSOLID", "Extrusion_1_1")])
|
|
|
|
Group_3.setName("all_faces")
|
|
|
|
Group_3.result().setName("all_faces")
|
|
|
|
|
|
|
|
### Create GroupSubstraction
|
|
|
|
GroupSubstraction_1 = model.addGroupSubstraction(Part_1_doc, [model.selection("COMPOUND", "all_faces")], [model.selection("COMPOUND", "crack_1"), model.selection("COMPOUND", "crack_2")])
|
|
|
|
GroupSubstraction_1.result().setName("sides")
|
|
|
|
|
|
|
|
### Create Group
|
|
|
|
Group_4 = model.addGroup(Part_1_doc, "Edges", [model.selection("EDGE", "[Extrusion_1_1_3/Generated_Face&Sketch_1/SketchLine_3][Extrusion_1_1_3/To_Face]")])
|
|
|
|
Group_4.setName("top_edge")
|
|
|
|
Group_4.result().setName("top_edge")
|
|
|
|
|
|
|
|
### Create Group
|
|
|
|
Group_5 = model.addGroup(Part_1_doc, "Solids", [model.selection("SOLID", "Extrusion_1_1_3")])
|
|
|
|
Group_5.setName("Solid_1")
|
|
|
|
Group_5.result().setName("Solid_1")
|
|
|
|
|
|
|
|
### Create Group
|
|
|
|
Group_6 = model.addGroup(Part_1_doc, "Solids", [model.selection("SOLID", "Extrusion_1_1_1")])
|
|
|
|
Group_6.setName("Solid_2")
|
|
|
|
Group_6.result().setName("Solid_2")
|
|
|
|
|
|
|
|
### Create Group
|
|
|
|
Group_7 = model.addGroup(Part_1_doc, "Solids", [model.selection("SOLID", "Extrusion_1_1_2")])
|
|
|
|
Group_7.setName("Solid_3")
|
|
|
|
Group_7.result().setName("Solid_3")
|
|
|
|
|
|
|
|
model.end()
|
|
|
|
|
|
|
|
###
|
|
|
|
### SHAPERSTUDY component
|
|
|
|
###
|
|
|
|
|
|
|
|
model.publishToShaperStudy()
|
|
|
|
import SHAPERSTUDY
|
|
|
|
shapes = SHAPERSTUDY.shape(model.featureStringId(Extrusion_1))
|
|
|
|
|
|
|
|
Extrusion_1_1 = shapes[0]
|
|
|
|
groups = shapes[1:]
|
|
|
|
|
|
|
|
# dict of groups by their name
|
|
|
|
d_groups = {}
|
|
|
|
for gr in groups:
|
|
|
|
name = gr.GetName()
|
|
|
|
d_groups[name] = gr
|
|
|
|
|
|
|
|
###
|
|
|
|
### SMESH component
|
|
|
|
###
|
|
|
|
|
|
|
|
import SMESH, SALOMEDS
|
|
|
|
from salome.smesh import smeshBuilder
|
|
|
|
|
|
|
|
smesh = smeshBuilder.New()
|
|
|
|
|
|
|
|
# Create an hexahedral mesh or polyhedral mesh
|
|
|
|
# @param algo: "hexahedra", "polyhedra" or "polygons"
|
|
|
|
def createMesh(algo):
|
|
|
|
|
|
|
|
nb_segs = 5
|
|
|
|
Mesh_1 = smesh.Mesh(Extrusion_1_1)
|
|
|
|
mesh_name = "Mesh_%s"%algo
|
|
|
|
Mesh_1.SetName(mesh_name)
|
|
|
|
|
|
|
|
algo_1d = Mesh_1.Segment()
|
|
|
|
algo_1d.NumberOfSegments(nb_segs)
|
|
|
|
|
|
|
|
if algo == "hexahedra":
|
|
|
|
Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE)
|
|
|
|
Mesh_1.Hexahedron(algo=smeshBuilder.Hexa)
|
|
|
|
elif algo == "polyhedra":
|
|
|
|
Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE)
|
|
|
|
Mesh_1.Polyhedron()
|
|
|
|
elif algo == "polygons":
|
|
|
|
Mesh_1.Polygon()
|
|
|
|
Mesh_1.Polyhedron()
|
|
|
|
else:
|
|
|
|
raise Exception("not expected algo: ", algo)
|
|
|
|
|
|
|
|
d_mesh_groups = {}
|
|
|
|
# Create group of faces
|
|
|
|
for name, gr in d_groups.items():
|
|
|
|
if name.startswith("crack") or name.startswith("Solid_"):
|
|
|
|
gr_mesh = Mesh_1.Group(gr)
|
|
|
|
d_mesh_groups[name] = gr_mesh
|
|
|
|
|
|
|
|
# Group on nodes
|
|
|
|
gr_sides_1 = Mesh_1.GroupOnGeom(d_groups["sides"],'sides',SMESH.NODE)
|
|
|
|
|
|
|
|
# sub-mesh on top edge
|
|
|
|
algo_1d_sub = Mesh_1.Segment(geom=d_groups["top_edge"])
|
|
|
|
algo_1d_sub.NumberOfSegments(2*nb_segs)
|
|
|
|
algo_1d_sub.Propagation()
|
|
|
|
|
|
|
|
isDone = Mesh_1.Compute()
|
2023-02-21 18:59:44 +05:00
|
|
|
if not isDone:
|
|
|
|
raise Exception("Error when computing Mesh")
|
2021-09-24 18:44:49 +05:00
|
|
|
|
|
|
|
nb_nodes = Mesh_1.NbNodes()
|
|
|
|
# Create 2 cracks by two calls of DoubleNodeElemGroups
|
|
|
|
|
|
|
|
# FIRST CRACK
|
|
|
|
# get affected elements on crack_1
|
|
|
|
[ affectedVolumes_1, affectedFaces_1, affectedEdges_1 ] = Mesh_1.AffectedElemGroupsInRegion( [ d_mesh_groups["crack_1" ] ], [ gr_sides_1 ], None )
|
|
|
|
# affectedVolumes_1 is d_mesh_groups["Solid_1"] => use one or the other
|
|
|
|
# double nodes on crack_1
|
|
|
|
[ crack_1_double_faces, crack_1_double_nodes ] = Mesh_1.DoubleNodeElemGroups( [ d_mesh_groups["crack_1" ] ], [ gr_sides_1 ], [ affectedVolumes_1, affectedFaces_1, affectedEdges_1 ], 1, 1 )
|
|
|
|
|
|
|
|
# check new nodes were added
|
|
|
|
new_nb_nodes_1 = Mesh_1.NbNodes()
|
|
|
|
assert new_nb_nodes_1 > nb_nodes
|
|
|
|
|
|
|
|
# check number of new nodes
|
|
|
|
if algo != "polygons":
|
|
|
|
assert new_nb_nodes_1-nb_nodes == (nb_segs*2-1)*(nb_segs-1)
|
|
|
|
else:
|
|
|
|
assert new_nb_nodes_1-nb_nodes == nb_segs-1
|
|
|
|
|
|
|
|
# check new nodes where affected to volume elements
|
|
|
|
affectedVolumes_1_nodes = affectedVolumes_1.GetNodeIDs()
|
|
|
|
for n in range(nb_nodes +1, new_nb_nodes_1):
|
|
|
|
assert n in affectedVolumes_1_nodes, "New node not affected to affectedVolumes_1 in %s"%mesh_name
|
|
|
|
|
|
|
|
# SECOND CRACK
|
|
|
|
# get affected elements on crack_2
|
|
|
|
[ affectedVolumes_2, affectedFaces_2, affectedEdges_2 ] = Mesh_1.AffectedElemGroupsInRegion( [ d_mesh_groups["crack_2" ] ], [ gr_sides_1 ], None )
|
|
|
|
# double nodes on crack_2
|
|
|
|
# affectedVolumes_2 is d_mesh_groups["Solid_3"] => use one or the other
|
|
|
|
[ crack_2_double_faces, crack_2_double_nodes ] = Mesh_1.DoubleNodeElemGroups( [ d_mesh_groups["crack_2" ] ], [ gr_sides_1 ], [ affectedVolumes_2, affectedFaces_2, affectedEdges_2 ], 1, 1 )
|
|
|
|
|
|
|
|
# check new nodes were added
|
|
|
|
new_nb_nodes_2 = Mesh_1.NbNodes()
|
|
|
|
assert new_nb_nodes_2 > new_nb_nodes_1
|
|
|
|
|
|
|
|
# check number of new nodes
|
|
|
|
if algo != "polygons":
|
|
|
|
assert new_nb_nodes_2-new_nb_nodes_1 == (nb_segs-1)*nb_segs
|
|
|
|
else:
|
|
|
|
assert new_nb_nodes_2-new_nb_nodes_1 == nb_segs-1
|
|
|
|
|
|
|
|
# check new nodes where affected to volume elements
|
|
|
|
affectedVolumes_2_nodes = affectedVolumes_2.GetNodeIDs()
|
|
|
|
for n in range(new_nb_nodes_1 +1, new_nb_nodes_2):
|
|
|
|
assert n in affectedVolumes_2_nodes, "New node not affected to affectedVolumes_2 in %s"%mesh_name
|
|
|
|
|
|
|
|
createMesh("hexahedra")
|
|
|
|
createMesh("polyhedra")
|
|
|
|
createMesh("polygons")
|
|
|
|
|
|
|
|
|
|
|
|
if salome.sg.hasDesktop():
|
|
|
|
salome.sg.updateObjBrowser()
|