# -*- coding: utf-8 -*-
"""
Created on Wed Dec 21 16:35:33 2016

@author: kenneth
"""
import sys
import salome
theStudy = salome.myStudy

import salome_notebook
notebook = salome_notebook.NoteBook(theStudy)
sys.path.insert( 0, r'/home/kenneth/Pins')

import GEOM
from salome.geom import geomBuilder
import math
import SALOMEDS
import  SMESH, SALOMEDS
from salome.smesh import smeshBuilder

#from COORDINATE_MODULE_2 import COORDINATE
geompy = geomBuilder.New(theStudy)

H = 2.

#createline just creates a line
def create_line(list_of_coordinates):   
    x,y,z = list_of_coordinates[0]    
    point1 = geompy.MakeVertex(x,y,z)
    lines = list()
    for coordinate in list_of_coordinates[1:]:
        x,y,z = coordinate
        point2 = geompy.MakeVertex(x,y,z)
        lines.append(geompy.MakeLineTwoPnt(point1,point2))
        point1 = point2
        #p11 = geompy.MakeWire(lines)
        #geompy.FuseCollinearEdgesWithinWire(p11)
    return  geompy.MakeWire(lines)

def create_edge(i,list_of_coordinates):   
    x,y,z = list_of_coordinates[0]    
    point1 = geompy.MakeVertex(x,y,z)
    lines = dict()
    for ii,coordinate in enumerate( list_of_coordinates[1:]):
        x,y,z = coordinate
        point2 = geompy.MakeVertex(x,y,z)
        #lines.append(geompy.MakeLineTwoPnt(point1,point2))
        lines[(i,ii)] = (geompy.MakeLineTwoPnt(point1,point2))
                
        point1 = point2
        #p11 = geompy.MakeWire(lines)
        #geompy.FuseCollinearEdgesWithinWire(p11)
    return lines #geompy.MakeWire(lines)
    
#wheat sheaf spits out the coordinates     
def wheat_sheaf(number_of_pins, radius_bottom, radius_inbetween, radius_top, z_bottom=0, z_inbetween=0.5*H, z_top = H):
    from math import pi,sin,cos
    thetas = [2*pi*i/number_of_pins for i in range(number_of_pins)]
    lines = list()
    for th in thetas:
        bottom_point = (radius_bottom*cos(th), radius_bottom*sin(th), z_bottom)
        inbetween_point = (radius_inbetween*cos(th), radius_inbetween*sin(th), z_inbetween)
        top_point = (radius_top*cos(th), radius_top*sin(th), z_top)
        lines.append([bottom_point,inbetween_point,top_point])
    return lines

def zig_zag(number_of_pins, radius_bottom,radius_bottomqrt,radius_half,radius_topqrt,radius_top,z_top = H,z_topqrt = 0.75*H,z_half = 0.5*H,z_bottomqrt = 0.25*H,z_bottom = 0):
    from math import pi,sin,cos
    thetas = [2*pi*i/number_of_pins for i in range(number_of_pins)]
    lines = list()
    for th in thetas:
        bottom_point = (radius_bottom*cos(th), radius_bottom*sin(th), z_bottom)
        bottomqtr_point = (radius_bottomqrt*cos(th),radius_bottomqrt*sin(th),z_bottomqrt)        
        half_point = (radius_half*cos(th), radius_half*sin(th), z_half)        
        topqtr_point = (radius_topqrt*cos(th), radius_topqrt*sin(th), z_topqrt)
        top_point = (radius_bottom*cos(th), radius_bottom*sin(th), z_top)
        lines.append([bottom_point,bottomqtr_point,half_point,topqtr_point,top_point])
    return lines


def extrudepins_zigzag(number_of_pins):
    pinsextr = dict()
    surfextr = dict()
    edges_dict = dict()
    ls_edge1 = dict()
    ls_edge2 = dict()
    #edges_dict_2 = dict()
    
    outer_wall_dis = 0.007525 + 0.0016
            
    if number_of_pins == 6:
        pincenter = pinface_bottom_centers(number_of_pins,0.024855)
        radii = [0.024855,0.024855,0.024855,0.024855,0.02485]
    elif number_of_pins == 12:
        pincenter = pinface_bottom_centers(number_of_pins,0.051245)
        radii = [0.051245,0.051245,0.051245,0.051245,0.051245]
    else:
        pincenter = pinface_bottom_centers(number_of_pins,0.078645) 
        radii = [0.078645, 0.078645,0.078645, 0.078645,0.078645]
        
    face = pinface_bottom(0.007525,pincenter)  
    circ_edge = partition_circedges(outer_wall_dis, pincenter)  
    
    ## geompy making edges for the 
    for i, centreline in enumerate(zig_zag(number_of_pins,radii[0],radii[1],radii[2],radii[3],radii[4])):
        EDGES = create_edge(i,centreline)
        #EDGES = geompy.ExtractShapes(line, geompy.ShapeType["EDGE"], True)
        pinsextr[(i,0)] = geompy.MakePipe(face[i],EDGES[(i,0)],True)
        surfextr[(i,0)] = geompy.MakePipe(circ_edge[i], EDGES[(i,0)], True)
        ls_1,ls_2  = generate_straightedge (face[i],circ_edge[i], EDGES[(i,0)]) 
        ls_edge1[(i,0)] = geompy.MakePipe(ls_1, EDGES[(i,0)], True)
        ls_edge2[(i,0)] = geompy.MakePipe(ls_2, EDGES[(i,0)], True)        
        edges_dict[(i,0)] = EDGES[(i,0)]        
        for ii in range((len(EDGES) - 1)):
            loc = ii+1
            pipe, Down, Up, Other = pinsextr[(i,ii)]
            pinsextr[(i,loc)] = geompy.MakePipe(Up,EDGES[(i,loc)],True)
            
            pipe_1, Down_1, Up_1, Other_1= surfextr[(i,ii)]
            surfextr[(i,loc)] = geompy.MakePipe(Up_1, EDGES[(i,loc)],True)
            edges_dict[(i,loc)] = EDGES[(i,loc)]
            
            pipe2, Down2, Up2, Other2,t = ls_edge1[(i,ii)]
            ls_edge1[(i,loc)] = geompy.MakePipe(Up2,EDGES[(i,loc)],True)
             
            pipe3, Down3, Up3, Other3,t = ls_edge2[(i,ii)]
            ls_edge2[(i,loc)] = geompy.MakePipe(Up3,EDGES[(i,loc)],True)
                                               
    return pinsextr, surfextr, edges_dict, ls_edge1, ls_edge2   
    
def pinface_bottom_centers(number_of_pins,pin_radius):
    from math import pi,cos,sin
    thetas = [2*pi*i/number_of_pins for i in range(number_of_pins)]
    pinbottomcoordinate = list()
    for th in thetas:
        pinbottomcoordinate.append([pin_radius*cos(th), pin_radius*sin(th), 0])
    return pinbottomcoordinate

def pinface_bottom(Radius_cladding,pinloccoordinates):
    circularfaces = dict()
    for i, coordinate in enumerate(pinloccoordinates):
        key = i
        x,y,z = coordinate
        point3 = geompy.MakeVertex(x,y,z)
        pins = geompy.MakeCircle(point3,None,Radius_cladding)
        circularfaces[key] = geompy.MakeFaceWires([pins],1)
    return circularfaces
        
def partition_circedges(Radius_cladding,pinloccoordinates):
    pins = dict()    
    for i, coordinate in enumerate(pinloccoordinates):
        key = i
        x,y,z = coordinate
        point3 = geompy.MakeVertex(x,y,z)
        pins[key] = geompy.MakeCircle(point3,None,Radius_cladding)
    return pins


    
def extrude_partitions (geom_identifier,edge, path):
    partition = dict()
    pincenter = [0,0,0]#defined as origin for now will need to be modified later
    edge = partition
    return
    
 
    
def extrude_guidetube(guide_tube_rad):
    tubeextr = dict()
    tubeparti_extr = dict()
    ls_edge1 = dict() 
    ls_edge2 = dict()
    rad_parti = guide_tube_rad + 0.0016
    #rad_parti1 = guide_tube_rad + 0.0008    
    
    guideline = create_line([[0,0,0],[0,0,0.25*H],[0,0,0.5*H],[0,0,(0.75*H)],[0,0,H]])
    point = geompy.MakeVertex(0,0,0)
    edge0 = geompy.MakeCircle(point,None,guide_tube_rad)
    edge1 = geompy.MakeCircle(point, None, rad_parti)
    #edge2 = geompy.MakeCircle(point, None, rad_parti1)
    face = geompy.MakeFaceWires([edge0],1)
    EDGES = geompy.ExtractShapes(guideline, geompy.ShapeType["EDGE"], True)
    tubeextr[(0,0)] = geompy.MakePipe(face,EDGES[0],True)
    tubeparti_extr[0] = geompy.MakePipe(edge1,EDGES[0],True)
    ls_1,ls_2  = generate_straightedge (face,edge1, EDGES[0]) 
    ls_edge1[0] = geompy.MakePipe(ls_1, EDGES[0], True)
    ls_edge2[0] = geompy.MakePipe(ls_2, EDGES[0], True)
    print(ls_edge1[0],ls_edge2[0])

    #ls_edge2[0] = geompy.MakePipe(ls_2, EDGES[0], True) 
    for ii,line in enumerate (EDGES[1:]):
        loc = ii+1
        pipe,Down,Up,Other = tubeextr[(0,ii)]         
        tubeextr[(0,loc)] = geompy.MakePipe(Up,line,True)      

        pipe1,Down1,Up1,Other1 = tubeparti_extr[ii]         
        tubeparti_extr[loc] = geompy.MakePipe(Up1,line,True)  

        pipe2, Down2, Up2, Other2,t = ls_edge1[ii]         
        ls_edge1[loc] = geompy.MakePipe(Up2,line,True)     
        
        pipe3,Down3,Up3,Other3,t = ls_edge2[ii]         
        ls_edge2[loc] = geompy.MakePipe(Up3,line,True)         
    #ext = geompy.MakePipe(face,guideline)   
    return tubeextr, tubeparti_extr, ls_edge1, ls_edge2

