// Element
//     aaabalk.vel
//
//Application
//     pelare
//
//Description
//     Detta element skapar en stålpelare av profiltyp
//
//Implementaion
//
//
//
//Authur
//     Mats Hallgren November 1997
//
//Copyright
//     Byggnadstekniska Byrån i Stockholm AB
//
//Version
//     1.0 (1997-11-17)
//
//////////////////////////////////////////
#include <drawlib.vel>  ?  
#include <math.vel>
#include <base.vel>
#include <libvel.vel>
#include <objlib.vel>

#define CENTRUML 1000   ?  
// Variabel deklaration

element aaabalk {
       saved
           // def balktabell & dialog
           float LENGTH = 3.0m     ? 
           float h = 96mm     ? 
           float b = 100mm     ? 
           float t = 8.0mm     ? 
           float d = 5.0mm     ? 
           float R = 12mm     ? 
           float F = 0.561     ? 
           float g = 16.7     ? 
           string MATERIAL = "steel"     ? 
           string shape = "HEA"     ? 
           string ipe = "100"     ? 
           string hea = "100"     ? 
           string heb = "100"     ? 
           string balktyp = "Synlig kant"     ? 
           string OMKap1 = "Ök X+"     ? 
           float TKap1 = 0     ? 
           string OMKap2 = "Uk X+"     ? 
           float TKap2 = 0      ? 
           float Rotl = 0.0     ? 
           float Rotp = 0.0     ? 
           float Rote = 0.0      ? 
           
           // allmän variabel variabel
           integer DOSTRETCH = 1     ? 
           integer extrude1     ? 
           integer balk2     ? 
           integer balk3     ? 
           integer balk2A     ? 
           float Angel3D1 = 0     ? 
           float Angel3D2 = 0     ? 
           float Turn1 = 0     ? 
           float Turn2 = 0     ? 
           float Adist1 = 0     ? 
           float Bdist1 = 0     ? 
           float Adist2 = 0     ? 
           float Bdist2 = 0     ? 
           float lengd1=0     ? 
           float lengd2=0     ? 
           float kaplengd=0     ? 
           float YTA=0     ? 
           float VIKT=0     ? 
           integer Dim = 0     ? 
           float AngelP11 = 0     ? 
           float AngelP12 = 0     ? 
           float AngelP21 = 0     ? 
           float AngelP22 = 0     ? 
           float di1 = 0     ? 
           float di2 = 0     ? 
           float di3 = 0     ? 
           float di4 = 0     ? 
           float di5 = 0     ? 
           float di6 = 0     ? 
           float di7 = 0     ? 
           
       private
           // funtionsdeklarationer
           void OnCreate ()
           void OnEdit ()
           void OnWrite ()
           void OnSave ()
           void setValueBALK ()
           void start ()
           void rita3D ()
           integer cutEdge1 (integer ,  integer)
           integer cutEdge2 (integer ,  integer)
           void vy1 ()
           void vy2 ()
           void vy3 ()

       views
           plan
           View3d
           
       dialog
               aaabalkDlg
}

// Dialog deklaration
link aaabalkDlg {
       balktyp    RBshape
       LENGTH     Tlength
       shape      OMshape
       ipe        OMipe
       hea        OMhea
       heb        OMheb
       MATERIAL   QYmaterial
       Rotl       Trotl
       Rotp       Trotp
       Rote       Trote
       OMKap1     OMkap1
       TKap1      Tkap1
       OMKap2     OMkap2
       TKap2      Tkap2
}


//----------------- UPPSTART -----------------//
/////////////////////////////////////////////////////////////
// Läs in från dialogboxen
// Kolla vilken balktyp och dimension
//
// Läs in värden från fil
//
// Kontrollera kapvinklarnas värde, riktning 
//    Max vinkel 85 grader
//    Endast en kapning per ände

/////////////////////////////////////////////////////////////
void OnCreate (){           ?  

    setValueBALK ()
    start ()
}

void OnEdit (){           ?  

    setValueBALK ()
    start ()
    
cout << endl
cout << endl
cout << "Profil: " << shape << Dim << endl
cout << "Kaplängd: " << kaplengd/10 << " mm  Vikt: " <<  VIKT << " kg    Mantelyta: " << YTA << " m2 " << endl
}

