import geompy

# make a block with a thin bar inside,
# bar section is a triangle with side = 1.0
blockSize = 80
triangleFace = geompy.MakeSketcher("Sketcher:F 0.000000 0.000000:TT 1.000000 0.000000:TT 0.500000 0.866020:WF", [30,30,30, 0,0,1, 1,0,0] )
bar = geompy.MakePrismDXDYDZ(triangleFace, 0, 0, 100)
block = geompy.MakeBoxDXDYDZ(blockSize, blockSize, blockSize)
partition = geompy.MakePartition([bar, block])

geompy.addToStudy( partition, 'partition' )

# get 2 solids of a bar
barSubs = []
for s in geompy.SubShapeAll(partition, geompy.ShapeType["SOLID"]):
  volume = geompy.BasicProperties( s )[2]
  if volume < 0.5 * blockSize * blockSize * blockSize:
    barSubs.append( s )

assert len( barSubs ) == 2
bar = geompy.MakeCompound( barSubs )
geompy.addToStudyInFather( partition, bar, 'bar' )

# get triangle faces
triangles = []
for f in geompy.SubShapeAll(partition, geompy.ShapeType["FACE"]):
  if len( geompy.SubShapeAllIDs( f, geompy.ShapeType["EDGE"] )) == 3:
    triangles.append( f )

assert len( triangles ) == 3
triangles = geompy.MakeCompound( triangles )
geompy.addToStudyInFather( partition, triangles, 'traingle faces' )


import smesh

# mesh the block with NETGEN-1D2D3D
Mesh_1 = smesh.Mesh(partition)
NETGEN_2D3D = Mesh_1.Tetrahedron(algo=smesh.NETGEN_1D2D3D)
NETGEN_3D_Parameters = NETGEN_2D3D.Parameters()
NETGEN_3D_Parameters.SetMaxSize( 15.7797 )
NETGEN_3D_Parameters.SetFineness( 2 )
NETGEN_3D_Parameters.SetMinSize( 2.99999 )

# 1D mesh of a bar
Mesh_1.Segment(bar).Arithmetic1D(4,10)

# mesh triangles with 1 segment per size
Mesh_1.Segment(triangles).NumberOfSegments(1)

Mesh_1.Compute()

# make 2d mesh of bar disappear, Tolerance is a bit higher than triangles side size
coincident_nodes_on_bar = Mesh_1.FindCoincidentNodesOnPart( Mesh_1, Tolerance=1.1 )
Mesh_1.MergeNodes( coincident_nodes_on_bar )

# remove excess segements on bar
equal_segements = Mesh_1.FindEqualElements( Mesh_1 )
Mesh_1.MergeElements( equal_segements )

# move all nodes of a bar on one line. In GUI this can be achived by
# adjustment of one group of merged nodes.
for e in geompy.SubShapeAll( bar, geompy.ShapeType["EDGE"]):
  node_on_edge = Mesh_1.GetSubMeshNodesId( e, all=True )
  for n in node_on_edge:
    x,y,z = Mesh_1.GetNodeXYZ( n )
    Mesh_1.MoveNode( n, 31, 30, z )

if salome.sg.hasDesktop():
  salome.sg.updateObjBrowser(1)