def extrude_sleeve(sleeve_rad):
    sleeveextr = dict()
    sleeveparti_extr = dict()
    ls_edge1 = dict() 
    ls_edge2 = dict() 

    sleeve_parti = sleeve_rad - 0.0016
    #sleeve_parti1 = sleeve_rad - 0.0008    
    
    O = geompy.MakeVertex(0, 0, 0)
    line = create_line([[0,0,0],[0,0,0.25*H],[0,0,0.5*H],[0,0,(0.75*H)],[0,0,H]])
    domainedge0 = geompy.MakeCircle(O,None,sleeve_rad) 
    domainedge1 = geompy.MakeCircle(O,None,sleeve_parti) 
    #domainedge2 = geompy.MakeCircle(O,None,sleeve_parti1) 
    
    domainface = geompy.MakeFaceWires([domainedge0],1)
    EDGES = geompy.ExtractShapes(line, geompy.ShapeType["EDGE"], True)
    sleeveextr[(0,0)] = geompy.MakePipe(domainface,EDGES[0],True)
    sleeveparti_extr[0] = geompy.MakePipe(domainedge1,EDGES[0],True)
    ls_1,ls_2  = generate_straightedge (domainface,domainedge1, EDGES[0]) 
    ls_edge1[0] = geompy.MakePipe(ls_1, EDGES[0], True)
    ls_edge2[0] = geompy.MakePipe(ls_2, EDGES[0], True)     
    #sleeveparti_extr1[0] = geompy.MakePipe(domainedge2,EDGES[0],True)
    
    for ii,edge in enumerate (EDGES[1:]):
        loc = ii+1
        pipe,Down,Up,Other = sleeveextr[(0,ii)]         
        sleeveextr[(0,loc)] = geompy.MakePipe(Up,edge,True)
        
        pipe1,Down1,Up1,Other1 = sleeveparti_extr[ii]         
        sleeveparti_extr[loc] = geompy.MakePipe(Up1,edge,True)

        pipe2,Down2,Up2,Other2,t = ls_edge1[ii]         
        ls_edge1[loc] = geompy.MakePipe(Up2,edge,True)        

        pipe3,Down3,Up3,Other3,t = ls_edge2[ii]         
        ls_edge2[loc] = geompy.MakePipe(Up3,edge,True)         
    return sleeveextr, sleeveparti_extr, ls_edge1, ls_edge2
   
def boolen_object_operations(innerpins,middlepins,outerpins,sleeve,guidetubeext):
    final = dict()     
    for iy in range(len(sleeve)):     
        pipe,Down,Up,Other = guidetubeext[(0,iy)]
        sleevepipe,Down1,Up1,Other1 = sleeve[(0,iy)]
        final[iy] =geompy.MakeCut(sleevepipe,pipe,True)    
    #for iy in range(len(sleeve)-1) :        
     #   pipe,Down,Up,Other = guidetubeext[(0,0)]
 
      
    for i in range(6):
        for iy in range(len(sleeve)):
          pipe,Down,Up,Other = innerpins[(i,iy)] 
          #pipe_1,Down_1,Up_1,Other_1 = part_innerpins[(i,iy)]
          final[iy] =geompy.MakeCut(final[iy],pipe,True)  
          #final[iy] =geompy.MakeCut(final[iy],pipe_1,True)
    for i in range(12):
        for iy in range(len(sleeve)):
          pipe,Down,Up,Other = middlepins[(i,iy)] 
          #pipe_1,Down_1,Up_1,Other_1 = part_midpins[(i,iy)]
          final[iy] =geompy.MakeCut(final[iy],pipe,True)
          #final[iy] =geompy.MakeCut(final[iy],pipe_1,True)
          
    for i in range(18):
        for iy in range(len(sleeve)):
          pipe,Down,Up,Other = outerpins[(i,iy)] 
          #pipe_1,Down_1,Up_1,Other_1 = part_outerpins[(i,iy)]          
          final[iy] =geompy.MakeCut(final[iy],pipe,True)          
          #final[iy] =geompy.MakeCut(final[iy],pipe_1,True)
    
   
    return final   


    