void OnSave (){ }           ?  

void OnWrite (){ }           ?  


/////////////////////////////////////////////////////////////
void start () {           ?  

    if (TKap1 >= 85) { TKap1=85 }
    if (TKap1 <= 0)  { TKap1=0 }
    if (TKap2 >= 85) { TKap2=85 }
    if (TKap2 <= 0)  { TKap2=0 }
    
    Angel3D1=Angel3D2=0
    AngelP11=AngelP12=AngelP21=AngelP22=0
    
    if ((TKap1 != 0) && (OMKap1 == "Ök X+")) {
       Angel3D1 = TKap1
       Turn1 = 0
       Adist1=h
       Bdist1=b
       AngelP11=0
       AngelP12=TKap1
    } 
    if ((TKap1 != 0) && (OMKap1 == "Ök X-")) {
       Angel3D1 = TKap1
       Turn1 = 180
       Adist1=h
       Bdist1=b
       AngelP11=0
       AngelP12=-TKap1
    } 
    if ((TKap1 != 0) && (OMKap1 == "Ök Y+")) {
       Angel3D1 = TKap1
       Turn1 = 90
       Adist1=b
       Bdist1=h
       AngelP11=TKap1
       AngelP12=0
    } 
    if ((TKap1 != 0) && (OMKap1 == "Ök Y-")) {
       Angel3D1 = TKap1
       Turn1 = 270
       Adist1=b
       Bdist1=h
       AngelP11=-TKap1
       AngelP12=0
    } 
//////
    if ((TKap2 != 0) && (OMKap2 == "Uk X+")) {
       Angel3D2 = TKap2
       Turn2 = 180
       Adist2=h
       Bdist2=b
       AngelP21=0
       AngelP22=-TKap2
    } 
    if ((TKap2 != 0) && (OMKap2 == "Uk X-")) {
       Angel3D2 = TKap2
       Turn2 = 0
       Adist2=h
       Bdist2=b
       AngelP21=0
       AngelP22=TKap2
    } 
    if ((TKap2 != 0) && (OMKap2 == "Uk Y+")) {
       Angel3D2 = TKap2
       Turn2 = 270
       Adist2=b
       Bdist2=h
       AngelP21=-TKap2
       AngelP22=0
    } 
    if ((TKap2 != 0) && (OMKap2 == "Uk Y-")) {
       Angel3D2 = TKap2
       Turn2 = 90
       Adist2=b
       Bdist2=h
       AngelP21=TKap2
       AngelP22=0
    }
    
    if( Angel3D1 == 0) { lengd1=0 }
    else { lengd1=Bdist1*tan(Angel3D1)/2 }
    if( Angel3D2 == 0) { lengd2=0 }
    else { lengd2=Bdist2*tan(Angel3D2)/2 }

    kaplengd=LENGTH+lengd1+lengd2
    YTA  =kaplengd*F/10000
    VIKT =kaplengd*g/10000
// cout << "lengd1 lengd2 kaplengd  " << lengd1 << "   " << lengd2 << "  " << kaplengd << endl
}
////////////////////////////////////////////////////////////////////////////
void setValueBALK (){           ?  
    string textrad = ""
    string file = "/usr/reflex/data/BTBprofiles.lst"
    integer file_pt = 0 
    file_pt = openfr (file)
    integer teckentyp = 0
    integer tt2 = 0
    string sign1 = ""
    string sign2 = ""
    string signUT = ""
    float dim1 = 0 
    float dim2 = 0 
    integer aa = 10
    integer profilen = 0 
    integer dimension = 0 
    integer counter = 0 
    integer cont2 = 0 
    integer proftype = 0 
               if (shape == "IPE"){ 
                   Dim= ipe 
                   proftype=1 
               }
               if (shape == "HEA"){ 
                   Dim= hea 
                   proftype=1 
               }
               if (shape == "HEB"){ 
                   Dim= heb 
                   proftype=1 
               }               

    if (file_pt) {
       while (reads (file_pt, textrad) != -1 ) {
           tt2=teckentyp
           cont2=counter
           if (textrad == "#") { teckentyp = 1 } else {
           if (textrad == "0") { teckentyp = 2 dim1=0 } else {
           if (textrad == "1") { teckentyp = 2 dim1=1 } else {
           if (textrad == "2") { teckentyp = 2 dim1=2 } else {
           if (textrad == "3") { teckentyp = 2 dim1=3 } else {
           if (textrad == "4") { teckentyp = 2 dim1=4 } else {
           if (textrad == "5") { teckentyp = 2 dim1=5 } else {
           if (textrad == "6") { teckentyp = 2 dim1=6 } else {
           if (textrad == "7") { teckentyp = 2 dim1=7 } else {
           if (textrad == "8") { teckentyp = 2 dim1=8 } else {
           if (textrad == "9") { teckentyp = 2 dim1=9 } else {
           if (textrad == " ") { teckentyp = 3 counter++ } else {
           if (textrad == "011") { teckentyp = 3 counter++ } else { // Tab
           if (textrad == "012") { teckentyp = 3 signUT="" if (dimension==1) { counter++ } else { counter=0 }  } else { // Return
           if (textrad == ".") { teckentyp = 4 } else { 
           if (textrad == ",") { teckentyp = 4 } else { 
               sign1=textrad   teckentyp = 5 }
           } } } } } } } } } } } } } } }

           if ( (teckentyp == 2) && (tt2 !=4) && (aa <= 10)) { dim2 = dim2*10 + dim1 }
           if ( (teckentyp == 2) && ( aa>10 || tt2 == 4)) { dim2 = dim2 + dim1/aa aa=aa*10 }
           if ( teckentyp == 3 ) { aa=10 }

           if ( teckentyp == 5) { signUT = signUT + sign1
           } else { sign1=" " }
           
           ////////// Hitta rätt balktyp
           if ((profilen != 1) && (signUT == shape)) {
//             cout << "Profilen hittad  " << signUT << Dim << endl
               profilen=1
           }
           ////////// END OF Hitta rätt balktyp
           
           ////////// Hitta rätt dimension
           if (profilen==1) {
               if ((dim2 == Dim) && (counter == 1 )) { dimension=1 }
               if ( (cont2 != counter) ) {
                   if (dimension==1){
//                 cout << " counter  h b t d R F g  "  << counter << "  " << h << "  " << b << "  " << t << "  " << d << "  " << R << "  " << F << "  " << g << endl
                   if (proftype==1 && dimension == 1 && counter==2) { h= dim2*10 }
                   if (proftype==1 && dimension == 1 && counter==3) { b= dim2*10 }
                   if (proftype==1 && dimension == 1 && counter==4) { t= dim2*10 }
                   if (proftype==1 && dimension == 1 && counter==5) { d= dim2*10 }
                   if (proftype==1 && dimension == 1 && counter==6) { R= dim2*10 }
                   if (proftype==1 && dimension == 1 && counter==7) { F= dim2 }
                   if (proftype==1 && dimension == 1 && counter==8) { g= dim2 }
                   }
                   dim1=dim2=0
               }
           }
           ////////// END OF Hitta rätt dimension
           
           
    } // END OF while (reads (file_pt, textrad) != -1 ) {
       
       closef(file_pt)
    } else {  // END OF if (file_pt)
       cout << "Hittar inte filen    " << file << "      Kontakta läkare       :o)" << endl
       cout << endl
    }

}

