3 \page tui_quality_controls_page Quality Controls
5 \section tui_free_borders Free Borders
13 # create open shell: a box without one plane
14 box = geompy.MakeBox(0., 0., 0., 20., 20., 15.)
15 FaceList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"])
16 FaceList.remove(FaceList[5])
17 box = geompy.MakeShell(FaceList)
18 idbox = geompy.addToStudy(box, "box")
21 mesh = smesh.Mesh(box, "Mesh_free_borders")
23 algo.NumberOfSegments(5)
24 algo = mesh.Triangle()
25 algo.MaxElementArea(20.)
28 # criterion : free borders
29 aFilter = smesh.GetFilter(smesh.EDGE, smesh.FT_FreeBorders)
30 anIds = mesh.GetIdsFromFilter(aFilter)
33 print "Criterion: Free borders Nb = ", len(anIds)
35 for i in range(len(anIds)):
36 if j > 20: j = 1; print ""
43 aGroup = mesh.CreateGroup(SMESH.EDGE, "Free borders")
46 salome.sg.updateObjBrowser(1)
49 \section tui_borders_at_multiconnection Borders at Multiconnection
58 # create open shell: a box without one plane
59 box = geompy.MakeBox(0., 0., 0., 20., 20., 15.)
60 FaceList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"])
61 FaceList.remove(FaceList[5])
62 box = geompy.MakeShell(FaceList)
63 idbox = geompy.addToStudy(box, "box")
66 mesh = smesh.Mesh(box, "Mesh_borders_at_multi-connections")
68 algo.NumberOfSegments(5)
69 algo = mesh.Triangle()
70 algo.MaxElementArea(20.)
73 # Criterion : Borders at multi-connection
76 aFilter = smesh.GetFilter(smesh.EDGE, smesh.FT_MultiConnection, smesh.FT_EqualTo, nb_conn)
77 anIds = mesh.GetIdsFromFilter(aFilter)
80 print "Criterion: Borders at multi-connections Nb = ", len(anIds)
82 for i in range(len(anIds)):
83 if j > 20: j = 1; print ""
90 aGroup = mesh.CreateGroup(SMESH.EDGE, "Borders at multi-connections")
93 salome.sg.updateObjBrowser(1)
96 \section tui_length_1d Length 1D
104 # create open shell: a box without one plane
105 box = geompy.MakeBox(0., 0., 0., 20., 20., 15.)
106 FaceList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"])
107 FaceList.remove(FaceList[5])
108 box = geompy.MakeShell(FaceList)
109 idbox = geompy.addToStudy(box, "box")
112 mesh = smesh.Mesh(box, "Mesh_Length_1D")
113 algo = mesh.Segment()
114 algo.NumberOfSegments(5)
115 algo = mesh.Triangle()
116 algo.MaxElementArea(20.)
119 # Criterion : Length > 3.
122 aFilter = smesh.GetFilter(smesh.EDGE, smesh.FT_Length, smesh.FT_MoreThan, length_margin)
123 anIds = mesh.GetIdsFromFilter(aFilter)
126 print "Criterion: Edges length > ", length_margin, " Nb = ", len(anIds)
128 for i in range(len(anIds)):
129 if j > 20: j = 1; print ""
136 aGroup = mesh.CreateGroup(SMESH.EDGE, "Edges with length > " + `length_margin`)
139 salome.sg.updateObjBrowser(1)
142 \section tui_free_edges Free Edges
145 import SMESH_mechanic
147 smesh = SMESH_mechanic.smesh
148 mesh = SMESH_mechanic.mesh
149 salome = SMESH_mechanic.salome
151 aFilterMgr = smesh.CreateFilterManager()
153 # Remove some elements to obtain free edges
154 # Criterion : AREA > 95.
157 aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_Area, smesh.FT_MoreThan, area_margin)
159 anIds = mesh.GetIdsFromFilter(aFilter)
161 mesh.RemoveElements(anIds)
163 # Criterion : Free Edges
164 aBorders = mesh.GetFreeBorders()
167 aGroupF = mesh.CreateGroup(SMESH.FACE, "Faces with free edges")
168 aGroupN = mesh.CreateGroup(SMESH.NODE, "Nodes on free edges")
170 # fill groups with elements, corresponding to the criterion
172 print "Criterion: Free edges Nb = ", len(aBorders)
173 for i in range(len(aBorders)):
174 aBorder = aBorders[i]
175 print "Face # ", aBorder.myElemId, " : Edge between nodes (",
176 print aBorder.myPnt1, ", ", aBorder.myPnt2, ")"
178 aGroupF.Add([aBorder.myElemId])
179 aGroupN.Add([aBorder.myPnt1, aBorder.myPnt2])
181 salome.sg.updateObjBrowser(1)
184 \section tui_free_nodes Free Nodes
193 box = geompy.MakeBox(0., 0., 0., 100., 200., 300.)
194 idbox = geompy.addToStudy(box, "box")
197 mesh = smesh.Mesh(box, "Mesh_free_nodes")
198 algo = mesh.Segment()
199 algo.NumberOfSegments(10)
200 algo = mesh.Triangle(smesh.MEFISTO)
201 algo.MaxElementArea(150.)
204 # Remove some elements to obtain free nodes
205 # Criterion : AREA < 80.
208 aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_Area, smesh.FT_LessThan, area_margin)
210 anIds = mesh.GetIdsFromFilter(aFilter)
212 mesh.RemoveElements(anIds)
214 # criterion : free nodes
215 aFilter = smesh.GetFilter(smesh.NODE, smesh.FT_FreeNodes)
216 anNodeIds = mesh.GetIdsFromFilter(aFilter)
219 aGroup = mesh.CreateEmptyGroup(smesh.NODE, "Free_nodes")
220 aGroup.Add(anNodeIds)
223 print "Criterion: Free nodes Nb = ", len(anNodeIds)
225 for i in range(len(anNodeIds)):
226 if j > 20: j = 1; print ""
232 salome.sg.updateObjBrowser(1)
235 \section tui_free_faces Free Faces
241 ####### GEOM part ########
243 Box_1 = geompy.MakeBoxDXDYDZ(200, 200, 200)
244 Box_1_vertex_6 = geompy.GetSubShape(Box_1, [6])
245 Box_1 = geompy.GetMainShape(Box_1_vertex_6)
246 Box_1_vertex_16 = geompy.GetSubShape(Box_1, [16])
247 Box_1 = geompy.GetMainShape(Box_1_vertex_16)
248 Box_1_vertex_11 = geompy.GetSubShape(Box_1, [11])
249 Box_1 = geompy.GetMainShape(Box_1_vertex_11)
250 Plane_1 = geompy.MakePlaneThreePnt(Box_1_vertex_6, Box_1_vertex_16, Box_1_vertex_11, 2000)
251 Partition_1 = geompy.MakePartition([Box_1], [Plane_1], [], [], geompy.ShapeType["SOLID"], 0, [], 0)
253 Box_1_vertex_19 = geompy.GetSubShape(Box_1, [19])
254 Box_1_vertex_21 = geompy.GetSubShape(Box_1, [21])
255 Plane_2 = geompy.MakePlaneThreePnt(Box_1_vertex_16, Box_1_vertex_19, Box_1_vertex_21, 2000)
257 geompy.addToStudy( Box_1, "Box_1" )
258 geompy.addToStudyInFather( Box_1, Box_1_vertex_6, "Box_1:vertex_6" )
259 geompy.addToStudyInFather( Box_1, Box_1_vertex_16, "Box_1:vertex_16" )
260 geompy.addToStudyInFather( Box_1, Box_1_vertex_11, "Box_1:vertex_11" )
261 geompy.addToStudy( Plane_1, "Plane_1" )
262 geompy.addToStudy( Partition_1, "Partition_1" )
263 geompy.addToStudyInFather( Box_1, Box_1_vertex_19, "Box_1:vertex_19" )
264 geompy.addToStudyInFather( Box_1, Box_1_vertex_21, "Box_1:vertex_21" )
265 geompy.addToStudy( Plane_2, "Plane_2" )
267 ###### SMESH part ######
273 Mesh_1 = smesh.Mesh(Partition_1)
274 Regular_1D = Mesh_1.Segment()
275 Max_Size_1 = Regular_1D.MaxSize(34.641)
276 MEFISTO_2D = Mesh_1.Triangle()
277 Tetrahedron_Netgen = Mesh_1.Tetrahedron(algo=smesh.NETGEN)
278 isDone = Mesh_1.Compute()
280 # create a group of free faces
281 aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_FreeFaces )
282 aFaceIds = Mesh_1.GetIdsFromFilter(aFilter)
284 aGroup = Mesh_1.CreateEmptyGroup(smesh.FACE, "Free_faces")
288 print "Criterion: Free nodes Nb = ", len(anNodeIds)
290 for i in range(len(aFaceIds)):
291 if j > 20: j = 1; print ""
297 #filter faces from plane 2
298 aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_BelongToPlane, Plane_2)
299 aFaceIds = Mesh_1.GetIdsFromFilter(aFilter)
300 aGroup.Remove(aFaceIds)
302 # create a group of shared faces (located on partition boundary inside box)
303 aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_BelongToPlane, Plane_1)
304 aFaceIds = Mesh_1.GetIdsFromFilter(aFilter)
306 aGroup = Mesh_1.CreateEmptyGroup(smesh.FACE, "Shared_faces")
309 salome.sg.updateObjBrowser(1)
312 \section tui_length_2d Length 2D
320 # create open shell: a box without one plane
321 box = geompy.MakeBox(0., 0., 0., 20., 20., 15.)
322 FaceList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"])
323 FaceList.remove(FaceList[5])
324 box = geompy.MakeShell(FaceList)
325 idbox = geompy.addToStudy(box, "box")
328 mesh = smesh.Mesh(box, "Mesh_Length_2D")
329 algo = mesh.Segment()
330 algo.NumberOfSegments(5)
331 algo = mesh.Triangle()
332 algo.MaxElementArea(20.)
335 # Criterion : Length 2D > 5.7
338 aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_Length2D, smesh.FT_MoreThan, length_margin)
340 anIds = mesh.GetIdsFromFilter(aFilter)
343 print "Criterion: Edges length 2D > ", length_margin, " Nb = ", len(anIds)
345 for i in range(len(anIds)):
346 if j > 20: j = 1; print ""
353 aGroup = mesh.CreateEmptyGroup(smesh.FACE, "Faces with length 2D > " + `length_margin`)
356 salome.sg.updateObjBrowser(1)
359 \section tui_borders_at_multiconnection_2d Borders at Multiconnection 2D
367 # create a compound of two glued boxes
368 box1 = geompy.MakeBox(0., 0., 0., 20., 20., 15.)
369 box2 = geompy.MakeTranslation(box1, 0., 20., 0)
370 comp = geompy.MakeCompound([box1, box2])
371 box = geompy.MakeGlueFaces(comp, 0.000001)
372 idbox = geompy.addToStudy(box, "box")
375 mesh = smesh.Mesh(box, "Box compound : 2D triangle mesh")
376 algo = mesh.Segment()
377 algo.NumberOfSegments(5)
378 algo = mesh.Triangle()
379 algo.MaxElementArea(20.)
382 # Criterion : MULTI-CONNECTION 2D = 3
385 aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_MultiConnection2D, smesh.FT_EqualTo, nb_conn)
387 anIds = mesh.GetIdsFromFilter(aFilter)
390 print "Criterion: Borders at multi-connection 2D = ", nb_conn, " Nb = ", len(anIds)
392 for i in range(len(anIds)):
393 if j > 20: j = 1; print ""
400 aGroup = mesh.CreateEmptyGroup(smesh.FACE, "Borders at multi-connection 2D = " + `nb_conn`)
403 salome.sg.updateObjBrowser(1)
406 \section tui_area Area
409 import SMESH_mechanic
411 smesh = SMESH_mechanic.smesh
412 mesh = SMESH_mechanic.mesh
413 salome = SMESH_mechanic.salome
415 # Criterion : AREA > 100.
418 aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_Area, smesh.FT_MoreThan, area_margin)
420 anIds = mesh.GetIdsFromFilter(aFilter)
423 print "Criterion: Area > ", area_margin, " Nb = ", len(anIds)
425 for i in range(len(anIds)):
426 if j > 20: j = 1; print ""
433 aGroup = mesh.CreateEmptyGroup(smesh.FACE, "Area > " + `area_margin`)
436 salome.sg.updateObjBrowser(1)
439 \section tui_taper Taper
442 import SMESH_mechanic
444 smesh = SMESH_mechanic.smesh
445 mesh = SMESH_mechanic.mesh
446 salome = SMESH_mechanic.salome
448 # Criterion : Taper > 3e-20
451 aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_Taper, smesh.FT_MoreThan, taper_margin)
453 anIds = mesh.GetIdsFromFilter(aFilter)
456 print "Criterion: Taper > ", taper_margin, " Nb = ", len(anIds)
458 for i in range(len(anIds)):
459 if j > 20: j = 1; print ""
466 aGroup = mesh.CreateEmptyGroup(smesh.FACE, "Taper > " + `taper_margin`)
469 salome.sg.updateObjBrowser(1)
472 \section tui_aspect_ratio Aspect Ratio
475 import SMESH_mechanic
477 smesh = SMESH_mechanic.smesh
478 mesh = SMESH_mechanic.mesh
479 salome = SMESH_mechanic.salome
481 # Criterion : ASPECT RATIO > 1.8
484 aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_AspectRatio, smesh.FT_MoreThan, ar_margin)
486 anIds = mesh.GetIdsFromFilter(aFilter)
489 print "Criterion: Aspect Ratio > ", ar_margin, " Nb = ", len(anIds)
491 for i in range(len(anIds)):
492 if j > 20: j = 1; print ""
499 aGroup = mesh.CreateEmptyGroup(smesh.FACE, "Aspect Ratio > " + `ar_margin`)
502 salome.sg.updateObjBrowser(1)
505 \section tui_minimum_angle Minimum Angle
508 import SMESH_mechanic
510 smesh = SMESH_mechanic.smesh
511 mesh = SMESH_mechanic.mesh
512 salome = SMESH_mechanic.salome
514 # Criterion : MINIMUM ANGLE < 35.
517 aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_MinimumAngle, smesh.FT_LessThan, min_angle)
519 anIds = mesh.GetIdsFromFilter(aFilter)
522 print "Criterion: Minimum Angle < ", min_angle, " Nb = ", len(anIds)
524 for i in range(len(anIds)):
525 if j > 20: j = 1; print ""
532 aGroup = mesh.CreateEmptyGroup(smesh.FACE, "Minimum Angle < " + `min_angle`)
536 salome.sg.updateObjBrowser(1)
539 \section tui_warping Warping
542 import SMESH_mechanic
544 smesh = SMESH_mechanic.smesh
545 mesh = SMESH_mechanic.mesh
546 salome = SMESH_mechanic.salome
548 # Criterion : WARP ANGLE > 1e-15
551 aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_Warping, smesh.FT_MoreThan, wa_margin)
553 anIds = mesh.GetIdsFromFilter(aFilter)
556 print "Criterion: Warp > ", wa_margin, " Nb = ", len(anIds)
558 for i in range(len(anIds)):
559 if j > 20: j = 1; print ""
566 aGroup = mesh.CreateEmptyGroup(smesh.FACE, "Warp > " + `wa_margin`)
570 salome.sg.updateObjBrowser(1)
573 \section tui_skew Skew
576 import SMESH_mechanic
578 smesh = SMESH_mechanic.smesh
579 mesh = SMESH_mechanic.mesh
580 salome = SMESH_mechanic.salome
582 # Criterion : Skew > 38.
585 aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_Skew, smesh.FT_MoreThan, skew_margin)
587 anIds = mesh.GetIdsFromFilter(aFilter)
590 print "Criterion: Skew > ", skew_margin, " Nb = ", len(anIds)
592 for i in range(len(anIds)):
593 if j > 20: j = 1; print ""
600 aGroup = mesh.CreateEmptyGroup(smesh.FACE, "Skew > " + `skew_margin`)
603 salome.sg.updateObjBrowser(1)
606 \section tui_max_element_length_2d Max Element Length 2D
609 import SMESH_mechanic
611 smesh = SMESH_mechanic.smesh
612 mesh = SMESH_mechanic.mesh
613 salome = SMESH_mechanic.salome
615 # Criterion : MAX ELEMENT LENGTH 2D > 10
618 aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_MaxElementLength2D, smesh.FT_MoreThan, mel_2d_margin)
620 anIds = mesh.GetIdsFromFilter(aFilter)
623 print "Criterion: Max Element Length 2D Ratio > ", mel_2d_margin, " Nb = ", len(anIds)
625 for i in range(len(anIds)):
626 if j > 20: j = 1; print ""
633 aGroup = mesh.CreateEmptyGroup(smesh.FACE, "Max Element Length 2D > " + `mel_2d_margin`)
636 salome.sg.updateObjBrowser(1)
639 \section tui_aspect_ratio_3d Aspect Ratio 3D
642 import SMESH_mechanic_tetra
644 smesh = SMESH_mechanic_tetra.smesh
645 mesh = SMESH_mechanic_tetra.mesh
646 salome = SMESH_mechanic_tetra.salome
648 # Criterion : ASPECT RATIO 3D > 4.5
651 aFilter = smesh.GetFilter(smesh.VOLUME, smesh.FT_AspectRatio3D, smesh.FT_MoreThan, ar_margin)
653 anIds = mesh.GetIdsFromFilter(aFilter)
656 print "Criterion: Aspect Ratio 3D > ", ar_margin, " Nb = ", len(anIds)
658 for i in range(len(anIds)):
659 if j > 20: j = 1; print ""
666 aGroup = mesh.CreateEmptyGroup(smesh.VOLUME, "Aspect Ratio 3D > " + `ar_margin`)
670 salome.sg.updateObjBrowser(1)
673 \section tui_volume Volume
676 import SMESH_mechanic_tetra
678 smesh = SMESH_mechanic_tetra.smesh
679 mesh = SMESH_mechanic_tetra.mesh
680 salome = SMESH_mechanic_tetra.salome
682 # Criterion : VOLUME < 7.
685 aFilter = smesh.GetFilter(smesh.VOLUME, smesh.FT_Volume3D, smesh.FT_LessThan, volume_margin)
687 anIds = mesh.GetIdsFromFilter(aFilter)
691 print "Criterion: Volume < ", volume_margin, " Nb = ", len(anIds)
693 for i in range(len(anIds)):
694 if j > 20: j = 1; print ""
701 aGroup = mesh.CreateEmptyGroup(smesh.VOLUME, "Volume < " + `volume_margin`)
705 salome.sg.updateObjBrowser(1)
708 \section tui_max_element_length_3d Max Element Length 3D
711 import SMESH_mechanic_tetra
713 smesh = SMESH_mechanic_tetra.smesh
714 mesh = SMESH_mechanic_tetra.mesh
715 salome = SMESH_mechanic_tetra.salome
717 # Criterion : MAX ELEMENT LENGTH 3D > 10
720 aFilter = smesh.GetFilter(smesh.FACE, smesh.FT_MaxElementLength3D, smesh.FT_MoreThan, mel_3d_margin)
722 anIds = mesh.GetIdsFromFilter(aFilter)
725 print "Criterion: Max Element Length 3D Ratio > ", mel_3d_margin, " Nb = ", len(anIds)
727 for i in range(len(anIds)):
728 if j > 20: j = 1; print ""
735 aGroup = mesh.CreateEmptyGroup(smesh.FACE, "Max Element Length 3D > " + `mel_3d_margin`)
738 salome.sg.updateObjBrowser(1)