def compound_meshes(compfuelbundle,solidbundle,Sleeve_edges,Pin_edges,Axial_edges,Sleeve_faces,Top_face,Bottom_face,Guidetubeface,Pin_faces): 
           
    from salome.StdMeshers import StdMeshersBuilder 
    smesh = smeshBuilder.New(theStudy)   
    
    SLEEVE_FACES = dict()    
    TOP_FACE = dict()
    BOTTOM_FACE = dict()
    GUIDETUBEFACE = dict()
    PIN_FACES = dict()    
    NBSLEEVEEDGES = 35
    NBAXIALEDGES = 50
    NBPINEDGES = 6
    NBRADIAL = 2
    #NBSleeveaxial = 40
    THICKNESSBNDRYLAYER = 0.0018
    NUMBERLAYERS = 3
    STRETCHFACTOR = 1.4 
    
    Mesh_1 = smesh.Mesh(compfuelbundle)    
    #HYBRID_3D = Mesh_1.Tetrahedron(algo=smeshBuilder.HYBRID)    
    #NETGEN_3D = Mesh_1.Tetrahedron()
    #NETGEN_2D = Mesh_1.Triangle(algo=smeshBuilder.NETGEN_1D2D)    
    #MEFISTO_2D = Mesh_1.Triangle(algo=smeshBuilder.MEFISTO)
    #status = Mesh_1.AddHypothesis(NETGEN_3D)
    #NETGEN_3D_Parameters = NETGEN_3D.Parameters()
    #NETGEN_3D_Parameters.SetMaxSize( 0.9 )
    #NETGEN_3D_Parameters.SetSecondOrder( 0 )
    #NETGEN_3D_Parameters.SetOptimize( 1 )
    #NETGEN_3D_Parameters.SetFineness( 3 )
    #NETGEN_3D_Parameters.SetMinSize( 0.008 )
    #NETGEN_3D_Parameters.SetUseSurfaceCurvature( 1 )
    #NETGEN_3D_Parameters.SetFuseEdges( 1 )
   
    for i in range(len(solidbundle)):
        #NETGEN_2D = Mesh_1.Triangle(algo=smeshBuilder.NETGEN_1D2D,geom=solidbundle[i])
        #NETGEN_2D_Parameters = NETGEN_2D.Parameters()
        ##NETGEN_2D_Parameters.SetMaxSize( 0.9 )
        #NETGEN_2D_Parameters.SetSecondOrder( 0 )
        #NETGEN_2D_Parameters.SetOptimize( 1 )
        #NETGEN_2D_Parameters.SetFineness( 3 )
        #NETGEN_2D_Parameters.SetMinSize( 0.008 )
        #NETGEN_2D_Parameters.SetUseSurfaceCurvature( 1 )
        #NETGEN_2D_Parameters.SetFuseEdges( 1 )
        #NETGEN_2D_Parameters.SetQuadAllowed( 0 )       
        #NETGEN_3D = Mesh_1.Tetrahedron()

        #NETGEN_3D_Parameters.SetQuadAllowed( 0 )   
              
        Regular_1D = Mesh_1.Segment(geom=Sleeve_edges[i])
        Nb_Segments_1 = Regular_1D.NumberOfSegments(NBSLEEVEEDGES)   
        Regular_1D_1 = Mesh_1.Segment(geom=Axial_edges[i])
        Nb_Segments_2 = Regular_1D_1.NumberOfSegments(NBAXIALEDGES)   
        Regular_1D_2 = Mesh_1.Segment(geom=Pin_edges[i])
        Nb_Segments_3 = Regular_1D_2.NumberOfSegments(NBPINEDGES)
        Regular_1D_3 = Mesh_1.Segment(geom=radial[i])
        Nb_Segments_4 = Regular_1D_3.NumberOfSegments(NBRADIAL)
        
        
        Quadrangle_2D = Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE,geom=Sleeve_faces[i])
        Quadrangle_Parameters_1 = Quadrangle_2D.QuadrangleParameters(StdMeshersBuilder.QUAD_TRIANGLE_PREF,-1,[],[])
        status = Mesh_1.AddHypothesis(Quadrangle_Parameters_1,Sleeve_faces[i])
                
        Quadrangle_2D_1 = Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE,geom=Guidetubeface[i])
        status = Mesh_1.AddHypothesis(Quadrangle_Parameters_1,Guidetubeface[i])
        
        Quadrangle_2D_2 = Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE,geom=Pin_faces[i])
        status = Mesh_1.AddHypothesis(Quadrangle_Parameters_1,Pin_faces[i])
        
        Quadrangle_2D_3 = Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE,geom=surfparti_pin[i])
        status = Mesh_1.AddHypothesis(Quadrangle_Parameters_1,surfparti_pin[i])

        #Quadrangle_2D_4 = Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE,geom=Bottom_face[i])
        #status = Mesh_1.AddHypothesis(Quadrangle_Parameters_1,surfparti_pin1[i])
        #Quadrangle_2D_8 = Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE,geom=Top_face[i])
        #status = Mesh_1.AddHypothesis(Quadrangle_Parameters_1,surfparti_guidetube1[i])

        Quadrangle_2D_5 = Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE,geom=surfparti_sleeve[i])
        status = Mesh_1.AddHypothesis(Quadrangle_Parameters_1,surfparti_sleeve[i])
        
        Quadrangle_2D_6 = Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE,geom=Union_str_partition[i])
        status = Mesh_1.AddHypothesis(Quadrangle_Parameters_1,Union_str_partition[i])

        Quadrangle_2D_7 = Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE,geom=surfparti_guidetube[i])
        status = Mesh_1.AddHypothesis(Quadrangle_Parameters_1,surfparti_guidetube[i])

        Quadrangle_2D_9 = Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE,geom=Unionannularfaces[i])
        status = Mesh_1.AddHypothesis(Quadrangle_Parameters_1,Unionannularfaces[i])

        Quadrangle_2D_10 = Mesh_1.Quadrangle(algo=smeshBuilder.QUADRANGLE,geom=sleeve_annular_faces[i])
        status = Mesh_1.AddHypothesis(Quadrangle_Parameters_1,sleeve_annular_faces[i])
        
        #status = Mesh_1.AddHypothesis(Quadrangle_Parameters_1,sleeve_annular_faces[i])
        #MEFISTO_2D = Mesh_1.Triangle(algo=smeshBuilder.MEFISTO,geom=Unionannularfaces[i])
        #MEFISTO_2D = Mesh_1.Triangle(algo=smeshBuilder.MEFISTO,geom=sleeve_annular_faces[i])
        
        MEFISTO_2D = Mesh_1.Triangle(algo=smeshBuilder.MEFISTO,geom=Top_face[i])
        MEFISTO_2D = Mesh_1.Triangle(algo=smeshBuilder.MEFISTO,geom=Bottom_face[i])
        
        Hexa_3D = Mesh_1.Hexahedron(algo=smeshBuilder.Hexa,geom=Unionsolidpins[i])
        Hexa_3D_1 = Mesh_1.Hexahedron(algo=smeshBuilder.Hexa,geom=annuli_solid_sleeve[i])
        #Hexa_3D_2 = Mesh_1.Hexahedron(algo=smeshBuilder.Hexa,geom=main_solid[i])
        #print(i)
        #Hexa_3D_2.SplitHexahedraIntoPrisms( Hexa_3D_2, [ 0, 0, 0 ], [ 0, 0, 1 ], 4, 0 )        
        NETGEN_3D = Mesh_1.Tetrahedron(algo=smeshBuilder.NETGEN,geom=main_solid[i])        
        NETGEN_3D_Parameters = NETGEN_3D.Parameters()
        NETGEN_3D_Parameters.SetFineness( 3 )
        NETGEN_3D_Parameters.SetOptimize( 1 )
        NETGEN_3D_Parameters.SetFuseEdges( 1 )
        #NETGEN_3D_Parameters.SetMaxSize( 0.2 )
        #NETGEN_3D_Parameters.SetMinSize( 0.008 )


        
    isDone = Mesh_1.Compute()
    
    for i in range(len(solidbundle)):
        SLEEVE_FACES[i] = Mesh_1.GroupOnGeom(Sleeve_faces[i],'Sleeve_faces{0}'.format(i),SMESH.FACE)            
        GUIDETUBEFACE[i] = Mesh_1.GroupOnGeom(Guidetubeface[i],'Guidetubeface{0}'.format(i),SMESH.FACE)
        PIN_FACES[i] = Mesh_1.GroupOnGeom(Pin_faces[i],'Pin_faces{0}'.format(i),SMESH.FACE)    
    BOTTOM_FACE[0] = Mesh_1.GroupOnGeom(Bottom_face[0],'Bottom_face0',SMESH.FACE)
    TOP_FACE[3] = Mesh_1.GroupOnGeom(Top_face[3],'Top_face3',SMESH.FACE)   
        #BOTTOM_FACE[i] = Mesh_1.GroupOnGeom(Bottom_face[i],'Bottom_face{0}'.format(i),SMESH.FACE)

   
    
def create_face_groups(numberpins,geometrys,innerpins,middlepins,outerpins,sleeveext,guidetubeext):
    faces = dict()

    for iy in range(len(geometrys)):
        faces[iy] = geompy.CreateGroup (geometrys[iy],geompy.ShapeType["FACE"])                           
        for i in range(numberpins): 
            if numberpins == 6:
                pins = innerpins 
            elif numberpins == 12:
                pins = middlepins 
            elif numberpins == 18:
                pins = outerpins                 
                #facesinner = list()
            pipe,Down,Up,Other = pins[(i,iy)]
            IDSNO = geompy.GetSameIDs(geometrys[iy],Other)
            geompy.AddObject(faces[iy],IDSNO[0])                

    return faces
    
def create_partition_groups(geometrys,surfaces):
    my_dict = dict()
    for iy in range(len(geometrys)):
        my_dict[iy] = geompy.CreateGroup (geometrys[iy], geompy.ShapeType["FACE"])
        for i in range(len(surfaces[iy])):            
            surf_place = geompy.GetInPlace(geometrys[iy], surfaces[iy][i], True)
            #face = geompy.ExtractShapes(surf_place)
            #for rr in surf_place:
            surf_id  = geompy.GetSameIDs(geometrys[iy], surf_place) 
            #print(iy,i,surf_id)
            geompy.AddObject(my_dict[iy],surf_id[0])
    return my_dict

def create_partition_groups_3(geometrys,surfaces):
    my_dict = dict()
    for iy in range(len(geometrys)):
        my_dict[iy] = geompy.CreateGroup (geometrys[iy], geompy.ShapeType["FACE"])
        for i in range(len(surfaces[iy])):            
            surf_place = geompy.GetInPlace(geometrys[iy], surfaces[iy][i], True)
            face = geompy.ExtractShapes(surf_place,  geompy.ShapeType["FACE"], True)
            for rr in face:
                surf_id  = geompy.GetSameIDs(geometrys[iy], rr) 
            #print(iy,i,surf_id)
                geompy.AddObject(my_dict[iy],surf_id[0])
    return my_dict
    
def create_partition_groups_2(state, geometrys, surfaces):
    my_dict = dict()
    if state ==1:
        for iy in range(len(geometrys)):
            my_dict[iy] = geompy.CreateGroup (geometrys[iy],geompy.ShapeType['FACE'])
            surf_place = geompy.GetInPlace(geometrys[iy], surfaces[iy][0], True)
            #surf_id  = geompy.GetSameIDs(geometrys[iy], surf_place)
            face = geompy.ExtractShapes(surf_place,  geompy.ShapeType["FACE"], True)
            for rr in face:
                surf_id  = geompy.GetSameIDs(geometrys[iy], rr)
                geompy.AddObject(my_dict[iy], surf_id[0])
    #return my_dict
    elif state ==2:
        for iy in range(len(geometrys)):
            my_dict[iy] = geompy.CreateGroup (geometrys[iy],geompy.ShapeType['FACE'])
            surf_place = geompy.GetInPlace(geometrys[iy], surfaces[iy][0], True)
            surf_id  = geompy.GetSameIDs(geometrys[iy], surf_place)
            geompy.AddObject(my_dict[iy], surf_id[0])           
    return my_dict
    
def getsleeve_radialedges(state, geometrys,surfaces):
    my_dict = dict()
    if state ==1:
        for iy in range(len(geometrys)):
            my_dict[iy] = geompy.CreateGroup (geometrys[iy],geompy.ShapeType['EDGE'])
            surf_place = geompy.GetInPlace(geometrys[iy], surfaces[iy][1], True)
            surf_id  = geompy.GetSameIDs(geometrys[iy], surf_place)
            geompy.AddObject(my_dict[iy], surf_id[0])         
    
    elif state ==2:
        for iy in range(len(geometrys)):
            my_dict[iy] = geompy.CreateGroup (geometrys[iy],geompy.ShapeType['EDGE'])
            surf_place = geompy.GetInPlace(geometrys[iy], surfaces[iy][2], True)
            surf_id  = geompy.GetSameIDs(geometrys[iy], surf_place)
            geompy.AddObject(my_dict[iy], surf_id[0])  
    return my_dict
    
def face_groups_2 (condition,geometrys,surfaces):
    faces = dict()
    for iy in range(len(geometrys)):
        faces[iy] = geompy.CreateGroup (geometrys[iy],geompy.ShapeType["FACE"])     
        #if condition == 1:
        pipe,Down,Up,Other = surfaces[(0,iy)]
        surf_place = geompy.GetInPlace(geometrys[iy], Other, True)  
        face = geompy.ExtractShapes(surf_place,  geompy.ShapeType["FACE"], True)
        for rr in face:
            surf_id  = geompy.GetSameIDs(geometrys[iy], rr)
        #IDSNO = geompy.GetSameIDs(geometrys[iy],Other)
            geompy.AddObject(faces[iy],surf_id[0])  
       # elif condition == 2:
        #    pipe,Down,Up,Other = guidetubeext[(0,iy)]
            #IDSNO = geompy.GetSameIDs(geometrys[iy],Other)
         #   geompy.AddObject(faces[iy],IDSNO[0])
    return faces

            