//----------------- VYER -----------------//
///////////////////////////////////////////
// ---VYER-allmänt---
//    Kolla profiltyp och anropa rätt funktion
//    Om (kapvinkel = 0)  
//     Rita upp rak profil
//    Annars
//        Flytta penna ner från insättningspunkt till startpunkt + 100 mm
//     
//     Byt penna till centrum-penna
//     Rita centrumlinje (profil-längd + 100mm åt vardera ände)
//     
//     Flytta penna ner från insättningspunkt till startpunkt
//     Byt penna till heldragen-penna
//     
//     Om synlig kant och visningläge ON
//         rita snylig kantprofil
//     Om skymd kant och visningläge ON
//         rita skymd kantprofil
//     Om visningläge OFF
//        rita rak kantprofil
//     
//     Rita längden av profilen (-kanterna)
//     
//     Om synlig kant och visningläge ON
//         rita snylig kantprofil
//     Om skymd kant och visningläge ON
//         rita skymd kantprofil
//     Om visningläge OFF
//        rita rak kantprofil
//        
//     Byt penna till heldragen-penna
//     Rita det sista draget med den!!!!!!!    

//////////////////////////////////////////////
// ---VY 3D---
//    Rita upp profilen
//    Rita upp kapvinklarna
//    Ta bort kapvinklarna från profilen

