def secAngular(tipo,tam):
    # Genera la sección de un perfil metálico en L
    # La nomenclatura empleada para las dimensiones es la del prontuario de
    # estructuras metálicas del CEDEX
    # tipo: L, LD u otro perfil angular definido en PerfilesMetalicos.py
    # tam: tamaño que define el perfil ('120?2', '100?5?',  ...)
    a=eval(tipo)[tam]['a']
    b=eval(tipo)[tam]['b']
    e=eval(tipo)[tam]['e']
    r=eval(tipo)[tam]['r']
    r1=eval(tipo)[tam]['r1']
    cx=eval(tipo)[tam]['cx']
    cy=eval(tipo)[tam]['cy']
    p1=Base.Vector(-(b-cy),-cx)
    p2=Base.Vector(cy,-cx)
    p3=Base.Vector(cy,a-cx)
    l1=Part.makePolygon([p1,p2,p3])
    p4=p3.add(Base.Vector(-e,0))
    p5=p4.add(Base.Vector(0,-(a-e)/2.0))
    l2=Geometria2D.fillet2D(p3,p4,p4,p5,r1)
    p6=p5.add(Base.Vector(0,-(a-e)/2.0))
    p7=p6.add(Base.Vector(-(b-e)/2.0,0))
    l3=Geometria2D.fillet2D(p5,p6,p6,p7,-r)
    p8=p7.add(Base.Vector(-(b-e)/2.0,0))
    l4=Geometria2D.fillet2D(p7,p8,p8,p1,r1)
    secPerfil=Part.Face(Part.Wire([l1,l2,l3,l4]))
    secPerfil.rotate(Base.Vector(0,0,0),Base.Vector(1,0,0),90)
    return secPerfil
def secU(tipo,tam):
    # Genera la sección de un perfil metálico U
    # La nomenclatura empleada para las dimensiones es la del prontuario de
    # estructuras metálicas del CEDEX
    # tipo: UPN o cualquier otro U definido en el fichero PerfilesMetalicos.py
    # tam: tamaño que define el perfil (80, 100, 120 , ...)
    h=eval(tipo)[tam]['h']
    b=eval(tipo)[tam]['b']
    e=eval(tipo)[tam]['e']
    e1=eval(tipo)[tam]['e1']
    r1=eval(tipo)[tam]['r1']
    e2=eval(tipo)[tam]['e2']
    h1=eval(tipo)[tam]['h1']
    p1=Base.Vector(b-e2,h/2.0)
    p2=Base.Vector(-e2,h/2.0)
    p3=Base.Vector(-e2,-h/2.0)
    p4=Base.Vector(b-e2,-h/2.0)
    l1=Part.makePolygon([p1,p2,p3,p4])
    p5=Base.Vector(b-e2,-h/2.0+e1)
    p6=p5.add(Base.Vector(-(b-e-e1)/2.0,(h/2.0-h1/2.0-2*e1)/2.0))
    l2=Geometria2D.fillet2D(p4,p5,p5,p6,r1)
    p7=p6.add(Base.Vector(-(b-e-e1)/2.0,(h/2.0-h1/2.0-2*e1)/2.0))
    p8=Base.Vector(-e2+e,-h1/2.0)
    pmed=Base.Vector(-e2+e,0)
    l3=Geometria2D.fillet2D(p6,p7,p8,pmed,-e1)
    p12=Base.Vector(b-e2,h/2.0-e1)
    p11=p12.add(Base.Vector(-(b-e-e1)/2.0,-(h/2.0-h1/2.0-2*e1)/2.0))
    l4=Geometria2D.fillet2D(p1,p12,p12,p11,-r1)
    p10=p11.add(Base.Vector(-(b-e-e1)/2.0,-(h/2.0-h1/2.0-2*e1)/2.0))
    p9=Base.Vector(-e2+e,h1/2.0)
    l5=Geometria2D.fillet2D(p11,p10,p9,pmed,e1)
    secPerfil=Part.Face(Part.Wire([l1,l2,l3,l4,l5]))
    secPerfil.rotate(Base.Vector(0,0,0),Base.Vector(1,0,0),90)
    return secPerfil