def top_bottom_faces(geometrys,facegroup1,facegroup2,facegroup3,facegroup4,facegroup5,facegroup6,facegroup7,facegroup8,facegroup9,facegroup10,facegroup11,facegroup12,facegroup13,facegroup14,facegroup15):#,facegroup16,facegroup17,facegroup18):
    base_face1 = dict()
    base_face2 = dict()    
    for iy in range(len(geometrys)):
        allfacesgroup = geompy.CreateGroup (geometrys[iy],geompy.ShapeType["FACE"])       
        SubFaceIDsList = geompy.SubShapeAllIDs(geometrys[iy], geompy.ShapeType["FACE"])
        for i in range (len(SubFaceIDsList)):
            geompy.AddObject(allfacesgroup, SubFaceIDsList[i]) 
            
        ObjectIDs1 = geompy.GetObjectIDs(facegroup1[iy])
        ObjectIDs2 = geompy.GetObjectIDs(facegroup2[iy])
        ObjectIDs3 = geompy.GetObjectIDs(facegroup3[iy])
        ObjectIDs4 = geompy.GetObjectIDs(facegroup4[iy])
        ObjectIDs5 = geompy.GetObjectIDs(facegroup5[iy])
        ObjectIDs6 = geompy.GetObjectIDs(facegroup6[iy])
        ObjectIDs7 = geompy.GetObjectIDs(facegroup7[iy])
        ObjectIDs8 = geompy.GetObjectIDs(facegroup8[iy])
        ObjectIDs9 = geompy.GetObjectIDs(facegroup9[iy])
        ObjectIDs10 = geompy.GetObjectIDs(facegroup10[iy])
        ObjectIDs11 = geompy.GetObjectIDs(facegroup11[iy]) 
        ObjectIDs12 = geompy.GetObjectIDs(facegroup12[iy])  
        ObjectIDs13 = geompy.GetObjectIDs(facegroup13[iy])  
        ObjectIDs14 = geompy.GetObjectIDs(facegroup14[iy])  
        ObjectIDs15 = geompy.GetObjectIDs(facegroup15[iy])  
        #ObjectIDs16 = geompy.GetObjectIDs(facegroup16[iy])  
        #ObjectIDs17 = geompy.GetObjectIDs(facegroup17[iy])  
        #ObjectIDs18 = geompy.GetObjectIDs(facegroup18[iy])  
        
        
        geompy.DifferenceIDs(allfacesgroup, ObjectIDs1)
        geompy.DifferenceIDs(allfacesgroup, ObjectIDs2)
        geompy.DifferenceIDs(allfacesgroup, ObjectIDs3)
        geompy.DifferenceIDs(allfacesgroup, ObjectIDs4)
        geompy.DifferenceIDs(allfacesgroup, ObjectIDs5)
        geompy.DifferenceIDs(allfacesgroup, ObjectIDs6)
        geompy.DifferenceIDs(allfacesgroup, ObjectIDs7)
        geompy.DifferenceIDs(allfacesgroup, ObjectIDs8)
        geompy.DifferenceIDs(allfacesgroup, ObjectIDs9)
        geompy.DifferenceIDs(allfacesgroup, ObjectIDs10)
        geompy.DifferenceIDs(allfacesgroup, ObjectIDs11)
        geompy.DifferenceIDs(allfacesgroup, ObjectIDs12)
        geompy.DifferenceIDs(allfacesgroup, ObjectIDs13)
        geompy.DifferenceIDs(allfacesgroup, ObjectIDs14)
        geompy.DifferenceIDs(allfacesgroup, ObjectIDs15)
        #geompy.DifferenceIDs(allfacesgroup, ObjectIDs16)
        #geompy.DifferenceIDs(allfacesgroup, ObjectIDs17)
        #geompy.DifferenceIDs(allfacesgroup, ObjectIDs18)

        Bases = geompy.GetObjectIDs(allfacesgroup)  
        base_face1[iy] = geompy.CreateGroup (geometrys[iy],geompy.ShapeType["FACE"]) 
        base_face2[iy] = geompy.CreateGroup (geometrys[iy],geompy.ShapeType["FACE"]) 
                
        geompy.AddObject(base_face1[iy], Bases[0])
        geompy.AddObject(base_face2[iy], Bases[1])
        
    return base_face1,base_face2         
        #allgroupids.append()
def grouptopfaces (geometrys,lines,facegroup1,facegroup2,facegroup3,facegroup4):#,facegroup5):
#huge assumption is lines and geometrys are still aligned     
    #face1 = dict()
    faces =dict()
    for iy in range(len(geometrys)):
        #allfacesgroup = geompy.CreateGroup (geometrys[iy],geompy.ShapeType["FACE"]) 
        faces[iy] = geompy.CreateGroup (geometrys[iy],geompy.ShapeType["FACE"])
        #SubFaceIDsList = geompy.SubShapeAllIDs(geometrys[iy], geompy.ShapeType["FACE"])        
        #for i in range(len(SubFaceIDsList)):
        #    geompy.AddObject(allfacesgroup, SubFaceIDsList[i] )
        for ii in range(len(lines[iy])):
            ids = geompy.GetShapesOnCylinderIDs(geometrys[iy], geompy.ShapeType["FACE"],lines[iy][ii], 0.01, GEOM.ST_IN)
            for ir in ids:
                geompy.AddObject(faces[iy], ir)
        ObjectIDs1 = geompy.GetObjectIDs(facegroup1[iy])
        ObjectIDs2 = geompy.GetObjectIDs(facegroup2[iy])
        ObjectIDs3 = geompy.GetObjectIDs(facegroup3[iy])
        ObjectIDs4 = geompy.GetObjectIDs(facegroup4[iy])
        #ObjectIDs5 = geompy.GetObjectIDs(facegroup5[iy])
        
        
        
        geompy.DifferenceIDs(faces[iy], ObjectIDs1)
        geompy.DifferenceIDs(faces[iy], ObjectIDs2)
        geompy.DifferenceIDs(faces[iy], ObjectIDs3)
        geompy.DifferenceIDs(faces[iy], ObjectIDs4)
        #geompy.DifferenceIDs(faces[iy], ObjectIDs5)
        
    return faces