//    Rotera runt egen axel
//     %360
//     om (vridning plan == 0) && (vridning egenaxel != 0)
//     vridning plan = vridning egenaxel
//     vridning egenaxel=0         
//
//  Luta profilen
//     %180  (-90 / +90)
//
//    Rotera i plan
//     %360
//     
//     
// Skriv värden i dialogboxen


//----------------- 3D-VY -----------------//
3D vy
///////////////////////////////////////////
///     view View3d
///////////////////////////////////////////
view View3d {           ?  
   rita3D()
   if (Angel3D1 != 0 && Angel3D2 == 0) {
       balk2= cutEdge1 (Bdist1, Adist1)
       DRWrotate(balk2, 0, 0, 0, -Rote, -Rotl, 0)
       DRWshow(balk2)
    }
    if (Angel3D1 == 0 && Angel3D2 != 0) {
       balk3= cutEdge2 (Bdist2, Adist2)
       DRWrotate(balk2, 0, 0, 0, -Rote, -Rotl, 0)
       DRWshow(balk3)
    }
    if (Angel3D1 != 0 && Angel3D2 != 0) {
       balk2= cutEdge1 (Bdist1, Adist1)
       balk3= cutEdge2 (Bdist2, Adist2)
       DRWrotate(balk2, 0, 0, 0, -Rote, -Rotl, 0)
       DRWshow(balk3)
    }
    if (Angel3D1 == 0 && Angel3D2 == 0) {
       DRWrotate(extrude1, 0, 0, 0, -Rote, -Rotl, 0)
       DRWshow(extrude1)
    }
}

///////////////////////////////////////////
///     void rita3D ()
///////////////////////////////////////////
void rita3D ()           ?  
{
       DRWreset()
       DRWuseMaterial(MATERIAL)
       DRWmode(DRW_DIVERT)
       integer profile = DRWopenAssembly(0)
       DRWmr3(0, 0,-h/2)
       DRWadd(profile,DRWlr3(0, b/2,0))
       DRWadd(profile,DRWlr3(0, 0,t))
       DRWadd(profile,DRWlr3(0, -(b/2-d/2),0))
       DRWadd(profile,DRWlr3(0, 0,(h-2*t)))
       DRWadd(profile,DRWlr3(0, (b/2-d/2),0))
       DRWadd(profile,DRWlr3(0, 0,t))
       DRWadd(profile,DRWlr3(0, -b,0))
       DRWadd(profile,DRWlr3(0, 0,-t))
       DRWadd(profile,DRWlr3(0, (b/2-d/2),0))
       DRWadd(profile,DRWlr3(0, 0,-(h-2*t)))
       DRWadd(profile,DRWlr3(0, -(b/2-d/2),0))
       DRWadd(profile,DRWlr3(0, 0,-t))
       DRWadd(profile,DRWlr3(0, b/2,0))
       
       if ((OMKap1 == "Ök X-") || (OMKap1 == "Ök X+") ) {
           DRWmoveBy(profile, -b* tan(Angel3D1)/2, 0, 0)
       } else {
           DRWmoveBy(profile, -h* tan(Angel3D1)/2, 0, 0)
       }
       extrude1 = DRWextrude(profile,(LENGTH + lengd1 + lengd2), 0,0)
       DRWdelete(profile)
}

// Diverse ritfunktioner för 3D-view
///////////////////////////////////////////
///     void cutEdge1 ()
///////////////////////////////////////////
integer cutEdge1 (integer IN1,integer IN2) {           ?  
       DRWreset()
       DRWmode(DRW_DIVERT)
       integer cutbody1 = DRWopenAssembly(0)
       integer extrude2A

       DRWma3(0, 0, 0) 
       DRWmr3(-IN1*tan(Angel3D1)/2, -IN1/2, 0)
       DRWadd(cutbody1,DRWlr3(IN1*tan(Angel3D1), 0, 0))
       DRWadd(cutbody1,DRWlr3(-IN1*tan(Angel3D1), IN1, 0 ))
       DRWadd(cutbody1,DRWlr3(0, -IN1, 0 ))

       extrude2A = DRWextrude(cutbody1, 0, 0, IN2)

       DRWmoveBy(extrude2A, 0, 0, -IN2/2)
       DRWrotate(extrude2A, 0, 0, 0, Turn1, 0, 0)

       balk2A = DRWsculpt(DRW_SCULPT_SUBTRACT, extrude1, extrude2A)

       DRWdelete(cutbody1)
       DRWdelete(extrude2A)
       DRWdelete(extrude1)
       return (balk2A)
}

