# Creation of a PipeShellsWithoutPath

import salome
salome.salome_init()
import GEOM
from salome.geom import geomBuilder
geompy = geomBuilder.New()
import salome
gg = salome.ImportComponentGUI("GEOM")

# Add a section based on quadrangles
# ----------------------------------
def section(s, p1, p2=None, p3=None, p4=None):
    if p2==None:
        q = p1
    else:
        q = geompy.MakeQuad4Vertices(p1, p2, p3, p4)
        pass
    s.append(q)
    publish(q, "section")
    return q


# find distance between two points
# -------------------------------
def Dist(p1,p2):
    c1 = geompy.PointCoordinates(p1)
    c2 = geompy.PointCoordinates(p2)
    return math.sqrt( (c2[0]-c1[0])*(c2[0]-c1[0]) +
                      (c2[1]-c1[1])*(c2[1]-c1[1]) +
                      (c2[2]-c1[2])*(c2[2]-c1[2]) )


# return middle point
# -------------------------------
def MiddleVert(p1,p2):
    c1 = geompy.PointCoordinates(p1)
    c2 = geompy.PointCoordinates(p2)
    return geompy.MakeVertex( (c2[0]+c1[0])/2, (c2[1]+c1[1])/2, (c2[2]+c1[2])/2 )


# Complex section
# result - 16 quads from lines
# pnt - point from path
# vec - direction from path
def MakeComplexSect(pnt,vec,rmax,rmin,nb):
    dang = 1.0/nb/2
    cmax = geompy.MakeCircle(pnt,vec,rmax)
    cmin = geompy.MakeCircle(pnt,vec,rmin)
    faces = []
    for i in range(0,2*nb,2):
        p1 = geompy.MakeVertexOnCurve(cmin,dang*i)
        p2 = geompy.MakeVertexOnCurve(cmax,dang*(i+1))
        p3 = geompy.MakeVertexOnCurve(cmin,dang*(i+2))
        f = geompy.MakeQuad4Vertices(pnt,p1,p2,p3)
        faces.append(f)
        pass
    shell = geompy.MakeSewing(faces,1.e-6)
    return shell


#=======================================================
#       Create simple path and receive points
#              for section creation
#=======================================================
WirePath = geompy.MakeSketcher("Sketcher:F 0 0:T 60 0:T 40 0:R 0:C 100 90:",
                               [0, 0, 0, 0, 0, 1, 1, 0, 0])
vs = geompy.SubShapeAll(WirePath, geompy.ShapeType["VERTEX"])

#=======================================================
#                 Create shell sections
#=======================================================
shells = []
subbases = []
locs = []

# 1 section
shell = MakeComplexSect(vs[0], geompy.MakeVectorDXDYDZ(1,0,0), 60, 40, 16)
shells.append(shell)
vs1 = geompy.SubShapeAllSortedCentres(shell,geompy.ShapeType["VERTEX"])
locs.append(vs1[17])

# 2 section
shell = MakeComplexSect(vs[1], geompy.MakeVectorDXDYDZ(1,0,0), 80, 30, 16)
shells.append(shell)
vs2 = geompy.SubShapeAllSortedCentres(shell,geompy.ShapeType["VERTEX"])
locs.append(vs2[17])

# 3 section
shell = MakeComplexSect(vs[2], geompy.MakeVectorDXDYDZ(1,0,0), 60, 40, 16)
shells.append(shell)
vs3 = geompy.SubShapeAllSortedCentres(shell,geompy.ShapeType["VERTEX"])
locs.append(vs3[17])

# 4 section
shell = MakeComplexSect(vs[3], geompy.MakeVectorDXDYDZ(0,1,0), 40, 35, 16)
shells.append(shell)
vs4 = geompy.SubShapeAllSortedCentres(shell,geompy.ShapeType["VERTEX"])
locs.append(vs4[17])


#===========================================================
#                   Create Pipe
#===========================================================

Pipe = geompy.MakePipeShellsWithoutPath(shells,locs)

# add objects in the study
resc = geompy.MakeCompound(shells)
id_sec = geompy.addToStudy(resc,"sections")
resl = geompy.MakeCompound(locs)
id_loc = geompy.addToStudy(resl,"locations")
id_pipe = geompy.addToStudy(Pipe, "Pipe")

# display the sections, locations and pipe
gg.createAndDisplayGO(id_sec)
gg.createAndDisplayGO(id_loc)
gg.createAndDisplayGO(id_pipe)
gg.setDisplayMode(id_pipe,1)