def create_wire_groups (sleeveext,geometrys):
    pinedges = dict()
    axial_edges = dict()
    sleeveedges = dict()
    for i in range(len(sleeveext)):
        key = i        
        sleeveedges[key] = geompy.CreateGroup(geometrys[i], geompy.ShapeType["EDGE"])   
        pinedges[key] = geompy.CreateGroup(geometrys[i], geompy.ShapeType["EDGE"])   
        axial_edges[key] = geompy.CreateGroup(geometrys[i], geompy.ShapeType["EDGE"])
    
    geompy.UnionIDs(pinedges[0], [902, 673, 1185, 1361, 828, 525, 1015, 560, 1445, 147, 1232, 865, 152, 103, 294, 954, 299, 1315, 169, 1257, 762, 545, 125, 1043, 710, 580, 993, 15, 1300, 240, 939, 919, 845, 505, 495, 530, 1277, 213, 353, 565, 767, 331, 20, 813, 971, 850, 174, 976, 64, 470, 550, 585, 1406, 605, 191, 595, 732, 485, 1262, 1120, 535, 715, 1476, 218, 510, 314, 475, 570, 500, 257, 81, 924, 555, 196, 490, 130, 336, 262, 1073, 998, 1068, 590, 480, 37, 42, 515, 358, 600, 520, 575, 737, 235, 1125, 277, 108, 1163, 897, 1180, 59, 1148, 1020, 1330, 540, 1391, 86, 1376, 880, 656, 693, 678, 798, 859, 398, 1226, 1251, 1059, 962, 53, 229, 792, 822, 97, 424, 308, 207, 1062, 160, 409, 384, 704, 94, 412, 439, 347, 726, 325, 388, 965, 28, 377, 836, 322, 913, 874, 401, 1006, 344, 141, 9, 270, 116, 6, 75, 448, 371, 1037, 406, 459, 687, 248, 421, 1439, 452, 445, 1324, 436, 1400, 1370, 1111, 723, 1157, 1114, 31, 650, 433, 1294, 163, 1470, 374, 933, 664, 418, 430, 807, 1309, 1248, 1174, 138, 226, 182, 701, 185, 455, 987, 756, 1355, 395, 288, 667, 1171, 1271, 204, 1385, 415, 948, 427, 753, 1142, 1009, 285, 50, 119, 72, 251, 442, 888, 891, 839, 910, 984, 381, 391])
    geompy.UnionIDs(axial_edges[0], [1230, 1123, 603, 1260, 216, 1474, 1298, 1275, 895, 150, 1013, 538, 189, 35, 1313, 1101, 708, 128, 974, 991, 1096, 468, 996, 1255, 583, 543, 123, 329, 167, 878, 334, 145, 713, 13, 553, 1374, 1178, 483, 969, 106, 533, 598, 691, 498, 765, 101, 18, 351, 1161, 275, 84, 478, 588, 952, 513, 848, 863, 1041, 463, 671, 1404, 1359, 528, 523, 578, 563, 1328, 1146, 260, 593, 676, 1443, 508, 297, 292, 312, 654, 473, 488, 57, 79, 760, 62, 843, 1071, 1066, 568, 40, 937, 503, 238, 917, 573, 811, 826, 548, 558, 1389, 172, 233, 796, 255, 730, 735, 922, 900, 1183, 1018, 356, 194, 1118, 518, 493, 211])
    geompy.UnionIDs(sleeveedges[0], [1098, 1103, 465, 1089, 1092, 366])
   
    geompy.UnionIDs(pinedges[1], [351, 968, 285, 477, 617, 31, 1061, 872, 1046, 595, 550, 1159, 1176, 329, 810, 1313, 160, 1424, 182, 454, 94, 1439, 1128, 354, 229, 1109, 965, 720, 950, 1091, 1009, 138, 457, 207, 307, 1478, 185, 855, 332, 1031, 53, 491, 598, 163, 72, 632, 701, 698, 794, 410, 676, 772, 531, 906, 1275, 388, 435, 310, 75, 581, 1293, 1304, 413, 270, 141, 987, 1211, 1256, 679, 373, 839, 750, 6, 654, 1240, 1077, 119, 775, 288, 28, 528, 226, 657, 391, 909, 97, 514, 1143, 9, 825, 1196, 116, 248, 753, 892, 50, 1012, 990, 1289, 1281, 566, 1173, 204, 736, 1226, 494, 635, 251, 432, 869, 1106, 801, 1115, 196, 343, 1038, 878, 1430, 1217, 1150, 174, 609, 213, 542, 1262, 360, 321, 587, 846, 152, 64, 37, 463, 604, 520, 169, 191, 1330, 446, 537, 1083, 424, 441, 1340, 712, 338, 20, 299, 1345, 402, 147, 316, 277, 1247, 1355, 1202, 294, 690, 920, 15, 898, 1135, 130, 81, 108, 419, 380, 59, 1350, 125, 1023, 707, 685, 1068, 572, 831, 786, 42, 764, 668, 1335, 505, 86, 915, 103, 781, 663, 1018, 1001, 624, 979, 646, 557, 742, 759, 1053, 500, 1445, 1098, 397, 262, 957, 483, 257, 996, 1187, 1120, 974, 641, 883, 816, 1232, 727, 1484, 1165, 1182, 861, 240, 365, 218, 468, 235])
    geompy.UnionIDs(axial_edges[1], [518, 439, 145, 233, 1245, 1081, 1185, 319, 461, 740, 876, 341, 585, 859, 1096, 1323, 757, 275, 444, 1328, 13, 238, 977, 688, 417, 710, 1016, 123, 705, 194, 814, 358, 666, 314, 35, 1118, 1338, 503, 1333, 683, 84, 1200, 622, 101, 644, 422, 661, 336, 189, 79, 1051, 1443, 211, 1343, 1348, 639, 172, 1113, 1230, 1353, 498, 400, 935, 18, 540, 481, 378, 1036, 1163, 555, 297, 1180, 292, 535, 844, 1066, 762, 607, 1148, 784, 167, 150, 1215, 466, 363, 1021, 999, 40, 395, 1428, 602, 779, 918, 1133, 913, 62, 106, 255, 1260, 955, 896, 940, 260, 57, 799, 994, 725, 1482, 570, 216, 829, 128, 881, 972])
    geompy.UnionIDs(sleeveedges[1], [1325, 942, 937, 931, 1270, 928])

    geompy.UnionIDs(pinedges[2], [638, 505, 1091, 1364, 1158, 528, 708, 979, 749, 273, 28, 204, 163, 1288, 890, 395, 314, 1061, 1154, 656, 464, 780, 1341, 292, 675, 809, 1455, 1379, 908, 928, 182, 141, 727, 270, 705, 794, 442, 251, 875, 483, 1432, 6, 119, 160, 439, 1148, 1470, 461, 582, 373, 358, 339, 420, 53, 543, 905, 1017, 856, 653, 1142, 72, 945, 1327, 764, 834, 1179, 602, 248, 226, 138, 97, 560, 398, 207, 317, 1135, 31, 1047, 579, 1077, 336, 853, 964, 9, 1344, 1394, 691, 508, 116, 1273, 812, 619, 94, 831, 1165, 730, 417, 295, 376, 185, 1031, 1094, 1417, 1174, 229, 616, 50, 75, 557, 942, 486, 1385, 125, 1215, 196, 1205, 801, 387, 1023, 306, 1105, 588, 1333, 345, 497, 426, 1053, 59, 608, 951, 971, 840, 284, 719, 103, 1476, 1083, 174, 1279, 566, 323, 404, 667, 475, 213, 1423, 697, 152, 919, 514, 818, 1350, 240, 37, 625, 1200, 645, 736, 235, 301, 382, 1370, 756, 453, 534, 81, 867, 262, 1100, 191, 897, 492, 15, 1400, 1038, 786, 1195, 130, 1068, 714, 593, 279, 431, 1461, 350, 169, 64, 986, 257, 956, 470, 845, 1220, 662, 1190, 682, 108, 147, 1294, 571, 914, 409, 328, 1185, 1438, 218, 448, 934, 42, 1355, 1210, 519, 862, 823, 882, 771, 630, 86, 549, 741, 20])
    geompy.UnionIDs(axial_edges[2], [1292, 1036, 380, 57, 490, 949, 1348, 473, 343, 1383, 40, 1203, 216, 739, 123, 843, 446, 1331, 1421, 326, 1474, 895, 932, 784, 532, 695, 260, 712, 643, 591, 18, 106, 660, 429, 1001, 1188, 547, 233, 816, 912, 282, 954, 189, 79, 754, 299, 564, 1218, 1353, 799, 402, 512, 62, 860, 1006, 385, 1183, 451, 1436, 1051, 495, 172, 1103, 1277, 623, 665, 969, 1021, 734, 1398, 145, 917, 468, 348, 1198, 255, 13, 865, 128, 606, 717, 238, 424, 35, 304, 101, 211, 1066, 880, 84, 569, 680, 1459, 769, 1081, 194, 628, 1118, 321, 821, 407, 517, 838, 167, 586, 984, 1213, 277, 363, 1368, 1193, 150, 1098, 1208])
    geompy.UnionIDs(sleeveedges[2], [1113, 997, 994, 1008, 1120, 1003])

    geompy.UnionIDs(pinedges[3], [925, 215, 290, 53, 679, 338, 1029, 590, 305, 50, 270, 354, 740, 659, 234, 1410, 320, 1006, 812, 1380, 287, 782, 1241, 193, 1440, 335, 567, 302, 718, 351, 1211, 1150, 873, 317, 87, 267, 942, 656, 1054, 171, 284, 332, 972, 1181, 715, 1455, 212, 299, 348, 263, 890, 696, 759, 992, 1115, 314, 1196, 281, 1302, 190, 149, 9, 329, 837, 1365, 1478, 605, 1425, 72, 1074, 1395, 260, 910, 345, 887, 939, 146, 127, 311, 1256, 257, 276, 6, 1279, 622, 1051, 1009, 168, 237, 815, 293, 1112, 342, 570, 969, 124, 308, 273, 357, 619, 834, 693, 762, 90, 323, 642, 737, 326, 1135, 296, 1226, 478, 59, 773, 243, 368, 433, 670, 378, 133, 1308, 1141, 226, 523, 468, 423, 916, 513, 843, 978, 746, 1431, 581, 729, 826, 1232, 1187, 199, 458, 1386, 413, 182, 1065, 79, 1020, 503, 788, 493, 96, 633, 1121, 685, 403, 393, 448, 64, 702, 896, 1156, 879, 138, 1484, 155, 483, 383, 438, 1285, 931, 248, 373, 948, 1446, 1401, 428, 768, 473, 1202, 983, 596, 20, 1247, 751, 518, 848, 363, 204, 1035, 1080, 101, 665, 648, 221, 418, 463, 821, 508, 576, 408, 707, 724, 453, 1126, 177, 498, 1461, 901, 998, 388, 1060, 1262, 160, 15, 1371, 953, 488, 1217, 1015, 628, 611, 1416, 443, 398])
    geompy.UnionIDs(axial_edges[3], [18, 1384, 894, 1119, 471, 416, 766, 516, 461, 114, 722, 1230, 13, 646, 131, 946, 574, 1078, 486, 594, 62, 981, 1185, 224, 846, 1444, 1429, 431, 819, 451, 705, 441, 77, 241, 496, 626, 386, 197, 1200, 1154, 466, 1482, 94, 40, 366, 396, 180, 1033, 376, 1283, 609, 899, 476, 1124, 1245, 996, 1058, 411, 951, 1013, 521, 1399, 771, 668, 511, 456, 1414, 391, 421, 446, 579, 153, 824, 727, 136, 246, 35, 631, 744, 501, 371, 401, 99, 976, 481, 700, 683, 219, 841, 426, 57, 1215, 1369, 877, 491, 158, 1459, 914, 361, 1306, 1260, 202, 381, 929, 436, 1018, 1063, 786, 1139, 749, 406, 175, 506, 663])
    geompy.UnionIDs(sleeveedges[3], [42, 116, 37, 28, 31, 109])
    
        
        