///////////////////////////////////////////
///     void cutEdge2 ()
///////////////////////////////////////////
integer cutEdge2 (integer IN1,integer IN2)          ?  
{
       DRWreset()
       DRWmode(DRW_DIVERT)
       integer cutbody2 = DRWopenAssembly(0)
       integer extrude2B

       DRWma3(0, 0, 0)
       DRWmr3(-IN1*tan(Angel3D2)/2, -IN1/2, 0)
       DRWadd(cutbody2,DRWlr3(-IN1*tan(Angel3D2), 0, 0))
       DRWadd(cutbody2,DRWlr3(IN1*tan(Angel3D2), IN1, 0 ))
       DRWadd(cutbody2,DRWlr3(0, -IN1, 0 ))
       extrude2B = DRWextrude(cutbody2, 0, 0, IN2)
       
       DRWmoveBy(extrude2B, (LENGTH + IN1*tan(Angel3D2)), 0, -IN2/2)
       DRWrotate(extrude2B, 0, 0, 0, Turn2, 0, 0)
       
       if (Angel3D1 != 0 ) {
           balk2 = DRWsculpt(DRW_SCULPT_SUBTRACT, balk2A, extrude2B)
           DRWdelete(balk2A)
       } else {
           balk2 = DRWsculpt(DRW_SCULPT_SUBTRACT, extrude1, extrude2B)
           DRWdelete(extrude1)
       }

       DRWdelete(cutbody2)
       DRWdelete(extrude2B)
       return (balk2)

}


//----------------- PLAN-VY -----------------//
///////////////////////////////////////////
///     view plan
///////////////////////////////////////////
view plan {          ?  

    DRWreset( )
    DRWmode(DRW_DIVERT)
    integer profile = DRWopenAssembly(0)
    
    if (Rotl == 90 || Rotl == 270) { 
       vy3()
    } else {  
       DRWusePen("BtBPen4")  // Center (linje typ Chained)
       DRWmr2( -(CENTRUML+lengd1), 0)
       DRWadd(profile, DRWlr2(LENGTH + 2*CENTRUML+lengd1+lengd2, 0) )
       DRWshow (profile)
              if (Rote>=180) { a= Rote -180 } 
              else { a=Rote }
              if (a <= 45 || a > 135) { vy1() }
       else { vy2() }
    }

}