def secConformado(tipo,tam):
    # Genera la sección de un perfil conformado LF, UF, CF, OF, ZF
    # La nomenclatura empleada para las dimensiones es la de la EAE (anejos de la parte 2)
    # tam: tamaño que define el perfil (por ejemplo: '50.25.3')
    e=eval(tipo)[tam]['e']
    r=eval(tipo)[tam]['r']
    rext=r+e
    if ('LF' in tipo) or ('CF' in tipo) or ('OF' in tipo):
        a=eval(tipo)[tam]['a']
        b=eval(tipo)[tam]['b']
    if 'UF' in tipo:
        b=eval(tipo)[tam]['b']
    if ('UF' in tipo) or ('CF' in tipo) or ('OF' in tipo):
        h=eval(tipo)[tam]['h']
        c=eval(tipo)[tam]['c']
    if ('LF' in tipo) or ('ZF' in tipo):
        c1=eval(tipo)[tam]['c1']
        c2=eval(tipo)[tam]['c2']
    if 'ZF' in tipo:
        h=eval(tipo)[tam]['h']
        b1=eval(tipo)[tam]['b1']
        b2=eval(tipo)[tam]['b2']
        a1=eval(tipo)[tam]['a1']
        a2=eval(tipo)[tam]['a2']
    if 'LF' in tipo:
        pieza1=Part.makePlane(e,a-rext,Base.Vector(-c2,-(c1-rext)))
        pieza2=Geometria2D.arcoCoronaCircular(r,rext,Base.Vector(-(c2-rext),-(c1-rext)),180,270)
        pieza3=Part.makePlane(b-rext,e,Base.Vector(-(c2-rext),-c1))
        secPerfil=pieza1.fuse(pieza2.fuse(pieza3))
    elif 'UF' in tipo:
        pieza1=Part.makePlane(b-rext,e,Base.Vector(-(c-rext),h/2.0-e))
        pieza2=Geometria2D.arcoCoronaCircular(r,rext,Base.Vector(-(c-rext),h/2.0-rext),90,180)
        pieza3=Part.makePlane(e,h-2*rext,Base.Vector(-c,-(h/2.0-rext)))
        pieza4=Geometria2D.arcoCoronaCircular(r,rext,Base.Vector(-(c-rext),-(h/2.0-rext)),180,270)
        pieza5=Part.makePlane(b-rext,e,Base.Vector(-(c-rext),-h/2.0))
        secPerfil=pieza1.fuse(pieza2.fuse(pieza3.fuse(pieza4.fuse(pieza5))))
    elif 'CF' in tipo:
        pieza1=Part.makePlane(e,a-rext,Base.Vector(b-c-e,h/2.0-a))
        pieza2=Geometria2D.arcoCoronaCircular(r,rext,Base.Vector(b-c-rext,h/2.0-rext),0,90)
        pieza3=Part.makePlane(b-2*rext,e,Base.Vector(-(c-rext),h/2.0-e))
        pieza4=Geometria2D.arcoCoronaCircular(r,rext,Base.Vector(-(c-rext),h/2.0-rext),90,180)
        pieza5=Part.makePlane(e,h-2*rext,Base.Vector(-c,-(h/2.0-rext)))
        pieza6=Geometria2D.arcoCoronaCircular(r,rext,Base.Vector(-(c-rext),-(h/2.0-rext)),180,270)
        pieza7=Part.makePlane(b-2*rext,e,Base.Vector(-(c-rext),-h/2.0))
        pieza8=Geometria2D.arcoCoronaCircular(r,rext,Base.Vector(b-c-rext,-(h/2.0-rext)),270,0)
        pieza9=Part.makePlane(e,a-rext,Base.Vector(b-c-e,-(h/2.0-rext)))
        secPerfil=pieza1.fuse(pieza2.fuse(pieza3.fuse(pieza4.fuse(pieza5.fuse(pieza6.fuse(pieza7.fuse(pieza8.fuse(pieza9))))))))
    elif 'OF' in tipo:
        pieza1=Part.makePlane(a-rext,e,Base.Vector(-(a+b/2.0-e),-c))
        pieza2=Geometria2D.arcoCoronaCircular(r,rext,Base.Vector(-b/2.0-r,-c+rext),270,360)
        pieza3=Part.makePlane(e,h-2*rext,Base.Vector(-b/2.0,-(c-rext)))
        pieza4=Geometria2D.arcoCoronaCircular(r,rext,Base.Vector(-(b/2.0-rext),h-c-rext),90,180)
        pieza5=Part.makePlane(b-2*rext,e,Base.Vector(-(b/2.0-rext),h-c-e))
        pieza6=Geometria2D.arcoCoronaCircular(r,rext,Base.Vector(b/2.0-rext,h-c-rext),0,90)
        pieza7=Part.makePlane(e,h-2*rext,Base.Vector(b/2.0-e,-(c-rext)))
        pieza8=Geometria2D.arcoCoronaCircular(r,rext,Base.Vector(b/2.0+r,-c+rext),180,270)
        pieza9=Part.makePlane(a-rext,e,Base.Vector(b/2.0+r,-c))
        secPerfil=pieza1.fuse(pieza2.fuse(pieza3.fuse(pieza4.fuse(pieza5.fuse(pieza6.fuse(pieza7.fuse(pieza8.fuse(pieza9))))))))
    elif 'ZF' in tipo:
        pieza1=Part.makePlane(e,a1-rext,Base.Vector(-(b1-c2),c1-a1))
        pieza2=Geometria2D.arcoCoronaCircular(r,rext,Base.Vector(-(b1-c2-rext),c1-rext),90,180)
        pieza3=Part.makePlane(b1-2*rext,e,Base.Vector(-(b1-c2-rext),c1-e))
        pieza4=Geometria2D.arcoCoronaCircular(r,rext,Base.Vector(c2-rext,c1-rext),0,90)
        pieza5=Part.makePlane(e,h-2*rext,Base.Vector(c2-e,-(h-c1-rext)))
        pieza6=Geometria2D.arcoCoronaCircular(r,rext,Base.Vector(c2-e+rext,-(h-c1-rext)),180,270)
        pieza7=Part.makePlane(b2-2*rext,e,Base.Vector(c2-e+rext,-(h-c1)))
        pieza8=Geometria2D.arcoCoronaCircular(r,rext,Base.Vector(c2-e+b2-rext,-(h-c1-rext)),270,360)
        pieza9=Part.makePlane(e,b2-rext,Base.Vector(c2-e+b2-e,-(h-c1-rext)))
        secPerfil=pieza1.fuse(pieza2.fuse(pieza3.fuse(pieza4.fuse(pieza5.fuse(pieza6.fuse(pieza7.fuse(pieza8.fuse(pieza9))))))))

    secPerfil.rotate(Base.Vector(0,0,0),Base.Vector(1,0,0),90)
    return secPerfil