#    geompy.UnionIDs(axial_edges[key], [135, 150, 190, 285, 155, 245, 160, 165, 225, 215, 260, 205, 125, 265, 145, 295, 280, 230, 290, 130, 180, 175, 195, 210, 220, 250, 140, 185, 170, 270, 275, 120, 255, 200, 240, 235, 300, 305])
    
    return pinedges,axial_edges,sleeveedges

def makesolid_partition (geometrys,surfaces,surfaces1, surfaces2,surfaces3,surfaces4,surfaces5,surfaces6,surfaces7,surfaces8):
    tot_surf0 = surfaces.values()[0] 
    tot_surf1 = surfaces1.values()[0]
    tot_surf2 = surfaces2.values()[0]
    tot_surf3 = [surfaces3.values()[0][0]]
    tot_surf4 = [surfaces4.values()[0][0]]
    tot_surf5 = [surfaces5.values()[0][0]]
    tot_surf6 = [surfaces6.values()[0][0]]
    tot_surf7 = [surfaces7.values()[0][0]]
    tot_surf8 = [surfaces8.values()[0][0]]
    
    for i in range(len(geometrys)-1):
        ii=i+1
        tot_surf0 = tot_surf0 + surfaces.values()[ii] 
        tot_surf1 = tot_surf1 +surfaces1.values()[ii] 
        tot_surf2 = tot_surf2 + surfaces2.values()[ii]
        tot_surf3 = tot_surf3 +[surfaces3.values()[ii][0]]
        tot_surf4 = tot_surf4 +[surfaces4.values()[ii][0]]
        tot_surf5 = tot_surf5 +[surfaces5.values()[ii][0]]
        tot_surf6 = tot_surf6 +[surfaces6.values()[ii][0]]
        tot_surf7 = tot_surf7 +[surfaces7.values()[ii][0]]
        tot_surf8 = tot_surf8 +[surfaces8.values()[ii][0]]
                
        
    tot_surf = tot_surf0 + tot_surf1 + tot_surf2 + tot_surf3 + tot_surf4 + tot_surf5 +tot_surf6 + tot_surf7 +tot_surf8  
    FUELBUNDLE = geompy.MakePartition(geometrys.values(), tot_surf, [], [], geompy.ShapeType["SOLID"], 0, [], 0)
    SOLID = dict()
    for i in range (len(geometrys)):
        SOLID[i] = geompy.GetInPlace(FUELBUNDLE,geometrys[i], True)
        geompy.addToStudy(SOLID[i],"SOLIDBUNDLE{0}".format(i))
    geompy.addToStudy(FUELBUNDLE,'FUELBUNDLE')
    return FUELBUNDLE,SOLID
    #Base_face1 =
    #Base_face2 =     

def makesorted_list (selector, geom_len, inner_pins, middle_pins, outer_pins):
    #my_list = list()
    final = dict()    
    for ii in range (geom_len):
        final[ii] = []
    if selector == 1:    
        for i in range (6):
            for iy in range(geom_len):
                pipe, down, up, other = inner_pins[(i,iy)]
                final[iy].append(pipe)
        for i in range (12):
            for iy in range(geom_len):
                pipe, down, up, other = middle_pins[(i,iy)]
                final[iy].append(pipe)
                
        for i in range (18):
            for iy in range(geom_len):
                pipe, down, up, other =  outer_pins[(i,iy)]
                final[iy].append(pipe)
    if selector == 2:
        for i in range (6):
            for iy in range(geom_len):
                line = inner_pins[(i,iy)]
                final[iy].append(line)
        for i in range (12):
            for iy in range(geom_len):
                line = middle_pins[(i,iy)]
                final[iy].append(line)                
        for i in range (18):
            for iy in range(geom_len):
                line = outer_pins[(i,iy)]
                final[iy].append(line)        
    return final    

def makesorted_list_pins (selector, geom_len, inner_pins, middle_pins, outer_pins):
    #my_list = list()
    final = dict()    
    for ii in range (geom_len):
        final[ii] = []
    if selector == 1:    
        for i in range (6):
            for iy in range(geom_len):
                pipe, down, up, other = inner_pins[(i,iy)]
                final[iy].append(other)
        for i in range (12):
            for iy in range(geom_len):
                pipe, down, up, other = middle_pins[(i,iy)]
                final[iy].append(other)
                
        for i in range (18):
            for iy in range(geom_len):
                pipe, down, up, other =  outer_pins[(i,iy)]
                final[iy].append(other)
    if selector == 2:
        for i in range (6):
            for iy in range(geom_len):
                line = inner_pins[(i,iy)]
                final[iy].append(line)
        for i in range (12):
            for iy in range(geom_len):
                line = middle_pins[(i,iy)]
                final[iy].append(line)                
        for i in range (18):
            for iy in range(geom_len):
                line = outer_pins[(i,iy)]
                final[iy].append(line)        
    return final   
    
    
def makesorted_list_radial (selector, geom_len, inner_pins, middle_pins, outer_pins):
    #my_list = list()
    final = dict()    
    for ii in range (geom_len):
        final[ii] = []
    if selector == 1:    
        for i in range (6):
            for iy in range(geom_len):
                pipe, down, up, other,t = inner_pins[(i,iy)]
                final[iy].append(down)
        for i in range (12):
            for iy in range(geom_len):
                pipe, down, up, other,t = middle_pins[(i,iy)]
                final[iy].append(down)
                
        for i in range (18):
            for iy in range(geom_len):
                pipe, down, up, other,t =  outer_pins[(i,iy)]
                final[iy].append(down)
    if selector == 2:
        for i in range (6):
            for iy in range(geom_len):
                pipe, down, up, other,t = inner_pins[(i,iy)]
                final[iy].append(up)
        for i in range (12):
            for iy in range(geom_len):
                pipe, down, up, other,t = middle_pins[(i,iy)]
                final[iy].append(up)
                
        for i in range (18):
            for iy in range(geom_len):
                pipe, down, up, other,t =  outer_pins[(i,iy)]
                final[iy].append(up)       
    return final     


def create_partition_radialgroups(geometrys,surfaces):
    my_dict = dict()
    for iy in range(len(geometrys)):
        my_dict[iy] = geompy.CreateGroup (geometrys[iy], geompy.ShapeType["EDGE"])
        for i in range(len(surfaces[iy])):            
            surf_place = geompy.GetInPlace(geometrys[iy], surfaces[iy][i], True)
            #face = geompy.ExtractShapes(surf_place)
            #for rr in surf_place:
            surf_id  = geompy.GetSameIDs(geometrys[iy], surf_place) 
            #print(iy,i,surf_id)
            geompy.AddObject(my_dict[iy],surf_id[0])
    return my_dict


def makesorted_list_2 (selector, geom_len, inner_pins, middle_pins, outer_pins):
    #my_list = list()
    final = dict()    
    for ii in range (geom_len):
        final[ii] = []
    if selector == 1:    
        for i in range (6):
            for iy in range(geom_len):
                pipe, down, up, other,t = inner_pins[(i,iy)]
                final[iy].append(pipe)
        for i in range (12):
            for iy in range(geom_len):
                pipe, down, up, other,t = middle_pins[(i,iy)]
                final[iy].append(pipe)
                
        for i in range (18):
            for iy in range(geom_len):
                pipe, down, up, other,t =  outer_pins[(i,iy)]
                final[iy].append(pipe)
    if selector == 2:
        for i in range (6):
            for iy in range(geom_len):
                line = inner_pins[(i,iy)]
                final[iy].append(line)
        for i in range (12):
            for iy in range(geom_len):
                line = middle_pins[(i,iy)]
                final[iy].append(line)                
        for i in range (18):
            for iy in range(geom_len):
                line = outer_pins[(i,iy)]
                final[iy].append(line)        
    return final          

def makewallmesh_partition(geom, surfaces)   :
    my_dict = dict()
    for i in range (len(geom)):
        my_dict[i] = geompy.MakePartition([geom[i]], surfaces[i], [], [], geompy.ShapeType['SOLID'], 0, [], 0)
    return my_dict   

def get_annular_faces(state,geometrys, facegroup1, facegroup2, facegroup3,facegroup4):
    faces = dict()
    line = create_line([[0,0,0],[0,0,0.25*H],[0,0,0.5*H],[0,0,(0.75*H)],[0,0,H]])
    EDGES = geompy.ExtractShapes(line, geompy.ShapeType["EDGE"], True)
    sleeve_rad = 0.189*0.5
    sleeve = sleeve_rad
    
    for iy in range (len(geometrys)): 
        faces[iy] = geompy.CreateGroup (geometrys[iy],geompy.ShapeType["FACE"])
        if state == 1:
            ids = geompy.GetShapesOnCylinderIDs(geometrys[iy], geompy.ShapeType["FACE"],EDGES[iy], 0.01, GEOM.ST_IN)
            #print(state,ids)
        elif state == 2:
            #dist = sleeve_rad - 0.0008
            ids = geompy.GetShapesOnCylinderIDs(geometrys[iy], geompy.ShapeType["FACE"],EDGES[iy], 0.09, GEOM.ST_OUT)
            #print(state,ids)
        for ir in ids:
            geompy.AddObject(faces[iy], ir)
        ObjectIDs1 = geompy.GetObjectIDs(facegroup1[iy])
        ObjectIDs2 = geompy.GetObjectIDs(facegroup2[iy])
        ObjectIDs3 = geompy.GetObjectIDs(facegroup3[iy])
        ObjectIDs4 = geompy.GetObjectIDs(facegroup4[iy])
        #ObjectIDs5 = geompy.GetObjectIDs(facegroup5[iy])        
        
        geompy.DifferenceIDs(faces[iy], ObjectIDs1)
        geompy.DifferenceIDs(faces[iy], ObjectIDs2)
        geompy.DifferenceIDs(faces[iy], ObjectIDs3)
        geompy.DifferenceIDs(faces[iy], ObjectIDs4)
        #geompy.DifferenceIDs(faces[iy], ObjectIDs5)
    return faces     