///////////////////////////////////////////
///     void vy1 ()
///////////////////////////////////////////
Plan vy  (vy1)
void vy1 () {          ?  
    DRWreset( )
    DRWmode(DRW_DIVERT)
    integer profile = DRWopenAssembly(0)

    di1 = b
    di2 = d/2
    di3 = h
    di4 = fabs(di3/2*tan(AngelP11))
    di5 = fabs(di3/2*tan(AngelP21))
    di6 = fabs((h/2-t)*tan(AngelP11))
    di7 = fabs((h/2-t)*tan(AngelP21))
    
    if (balktyp == "Synlig kant") {
    DRWusePen("BtBPen5")  // Hidden 
    DRWma2(di4 -(di2*tan(AngelP12)), di2)
    DRWadd(profile, DRWlr2(LENGTH -di4+(di2*tan(AngelP12))  -di5+(di2*tan(AngelP22)), 0))
    DRWma2(di4 +(di2*tan(AngelP12)), -di2)
    DRWadd(profile, DRWlr2(LENGTH  -di4-(di2*tan(AngelP12))  -di5-(di2*tan(AngelP22)) , 0))
    }

    DRWusePen("BtBPen1")  // Solid 
    DRWma2(-di4 -(di1*tan(AngelP12)/2), di1/2)
    DRWadd(profile, DRWlr2(di1*tan(AngelP12), -di1))
    DRWadd(profile, DRWlr2(LENGTH +di4-(di1*tan(AngelP12))/2 +di5-(di1*tan(AngelP22))/2 , 0))
    DRWma2(-di4 -(di1*tan(AngelP12)/2), di1/2)
    DRWadd(profile, DRWlr2(LENGTH +di4+(di1*tan(AngelP12))/2 +di5+(di1*tan(AngelP22))/2 , 0))
    DRWadd(profile, DRWlr2(-(di1*tan(AngelP22)), -di1))
    
    if (balktyp == "Synlig kant") {   
    if (AngelP11 !=0) {
       if (AngelP11 <0) { DRWusePen("BtBPen1") } // Solid 
       else { DRWusePen("BtBPen5") } // Hidden 
       DRWma2(di4, di1/2)
       DRWadd(profile, DRWlr2(0, -di1))
       DRWma2(di6, di1/2)
       DRWadd(profile, DRWlr2(0, -((di1/2)+di2)))
       DRWadd(profile, DRWlr2(-2*di6, 0))
       DRWadd(profile, DRWlr2(0, ((di1/2)+di2)))
       DRWma2(di6, -di1/2)
       DRWadd(profile, DRWlr2(0, ((di1/2)+di2)))
       DRWadd(profile, DRWlr2(-2*di6, 0))
       DRWadd(profile, DRWlr2(0, -((di1/2)+di2)))
    }
    if (AngelP21 !=0) {
       if (AngelP21 <0) { DRWusePen("BtBPen1") } // Solid 
       else { DRWusePen("BtBPen5") } // Hidden 
       DRWma2(LENGTH-di5, di1/2)
       DRWadd(profile, DRWlr2(0, -di1))
       DRWma2(LENGTH+di7, di1/2)
       DRWadd(profile, DRWlr2(0, -((di1/2)+di2)))
       DRWadd(profile, DRWlr2(-2*di7, 0))
       DRWadd(profile, DRWlr2(0, ((di1/2)+di2)))
       DRWma2(LENGTH+di7, -di1/2)
       DRWadd(profile, DRWlr2(0, ((di1/2)+di2)))
       DRWadd(profile, DRWlr2(-2*di7, 0))
       DRWadd(profile, DRWlr2(0, -((di1/2)+di2)))
    }
    }
    MATrotate (-Rote, 0, 0)
// problem med att vid lutning av profil och planredovisnoneen!!!!!!!!!!!!!!!!!!!!
    


    DRWshow (profile)
}