def get_edges(state, geometrys, surface,facegroup1) :    
    my_dict = dict() 
    if state == 1:
        for iy in range(len(geometrys)):
            my_dict[iy] = geompy.CreateGroup (geometrys[iy],geompy.ShapeType["EDGE"])
            edges = geompy.ExtractShapes(surface[iy], geompy.ShapeType["EDGE"], True)
            for edge in edges:
                #ids = geompy.GetInPlace(geometrys[iy], edge, True)
                edge_id = geompy.GetSameIDs(geometrys[iy], edge)
                geompy.AddObject(my_dict[iy], edge_id[0])
    elif state == 2:
        for iy in range(len(geometrys)):
            ObjectIDs1 = geompy.GetObjectIDs(facegroup1[iy])
            my_dict[iy] = geompy.CreateGroup (geometrys[iy],geompy.ShapeType["EDGE"])
            edges = geompy.ExtractShapes(surface[iy], geompy.ShapeType["EDGE"], True)
            for edge in edges:
                #ids = geompy.GetInPlace(geometrys[iy], edge, True)
                edge_id = geompy.GetSameIDs(geometrys[iy], edge)
                geompy.AddObject(my_dict[iy], edge_id[0]) 
            
            geompy.DifferenceIDs(my_dict[iy], ObjectIDs1)    
                
    return my_dict

def getradial_edges(geometrys,faces):
    my_dict = dict()
    for iy in range(len(geometrys)) :   
        my_dict[iy] = geompy.CreateGroup (geometrys[iy],geompy.ShapeType["EDGE"])
        for ii in range(len(lines[iy])):          
            ids = geompy.GetShapesOnCylinderIDs(geometrys[iy], geompy.ShapeType["EDGE"],lines[iy][ii], 0.01, GEOM.ST_IN)
            

    #my_dict = dict()
    #for iy in range(len(geometrys)):
    #    list_groups = geompy.Propagate(faces[iy])
        #my_dict[iy] = list_groups[0]
        #for i in range(1,(36*2)):
      #  my_dict[iy] = geompy.UnionListOfGroups(list_groups[0:(36*2)])
    return my_dict
def getaxial_edges(geometrys, group_edges,group_edges1,group_edges2):
    my_dict = dict()
    for iy in range (len(geometrys)): 
        my_dict[iy] = geompy.CreateGroup (geometrys[iy],geompy.ShapeType["EDGE"])
        alledgesgroup = geompy.CreateGroup (geometrys[iy],geompy.ShapeType["EDGE"]) 
        SubedgeIDsList = geompy.SubShapeAllIDs(geometrys[iy], geompy.ShapeType["EDGE"])        
        #edges = geompy.ExtractShapes(surface[iy], geompy.ShapeType["EDGE"], True)
        for i  in range (len(SubedgeIDsList)):
            geompy.AddObject(alledgesgroup,SubedgeIDsList[i])

        ObjectIDs1 = geompy.GetObjectIDs(group_edges[iy])
        ObjectIDs2 = geompy.GetObjectIDs(group_edges1[iy])
        ObjectIDs3 = geompy.GetObjectIDs(group_edges2[iy])
        
        geompy.DifferenceIDs(alledgesgroup, ObjectIDs1)
        geompy.DifferenceIDs(alledgesgroup, ObjectIDs2)
        geompy.DifferenceIDs(alledgesgroup, ObjectIDs3)
        
        edges = geompy.GetObjectIDs(alledgesgroup)
        for edge in edges:
            geompy.AddObject(my_dict[iy], edge)
            
    return my_dict 
        
def getsolidshapes(geometrys,lines):
    my_dict= dict()
    for iy in range (len(geometrys)):
        #DGES = geompy.ExtractShapes(line, geompy.ShapeType["EDGE"], True)
        my_dict[iy] = geompy.CreateGroup(geometrys[iy],geompy.ShapeType["SOLID"])
        for ii in range(len(lines[iy])):
            ids = geompy.GetShapesOnCylinderIDs(geometrys[iy], geompy.ShapeType["SOLID"],lines[iy][ii], 0.01, GEOM.ST_IN)
                #ids = geompy.GetShapesOnCylinderIDs(geometrys[iy], geompy.ShapeType["SOLID"],lines[iy][ii], 0.08, GEOM.ST_OUT)
                
            for ir in ids:
                geompy.AddObject(my_dict[iy], ir) 
    return my_dict                
                
def getsolidshapes2(state,geometrys):
    my_dict = dict()
    line = create_line([[0,0,0],[0,0,0.25*H],[0,0,0.5*H],[0,0,(0.75*H)],[0,0,H]])
    EDGES = geompy.ExtractShapes(line, geompy.ShapeType["EDGE"], True)    
    for iy in range(len(geometrys)):
        my_dict[iy] = geompy.CreateGroup(geometrys[iy],geompy.ShapeType["SOLID"])
        if state == 1:
            ids = geompy.GetShapesOnCylinderIDs(geometrys[iy], geompy.ShapeType["SOLID"],EDGES[iy], 0.01, GEOM.ST_IN)
        if state == 2:
            ids = geompy.GetShapesOnCylinderIDs(geometrys[iy], geompy.ShapeType["SOLID"],EDGES[iy], 0.08, GEOM.ST_OUT)
        for ir in ids:
            geompy.AddObject(my_dict[iy], ir)    
            
    return my_dict

def getmainsolid(geometrys,solid1,solid2):
    #solids = geompy.ExtractShapes(line, geompy.ShapeType["EDGE"], True)           
    my_dict = dict()
    for iy in range(len(geometrys)):
        my_dict[iy] = geompy.CreateGroup (geometrys[iy],geompy.ShapeType["SOLID"])
        allsolidgroup = geompy.CreateGroup (geometrys[iy],geompy.ShapeType["SOLID"]) 
        SubsolidIDsList = geompy.SubShapeAllIDs(geometrys[iy], geompy.ShapeType["SOLID"])        
        for i  in range (len(SubsolidIDsList)):
            geompy.AddObject(allsolidgroup,SubsolidIDsList[i])
            
        ObjectIDs1 = geompy.GetObjectIDs(solid1[iy])
        ObjectIDs2 = geompy.GetObjectIDs(solid2[iy])        
        
        geompy.DifferenceIDs(allsolidgroup, ObjectIDs1)
        geompy.DifferenceIDs(allsolidgroup, ObjectIDs2)        

        solids = geompy.GetObjectIDs(allsolidgroup)
        for solid in solids:
            geompy.AddObject(my_dict[iy], solid)
    return my_dict
        
def generate_straightedge (face,circ_edge, LINEEDGE):
    vertex1 =  geompy.ExtractShapes(face, geompy.ShapeType["VERTEX"], True)
    vertex2 = geompy.ExtractShapes(circ_edge, geompy.ShapeType["VERTEX"], True )
    edge = geompy.MakeLineTwoPnt(vertex1[0],vertex2[0])
    #geompy.addToStudy(edge,'rerer')
    edge1 = geompy.MakeRotation(edge, LINEEDGE, math.pi)
    
    return edge,edge1
    
    
        #print(state,ids)
       
            #dist = sleeve_rad - 0.0008
            #print(state,ids)                
        
guidetubeext, parti_guidetube,surf_g_1,surf_g_2 = extrude_guidetube(0.007525)

sleeveext, parti_sleeve,surf_s_1,surf_s_2  = extrude_sleeve(0.189*0.5)
innerpins, part_innerpins,line_innerpins,surf_pi_1,surf_pi_2 = extrudepins_zigzag(6)
middlepins, part_midpins,line_midpins,surf_pm_1,surf_pm_2 = extrudepins_zigzag(12)
outerpins, part_outerpins,line_outerpins,surf_po_1,surf_po_2 = extrudepins_zigzag(18)

geometry = boolen_object_operations(innerpins,middlepins,outerpins,sleeveext,guidetubeext)


surf_list = makesorted_list(1,len(geometry), part_innerpins, part_midpins, part_outerpins)
surf_pin_list = makesorted_list_pins(1,len(geometry), innerpins, middlepins, outerpins)
surf_line_list1 = makesorted_list_2(1,len(geometry), surf_pi_1, surf_pm_1, surf_po_1)
surf_line_list2 = makesorted_list_2(1,len(geometry), surf_pi_2, surf_pm_2, surf_po_2)

line_list = makesorted_list(2,len(geometry), line_innerpins, line_midpins, line_outerpins)
#part_geom = makewallmesh_partition(geometry, surf_list)