///////////////////////////////////////////
///     void vy2 ()
///////////////////////////////////////////
Plan vy  (vy2)
void vy2() {             ?  
    DRWreset( )
    DRWmode(DRW_DIVERT)
    integer profile = DRWopenAssembly(0)
  
    di1 = h
    di2 = h/2-t
    di3 = b
    di4 = fabs(di3/2*tan(AngelP12))
    di5 = fabs(di3/2*tan(AngelP22))
    di6 = fabs((d/2)*tan(AngelP12))
    di7 = fabs((h/2)*tan(AngelP22))
        
    DRWusePen("BtBPen1")  // Solid
    if(AngelP11 != 0){
       DRWma2(-(di1*tan(AngelP11)/2), di1/2)
       DRWadd(profile, DRWlr2(di1*tan(AngelP11), -di1))
    } else {
       DRWma2(-di4, di1/2)
       DRWadd(profile, DRWlr2(0, -t))
       DRWmr2(fabs((di3/2-d/2)*tan(AngelP12)), 0)
       DRWadd(profile, DRWlr2(0, -(di1-t-t)))
       DRWmr2(-fabs((di3/2-d/2)*tan(AngelP12)), 0)
       DRWadd(profile, DRWlr2(0, -t))
    }
    if(AngelP21 != 0){
       DRWma2(LENGTH +(di1*tan(AngelP21))/2, di1/2)
       DRWadd(profile, DRWlr2(-(di1*tan(AngelP21)), -di1))
    } else {
       DRWma2(LENGTH +(di1*tan(AngelP21))/2+di5, di1/2)
       DRWadd(profile, DRWlr2(0, -t))
       DRWmr2(-fabs((di3/2-d/2)*tan(AngelP22)), 0)
       DRWadd(profile, DRWlr2(0, -(di1-t-t)))
       DRWmr2(fabs((di3/2-d/2)*tan(AngelP22)), 0)
       DRWadd(profile, DRWlr2(0, -t))
    }
    DRWSma2(-di4 +(di1*tan(AngelP11)/2), -di1/2)
    DRWadd(profile, DRWlr2(LENGTH +di4-(di1*tan(AngelP11))/2 +di5-(di1*tan(AngelP21))/2 , 0))
    DRWma2(-di4 -(di1*tan(AngelP11)/2), di1/2)
    DRWadd(profile, DRWlr2(LENGTH +di4+(di1*tan(AngelP11))/2 +di5+(di1*tan(AngelP21))/2 , 0))
    DRWma2(-di4 -(di2*tan(AngelP11)), di2)
    DRWadd(profile, DRWlr2(LENGTH +di4+(di2*tan(AngelP11))  +di5+(di2*tan(AngelP21)), 0))
    DRWma2(-di4 +(di2*tan(AngelP11)), -di2)
    DRWadd(profile, DRWlr2(LENGTH  +di4-(di2*tan(AngelP11))  +di5-(di2*tan(AngelP21)) , 0))


    if (balktyp == "Synlig kant") {
       if (AngelP12 !=0) {
           if (AngelP12 >0) { DRWusePen("BtBPen1") } // Solid
           else { DRWusePen("BtBPen5") } // Hidden
           DRWma2(di4, di1/2)
           DRWadd(profile, DRWlr2(0, -t))
           DRWadd(profile, DRWlr2(-fabs((di3/2-d/2)*tan(AngelP12)), 0))
           DRWadd(profile, DRWlr2(0, -(di1-t-t)))
           DRWadd(profile, DRWlr2(fabs((di3/2-d/2)*tan(AngelP12)), 0))
           DRWadd(profile, DRWlr2(0, -t))
       }
       if (AngelP22 !=0) {
           if (AngelP22 >0) { DRWusePen("BtBPen1") } // Solid 
           else { DRWusePen("BtBPen5") } // Hidden
           DRWma2(LENGTH +(di1*tan(AngelP21))/2-di5, di1/2)
           DRWadd(profile, DRWlr2(0, -t))
           DRWmr2(fabs((di3/2-d/2)*tan(AngelP22)), 0)
           DRWadd(profile, DRWlr2(0, -(di1-t-t)))
           DRWmr2(-fabs((di3/2-d/2)*tan(AngelP22)), 0)
           DRWadd(profile, DRWlr2(0, -t))
       }
    }
    MATrotate (-Rote+90, 0, 0)
    
    DRWshow (profile)
}


////////////////////////////////////
///     void vy3()
///////////////////////////////////
Plan vy  (vy3)
void vy3()             ?  
{
    DRWreset( )
    DRWmode(DRW_DIVERT)
    integer profile = DRWopenAssembly(0)
    DRWmr2(0,-h/2)
    DRWadd(profile,DRWlr2(b/2,0))
    DRWadd(profile,DRWlr2(0,t))
    DRWadd(profile,DRWlr2(-(b/2-R-d/2),0))
    DRWadd(profile,DRWarSER(DRW_CW,-R,R,R))
    DRWadd(profile,DRWlr2(0,(h-2*R-2*t)))
    DRWadd(profile,DRWarSER(DRW_CW,R,R,R))
    DRWadd(profile,DRWlr2((b/2-R-d/2),0))
    DRWadd(profile,DRWlr2(0,t))
    DRWadd(profile,DRWlr2(-b,0))
    DRWadd(profile,DRWlr2(0,-t))
    DRWadd(profile,DRWlr2((b/2-R-d/2),0))
    DRWadd(profile,DRWarSER(DRW_CW,R,-R,R))
    DRWadd(profile,DRWlr2(0,-(h-2*R-2*t)))
    DRWadd(profile,DRWarSER(DRW_CW,-R,-R,R))
    DRWadd(profile,DRWlr2(-(b/2-R-d/2),0))
    DRWadd(profile,DRWlr2(0,-t))
    DRWadd(profile,DRWlr2(b/2,0))
    
    MATrotate (0, 0, -(Rote-90))

    DRWshow(profile)
    
}