FUELBUNDLE,SOLID = makesolid_partition(geometry, surf_list, surf_line_list1, surf_line_list2, parti_guidetube, parti_sleeve,surf_g_1,surf_g_2,surf_s_1,surf_s_2)
surfparti_pin = create_partition_groups_3(SOLID,surf_list)
union_surf_pins = create_partition_groups_3(SOLID,surf_pin_list)
surf_line_parti1 = create_partition_groups(SOLID,surf_line_list1)
surf_line_parti2 = create_partition_groups(SOLID,surf_line_list2)

surfparti_sleeve = create_partition_groups_2(1,SOLID, parti_sleeve)
surfparti_sleeve_1 = create_partition_groups_2(2,SOLID, surf_s_1)
surfparti_sleeve_2 = create_partition_groups_2(2,SOLID, surf_s_2)

surfparti_guidetube = create_partition_groups_2(1,SOLID, parti_guidetube)
surfparti_guidetube_1 = create_partition_groups_2(2,SOLID, surf_g_1)
surfparti_guidetube_2 = create_partition_groups_2(2,SOLID, surf_g_2)


#
#    
###pininnerfaces =  create_face_groups(6,SOLID,innerpins,middlepins,outerpins,sleeveext,guidetubeext)
###pinmidfaces =  create_face_groups(12,SOLID,innerpins,middlepins,outerpins,sleeveext,guidetubeext)
###pinouterfaces =  create_face_groups(18,SOLID,innerpins,middlepins,outerpins,sleeveext,guidetubeext)
sleeve_faces = face_groups_2(1,SOLID,sleeveext)
guide_tubefaces = face_groups_2(2,SOLID,guidetubeext)
annuli_faces = grouptopfaces (SOLID,line_list,union_surf_pins, surfparti_pin,surf_line_parti1,surf_line_parti2)
guide_annular_faces = get_annular_faces(1,SOLID, guide_tubefaces, surfparti_guidetube,surfparti_guidetube_1,surfparti_guidetube_2) 
sleeve_annular_faces = get_annular_faces(2,SOLID, sleeve_faces, surfparti_sleeve,surfparti_sleeve_1,surfparti_sleeve_2)
#
face_1,face_2 = top_bottom_faces(SOLID,surf_line_parti1,surf_line_parti2,surfparti_sleeve_1,sleeve_faces,guide_tubefaces,surfparti_pin,annuli_faces,surfparti_sleeve,surfparti_guidetube,guide_annular_faces,sleeve_annular_faces,surfparti_sleeve_2,surfparti_guidetube_1,surfparti_guidetube_2,union_surf_pins)
#
##pin,axial,sleeve = create_wire_groups (sleeveext,SOLID)
#
annuli_solids_pins = getsolidshapes(SOLID,line_list)
annuli_solid_guidetube = getsolidshapes2(1,SOLID)
annuli_solid_sleeve = getsolidshapes2(2,SOLID)

radial_list_up1 = makesorted_list_radial(1,len(geometry), surf_pi_1, surf_pm_1, surf_po_1)
radial_list_down1 = makesorted_list_radial(2,len(geometry), surf_pi_1, surf_pm_1, surf_po_1)
radial_up1 = create_partition_radialgroups(SOLID,radial_list_up1)
radial_down1 = create_partition_radialgroups(SOLID,radial_list_down1)

radial_list_up2 = makesorted_list_radial(1,len(geometry), surf_pi_2, surf_pm_2, surf_po_2)
radial_list_down2 = makesorted_list_radial(2,len(geometry), surf_pi_2, surf_pm_2, surf_po_2)
radial_up2 = create_partition_radialgroups(SOLID,radial_list_up2)
radial_down2 = create_partition_radialgroups(SOLID,radial_list_down2)

sleeve_radial_up1 = getsleeve_radialedges(1, SOLID,surf_s_1)
sleeve_radial_up2 = getsleeve_radialedges(1, SOLID,surf_s_2)
sleeve_radial_down1 = getsleeve_radialedges(2, SOLID,surf_s_1)
sleeve_radial_down2 = getsleeve_radialedges(2, SOLID,surf_s_2)

guide_radial_up1 = getsleeve_radialedges(1, SOLID,surf_g_1)
guide_radial_up2 = getsleeve_radialedges(1, SOLID,surf_g_2)
guide_radial_down1 = getsleeve_radialedges(2, SOLID,surf_g_1)
guide_radial_down2 = getsleeve_radialedges(2, SOLID,surf_g_2)



#
#Unionpins = dict()
Unionpinpartitions  = dict()
radial = dict()
pre_radial = dict()
Union_str_partition = dict()
Unionannularfaces = dict()
Unionsolidpins = dict()
for i in range(len(sleeveext)):
   geompy.addToStudy(face_1[i],'pinbase_1{0}'.format(i))
   geompy.addToStudy(face_2[i],'pinbase_2{0}'.format(i))
#   Unionpins[i] = geompy.UnionListOfGroups([pininnerfaces[i], pinmidfaces[i], pinouterfaces[i]])      
   Unionpinpartitions[i] = geompy.UnionListOfGroups([surfparti_pin[i], surfparti_guidetube[i]])
   pre_radial[i] = geompy.UnionListOfGroups([radial_up1[i], radial_down1[i], radial_up2[i], radial_down2[i], guide_radial_up1[i],guide_radial_up2[i],guide_radial_down1[i],guide_radial_down2[i]])
   radial[i] = geompy.UnionListOfGroups([pre_radial[i],sleeve_radial_up1[i] ,sleeve_radial_up2[i],sleeve_radial_down1[i],sleeve_radial_down2[i]])   
   Union_str_partition[i] = geompy.UnionListOfGroups([surf_line_parti1[i], surf_line_parti2[i], surfparti_sleeve_1[i], surfparti_sleeve_2[i], surfparti_guidetube_1[i],surfparti_guidetube_2[i]])
   
   
   Unionannularfaces[i] = geompy.UnionListOfGroups([guide_annular_faces[i],annuli_faces[i]])
   Unionsolidpins[i] = geompy.UnionListOfGroups([annuli_solids_pins[i],annuli_solid_guidetube[i]])
#
   geompy.addToStudy(union_surf_pins[i],'Unionpins{0}'.format(i))
   geompy.addToStudy(Unionsolidpins[i],'Unionsolidpins{0}'.format(i))
#   
   geompy.addToStudy(guide_tubefaces[i],'guide_tubefaces{0}'.format(i))
   geompy.addToStudy(sleeve_faces[i],'sleeve_faces{0}'.format(i))   
   geompy.addToStudy(annuli_solid_sleeve[i],'annuli_solid_sleeve{0}'.format(i)) 
   geompy.addToStudy(annuli_faces[i], 'pin_top_wall_faces{0}'.format(i))
   geompy.addToStudy(Unionpinpartitions[i],'pinpartition_surfaces{0}'.format(i))
#   geompy.addToStudy(Sleevepartitions[i],'sleevepartition_surfaces{0}'.format(i))
#
#
main_solid = getmainsolid(SOLID,Unionsolidpins,annuli_solid_sleeve)
#   
pin  = get_edges(2,SOLID, Unionannularfaces,pre_radial)
sleeve = get_edges(1,SOLID,sleeve_annular_faces,0)   
axial = getaxial_edges(SOLID, pin,sleeve,radial)

#sleeve_radial_up1[i] ,sleeve_radial_up2[i],sleeve_radial_down1[i],sleeve_radial_down2[i],

#
#
for i in range(len(sleeveext)):    
   geompy.addToStudy(pin[i],'pin{0}'.format(i))   
   geompy.addToStudy(axial[i],'axial{0}'.format(i))   
   geompy.addToStudy(radial[i],'radial{0}'.format(i))
   geompy.addToStudy(main_solid[i],'main_solid{0}'.format(i)) 
   geompy.addToStudy(sleeve[i],'sleeve{0}'.format(i))   
   geompy.addToStudy(sleeve_annular_faces[i], 'sleeve_annular{0}'.format(i))


compound_meshes(FUELBUNDLE,SOLID,sleeve,pin,axial,sleeve_faces,face_2,face_1,guide_tubefaces,union_surf_pins)
#meshes(0,geometry[0],sleeve[0],pin[0],axial[0],sleeve_faces[0],face_2[0],face_1[0],guide_tubefaces[0],Unionpins[0])
#meshes(1,geometry[1],sleeve[1],pin[1],axial[1],sleeve_faces[1],face_2[1],face_1[1],guide_tubefaces[1],Unionpins[1])
#meshes(2,geometry[2],sleeve[2],pin[2],axial[2],sleeve_faces[2],face_2[2],face_1[2],guide_tubefaces[2],Unionpins[2])
#meshes(3,geometry[3],sleeve[3],pin[3],axial[3],sleeve_faces[3],face_2[3],face_1[3],guide_tubefaces[3],Unionpins[3])



#meshes(geometry,shell,Sleeve_edges,Guidetube_edge,Pin_edges,Axial_edges,Sleeve_faces,Top_face,Bottom_face,Guidetubeface,Pin_faces,Sleeve_axialedges)

#radii = [0.078645, 0.078645,0.055, 0.078645,0.078645]
#for i, centreline in enumerate(zig_zag(6,radii[0],radii[1],radii[2],radii[3],radii[4])):
#    line = create_line(centreline)
 #   EDGES = geompy.ExtractShapes(line, geompy.ShapeType["EDGE"], True)
  #  for i,edge in enumerate (EDGES):
   #     geompy.addToStudy(edge,(edge()))
    #geompy.addToStudy(line,'geometry')