Globali
{
   AttivaDebugSuTrace  "" 0 NoSave

   SVN_Lineari_Rev      "SVN revision"  "$Revision: 3041 $"   NoSave

   REV01_SNACK                  "Data attivazione rev.01 piano snack" 200203 NoSave

   //LZ 14/12/2021: revisione massellatura snack
   BDM_REV_Snack_Mass_1         "Revisione massellatura piano snack"  211216 NoSave
   //Luca 07/02/2022
   BDM_REV_Snack_Mass_2         "Revisione massellatura piano snack"  220207 NoSave
   //Simone 03/06/2022
   BDM_REV_Pos_Rubinetto_Kera_1 "Revisione Pos foro rubinetto"        220605 NoSave

   BDM_REV_Pos_Rubinetto_Kera_2 "Revisione Pos foro rubinetto"        220626 NoSave

   BDM_REV_Pos_Rubinetto_Kera_3 "Revisione Pos foro rubinetto"        221018 NoSave
}

Misure
{
   TipoTop "Tipologia Top" < NoDiz >
   {
      Nominali "Vetro 4mm" "Vetro 10mm" "Quarzo 12mm" "Fenix 10mm" "Fenix 12mm"  "XGlass 4mm" "XGlass 10mm"  "MdI 12mm"  "Laminato 29mm" "Steel 29mm" "Wildwood 29mm" "Laminato 31mm" "Madeterraneo 80mm" "Steel 80mm"  "Wildwood 80mm"  "Steel Penisola 80mm"  "Cliente"
      Reali         0           1             2             3           4             6              7            8            10             11             12             13              20               21              22                 23                 99
   }

   TipoSch "Tipologia Schienale" < NoDiz >
   {
      Nominali "Vetro 4mm"  "Vetro 10mm"  "Quarzo 12mm"  "Fenix 10mm"  "Laminglass 10mm"  "Steel 10mm"  "XGlass 4mm"  "XGlass 10mm"  "Fenix 12mm"  "Laminglass 12mm"  "MdI 12mm"  "Alzatina 8mm"  "Alzatina 21mm"  "Alzatina 15mm"
      Reali         0            1              2             3               4                5            6              7               8              9                10           100             101             102
   }

   AltSch "Altezza Schienale" < OnlyDesc >
   {
      Nominali  92   184   368   552   736
      Reali     92   184   368   552   736
   }

   AltSchRid "Altezza Schienale" < OnlyDesc >
   {
      Nominali  368   552   736
      Reali     368   552   736
   }

   PrfStTp "Profondità sottotop" < OnlyDesc;NoDiz >
   {
      Nominali  676 1392
      Reali     676 1392
   }

   TipoPiaPen "Tipologia piano penisola" < NoDiz >
   {
      //Luca 04/03/2020 FENIX 80mm creato da LAGO
      Nominali "Steel 80mm"   "Wildwood 80mm"   "Fenix 80mm"
      Reali       21               22                23
   }

   TipoPen "Tipologia penisola" < OnlyDesc;NoDiz >
   {
      Nominali "Appoggio"   "Muro"
      Reali        0           1
   }

   RieXSV "Rientro supporto" < OnlyDesc >
   {
      Nominali    "184"   "368"    "A Disegno"
      Reali        184     368           0
   }

   PosPenisola "Posizione pensiola" < OnlyDesc >
   {
      //Nominali    "Sinistra"  "Destra" "Perpendicola SX fronte" "Perpendicola SX retro" "Perpendicola DX fronte" "Perpendicola DX retro"
      //Reali           -1         1            -10                       -11                        10                         11
      Nominali    "Perpendicola SX retro" "Perpendicola SX fronte" "Sinistra"  "Destra"  "Perpendicola DX fronte" "Perpendicola DX retro"
      Reali               -11                    -10                   -1         1                 10                         11
   }

   //TpTestaPia  "Tipo testa piano" < OnlyDesc >
   //{
   //   Nominali    "Teste Aperte"   "Teste chiuse"
   //   Reali         0                    1
   //}

   LarLavKERA  "Larghezza Lavabo KERA" < OnlyDesc >
   {
      Nominali 400 500 600 650 750
      Reali    400 500 600 650 750
   }

   PrfLavKERA  "Profondità Lavabo KERA" < OnlyDesc >
   {
      Nominali 380 400
      Reali    380 400
   }

   // 14/04/21 - Gestione per TOP STEEL A SBALZO
   PosX_SteelPen "Posizione Penisola per Top-Steel"  < OnlyDesc >
   {
      Nominali  "Sinistra"   "Destra"
      Reali      -1           1
   }

   DimP_AirK "Dimensione penisola AIR KITCHEN" < OnlyDesc;NoDiz >
   {
      Nominali  1400   1600  1800
      Reali     1400   1600  1800
   }

   TipoP_AirK "Tipologia piano penisola AIR Kitchen" < NoDiz >
   {
      Nominali   "Vetro 10mm" "Wildwood 80mm"
      Reali           1            22
   }
}

Elemento Top
{
   Descrizione = "Top"
   Code        = TOP
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""
   Alias BDM_Top;TSTP_NoQuota;StpTop;TOP_OLD

   Variabili
   {
      //#include %install_dir%\bdm\var_db.inc
      #include %path_bdm%\var_db.inc

      X     "Lunghezza"  1000  Utente ( 100- )
      //la X è nascosta.Xt è comprensiva dei bordi...
      Xt    "Lunghezza + SBORDI"    1000

      //...questa è la X + sbordi - riduzioni dei tagli maschi
      X_Tot "Lunghezza Totale"      1000 ShowAlways
      Y     "Spessore"                30 ShowAlways
      Z     "Profondità"             602 //Utente ( 62- )
      Zt    "Profondità totale"      602 Utente (  )

      Filler2 " " "" ShowAlways

      EscSottotop "Escludi Sottotop"  0 Menu ( SiNo )

      AA_SBORDO_SX     "Maggiora o riduce a sinistra" 0  Utente ( )
      AA_SBORDO_FRONTE "" 26 // = rie_basi , per ora non modificabile
      AA_SBORDO_DX     "Maggiora o riduce a destra"   0  Utente ( )

      //sbordi automatici,non editabili, gestiti a bdm
      //top nobile rispetto ingombro
      aa_sbrd_sx  "sbordo top sx "      0 SaveAlways
      aa_sbrd_dx  "sbordo top dx "      0 SaveAlways
      aa_sbrd_fr  "sbordo top frontale" 0 SaveAlways
      aa_sbrd_rt  "sbordo top retro"    0 SaveAlways

      //sbordo retro
      aa_sbrd_ret "" 0
      //sbordi automatici,non editabili, gestiti a bdm
      //top nobile rispetto ingombro
      aa_st_rie_sx  "rientro sottotop sx "      0 SaveAlways
      aa_st_rie_dx  "rientro sottotop dx "      0 SaveAlways
      aa_st_rie_fr  "rientro sottotop frontale" 0 SaveAlways
      aa_st_rie_rt  "rientro sottotop retro"    0 SaveAlways

      ConFiancoFin_Sx "" 0
      ConFiancoFin_Dx "" 0

      ConFusion_Sx "" 0
      ConFusion_Dx "" 0

      //Luca 24/07/2019
      //1 -- TOP fusion dritto
      //2 -- Top FUSION sagomato
      TopFusion       "Top Fusion" 0 SaveAlways
      //se top fusion 2 devo trovare posizione e dimensione scasso
      //FSN_Posizione RS - RD - FS - FD
      FSN_ScsPos      "" ""
      FSN_ScsX        "" 0
      FSN_ScsZ        "" 0
      FSN_Scs_ST_X    "" 0
      FSN_Scs_ST_Z    "" 0
      idx_top_fusion  "" 0

      //gestione sottotop
      //1 dividi in X
      //2 dividi in Z
      DividiSottoTop "" 0 SaveAlways

      aa_st2_rie_sx  "" 0
      aa_st2_rie_rt  "" 0
      Ang_SottoTop2  "" 0
      X_SottoTop     "" 0 SaveAlways
      X_SottoTop2    "" 0 SaveAlways
      Z_SottoTop2    "" 0 SaveAlways

      Y_SottoTop     ""  19
      Z_SottoTop     ""  0

      //VAR_TipoTop 0 - 9 TOP Nobile + SOTTOTOP
      //VAR_TipoTop = 0 Vetro    23mm  -->  4mm + 19mm
      //VAR_TipoTop = 1 Vetro    29mm  --> 10mm + 19mm
      //VAR_TipoTop = 2 Quarzo   31mm  --> 12mm + 19mm
      //
      //VAR_TipoTop 10 - 19 TOP CORPO UNICO
      //VAR_TipoTop = 10 Laminato 29mm  --> 10mm + 19mm
      //VAR_TipoTop = 11 Acciaio  29mm  --> 10mm + 19mm
      //VAR_TipoTop = 12 Wildwood 30mm  --> 11mm + 19mm
      //
      //VAR_TipoTop 20 - 29 TOP 80
      //VAR_TipoTop = 20 Madeterraneo  80 mm  --> 80mm + 19mm
      //VAR_TipoTop = 21 Acciaio Steel 80mm   --> 80mm + 19mm
      //VAR_TipoTop = 22 Wildwood      80mm   -->  80mm + 19mm
      //VAR_TipoTop = 23 Acciaio Steel Penisola 80mm   --> 80mm
      VAR_TipoTop     "Tipo piano"  0 Menu ( TipoTop )

      SpessorePiano      "" 40
      SpessoreSottoPiano "" 19

      SpessoreTopCliente   "Spessore Top Cliente" 10 Utente ( 0-100 )


      tipo_ang  "" "SX_1" TabBmp ( "\mnu\TabSuAng.mnu" )
      flag_ang "" 0
      // 1-> copro parte sx della base angolo (tipo_ang="SX_1")
      // 0-> copro parte dx della base angolo (tipo_ang="DX_0")
      solo_angolo "" -1

      Z1 "" 0
      Z2 "" 0

      // variabili per tagliatop
      // ***********************************************
      ID_Sin "" -1
      ID_Des "" -1

      que_ord_sx "" -1
      que_ord_dx "" -1

      AngDaPrimoEle "1=si,0=automatico" 1

      Sposta_Profondita "Aggiusta profondita mm." 0

      ang_y_old "" 0
      ang_y "" 0
      HIDE "" 0

      //4manuale + 2selezione
      M4_DIALOG "" 6
      M4_A_MURO "" 1

      //"-" -> brd non previsto
      //GREZZO
      //VISTA
      //      VAR_Bordo_FRONTE "Bordo frontale" "VISTA" //TabStringa ( tab_top_brd.txt )
      //      VAR_Bordo_SX     "Bordo SX"       "-"     //TabStringa ( tab_top_brd.txt )
      //      VAR_Bordo_DX     "Bordo DX"       "-"     //TabStringa ( tab_top_brd.txt )
      //      VAR_Bordo_RETRO  "Bordo retro"    "-"     //TabStringa ( tab_top_brd.txt )
      //bordo_fro "" 1
      //bordo_sx  "" 0  //da varianti
      //bordo_dx  "" 0  //da varianti
      //bordo_ret "" 0  //da varianti

      //punti per scritte bordi
      pos_bordo_fro "" [0,0,0]
      pos_bordo_ret "" [0,0,0]
      pos_bordo_dx "" [0,0,0]
      pos_bordo_sx "" [0,0,0]
      str_bordo_dx "" ""
      str_bordo_sx "" ""

      //08 -> nulla
      //01 -> maschio con ted fronte
      //03 -> femmina con ted fronte
      //51 -> femmina fs
      //52 -> maschio fs
      //58 -> maschio dritto (no ted)
      //59 -> femmina dritto (no ted)
      //
      AA_TAGLIO_SX "Taglio sx"   "08-NN" TabBmp ( "\mnu\TopTgSx.mnu" )
      AA_TAGLIO_DX "Taglio dx"   "08-NN" TabBmp ( "\mnu\TopTgDx.mnu" )
      //
      AA_TAGLIO_FS_SX  "Taglio FS sx" "08-NN" TabBmp ( "\mnu\TopTgSxFS.mnu" )
      AA_TAGLIO_FS_DX  "Taglio FS dx" "08-NN" TabBmp ( "\mnu\TopTgDxFS.mnu" )

      tag_sx "" 8
      tag_dx "" 8
      tag_sx_prec "" 8
      tag_dx_prec "" 8

      ask_X "" 1      //chiede X se posizionato
      ask_Z "" 1      //chiede Z se posizionato

      var_ask_default "" 1
      no_ask_sx "" 0  //chiede tag
      no_ask_dx "" 0  //
      CHIEDI_TAGLI "0=no 1=si" 1 //Menu ( bool )

      adatta_Z  "" 1 //adatta la Z del top alle basi sottostanti
      adatta_Z_accosto "" 0 //adatta la Z alla prof_sx/dx del top vicino

      zsotto    "" 602 //prof basi sotto il top + $Rie_Basi - se adatta_Z = 1 -> Z = zsotto
      zsotto_dx "" 602 //prof base adiacente a DX+$Rie_Basi
      zsotto_sx "" 602 //prof base adiacente a SX+$Rie_Basi

      isola "" 0       SaveAlways //dipende dalla presenza bordo retro
      steso_isola "" 0 SaveAlways //in stesura è steso come isola (cioè su basi contrapposte)

      sch_retroB "" 0
      //SaveAlways  //Claudio 30/10/2018

      //a partire dai piani stesi da questo vers (impostata in stendi e fix in notifica)
      //I tagli maschi in fs non riducono l'ingombro del top (così come era già per le femmine e il tg 03)
      //Mantenendo l'ingombro di stesura è possibile passare da un taglio FEM a un MAS,e da un taglio Dritto ad un Ted,
      //senza errori di ingombri
      TaglioMaschioAMuro "" 0

      mode_sx "" 15
      mode_dx "" 15

      PART "" [255,255,255]
      ARR  "" [255,255,255]

      steso "" 0
      perp "Perpendicolare fino al muro?" 1 Menu ( bool )

      // aggiunte per riduzioni dovute a tagli sui top (tedesco e 90 gradi)
      Rid_dx "" 0
      Rid_sx "" 0
      Rid_sx_FS_retro "" 0 //Valori di riduzione parte retro rispetto al fronte
      Rid_dx_FS_retro "" 0 //

      //top in accosto a sx/dx
      idx_topvic_sx "" -1
      idx_topvic_dx "" -1

      idx_top_SNACK_sx "" -1
      idx_top_SNACK_dx "" -1

      idx_penisola   "" -1
      ConPenisolaApp "" 0

      top_a_sx "" -1 //variabili per la stampa dei piani
      top_a_dx "" -1
      TopPart  "" -1 //Per quotare retro più top
      TopArr   "" -1 //Per quotare retro più top
      QuoteAutomatiche "" 1

      permetti_tg_fs_sx "" 1
      permetti_tg_fs_dx "" 1

      tag_fusqu_dx "" 0
      tag_fusqu_sx "" 0
      //fs_prof_dx "" 0
      //fs_prof_sx "" 0
      tag_giomo_dx "" 0
      tag_giomo_sx "" 0
      tag_pos_sx "" 0
      tag_pos_dx "" 0
      tag_prof_mas_sx "" 0 //(TaglioMaschioAMuro=1) distanza dall'angolo muro al punto unione
      tag_prof_mas_dx "" 0 //maschio top (cioè la prof del top adiacente)  (prima era riversato in aa_sbordo_ )

      //nel cambio tag  58-> 59 dava errore
      lung_fem_dx "" 0 //lunghezza del taglio femmina a destra
      lung_fem_sx "" 0 //lunghezza del taglio femmina a sinistra

      allungamento_sx "" 0
      allungamento_dx "" 0

      ang_a_sx "Ang. FS a SX top" 90 Utente ( 1-179 )
      ang_a_dx "Ang. FS a DX top" 90 Utente ( 1-179 )

      str_term_sx "" "NOR"
      str_term_dx "" "NOR"
      idx_rif_steso_sx "" -1
      idx_rif_steso_dx "" -1

      idx_rif_steso_iso_sx "" -1
      idx_rif_steso_iso_dx "" -1

      //per isola (determina posizione traversi su schiena)
      ZFiaBaseFro "" 576 SaveAlways //prof fia base fronte (Claudio 03/09/2018 SaveAlways così evito VAR_CHANGE )
      ZFiaBaseRet "" 576 SaveAlways //prof fia base retro

      VAR_post_posizionato  "" 0 //Se è stato reso posizionato = 1

      stesi_mode_sx "" 0
      stesi_mode_dx "" 0
      stesi_idx_dx_loc "" -1
      stesi_idx_sx_loc "" -1

      idx_pann_top    "" -1 //idx _top_generico (scarico gestionale pannello top)
      idx_pann_stop   "" -1
      idx_pann_stop2  "" -1

      idx_near_dn "" -1
      idx_near_up "" -1
      idx_near_sx "" -1
      idx_near_dx "" -1
      idx_near_dn_ret2 "" -1 //near down FILO RETRO (es ricercare SchRetroBase)

      idx_near_SNACK_sx "" - 1
      idx_near_SNACK_dx "" - 1

      RifaiVARGEST "" 0 //rilanciare la validazione gestionale

      //A listino è presente un solo composto per ciascuna tipologia
      //Il codice del piano è dato da TipoPiano,Z,bordo retro (isola/top)
      COD_EREDITA "" "PRE;POST"
      VARGEST_AGGIUNTIVE "" "Z;steso_isola;RifaiVARGEST"

      no_collisione "" 1 //escludo collisioni

      CMP2_AZIONI "" "M"

      wk_Rie_Basi  "" 0

      ORD_MISAMETRO "" "X"

      FillerM2G " " "" ShowAlways
   }

   Assegnazioni
   {
      GOSUB AssComune
      M4_MIS = "Filler*;X;Xt;Y*;Z*;EscSottotop;SpessoreTopCliente"

      if( ACTION()==0 )
      {
         HIDE_ON_EDIT2(ATTUALE(),"SpessoreTopCliente",SE_NUM(VAR_TipoTop==99,0,1))
         //non ha senso escludere il sotto top qui
         HIDE_ON_EDIT2(ATTUALE(),"EscSottotop",SE_NUM(VAR_TipoTop==99,1,0))
      }

      //M4_GRUPPO__ = "Piani"
      M4_GRUPPO__ = MSG(1004)
      //se draggato, diventa posizionato
      M4_CNT_LINK_MODE__ = 0

      //escludo collisioni
      no_collisione = 1

      //FLAG PER CHIEDI VARIABILI
      a2io=0
      if( ACTION() == 2
        & CMD()==$CMD_INTERATTIVO
        & $ATTIVA_DLL)              { a2io=1 }

      //if( $ATTIVA_DLL == 1 )
      //{
      //   HIDE_ON_EDIT2(idx_att,"perp",1)
      //   HIDE_ON_EDIT2(idx_att,"tipo_ang",1)
      //   //visibile solo per alcune tipologie di Top
      //   HIDE_ON_EDIT2(idx_att,"VAR_Rie_Tel_Retro",1)
      //}

      SpessoreTappo = 2
      con_Tappo_sx = 0
      con_Tappo_dx = 0
      SpessoreFinituraLaterale = 4
      con_FinituraLaterale_sx = 0
      con_FinituraLaterale_dx = 0

      GOSUB Setta_VarTipoTop

      ////setto sbordi automatici(chiamata anche in notevoli;qui perchè lo sbordo può essere usato da VAR_Rie_Tel_SX/DX)
      //GOSUB Setta_Sbordi_Top

      //per alcune tipologie di piani (es H2 Dritto),in dipendenza dal materiale,
      //i tagli possono essere dritti o con ted. Verifico ed eventualmente sostituisco i tagli
      //GOSUB Cambia_Tagli_Top
   }

// } vai in testa
   PuntiNotevoli
   {
      ins2_att = INSERIMENTO2(idx_att)
      if ( ACTION()==2
         & CMD()==$CMD_INTERATTIVO
         & $ATTIVA_DLL
         & $CNP__==0
         & $OnLoadOrder==0)
      {
         if ( ins2_att==$ins2_posizionato
            | ins2_att==$ins2_agganciato
            | ins2_att==$ins2_accessorio )
         {
            if($PLIKO==0)
            {
               if(ask_X) { res=CHIEDI(idx_att,"X") }
               if(ask_Z) { res=CHIEDI(idx_att,"Z") }
            }
         }
      }

      //setto sbordi automatici
      GOSUB Setta_Sbordi_Top

      GOSUB Setta_Sbordi_SottoTop
      GOSUB Setta_Dimensioni_SottoTop

      Y = SpessorePiano + SpessoreSottoPiano
      Yt = Y

      if( IS_VAR_FIXED(ATTUALE(),"Zt")==1 ) { Z = Zt - aa_sbrd_rt - aa_sbrd_fr }
      else                                  { Zt = Z + aa_sbrd_rt + aa_sbrd_fr }

      base_0 = [-AA_SBORDO_SX,0,   Sposta_Profondita]             alto_0 = base_0 alto_0.y=SpessorePiano
      // da controllare
      //base_1 = [base_0.x                 ,0,Zt+Sposta_Profondita] alto_1 = base_1 alto_1.y=SpessorePiano
      //base_2 = [X+AA_SBORDO_DX,0,Zt+Sposta_Profondita]            alto_2 = base_2 alto_2.y=SpessorePiano
      base_1 = [base_0.x                 ,0,Z+Sposta_Profondita] alto_1 = base_1 alto_1.y=SpessorePiano
      base_2 = [X+AA_SBORDO_DX,0,Z+Sposta_Profondita]            alto_2 = base_2 alto_2.y=SpessorePiano
      base_3 = [base_2.x                 ,0,   Sposta_Profondita] alto_3 = base_3 alto_3.y=SpessorePiano

      //if ( INSERIMENTO(idx_att)==$ins_top_level )
      //{
      //   GOSUB TagliTopDXSX
      //   GOSUB RiduzioniPerTagli
      //}

      //s_a=0
      //GOSUB adeg_lung_x_maschio

      GOSUB top_calcola_xt

      vano_0_0 = base_0
      //con Rid_sx mi riporto alla grafica (coerente con vano_l_0 = X_Tot)
      vano_0_0.x = base_0.x + Rid_sx
      vano_l_0 = X_Tot
      vano_p_0 = Zt

      Zpiano = Zt

      all_rid_sx=Rid_sx + Rid_sx_FS_retro
      all_rid_dx=Rid_dx + Rid_dx_FS_retro

      //Punti per stampe
      pnt_sx  = [base_0.x+all_rid_sx,base_0.y,base_0.z ]
      pnt_sx1 = [base_1.x+all_rid_sx,base_0.y,base_1.z ]
      pnt_dx  = [base_3.x-all_rid_dx,base_0.y,base_0.z ]

      pnt_sx_fro = pnt_sx
      pnt_sx_fro.z = base_1.z
      pnt_dx_fro = pnt_dx
      pnt_dx_fro.z = base_1.z

      // //Punti per linea ed indicazione angolo sx e dx
      // pnt_cnt_ang_sx0 = pnt_sx
      // pnt_cnt_ang_sx  = [pnt_sx.x+75, base_0.y, pnt_sx.z+75]
      // pnt_cnt_ang_sxs = [pnt_sx.x+75, base_0.y, pnt_sx.z+75]
      //
      // pnt_cnt_ang_dx0 = pnt_dx
      // pnt_cnt_ang_dx  = [pnt_dx.x-75 , base_0.y, pnt_dx.z+75]
      // pnt_cnt_ang_dxs = [pnt_dx.x-200, base_0.y, pnt_dx.z+75]
      //
      // pnt_sx_frobl = pnt_sx_fro
      // pnt_dx_frobl = pnt_dx_fro
      //
      // //{punti simbolo bordo
      // pnt_bdrtr = [pnt_sx.x + (Xt-all_rid_sx-all_rid_dx)/2 ,0,0]
      //
      // bbs = (-Z/2)*(SENO(ang_a_sx-90)/COSENO(ang_a_sx-90))
      // pnt_bdsx = [pnt_sx.x + bbs , 0, Z/2]
      //
      // b2d = (Z/2)*(SENO(ang_a_dx-90)/COSENO(ang_a_dx-90))
      // pnt_bddx = [pnt_dx.x + b2d, 0, Z/2]
      //
      // pnt_bdfro = pnt_bdrtr pnt_bdfro.z = pnt_sx_fro.z
      // //}
      //
      // pnt_fsq_sx = pnt_sx_fro
      // pnt_fsq_dx = pnt_dx_fro

      ////stampe : scritta accosto
      //GOSUB Punti_Stp_FS_Top
      //GOSUB Punti_Quote_TagliTop

      //GOSUB DefinisciPuntiLaterali

      //punto_alz_sx       = [pnt_sx.x,base_0.y+SpessorePiano,pnt_sx.z]
      //punto_alz_dx       = [pnt_dx.x,base_0.y+SpessorePiano,pnt_dx.z]
      //punto_alz_sx_fro   = [pnt_sx.x,base_0.y+SpessorePiano,base_1.z]
      //punto_alz_dx_fro   = [pnt_dx.x,base_0.y+SpessorePiano,base_1.z]
      punto_alz_sx       = [base_0.x - aa_sbrd_sx, base_0.y+SpessorePiano, base_0.z]
      punto_alz_dx       = [base_3.x + aa_sbrd_dx, base_0.y+SpessorePiano, base_3.z]
      punto_alz_sx_fro   = [base_0.x - aa_sbrd_sx, base_0.y+SpessorePiano, base_1.z]
      punto_alz_dx_fro   = [base_3.x + aa_sbrd_dx, base_0.y+SpessorePiano, base_2.z]

      dim_top = DISTANZA(pnt_sx,pnt_dx)

      //punti utilizzati in stampa per quotare
      //definisco i punti laterali compresi di rientri
      pnt_b0 = base_0   pnt_b0.x = pnt_b0.x - aa_sbrd_sx        pnt_b0.z = pnt_b0.z - aa_sbrd_rt
      pnt_b1 = base_1   pnt_b1.x = pnt_b1.x - aa_sbrd_sx        pnt_b1.z = pnt_b1.z + aa_sbrd_fr
      pnt_b2 = base_2   pnt_b2.x = pnt_b2.x + aa_sbrd_dx        pnt_b2.z = pnt_b2.z + aa_sbrd_fr
      pnt_b3 = base_3   pnt_b3.x = pnt_b3.x + aa_sbrd_dx        pnt_b3.z = pnt_b3.z - aa_sbrd_rt

      //definisco i punti laterali del sottotop compresi di rientri
      pnt_st_b0 = base_0   pnt_st_b0.x = pnt_st_b0.x + aa_st_rie_sx        pnt_st_b0.z = pnt_st_b0.z + aa_st_rie_rt
      pnt_st_b1 = base_1   pnt_st_b1.x = pnt_st_b1.x + aa_st_rie_sx        pnt_st_b1.z = pnt_st_b1.z - aa_st_rie_fr
      pnt_st_b2 = base_2   pnt_st_b2.x = pnt_st_b2.x - aa_st_rie_dx        pnt_st_b2.z = pnt_st_b2.z - aa_st_rie_fr
      pnt_st_b3 = base_3   pnt_st_b3.x = pnt_st_b3.x - aa_st_rie_dx        pnt_st_b3.z = pnt_st_b3.z + aa_st_rie_rt


      base_so = base_0
      alto_ne = alto_2
   }
   #include %path_bdm%\TLib\Orie.inc

   // } vai in testa
   Procedura OnQueryBdmLocal
   {
      if ( $query_type==1 )
      {
         if ( $M4_DragInfo_Mode==1 )
         {
            idx_att = ATTUALE()
            nome_att = NOME(idx_att)
            M4_snap = $M4_DragInfo_Snap
            M4_idx_muro = $M4_DragInfo_WallIdx

            // livello in altezza
            //GOSUB posiz_teorico_top

            // angolo del muro
            $wk_res = GET_INF_MURO(3,M4_idx_muro)
            $P1 = $muro_pt1
            $P2 = $muro_pt2
            GOSUB calcola_ang_y_3

            $query_p1 = M4_snap
            $query_p2 = $wk_ang_y_3

            $QueryResult__ = 1
         }
      }
   }

   //Procedura OnTabEredita
   //{
   //   if ( TABER_REGOLA == "PRE" )
   //   {
   //      if(IS_VAR_FIXED(ATTUALE(),"GEST_CODICE")==0 )
   //      {
   //         GOSUB CfgCodice_Top
   //         GEST_CODICE = codice_top
   //      }
   //   }
   //
   //   if ( TABER_REGOLA == "POST" )
   //   {
   //      GOSUB Setta_Materiale_Top
   //
   //      //aggiorno desc (potrebbe non ripassare per assegnazioni)
   //      //e se ORD COD non presente in desc edit , aggiorno riferimento
   //      if ( VAR_EXIST(ATTUALE(),"ORD_COD") & VAR_EXIST(ATTUALE(),"ORD_DES") )
   //      {
   //         if ( STRSTR(DescEdit__,ORD_COD) == "" )
   //         {
   //            DescEdit__  = STRCAT(ORD_COD," - ",ORD_DES)
   //            COMANDO(STRCAT("M4_UpdateRef ",STR(idx_att)))
   //         }
   //      }
   //   }
   //}

// } vai in testa
   Controlli
   {
      GOSUB CtrlComune

      //Luca 21/05/2019
      GOSUB Setta_VarTipoTop

      // considerato che a listino è un generico (codice adeguato alla prof),annullo il menù creato con ord_z
      //if ( ACTION() > 0 & $OnLoadOrder==0 )
      //{
      //   VAR_SET_MODE(idx_att,"Z",$MODE_USER + $MODE_MISURE)
      //   VAR_SET_MENU(idx_att,"Z","ProfTop ( 62-1204 )")
      //}

      //in stesura salvo idx riferimenti
      if ( ID_Sin>=0 ) { idx_rif_steso_sx = ID_Sin }
      if ( ID_Des>=0 ) { idx_rif_steso_dx = ID_Des }

      //controllo dimensione massima top
      //GOSUB Ctl_Lung_Top

      //visualizzo taglio std o fsq
      //if ( ACTION()>0 )
      //{
      //   // queste variabili da visualizzare nelle estese
      //   //if( STRSTR(M4_VAR,"AA_SBORDO_SX") == "" )
      //   //  { M4_VAR = STRCAT(M4_VAR,";AA_SBORDO_SX;AA_SBORDO_DX;AA_TAGLIO_SX;AA_TAGLIO_DX;AA_TAGLIO_FS_SX;AA_TAGLIO_FS_DX;ang_a_sx;ang_a_dx") }
      //
      //   res = ANG_TOP_FS_funcBDM(ang_a_sx)
      //   HIDE_ON_EDIT2(idx_att,"AA_TAGLIO_SX"   ,  res)
      //   HIDE_ON_EDIT2(idx_att,"AA_TAGLIO_FS_SX",1-res)
      //   res = ANG_TOP_FS_funcBDM(ang_a_dx)
      //   HIDE_ON_EDIT2(idx_att,"AA_TAGLIO_DX"   ,  res)
      //   HIDE_ON_EDIT2(idx_att,"AA_TAGLIO_FS_DX",1-res)
      //
      //   GOSUB decodifica_tag_sxdx
      //}

      GOSUB Trova_idx_basi_sotto

      //trovo top vicini (serve per corretto dimensionamento telaio)
      GOSUB Trova_TopVic_SXDX

      GOSUB Trova_PenisioleAppoggio
      //setto i bordi
      //GOSUB Setta_Bordi_Top

      //Luca 22/07/2019
      GOSUB Ctrl_TopFusion

      //se cambia la Z,sposto top per mantenere allineamento filo fronte
      //(poi rilancio scassi con la aggiorna_acis_top_M4 qui sotto)
      //GOSUB mantieni_filofronte_Top

      //se cambia prof,sbordi ... aggiorno grafica top
      //GOSUB aggiorna_acis_top_M4
   }

// } vai in testa
   Procedura Stendi
   {
      //if( ACTION()==$stesi_Action )
      //{
      //   SHOW_POINT($idx_show_point, "punto_*top")
      //   EXIT()
      //}

      stesi_mode_sx=$stesi_mode_sx
      stesi_mode_dx=$stesi_mode_dx

      // -1 se != $stesi_Elemento
      if( stesi_mode_sx == $stesi_Elemento ) { stesi_idx_sx_loc = $stesi_idx_sx }
      else                                   { stesi_idx_sx_loc = -1 }
      if( stesi_mode_dx == $stesi_Elemento ) { stesi_idx_dx_loc = $stesi_idx_dx }
      else                                   { stesi_idx_dx_loc = -1 }

      //evito ricalcolo della PGDV (fatto in Notifica)
      NO_Ricalcola_PostGestDllValida = 1

      TaglioMaschioAMuro = 1

      gia_steso=0
      if( gia_steso==0 ) { GOSUB Top_stendi }
   }

// } vai in testa
   Procedura Notifica
   {
      GOSUB Notifica_Top
   }

   // } vai in testa
   Gestionale
   {
      GOSUB GestComune

      //Luca 23/10/2019 top cliente
      if( VAR_TipoTop==99 )
      {
         FLAG_RADICE = $NO_RAD
         GOSUB Stato_7
         DescEdit__ = MSG(1012)

         GOSUB GestComune_Post
         EXITSUB()
      }

      GEST_X = X_Tot
      GEST_Y = Y
      GEST_Z = Zt

      GEST_CODICE = ""
      RADICE      = passa_RadTop

      GOSUB Set_Gest_C008_Top

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

// } vai in testa
   Procedura CtrlStatici
   {
      //TODO -- ISOLA
      //// trovo le basi sotto (mi interessa una fronte e una retro)
      //if( isola )
      //{
      //   NEAR("scocche",idx_near_dn,5,$ignora_esclusi,"ScoccaT_Bas*")
      //   wk_i = 1  wk_ZFiaBaseFro = 0  wk_ZFiaBaseRet = 0
      //   while( wk_i <= scocche )
      //   {
      //      //escludo base ang (dovrei analizzare l'ang per considerarla fronte o retro)
      //      if( STRSTR(NOME(scocche[wk_i]),"Ang") == "" )
      //      {
      //         if( ABS( ANG_TOT2(scocche[wk_i]) - ANG_TOT2(idx_att) ) < 0.1 )
      //         { wk_ZFiaBaseFro = VAR_VAL(scocche[wk_i],"Z_sx_top") }
      //         else
      //         { wk_ZFiaBaseRet = VAR_VAL(scocche[wk_i],"Z_sx_top") }
      //
      //         if( wk_ZFiaBaseFro > 0 & wk_ZFiaBaseRet > 0 ) { wk_i = scocche }
      //      }
      //      wk_i = wk_i + 1
      //   }
      //
      //   //se sotto non ha nulla ..
      //   if( wk_ZFiaBaseFro<=0 )
      //   {
      //      wk_ZFiaBaseFro = 576
      //      wk_ZFiaBaseRet = 330 if( Z >= 958 ) { wk_ZFiaBaseRet = 576 }
      //   }
      //
      //   //fix per averle corrette al caricamento
      //   if( wk_ZFiaBaseFro != ZFiaBaseFro
      //     | wk_ZFiaBaseRet != ZFiaBaseRet )
      //   {
      //      //Claudio 03/09/2018 ora SaveAlways
      //      //COMANDO(STRCAT("VAR_CHANGE 1 ",STR(idx_att)," ZFiaBaseFro=",STR(wk_ZFiaBaseFro)," ZFiaBaseRet=",STR(wk_ZFiaBaseRet)))
      //      ZFiaBaseFro = wk_ZFiaBaseFro
      //      ZFiaBaseRet = wk_ZFiaBaseRet
      //   }
      //}

      //Trova top a sx/dx
      //GOSUB Trova_Top_A_DXSX

      //per stampa dim totale a muro
      //GOSUB ImpostaTopPartArr

      // //per stampa top assonometriche
      // GOSUB Imposta_near_globale

      // GOSUB CTRL_Fori_Piano
   }

   Procedura cancella
   {
       if( $StartingDel__!=ATTUALE() ) { EXITSUB() }

       if( IS_IDX(idx_topvic_sx)==1 ) { COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_topvic_sx)," no_agganciati //Cancella TOP")) }
       if( IS_IDX(idx_topvic_dx)==1 ) { COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_topvic_dx)," no_agganciati //Cancella TOP")) }
   }

   //Posiziona Blocco Ing
   //{
   //   GOSUB posa_blocco
   //   @c_rivestimento = [120,120,255]
   //   @f_rivestimento = "0.9"
   //}

// } vai in testa
   // _top_generico -> contenitore
   //       _top_grafica_xxx -> blocco/sweep
   Posiziona Top_generico  topgen
   {
      //Luca 23/10/2019
      //@escluso = 0
      @escluso = SE_NUM(VAR_TipoTop==99,1,0)

      @base_0 = base_0
      @base_0.x = base_0.x - aa_sbrd_sx
      @base_0.y = base_0.y
      @base_0.z = base_0.z - aa_sbrd_rt
      @X = Xt
      @Y = SpessorePiano
      @Z = Zt

      //sezione
      //spessore
      @SpessorePiano = SpessorePiano
      //
      @isola = isola
      //bordi
      //@SpessoreBordo = SpessoreBordo
      //@AltezzaBordo  = AltezzaBordo
      //@bordo_fro = bordo_fro
      //@bordo_sx  = bordo_sx
      //@bordo_dx  = bordo_dx
      //@bordo_ret = bordo_ret

      @tag_sx = tag_sx
      @tag_dx = tag_dx
      @ang_a_sx = ang_a_sx
      @ang_a_dx = ang_a_dx
      @Rid_dx=Rid_dx
      @Rid_sx=Rid_sx

      idx_blc = ATTUALE()
      idx_top_generico = ATTUALE()
      //leggo eventuale figlio grafico
      if ( VAR_EXIST(ATTUALE(),"idx_top_generico") )
      {
         if ( IS_IDX(@idx_top_generico) )
         {
            idx_top_generico = @idx_top_generico
            idx_blc = @idx_top_generico
         }
      }

      @passa_CodTop = passa_CodTop

      //figlio con gestionale (pannello top)
      idx_pann_top = ATTUALE()
   }

   Posiziona Blocco topcli
   {
      @escluso = SE_NUM(VAR_TipoTop==99,0,1)

      @base_0.x = base_0.x - aa_sbrd_sx
      @base_0.y = base_0.y
      @base_0.z = base_0.z - aa_sbrd_rt
      @X = Xt
      @Y = SpessorePiano
      @Z = Zt

      @c_rivestimento = [200,200,200]
      @f_rivestimento = "0.9"
   }

   Posiziona SottoTop_generico stop
   {
      @escluso = 0
      if( EscSottotop==1 | TopUnico==1 ) { @escluso = 1 }

      @base_0.x = base_0.x + aa_st_rie_sx
      @base_0.y = base_0.y - Y_SottoTop
      @base_0.z = base_0.z - aa_st_rie_rt

      if( DividiSottoTop==2 )
      {
         @base_0.z = base_0.z + Z - Z_SottoTop - aa_st_rie_rt
      }

      @X = X_SottoTop
      @Y = Y_SottoTop
      @Z = Z_SottoTop

      @tag_sx = tag_sx
      @tag_dx = tag_dx
      @ang_a_sx = ang_a_sx
      @ang_a_dx = ang_a_dx
      @Rid_dx=Rid_dx
      @Rid_sx=Rid_sx

      idx_pann_stop = ATTUALE()
   }

   Posiziona SottoTop_generico stop2
   {
      @escluso = 1
      if( DividiSottoTop > 0 ) { @escluso = 0 }
      //Luca 30/07/2019
      if( EscSottotop==1 )     { @escluso = 1 }

      @base_0.x = base_0.x + aa_st2_rie_sx
      @base_0.y = base_0.y - Y_SottoTop
      @base_0.z = base_0.z - aa_st2_rie_rt
      @ang_y = 0

      @X = X_SottoTop2
      @Y = Y_SottoTop
      @Z = Z_SottoTop2

      //divido in Z
      if( DividiSottoTop==2 )
      {
         @ang_y = 180
         @base_0.x = base_0.x + X - aa_st2_rie_sx
         @base_0.z = base_0.z + Z_SottoTop2
      }

      //@tag_sx = tag_sx2
      //@tag_dx = tag_dx2
      //@ang_a_sx = ang_a_sx2
      //@ang_a_dx = ang_a_dx2
      //@Rid_dx=Rid_dx2
      //@Rid_sx=Rid_sx2

      idx_pann_stop2 = ATTUALE()
   }

   //#include %install_dir%\bdm\cont_per_neartop.inc
   Posiziona _cont_per_near_sx nsx
   {
      idx_near_sx=ATTUALE()
      //rientro dello sbordo automatico:essendo variabile,non assicurava una situazioen stabile
      //@base_0.x = base_0.x - 1 + aa_sbrd_sx
      @base_0.x = base_0.x + 15
      //@base_0.y = base_0.y + 1
      //@base_0.y = alto_0.y + 5 - 40
      @base_0.y = alto_0.y - 10 - SpessorePiano
      @base_0.z = base_0.z
      @X = 20
      //@Y = Y-2
      //@Y = 40
      @Y = SpessorePiano + 10
      @Z = Z

      //se tag femm (59/51) < 90 , il pnt fro top è fuori il muro:correggo così che senta il top in accosto
      if ( tag_sx == 51 | tag_sx == 59 )
      {
         if ( ang_a_sx<90 )
            { @X = 20 + Z*SENO(90-ang_a_sx)/COSENO(90-ang_a_sx) }
      }
   }

   Posiziona _cont_per_near_dx ndx
   {
      idx_near_dx=ATTUALE()
      //rientro dello sbordo automatico:essendo variabile,non assicurava una situazioen stabile
      //@base_0.x = base_3.x-20+1 -aa_sbrd_dx
      @base_0.x = base_3.x - 35
      //@base_0.y = base_0.y+1
      //@base_0.y = alto_0.y + 5 - 40
      @base_0.y = alto_0.y - 10 - SpessorePiano
      @base_0.z = base_0.z

      @X = 20
      //@Y = Y-2
      //@Y = 40
      @Y = SpessorePiano + 10
      @Z = Z

      //e tag femm (59/51) < 90 , il pnt fro top è fuori il muro:correggo così che senta il top in accosto
      if ( tag_dx == 51 | tag_dx == 59 )
      {
         if ( ang_a_dx<90 )
         {
            @X  = 20 +  Z*SENO(90-ang_a_dx)/COSENO(90-ang_a_dx)
            @base_0.x = base_3.x-20 - Z*SENO(90-ang_a_dx)/COSENO(90-ang_a_dx)
         }
      }
   }

   //per fare near SOTTO
   Posiziona _cont_per_near_dn ndn
   {
      idx_near_dn=ATTUALE()
      @base_0.y = base_0.y-20
      @base_0.x = base_0.x+1
      @base_0.z = base_0.z+1
      @X=Xt-2 @Y=20 @Z=Z-2
   }

   //per fare near SOPRA
   Posiziona _cont_per_near_up nup
   {
      idx_near_up=ATTUALE()

      @base_0.y = base_0.y+Y-1
      @base_0.x = base_0.x+1
      @base_0.z = base_0.z+1

      @X=Xt-2 @Y=100 @Z=Z-2
   }

   // per fare near SOTTO, davanti e capire che tipo di isola
   Posiziona _cont_per_near_dn ndnret
   {
      idx_near_dn_ret=ATTUALE()
      @base_0.y = base_0.y-20
      @base_0.x = base_0.x+1
      @base_0.z = base_0.z+1
      @X=50
      @Y=20
      @Z=200
   }
   Posiziona _cont_per_near_dn ndnfro
   {
      idx_near_dn_fro=ATTUALE()
      @base_0.y = base_0.y-20
      @base_0.x = base_0.x+1
      @base_0.z = base_0.z+Z-200-1
      @X=50
      @Y=20
      @Z=200
   }
   Posiziona _cont_per_near_dn ndnsx
   {
      idx_near_dn_sx=ATTUALE()
      @base_0.y = base_0.y-20
      @base_0.x = base_0.x
      @base_0.z = base_0.z
      @X=20
      @Y=20
      @Z=Z
   }
   Posiziona _cont_per_near_dn ndndx
   {
      idx_near_dn_dx=ATTUALE()
      @base_0.y = base_0.y-20
      @base_0.x = base_0.x+Xt-20
      @base_0.z = base_0.z
      @X=20
      @Y=20
      @Z=Z
   }

   ////near down FILO RETRO (es ricercare SchRetroBase)
   ////Posiziona _cont_per_near_dn ndnrt2
   //Posiziona _cont_per_near_dn ndnrt2
   //{
   //   idx_near_dn_ret2=ATTUALE()
   //   @base_0.x = base_0.x - 1  +aa_sbrd_sx
   //   @base_0.y = base_0.y-20
   //   @base_0.z = base_0.z+1
   //   @X = X - aa_sbrd_sx - aa_sbrd_dx  -2
   //   @Y = 20
   //   @Z = 49
   //}

   Posiziona _cont_per_near nsc_sx
   {
      idx_near_SNACK_sx = ATTUALE()
      @base_0.x = base_0.x - 20
      @base_0.y = base_0.y - SpessoreSottoPiano
      @base_0.z = base_0.z + 20
      @X = 40
      @Y = 50
      @Z = Z - 40
   }

   Posiziona _cont_per_near nsc_dx
   {
      idx_near_SNACK_dx = ATTUALE()
      @base_0.x = base_0.x + X - 20
      @base_0.y = base_0.y - SpessoreSottoPiano
      @base_0.z = base_0.z + 20
      @X = 40
      @Y = 50
      @Z = Z - 40
   }
}

Elemento SottopTop
{
   Descrizione = "Top"
   Code        = TOP
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""
   Alias BDM_Top;TSTP_NoQuota;StpTop;TOP_OLD

   Variabili
   {
      #include %path_bdm%\var_db.inc
      //#include %install_dir%\bdm\var_db.inc

      X    "Lunghezza"             1000 Utente ( 100-2700 )
      Xt   "Lunghezza (Nominale)"  1000 ShowAlways

      Y    "Spessore"     19  ShowAlways
      Z    "Profondità"  602  Menu ( PrfStTp ) Utente ( 100-1392 )

      Filler2 " " "" ShowAlways

      X_SottoTop ""  100
      Z_SottoTop ""  100

      //sbordi automatici,non editabili, gestiti a bdm
      //top nobile rispetto ingombro
      aa_st_rie_sx  "Rientro sottotop sx "      0 Utente ( ) SaveAlways
      aa_st_rie_dx  "Rientro sottotop dx "      0 Utente ( ) SaveAlways
      aa_st_rie_fr  "Rientro sottotop frontale" 0 SaveAlways
      aa_st_rie_rt  "Rientro sottotop retro"    0 SaveAlways

      Filler3 " " "" ShowAlways

      SottoTopTraBasi  "" 0
      SpessoreTopCliente   "Spessore Top Cliente" 0 Utente ( 0-100 )

      ang_y_old "" 0
      ang_y "" 0
      HIDE "" 0

      //4manuale + 2selezione
      M4_DIALOG "" 6
      M4_A_MURO "" 1

      zsotto    "" 602 //prof basi sotto il top + $Rie_Basi - se adatta_Z = 1 -> Z = zsotto
      zsotto_dx "" 602 //prof base adiacente a DX+$Rie_Basi
      zsotto_sx "" 602 //prof base adiacente a SX+$Rie_Basi

      Z1 "" 0
      Z2 "" 0

      ID_Sin "" -1
      ID_Des "" -1

      isola "" 0       SaveAlways //dipende dalla presenza bordo retro
      steso_isola "" 0 SaveAlways //in stesura è steso come isola (cioè su basi contrapposte)

      ang_a_sx "Ang. FS a SX top" 90
      //Utente ( 1-179 )
      ang_a_dx "Ang. FS a DX top" 90
      //Utente ( 1-179 )

      COD_EREDITA "" "PRE;POST"

      no_collisione "" 1 //escludo collisioni

      Scassa_SottoTop  "" 0

      CMP2_AZIONI "" "M"

      perRADICE "" ""

      LungMaxTop "" 2700

      //top in accosto a sx/dx
      idx_topvic_sx "" -1
      idx_topvic_dx "" -1

      idx_rif_steso_sx "" -1
      idx_rif_steso_dx "" -1

      idx_rif_steso_iso_sx "" -1
      idx_rif_steso_iso_dx "" -1

      idx_near_dn "" -1
      idx_near_up "" -1
      idx_near_sx "" -1
      idx_near_dx "" -1

      FillerM2G " " "" ShowAlways
   }

   Assegnazioni
   {
      GOSUB AssComune

      M4_MIS = "Filler2;X;Xt;Y;Z;aa_st_rie_sx;aa_st_rie_dx;SpessoreTopCliente"

      //M4_GRUPPO__ = "Piani"
      M4_GRUPPO__ = MSG(1004)
      //se draggato, diventa posizionato
      M4_CNT_LINK_MODE__ = 0

      //escludo collisioni
      no_collisione = 1

      //Luca 19/06/2019
      if( IS_VAR_FIXED(ATTUALE(),"X")==1 )
      {
         HIDE_ON_EDIT2(ATTUALE(),"Xt",1)
         HIDE_ON_EDIT(ATTUALE(),"aa_st_rie_dx",1)

         //if( IS_VAR_FIXED(ATTUALE(),"aa_st_rie_sx")==1 )
         //{
         //   DEL_VAR_MODIFICATE(ATTUALE(),"aa_st_rie_sx")
         //   aa_st_rie_sx = 0
         //}
         if( IS_VAR_FIXED(ATTUALE(),"aa_st_rie_dx")==1 )
         {
            DEL_VAR_MODIFICATE(ATTUALE(),"aa_st_rie_dx")
            aa_st_rie_dx = 0
         }
      }
      else
      {
         HIDE_ON_EDIT2(ATTUALE(),"Xt",0)
         HIDE_ON_EDIT(ATTUALE(),"aa_st_rie_*",0)
      }

      HIDE_ON_EDIT2(ATTUALE(),"SpessoreTopCliente",SottoTopTraBasi)
   }

   PuntiNotevoli
   {
      ins2_att = INSERIMENTO2(idx_att)
      if ( ACTION()==2
         & CMD()==$CMD_INTERATTIVO
         & $ATTIVA_DLL
         & $CNP__==0
         & $OnLoadOrder==0)
      {
         if ( ins2_att==$ins2_posizionato
            | ins2_att==$ins2_agganciato
            | ins2_att==$ins2_accessorio )
         {
            if($PLIKO==0)
            {
               if(ask_X) { res=CHIEDI(idx_att,"X") }
               if(ask_Z) { res=CHIEDI(idx_att,"Z") }
            }
         }
      }

      GOSUB Setta_Sbordi_SottoTop

      if( IS_VAR_FIXED(ATTUALE(),"X")==1 )
      {
         DEL_VAR_MODIFICATE(ATTUALE(),"Xt")
         Xt = X + aa_st_rie_sx + aa_st_rie_dx
      }
      else
      {
         X = Xt - aa_st_rie_sx - aa_st_rie_dx
      }

      GOSUB punti_Xt

      //Punti per stampe
      pnt_sx  = [base_0.x,base_0.y,base_0.z ]
      pnt_dx  = [base_3.x,base_0.y,base_0.z ]

      pnt_sx_fro = pnt_sx
      pnt_sx_fro.z = base_1.z
      pnt_dx_fro = pnt_dx
      pnt_dx_fro.z = base_1.z

      dim_top = DISTANZA(pnt_sx,pnt_dx)

      base_so = base_0
      alto_ne = alto_2
   }
   #include %path_bdm%\TLib\Orie.inc

   Procedura OnQueryBdmLocal
   {
      if ( $query_type==1 )
      {
         if ( $M4_DragInfo_Mode==1 )
         {
            idx_att = ATTUALE()
            nome_att = NOME(idx_att)
            M4_snap = $M4_DragInfo_Snap
            M4_idx_muro = $M4_DragInfo_WallIdx

            // angolo del muro
            $wk_res = GET_INF_MURO(3,M4_idx_muro)
            $P1 = $muro_pt1
            $P2 = $muro_pt2
            GOSUB calcola_ang_y_3

            $query_p1 = M4_snap
            $query_p2 = $wk_ang_y_3

            $QueryResult__ = 1
         }
      }
   }

   Controlli
   {
      GOSUB CtrlComune

      //in stesura salvo idx riferimenti
      if ( ID_Sin>=0 ) { idx_rif_steso_sx = ID_Sin }
      if ( ID_Des>=0 ) { idx_rif_steso_dx = ID_Des }

      GOSUB Trova_idx_basi_sotto

      //Luca 17/06/2019
      //verifico se sono un sottotop tra basi
      if( ACTION()>0 & COMPONENDO()==0 & ACTION()!=2 )
      {
         SottoTopTraBasi = 0
         BOX_MODE(0)
         NEAR("wk_bas_up",idx_near_up,1,0,"ScoccaT_Ba*")
         if( wk_bas_up>0 )  { SottoTopTraBasi = 1 }
      }

      //trovo tutti gli elementi da scassare
      if( ACTION()>0 & COMPONENDO()==0 )
      {
         if( VAR_EXIST(ATTUALE(),"Scassa_SottoTop_prec")==0 ) { Scassa_SottoTop_prec = Scassa_SottoTop }

         Scassa_SottoTop = 0
         //trovo l'idx da scassare
         COMPONENTI2("wk_bl",ATTUALE(),"*")
         i = 1
         while ( i<=wk_bl )
         {
            if( FORMA(wk_bl[i])!=$FORMA_CONTENITORE ) {  idx_da_scassare = wk_bl[i] }
            i = i + 1
         }

         BOX_MODE(0)
         NEAR_GLOBALE("wk_bl",ATTUALE(),5,1,"Cuc_Fondo")
         i = 1
         while ( i<=wk_bl )
         {
            if( UN_PADRE2(wk_bl[i],"FustoBaseLavello")
              & VAR_VAL(wk_bl[i],"VAR_FresataLav")==1 )
            {
               Scassa_SottoTop = 1
               VAR_VALUESTR_SET(wk_bl[i],"Scassa_Chi_Plus",STR(idx_da_scassare))
            }
            i = i + 1
         }

         if( Scassa_SottoTop!=Scassa_SottoTop_prec )
         {
            GOSUB EliminaScassi
            COMANDO("PROCEDURA M4_Scassi // Scassa_e_Taglia ")
            Scassa_SottoTop_prec = Scassa_SottoTop
         }
      }
   }

   Procedura Stendi
   {
      stesi_mode_sx=$stesi_mode_sx
      stesi_mode_dx=$stesi_mode_dx

      //-1 se != $stesi_Elemento
      if( stesi_mode_sx == $stesi_Elemento ) { stesi_idx_sx_loc = $stesi_idx_sx }
      else                                   { stesi_idx_sx_loc = -1 }
      if( stesi_mode_dx == $stesi_Elemento ) { stesi_idx_dx_loc = $stesi_idx_dx }
      else                                   { stesi_idx_dx_loc = -1 }

      //evito ricalcolo della PGDV (fatto in Notifica)
      NO_Ricalcola_PostGestDllValida = 1

      TaglioMaschioAMuro = 1

      gia_steso=0
      if( gia_steso==0 ) { GOSUB SottoTop_stendi }
   }

   Procedura Notifica
   {
      GOSUB Notifica_SottoTop
   }

   Gestionale
   {
      GOSUB GestComune

      GEST_CODICE = ""
      RADICE  = "STTOP"

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Posiziona SottoTop_generico stop
   {
      @escluso = 0

      //@base_0.x = base_0.x
      //@base_0.z = base_0.z

      @base_0.x = base_0.x + aa_st_rie_sx
      @base_0.y = base_0.y
      @base_0.z = base_0.z - aa_st_rie_rt

      @X = X
      @Y = Y
      @Z = Z

      idx_pann_stop = ATTUALE()
   }

   Posiziona _cont_per_near_sx nsx
   {
      idx_near_sx=ATTUALE()
      @base_0.x = base_0.x + 15
      @base_0.y = alto_0.y - 10
      @base_0.z = base_0.z
      @X = 20
      @Y = 10
      @Z = Z
   }

   Posiziona _cont_per_near_dx ndx
   {
      idx_near_dx=ATTUALE()
      //rientro dello sbordo automatico:essendo variabile,non assicurava una situazioen stabile
      @base_0.x = base_3.x - 35
      @base_0.y = alto_0.y - 10
      @base_0.z = base_0.z

      @X = 20
      @Y = 10
      @Z = Z
   }

   //per fare near SOTTO
   Posiziona _cont_per_near_dn ndn
   {
      idx_near_dn=ATTUALE()
      @base_0.y = base_0.y-20
      @base_0.x = base_0.x+1
      @base_0.z = base_0.z+1
      @X=Xt-2 @Y=20 @Z=Z-2
   }

   //le basi hanno l'ingombro che comprende il sottotop
   //quindi per trovare solo le basi che stanno effettivamente sopra, il cont_per_near viene messo 2 mm più alto
   //per fare near SOPRA
   Posiziona _cont_per_near_up nup
   {
      idx_near_up=ATTUALE()

      @base_0.x = base_0.x + 1
      @base_0.y = alto_0.y + 2
      @base_0.z = base_0.z + 1

      @X=Xt-2 @Y=5 @Z=Z-2
   }
}

// { Pannello Top
Elemento Top_generico
{
   Descrizione = "Super top"
   Code        = TOP
   Gruppo      = ""
   Tipo = Contenitore
   Forma = ""
   Alias TopM4

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X "Larghezza"  1000 Utente ( )
      //ShowAlways
      Y "Spessore"     30 ShowAlways
      Z "Profondità"  600 ShowAlways

      TopUnico      "" 0 Implicit

      aa_st_rie_sx  "" 0
      aa_st_rie_dx  "" 0
      aa_st_rie_fr  "" 0
      aa_st_rie_rt  "" 0

      X_SottoTop    "" 0
      Y_SottoTop    "" 19
      Z_SottoTop    "" 0

      passa_CodTop "" ""
      //RADICE "" ""
      GEST_CODICE "" ""

      SpessorePiano "" 22 //spessore reale del piano
      SpessoreBordo "" 40  //Spessore eventuali bordi
      AltezzaBordo  "" 40  //Altezza  eventuali bordi (potrebbero non coprire l'intera Y del top)
      isola         "" 0

      scs_lat_sx_fiancoF "" 0
      scs_lat_dx_fiancoF "" 0

      //tipo_bordo "" "__"
      bordo_fro "" 1
      bordo_sx  "" 0
      bordo_dx  "" 0
      bordo_ret "" 0

      tag_sx "" 8
      tag_dx "" 8
      ang_a_sx "" 90
      ang_a_dx "" 90
      prof_sx "" 582
      prof_dx "" 582

      //riduzioni gestionali dovute a tagli
      Rid_dx "" 0
      Rid_sx "" 0

      TopFusion       ""  0 Implicit
      FSN_ScsPos      "" "" Implicit
      FSN_ScsX        ""  0 Implicit
      FSN_ScsZ        ""  0 Implicit

      alias_plus "" ""

      FIN_var  "" "C028"
      FIN_orie "" "O"

      XGLASS      "Num. XGLASS" "" Utente ( )
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Stato_8

      if ( alias_plus != "" ) { kk=ALIAS_PLUS(ATTUALE(),1) }

      idx_pdr = PADRE(ATTUALE(),1)
      aa_st_rie_sx = VAR_VAL(idx_pdr,"aa_sbrd_sx") + VAR_VAL(idx_pdr,"aa_st_rie_sx")
      aa_st_rie_rt = VAR_VAL(idx_pdr,"aa_sbrd_rt") + VAR_VAL(idx_pdr,"aa_st_rie_rt")
      aa_st_rie_fr = VAR_VAL(idx_pdr,"aa_sbrd_fr") + VAR_VAL(idx_pdr,"aa_st_rie_fr")
      aa_st_rie_dx = VAR_VAL(idx_pdr,"aa_sbrd_dx") + VAR_VAL(idx_pdr,"aa_st_rie_dx")

      //Luca 24/07/2019
      //*** FUSION **
      FSN_scassox_top = FSN_ScsX
      FSN_scassoz_top = FSN_ScsZ

      if( RIGHT(FSN_ScsPos,1)=="D" ) { FSN_scassox_top = FSN_ScsX + VAR_VAL(idx_pdr,"aa_sbrd_dx") }
      if( RIGHT(FSN_ScsPos,1)=="S" ) { FSN_scassox_top = FSN_ScsX + VAR_VAL(idx_pdr,"aa_sbrd_sx") }

      FSN_scassox_stop = FSN_ScsX
      FSN_scassoz_stop = FSN_ScsZ

      if( RIGHT(FSN_ScsPos,1)=="D" ) { FSN_scassox_stop = FSN_ScsX - VAR_VAL(idx_pdr,"aa_st_rie_dx") }
      if( RIGHT(FSN_ScsPos,1)=="S" ) { FSN_scassox_stop = FSN_ScsX - VAR_VAL(idx_pdr,"aa_st_rie_sx") }
      //*** FUSION ***

      //Luca 28/03/2019 in caso di top unico
      GOSUB Setta_Dimensioni_SottoTop
      //Xn = X - VAR_VAL(idx_pdr,"aa_sbrd_sx") - VAR_VAL(idx_pdr,"aa_sbrd_dx")
      //X_SottoTop = Xn - VAR_VAL(idx_pdr,"aa_st_rie_sx") - VAR_VAL(idx_pdr,"aa_st_rie_dx")
      //Z_SottoTop = Z - aa_st_rie_fr - aa_st_rie_rt


      //Luca 03/05/2019
      Var_NoSottoTop = VAR_VAL(idx_pdr,"EscSottotop")

      if( TopUnico==1 | Var_NoSottoTop==1 )
      {
         VAR_SET_MODE(ATTUALE(),"X",$MODE_SHOWALWAYS)
      }
      else
      {
         if( VAR_VAL(ATTUALE(),"ORD_XMAX")>0 ) { VAR_SET_MENU(ATTUALE(),"X",STRCAT("( 10-",STR(ORD_XMAX), ")")) }
      }
   }

   PuntiNotevoli
   {
      GOSUB punti

      pnt_sx  = [base_0.x,base_0.y,base_0.z]
      pnt_sx1 = [base_1.x,base_0.y,base_1.z]

      pnt_dx  = [base_3.x,base_0.y,base_0.z]
      pnt_sx_fro = pnt_sx
      pnt_sx_fro.z = base_1.z
      pnt_dx_fro = pnt_dx
      pnt_dx_fro.z = base_1.z

      pnt_sx_frobl = pnt_sx_fro
      pnt_dx_frobl = pnt_dx_fro

      pbn=[X/2 ,0,0]

      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdrtr.x"),pbn.x)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdrtr.y"),pbn.y)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdrtr.z"),pbn.z)

      b1s = [-Z*(SENO(ang_a_sx-90)/COSENO(ang_a_sx-90)), 0, Z]
      bbs = (-Z/2)*(SENO(ang_a_sx-90)/COSENO(ang_a_sx-90))
      pbn = [bbs, 0, b1s.z/2]
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdsx.x"),pbn.x)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdsx.y"),pbn.y)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdsx.z"),pbn.z)

      b1d = [X+Z*(SENO(ang_a_dx-90)/COSENO(ang_a_dx-90)), 0,Z]
      b2d = X+(Z/2)*(SENO(ang_a_dx-90)/COSENO(ang_a_dx-90))
      pbn = [b2d, 0, b1d.z/2]
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bddx.x"),pbn.x)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bddx.y"),pbn.y)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bddx.z"),pbn.z)

      b1f = X+(Z/2)*(SENO(ang_a_dx-90)/COSENO(ang_a_dx-90))
      pbn = [b1f/2, 0, Z]
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdfro.x"),pbn.x)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdfro.y"),pbn.y)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdfro.z"),pbn.z)
   }

   Controlli
   {
      GOSUB CtrlComune

   }

   Gestionale
   {
      GOSUB GestComune
      //riduzioni gestionali dovute a tagli
      //GEST_X = X
      GEST_X = X - Rid_dx - Rid_sx
      //i codici le radici hanno sp 10 o 20
      GEST_Y = SpessorePiano
      // lo spessore del piano deve essere quello effettivo del materiale ripristino valore gestionale
      //if ( SpessorePiano == 11 ) { GEST_Y = 10 }
      GEST_Z = Z

      GEST_CODICE = passa_CodTop

      FLAG_RADICE = $FLAG_STANDARD + $NORID_X + $NORID_Y + $NORID_Z

      ////per evitare ricalcoli,riassegno descedit(radice dipende dal materiale che viene settato in post config del padre)
      //DescEdit__ = STRCAT(VAR_VAL_STR(idx_att,"ORD_COD")," - ",VAR_VAL_STR(idx_att,"ORD_DES"))

      GOSUB GestComune_Post
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }

   Posiziona _top_grafica_M4 graM4
   {
      @escluso = 0
      if ( X<0.1 | Z<0.1 ) { @escluso = 1 }
      if( TopFusion==2 )   { @escluso = 1 }

      @base_0 = base_0
      @X = X
      @Y = Y
      @Z = Z

      if ( @escluso == 0 ) { idx_top_generico = ATTUALE() }

      GOSUB rivestimento
   }

   Posiziona _graf_top_fusion gtf
   {
      @escluso = 1
      if( TopFusion==2 )   { @escluso = 0 }

      @base_0 = base_0
      @X = X
      @Y = Y
      @Z = Z

      @FSN_ScsPos = FSN_ScsPos
      @FSN_ScsX   = FSN_scassox_top
      @FSN_ScsZ   = FSN_scassoz_top

      if ( @escluso == 0 ) { idx_top_generico = ATTUALE() }

      GOSUB rivestimento
   }

   Posiziona Blocco stop
   {
      @escluso = 1
      if( TopUnico==1 )  { @escluso = 0 }
      if( TopFusion==2 )  { @escluso = 1 }

      @base_0.x = base_0.x + aa_st_rie_sx
      @base_0.y = base_0.y - Y_SottoTop
      @base_0.z = base_0.z + aa_st_rie_rt

      @X = X_SottoTop
      @Y = Y_SottoTop
      @Z = Z_SottoTop

      //@tag_sx = tag_sx
      //@tag_dx = tag_dx
      //@ang_a_sx = ang_a_sx
      //@ang_a_dx = ang_a_dx
      //@Rid_dx=Rid_dx
      //@Rid_sx=Rid_sx

      @UsoSottoTop = 1

      //LZ 01/09/2021: scasso base frigo
      @pnt_sx_fro = pnt_sx_fro
      @pnt_dx_fro = pnt_dx_fro

      idx_pann_stop = ATTUALE()
      GOSUB rivestimento
   }

   Posiziona _graf_top_fusion gstf
   {
      @escluso = 1
      if( TopFusion==2 & TopUnico==1 )   { @escluso = 0 }

      @base_0.x = base_0.x + aa_st_rie_sx
      @base_0.y = base_0.y - Y_SottoTop
      @base_0.z = base_0.z + aa_st_rie_rt

      @X = X_SottoTop
      @Y = Y_SottoTop
      @Z = Z_SottoTop

      @FSN_ScsPos = FSN_ScsPos
      @FSN_ScsX   = FSN_scassox_stop
      @FSN_ScsZ   = FSN_scassoz_stop

      @UsoSottoTop = 1

      if ( @escluso == 0 ) { idx_pann_stop = ATTUALE() }

      GOSUB rivestimento
   }
}

Elemento SottoTop_generico
{
   Descrizione = "Super top"
   Code        = TOP
   Gruppo      = ""
   Tipo = Contenitore
   Forma = ""
   Alias TopM4;CamInciso

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X "Larghezza"  1000 ShowAlways
      Y "Spessore"     19
      Z "Profondità"  600 ShowAlways

      TopFusion       ""  0 Implicit
      FLAG_TopFusion  ""  0 Implicit
      FSN_ScsPos      "" "" Implicit
      FSN_ScsX        ""  0 Implicit
      FSN_ScsZ        ""  0 Implicit
      FSN_Scs_ST_X    ""  0 Implicit
      FSN_Scs_ST_Z    ""  0 Implicit

      VAR_TipoTop     ""  0 Implicit


      HideSTOP  "Nascondi Top" 0 Implicit

      FIN_var     ""  "C002"
      FIN_orie    ""  "O"

      GEST_CODICE "" ""
      per_CODICE  "" ""

      RADICE      "" ""
      per_RADICE  "" ""
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Cucina_Versione

      GOSUB Stato_8

      //Luca 10/06/2020
      if( VAR_TipoTop==99 ) { SET_GEST_STATO(ATTUALE(),8,0) }

      //Luca 01/04/2019
      if( UN_PADRE("SottopTop") )
      {
         VAR_SET_MODE(ATTUALE(),"X",$MODE_NONE)
         VAR_SET_MODE(ATTUALE(),"Z",$MODE_NONE)
      }

      //Luca 24/03/2020
      //FSN_scassox_top = FSN_ScsX
      //FSN_scassoz_top = FSN_ScsZ

      FSN_scassox_top = FSN_Scs_ST_X
      FSN_scassoz_top = FSN_Scs_ST_Z
   }

   PuntiNotevoli
   {
      GOSUB punti

      pnt_sx  = [base_0.x,base_0.y,base_0.z]
      pnt_sx1 = [base_1.x,base_0.y,base_1.z]

      pnt_dx  = [base_3.x,base_0.y,base_0.z]
      pnt_sx_fro = pnt_sx
      pnt_sx_fro.z = base_1.z
      pnt_dx_fro = pnt_dx
      pnt_dx_fro.z = base_1.z

      //pnt_sx_frobl = pnt_sx_fro
      //pnt_dx_frobl = pnt_dx_fro
      //
      //pbn=[X/2 ,0,0]
      //
      //VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdrtr.x"),pbn.x)
      //VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdrtr.y"),pbn.y)
      //VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdrtr.z"),pbn.z)
      //
      //b1s = [-Z*(SENO(ang_a_sx-90)/COSENO(ang_a_sx-90)), 0, Z]
      //bbs = (-Z/2)*(SENO(ang_a_sx-90)/COSENO(ang_a_sx-90))
      //pbn = [bbs, 0, b1s.z/2]
      //VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdsx.x"),pbn.x)
      //VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdsx.y"),pbn.y)
      //VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdsx.z"),pbn.z)
      //
      //b1d = [X+Z*(SENO(ang_a_dx-90)/COSENO(ang_a_dx-90)), 0,Z]
      //b2d = X+(Z/2)*(SENO(ang_a_dx-90)/COSENO(ang_a_dx-90))
      //pbn = [b2d, 0, b1d.z/2]
      //VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bddx.x"),pbn.x)
      //VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bddx.y"),pbn.y)
      //VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bddx.z"),pbn.z)
      //
      //b1f = X+(Z/2)*(SENO(ang_a_dx-90)/COSENO(ang_a_dx-90))
      //pbn = [b1f/2, 0, Z]
      //VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdfro.x"),pbn.x)
      //VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdfro.y"),pbn.y)
      //VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdfro.z"),pbn.z)
   }

   Controlli
   {
      GOSUB CtrlEscluso
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune

      FLAG_RADICE = $FLAG_STANDARD + $NORID_X + $NORID_Y + $NORID_Z

      if( IS_VAR_FIXED( ATTUALE(), "RADICE") == 0
        & IS_VAR_FIXED( ATTUALE(), "GEST_CODICE") == 0 )
      {
         per_CODICE = "T01901"
         per_RADICE = ""

         if( VAR_TipoTop == 99)
         {
            per_CODICE = ""
            per_RADICE = "STTOP"
            if( Cucina_Versione > 2 ) { per_RADICE = "STTOP3" }
         }

         if( RADICE != per_RADICE )      { RADICE = per_RADICE       flag_CAMBIA_VAR = 1 }
         if( GEST_CODICE != per_CODICE ) { GEST_CODICE = per_CODICE  flag_CAMBIA_VAR = 1 }
      }

      if( VAR_TipoTop == 99 )
      {
         GOSUB Set_Gest_C008_Top
      }

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }

   //Luca 10/06/2020
   //solo per top cliente.. passo livello in più
   Posiziona RigaOrdine_NonGraficato RigSt
   {
      @escluso = 1
      if(  VAR_TipoTop==99 ) { @escluso = 0 }
      GOSUB posa_blocco
      @base_0 = base_0
      @GEST_CODICE = "T01901"
   }

   Posiziona _top_grafica_M4 graM4
   {
      @escluso = 0
      if ( X<0.1 | Z<0.1 ) { @escluso = 1 }
      if( TopFusion==2 )   { @escluso = 1 }
      if( FLAG_TopFusion==2 )   { @escluso = 1 }

      //Luca 11/02/2020 debug, solo TEC
      if( HideSTOP==1 ) { @escluso = 1 }


      @base_0 = base_0
      @X = X
      @Y = Y
      @Z = Z

      @UsoSottoTop = 1

      if ( @escluso == 0 ) { idx_stop_generico = ATTUALE() }

      GOSUB rivestimento
   }

   Posiziona _graf_top_fusion gtf
   {
      @escluso = 1
      if( TopFusion==2 )   { @escluso = 0 }
      if( FLAG_TopFusion==2 )   { @escluso = 0 }

      if( HideSTOP==1 ) { @escluso = 1 }

      @base_0 = base_0
      @X = X
      @Y = Y
      @Z = Z

      @FSN_ScsPos = FSN_ScsPos
      @FSN_ScsX   = FSN_scassox_top
      @FSN_ScsZ   = FSN_scassoz_top

      if ( @escluso == 0 ) { idx_stop_generico = ATTUALE() }

      GOSUB rivestimento
   }
}

// LP 14/04/21
// OLD Elemento _top_grafica_M4
// OLD {
// OLD    Descrizione = "Super top"
// OLD    Code        = CUB
// OLD    Gruppo      = ""
// OLD    Tipo        = ""
// OLD    //Forma       = BloccoBlend
// OLD    Forma       = Blocco
// OLD
// OLD    Variabili
// OLD    {
// OLD       X "Larghezza del top"   1000
// OLD       Y "Altezza"             30
// OLD       Z "Profondità"          600
// OLD
// OLD       sono_top_grafica_M4 "" 1
// OLD       BLEND__ "" 1
// OLD       HIDE "" 1
// OLD       m_rivestimento      "" ""
// OLD       alias_plus "" ""
// OLD    }
// OLD
// OLD    Assegnazioni
// OLD    {
// OLD       if ( alias_plus != "" )  { kk=ALIAS_PLUS(ATTUALE(),1) }
// OLD
// OLD       //Luca 07/02/2020
// OLD       AttivaVetroExportDWG_XG = 0
// OLD       wk_XGLASS = VAR_VAL_STR(PADRE(ATTUALE(),1),"XGLASS")
// OLD       if( wk_XGLASS!="" ) { AttivaVetroExportDWG_XG = 1 }
// OLD    }
// OLD
// OLD    PuntiNotevoli
// OLD    {
// OLD       GOSUB punti
// OLD    }
// OLD }

Elemento _top_grafica_M4
{
   Descrizione = "Super top"
   Code        = CUB
   Gruppo      = ""
   Tipo        = ""
   Forma       = ZSweep

   Variabili
   {
      X "Larghezza del top"   1000
      Y "Altezza"             30
      Z "Profondità"          600

      //VAR_TipoTopStr  ""    ""   Implicit
      VAR_TipoTop   ""    0   Implicit

      PosX_SteelPen ""    1   Implicit
      OffX_SteelPen ""  100   Implicit

      sono_top_grafica_M4 "" 1
      UsoSottoTop         "" 0

      BLEND__    ""  1
      HIDE       ""  1
      alias_plus "" ""

      m_rivestimento "" ""
      c_rivestimento "" [255, 255, 255]
   }

   Assegnazioni
   {
      idx_att = ATTUALE()

      VAR_IMPLICITLY_INHERITS(idx_att, 0)

      if( alias_plus != "" )  { kk = ALIAS_PLUS(idx_att, 1) }

      //Luca 07/02/2020
      AttivaVetroExportDWG_XG = 0
      wk_XGLASS = VAR_VAL_STR(PADRE(idx_att,1), "XGLASS")
      if( wk_XGLASS != "" ) { AttivaVetroExportDWG_XG = 1 }
   }

   PuntiNotevoli
   {
      DEL_VAR(ATTUALE(), "base_*")

      // Blocco (standard)
      base_0 = [0, 0, 0]
      base_1 = [X, 0, 0]
      base_2 = [X, Y, 0]
      base_3 = [0, Y, 0]

      //if( IS_MATCH(VAR_TipoTopStr, "ACCIAIO_PEN_80") == 1 )
      // SOLO PER TOP-LEVEL
      if( VAR_TipoTop == 23 & UsoSottoTop == 0 )
      {
         //                        X
         //   5 _______________________________________ 4
         // Y  |                                       |
         //    |___________________ 1                  |
         //   0                    |                   |
         //                        | RY                |
         //                        |___________________|
         //                       2                     3
         //                                RX

         // Offset in basso
         RY = 70
         RX = OffX_SteelPen

         base_0 = [0, 0, 0]
         base_1 = [X - RX, 0, 0]
         base_2 = [X - RX, - RY, 0]
         base_3 = [X, - RY, 0]
         base_4 = [X, Y, 0]
         base_5 = [0, Y, 0]

         // se sono sx faccio la simmetria grafica
         if( PosX_SteelPen == -1 )
         {
            base_0 = [0, 0, 0]
            base_1 = [X - RX, 0, 0]
            base_2 = [X - RX, Y, 0]
            base_3 = [- RX, Y, 0]
            base_4 = [- RX, - RY, 0]
            base_5 = [0, - RY, 0]
         }
      }

      alto_0 = base_0   alto_0.z = Z

      base_so = [0, 0, 0]
      alto_ne = [X, Y, Z]
   }
}


Elemento _graf_top_fusion
{
   Descrizione = "Super top"
   Code        = CUB
   Gruppo      = ""
   Tipo        = ""
   Forma       = YSweep

   Variabili
   {
      X "Larghezza del top"   1000
      Y "Altezza"             30
      Z "Profondità"          600

      sono_top_grafica_M4 "" 1
      BLEND__ "" 1
      HIDE "" 1
      m_rivestimento      "" ""
      alias_plus "" ""

      FSN_ScsPos "" "RS"
      FSN_ScsX   ""  0
      FSN_ScsZ   ""  0

      RaggioInterno   ""  0
   }

   Assegnazioni
   {
      if ( alias_plus != "" )  { kk=ALIAS_PLUS(ATTUALE(),1) }

      //Luca 07/02/2020
      AttivaVetroExportDWG_XG = 0
      wk_XGLASS = VAR_VAL_STR(PADRE(ATTUALE(),1),"XGLASS")
      if( wk_XGLASS!="" ) { AttivaVetroExportDWG_XG = 1 }
   }

   PuntiNotevoli
   {
      DEL_VAR(ATTUALE(),"base_0")
      DEL_VAR(ATTUALE(),"arc_")


      base_so = [0,0,0]
      alto_ne = [X,Y,Z]

      base_0 = [0,0,0]  alto_0 = base_0 alto_0.y = Y

      r = RaggioInterno
      k = r*SENO(45)

      if( FSN_ScsX==0 | FSN_ScsZ==0 )
      {
         base_1 = [0,0,Z]
         base_2 = [X,0,Z]
         base_3 = [X,0,0]

         EXITSUB()
      }

      if( FSN_ScsPos=="FS" )
      {
         base_1 = [0,0,Z-FSN_ScsZ]
         base_2 = [FSN_ScsX,0,Z-FSN_ScsZ]
         base_3 = [FSN_ScsX,0,Z]
         base_4 = [X,0,Z]
         base_5 = [X,0,0]

         if( RaggioInterno > 0 )
         {
            base_2 = [FSN_ScsX-r,0,Z-FSN_ScsZ]
            arc_2  = [FSN_ScsX-r+k,0,Z-FSN_ScsZ+r-k]
            base_3 = [FSN_ScsX,0,Z-FSN_ScsZ+r]
            base_4 = [FSN_ScsX,0,Z]
            base_5 = [X,0,Z]
            base_6 = [X,0,0]
         }

      }
      if( FSN_ScsPos=="FD" )
      {
         base_1 = [0,0,Z]
         base_2 = [X-FSN_ScsX,0,Z]
         base_3 = [X-FSN_ScsX,0,Z-FSN_ScsZ]
         base_4 = [X,0,Z-FSN_ScsZ]
         base_5 = [X,0,0]

         if( RaggioInterno > 0 )
         {
            base_3 = [X-FSN_ScsX,0, Z-FSN_ScsZ+r]
            arc_3  = [X-FSN_ScsX+r-k,0, Z-FSN_ScsZ+r-k]
            base_4 = [X-FSN_ScsX+r,0, Z-FSN_ScsZ]
            base_5 = [X,0,Z-FSN_ScsZ]
            base_6 = [X,0,0]
         }
      }

      if( FSN_ScsPos=="RS" )
      {
         base_0 = [FSN_ScsX,0,0]
         base_1 = [FSN_ScsX,0,FSN_ScsZ]
         base_2 = [0,0,FSN_ScsZ]
         base_3 = [0,0,Z]
         base_4 = [X,0,Z]
         base_5 = [X,0,0]

         if( RaggioInterno > 0 )
         {
            base_1 = [FSN_ScsX,0,FSN_ScsZ-r]
            arc_1  = [FSN_ScsX-r+k,0,FSN_ScsZ-r+k]
            base_2 = [FSN_ScsX-r,0,FSN_ScsZ]
            base_3 = [0,0,FSN_ScsZ]
            base_4 = [0,0,Z]
            base_5 = [X,0,Z]
            base_6 = [X,0,0]
         }
      }

      if( FSN_ScsPos=="RD" )
      {
         base_1 = [0,0,Z]
         base_2 = [X,0,Z]
         base_3 = [X,0,FSN_ScsZ]
         base_4 = [X-FSN_ScsX,0,FSN_ScsZ]
         base_5 = [X-FSN_ScsX,0,0]

         if( RaggioInterno > 0 )
         {
            base_1 = [0,0,Z]
            base_2 = [X,0,Z]
            base_3 = [X,0,FSN_ScsZ]
            base_4 = [X-FSN_ScsX+r,0,FSN_ScsZ]
            arc_4  = [X-FSN_ScsX+r-k,0,FSN_ScsZ-r+k]
            base_5 = [X-FSN_ScsX,0,FSN_ScsZ-r]
            base_6 = [X-FSN_ScsX,0,0]
         }
      }

      alto_0 = base_0 alto_0.y = Y
   }
}

Elemento ScassaRaggoIntFusion
{
   Descrizione = "Blocco Y smussato"
   Code        = CUBO
   Gruppo      = ""
   Tipo        = ""
   Forma       = YSweep

   Variabili
   {
      X     ""   400
      Y     ""    50
      Z     ""   400

      FSN_ScsPos "" ""
      FSN_ScsX   "" 0
      FSN_ScsZ   "" 0

      Raggio "" 5

      Acis "" 1

      Scassa_Chi_Plus "" ""
      HIDE "" 1
   }

   Assegnazioni
   {
      SHOW_MODE(ATTUALE(),0)
      SET_GEST_STATO(ATTUALE(),7,1)
      X = Raggio*2
      Z = Raggio*2
   }

   PuntiNotevoli
   {
      DEL_VAR(ATTUALE(),"base_*")
      DEL_VAR(ATTUALE(),"arc_*")

      r = Raggio
      k = r*SENO(45)

      base_0 = [0,0,0]
      base_1 = [0,0,Z]
      base_2 = [X,0,0]

      if( FSN_ScsPos=="FS" )
      {
         base_0 = [0 ,0 , 0 ]
         base_1 = [0 ,0 , Z - r ]
         arc_1  = [k ,0 , Z - k  ]
         base_2 = [r , 0, Z]
         base_3 = [X , 0, Z]
         base_4 = [X , 0, 0]
      }

      if( FSN_ScsPos=="FD" )
      {
         base_0 = [0 ,0 , 0 ]
         base_1 = [0 , 0, Z]
         base_2 = [X- r ,0 , Z ]
         arc_2  = [X- k ,0 , Z - k  ]
         base_3 = [X , 0, Z-r]
         base_4 = [X , 0, 0]
      }

      if( FSN_ScsPos=="RS" )
      {
         base_0 = [0 ,0 , r ]
         base_1 = [0 , 0, Z]
         base_2 = [X ,0 , Z ]
         base_3 = [X ,0 , 0 ]
         base_4 = [r , 0, 0]
         arc_4 = [k , 0, k]
      }

      if( FSN_ScsPos=="RD" )
      {
         base_0 = [0 ,0 , 0 ]
         base_1 = [0 , 0, Z]
         base_2 = [X ,0 , Z ]
         base_3 = [X , 0, r]
         arc_3  = [X - k ,0 ,k  ]
         base_4 = [X - r , 0,0]
      }

      alto_0 = base_0
      alto_0.y = Y


      base_so = [0,0,0]
      alto_ne = [X,Y,Z]
   }

   Procedura M4_Scassi
   {
      GOSUB ScassaChiPlus_M4
   }
}
// } Pannello Top

Elemento _cont_per_near_sx
{
   Descrizione = "_cont_per_near_sx"
   Code        = CPN
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      X   ""    20
      Y   ""    20
      Z   ""    20
      HIDE "" 1
   }

   Assegnazioni
   {
      GOSUB Stato_7
   }

   PuntiNotevoli
   {
      GOSUB punti
   }
}

Elemento _cont_per_near_dx
{
   Descrizione = "_cont_per_near_dx"
   Code        = CPN
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      X   ""    20
      Y   ""    20
      Z   ""    20
      HIDE "" 1
   }

   Assegnazioni
   {
      GOSUB Stato_7
   }

   PuntiNotevoli
   {
      GOSUB punti
   }
}

Elemento _cont_per_near_dn
{
   Descrizione = "_cont_per_near_sx"
   Code        = CPN
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      X   ""    20
      Y   ""    20
      Z   ""    20
      HIDE "" 1
   }

   Assegnazioni
   {
      GOSUB Stato_7
   }

   PuntiNotevoli
   {
      GOSUB punti
   }
}

Elemento _cont_per_near_up
{
   Descrizione = "_cont_per_near_dx"
   Code        = CPN
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      X   ""    20
      Y   ""    20
      Z   ""    20
      HIDE "" 1
   }

   Assegnazioni
   {
      GOSUB Stato_7
   }

   PuntiNotevoli
   {
      GOSUB punti
   }
}

//{ SCHIENALE TOP
Elemento SchienaleTop
{
   Descrizione = "Schinale Finitura"
   Code        = INT
   Gruppo      = "Cuc"
   Tipo        = Contenitore
   Forma       = ""
   Alias       Base;TSTP_NoQuota_PROSPETTI;StpSchienaleCuc

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X            "Lunghezza"                    1000 Utente ( 10- )
      Y            "Altezza"                      368  Menu ( AltSch ) Utente ( 368-736 )
      Z            "Spessore"                     4    ShowAlways

      AA_SBORDO_SX "Maggiora o riduce a sinistra" 0
      AA_SBORDO_DX "Maggiora o riduce a destra"   0

      VAR_TipoSch  "Tipo Schienale"               0    Menu ( TipoSch )

      //Simone 15/12/2022
      idx_cnear_dw  ""  -1

      COD_EREDITA   "" "PRE;POST"

      //escludo collisioni
      no_collisione "" 1

      //Legenda valori M4_DIALOG:
      // 1 : automatica
      // 2 : selezione
      // 4 : manuale
      // 8 : accessorio  non graficato
      //16 : schienali
      //32 : punti
      M4_DIALOG "" 36
      M4_MIS    "" "Filler*;X;Y;Z"

      //M4_A_MURO "" 0
      M4_LINK2WALL_MODE__   ""               3

      M4_DLINK_MODE__       "rimane steso"   0

      RADICE                ""               ""
      GEST_CODICE           ""               ""

      FIN_var               ""               "C018"
      FIN_orie              ""               "O"

      CMP2_AZIONI           ""               "M"
      VARGEST_AGGIUNTIVE    ""               "X;Y"

      FillerM2G             " "              "" ShowAlways
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Cucina_Versione
      GOSUB Setta_VarTipoSch

      GOSUB NO_AUTO

      M4_GRUPPO__ = MSG(1005)
      if( ACTION()==0 & $ATTIVA_DLL==1 ) { HIDE_ON_EDIT2(ATTUALE(),"VAR_TipoSch",1) }
   }

   PuntiNotevoli
   {
      base_0 = [-AA_SBORDO_SX  ,0, 0 ]    alto_0 = base_0 alto_0.y = Y
      base_1 = [base_0.x       ,0, Z ]    alto_1 = base_1 alto_1.y = Y
      base_2 = [X+AA_SBORDO_DX ,0, Z ]    alto_2 = base_2 alto_2.y = Y
      base_3 = [base_2.x       ,0, 0 ]    alto_3 = base_3 alto_3.y = Y

      Xt = X + AA_SBORDO_SX + AA_SBORDO_DX

      //Simone 15/12/2022 - Punti e lettere bordi per stampa
      pnt_stp_letter_up = alto_1    pnt_stp_letter_up.x = pnt_stp_letter_up.x + Xt/2  pnt_stp_letter_up.y = pnt_stp_letter_up.y + 15   pnt_stp_letter_up.z = pnt_stp_letter_up.z + 15
      pnt_stp_letter_sx = base_1    pnt_stp_letter_sx.x = pnt_stp_letter_sx.x - 15    pnt_stp_letter_sx.y = pnt_stp_letter_sx.y + Y/2  pnt_stp_letter_sx.z = pnt_stp_letter_sx.z + 15
      pnt_stp_letter_dx = base_2    pnt_stp_letter_dx.x = pnt_stp_letter_dx.x + 15    pnt_stp_letter_dx.y = pnt_stp_letter_dx.y + Y/2  pnt_stp_letter_dx.z = pnt_stp_letter_dx.z + 15
      pnt_stp_letter_dw = base_1    pnt_stp_letter_dw.x = pnt_stp_letter_dw.x + Xt/2  pnt_stp_letter_dw.y = pnt_stp_letter_dw.y - 15   pnt_stp_letter_dw.z = pnt_stp_letter_dw.z + 15

      //Luca 15/02/2022
      //punto_alz_sx       = base_1
      //punto_alz_dx       = base_2

      //Luca 17/05/2022
      vano_0_0 = base_0
      vano_l_0 = Xt
      vano_p_0 = Z
   }

   #include %path_bdm%\Tlib\orie.inc

   Procedura OnQueryBdmLocal
   {
      //Stesura con due pick
      if($query_type==3)
      {
         $QueryResult__ = 2
         EXITSUB()
      }
   }

   Procedura Stendi
   {
      //se la selezione è errata non passo la seconda volta
      if( VAR_VAL(ATTUALE(),"delme")==1 ) { EXIT() }

      if( ACTION()==$stesi_Action )
      {
         SHOW_POINT($idx_show_point, "punto_alz_?x*")
         EXIT()
      }

      nome_var_pnt_sx     = "punto_alz_sx"
      nome_var_pnt_sx_fro = "punto_alz_sx_fro"

      nome_var_pnt_dx     = "punto_alz_dx"
      nome_var_pnt_dx_fro = "punto_alz_dx_fro"

      P1   = $stesi_pt_sx
      P2   = $stesi_pt_dx

      idx_steso1 = -1
      wk_pos     = ""
      wk_pos_P1  = ""
      idx_steso1 = GetIdxWithVarVal(nome_var_pnt_sx,2,0,"",P1)                                     wk_pos = "SX" wk_pos_P1 = "SX-RT"
      if( IS_IDX(idx_steso1) == 0 ) { idx_steso1 = GetIdxWithVarVal(nome_var_pnt_sx_fro,2,0,"",P1) wk_pos = "SX" wk_pos_P1 = "SX-FR" }
      if( IS_IDX(idx_steso1) == 0 ) { idx_steso1 = GetIdxWithVarVal(nome_var_pnt_dx,2,0,"",P1)     wk_pos = "DX" wk_pos_P1 = "DX-RT" }
      if( IS_IDX(idx_steso1) == 0 ) { idx_steso1 = GetIdxWithVarVal(nome_var_pnt_dx_fro,2,0,"",P1) wk_pos = "DX" wk_pos_P1 = "DX-FR" }

      //Simone 24/11/2022 - Per capire se lo schienale risulta steso al rovescio, verifico l'interferenza PX
      ang_dir = ANG_2_PUNTI(P1,P2)

      if( IS_IDX(idx_steso1) )
      {
         ang_bas = ANG_TOT2(idx_steso1)
         wk_ang = ang_bas + 90
         SET_#(idx_steso1)

         if( wk_pos == "SX" )
         {
            wk_PT = #base_2

            if( wk_pos_P1 == "SX-RT" )
            {
               wk_ang = ang_bas
               wk_PT  = #base_1
            }
         }

         if( wk_pos == "DX" ) { wk_PT = #base_0 }

         PT = wk_PT
         PT.y = P1.y
         ang_bas = wk_ang

         P_1.x = P1.x - 99999*COSENO(ang_dir+90)
         P_1.y = P1.y
         P_1.z = P1.z + 99999*SENO(ang_dir+90)

         PX = INTERFERISCI(PT,ang_bas,P1,P_1)

         if( PX.x == $ERR_INTERFERISCI
           | PX.y == $ERR_INTERFERISCI
           | PX.z == $ERR_INTERFERISCI )
         {
            P1_save = P1
            P1 = P2
            P2 = P1_save
         }
      }

      base_0 = P1

      ang_y = ANG_2_PUNTI(P1,P2)

      if( ABS(ang_y)<0.1 )     { ang_y = 0   }
      if( ABS(ang_y-90)<0.1 )  { ang_y = 90  }
      if( ABS(ang_y-180)<0.1 ) { ang_y = 180 }
      if( ABS(ang_y-270)<0.1 ) { ang_y = 270 }


      P1_0 = P1   P1_0.y = 0
      P2_0 = P2   P2_0.y = 0

      X = DISTANZA(P1_0,P2_0)*10
      X = FLOOR(X+0.5)/10
   }

   Procedura Notifica
   {
      if( ACTION() != 12) { EXITSUB() }

      Cucina_Versione_Idx = idx_steso1
      GOSUB Cucina_Versione

      COMANDO(STRCAT("VAR_CHANGE 1 ",STR(idx_att)," X=",STR(X)," //Notifica ",NOME(ATTUALE())))
      COMANDO(STRCAT("RICALCOLA ",STR(idx_att)," //Notifica ",NOME(ATTUALE())))
   }

   Controlli
   {
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune
      FLAG_RADICE = $FLAG_STANDARD + $NORID_X

      if( IS_VAR_FIXED( ATTUALE(), "RADICE") == 0
        & IS_VAR_FIXED( ATTUALE(), "GEST_CODICE") == 0 )
      {
         GEST_CODICE = ""
         RADICE = FMT( "{}_{}", passa_RadSch, STR(Z))
      }

      GOSUB GestComune_Post
      GOSUB CAMBIA_VAR

      GOSUB Set_Gest_C008_SchienaleTop
   }

   Posiziona Schienale_generico pnc
   {
      GOSUB posa_blocco
      @X = Xt
   }

   Posiziona _cont_per_near dw
   {
      GOSUB posa_blocco

      @Y = 3
      @base_0.y = base_0.y - 2

      idx_cnear_dw = ATTUALE()
   }
}

Elemento Schienale_generico
{
   Descrizione = "Super top"
   Code        = TOP
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""
   Alias       TopM4

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X              "Larghezza"        1000   //ShowAlways
      Y              "Altezza"          30     //ShowAlways
      Z              "Spessore"         600    //ShowAlways

      VAR_TipoSch    "Tipo Schienale"   0      Implicit

      passa_CodSch   ""                 ""     Implicit
      GEST_CODICE    ""                 ""

      FIN_var        ""                 "C028"
      FIN_orie       ""                 "O"

      XGLASS         "Num. XGLASS"      ""     Utente   (   )

      HIDE           ""                 1
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Stato_8

      //Luca 07/02/2020
      AttivaVetroExportDWG_XG = 0
      wk_XGLASS = VAR_VAL_STR(ATTUALE(),"XGLASS")
      if( wk_XGLASS != "" ) { AttivaVetroExportDWG_XG = 1 }
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Controlli
   {
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune

      if( VAR_TipoSch >= 100 )
      {
         GOSUB Stato_7
         FLAG_RADICE = $NO_RAD

         RADICE = ""
         GEST_CODICE = ""

         EXITSUB()
      }

      GEST_CODICE = passa_CodSch
      FLAG_RADICE = $FLAG_STANDARD + $NORID_X + $NORID_Y + $NORID_Z

      GOSUB GestComune_Post
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }

   Posiziona Blocco graM4
   {
      @escluso = 0
      if ( X < 0.1 | Z < 0.1 ) { @escluso = 1 }

      @X = X
      @Y = Y
      @Z = Z

      @base_0 = base_0

      GOSUB rivestimento
      if( VAR_TipoSch >= 100 )
      {
         @m_rivestimento = ""
         @c_rivestimento = $c_alluminio
      }
   }
}
//} SCHIENALE TOP

//scasso generico per schienali
Elemento Scasso_SchienaleTop
{
   Descrizione = "Scasso Eldom Top"
   Code        = CUB
   Gruppo      = "ELD"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile SchienaleTop Elemento_Generico

   Variabili
   {
      //#include %path_bdm%\var_db.inc

      X "Larghezza"           100 Utente ( )
      Y "Altezza"             100 Utente ( )
      Z "Profondità"           20

      VAR_TipoSchStr "" "" Implicit

      //0 rettangolare
      //1 cilindro
      FormaScasso    ""   0
      FormaScassoStr "" ""

      Diametro      "Diametro"   35 Utente ( 10-200 )

      OffsetX       "Offset X"    0 Utente ( )
      OffsetY       "Offset Y"    0 Utente ( )
      Raggio        "Raggio"      0 Utente ( 0-20 )

      Offset_CilX   "Offset X"    0 Utente ( )
      Offset_CilY   "Offset Y"    0 Utente ( )

      VediIng       "Vedi Ingombro"      0 Boolean

      RigeneraScasso "Rigenera Scasso"   0 Boolean

      //VAR_Modifica     ">> MODIFICA POSIZIONE"       0 Boolean

      VediLimiti_PCV "" 0 Implicit

      idx_top "" -1

      Scassa_Chi_Plus          "" ""

      CMP2_AZIONI "" "A"
   }

   Assegnazioni
   {
      GOSUB AssComune

      FormaScassoStr = "RET"
      if( FormaScasso == 1 )  { FormaScassoStr = "CIL" }

      FLAG_RADICE = $NO_RAD

      M4_MIS = "X;Y;Diametro;OffsetX;OffsetY;Raggio;Offset_CilX;Offset_CilY"

      GOSUB Stato_78

      //pulisco variabili doppie
      if( $OnLoadOrder )
      {
         if( IS_VAR_FIXED(ATTUALE(),"VediIng")==1 )
         {
            DEL_VAR_MODIFICATE(ATTUALE(),"VediIng")
            VediIng = 0
         }
      }

      if( FormaScassoStr == "CIL")
      {
         HIDE_ON_EDIT2(ATTUALE(),"X",1)
         HIDE_ON_EDIT2(ATTUALE(),"Y",1)
         HIDE_ON_EDIT2(ATTUALE(),"OffsetX",1)
         HIDE_ON_EDIT2(ATTUALE(),"OffsetY",1)
         HIDE_ON_EDIT2(ATTUALE(),"Raggio",1)

         HIDE_ON_EDIT2(ATTUALE(),"Diametro",0)
         HIDE_ON_EDIT2(ATTUALE(),"Offset_CilX",0)
         HIDE_ON_EDIT2(ATTUALE(),"Offset_CilY",0)

         DescEdit__  = MSG(1120)
      }
      else
      {
         HIDE_ON_EDIT2(ATTUALE(),"X",0)
         HIDE_ON_EDIT2(ATTUALE(),"Y",0)
         HIDE_ON_EDIT2(ATTUALE(),"OffsetX",0)
         HIDE_ON_EDIT2(ATTUALE(),"OffsetY",0)
         HIDE_ON_EDIT2(ATTUALE(),"Raggio",0)

         HIDE_ON_EDIT2(ATTUALE(),"Diametro",1)
         HIDE_ON_EDIT2(ATTUALE(),"Offset_CilX",1)
         HIDE_ON_EDIT2(ATTUALE(),"Offset_CilY",1)

         DescEdit__  = MSG(1119)
      }
   }

   PuntiNotevoli
   {
      if( FormaScassoStr == "CIL" )
      {
         X = Diametro
         Y = Diametro
      }

      GOSUB punti

      //Luca 26/10/2019
      //utilizzo in stampa
      pnt_scs_centro = [X/2,Y/2,Z]

      //Luca 09/12/2021 per quota su stampa mensole
      Stp_Quota_Foro = 1

      stp_base_0 = base_0     stp_base_2 = base_2
      stp_base_1 = base_1     stp_base_3 = base_3
   }

   Procedura OnQueryBdmLocal
   {
      if( $query_type == 8 )
      {
         $QueryResult__ = 1

         if( NOME($query_p1) != "Elemento_Generico" ) { EXITSUB() }
         if( $modalita_reale != "TE" )                { EXITSUB() }

         $QueryResult__ = 0

         // pannelli generici legno - ww - vetro
         if( VAR_VAL( $query_p1, "VAR_Tipo") == 1
           | VAR_VAL( $query_p1, "VAR_Tipo") == 2
           | VAR_VAL( $query_p1, "VAR_Tipo") == 4
           | VAR_VAL( $query_p1, "VAR_Tipo") == 6 )   { $QueryResult__ = 1 }
      }
   }

   Attrezza
   {
      idx_ref = @idx_att
      vano_n = $vano_n

      ATTREZZATO_SU = ""

      if( IS_VAR_FIXED(ATTUALE(),"OffsetX")==0 ) { OffsetX = @X/2 - X/2 }
      if( IS_VAR_FIXED(ATTUALE(),"OffsetY")==0 ) { OffsetY = @Y/2 - Y/2 }

      base_0.x = @base_0.x + OffsetX
      base_0.y = @base_0.y + OffsetY
      base_0.z = @base_0.z - 5

      if( FormaScassoStr == "CIL" )
      {
         if( IS_VAR_FIXED(ATTUALE(),"Offset_CilX")==0 ) { Offset_CilX = @X/2 }
         if( IS_VAR_FIXED(ATTUALE(),"Offset_CilY")==0 ) { Offset_CilY = @Y/2 }

         base_0.x = @base_0.x + Offset_CilX - X/2
         base_0.y = @base_0.y + Offset_CilY - Y/2
      }

      // gestione speciale di scassi su pannelli generici
      if( NOME(idx_ref) == "Elemento_Generico" )
      {
         FLAG_Speciale = 1
         Z = @Z + 10
      }
   }

   Controlli
   {
      GOSUB CtrlComune

      GOSUB TrovaIdxTopDaScassare

      if( ACTION()> 0 & ACTION()!=2 & $OnLoadOrder != 1 )
      {
         idx_pdr = GetTopLevel(ATTUALE())

         COMPONENTI2("wk_bl",idx_pdr,"Blocco")
         if( wk_bl > 0 ) { Scassa_Chi_Plus = STR(wk_bl[1]) }

         //dimensioni minime e massime
         OffX_min = 10
         OffY_min = 10

         if( VAR_TipoSchStr == "VET4" | VAR_TipoSchStr == "VET10"
           | VAR_TipoSchStr == "XGL4" | VAR_TipoSchStr == "XGL10"  )
         {
            OffX_min = 95
            OffY_min = 45
         }

         if( VAR_VAL( ATTUALE(), "FLAG_Speciale") > 0 )
         {
            OffX_min = 0
            OffY_min = 0
         }

         OffX_max = VAR_VAL(idx_pdr,"Xt") - OffX_min - X
         OffY_max = VAR_VAL(idx_pdr,"Y")  - OffY_min - Y

         X_min = 50
         Y_min = 50

         if( VAR_TipoSchStr == "VET4" | VAR_TipoSchStr == "VET10"
           | VAR_TipoSchStr == "XGL4" | VAR_TipoSchStr == "XGL10"  )
         {
            X_min = 40
            Y_min = 40
         }
         X_max = VAR_VAL(idx_pdr,"Xt") - 2*OffX_min
         Y_max = VAR_VAL(idx_pdr,"Y")  - 2*OffY_min

         Raggio_min = 2.5
         Raggio_max = (X/2) - 2
         if( IS_VAR_FIXED(ATTUALE(),"Raggio") == 0 ) { Raggio = Raggio_min }

         if( VAR_TipoSchStr == "VET4" | VAR_TipoSchStr == "VET10"
           | VAR_TipoSchStr == "XGL4" | VAR_TipoSchStr == "XGL10"  )
         {
            Raggio_min = 7
            if( IS_VAR_FIXED(ATTUALE(),"Raggio") == 0 ) { Raggio = Raggio_min }
         }

         if( VAR_TipoSchStr == "FEN10" | VAR_TipoSchStr == "FEN12"
           | VAR_TipoSchStr == "LAM10" | VAR_TipoSchStr == "LAM12"  )
         {
            Raggio_min = 4
            if( IS_VAR_FIXED(ATTUALE(),"Raggio") == 0 ) { Raggio = 8 }
         }

         if( VAR_VAL( ATTUALE(), "FLAG_Speciale") > 0 ) { Raggio_min = 0 }

         Diametro_min = 20
         Diametro_max = 200

         OffCilX_min = OffX_min + X/2
         OffCilX_max = VAR_VAL(idx_pdr,"Xt") - OffX_min - X/2

         OffCilY_min = OffY_min + Y/2
         OffCilY_max = VAR_VAL(idx_pdr,"Y") - OffY_min - Y/2

         if( FormaScassoStr == "RET" )
         {
            VarSetMenuLimiti( ATTUALE() , "OffsetX"     , OffX_min     , OffX_max   , 1 )
            VarSetMenuLimiti( ATTUALE() , "OffsetY"     , OffY_min     , OffY_max   , 1 )
            VarSetMenuLimiti( ATTUALE() , "X"           , X_min        , X_max      , 1 )
            VarSetMenuLimiti( ATTUALE() , "Y"           , Y_min        , Y_max      , 1 )
            VarSetMenuLimiti( ATTUALE() , "Raggio"      , Raggio_min   , Raggio_max , 1 )
         }
         else
         {
            VarSetMenuLimiti( ATTUALE() , "Diametro"    , Diametro_min , Diametro_max , 1 )
            VarSetMenuLimiti( ATTUALE() , "Offset_CilX" , OffCilX_min  , OffCilX_max  , 1 )
            VarSetMenuLimiti( ATTUALE() , "Offset_CilY" , OffCilY_min  , OffCilY_max  , 1 )
         }

         CRS_lista_var = "X;Y;OffsetX;OffsetY;Raggio;Diametro;Offset_CilX;Offset_CilY"
         GOSUB CheckRigeneraScasso
         if( CRS_Result == 1 )  { RigeneraScasso = 1 }

         //verifico se vado in collisione con un altro scasso
         BOX_MODE(0)
         NEAR_GLOBALE( "coll", idx_cnear, 1, 1, NOME(ATTUALE()))
         DelItem2Array( ATTUALE(), "coll", ATTUALE(), "")

         //trovata collisione con altro scasso
         if( coll > 0
           & $CNP != 1 )
         {
            commento = "Delme_Collisione"

           #ifdef TEC;AZI
            DISPLAY2("COLLISIONE SCASSO\nELIMINO")
           #endif

            COMANDO( STRCAT( "CANCELLA ", STR(ATTUALE()), " //Delme_Collisione", commento))
         }
      }

      if( RigeneraScasso == 1 )
      {
         if( IS_VAR_FIXED(ATTUALE(),"RigeneraScasso")==1 ) { DEL_VAR_MODIFICATE(ATTUALE(),"RigeneraScasso") }
         RigeneraScasso = 0

         $wk_EliminaScassi_da_idx = GetTopLevel(ATTUALE())
         GOSUB EliminaScassi
         COMANDO(STRCAT("PROCEDURA M4_Scassi ",STR(GetTopLevel(ATTUALE())),"  // Scassa_e_Taglia "))
      }
   }

   Procedura PostAction2
   {
      if( $OnLoadOrder ) { EXITSUB() }
      if( $OnRigenera )  { EXITSUB() }

      RigeneraScasso = 1
      COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE()),"  //PostAction2 ",NOME(ATTUALE())))
   }

   Procedura VR_AggiornaScassi
   {
      COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE())," no_agganciati // VR_AggiornaScassi ",NOME(ATTUALE())))
      COMANDO(STRCAT("PROCEDURA M4_Scassi ",STR(ATTUALE()),"  // VR_AggiornaScassi ",NOME(ATTUALE())))
   }

   Procedura cancella
   {
      if( VAR_EXIST(-1,"StartingDel__")==0 ) { EXITSUB() }
      if( $StartingDel__!=ATTUALE() )        { EXITSUB() }

      $wk_EliminaScassi_da_idx = GetTopLevel(ATTUALE())
      GOSUB EliminaScassi
      COMANDO(STRCAT("PROCEDURA M4_Scassi ",STR(GetTopLevel(ATTUALE())),"  // Scassa_e_Taglia "))
   }

   //blocco per selezione
   Posiziona Blocco_Invisibile sel
   {
      GOSUB posa_blocco
   }

   Posiziona _cont_per_near_2 cnear
   //Posiziona Blocco cnear
   {
      offx = 90
      offy = 50

      if( VAR_TipoSchStr == "QRZ" )
      {
         offx = 20
         offy = 20
      }

      if( VAR_TipoSchStr == "FEN10" | VAR_TipoSchStr == "FEN12"
        | VAR_TipoSchStr == "LAM10" | VAR_TipoSchStr == "LAM12"  )
      {
         offx = 80
         offy = 10

         if( VAR_VAL(GetTopLevel(ATTUALE()),"Y") < 130  ) { offy = 130 }
      }

      @X = X + 2*(offx - 1)
      @Y = Y + 2*(offy - 1)
      @Z = Z

      @base_0.x = base_0.x + X/2 - @X/2
      @base_0.y = base_0.y + Y/2 - @Y/2
      @base_0.z = base_0.z

      idx_cnear = ATTUALE()

      @c_rivestimento = [255,120,120]
      @f_rivestimento = "0.9"

      @DEBUG = VediLimiti_PCV
   }

   //{ RETTANGOLO
   Posiziona Blocco vedi
   {
      @escluso = 1
      if( VediIng==1 & FormaScasso==0 & Raggio==0 ) { @escluso = 0 }

      GOSUB posa_blocco
      @c_rivestimento = [120,120,255]
      @f_rivestimento = "0.9"
   }

   Posiziona Blocco_Scassa scs
   {
      @escluso = 1
      if( FormaScasso==0 & Raggio==0 ) { @escluso = 0 }

      GOSUB posa_blocco
      @Scassa_Chi_Plus = Scassa_Chi_Plus
   }
   //} RETTANGOLO

   //{ RETTANGOLO CON RAGGIO
   Posiziona BloccoSmussatoZ vedis
   {
      @escluso = 1
      if( VediIng==1 & FormaScasso==0 & Raggio!=0 ) { @escluso = 0 }

      GOSUB posa_blocco
      @R0 = Raggio
      @R1 = Raggio
      @R2 = Raggio
      @R3 = Raggio

      @c_rivestimento = [120,120,255]
      @f_rivestimento = "0.9"
   }

   Posiziona BloccoSmussatoZ_Scassa scs2
   {
      @escluso = 1
      if( FormaScasso==0 & Raggio!=0 ) { @escluso = 0 }
      @Raggio = Raggio

      GOSUB posa_blocco
      @Scassa_Chi_Plus = Scassa_Chi_Plus
   }
   //} RETTANGOLO CON RAGGIO

   //{ CILINDRO
   Posiziona CilindroZ Cil
   {
      @escluso = 1
      if( VediIng & FormaScasso==1 ) { @escluso = 0 }

      GOSUB posa_blocco
      @c_rivestimento = [120,120,255]
      @f_rivestimento = "0.9"
   }

   Posiziona CilindroZ_Scassa scs_cil
   {
      @escluso = 1
      if( FormaScasso==1 ) { @escluso = 0 }

      GOSUB posa_blocco
      @X = Diametro
      @Scassa_Chi_Plus = Scassa_Chi_Plus
   }
   //} CILINDRO

   //Posiziona _cont_per_near cnear
   //{
   //   GOSUB posa_blocco
   //   idx_cnear = ATTUALE()
   //}
}

//scasso generico per top
//da attrezzare alle basi
Elemento Scasso_EldomTop
{
   Descrizione = "Scasso Eldom Top"
   Code        = CUB
   Gruppo      = "ELD"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile ScoccaT_B* Mensola_Air Mensola_Rivestita ScrivaniaMuro_AIR
   Alias       CamIncidente;OnChangedVar

   Variabili
   {
      //#include %path_bdm%\var_db.inc

      X "Larghezza"           564 Utente ( )
      Y ""                    130
      Z "Profondità"          400 Utente ( )

      //0 rettangolare
      //1 cilindro
      FormaScasso ""  0

      //Luca 04/03/2020 riporto modifiche LAGO
      //Diametro    "Diamentro"            35   Utente ( 10-80 )
      //DiametroST  "Diamentro Sotto TOP"  35   Utente ( 10-140 )
      Diametro    "Diametro"            35   Utente ( 10-200 )
      DiametroST  "Diametro Sotto TOP"  35   Utente ( 10-200 )

      OffsetX       "Offset X (sx base-sx foro)"          0 Utente ( )
      OffsetZ       "Offset Z (fronte base-fronte foro)"  0 Utente ( )
      Raggio        "Raggio"                              0 Utente ( 0-20 )

      Offset_CilX   "Offset X (sx base-centro foro)"      0 Utente ( )
      Offset_CilZ   "Offset Z (retro base-centro foro)"   0 Utente ( )

      //maggiorazione X e Z scasso sottotop
      //Luca 04/03/2020 riporto modifiche LAGO
      //MagXSt   "" 1
      //MagZSt   "" 1
      MagXSt   "" 3
      MagZSt   "" 3

      VediIng      "Vedi Ingombro"                   0 Boolean

      RigeneraScasso "Rigenera Scasso"               0 Boolean

      //riporto gestione limiti pcv
      VAR_Modifica     ">> MODIFICA POSIZIONE"       0 Boolean

      ATTREZZATO_SU  "" ""

      VediLimiti_PCV "" 0 Implicit

      idx_top "" -1

      Scassa_Chi_Plus          "" ""
      Scassa_Chi_Plus_SottoTop "" ""

      CMP2_AZIONI "" "A"
   }

   Assegnazioni
   {
      GOSUB AssComune

      FLAG_RADICE = $NO_RAD

      M4_MIS = "X;Z;Diametro;DiametroST;OffsetX;OffsetZ;Raggio;Offset_CilX;Offset_CilZ;VediIng;RigeneraScasso;VAR_Modifica"

      GOSUB Stato_78


      if( $OnLoadOrder )
      {
         if( IS_VAR_FIXED(ATTUALE(),"VediIng")==1 )
         {
            DEL_VAR_MODIFICATE(ATTUALE(),"VediIng")
            VediIng = 0
         }
      }

      if( FormaScasso==1 )
      {
         HIDE_ON_EDIT2(ATTUALE(),"X",1)
         HIDE_ON_EDIT2(ATTUALE(),"Z",1)
         HIDE_ON_EDIT2(ATTUALE(),"OffsetX",1)
         HIDE_ON_EDIT2(ATTUALE(),"OffsetZ",1)
         HIDE_ON_EDIT2(ATTUALE(),"Raggio",1)

         HIDE_ON_EDIT2(ATTUALE(),"Diametro",0)
         HIDE_ON_EDIT2(ATTUALE(),"DiametroST",0)
         HIDE_ON_EDIT2(ATTUALE(),"Offset_CilX",0)
         HIDE_ON_EDIT2(ATTUALE(),"Offset_CilZ",0)

         DescEdit__  = "SCASSO CILINDRO"
      }
      else
      {
         HIDE_ON_EDIT2(ATTUALE(),"X",0)
         HIDE_ON_EDIT2(ATTUALE(),"Z",0)
         HIDE_ON_EDIT2(ATTUALE(),"OffsetX",0)
         HIDE_ON_EDIT2(ATTUALE(),"OffsetZ",0)
         HIDE_ON_EDIT2(ATTUALE(),"Raggio",0)

         HIDE_ON_EDIT2(ATTUALE(),"Diametro",1)
         HIDE_ON_EDIT2(ATTUALE(),"DiametroST",1)
         HIDE_ON_EDIT2(ATTUALE(),"Offset_CilX",1)
         HIDE_ON_EDIT2(ATTUALE(),"Offset_CilZ",1)

         DescEdit__  = "SCASSO RETTANGOLO"
      }

      if( FormaScasso==1 )
      {
         MagXSt = 3
         MagZSt = 3
      }

      if( UN_PADRE("Mensola_Air")
        | UN_PADRE("Mensola_Rivestita") )
      {
         HIDE_ON_EDIT2(ATTUALE(),"Offset_CilX",1)
         HIDE_ON_EDIT2(ATTUALE(),"Offset_CilZ",1)
         HIDE_ON_EDIT2(ATTUALE(),"OffsetX",1)
         HIDE_ON_EDIT2(ATTUALE(),"OffsetZ",1)

         HIDE_ON_EDIT2(ATTUALE(),"VAR_Modifica",0)

         MagXSt = 0
         MagZSt = 0
      }
      else
      {
         HIDE_ON_EDIT2(ATTUALE(),"VAR_Modifica",1)
      }
   }

   PuntiNotevoli
   {
      if( FormaScasso==1 )
      {
         X = Diametro
         Z = Diametro

         if( IS_VAR_FIXED( ATTUALE(), "DiametroST") == 0 )
         {
            DiametroST = Diametro + 2*MagXSt
         }
      }

      GOSUB punti

      //Luca 26/10/2019
      //utilizzo in stampa
      pnt_scs_centro = [X/2,Y,Z/2]

      //Luca 09/12/2021 per quota su stampa mensole
      Stp_Quota_Foro = 1

      stp_base_0 = base_0     stp_base_2 = base_2
      stp_base_1 = base_1     stp_base_3 = base_3
   }

   Attrezza
   {
      idx_ref = @idx_att
      vano_n = $vano_n

      ATTREZZATO_SU = ""
      if( NOME(idx_ref) == "Mensola_Air"
        | NOME(idx_ref) == "ScrivaniaMuro_AIR" ) { ATTREZZATO_SU = "MENSOLA_AIR" }
      //Simone 20/07/2022
      if( NOME(idx_ref) == "Mensola_Rivestita" ) { ATTREZZATO_SU = "MENSOLA_LIV" }

      if( ATTREZZATO_SU == "MENSOLA_AIR"
        | ATTREZZATO_SU == "MENSOLA_LIV" )
      {
         if( ACTION() == 2 & $OnLoadOrder==0 )
         {
            $wk_chiedi_on_insert = 1
            if( FormaScasso==1 )
            {
               if( IS_VAR_FIXED(ATTUALE(),"Diametro") == 0 )
               {
                  CHIEDI(ATTUALE(),"Diametro")
               }
            }
            else
            {
               if( IS_VAR_FIXED(ATTUALE(),"X") == 0 )
               {
                  X = 200
                  Z = 200
                  CHIEDI(ATTUALE(),"X")
                  CHIEDI(ATTUALE(),"Z")
               }
            }

            $wk_chiedi_on_insert = 0
         }
      }

      //Luca 02/04/2019
      //if( IS_VAR_FIXED(ATTUALE(),"OffsetX")==0 ) { OffsetX = VAR_VAL(PADRE(ATTUALE(),1),"X")/2 - X/2 }
      //if( IS_VAR_FIXED(ATTUALE(),"OffsetZ")==0 ) { OffsetZ = VAR_VAL(PADRE(ATTUALE(),1),"Z")/2 - Z/2 }
      if( IS_VAR_FIXED(ATTUALE(),"OffsetX")==0 ) { OffsetX = @X/2 - X/2 }
      if( IS_VAR_FIXED(ATTUALE(),"OffsetZ")==0 )
      {
         OffsetZ = @Z/2 - Z/2

         if( IS_IDX(idx_top) )
         {
            if( VAR_VAL(GetTopLevel(ATTUALE()),"Zt")>631 )
            {
               OffsetZ = 115 - VAR_VAL(idx_top,"aa_sbrd_fr")
            }
            else
            {
               OffsetZ = 80 - VAR_VAL(idx_top,"aa_sbrd_fr")
            }
         }
      }

      base_0.x = @base_0.x + OffsetX
      base_0.z = @base_0.z + @Z - OffsetZ - Z
      base_0.y = @alto_0.y - 30

      //Luca 09/12/2021
      if( ATTREZZATO_SU == "MENSOLA_AIR"
        | ATTREZZATO_SU == "MENSOLA_LIV" )
      {
         Y = @Y + 10
         base_0.y = @base_0.y - 5
         base_0.z = @base_0.z + OffsetZ
      }

      if( FormaScasso==1 )
      {
         if( IS_VAR_FIXED(ATTUALE(),"Offset_CilX")==0 ) { Offset_CilX = @X/2 }
         if( IS_VAR_FIXED(ATTUALE(),"Offset_CilZ")==0 ) { Offset_CilZ = 100 }

         base_0.x = @base_0.x + Offset_CilX - X/2
         base_0.z = @base_0.z + Offset_CilZ - Z/2
      }
   }

   Controlli
   {
      GOSUB CtrlComune

      GOSUB TrovaIdxTopDaScassare

      //Luca 09/12/2021
      if( ATTREZZATO_SU == "MENSOLA_AIR"
        | ATTREZZATO_SU == "MENSOLA_LIV" )
      {
         GOSUB CtrlPassacavi_Sposta_368
      }
  //primo inserimento
      //if( ACTION()==2 & $OnLoadOrder==0 & COMPONENDO()==0 )
      //{
      //   COMANDO(STRCAT("PROCEDURA M4_Scassi ",STR(ATTUALE()),"  // Scassa_e_Taglia "))
      //   COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " OffsetZ:",STR(OffsetZ)," | DEBUG ---- "))
      //}

      //if( ACTION()>0 & ACTION()!=2 & $OnLoadOrder==0 )
      if( ACTION()>0 & $OnLoadOrder==0 )
      {
         if( VAR_EXIST(ATTUALE(),"X_prec")==0 )      { X_prec = X }
         if( VAR_EXIST(ATTUALE(),"Z_prec")==0 )      { Z_prec = Z }
         if( VAR_EXIST(ATTUALE(),"OffX_prec")==0 )   { OffX_prec = OffsetX }
         if( VAR_EXIST(ATTUALE(),"OffZ_prec")==0 )   { OffZ_prec = OffsetZ }
         if( VAR_EXIST(ATTUALE(),"Raggio_prec")==0 ) { Raggio_prec = Raggio }

         if( VAR_EXIST(ATTUALE(),"Diam_prec")==0 )   { Diam_prec   = Diametro }
         if( VAR_EXIST(ATTUALE(),"DiamST_prec")==0 ) { DiamST_prec = DiametroST }
         if( VAR_EXIST(ATTUALE(),"OffCX_prec")==0 )  { OffCX_prec  = Offset_CilX }
         if( VAR_EXIST(ATTUALE(),"OffCZ_prec")==0 )  { OffCZ_prec  = Offset_CilZ }

         if(  X_prec!=X | OffX_prec!=OffsetX
            | Z_prec!=Z | OffZ_prec!=OffsetZ
            | Raggio!=Raggio_prec
            | Diam_prec!=Diametro
            | DiamST_prec!=DiametroST
            | OffCX_prec!=Offset_CilX
            | OffCZ_prec!=Offset_CilZ  )
         {
            X_prec    = X
            Z_prec    = Z
            OffX_prec = OffsetX
            OffZ_prec = OffsetZ
            Diam_prec  = Diametro
            DiamST_prec  = DiametroST
            OffCX_prec = Offset_CilX
            OffCZ_prec = Offset_CilZ
            Raggio_prec = Raggio

            GOSUB EliminaScassi
            //COMANDO(STRCAT("PROCEDURA M4_Scassi ",STR(ATTUALE()),"  // Scassa_e_Taglia "))
            COMANDO("PROCEDURA M4_Scassi // Scassa_e_Taglia ")

            if( ATTREZZATO_SU == "MENSOLA_AIR"
              | ATTREZZATO_SU == "MENSOLA_LIV" )
            {
               COMANDO(STRCAT("Procedura PCV_ControllaPosizione_30MM ",STR(ATTUALE()),"  // OnChangedVar"))
            }
         }
      }

      if( RigeneraScasso==1 )
      {
         if( IS_VAR_FIXED(ATTUALE(),"RigeneraScasso")==1 ) { DEL_VAR_MODIFICATE(ATTUALE(),"RigeneraScasso") }
         RigeneraScasso = 0

         GOSUB EliminaScassi
         COMANDO("PROCEDURA M4_Scassi // Scassa_e_Taglia ")
      }
   }

   Procedura PostAction2
   {
      if( $OnLoadOrder )  { EXITSUB() }

      COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE()),"  //PostAction2 "))

      if( $OnRigenera )  { EXITSUB() }

      if( ATTREZZATO_SU != "MENSOLA_AIR"
        & ATTREZZATO_SU != "MENSOLA_LIV" )         { EXITSUB() }

      //controllo posizione in inserimento
      GOSUB CtrlPassacavi_Posizione_368
      if( OK_POSIZIONE == 0 ) { VAR_Modifica = 1 }
      $PCV_ContCollisioni_su_SCH = 0
      COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE()),"  // PostGestDllValida Passacavi"))
   }

   Procedura VR_AggiornaScassi
   {
      COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE())," no_agganciati // VR_AggiornaScassi ",NOME(ATTUALE())))
      COMANDO(STRCAT("PROCEDURA M4_Scassi ",STR(ATTUALE()),"  // VR_AggiornaScassi ",NOME(ATTUALE())))
   }

   Procedura cancella
   {
      GOSUB Elimina_Scasso
   }

   //Procedura OnChangedVar
   //{
   //   if( UN_PADRE("Mensola_Air") != 1 ) { EXITSUB() }
   //
   //   if( VAR_VAL(-1,"wk_chiedi_on_insert") == 1 )  { EXITSUB() }
   //
   //   if( $ChangedVar=="X"
   //     | $ChangedVar=="Z"
   //     | $ChangedVar=="DiametroST"
   //     )
   //   {
   //      //GOSUB CtrlPassacavi_Posizione_368
   //      //if( OK_POSIZIONE == 0 ) { VAR_Modifica = 1 }
   //      //$PCV_ContCollisioni_su_SCH = 0
   //      COMANDO(STRCAT("Procedura PCV_ControllaPosizione_30MM ",STR(ATTUALE()),"  // OnChangedVar"))
   //   }
   //}
   //
   Procedura PCV_ControllaPosizione_30MM
   {
      GOSUB CtrlPassacavi_Posizione_368
      if( OK_POSIZIONE == 0 ) { VAR_Modifica = 1 }
      GOSUB CtrlPassacavi_Sposta_368
      COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE()),"  // OnChangedVar"))
   }

   //Posiziona Blocco_Invisibile inv
   //{
   //   GOSUB posa_blocco
   //   @Scassa_Chi_Plus = Scassa_Chi_Plus
   //}

   //{ RETTANGOLO
   Posiziona Blocco vedi
   {
      @escluso = 1
      if( VediIng==1 & FormaScasso==0 & Raggio==0 ) { @escluso = 0 }

      GOSUB posa_blocco
      @c_rivestimento = [120,120,255]
      @f_rivestimento = "0.9"
   }

   Posiziona Blocco_Scassa scs
   {
      @escluso = 1
      if( FormaScasso==0 & Raggio==0 ) { @escluso = 0 }

      GOSUB posa_blocco
      @Scassa_Chi_Plus = Scassa_Chi_Plus
   }

   Posiziona Blocco_Scassa scsst
   {
      @escluso = 1
      if( FormaScasso==0 & Raggio==0 ) { @escluso = 0 }

      GOSUB posa_blocco
      @base_0.x = base_0.x - MagXSt
      @base_0.z = base_0.z - MagZSt
      @X = X + MagXSt*2
      @Z = Z + MagZSt*2
      @Scassa_Chi_Plus = Scassa_Chi_Plus_SottoTop
   }
   //} RETTANGOLO

   //{ RETTANGOLO CON RAGGIO
   Posiziona BloccoSmussatoY vedis
   {
      @escluso = 1
      if( VediIng==1 & FormaScasso==0 & Raggio!=0 ) { @escluso = 0 }

      GOSUB posa_blocco
      @Y = Y*2
      @base_0.y = base_0.y + (Y - @Y)/2

      @R0 = Raggio
      @R1 = Raggio
      @R2 = Raggio
      @R3 = Raggio

      @c_rivestimento = [120,120,255]
      @f_rivestimento = "0.9"
   }

   Posiziona BloccoSmussato_Scassa scs2
   {
      @escluso = 1
      if( FormaScasso==0 & Raggio!=0 ) { @escluso = 0 }
      @Raggio = Raggio

      GOSUB posa_blocco
      @Scassa_Chi_Plus = Scassa_Chi_Plus
   }

   Posiziona BloccoSmussato_Scassa scs_st2
   {
      @escluso = 1
      if( FormaScasso==0 & Raggio!=0 ) { @escluso = 0 }
      @Raggio = Raggio

      GOSUB posa_blocco
      @base_0.x = base_0.x - MagXSt
      @base_0.z = base_0.z - MagZSt
      @X = X + MagXSt*2
      @Z = Z + MagZSt*2

      @Scassa_Chi_Plus = Scassa_Chi_Plus_SottoTop
   }
   //} RETTANGOLO CON RAGGIO

   //{ CILINDRO
   Posiziona CilindroY Cil
   {
      @escluso = 1
      if( VediIng & FormaScasso==1 ) { @escluso = 0 }

      GOSUB posa_blocco
      @Y = Y*2
      @base_0.y = base_0.y - (Y + @Y)/2

      @c_rivestimento = [120,120,255]
      @f_rivestimento = "0.9"
   }

   Posiziona CilindroY_Scassa scs_cil
   {
      @escluso = 1
      if( FormaScasso==1 ) { @escluso = 0 }

      GOSUB posa_blocco
      @X = Diametro
      @Scassa_Chi_Plus = Scassa_Chi_Plus
   }

   Posiziona CilindroY_Scassa scs_cis
   {
      @escluso = 1
      if( FormaScasso==1 ) { @escluso = 0 }

      GOSUB posa_blocco
      //@X = Diametro + MagXSt*2
      @X = DiametroST
      //@base_0.x = base_0.x - MagXSt
      //@base_0.z = base_0.z - MagZSt
      @base_0.x = base_0.x - (DiametroST- Diametro)/2
      @base_0.z = base_0.z - (DiametroST- Diametro)/2

      @Scassa_Chi_Plus = Scassa_Chi_Plus_SottoTop
   }
   //} CILINDRO

   //Luca 09/12/2021
   Posiziona PCV_ContCollisioni_368 PCV
   {
      //GOSUB posa_blocco
      @Y = Y + 2
      @X = X + 20 - 0.4

      @Z = Z + 20 - 0.4

      if( FormaScasso == 1  )
      {
         @X = DiametroST + 20 - 0.4
         @Z = DiametroST + 20 - 0.4
      }

      @base_0.x = base_0.x + X/2 - @X/2
      @base_0.y = base_0.y - 1
      @base_0.z = base_0.z + Z/2 - @Z/2
   }

   //per il controllo collisioni utilizzo questo
   // -0.2 per lato in quanto utilizzo il NEAR_GLOBALE con tolleranza 0.1
   Posiziona _cont_per_near PCV_1
   {
      @Y = Y + 2
      @X = X + 20 - 0.4
      @Z = Z + 20 - 0.4

      if( FormaScasso == 1  )
      {
         @X = DiametroST + 20 - 0.4
         @Z = DiametroST + 20 - 0.4
      }

      @base_0.x = base_0.x + X/2 - @X/2
      @base_0.y = base_0.y - 1
      @base_0.z = base_0.z + Z/2 - @Z/2

      idx_coll_PCV = ATTUALE()
   }

   Posiziona _cont_per_near cnear
   {
      GOSUB posa_blocco
      idx_cnear = ATTUALE()
   }
}

//{ PENSIOLA
Elemento Penisola
{
   Descrizione    = "Penisola"
   Code           = TOP
   Gruppo         = "Piani"
   Tipo           = Contenitore
   Forma          = ""
   Alias          Penisola;NoCollision;OnChangedVar
   //Top

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X                    "Larghezza"                     1140   Utente   (   888-2944      )

      Y                    "(Altezza piano)"               80

      Z                    "Profondità"                    640    Utente   (   437-1250      )   SaveAlways
      Zt                   "Profondità Totale"             640    ShowAlways

      Yt                   "Altezza da terra"              500    Utente   (   281-981       )   SaveAlways
      Smusso               "Smusso"                        0      Boolean

      Filler2              " "                             ""     ShowAlways

      VAR_SbordoFro        "Sporgenza Frontale"            0      Utente   (   0-184         )
      VAR_SbordoRet        "Sporgenza Retro"               0      Utente   (   0-184         )
      VAR_SbordoLat        "Sporgenza Laterale"            0      Utente   (   0-184         )

      Filler3              " "                             ""     ShowAlways

      //VAR_TipoTop = 21 Acciaio Steel 80mm --> 80mm + 19mm
      //VAR_TipoTop = 22 Wildwood 80mm --> 80mm + 19mm
      //VAR_TipoTop = 23 Acciaio Steel Penisola 80mm --> 80mm
      VAR_TipoPiano        "Tipo piano"                    22     Menu     (   TipoPiaPen    )

      //VAR_TipoPen = 0 appoggio
      //VAR_TipoPen = 1 a muro
      VAR_TipoPen          "Tipologia Penisola"            0      Menu     (   TipoPen       )

      //1/2 in base alla lunghezza/luce interna
      VAR_NSupp            "Numero supporti"               1

      VAR_Appoggio         "Appoggio su base"              520    Utente   (   520-9999      )

      //posizione in del supporto vetro
      VAR_RieXSupp         "Rientro supporto vetro"        184    Menu     (   RieXSV        )
      VAR_RieXSuppDis      "Rientro supporto vetro Pers"   184    Utente   (   184-552       )

      VAR_TipoTeste        "Tipo Testa Piano"              1      //Menu ( TpTestaPia )

      Filler4              " "                             ""     ShowAlways

      VAR_PosPenisola      "Posizione Penisola"            1      Menu     (   PosPenisola   )   SaveAlways

      SuppVtr_Altezza      "Altezza supporto"              384
      SuppVtr_Larghezza    "Larghezza supporto"            384

      SuppVtr2_Altezza     "Altezza supporto"              384
      SuppVtr2_Larghezza   "Larghezza supporto"            384

      LuceInternaX         "luce interna"                  0

      idx_top_generico     ""                              -1
      idx_piano            ""                              -1
      idx_suppvtr_1        ""                              -1
      idx_suppvtr_2        ""                              -1

      idx_near_sx          ""                              -1
      idx_near_dx          ""                              -1

      idx_topvic_sx        ""                              -1
      idx_topvic_dx        ""                              -1

      //idx del top a cui sono agganciato
      idx_top_agg          ""                              -1

      perRADICE            ""                              ""

      M4_CNT_LINK_MODE__   ""                              2

      COD_EREDITA          ""                              "PRE;POST"
      CMP2_AZIONI          ""                              "P"

      FillerM2G            " "                             ""     ShowAlways
   }

   Assegnazioni
   {
      GOSUB AssComune

      M4_MIS = "Filler*;X*;Y*;Z*;VAR_RieXSupp*;VAR_Appoggio;VAR_Sbordo*;VAR_PosPenisola"

      M4_GRUPPO__ = MSG(1004)

      if( ACTION()==0 & $ATTIVA_DLL==1 )
      {
         if( VAR_TipoPen==0 )
         {
            M4_A_MURO = 0
            HIDE_ON_EDIT2(ATTUALE(),"Z",1)

            VAR_SET_MODE(ATTUALE(),"Yt",$MODE_SHOWALWAYS)
         }
         else
         {
            M4_A_MURO = 1

            HIDE_ON_EDIT2(ATTUALE(),"Z",0)
            HIDE_ON_EDIT(ATTUALE(),"VAR_Sbordo*;Zt;VAR_PosPenisola;Filler3;Filler4",1)

            VAR_SET_MODE(ATTUALE(),"Yt",$MODE_USER)
            VAR_SET_MENU(ATTUALE(),"Yt","( 280-980 )")
         }
      }

      //solo se penisola in appoggio
      if( VAR_TipoPen==0  )
      {
         if( VAR_PosPenisola==-1 | VAR_PosPenisola==1 )
         {
            HIDE_ON_EDIT2(ATTUALE(),"VAR_SbordoFro",0)
            HIDE_ON_EDIT2(ATTUALE(),"VAR_SbordoRet",0)
            HIDE_ON_EDIT2(ATTUALE(),"VAR_SbordoLat",1)
            wk_sbr_att = VAR_SbordoFro + VAR_SbordoRet
            wk_max_sbr = 184

            wk_max_retro  = VAR_SbordoRet + wk_max_sbr - wk_sbr_att
            wk_max_fronte = VAR_SbordoFro + wk_max_sbr - wk_sbr_att
            if( wk_max_retro<VAR_SbordoRet )   { wk_max_retro = VAR_SbordoRet }
            if( wk_max_fronte<VAR_SbordoFro )  { wk_max_fronte = VAR_SbordoFro }

            VAR_SET_MENU(ATTUALE(),"VAR_SbordoFro",STRCAT("( 0-",STR(wk_max_fronte)," )"))
            VAR_SET_MENU(ATTUALE(),"VAR_SbordoRet",STRCAT("( 0-",STR(wk_max_retro)," )"))
         }
         else
         {
            HIDE_ON_EDIT2(ATTUALE(),"VAR_SbordoFro",1)
            HIDE_ON_EDIT2(ATTUALE(),"VAR_SbordoRet",1)
            HIDE_ON_EDIT2(ATTUALE(),"VAR_SbordoLat",0)
         }
      }

      GOSUB Setta_VarTipoPenisola
   }

   PuntiNotevoli
   {
      if( VAR_PosPenisola==-1 | VAR_PosPenisola==1 ) { Zt = Z + VAR_SbordoFro + VAR_SbordoRet }
      else                                           { Zt = Z + VAR_SbordoLat }

      GOSUB punti_Zt

      vano_0_0 = base_0
      vano_l_0 = X
      vano_p_0 = Z

      pnt_b0 = base_0
      pnt_b1 = base_1
      pnt_b2 = base_2
      pnt_b3 = base_3

      //base_so = base_0
      //alto_ne = alto_2

      //base_0_m4 = base_0
      //alto_2_m4 = alto_2
      ////base_o0 = base_0  alto_o0 = alto_0
      ////base_o1 = base_1  alto_o1 = alto_1
      ////base_o2 = base_2  alto_o2 = alto_2
      ////base_o3 = base_3  alto_o3 = alto_3
      ////
      //if( VAR_TipoPen==1 )
      //{
      //   //base_so = base_1
      //   //alto_ne = alto_3
      //   //
      //   //base_o0 = base_1  alto_o0 = alto_1
      //   //base_o1 = base_2  alto_o1 = alto_2
      //   //base_o2 = base_3  alto_o2 = alto_3
      //   //base_o3 = base_0  alto_o3 = alto_0
      //
      //   base_0_m4 = base_1
      //   alto_2_m4 = alto_3
      //}

   }
   #include %path_bdm%\TLib\Orie.inc

   Procedura OnQueryBdmLocal
   {
      GOSUB OnQuery_Penisola
   }

   Procedura OnTabEredita
   {
      //if( TABER_REGOLA=="PRE" )
      //{
      //   if( VAR_EXIST(ATTUALE(),"GEST_C038")==1 )
      //   {
      //      C038 = "WW001"
      //      if( VAR_TipoTeste==0 ) { C038 = "WW002" }
      //      VarAdd = "C038"   GOSUB Add_TABER_VARSETTATE
      //   }
      //}
      if( TABER_REGOLA=="POST" )
      {
         if( IS_VAR_FIXED(ATTUALE(),"GEST_C038")==1 )
         {
            if( GEST_C038=="WW001" ) { VAR_TipoTeste = 1 }
            if( GEST_C038=="WW002" ) { VAR_TipoTeste = 0 }
         }
      }
   }

   Controlli
   {
      GOSUB CtrlComune

      if( IS_VAR_FIXED(ATTUALE(),"Yt")==0 ) { Yt = base_0.y }
      else
      {
         if( VAR_EXIST(ATTUALE(),"M4_FIX_Y")==1 )
         {
            if( M4_FIX_Y != Yt )
            {
               offy =  Yt - M4_FIX_Y
               M4_FIX_Y = Yt
               COMANDO(STRCAT("VAR_CHANGE 1 ",STR(ATTUALE()), " M4_FIX_Y=",STR(Yt) ))
               COMANDO(STRCAT("EDITPOS_REL ",STR(ATTUALE()), " 0 " ,STR(offy)," 0 0" ))
            }
         }
      }


      GOSUB ConfiguraPenisola

      //SuppVtr_Altezza = Yt - Y
      SuppVtr_Altezza = Yt
      SuppVtr_Larghezza = 385
      if( Zt > 600 ) { SuppVtr_Larghezza = 500 }
      if( Zt > 720 ) { SuppVtr_Larghezza = 620 }
      if( Zt > 901 ) { SuppVtr_Larghezza = 800 }
      if( Zt >1101 ) { SuppVtr_Larghezza = 900 }

      SuppVtr2_Altezza = SuppVtr_Altezza

      LuceInternaX = X - VAR_RieXSupp - 12 - VAR_Appoggio
      //Se rientro a disegno
      if( VAR_RieXSupp==0 )
      {
         LuceInternaX = X - VAR_RieXSuppDis - 12 - VAR_Appoggio
      }
      SuppVtr2_Larghezza = 500

      VAR_NSupp = 1
      if( LuceInternaX>1472 ) { VAR_NSupp = 2 }


      //LZ -14/11 modificate valori sormonto minimo
      //wk_max_sorm = X - 368
      //VAR_SET_MENU(ATTUALE(),"VAR_Appoggio",STRCAT("( 520-",STR(wk_max_sorm)," )"))

      wk_min_sorm = 520
      wk_max_sorm = X - 368
      if( VAR_TipoPen==1 ) { wk_min_sorm = 0 }
      else
      {
         if( VAR_NSupp==2 )
         {
           wk_min_sorm = 184
           wk_max_sorm = 520
         }
      }
      //Luca 04/03/2020
      //riporto modifica di LAGO per evitare casi impossibili (conseguente blocco Metron)
      if( wk_max_sorm<0 ) { wk_max_sorm=0 }
      if( wk_min_sorm>wk_max_sorm ) { wk_min_sorm=wk_max_sorm }
      VAR_SET_MENU(ATTUALE(),"VAR_Appoggio",STRCAT("( ",STR(wk_min_sorm),"-",STR(wk_max_sorm)," )"))

      GOSUB CtrlPosizionePenisolaAppoggio

      GOSUB Trova_TopVic_SXDX
      //GOSUB Trova_idx_basi_sotto
   }

   Gestionale
   {
      GOSUB GestComune

      //GEST_X = X
      //GEST_Y = Y
      if( IS_VAR_FIXED( ATTUALE(), "GEST_Z") == 0 ) { GEST_Z = Zt }

      if( IS_VAR_FIXED( ATTUALE(), "RADICE") == 0
        & IS_VAR_FIXED( ATTUALE(), "GEST_CODICE") == 0 )
      {
         GEST_CODICE = ""
         RADICE      = passa_RadTop
      }

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura OnChangedVar
   {
      if( $ChangedVar=="VAR_PosPenisola"  | $ChangedVar=="VAR_Appoggio" )
      {
         //aggiorno il top
         if( IS_IDX(idx_topvic_sx)==1 ) { COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_topvic_sx)," no_agganciati //OnChangedVar Penisola")) }
         if( IS_IDX(idx_topvic_dx)==1 ) { COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_topvic_dx)," no_agganciati //OnChangedVar Penisola")) }
      }
   }

   Procedura PostAction2
   {
      if( VAR_TipoPen==1 & VAR_VAL(ATTUALE(),"PenMuro_RuotaP2A")==1 )
      {
         PenMuro_RuotaP2A = 0
         ang_att = ANG_TOT2(ATTUALE())
         wk_offx = Z * COSENO(ang_att)
         wk_offy = 0
         wk_offz = (-1) * Z*SENO(ang_att)
         wk_ang =  -90

         COMANDO(STRCAT("EDITPOS_REL ",STR(ATTUALE()), " ",STR(wk_offx)," ",STR(wk_offy), " ",STR(wk_offz),  " ",STR(wk_ang), " //PostAction2 Penisola Muro" ))
      }
   }

   Procedura cancella
   {
       if( $StartingDel__!=ATTUALE() ) { EXITSUB() }

       if( IS_IDX(idx_topvic_sx)==1 ) { COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_topvic_sx)," no_agganciati //Cancella Penisola")) }
       if( IS_IDX(idx_topvic_dx)==1 ) { COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_topvic_dx)," no_agganciati //Cancella Penisola")) }
   }

   Posiziona PianoPenisola_generico piapen
   {
      GOSUB posa_blocco
      @Z = Zt

      @passa_CodTop = passa_CodTop

      idx_top_generico = ATTUALE()
      idx_piano = ATTUALE()
   }

   Posiziona SupportoVetro sup1
   {
      @base_0.x = base_0.x + X - VAR_RieXSupp
      if( VAR_RieXSupp==0 ) { @base_0.x = base_0.x + X - VAR_RieXSuppDis }
      //@base_0.x = @base_0.x + @Spe_Vtr/2
      //@base_0.z = base_0.z + Z/2 - SuppVtr_Larghezza/2
      @base_0.z = base_0.z + Zt/2 - SuppVtr_Larghezza/2

      @ang_y = - 90

      if( VAR_PosPenisola<0 )
      {
         @base_0.x = base_0.x + VAR_RieXSupp
         if( VAR_RieXSupp==0 ) { @base_0.x = base_0.x + VAR_RieXSuppDis }
         //@base_0.x = @base_0.x - @Spe_Vtr/2
         //@base_0.z = base_0.z + Z/2 + SuppVtr_Larghezza/2
         @base_0.z = base_0.z + Zt/2 + SuppVtr_Larghezza/2

         @ang_y = 90
      }

      @base_0.y = base_0.y - SuppVtr_Altezza

      @X = SuppVtr_Larghezza
      //Luca 19/09/2019 mantis 20893
      //@Y = SuppVtr2_Altezza2 - $Cuc_Alt_Zoc
      @Y = SuppVtr2_Altezza - $Cuc_Alt_Zoc  + 30

      idx_suppvtr_1 = ATTUALE()
   }

   Posiziona SupportoVetro sup2
   {
      @escluso  = 1
      if( VAR_NSupp==2 ) { @escluso  = 0 }

      wk_rievtr = VAR_RieXSupp
      if( VAR_RieXSupp==0 ) { wk_rievtr =  VAR_RieXSuppDis }

      @base_0.x = base_0.x + X - wk_rievtr - 12 - (LuceInternaX-SuppVtr2_Larghezza)/2 - SuppVtr2_Larghezza

      if( VAR_PosPenisola<0 ) { @base_0.x = base_0.x + wk_rievtr + 12 + (LuceInternaX-SuppVtr2_Larghezza)/2 }

      //@base_0.z = base_0.z + Z/2 - @Z/2
      @base_0.z = base_0.z + Zt/2 - @Z/2

      @base_0.y = base_0.y - SuppVtr_Altezza

      @X = SuppVtr2_Larghezza
      //Luca 19/09/2019 mantis 20893
      //@Y = SuppVtr2_Altezza - $Cuc_Alt_Zoc
      @Y = SuppVtr2_Altezza - $Cuc_Alt_Zoc  + 30

      idx_suppvtr_2 = ATTUALE()
   }

   Posiziona _cont_per_near_sx nsx
   {
      idx_near_sx=ATTUALE()
      @base_0.x = base_0.x + 10
      @base_0.y = alto_0.y + 5 - 40
      @base_0.z = base_0.z
      @X = 20
      @Y = 40
      @Z = Zt
   }

   Posiziona _cont_per_near_dx ndx
   {
      idx_near_dx=ATTUALE()

      @base_0.x = base_3.x - 35
      @base_0.y = alto_0.y + 5 - 40
      @base_0.z = base_0.z

      @X = 20
      @Y = 40
      @Z = Zt
   }
}

Elemento PianoPenisola_generico
{
   Descrizione = "Super top"
   Code        = TOP
   Gruppo      = ""
   Tipo = Contenitore
   Forma = ""
   Alias TopM4

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X               "Larghezza"    1000
      Y               "Spessore"     80
      Z               "Profondità"   600

      VAR_TipoTeste   ""             0   Implicit
      Smusso          ""             0   Implicit

      passa_CodTop    ""             ""
      GEST_CODICE     ""             ""

      FIN_var         ""             "C028"
      FIN_orie        ""             "O"
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Stato_8

      grafica_archetipo = SE_STR( Smusso > 0, "BloccoSmussatoY", "_top_grafica_M4")
   }

   PuntiNotevoli
   {
      GOSUB punti

      pnt_sx  = [base_0.x,base_0.y,base_0.z]
      pnt_sx1 = [base_1.x,base_0.y,base_1.z]

      pnt_dx  = [base_3.x,base_0.y,base_0.z]
      pnt_sx_fro = pnt_sx
      pnt_sx_fro.z = base_1.z
      pnt_dx_fro = pnt_dx
      pnt_dx_fro.z = base_1.z

      pnt_sx_frobl = pnt_sx_fro
      pnt_dx_frobl = pnt_dx_fro

      ang_a_sx = 0
      ang_a_dx = 0

      pbn=[X/2 ,0,0]

      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdrtr.x"),pbn.x)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdrtr.y"),pbn.y)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdrtr.z"),pbn.z)

      b1s = [-Z*(SENO(ang_a_sx-90)/COSENO(ang_a_sx-90)), 0, Z]
      bbs = (-Z/2)*(SENO(ang_a_sx-90)/COSENO(ang_a_sx-90))
      pbn = [bbs, 0, b1s.z/2]
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdsx.x"),pbn.x)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdsx.y"),pbn.y)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdsx.z"),pbn.z)

      b1d = [X+Z*(SENO(ang_a_dx-90)/COSENO(ang_a_dx-90)), 0,Z]
      b2d = X+(Z/2)*(SENO(ang_a_dx-90)/COSENO(ang_a_dx-90))
      pbn = [b2d, 0, b1d.z/2]
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bddx.x"),pbn.x)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bddx.y"),pbn.y)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bddx.z"),pbn.z)

      b1f = X+(Z/2)*(SENO(ang_a_dx-90)/COSENO(ang_a_dx-90))
      pbn = [b1f/2, 0, Z]
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdfro.x"),pbn.x)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdfro.y"),pbn.y)
      VAR_VALUE_SET(ATTUALE(),STRCAT("pnt_bdfro.z"),pbn.z)
   }

   Controlli
   {
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune

      FLAG_RADICE = $FLAG_STANDARD + $NORID_X + $NORID_Y + $NORID_Z
      GEST_CODICE = passa_CodTop

      GOSUB GestComune_Post
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }

   Posiziona %grafica_archetipo% graM4
   {
      @escluso = 0
      if ( X<0.1 | Z<0.1 ) { @escluso = 1 }

      @base_0 = base_0
      @X = X
      @Y = Y
      @Z = Z

      if( Smusso > 0)
      {
         @R0 = SE_NUM( X < Z, X, Z)/2 - 0.1
         @R1 = @R0
         @R2 = @R0
         @R3 = @R0
      }

      if ( @escluso == 0 ) { idx_top_generico = ATTUALE() }

      GOSUB rivestimento
   }
}
//} PENISOLA

//{  PENISOLA AIR KITCHEN
Elemento Penisola_AirKitchen
{
   Descrizione    = "Penisola air kitchen"
   Code           = TOP
   Gruppo         = "Piani"
   Tipo           = Contenitore
   Forma          = ""
   Alias          NoCollision;OnChangedVar

   Variabili
   {
      #include %path_bdm%\var_db.inc
      //#include %install_dir%\bdm\var_db.inc

      X   "Larghezza"            1400 Menu ( DimP_AirK )

      Y   "(Altezza piano)"        80
      Yt  "Altezza da terra"      500 ShowAlways

      Z   "Profondità"            640 ShowAlways

      VAR_RieXSupp "" 184

      ConFuochi "Con Fuochi" 1 Menu ( SiNo )

      //VAR_TipoTop = 22 Wildwood      80mm   -->  80mm + 19mm
      //VAR_TipoTop = 1 Vetro           60mm  --> 10mm + 50mm
      VAR_TipoPiano        "Tipo piano"  1 Menu ( TipoP_AirK )

      SuppVtr_Altezza      "Supporto vetro - Altezza"       384
      SuppVtr_Larghezza    "Supporto vetro - Larghezza"     384

      SuppVtr_RieY         "Supporto vetro - rientro Y"     31
      SuppVtr_RieZ         "Supporto vetro - rientro Z"     393

      idx_top_generico "" -1
      idx_piano        "" -1
      idx_suppvtr_1    "" -1

      idx_near_sx "" -1
      idx_near_dx "" -1

      idx_topvic_sx "" -1
      idx_topvic_dx "" -1

      //idx del top a cui sono agganciato
      idx_top_agg   "" -1

      perRADICE     "" ""

      M4_CNT_LINK_MODE__ ""   2

      COD_EREDITA    ""  "PRE;C033_PRE;POST"
      CMP2_AZIONI    ""  "P"

      FillerM2G      " " "" ShowAlways

      M4_MIS         ""  "X;Yt;Z;ConFuochi"

      FIN_var_pia    ""  "C028"
      FIN_var_fnd    ""  "C033"
   }

   Assegnazioni
   {
      GOSUB AssComune

      M4_MIS = "Filler*;X*;Y*;Z*;VAR_RieXSupp*;VAR_Appoggio;VAR_Sbordo*;VAR_PosPenisola"

      M4_GRUPPO__ = MSG(1004)

      SpessorePiano = 60
      if( VAR_TipoPiano==22 ) { SpessorePiano = 80 }

      if( ACTION() == 0 & $ATTIVA_DLL==1 )
      {
         HIDE_ON_EDIT(ATTUALE(),"VAR_TipoPiano",1)
         VAR_SET_MODE(ATTUALE(),"X",$MODE_SHOWALWAYS)
      }

      //vetro non posso togliere i fuochi
      if( VAR_TipoPiano == 1 ) { HIDE_ON_EDIT( ATTUALE(), "ConFuochi", 1) }
      else                     { HIDE_ON_EDIT( ATTUALE(), "ConFuochi", 0) }

      //GOSUB Setta_VarTipoPenisola
   }

   PuntiNotevoli
   {
      Z = X

      GOSUB punti_Yt

      pnt_b0 = base_0
      pnt_b1 = base_1
      pnt_b2 = base_2
      pnt_b3 = base_3

      //base_so = base_0
      //alto_ne = alto_2

      //base_0_m4 = base_0
      //alto_2_m4 = alto_2
      ////base_o0 = base_0  alto_o0 = alto_0
      ////base_o1 = base_1  alto_o1 = alto_1
      ////base_o2 = base_2  alto_o2 = alto_2
      ////base_o3 = base_3  alto_o3 = alto_3
      ////
      //if( VAR_TipoPen==1 )
      //{
      //   //base_so = base_1
      //   //alto_ne = alto_3
      //   //
      //   //base_o0 = base_1  alto_o0 = alto_1
      //   //base_o1 = base_2  alto_o1 = alto_2
      //   //base_o2 = base_3  alto_o2 = alto_3
      //   //base_o3 = base_0  alto_o3 = alto_0
      //
      //   base_0_m4 = base_1
      //   alto_2_m4 = alto_3
      //}

   }
   #include %path_bdm%\TLib\Orie.inc

   Procedura OnQueryBdmLocal
   {
      if( $query_type==1 )
      {
         //Se a riferimento
         if( $M4_DragInfo_Mode==0 )
         {
            Y_sottopiano = VAR_VAL($M4_DragInfo_Ref,"Yt") + 6
            Yt = Y_sottopiano + SpessorePiano

            VAR_SET_MODIFICATA(ATTUALE(),"Yt","")

            offx = VAR_VAL($M4_DragInfo_Ref,"X")/2 - X/2

            offz = 230.9
            if( X == 1600 ) { offz = 215.9 }
            if( X == 1800 ) { offz = 205.9 }

            cnt_new = CostruisciStrCnt("S+","B","F",offx,0,offz,0)
            $M4_DragInfo_Cnt = cnt_new
            $QueryResult__ = 3
         }
      }
   }

   Procedura OnTabEredita
   {
      if( TABER_REGOLA=="C033_PRE" )
      {
         GOSUB Set_Gest_C033_Penisola_AirKitchen
      }
   }

   Controlli
   {
      GOSUB CtrlComune

      if( IS_VAR_FIXED(ATTUALE(),"Yt") == 0 )
      {
         Yt = 928
         if( VAR_TipoPiano == 22 ) { Yt = 948 }
      }

      SuppVtr_Larghezza = 700
      if( X > 1600 ) { SuppVtr_Larghezza = 900 }

      SuppVtr_Altezza = Yt - SpessorePiano + SuppVtr_RieY - $Cuc_Alt_Zoc
   }

   Gestionale
   {
      GOSUB GestComune

      GOSUB Set_Gest_C033_Penisola_AirKitchen

      GEST_Y = Yt

      //Simone 03/08/2022 - Attivabile solo tramite "elemento speciale"
      ConFuochi = 1
      if( VAR_VAL_STR(ATTUALE(),"GEST_C024") == "AK002" ) { ConFuochi = 0 }

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura cancella
   {
       if( $StartingDel__!=ATTUALE() ) { EXITSUB() }

       //if( IS_IDX(idx_topvic_sx)==1 ) { COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_topvic_sx)," no_agganciati //Cancella Penisola")) }
       //if( IS_IDX(idx_topvic_dx)==1 ) { COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_topvic_dx)," no_agganciati //Cancella Penisola")) }
   }

   Posiziona PianoPenisola_AirKitchen piapen
   {
      GOSUB posa_blocco

      @base_0.y = alto_0.y - SpessorePiano

      @Y = SpessorePiano

      @VAR_TipoPiano = VAR_TipoPiano

      idx_top_generico = ATTUALE()
      idx_piano = ATTUALE()
   }

   Posiziona Fuochi_AirKitchen ft
   {
      @escluso = 1 - ConFuochi

      @ang_y = 180

      @base_0.x = base_0.x + @X + X/2 - @X/2

      @base_0.y = alto_0.y - @Y + 0.1
      //if( VAR_TipoPiano == 22 ) { @base_0.y = alto_0.y }

      @base_0.z = base_0.z + Z - 150
   }

   Posiziona SupportoVetro sup1
   {
      @base_0.x = base_0.x + X/2 - SuppVtr_Larghezza/2
      @base_0.z = base_0.z + SuppVtr_RieZ + 2
      @base_0.y = base_0.y

      @X = SuppVtr_Larghezza
      @Y = SuppVtr_Altezza

      @NO_GEST = 1
      @HIDE    = 1

      idx_suppvtr_1 = ATTUALE()
   }

   Posiziona _cont_per_near_sx nsx
   {
      idx_near_sx=ATTUALE()
      @base_0.x = base_0.x + 10
      @base_0.y = alto_0.y + 5 - 40
      @base_0.z = base_0.z
      @X = 20
      @Y = 40
      @Z = Z
   }

   Posiziona _cont_per_near_dx ndx
   {
      idx_near_dx=ATTUALE()

      @base_0.x = base_3.x - 35
      @base_0.y = alto_0.y + 5 - 40
      @base_0.z = base_0.z

      @X = 20
      @Y = 40
      @Z = Z
   }
}

Elemento PianoPenisola_AirKitchen
{
   Descrizione = "Top vetro air kitchen"
   Code        = TOP
   Gruppo      = ""
   Tipo = Contenitore
   Forma = ""
   Alias TopM4

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X "Larghezza"  1000
      Y "Spessore"     80
      Z "Profondità"  600

      VAR_TipoPiano  "" 0

      ConFuochi      "" 0 Implicit

      GEST_CODICE    "" ""
      RADICE         "" ""
      perRADICE      "" ""

      FIN_var_pia    "" "C028"
      FIN_var_fnd    "" "C033"
      FIN_orie       "" "O"

      HIDE           "" 1
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Stato_8

      file_sat1 = ""
      file_sat2 = ""

      //fuochi
      file_sat3 = ""

      //prevedo 3 sat
      //2 per il piano in vetro
      //1 per il piano in ww
      //1 per i fuochi

      //VETRO
      if( VAR_TipoPiano == 1 )
      {
         file_sat1 = STRCAT($path_sat,"Cucina\AirKitchen\PianoVET_1_CF_",STR(X),".sat")
         file_sat2 = STRCAT($path_sat,"Cucina\AirKitchen\PianoVET_2_CF_",STR(X),".sat")

         if( ConFuochi == 0 )
         {
            file_sat1 = STRCAT($path_sat,"Cucina\AirKitchen\PianoVET_1_SF_",STR(X),".sat")
         }
      }

      //WILDOWOOD
      if( VAR_TipoPiano == 22 )
      {
         file_sat1 = STRCAT($path_sat,"Cucina\AirKitchen\PianoWW_1_SF_",STR(X),".sat")
         file_sat2 = STRCAT($path_sat,"Cucina\AirKitchen\PianoWW_2_SF_",STR(X),".sat")

         if( ConFuochi )
         {
            file_sat1 = STRCAT($path_sat,"Cucina\AirKitchen\PianoWW_1_CF_",STR(X),".sat")
         }
      }

      //da gestire a parte
      //if( ConFuochi )
      //{
      //   file_sat1 = STRCAT($path_sat,"Cucina\AirKitchen\Fuochi.sat")
      //}
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Controlli
   {
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune

      FLAG_RADICE = $FLAG_STANDARD

      if( IS_VAR_FIXED( ATTUALE(), "RADICE") == 0
        & IS_VAR_FIXED( ATTUALE(), "GEST_CODICE") == 0 )
      {
         perRADICE = "TVAKI"
         if( VAR_TipoPiano == 22 ) { perRADICE = "TWWAKI" }

         RADICE = perRADICE
      }

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }

   //Posiziona Blocco Ing
   //{
   //   GOSUB posa_blocco
   //   @c_rivestimento = [120,120,255]
   //   @f_rivestimento = "0.9"
   //}

   Posiziona __import__ sat1
   {
      @escluso = 1
      if( FILE_EXIST(file_sat1) ) { @escluso =  0 }
      @import = file_sat1

      GOSUB posa_blocco
      @base_0.x = base_0.x + X/2
      @base_0.z = base_0.z + Z/2

      if( VAR_TipoPiano == 1 ) { @base_0.y = base_0.y + 50 }

      FIN_var = FIN_var_pia
      GOSUB rivestimento
   }

   Posiziona __import__ sat2
   {
      @escluso = 1
      if( FILE_EXIST(file_sat2) ) { @escluso =  0 }
      @import = file_sat2

      GOSUB posa_blocco

      @base_0.x = base_0.x + X/2
      @base_0.z = base_0.z + Z/2

      FIN_var = FIN_var_fnd
      GOSUB rivestimento
   }
}

Elemento Fuochi_AirKitchen
{
   Descrizione = "Fuochi AirKitchen"
   Code        = TOP
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""
   Alias       TopM4

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X "Larghezza"   849
      Y "Spessore"     55
      Z "Profondità"  525

      GEST_CODICE "" "PNC"

      FIN_var  "" "C028"
      FIN_orie "" "O"
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Stato_8

      FSx_Diametro = 300
      FSx_OffX     = 0
      FSx_OffZ     = 105

      FDx_Diametro = 300
      FDx_OffX     = X-FDx_Diametro
      FDx_OffZ     = 105

      FCx_Diametro = 270
      FCx_OffX     = (X - FCx_Diametro)/2
      FCx_OffZ     = Z - FCx_Diametro

      Com_X        = 275
      Com_Z        = 150
      Com_OffX     = (X - Com_X)/2
      Com_OffZ     = 0

      file_sat1 = STRCAT($path_sat,"Cucina\AirKitchen\Fuochi.sat")

      c_rivestimento = $c_bianco
      if( VAR_VAL_STR( ATTUALE(), "GEST_E004") == "PA0002" ) { c_rivestimento = $c_nero }
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Controlli
   {
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune

      FLAG_RADICE = $FLAG_STANDARD + $MAKE_ROW

      GEST_X = 0
      GEST_Y = 0
      GEST_Z = 0

      GOSUB GestComune_Post
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }

   //Posiziona __import__ sat1
   //{
   //   @escluso = 1
   //   if( FILE_EXIST(file_sat1) ) { @escluso =  0 }
   //
   //   @import = file_sat1
   //
   //   GOSUB posa_blocco
   //   GOSUB rivestimento
   //
   //   @c_rivestimento = c_rivestimento
   //}

   Posiziona CilindroY fsx
   {
      @X = FSx_Diametro
      @Z = FSx_Diametro
      @Y = Y

      @base_0 = base_0
      @base_0.x = base_0.x + FSx_OffX
      @base_0.z = base_0.z + FSx_OffZ

      GOSUB rivestimento
      @c_rivestimento = c_rivestimento
   }

   Posiziona CilindroY fdx
   {
      @X = FDx_Diametro
      @Z = FDx_Diametro
      @Y = Y

      @base_0 = base_0
      @base_0.x = base_0.x + FDx_OffX
      @base_0.z = base_0.z + FDx_OffZ

      GOSUB rivestimento
      @c_rivestimento = c_rivestimento
   }

   Posiziona CilindroY fcx
   {
      @X = FCx_Diametro
      @Z = FCx_Diametro
      @Y = Y

      @base_0 = base_0
      @base_0.x = base_0.x + FCx_OffX
      @base_0.z = base_0.z + FCx_OffZ

      GOSUB rivestimento
      @c_rivestimento = c_rivestimento
   }

   Posiziona BloccoSmussatoY com
   {
      @X = Com_X
      @Z = Com_Z
      @Y = Y

      @base_0 = base_0
      @base_0.x = base_0.x + Com_OffX
      @base_0.z = base_0.z + Com_OffZ

      @R0 = @Z/2
      @R1 = @Z/2
      @R2 = @Z/2
      @R3 = @Z/2

      GOSUB rivestimento
      //@c_rivestimento = c_rivestimento
      @m_rivestimento = STRCAT($path_bdm,"bmp\ComandoFoster_W.png")
      if( VAR_VAL_STR( idx_att, "GEST_E004") == "PA0002" ) { @m_rivestimento = STRCAT($path_bdm,"bmp\ComandoFoster_B.png") }
   }
}
//} PENISOLA AIR KITCHEN

//{ PIANO SNACK
Elemento PianoSNACK
{
   Descrizione = "Piano SNACK"
   Code        = TOP
   Gruppo      = "Piani"
   Tipo        = Contenitore
   Forma       = ""
   Alias       NoCollision;OnChangedVar;PianoSNACK
   //Top

   Variabili
   {
      #include %path_bdm%\var_db.inc

      VAR_Revisione            ""                              0     SaveAlways
      VAR_RevisioneMas         ""                              0     SaveAlways

      X                        "(Larghezza Totale)"            920   ShowAlways
      Y                        "(Altezza piano)"               80
      Yt                       "(Altezza da terra)"            500   SaveAlways
      Ys                       "(Altezza Totale)"              580   ShowAlways
      Z                        "(Profondità Totale)"           376   ShowAlways

      Filler_Dim1              " "                             ""    ShowAlways

      X1                       "[X1] Larghezza Lineare"        920
      X2                       "[X2] Larghezza L"              376   Utente    (   250-380   )
      X_Max                    ""                              2952

      Filler_Dim2              " "                             ""    ShowAlways

      Z1                       "[Z1] Profondità"               376   Utente    (   305-380   )
      Z2                       "[Z2] Profondità L"             920

      Filler_Dim3              " "                             ""    ShowAlways

      //per SNACK LINEARE
      VAR_Sbordo_SX            "Sbalzo SX"                     0     Utente    (   0-376     )
      VAR_Sbordo_DX            "Sbalzo DX"                     0     Utente    (   0-376     )

      FillerM2G                " "                             ""    ShowAlways

      ConFiancoFinSx           ""                              0     SaveAlways
      ConFiancoFinDx           ""                              0     SaveAlways

      Cucina_Versione          ""                              2     SaveAlways

      //0 SNACK LINEARE
      //1 SNACK L
      //2 SNACK L MAGGIORATO
      VAR_TipoSnack            "Tipologia SNACK"               0

      //0 SNACK FILO TOP
      //1 SNACK INTEGRATO FILO TAVOLO
      VAR_PosizioneSnack       "Posiziona SNACK"               0

      //pilotati dai top, se forzato VAR_Sbordo_SX/VAR_Sbordo_DX questi valori non vengono utilizzati
      aa_sbordo_sx             ""                              0     SaveAlways
      aa_sbordo_dx             ""                              0     SaveAlways

      //per SNACK L
      VAR_Verso                "Verso"                         -1    Menu      (   DXSX      )   SaveAlways
      NStaffe                  ""                              2     SaveAlways

      //supporto vetro
      SVTR_Altezza             "Altezza supporto"              500
      SVTR_Larghezza           "Larghezza supporto"            600
      SVTR_PosX                ""                              0
      SVTR_PosZ                ""                              0

      idx_piano                ""                              -1
      idx_suppvtr              ""                              -1

      idx_near_sx              ""                              -1
      idx_near_dx              ""                              -1

      //base a cui devo agganciarmi in caso di SNACK L
      idx_base_lat             ""                              -1

      idx_cnear_lar            ""                              -1
      idx_cnear_prf            ""                              -1

      idx_cnear_top            ""                              -1

      idx_top                  ""                              -1
      idx_base_sx              ""                              -1
      idx_base_dx              ""                              -1

      ID_Sin                   ""                              -1
      ID_Des                   ""                              -1

     #ifndef TEC
      NON_ESEGUIRE_CONTROLLI   ""                              0
     #endif

     #ifdef TEC
      NON_ESEGUIRE_CONTROLLI   "NON ESEGUIRE CONTROLLI F.O."   0     Boolean
     #endif

      GEST_CODICE              ""                              ""
      perCODICE                ""                              ""
      RADICE                   ""                              ""
      perRADICE                ""                              ""

      //per attivazione al volo per la stampa
      VediMassellatura         "Vedi Massellatura"             0     Boolean   NoSave

      //4manuale + 2selezione
      M4_DIALOG                ""                              6

      COD_EREDITA              ""                              "PRE;POST"
      CMP2_AZIONI              ""                              "P"
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Cucina_Versione

      M4_MIS = "Filler*;X*;Y*;Z*;VAR_Sbordo*"

      M4_GRUPPO__ = MSG(1004)

      // Revisioni
      if( ACTION() == 0
        & COMPONENDO() == 1
        & $OnLoadOrder == 0)
      {
         data_ins = DATA(0)
         data_ins = STRMID(0,6,data_ins)
         data_ins = ATOI(data_ins)

         if( data_ins >= $REV01_SNACK) { VAR_Revisione = 1 }
      }

      // Dimensioni
      X_Max = SE_NUM( VAR_PosizioneSnack > 0,
                      SE_NUM( $modalita == "TEC", 3500, 3000),
                      2952)
      SbordoX_Max = 376

      while( ACTION() >= 0)
      {
         wk_x_max = SE_NUM( Cucina_Versione > 2, 2850, 2944)
         wk_z_max = SE_NUM( Cucina_Versione > 2, 1209, 1106)

         if( VAR_PosizioneSnack > 0)
         {
            wk_x_max = 3000
            wk_z_max = 1100
         }

         if( VAR_TipoSnack == 0)
         {
            HIDE_ON_EDIT2(ATTUALE(),"X2",1)

            HIDE_ON_EDIT2(ATTUALE(),"Z",1)
            HIDE_ON_EDIT2(ATTUALE(),"Z2",1)

            HIDE_ON_EDIT2(ATTUALE(),"VAR_Sbordo_SX",0)
            HIDE_ON_EDIT2(ATTUALE(),"VAR_Sbordo_DX",0)

            if( IS_VAR_FIXED( idx_att, "X2")) { DEL_VAR_MODIFICATE( idx_att, "X2") }
            X2 = 0

            if( IS_VAR_FIXED( idx_att, "Z2")) { DEL_VAR_MODIFICATE( idx_att, "Z2") }
            Z2 = 0

            wk_sbordo_max_sx = min( X_Max - X1 - VAR_Sbordo_DX, SbordoX_Max)
            wk_sbordo_max_sx = max( wk_sbordo_max_sx, 0)
            VAR_SET_MENU( idx_att, "VAR_Sbordo_SX", FMT( "( 0 - {} )", STR(wk_sbordo_max_sx)))

            wk_sbordo_max_dx = min( X_Max - X1 - VAR_Sbordo_SX, SbordoX_Max)
            wk_sbordo_max_dx = max( wk_sbordo_max_dx, 0)
            VAR_SET_MENU( idx_att, "VAR_Sbordo_DX", FMT( "( 0 - {} )", STR(wk_sbordo_max_dx)))

            break
         }

         if( VAR_TipoSnack == 1)
         {
            if( VAR_Verso > 0)
            {
               HIDE_ON_EDIT2(ATTUALE(),"VAR_Sbordo_SX",0)
               HIDE_ON_EDIT2(ATTUALE(),"VAR_Sbordo_DX",1)

               wk_sbordo_max_sx = min( X_Max - X1 - X2, SbordoX_Max)
               wk_sbordo_max_sx = max( wk_sbordo_max_sx, 0)
               VAR_SET_MENU( idx_att, "VAR_Sbordo_SX", FMT( "( 0 - {} )", STR(wk_sbordo_max_sx)))
            }

            if( VAR_Verso < 0)
            {
               HIDE_ON_EDIT2(ATTUALE(),"VAR_Sbordo_SX",1)
               HIDE_ON_EDIT2(ATTUALE(),"VAR_Sbordo_DX",0)

               wk_sbordo_max_dx = min( X_Max - X1 - X2, SbordoX_Max)
               wk_sbordo_max_dx = max( wk_sbordo_max_dx, 0)
               VAR_SET_MENU( idx_att, "VAR_Sbordo_DX", FMT( "( 0 - {} )", STR(wk_sbordo_max_dx)))
            }

            HIDE_ON_EDIT2(ATTUALE(),"X2",0)

            HIDE_ON_EDIT2(ATTUALE(),"Z",0)
            HIDE_ON_EDIT2(ATTUALE(),"Z2",0)

            if( IS_VAR_FIXED( idx_att, "X2") == 0) { X2 = 376 }
            if( IS_VAR_FIXED( idx_att, "Z2") == 0) { Z2 = 700 }

            break
         }

         if( VAR_TipoSnack == 2)
         {
            if( VAR_Verso > 0)
            {
               HIDE_ON_EDIT2(ATTUALE(),"VAR_Sbordo_SX",0)
               HIDE_ON_EDIT2(ATTUALE(),"VAR_Sbordo_DX",1)

               wk_sbordo_max_sx = X_Max - X1 - X2
               if( VAR_PosizioneSnack > 0) { wk_sbordo_max_sx = wk_sbordo_max_sx - aa_sbordo_sx - aa_sbordo_dx }
               wk_sbordo_max_sx = min( wk_sbordo_max_sx, SbordoX_Max)
               wk_sbordo_max_sx = max( wk_sbordo_max_sx, 0)
               VAR_SET_MENU( idx_att, "VAR_Sbordo_SX", FMT( "( 0 - {} )", STR(wk_sbordo_max_sx)))
            }

            if( VAR_Verso < 0)
            {
               HIDE_ON_EDIT2(ATTUALE(),"VAR_Sbordo_SX",1)
               HIDE_ON_EDIT2(ATTUALE(),"VAR_Sbordo_DX",0)

               wk_sbordo_max_dx = X_Max - X1 - X2
               if( VAR_PosizioneSnack > 0) { wk_sbordo_max_dx = wk_sbordo_max_dx - aa_sbordo_sx - aa_sbordo_dx }
               wk_sbordo_max_dx = min( wk_sbordo_max_dx, SbordoX_Max)
               wk_sbordo_max_dx = max( wk_sbordo_max_dx, 0)
               VAR_SET_MENU( idx_att, "VAR_Sbordo_DX", FMT( "( 0 - {} )", STR(wk_sbordo_max_dx)))
            }

            HIDE_ON_EDIT2( idx_att, "X",  0)
            HIDE_ON_EDIT2( idx_att, "Z",  0)

            // X2
            wk_x2 = 800
            wk_x2Min = 800
            wk_x2Max = 800
            if( VAR_PosizioneSnack > 0)
            {
               wk_x2 = 712
               wk_x2Min = 712
               wk_x2Max = X_Max - X1 - SE_NUM( VAR_Verso < 0, VAR_Sbordo_DX + aa_sbordo_dx, VAR_Sbordo_SX + aa_sbordo_sx)
            }

            HIDE_ON_EDIT2( idx_att, "X2", 0)
            if( IS_VAR_FIXED( idx_att, "X2") == 0) { X2 = wk_x2 }
            VAR_SET_MENU( idx_att, "X2", FMT( "( {} - {} )", STR(wk_x2Min), STR(wk_x2Max)))
            VAR_SET_MODE( idx_att, "X2", $MODE_SHOWALWAYS + $MODE_USER * SE_NUM( wk_x2Min != wk_x2Max, 1, 0))

            // Z1
            wk_z1 = 376
            wk_z1Min = 305
            wk_z1Max = 380
            if( VAR_PosizioneSnack > 0)
            {
               wk_z1 = 470
               wk_z1Min = 390
               wk_z1Max = wk_z_max - Z2
               if( wk_z1Max > 470) { wk_z1Max = 470 }
            }

            if( IS_VAR_FIXED( idx_att, "Z1") == 0) { Z1 = wk_z1 }
            VAR_SET_MENU( idx_att, "Z1", FMT( "( {} - {} )", STR(wk_z1Min), STR(wk_z1Max)))
            VAR_SET_MODE( idx_att, "Z1", $MODE_SHOWALWAYS + $MODE_USER * SE_NUM( wk_z1Min != wk_z1Max, 1, 0))

            // Z2
            wk_z2 = 700
            wk_z2Min = 700
            wk_z2Max = 700
            if( VAR_PosizioneSnack > 0)
            {
               wk_z2 = 310
               wk_z2Min = 310
               wk_z2Max = wk_z_max - Z1
            }

            if( IS_VAR_FIXED( idx_att, "Z2") == 0) { Z2 = wk_z2 }
            VAR_SET_MENU( idx_att, "Z2", FMT( "( {} - {} )", STR(wk_z2Min), STR(wk_z2Max)))
            VAR_SET_MODE( idx_att, "Z2", $MODE_SHOWALWAYS + $MODE_USER * SE_NUM( wk_z2Min != wk_z2Max, 1, 0))

            break
         }

         break
      }

      SetRevisioneElemento( ATTUALE(), "BDM_REV_Snack_Mass", "VAR_RevisioneMas")

      // Vetro
      if( IS_VAR_FIXED( idx_att, "SVTR_Larghezza") == 0)
      {
         SVTR_Larghezza = SE_NUM( VAR_Revisione > 0, 620, 600)
         while( VAR_PosizioneSnack > 0)
         {
            if( Z < 900)  { SVTR_Larghezza = 620  break }
            if( Z < 1000) { SVTR_Larghezza = 800  break }
            SVTR_Larghezza = 900
            break
         }
      }

      SVTR_PosX = X2/2 - 6
      if( VAR_PosizioneSnack > 0) { SVTR_PosX = max( X2/3, 110) }

      SVTR_PosZ = (Z - SVTR_Larghezza)/2

      // Staffe
      staffa_archetipo = SE_STR( VAR_PosizioneSnack > 0, "Catena_PianoSNACK", "Staffa_PianoSNACK")

      // Finitura
      FIN_orie = "O"
      FIN_var  = GetFirstValidVarGest( idx_att,"C032;C044")
   }

   PuntiNotevoli
   {
      X = X1 + X2 + VAR_Sbordo_SX + VAR_Sbordo_DX + aa_sbordo_sx + aa_sbordo_dx
      Z = Z1 + Z2

      base_0 = [-VAR_Sbordo_SX-aa_sbordo_sx, 0, 0]    alto_0 = [-VAR_Sbordo_SX - aa_sbordo_sx, Y, 0]
      base_1 = [-VAR_Sbordo_SX-aa_sbordo_sx, 0, Z]    alto_1 = [-VAR_Sbordo_SX - aa_sbordo_sx, Y, Z]
      base_2 = [X-VAR_Sbordo_SX-aa_sbordo_sx, 0, Z]   alto_2 = [X-VAR_Sbordo_SX - aa_sbordo_sx, Y, Z]
      base_3 = [X-VAR_Sbordo_SX-aa_sbordo_sx, 0, 0]   alto_3 = [X-VAR_Sbordo_SX - aa_sbordo_sx, Y, 0]

      base_so = base_0
      alto_ne = alto_2

      pnt_top_b0 = base_0
      pnt_top_b1 = base_1
      pnt_top_b2 = base_2
      pnt_top_b3 = base_3

      //Luca 05/06/2020
      // 0 _________________________ 3             0 _________________________ 3
      //   |                        |                |                        |
      //  4|________________ 5      |7              4|     5 _________________|7
      //                    |       |                |      |
      // 1                  |6______|2             1 |______|6                 2

      //punto profondità inferiore per quote in stampa
      pnt_top_b4 = base_0  pnt_top_b4.z = pnt_top_b4.z + Z1

      pnt_top_b5 = base_0
      pnt_top_b5.x = base_0.x + X1 + VAR_Sbordo_SX + aa_sbordo_sx
      if( VAR_Verso<0 )
      {
         pnt_top_b5.x = base_0.x + X2 + VAR_Sbordo_SX + aa_sbordo_sx
      }
      pnt_top_b5.z = base_0.z + Z1

      pnt_top_b6   = base_2
      pnt_top_b6.x = pnt_top_b5.x

      pnt_top_b7 = base_3  pnt_top_b7.z = pnt_top_b7.z + Z1

      vano_0_0 = base_0
      vano_l_0 = X
      vano_p_0 = Z
   }

   #include %path_bdm%\TLib\Orie.inc

   Procedura OnQueryBdmLocal
   {
   }

   Procedura OnTabEredita
   {
   }

   Controlli
   {
      GOSUB CtrlComune

      // Idx basi e top
      GOSUB TrovaIdxVicini_PianoSNACK

      // Versione
      if( Cucina_Versione <= 2
        & IS_VAR_FIXED( idx_att, "Cucina_Versione") == 0)
      {
         wk_idx_base_sx_ver = SE_NUM( IS_IDX(idx_base_sx) == 1, VAR_VAL( idx_base_sx, "Cucina_Versione"), 0)
         wk_idx_base_dx_ver = SE_NUM( IS_IDX(idx_base_dx) == 1, VAR_VAL( idx_base_dx, "Cucina_Versione"), wk_idx_base_sx_ver)

         if( wk_idx_base_sx_ver > Cucina_Versione
           & wk_idx_base_sx_ver == wk_idx_base_dx_ver) { Cucina_Versione = wk_idx_base_sx_ver }
      }

      // Altezza
      if( IS_VAR_FIXED(ATTUALE(),"Yt") == 0)
      {
         Yt = base_0.y
         if( VAR_PosizioneSnack == 1) { Yt = 757 - Y }
      }
      else
      {
         if( VAR_EXIST(ATTUALE(),"M4_FIX_Y") == 1)
         {
            if( M4_FIX_Y != Yt )
            {
               offy =  Yt - M4_FIX_Y
               M4_FIX_Y = Yt
               COMANDO(STRCAT("VAR_CHANGE 1 ",STR(ATTUALE()), " M4_FIX_Y=",STR(Yt) ))
               COMANDO(STRCAT("EDITPOS_REL ",STR(ATTUALE()), " 0 " ,STR(offy)," 0 0" ))
            }
         }
      }

      if( IS_VAR_FIXED( idx_att, "Ys")) { DEL_VAR_MODIFICATE( idx_att, "Ys") }
      Ys = Yt + Y

      SVTR_Altezza = Yt

      // Fianchi finitura
      ConFiancoFinSx = 0
      if( IS_IDX(idx_base_sx)) { ConFiancoFinSx = VAR_VAL( idx_base_sx, "ConFiancoFinSx") }
      ConFiancoFinDx = 0
      if( IS_IDX(idx_base_dx)) { ConFiancoFinDx = VAR_VAL( idx_base_dx, "ConFiancoFinDx") }

      GOSUB SettaSbordi_PianoSNACK
      GOSUB RicalcolaElementiVicini_PianoSNACK
      GOSUB CtrlPosizione_PianoSNACK
      GOSUB CtrlStaffe_PianoSNACK
   }

   Procedura Stendi
   {
      stesi_mode_sx = $stesi_mode_sx
      stesi_mode_dx = $stesi_mode_dx

      if( stesi_mode_sx == $stesi_Elemento) { stesi_idx_sx_loc = $stesi_idx_sx }
      else                                  { stesi_idx_sx_loc = -1 }
      if( stesi_mode_dx == $stesi_Elemento) { stesi_idx_dx_loc = $stesi_idx_dx }
      else                                  { stesi_idx_dx_loc = -1 }

      //evito ricalcolo della PGDV (fatto in Notifica)
      NO_Ricalcola_PostGestDllValida = 1

      GOSUB PianoSNACK_stendi
   }

   Procedura Notifica
   {
      GOSUB PianoSNACK_Notifica
   }

   Gestionale
   {
      GOSUB GestComune

      if( IS_VAR_FIXED( ATTUALE(), "RADICE") == 0
        & IS_VAR_FIXED( ATTUALE(), "GEST_CODICE") == 0)
      {
         perRADICE = ""
         if( VAR_TipoSnack == 0)     { perRADICE = "TOPSNLIN"              }
         if( VAR_TipoSnack == 1)     { perRADICE = "TOPSNS37"              }
         if( VAR_TipoSnack == 2)     { perRADICE = "TOPSNS80"              }

         if( Cucina_Versione > 2)    { perRADICE = STRCAT( perRADICE, "3") }

         if( VAR_PosizioneSnack > 0) { perRADICE = "TOPSNINT"              }

         if( X > wk_x_max
           | Z > wk_z_max
           | VAR_VAL( ATTUALE(), "FLAG_Speciale") == 1 )
         {
            perRADICE = "TOPSNSPE"
            if( VAR_PosizioneSnack > 0) { perRADICE = "TOPSNINTSPE" }
         }

         if( perCODICE != "") { perRADICE = "" }

         if( RADICE != perRADICE)
         {
            RADICE = perRADICE
            flag_CAMBIA_VAR = 1
         }

         if( GEST_CODICE != perCODICE)
         {
            GEST_CODICE = perCODICE
            flag_CAMBIA_VAR = 1
         }
      }

      GOSUB GestComune_Post
      GOSUB CAMBIA_VAR
   }

   Procedura OnChangedVar
   {
   }

   Procedura cancella
   {
       if( $StartingDel__!=ATTUALE() ) { EXITSUB() }
   }

   Posiziona RigaOrdine_Graficata tel0
   {
      @escluso = VediMassellatura

      GOSUB posa_blocco

      @GRAFICA = "_graf_piano_SNACK"
      @GEST_CODICE = SE_STR( VAR_PosizioneSnack > 0, "TP0605", "")

      @FIN_idx_gest = SE_NUM( VAR_PosizioneSnack > 0, ATTUALE(), idx_att)
      @FIN_var = FIN_var

      idx_piano = @GRAFICA_IDX
   }

   //{ STAFFE
   Posiziona %staffa_archetipo% SF1
   {
      nstaffa = 1
      GOSUB PosaStaffa_PianoSNACK
   }

   Posiziona %staffa_archetipo% SF2
   {
      nstaffa = 2
      GOSUB PosaStaffa_PianoSNACK
   }

   Posiziona %staffa_archetipo% SF3
   {
      nstaffa = 3
      GOSUB PosaStaffa_PianoSNACK
   }

   Posiziona %staffa_archetipo% SF4
   {
      nstaffa = 4
      GOSUB PosaStaffa_PianoSNACK
   }

   Posiziona %staffa_archetipo% SF5
   {
      nstaffa = 5
      GOSUB PosaStaffa_PianoSNACK
   }

   Posiziona %staffa_archetipo% SF6
   {
      nstaffa = 6
      GOSUB PosaStaffa_PianoSNACK
   }
   //} STAFFE

   Posiziona MasselloBussole_SNACK msb
   {
      @escluso = 1
      if( VAR_TipoSnack>0 ) { @escluso = 0 }
      @Z = Z2
      @base_0.x = base_0.x + X2 - @X
      @base_0.y = base_0.y + 18
      @base_0.z = base_0.z + Z - @Z - 18
      if( VAR_Verso>0 ) { @base_0.x = base_0.x + X - X2 }
   }

#ifdef TEC;AZI
   Posiziona MassellaturaPiano_SNACK Mas
   {
      @escluso = 1 - VediMassellatura
      GOSUB posa_blocco
      idx_masselli = ATTUALE()
   }
#endif

   //LZ 10/11/2021: differenzio i near:
   //               - quelli per la riduzione dei bifacciali devono essere in corrispondenza delle basi di stesura
   //                 (il bifacciale non si riduce se non interessato dalle staffe dello snack)
   //               - quelli per la riduzione dei fianchi devono ricalcare la grafica dello snack

   //utilizzato per le ricerche dei bifacciali e del top
   Posiziona _cont_per_near_SNACK near_l
   {
      idx_cnear_lar = ATTUALE()

      GOSUB posa_blocco

      @X = X1
      @Z = Z1

      @base_0.x = base_0.x + VAR_Sbordo_SX + aa_sbordo_sx
      if( VAR_TipoSnack>0 & VAR_Verso<0 ) { @base_0.x = base_0.x + X2 }
   }

   Posiziona _cont_per_near_SNACK near_p
   {
      @escluso = 1
      idx_cnear_prf = -1

      if( VAR_TipoSnack > 0)
      {
         @escluso = 0
         idx_cnear_prf = ATTUALE()
      }

      GOSUB posa_blocco

      @X = X2
      @Y = 100

      @base_0.z = base_1.z - Z2
      if( VAR_Verso>0 ) { @base_0.x = base_3.x - X2 }
   }

   //LZ 10/11/2021
   //utilizzato per le ricerche dei fianchi di finitura
   Posiziona _cont_per_near_SNACK_FF n_ff_l
   {
      GOSUB posa_blocco
      @Z = Z1
   }

   Posiziona _cont_per_near_SNACK_FF n_ff_p
   {
      @escluso = 1
      if( VAR_TipoSnack>0 ) { @escluso = 0 }

      GOSUB posa_blocco
      @X = X2
      if( VAR_Verso>0 ) { @base_0.x = base_3.x - @X }
   }

   Posiziona SupportoVetro sup1
   {
      @escluso = 1
      idx_suppvtr = -1
      if( VAR_TipoSnack == 2)
      {
         @escluso = 0
         idx_suppvtr = ATTUALE()
      }

      @X = SVTR_Larghezza
      @Y = SVTR_Altezza - $Cuc_Alt_Zoc + 30

      @base_0.x = base_0.x + SVTR_PosX
      @base_0.y = base_0.y - SVTR_Altezza
      @base_0.z = base_0.z + @X + SVTR_PosZ
      @ang_y = 90

      if( VAR_Verso > 0)
      {
         @base_0.x = base_0.x + X - SVTR_PosX
         @base_0.z = base_0.z + SVTR_PosZ
         @ang_y = -90
      }
   }

   Posiziona _cont_per_near_sx nsx
   {
      idx_near_fsx=ATTUALE()
      @base_0.x = base_0.x + VAR_Sbordo_SX + 30 + aa_sbordo_sx
      if( VAR_TipoSnack>0 )
      {
         if( VAR_Verso<0 ) { @base_0.x = base_0.x + X2 + 30 }
      }
      @base_0.y = base_0.y
      @base_0.z = base_0.z + Z1
      //@X = 400
      @X = 250
      @Y = 60
      @Z = 60
   }

   Posiziona _cont_per_near_dx ndx
   {
      idx_near_fdx = ATTUALE()

      @base_0.x = base_0.x + VAR_Sbordo_SX + aa_sbordo_sx + X1 - 30 - @X
      if( VAR_TipoSnack>0 )
      {
         if( VAR_Verso<0 )
         {
            @base_0.x = base_0.x + VAR_Sbordo_SX + aa_sbordo_sx + X1 + X2  - 30 - @X
         }
      }

      @base_0.y = base_0.y
      @base_0.z = base_0.z + Z1
      //@X = 400
      @X = 250
      @Y = 60
      @Z = 60
   }

   Posiziona _cont_per_near ntop
   {
      idx_near_top = ATTUALE()
      @base_0.x = base_0.x + VAR_Sbordo_SX + aa_sbordo_sx + 30
      if( VAR_TipoSnack>0 )
      {
         @base_0.x = base_0.x + VAR_Sbordo_SX + aa_sbordo_sx + 30
         if( VAR_Verso<0 ) { @base_0.x = base_0.x + X2 + 30 }
      }
      @base_0.y = base_0.y
      @base_0.z = base_0.z + Z1
      @X = X1 -  60
      @Y = 80
      @Z = 60
   }
}

Elemento Staffa_PianoSNACK
{
   Descrizione = "Piano SNACK"
   Code        = TOP
   Gruppo      = "Piani"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      #include %path_bdm%\var_db.inc

      VAR_Revisione   ""             0    Implicit

      X               "Larghezza"    10
      Y               "Altezza"      190
      Z               "Profondità"   300

      perCODICE       ""             ""
      GEST_CODICE     ""             ""

      TIPO_COLLO      ""             "ST1"

      COD_EREDITA     ""             "PRE;POST"
      CMP2_AZIONI     ""             "P"

      FIN_var         ""             ""

      FillerM2G       " "            ""   ShowAlways

      FLAG_Debug      ""             0    Boolean
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Cucina_Versione

      FileStaffa = STRCAT($path_sat,"StaffaSNACK.sat")
      if( VAR_Revisione == 1)  { FileStaffa = STRCAT($path_sat,"StaffaSNACK_Rev01.sat") }
      if( Cucina_Versione > 2) { FileStaffa = STRCAT($path_sat,"StaffaSNACK_Rev01.sat") }
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Controlli
   {
      GOSUB CtrlEscluso
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune

      GEST_X = Z
      GEST_Z = X

      perCODICE = "B20006"
      if( VAR_Revisione == 1)  { perCODICE = "B20054" }

      if( GEST_CODICE != perCODICE)
      {
         GEST_CODICE = perCODICE
         flag_CAMBIA_VAR = 1
      }

      GOSUB GestComune_Post
      GOSUB CAMBIA_VAR
   }

   Procedura Vault
   {
      vaultFile = "ASM_012701;PRT_015616"
   }

   Posiziona __import__ SF1
   {
      GOSUB posa_blocco
      @import = FileStaffa
      GOSUB rivestimento
   }

   Posiziona Blocco dbg
   {
      @escluso = 1 - FLAG_Debug

      GOSUB posa_blocco

      @c_rivestimento = [ 120, 250, 250]
      @f_rivestimento = "0.9"
   }
}

Elemento Catena_PianoSNACK
{
   Descrizione = "Catena piano snack"
   Code        = CUB
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X                  "Larghezza"                   712
      Y                  "Altezza"                     80
      Z                  "Profondità"                  86.5
      Zt                 "Profondità totale"           366.5

      piastraDim         ""                            [  5,  0,   0] XyzAbsolute
      catenaDim          ""                            [  0,  0,  30] XyzAbsolute
      cornoDim           ""                            [ 30, 40, 280] XyzAbsolute
      cornoOff           ""                            [ 86,  0,   0] XyzAbsolute

      corni              ""                            3

      smusso             ""                            2

      perRADICE          ""                            ""
      RADICE             ""                            ""

      perCODICE          ""                            ""
      GEST_CODICE        ""                            ""

      FLAG_Debug         ""                            0  Boolean Implicit
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Stato_8

      piastraDim = [ piastraDim.x, Y, Z]
      catenaDim  = [ X - 2*piastraDim.x, Y, catenaDim.z]

      // Finitura
      FIN_idx_gest = idx_gest
      FIN_var      = GetFirstValidVarGest( FIN_idx_gest, "C021;C082")
      VAR_INDIRECT_ASSIGN( ATTUALE(), "c_rivestimento", FIN_idx_gest, FMT( "c_rivestimento_{}", FIN_var))
   }

   PuntiNotevoli
   {
      GOSUB punti

      base_0_m4 = [ base_0.x, base_0.y, base_0.z - cornoDim.z]
      alto_2_m4 = alto_2
   }

   Controlli
   {
      GOSUB CtrlEscluso
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune

      GEST_CODICE = "Y00692"

      GOSUB GestComune_Post
      GOSUB CAMBIA_VAR
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }

   Posiziona Dbg dbgXYZ
   {
      GOSUB posa_blocco
   }

   Posiziona Dbg dbgXYZt
   {
      GOSUB posa_blocco

      @Z = Zt
      @base_0 = base_0_m4
   }

   // Grafica
   /// Piastra Sinistra
   Posiziona BloccoSmussatoX piaSx
   {
      @X = piastraDim.x
      @Y = piastraDim.y
      @Z = piastraDim.z

      @base_0 = base_0

      @R0 = smusso
      @R1 = @R0
      @R2 = @R0
      @R3 = @R0

      @c_rivestimento = c_rivestimento
   }

   // Piastra Destra
   Posiziona BloccoSmussatoX piaDx
   {
      @X = piastraDim.x
      @Y = piastraDim.y
      @Z = piastraDim.z

      @base_0 = base_0
      @base_0.x = base_0.x + X - @X

      @R0 = smusso
      @R1 = @R0
      @R2 = @R0
      @R3 = @R0

      @c_rivestimento = c_rivestimento
   }

   // Catena centrale
   Posiziona BloccoSmussatoX catCx
   {
      @X = catenaDim.x
      @Y = catenaDim.y
      @Z = catenaDim.z

      @base_0 = base_0
      @base_0.x = base_0.x + (X - @X)/2

      @R0 = smusso
      @R1 = @R0
      @R2 = @R0
      @R3 = @R0

      @c_rivestimento = c_rivestimento
   }

   // Corni
   /// Corno Sinistro
   Posiziona Corno_PianoSNACK cornoSx
   {
      cornoNum = 1
      GOSUB PosaCorno_Catena_PianoSNACK

      @base_0.x = base_0.x + cornoOff.x
   }

   /// Corno Destro
   Posiziona Corno_PianoSNACK cornoDx
   {
      cornoNum = 2
      GOSUB PosaCorno_Catena_PianoSNACK

      @base_0.x = base_0.x + X - cornoOff.x - @X
   }

   /// Corno Centrale
   Posiziona Corno_PianoSNACK cornoCx
   {
      cornoNum = 3
      GOSUB PosaCorno_Catena_PianoSNACK
   }
}

Elemento Corno_PianoSNACK
{
   Descrizione = "Corno piano snack"
   Code        = CUB
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      escluso            ""             0

      X                  "Larghezza"    30
      Y                  "Altezza"      40
      Z                  "Profondità"   280

      Xt                 ""             40
      Yt                 ""             50

      smusso             ""             2                  Implicit

      cornoNum           ""             0

      scassoBif_Mag      ""             [ 10, 10, 0]       XyzAbsolute
      scassoBif_Raggio   ""             10
      scassoBif_Idx      ""             -1
      scassoBif_Elm      ""             ""

      scassoMas_Mag      ""             [ 24, 4, 0]         XyzAbsolute
      scassoMas_Raggio   ""             10
      scassoMas_Idx      ""             -1
      scassoMas_Elm      ""             ""

      HIDE               ""             1
      FLAG_Debug         ""             0                  Boolean     Implicit

      c_rivestimento     ""             [ 120, 120, 120]   XyzAbsolute Implicit
   }

   Assegnazioni
   {
      VAR_IMPLICITLY_INHERITS( ATTUALE(), 0)
   }

   PuntiNotevoli
   {
      Xt = X + max( scassoBif_Mag.x, scassoMas_Mag.x)
      Yt = Y + max( scassoBif_Mag.y, scassoMas_Mag.y)

      GOSUB punti

      base_0_m4 = [ base_0.x + (X - Xt)/2, base_0.y + (Y - Yt)/2, base_0.z]
      alto_2_m4 = [ base_0_m4.x + Xt, base_0_m4.y + Yt, base_0_m4.z + Z]
   }

   Controlli
   {
      GOSUB ScassaCorno_Catena_PianoSNACK
   }

   Posiziona Dbg dXYZ
   {
      GOSUB posa_blocco
   }

   Posiziona Dbg dXtYtZ
   {
      GOSUB posa_blocco

      @X = Xt
      @Y = Yt

      @base_0 = base_0_m4
   }

   Posiziona BloccoSmussatoZ crn
   {
      GOSUB posa_blocco

      @R0 = smusso
      @R1 = smusso
      @R2 = smusso
      @R3 = smusso

      @c_rivestimento = c_rivestimento
   }

   Posiziona BloccoSmussatoZ_Scassa scsBif
   {
      scassoBif_Idx = ATTUALE()

      GOSUB posa_blocco

      @X = X + scassoBif_Mag.x
      @Y = Y + scassoBif_Mag.y

      @base_0 = base_0
      @base_0.x = base_0.x + (X - @X)/2
      @base_0.y = base_0.y + (Y - @Y)/2

      @Raggio = scassoBif_Raggio

      @Scassa_Chi_Plus = scassoBif_Elm
   }

   Posiziona BloccoSmussatoZ_Scassa scsMas
   {
      scassoMas_Idx = ATTUALE()

      GOSUB posa_blocco

      @X = X + scassoMas_Mag.x
      @Y = Y + scassoMas_Mag.y

      @base_0 = base_0
      @base_0.x = base_0.x + (X - @X)/2
      @base_0.y = base_0.y + (Y - @Y)/2

      @Raggio = scassoMas_Raggio

      @Scassa_Chi_Plus = scassoMas_Elm
   }
}

Elemento MassellaturaPiano_SNACK
{
   Descrizione = "Piano SNACK"
   Code        = TOP
   Gruppo      = "Piani"
   Tipo        = Contenitore
   Forma       = ""
   Alias       NoCollision;OnChangedVar
   //Top

   Variabili
   {
      #include %path_bdm%\var_db.inc

      VAR_Revisione      ""             0               Implicit
      VAR_RevisioneMas   ""             0               Implicit

      X                  "Larghezza"    920
      Y                  "Altezza"      80
      Z                  "Profondità"   376

      X1                 ""             0               Implicit
      X2                 ""             0               Implicit
      Z1                 ""             0               Implicit
      Z2                 ""             0               Implicit

      VAR_Verso          ""             -1              Implicit
      VAR_TipoSnack      ""             0               Implicit
      VAR_PosizioneSnack ""             0               Implicit

      SVTR_Larghezza     ""             0               Implicit
      SVTR_PosX          ""             0               Implicit
      SVTR_PosZ          ""             0               Implicit

      NStaffe            ""             0               Implicit
      PosStaffe          ""             0               Implicit

      NumMasStaffe       ""             0

      c_bussola          ""             [192,192,192]   XyzAbsolute
   }

   Assegnazioni
   {
      GOSUB AssComune

      Lar_MasAbe = 54
      Lar_MasTru = 95

      Spe_MasAbe = 44
      Spe_MasTru = 44

      Lar_MasTou = 120
      Prf_MasTou = 660

      Lar_Maregg = 18
      Spe_BordoL = 2

      RieX_MasAbe = 0.5

      if( VAR_RevisioneMas >= 2 )
      {
         Lar_MasAbeL = 54
         Lar_MasAbe  = 50
         Lar_MasTru  = 93
      }

      NBussole = 0
      OffZ_BussR = 138
      OffZ_BussF = 71
      if( VAR_RevisioneMas > 0) { OffZ_BussF = 75 }

      if( VAR_TipoSnack>0)
      {
         NBussole = 4
         if( Z2 > 665 ) { NBussole = 5 }
      }

      PassoBussole = (Z2 - OffZ_BussR - OffZ_BussF) / (NBussole - 1)
      DiamBussole = 6

      Bussola1_PosZ = OffZ_BussR - DiamBussole/2
      Bussola2_PosZ = OffZ_BussR + PassoBussole  - DiamBussole/2
      Bussola3_PosZ = OffZ_BussR + 2*PassoBussole - DiamBussole/2
      Bussola4_PosZ = OffZ_BussR + 3*PassoBussole - DiamBussole/2
      Bussola5_PosZ = OffZ_BussR + 4*PassoBussole - DiamBussole/2

      X_MasselloRetro1  = X - (Spe_BordoL+Lar_MasTru+RieX_MasAbe)*2
      X_MasselloFronte1 = X2 - (Spe_BordoL+Lar_MasTru+RieX_MasAbe) - (Spe_BordoL+RieX_MasAbe+Lar_MasAbe)

      //Luca 07/02/2022
      Testa_sx_Rev1 = 0
      Testa_dx_Rev1 = 0

      GOSUB CtrlMasselliPerStaffe_PianoSNACK

      //Luca 07/02/2022
      if( VAR_RevisioneMas >= 2
        & VAR_EXIST(ATTUALE(),"PosStaffe_##1"))
      {
         limite_staffa = 110
         if( VAR_TipoSnack == 0 )
         {
            if( PosStaffe[1] < limite_staffa )             { Testa_sx_Rev1 = 2 }
            if( X - PosStaffe[PosStaffe] < limite_staffa ) { Testa_dx_Rev1 = 2 }
            //Testa_sx_Rev1 = 2
            //Testa_dx_Rev1 = 2
         }
         else
         {
            if( VAR_Verso < 0 )
            {
               //Testa_dx_Rev1 = 2
               if( X - PosStaffe[PosStaffe] < limite_staffa ) { Testa_dx_Rev1 = 2 }
            }
            else
            {
               //Testa_sx_Rev1 = 2
               if( PosStaffe[1] < limite_staffa )             { Testa_sx_Rev1 = 2 }
            }
         }

         rie_sx_masr = Spe_BordoL + Lar_MasTru + RieX_MasAbe
         rie_dx_masr = Spe_BordoL + Lar_MasTru + RieX_MasAbe

         if( Testa_sx_Rev1 >= 2 )
         {
            ////devo aspettare di avere i valori corretti
            //if( VAR_EXIST(ATTUALE(),"PosStaffe_##1") )
            //{
               //rie_sx_masr = PosStaffe[1] + 15 + Lar_MasAbe + RieX_MasAbe
            //}
            rie_sx_masr = PosStaffe[1] + 15 + Lar_MasAbeL + RieX_MasAbe
         }

         if( Testa_dx_Rev1 >= 2 )
         {
            ////devo aspettare di avere i valori corretti
            //if( VAR_EXIST(ATTUALE(),STRCAT("PosStaffe_##",STR(NStaffe)))  )
            //{
               //rie_dx_masr = X - PosStaffe[NStaffe] + 15 + Lar_MasAbe + RieX_MasAbe
            //}
            rie_dx_masr = X - PosStaffe[NStaffe] + 15 + Lar_MasAbeL + RieX_MasAbe
         }

         X_MasselloRetro1  = X - rie_sx_masr - rie_dx_masr
      }

      Pos_Massello_Staffa = X2/2 - Lar_MasTou/2 + 3
      if( VAR_Verso>0 ) { Pos_Massello_Staffa = X - X2/2 - Lar_MasTou/2 }

      Pos_Massello_Staffa_Z = Z/2 - 660/2

      //Luca 07/02/2022
      //usata solo per rev teste >= 2
      MasAggX_Testa_Sx = 0
      MasAggX_Testa_Dx = 0

      if( VAR_EXIST(idx_att,"PosStaffe_##1") )
      {
         MasAggX_Testa_Sx = PosStaffe[1] - 15 - 2
      }

      if( VAR_EXIST(idx_att,STRCAT("PosStaffe_##",STR(NStaffe))) )
      {
         MasAggX_Testa_Dx = X - PosStaffe[NStaffe] - 15 - 2
      }
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Controlli
   {
      GOSUB CtrlEscluso
      GOSUB CtrlComune

      GOSUB CtrlMasselliPerStaffe_PianoSNACK
   }

   Posiziona _graf_piano_SNACK pia
   {
      GOSUB posa_blocco
      @Y = 18
   }

   //massello di sx
   Posiziona Blocco MT1
   {
      @base_0.x = base_0.x + 2
      @base_0.y = base_0.y + 18
      @base_0.z = base_0.z + Lar_Maregg
      @X = Lar_MasTru
      @Y = Spe_MasTru
      @Z = Z - 2*Lar_Maregg

      if( VAR_TipoSnack>0 & VAR_Verso>0 ) { @Z = Z1 - 2*Lar_Maregg }

      //Luca 07/02/2022 prima dell'ultima staffa
      if( Testa_sx_Rev1 >=2 )
      {
         //@X = Lar_MasAbe
         @X = Lar_MasAbeL
         if( VAR_EXIST(idx_att,"PosStaffe_##1") )
         {
            @base_0.x = base_0.x + PosStaffe[1] + 15
         }
      }
   }

   //massello di dx
   Posiziona Blocco MT2
   {
      @base_0.x = base_0.x + X - 2 - Lar_MasTru
      @base_0.y = base_0.y + 18
      @base_0.z = base_0.z + Lar_Maregg
      @X = Lar_MasTru
      @Y = Spe_MasTru
      @Z = Z - 2*Lar_Maregg

      if( VAR_TipoSnack>0 & VAR_Verso<0 ) { @Z = Z1 - 2*Lar_Maregg }

      //Luca 07/02/2022 prima dell'ultima staffa
      if( Testa_dx_Rev1 >= 2 )
      {
         //@X = Lar_MasAbe
         @X = Lar_MasAbeL
         if( VAR_EXIST(idx_att,STRCAT("PosStaffe_##",STR(NStaffe))) )
         {
            posx_mas = PosStaffe[NStaffe] - 15 - @X
            @base_0.x = base_0.x + posx_mas
         }
      }
   }

   //Luca 07/02/2022 gestisco due nuovi masselli per le teste nuove
   Posiziona Blocco MATSX
   {
      @escluso = 1

      if( MasAggX_Testa_Sx > 0 & Testa_sx_Rev1>=2 ) { @escluso = 0 }

      @base_0.x = base_0.x + 2
      @base_0.y = base_0.y + 18
      @base_0.z = base_0.z + Lar_Maregg
      @X = MasAggX_Testa_Sx
      @Y = Spe_MasTru
      @Z = Z - 2*Lar_Maregg
      if( VAR_TipoSnack>0 & VAR_Verso>0 ) { @Z = Z1 - 2*Lar_Maregg }

   }

   Posiziona Blocco MATDX
   {
      @escluso = 1
      if( MasAggX_Testa_Dx > 0 & Testa_dx_Rev1>=2 ) { @escluso = 0 }

      @X = MasAggX_Testa_Dx
      @base_0.x = base_0.x + X - 2 - @X
      @base_0.y = base_0.y + 18
      @base_0.z = base_0.z + Lar_Maregg
      @Y = Spe_MasTru
      @Z = Z - 2*Lar_Maregg

      if( VAR_TipoSnack>0 & VAR_Verso<0 ) { @Z = Z1 - 2*Lar_Maregg }

   }

   //massello laterale a contatto con fianco base
   Posiziona Blocco MAB1
   {
      @escluso = 1
      if( VAR_TipoSnack>0 ) { @escluso = 0 }
      @base_0.x = base_0.x + X2 - Lar_MasAbe - 2
      if( VAR_Verso>0 ) { @base_0.x = base_0.x + X - X2 + 2 }

      @base_0.y = base_0.y + 18
      @X = Lar_MasAbe
      @Y = Spe_MasAbe
      @Z = Z2
      @base_0.z = base_0.z + Z - Lar_Maregg - @Z
   }

   //massello retro
   Posiziona Blocco MAR1
   {
      @base_0.x = base_0.x + Spe_BordoL + Lar_MasTru + RieX_MasAbe
      @base_0.y = base_0.y + 18
      @base_0.z = base_0.z + Lar_Maregg
      //@X = X - (Spe_BordoL+Lar_MasTru+RieX_MasAbe)*2
      @X = X_MasselloRetro1
      @Y = Spe_MasAbe
      @Z = Lar_MasAbe

      //Luca 07/02/2022 prima dell'ultima staffa
      if( Testa_sx_Rev1 >= 2 )
      {
         if( VAR_EXIST(idx_att,"PosStaffe_##1") )
         {
            //@base_0.x = base_0.x + PosStaffe[1] + 15 + Lar_MasAbe + RieX_MasAbe
            @base_0.x = base_0.x + PosStaffe[1] + 15 + Lar_MasAbeL + RieX_MasAbe
         }
      }
   }

   //{masselli per staffe
   Posiziona MasselloStaffa_SNACK MAF1
   {
      nmassello = 1
      GOSUB PosaMasselloStaffa_PianoSNACK
   }
   Posiziona MasselloStaffa_SNACK MAF2
   {
      nmassello = 2
      GOSUB PosaMasselloStaffa_PianoSNACK
   }
   Posiziona MasselloStaffa_SNACK MAF3
   {
      nmassello = 3
      GOSUB PosaMasselloStaffa_PianoSNACK
   }
   Posiziona MasselloStaffa_SNACK MAF4
   {
      nmassello = 4
      GOSUB PosaMasselloStaffa_PianoSNACK
   }

   Posiziona MasselloStaffa_SNACK MAF5
   {
      nmassello = 5
      GOSUB PosaMasselloStaffa_PianoSNACK
   }
   Posiziona MasselloStaffa_SNACK MAF6
   {
      nmassello = 6
      GOSUB PosaMasselloStaffa_PianoSNACK
   }
   Posiziona MasselloStaffa_SNACK MAF7
   {
      nmassello = 7
      GOSUB PosaMasselloStaffa_PianoSNACK
   }
   //} masselli per staffe

   //massello Fronte L
   Posiziona Blocco MAL1
   {
      @escluso = 1
      if( VAR_TipoSnack>0 ) { @escluso = 0 }

      //@X = X2 - (Spe_BordoL+Lar_MasTru+RieX_MasAbe) - (Spe_BordoL+RieX_MasAbe+Lar_MasAbe)
      @X = X_MasselloFronte1

      @base_0.x = base_0.x + Spe_BordoL + Lar_MasTru + RieX_MasAbe

      if( VAR_Verso>0 ) { @base_0.x = base_0.x + X - @X - Spe_BordoL - Lar_MasTru - RieX_MasAbe }
      @base_0.y = base_0.y + 18
      @base_0.z = base_0.z + Z - Lar_Maregg - Lar_MasAbe

      //@X = X2 - (Spe_BordoL+Lar_MasTru+RieX_MasAbe) - (Spe_BordoL-RieX_MasAbe-Lar_MasAbe)

      @Y = Spe_MasAbe
      @Z = Lar_MasAbe
   }

   //Bussole
   Posiziona CilindroX BU1
   {
      @escluso = 1
      if( NBussole >= 1) { @escluso = 0 }

      @base_0.x = base_0.x + X2 - 25
      if( VAR_Verso>0 ) { @base_0.x = base_0.x + X - X2 - 20 }

      @base_0.y = base_0.y + Y - 50 + DiamBussole/2

      //Luca 05/06/2020
      //@base_0.z = base_0.z + Z1 + OffZ_BussR - DiamBussole/2
      @base_0.z = base_0.z + Z1 +  Bussola1_PosZ

      @X = 45
      @Y = DiamBussole

      @c_rivestimento = c_bussola
   }

   //Bussole
   Posiziona CilindroX BU2
   {
      @escluso = 1
      if( NBussole >= 2) { @escluso = 0 }

      @base_0.x = base_0.x + X2 - 25
      if( VAR_Verso>0 ) { @base_0.x = base_0.x + X - X2 - 20 }

      @base_0.y = base_0.y + Y - 50 + DiamBussole/2
      //Luca 05/06/2020
      //@base_0.z = base_0.z + Z1 + OffZ_BussR + PassoBussole  - DiamBussole/2
      @base_0.z = base_0.z + Z1 + Bussola2_PosZ

      @X = 45
      @Y = DiamBussole

      @c_rivestimento = c_bussola
   }

   //Bussole
   Posiziona CilindroX BU3
   {
      @escluso = 1
      if( NBussole >= 3) { @escluso = 0 }

      @base_0.x = base_0.x + X2 - 25
      if( VAR_Verso>0 ) { @base_0.x = base_0.x + X - X2 - 20 }

      @base_0.y = base_0.y + Y - 50 + DiamBussole/2
      //Luca 05/06/2020
      //@base_0.z = base_0.z + Z1 + OffZ_BussR + 2*PassoBussole - DiamBussole/2
      @base_0.z = base_0.z + Z1 + Bussola3_PosZ

      @X = 45
      @Y = DiamBussole

      @c_rivestimento = c_bussola
   }

   Posiziona CilindroX BU4
   {
      @escluso = 1
      if( NBussole >= 4) { @escluso = 0 }

      @base_0.x = base_0.x + X2 - 25
      if( VAR_Verso>0 ) { @base_0.x = base_0.x + X - X2 - 20 }

      @base_0.y = base_0.y + Y - 50 + DiamBussole/2
      //Luca 05/06/2020
      //@base_0.z = base_0.z + Z1 + OffZ_BussR + 3*PassoBussole - DiamBussole/2
      @base_0.z = base_0.z + Z1 + Bussola4_PosZ

      @X = 45
      @Y = DiamBussole

      @c_rivestimento = c_bussola
   }

   Posiziona CilindroX BU5
   {
      @escluso = 1
      if( NBussole >= 5) { @escluso = 0 }

      @base_0.x = base_0.x + X2 - 25
      if( VAR_Verso>0 ) { @base_0.x = base_0.x + X - X2 - 20 }

      @base_0.y = base_0.y + Y - 50 + DiamBussole/2
      //Luca 05/06/2020
      //@base_0.z = base_0.z + Z1 + OffZ_BussR + 4*PassoBussole - DiamBussole/2
      @base_0.z = base_0.z + Z1 + Bussola5_PosZ

      @X = 45
      @Y = DiamBussole

      @c_rivestimento = c_bussola
   }

   //Luca 19/07/2019 staffa vetro
   Posiziona Blocco MVT1
   {
      @escluso = 1
      if( VAR_TipoSnack>1 ) { @escluso = 0 }
      @X = 120
      @Y = Spe_MasTru
      @Z = 660

      @base_0.x = base_0.x + Pos_Massello_Staffa

      @base_0.y = base_0.y + 18
      //Luca 05/06/2020
      //@base_0.z = base_0.z + Z/2 - @Z/2
      @base_0.z = base_0.z + Pos_Massello_Staffa_Z
   }

   //Luca 19/07/2019 staffa vetro
   Posiziona __import__ MVT2
   {
      @escluso = 1
      if( VAR_TipoSnack>1 ) { @escluso = 0 }

      @import =  STRCAT($path_sat,"Dettagli\FresataStaffaVetro_600.sat")
      //Luca 09/01/2020
      if( VAR_Revisione==1 ) { @import =  STRCAT($path_sat,"Dettagli\FresataStaffaVetro_620.sat") }
      @X = 120
      @Y = 10
      @Z = 660

      @base_0.x = base_0.x + X2/2
      @ang_y = 0
      if( VAR_Verso>0 )
      {
         @ang_y = 180
         @base_0.x = base_0.x + X - X2/2
      }

      @base_0.y = base_0.y + 18 + Spe_MasTru
      @base_0.z = base_0.z + Z/2
   }
}

Elemento MasselloStaffa_SNACK
{
   Descrizione = "Massello Staffe Piano Snack"
   Code        = SNK
   Gruppo      = ""
   Tipo        = ""
   Forma       = Blocco

   Variabili
   {
      X                    ""   54
      Y                    ""   44
      Z                    ""   100

      VAR_Verso            ""   0       Implicit
      VAR_TipoSnack        ""   0       Implicit
      VAR_PosizioneSnack   ""   0       Implicit

      c_rivestimento       ""   [ 250, 250, 250]
      escluso              ""   0

      HIDE                 ""   1
   }

   PuntiNotevoli
   {
      GOSUB punti

      base_so = [0, 0, 0]
      alto_ne = [X, Y, Z]
   }
}

Elemento MasselloBussole_SNACK
{
   Descrizione = "SNACK"
   Code        = TOP
   Gruppo      = "Piani"
   Tipo        = Contenitore
   Forma       = ""
   Alias    CamIncidente

   Variabili
   {
      #include %path_bdm%\var_db.inc
      //#include %install_dir%\bdm\var_db.inc

      X   "Larghezza"          54
      Y   "Altezza"            44
      Z   "Profondità"        100

      HIDE "" 1

      VAR_TipoSnack "" 0 Implicit

      VAR_Verso "" -1 Implicit
   }

   Assegnazioni
   {
      GOSUB AssComune
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Controlli
   {
      GOSUB CtrlComune
   }

   //Posiziona Blocco bl
   //{
   //   GOSUB posa_blocco
   //   @base_0.x = base_0.x + 1
   //   @X = X-2
   //   GOSUB rivestimento
   //}
}

Elemento _graf_piano_SNACK
{
   Descrizione = "piano SNACK"
   Code        = CUB
   Gruppo      = ""
   Tipo        = ""
   Forma       = YSweep
   Alias Scassabile

   Variabili
   {
      X "" 1
      Y "" 1
      Z "" 1

      X1 "" 0 Implicit
      X2 "" 0 Implicit
      Z1 "" 0 Implicit
      Z2 "" 0 Implicit

      VAR_TipoSnack "" 0 Implicit

      VAR_Verso "" -1 Implicit

      HIDE "" 1
   }

   PuntiNotevoli
   {
      VAR_IMPLICITLY_INHERITS(ATTUALE(), 0)
      DEL_VAR(ATTUALE(),"base_*")

      base_0  = [ 0 , 0, 0 ]
      base_1  = [ 0 , 0, Z ]
      base_2  = [ X , 0, Z ]
      base_3  = [ X , 0, 0 ]

      if( VAR_TipoSnack>0 )
      {
         base_2 = [ X2, 0, Z ]
         base_3 = [ X2, 0 ,Z1 ]
         base_4 = [  X, 0 ,Z1 ]
         base_5 = [  X, 0 ,0 ]

         if( VAR_Verso>0 )
         {
            base_1 = [      0, 0, Z1 ]
            base_2 = [ X - X2, 0, Z1 ]
            base_3 = [ X - X2, 0 ,Z ]
            base_4 = [      X, 0 ,Z ]
            base_5 = [      X, 0 ,0 ]
         }

      }
      alto_0 = base_0
      alto_0.y = Y

      base_so = base_0
      alto_ne = [X,Y,Z]
   }
}

Elemento _cont_per_near_SNACK
{
   Descrizione = "_cont_per_near"
   Code        = CPN
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      X   ""    20
      Y   ""    20
      Z   ""    20
      HIDE ""   1
   }

   Assegnazioni
   {
      GOSUB Stato_7
   }

   PuntiNotevoli
   {
      GOSUB punti
   }
}

Elemento _cont_per_near_SNACK_FF
{
   Descrizione = "_cont_per_near"
   Code        = CPN
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      X   ""    20
      Y   ""    20
      Z   ""    20
      HIDE "" 1
   }

   Assegnazioni
   {
      GOSUB Stato_7
   }

   PuntiNotevoli
   {
      GOSUB punti
   }
}
//} PIANO SNACK

Elemento _cont_per_near_SteelPen
{
   Descrizione = "_cont_per_near per Top Steel Penisola"
   Code        = CPN
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      X   ""    20
      Y   ""    20
      Z   ""    20
      HIDE "" 1
   }

   Assegnazioni
   {
      GOSUB Stato_7
   }

   PuntiNotevoli
   {
      GOSUB punti
   }
}

//**********************************************************
//{ TOP 2.0
Elemento Top_2P0
{
   Descrizione = "Top"
   Code        = TOP
   Gruppo      = "Piani"
   Tipo        = Contenitore
   Forma       = ""
   Alias       BDM_Top;TSTP_NoQuota;StpTop

   Variabili
   {
      #include %path_bdm%\var_db.inc
      //#include %install_dir%\bdm\var_db.inc

      X                            "(Lunghezza nominale)"      1000   ShowAlways
      Xt                           "(Lunghezza totale)"        1000   ShowAlways

      Y                            "(Spessore)"                30     ShowAlways

      Z                            "(Profondità nominale)"     602    ShowAlways
      Zt                           "(Profondità totale)"       602    ShowAlways

      #ifdef TEC;AZI
      TOP_UTENTE                   "TOP UTENTE"                0      Boolean
      #endif
      #ifndef TEC;AZI
      TOP_UTENTE                   "TOP UTENTE"                0
      #endif

      Sbrd_SX                      "Sbordo TOP sx"             0      SaveAlways
      Sbrd_DX                      "Sbordo TOP dx"             0      SaveAlways
      Sbrd_FR                      "Sbordo TOP fronte"         0      SaveAlways
      Sbrd_RT                      "Sbordo TOP retro"          0      SaveAlways

      Sbrd_ST_SX                   "Sbordo SOTTOTOP sx"        0      SaveAlways
      Sbrd_ST_DX                   "Sbordo SOTTOTOP dx"        0      SaveAlways
      Sbrd_ST_FR                   "Sbordo SOTTOTOP fronte"    0      SaveAlways
      Sbrd_ST_RT                   "Sbordo SOTTOTOP retro"     0      SaveAlways

      Sbrd_ST2_SX                  "Sbordo SOTTOTOP2 sx"       0      SaveAlways
      Sbrd_ST2_DX                  "Sbordo SOTTOTOP2 dx"       0      SaveAlways
      Sbrd_ST2_FR                  "Sbordo SOTTOTOP2 fronte"   0      SaveAlways
      Sbrd_ST2_RT                  "Sbordo SOTTOTOP2 retro"    0      SaveAlways

      Smusso_FS                    "Smusso TOP fronte sx"      0
      Smusso_FD                    "Smusso TOP fronte dx"      0
      Smusso_RS                    "Smusso TOP retro sx"       0
      Smusso_RD                    "Smusso TOP retro dx"       0

      X_SottoTop_Tot               ""                          0      SaveAlways
      Z_SottoTop_Tot               ""                          0      SaveAlways

      X_SottoTop                   ""                          0      SaveAlways
      Z_SottoTop                   ""                          0      SaveAlways
      X_SottoTop2                  ""                          0      SaveAlways
      Z_SottoTop2                  ""                          0      SaveAlways

      //Luca 29/06/2020 massello in presenza di microgiunzioni
      Con_MasMT_SX                 ""                          0
      Con_MasMT_DX                 ""                          0

      SpessorePiano                ""                          40
      SpessoreSottoPiano           ""                          19

      SpessoreTopCliente           "Spessore Top Cliente"      10     Utente   (   0-100     )

      //basi affiancate con angolo + 180
      FLAG_Basi180                 ""                          0      SaveAlways

      FLAG_TopIsola                "Top ISOLA"                 0      SaveAlways
      //2 -- Top FUSION sagomato
      FLAG_TopFusion               "Top FUSION"                0      SaveAlways

      //Luca 05/07/2021
      RaggioInterno_Fusion         ""                          0

      //in caso di scelta utente
      FLAG_TopFusion_USER          ""                          0      SaveAlways

      //VAR_TipoTop 0 - 9 TOP Nobile + SOTTOTOP
      //VAR_TipoTop = 0 Vetro 23mm --> 4mm + 19mm
      //VAR_TipoTop = 1 Vetro 29mm --> 10mm + 19mm
      //VAR_TipoTop = 2 Quarzo 31mm --> 12mm + 19mm
      //VAR_TipoTop = 3 Laminato 29mm --> 10mm + 19mm
      //VAR_TipoTop = 4 Laminato 31mm --> 12mm + 19mm
      //
      //VAR_TipoTop 10 - 19 TOP CORPO UNICO
      //VAR_TipoTop = 10 Laminato 29mm --> 10mm + 19mm
      //VAR_TipoTop = 11 Acciaio 29mm --> 10mm + 19mm
      //VAR_TipoTop = 12 Wildwood 30mm --> 11mm + 19mm
      //VAR_TipoTop = 13 Laminato 31mm --> 12mm + 19mm
      //
      //VAR_TipoTop 20 - 29 TOP 80
      //VAR_TipoTop = 20 Madeterraneo 80 mm --> 80mm + 19mm
      //VAR_TipoTop = 21 Acciaio Steel 80mm --> 80mm + 19mm
      //VAR_TipoTop = 22 Wildwood 80mm --> 80mm + 19mm
      //VAR_TipoTop = 23 Acciaio Steel Penisola 80mm --> 80mm
      VAR_TipoTop                  "Tipo piano"                0      Menu     (   TipoTop   )
      VAR_TipoTopStr               ""                          ""

      //gestione sottotop
      //1 dividi in X
      //2 dividi in Z
      DividiSottoTop               ""                          0      SaveAlways

      EscSottotop                  "Escludi Sottotop"          0      Menu     (   SiNo      )   ShowAlways

      // 14/04/21 - GESTIONE PER TOP PENISOLA STEEL
      FillerInSteelPen             " "                         " "    ShowAlways
      PosX_SteelPen                "Posizione penisola"        1
      OffX_SteelPen                "Misura penisola"           100
      FillerOutSteelPen            " "                         " "    ShowAlways

      #ifdef TEC
      HideTOP                      "Nascondi Top"              0      Boolean
      HideSTOP                     "Nascondi Sottotop"         0      Boolean
      #endif
      #ifndef TEC
      HideTOP                      "Nascondi Top"              0
      HideSTOP                     "Nascondi Sottotop"         0
      #endif

      Filler_VT                    " "                         ""     ShowAlways

      //Luca 06/05/2020
      //{ VASCHE TERMOFORMATE
      //gestisco come un top vetro
      FLAG_ConVascheTermoformate   ""                          0
      VT_NumVasche                 ""                          1
      // 1 - VASCA OVALE VT002 - VT003
      // 2 - VASCA OCCHIETTO VT005 - VT008
      // 3 - VASCA RETT 50x31 VT004 - VT007
      // 4 - VASCA RETT 68x32 VT006
      VT_TipoVasca                 ""                          0

      VT_idxVasc_V1                ""                          -1
      VT_idxBase_V1                ""                          -1
      VT_PosBase_V1                ""                          0
      VT_OffsetX_V1                ""                          0
      VT_OffsetZ_V1                ""                          0

      VT_idxVasc_V2                ""                          -1
      VT_idxBase_V2                ""                          -1
      VT_PosBase_V2                ""                          0
      VT_OffsetX_V2                ""                          0
      VT_OffsetZ_V2                ""                          0

      VT_Miscelatore               "Miscelatore"               1      Menu     (   SiNo      )
      //} VASCHE TERMOFORMATE

      ID_Sin                       ""                          -1
      ID_Des                       ""                          -1

      SpostaProfondita             ""                          0

      //Luca 30/06/2021 gestione raggio interno top fusion
      Scassa_Chi_Plus_RaggioInt    ""                          ""

      RigeneraScasso               "Rigenera Scassi"           0      Boolean

      HIDE                         ""                          0

      //4manuale + 2selezione
      M4_DIALOG                    ""                          6
      M4_A_MURO                    ""                          1

      stesi_mode_sx                ""                          0
      stesi_mode_dx                ""                          0

      //top in accosto a sx/dx
      idx_topvic_sx                ""                          -1
      idx_topvic_dx                ""                          -1

      idx_ffvic_sx                 ""                          -1
      idx_ffvic_dx                 ""                          -1

      //Luca 11/12/2019
      idx_topang_sx                ""                          -1
      idx_topang_dx                ""                          -1

      idx_top_SNACK_sx             ""                          -1
      idx_top_SNACK_dx             ""                          -1

      idx_penisola                 ""                          -1
      ConPenisolaApp               ""                          0

      idx_rif_steso_sx             ""                          -1
      idx_rif_steso_dx             ""                          -1

      idx_rif_steso_iso_sx         ""                          -1
      idx_rif_steso_iso_dx         ""                          -1

      idx_pann_top                 ""                          -1     //idx _top_generico (scarico gestionale pannello top)
      idx_pann_stop                ""                          -1
      idx_pann_stop2               ""                          -1

      idx_near_dn                  ""                          -1
      idx_near_up                  ""                          -1
      idx_near_sx                  ""                          -1
      idx_near_dx                  ""                          -1

      idx_near_fsx                 ""                          -1
      idx_near_fdx                 ""                          -1

      idx_near_SNACK_sx            ""                          -1
      idx_near_SNACK_dx            ""                          -1

      ang_y                        ""                          0

      //Il codice del piano è dato da TipoPiano,Z,bordo retro (isola/top)
      COD_EREDITA                  ""                          "PRE;POST"
      NO_GEST                      ""                          0

      no_collisione                ""                          1      //escludo collisioni

      CMP2_AZIONI                  ""                          "M"

      ORD_MISAMETRO                ""                          "X"

      M4_MIS                       ""                          "Filler*;X*;Y*;Z*;SpessoreTopCliente;VT_Miscelatore;PosX_SteelPen;OffX_SteelPen"

      FillerM2G                    " "                         ""     ShowAlways
   }

   Assegnazioni
   {
      GOSUB AssComune
      Cucina_Versione_Idx = idx_rif_steso_sx
      GOSUB Cucina_Versione

      M4_GRUPPO__ = MSG(1004)

      //se draggato, diventa posizionato
      M4_CNT_LINK_MODE__ = 0

      //escludo collisioni
      no_collisione = 1

      if( $ATTIVA_DLL )
      {
         HIDE_ON_EDIT2(ATTUALE(),"SpessoreTopCliente",SE_NUM(VAR_TipoTop==99,0,1))
         HIDE_ON_EDIT2(ATTUALE(),"VAR_TipoTop",1)
         //HIDE_ON_EDIT2(ATTUALE(),"EscSottotop",1)

         if( TOP_UTENTE==1 )
         {
            VAR_SET_MODE(ATTUALE(), "Sbrd_SX" , $MODE_USER+$MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_DX" , $MODE_USER+$MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_FR" , $MODE_USER+$MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_RT" , $MODE_USER+$MODE_SAVEALWAYS)

            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_SX" , $MODE_USER+$MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_DX" , $MODE_USER+$MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_FR" , $MODE_USER+$MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_RT" , $MODE_USER+$MODE_SAVEALWAYS)

            if( DividiSottoTop>0 )
            {
               VAR_SET_MODE(ATTUALE(), "Sbrd_ST2_SX" , $MODE_USER+$MODE_SAVEALWAYS)
               VAR_SET_MODE(ATTUALE(), "Sbrd_ST2_DX" , $MODE_USER+$MODE_SAVEALWAYS)
               VAR_SET_MODE(ATTUALE(), "Sbrd_ST2_FR" , $MODE_USER+$MODE_SAVEALWAYS)
               VAR_SET_MODE(ATTUALE(), "Sbrd_ST2_RT" , $MODE_USER+$MODE_SAVEALWAYS)
            }

            if( $modalita == "TEC")
            {
               VAR_SET_MODE(ATTUALE(), "Smusso_FS" , $MODE_USER)
               VAR_SET_MODE(ATTUALE(), "Smusso_FD" , $MODE_USER)
               VAR_SET_MODE(ATTUALE(), "Smusso_RS" , $MODE_USER)
               VAR_SET_MODE(ATTUALE(), "Smusso_RD" , $MODE_USER)
            }
         }
         else
         {
            VAR_SET_MODE(ATTUALE(), "Sbrd_SX" , $MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_DX" , $MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_FR" , $MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_RT" , $MODE_SAVEALWAYS)

            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_SX" , $MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_DX" , $MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_FR" , $MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_RT" , $MODE_SAVEALWAYS)

            VAR_SET_MODE(ATTUALE(), "Sbrd_ST2_SX" , $MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST2_DX" , $MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST2_FR" , $MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST2_RT" , $MODE_SAVEALWAYS)

            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_SX")==1 )     { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_SX") }
            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_DX")==1 )     { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_DX") }
            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_FR")==1 )     { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_FR") }
            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_RT")==1 )     { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_RT") }

            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_ST_SX")==1 )  { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_ST_SX") }
            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_ST_DX")==1 )  { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_ST_DX") }
            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_ST_FR")==1 )  { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_ST_FR") }
            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_ST_RT")==1 )  { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_ST_RT") }

            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_ST2_SX")==1 ) { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_ST2_SX") }
            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_ST2_DX")==1 ) { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_ST2_DX") }
            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_ST2_FR")==1 ) { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_ST2_FR") }
            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_ST2_RT")==1 ) { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_ST2_RT") }

            if( IS_VAR_FIXED(ATTUALE(),"Smusso_FS")==1 )     { DEL_VAR_MODIFICATE(ATTUALE(),"Smusso_FS") }
            if( IS_VAR_FIXED(ATTUALE(),"Smusso_FD")==1 )     { DEL_VAR_MODIFICATE(ATTUALE(),"Smusso_FD") }
            if( IS_VAR_FIXED(ATTUALE(),"Smusso_RS")==1 )     { DEL_VAR_MODIFICATE(ATTUALE(),"Smusso_RS") }
            if( IS_VAR_FIXED(ATTUALE(),"Smusso_RD")==1 )     { DEL_VAR_MODIFICATE(ATTUALE(),"Smusso_RD") }
         }

         if( ACTION()==0 )
         {
            HIDE_ON_EDIT2(ATTUALE(),"VT_Miscelatore",1)
            HIDE_ON_EDIT2(ATTUALE(),"Filler_VT",1)
            if( FLAG_ConVascheTermoformate==1 )
            {
               HIDE_ON_EDIT2(ATTUALE(),"Filler_VT",0)
               HIDE_ON_EDIT2(ATTUALE(),"VT_Miscelatore",0)
            }

         }
      }

      GOSUB Setta_VarTipoTop_2P0

      //COMANDO2(STRCAT("LOGMSG TOP_2P0 ATTUALE: ",STR(ATTUALE()), " | ACT(",STR(ACTION()),") | ASSEGNAZIONI"))

//Luca 11/02/2020 non deve essere mai salvato sul rit
#ifdef TEC
      if( IS_VAR_FIXED(ATTUALE(),"HideTOP")==1 )  { DEL_VAR_MODIFICATE(ATTUALE(),"HideTOP") }
      if( IS_VAR_FIXED(ATTUALE(),"HideSTOP")==1 ) { DEL_VAR_MODIFICATE(ATTUALE(),"HideSTOP") }
#endif
   }

// } vai in testa
   PuntiNotevoli
   {
      Y = SpessorePiano
      Yt = Y + SpessoreSottoPiano

      Xt = X + Sbrd_SX + Sbrd_DX
      Zt = Z + Sbrd_RT + Sbrd_FR

      //[ LP 14/04/21 - Gestione per TOP STEEL A SBALZO
      GOSUB CtrlTopSteelPenisola
      //] LP 14/04/21 - Gestione per TOP STEEL A SBALZO

      GOSUB punti

      //GOSUB top_calcola_xt_2P0

      //punti utilizzati in stampa per quotare
      //definisco i punti laterali compresi di rientri
      pnt_top_b0 = base_0   pnt_top_b0.x = pnt_top_b0.x - Sbrd_SX        pnt_top_b0.z = pnt_top_b0.z - Sbrd_RT
      pnt_top_b1 = base_1   pnt_top_b1.x = pnt_top_b1.x - Sbrd_SX        pnt_top_b1.z = pnt_top_b1.z + Sbrd_FR
      pnt_top_b2 = base_2   pnt_top_b2.x = pnt_top_b2.x + Sbrd_DX        pnt_top_b2.z = pnt_top_b2.z + Sbrd_FR
      pnt_top_b3 = base_3   pnt_top_b3.x = pnt_top_b3.x + Sbrd_DX        pnt_top_b3.z = pnt_top_b3.z - Sbrd_RT

      //Luca 20/04/2021
      if( VAR_TipoTop == 23 )
      {
         if( PosX_SteelPen == -1 )
         {
            pnt_top_b0 = base_0   pnt_top_b0.x = pnt_top_b0.x - OffX_SteelPen        pnt_top_b0.z = pnt_top_b0.z - Sbrd_RT
            pnt_top_b1 = base_1   pnt_top_b1.x = pnt_top_b1.x - OffX_SteelPen        pnt_top_b1.z = pnt_top_b1.z + Sbrd_FR
            pnt_top_b2 = base_2   pnt_top_b2.x = pnt_top_b2.x + Sbrd_DX        pnt_top_b2.z = pnt_top_b2.z + Sbrd_FR
            pnt_top_b3 = base_3   pnt_top_b3.x = pnt_top_b3.x + Sbrd_DX        pnt_top_b3.z = pnt_top_b3.z - Sbrd_RT
         }
         else
         {
            pnt_top_b0 = base_0   pnt_top_b0.x = pnt_top_b0.x - Sbrd_SX        pnt_top_b0.z = pnt_top_b0.z - Sbrd_RT
            pnt_top_b1 = base_1   pnt_top_b1.x = pnt_top_b1.x - Sbrd_SX        pnt_top_b1.z = pnt_top_b1.z + Sbrd_FR
            pnt_top_b2 = base_2   pnt_top_b2.x = pnt_top_b2.x + OffX_SteelPen  pnt_top_b2.z = pnt_top_b2.z + Sbrd_FR
            pnt_top_b3 = base_3   pnt_top_b3.x = pnt_top_b3.x + OffX_SteelPen  pnt_top_b3.z = pnt_top_b3.z - Sbrd_RT
         }
      }

      //definisco i punti laterali del sottotop compresi di rientri
      pnt_stop_b0 = base_0   pnt_stop_b0.x = pnt_stop_b0.x - Sbrd_ST_SX        pnt_stop_b0.z = pnt_stop_b0.z - Sbrd_ST_RT
      pnt_stop_b1 = base_1   pnt_stop_b1.x = pnt_stop_b1.x - Sbrd_ST_SX        pnt_stop_b1.z = pnt_stop_b1.z + Sbrd_ST_FR
      pnt_stop_b2 = base_2   pnt_stop_b2.x = pnt_stop_b2.x + Sbrd_ST_DX        pnt_stop_b2.z = pnt_stop_b2.z + Sbrd_ST_FR
      pnt_stop_b3 = base_3   pnt_stop_b3.x = pnt_stop_b3.x + Sbrd_ST_DX        pnt_stop_b3.z = pnt_stop_b3.z - Sbrd_ST_RT

      if( DividiSottoTop==1 )
      {
         pnt_stop_b2.x = pnt_stop_b2.x + Sbrd_ST2_DX
         pnt_stop_b3.x = pnt_stop_b3.x + Sbrd_ST2_DX
      }

      pnt_top_cnr = pnt_top_b0          pnt_top_cnr.x = pnt_top_cnr.x + (pnt_top_b3.x - pnt_top_b0.x)/2

      //punti e lettere bordi per stampa
      pnt_stp_letter_rt = pnt_top_b0    pnt_stp_letter_rt.x = pnt_stp_letter_rt.x + Xt/2  pnt_stp_letter_rt.z = pnt_stp_letter_rt.z - 10
      pnt_stp_letter_sx = pnt_top_b0    pnt_stp_letter_sx.x = pnt_stp_letter_sx.x - 10    pnt_stp_letter_sx.z = pnt_stp_letter_sx.z + Zt/2
      pnt_stp_letter_dx = pnt_top_b3    pnt_stp_letter_dx.x = pnt_stp_letter_dx.x + 10    pnt_stp_letter_dx.z = pnt_stp_letter_dx.z + Zt/2
      pnt_stp_letter_fr = pnt_top_b1    pnt_stp_letter_fr.x = pnt_stp_letter_fr.x + Xt/2  pnt_stp_letter_fr.z = pnt_stp_letter_fr.z + 10

      punto_alz_sx     = pnt_top_b0     punto_alz_sx.y     = pnt_top_b0.y + SpessorePiano
      punto_alz_sx_fro = pnt_top_b1     punto_alz_sx_fro.y = pnt_top_b1.y + SpessorePiano
      if( idx_ffvic_sx >= 0)
      {
         punto_alz_sx.x = pnt_top_cnr.x + dist_ffvic_sx
         punto_alz_sx_fro.x = punto_alz_sx.x
      }

      punto_alz_dx     = pnt_top_b3     punto_alz_dx.y     = pnt_top_b3.y + SpessorePiano
      punto_alz_dx_fro = pnt_top_b2     punto_alz_dx_fro.y = pnt_top_b2.y + SpessorePiano
      if( idx_ffvic_dx >= 0)
      {
         punto_alz_dx.x = pnt_top_cnr.x + dist_ffvic_dx
         punto_alz_dx_fro.x = punto_alz_dx.x
      }

      base_so = base_0
      alto_ne = alto_2

      base_so = pnt_top_b0
      alto_ne = pnt_top_b2
      alto_ne.y = Yt

      vano_0_0 = pnt_top_b0
      vano_l_0 = Xt
      vano_p_0 = Zt
   }
   #include %path_bdm%\TLib\Orie.inc

   // } vai in testa

   Procedura OnQueryBdmLocal
   {
      if ( $query_type==2 )
      {
         $QueryResult__ = 0
         if( NOME($query_p1)=="LavaboKERA" ) { $QueryResult__ = 1 }

         //Luca 10/05/2021
         if( NOME($query_p1)=="LavaboGenerico" )
         {
            if( VAR_VAL_STR($query_p1,"TipoLavaboStr")  == "INBILICO" ) { $QueryResult__ = 1 }
            if( VAR_VAL_STR($query_p1,"TipoLavaboStr")  == "BASICA"   ) { $QueryResult__ = 1 }
            if( VAR_VAL_STR($query_p1,"TipoLavaboStr")  == "ELYSSA"   ) { $QueryResult__ = 1 }
         }
      }
   }
   //   if ( $query_type==1 )
   //   {
   //      if ( $M4_DragInfo_Mode==1 )
   //      {
   //         idx_att = ATTUALE()
   //         nome_att = NOME(idx_att)
   //         M4_snap = $M4_DragInfo_Snap
   //         M4_idx_muro = $M4_DragInfo_WallIdx
   //
   //         // livello in altezza
   //         //GOSUB posiz_teorico_top
   //
   //         // angolo del muro
   //         $wk_res = GET_INF_MURO(3,M4_idx_muro)
   //         $P1 = $muro_pt1
   //         $P2 = $muro_pt2
   //         GOSUB calcola_ang_y_3
   //
   //         $query_p1 = M4_snap
   //         $query_p2 = $wk_ang_y_3
   //
   //         $QueryResult__ = 1
   //      }
   //   }
   //}

   Procedura OnTabEredita
   {
      if( TABER_REGOLA == "POST")
      {
         if( FLAG_ConVascheTermoformate == 1)
         {
            wk_gest_c074 = VAR_VAL_STR( ATTUALE(), "GEST_C074")
            if( wk_gest_c074 == "VT002"
              | wk_gest_c074 == "VT003" ) { VT_TipoVasca = 1 }

            if( wk_gest_c074 == "VT005"
              | wk_gest_c074 == "VT008" ) { VT_TipoVasca = 2 }

            if( wk_gest_c074 == "VT004"
              | wk_gest_c074 == "VT007" ) { VT_TipoVasca = 3 }

            if( wk_gest_c074 == "VT006" ) { VT_TipoVasca = 4 }

            if( Cucina_Versione > 2)
            {
               VT_NumVasche = SE_NUM( Is_In_StrArray( wk_gest_c074, "VT003;VT007;VT008", ";") == 1, 2, 1)
            }

            //COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " | DEBUG ---- OnTabPost --> VT_TipoVasca=",STR(VT_TipoVasca)))
         }
      }
   }

   Controlli
   {
      GOSUB CtrlComune

      //in stesura salvo idx riferimenti
      if ( ID_Sin>=0 ) { idx_rif_steso_sx = ID_Sin }
      if ( ID_Des>=0 ) { idx_rif_steso_dx = ID_Des }

      GOSUB Trova_idx_basi_sotto

      //trovo top vicini
      GOSUB Trova_TopVic_SXDX
      GOSUB Trova_FFVic_UP

      GOSUB Trova_PenisioleAppoggio
      //setto i bordi
      //GOSUB Setta_Bordi_Top

      //Luca 22/07/2019
      GOSUB Ctrl_TopFusion_2P0

      //Luca 05/07/2021
      RaggioInterno_Fusion = 0
      if( FLAG_TopFusion == 2 )
      {
         if( IS_MATCH( VAR_TipoTopStr , "VETRO*" )
           | IS_MATCH( VAR_TipoTopStr , "XGLASS*" ) )  { RaggioInterno_Fusion = 8 }

         if( VAR_TipoTopStr == "QUARZO_12" )           { RaggioInterno_Fusion = 4 }
         if( IS_MATCH( VAR_TipoTopStr , "ACCIAIO*" ) ) { RaggioInterno_Fusion = 3 }
      }

      GOSUB Ctrl_CheckAccostoMuro_2P0

      GOSUB Ctrl_VascheTermoformate

      //Luca 24/02/2022
      if( ACTION() <= 0 | ACTION() == 2 | COMPONENDO() | $OnLoadOrder==1 )  { EXITSUB() }

      CRS_lista_var = "VT_NumVasche;VT_TipoVascaStr;Sbrd_SX;Sbrd_DX;Sbrd_RT;Sbrd_FR"
      CRS_lista_var = STRCAT(CRS_lista_var,"Sbrd_ST_SX;Sbrd_ST_DX;Sbrd_ST_RT;Sbrd_ST_FR" )
      CRS_lista_var = STRCAT(CRS_lista_var,"Sbrd_ST2_SX;Sbrd_ST2_DX;Sbrd_ST2_RT;Sbrd_S2T_FR" )
      GOSUB CheckRigeneraScasso
      if( CRS_Result == 1 )  { RigeneraScasso = 1 }

      //rigenera scasso manuale
      if( RigeneraScasso == 1)
      {
         if( IS_VAR_FIXED(ATTUALE(),"RigeneraScasso")==1 ) { DEL_VAR_MODIFICATE(ATTUALE(),"RigeneraScasso") }
         RigeneraScasso = 0

         WITH_ALIAS("wk_scassi","M4_SCASSA")
         WITH_ALIAS("wk_scassi2","M4_SCASSANTE")
         if( wk_scassi > 0 | wk_scassi2 > 0  )
         {
            $wk_EliminaScassi_da_idx = GetTopLevel(ATTUALE())
            GOSUB EliminaScassi
            COMANDO(STRCAT("PROCEDURA M4_Scassi // Scassa_e_Taglia [1] da Top_2P0"))
         }
      }
   }

   Procedura CalcolaVolume
   {
      VOLUME = CalcolaVolume(ATTUALE())
   }

   Procedura Stendi
   {
      //se la selezione è errata non passo la seconda volta
      if( VAR_VAL(ATTUALE(),"delme")==1 ) { EXIT() }

      stesi_mode_sx=$stesi_mode_sx
      stesi_mode_dx=$stesi_mode_dx

      // -1 se != $stesi_Elemento
      if( stesi_mode_sx == $stesi_Elemento ) { stesi_idx_sx_loc = $stesi_idx_sx }
      else                                   { stesi_idx_sx_loc = -1 }
      if( stesi_mode_dx == $stesi_Elemento ) { stesi_idx_dx_loc = $stesi_idx_dx }
      else                                   { stesi_idx_dx_loc = -1 }

      //gia_steso = 0
      //if( gia_steso==0 ) { GOSUB Top_stendi_2P0  }
      GOSUB Top_stendi_2P0
   }

   Procedura Notifica
   {
      if( VAR_VAL(ATTUALE(),"delme")==1 )
      {
         if( delme==2 ) { EXIT() }
         COMANDO(STRCAT("DELETE3 ",STR(idx_att)," //Notifica ",NOME(ATTUALE())))
         EXIT()
      }

      GOSUB Notifica_Top_2P0
   }

   Gestionale
   {
      GOSUB GestComune

      if( NO_GEST==1 )
      {
         FLAG_RADICE = $NO_RAD
         SET_GEST_STATO(ATTUALE(),7,1)

         GOSUB GestComune_Post
         EXIT()
      }

      //Luca 23/10/2019 top cliente
      if( VAR_TipoTop==99 )
      {
         FLAG_RADICE = $NO_RAD
         GOSUB Stato_7
         DescEdit__ = MSG(1012)

         GOSUB GestComune_Post
         EXITSUB()
      }

      //GEST_X = X_Tot
      GEST_X = Xt
      GEST_Y = Yt
      GEST_Z = Zt

      if( IS_VAR_FIXED( ATTUALE(), "RADICE") == 0
        & IS_VAR_FIXED( ATTUALE(), "GEST_CODICE") == 0 )
      {
         GEST_CODICE = ""
         RADICE      = passa_RadTop

         if( Cucina_Versione > 2
           & FLAG_ConVascheTermoformate >0)
         {
            RADICE      = ""
            GEST_CODICE = "T04078"
         }
      }

      // 19/04/21 - per evitare che la misura della Xt sia troppo grande in fase di inserimento, altrimenti
      // la ricerca per radice non funziona
      if( GEST_X > LungMaxTop
        & ( ACTION() <= 0
          | ACTION() == 2
          | $OnLoadOrder == 1 )) { GEST_X = LungMaxTop }

//DEBUG      if( ACTION() == 2 & CMD() == 0 )
//DEBUG      {
//DEBUG         A2_RADICE = RADICE
//DEBUG         A2_GEST_X = GEST_X
//DEBUG         A2_GEST_Y = GEST_Y
//DEBUG         A2_GEST_Z = GEST_Z
//DEBUG      }

      GOSUB Set_Gest_C008_Top

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura CtrlStatici
   {
      GOSUB CtrlStatici_Top_2P0
   }

   Procedura cancella
   {
      if( $StartingDel__!=ATTUALE() ) { EXITSUB() }

      if( IS_IDX(idx_topvic_sx)==1 ) { COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_topvic_sx)," no_agganciati //Cancella TOP")) }
      if( IS_IDX(idx_topvic_dx)==1 ) { COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_topvic_dx)," no_agganciati //Cancella TOP")) }

      //Ricalcolo basi sottostanti
      BOX_MODE(0)
      NEAR( "wk_basi_dn", idx_near_dn, 1, 0, "ScoccaT_B*")
      wk_base_num = 1
      while( wk_base_num <= wk_basi_dn )
      {
         COMANDO( STRCAT( "RICALCOLA_UNA ",STR(wk_basi_dn[wk_base_num])," no_agganciate //Notifica Top"))

         wk_base_num = wk_base_num + 1
      }
   }

// Posiziona Blocco Ing
// {
//    GOSUB posa_blocco
//    @c_rivestimento = [120,120,255]
//    @f_rivestimento = "0.9"
//    //@Y = 19
// }
//
// Posiziona Blocco Ingcdb
// {
//    GOSUB posa_blocco
//    @base_0.x = base_0.x - Sbrd_SX
//    @base_0.z = base_0.z - Sbrd_RT
//    @X = Xt
//    @Z = Zt
//    @c_rivestimento = [255,120,255]
//    @f_rivestimento = "0.9"
//    @base_0.y = base_0.y + 19
//    @Y = 19
// }
//
// Posiziona Blocco Ingcdb
// {
//    GOSUB posa_blocco
//    @base_0.x = base_0.x - Sbrd_ST_SX
//    @base_0.z = base_0.z - Sbrd_ST_RT
//    @X = X
//    @Z = Z
//
//    @X = X_SottoTop_Tot
//    @Z = Z_SottoTop_Tot
//
//    @c_rivestimento = [255,120,255]
//    @f_rivestimento = "0.9"
//    @base_0.y = base_0.y + 19
//    @Y = 19
// }

// } vai in testa

    //_top_generico -> contenitore
   Posiziona Top_generico_2P0  topgen
   {
      @escluso = SE_NUM(VAR_TipoTop==99,1,0)

      //Luca 13/12/2019
      if( VAR_VAL(idx_att,"delme") )  { @escluso = 1 }

      @base_0.x = base_0.x - Sbrd_SX
      @base_0.y = base_0.y
      @base_0.z = base_0.z - Sbrd_RT
      @X = Xt
      @Y = SpessorePiano
      @Z = Zt

      if( TopUnico==1 )
      {
         @base_0.y = base_0.y - SpessoreSottoPiano
         @Y = Yt
      }

      //[ 19/04/21 - Gestione per TOP STEEL PENISOLA
      // sempre a filo fianco
      if( VAR_TipoTop == 23 )
      {
         if( PosX_SteelPen == -1 )  { @base_0.x = base_0.x }

         //Luca 20/04/2021 se top unico
         @base_0.y = base_0.y
         @Y = SpessorePiano
      }
      //] 19/04/21 - Gestione per TOP STEEL PENISOLA


      @SpessorePiano = SpessorePiano
      @FLAG_TopIsola = FLAG_TopIsola

      idx_blc = ATTUALE()
      idx_top_generico = ATTUALE()

      //leggo eventuale figlio grafico
      if ( VAR_EXIST(ATTUALE(),"idx_top_generico") )
      {
         if ( IS_IDX(@idx_top_generico) )
         {
            idx_top_generico = @idx_top_generico
            idx_blc = @idx_top_generico
         }
      }

      @passa_CodTop = passa_CodTop

      @RaggioInterno = RaggioInterno_Fusion

      idx_pann_top = ATTUALE()
   }

   //[ LP 19/04/21 - Gestione per TOP STEEL PENISOLA
   // Per Top Steel Penisola (solo per la parte di penisola)
//   Posiziona Blocco cn_STE
   Posiziona _cont_per_near_SteelPen cn_STE
   {
      // idx_cnear_STEELPEN = ATTUALE()
      @escluso = 1
      @Y = 80
      @X = OffX_SteelPen
      @Z = Z

      @base_0 = base_0
      @base_0.y = alto_0.y - @Y

      if( VAR_TipoTop == 23 )
      {
         @escluso = 0

         if( PosX_SteelPen == -1 )  { @base_0.x = base_0.x - OffX_SteelPen }
         else                       { @base_0.x = base_3.x }
      }

      @c_rivestimento = [255, 255, 0]
   }
   //] LP 19/04/21 - Gestione per TOP STEEL PENISOLA


   //Luca 28/07/2020
   //per fusion sagomati
   Posiziona _cont_per_near_sx cn_FSN
   {
      idx_cnear_FUSION = ATTUALE()
      @escluso = 1

      @base_0 = base_0

      if( FLAG_TopFusion != 2 ) { EXITSUB() }

      if( VAR_EXIST(idx_att,"FSN_ScsX")==0 ) { EXITSUB() }

      @escluso = 0
      @Y = SpessorePiano

      if( TopUnico==1 )
      {
         @base_0.y = base_0.y - SpessoreSottoPiano
         @Y = Yt
      }

      @X = X - FSN_ScsX
      @Z = FSN_ScsZ

      if( FSN_ScsPos=="RS" | FSN_ScsPos=="FS" ) { @base_0.x = base_0.x + FSN_ScsX }
      if( FSN_ScsPos=="FS" | FSN_ScsPos=="FD" ) { @base_0.z = base_0.z + (Z - FSN_ScsZ) }

   }


   Posiziona Blocco topcli
   {
      @escluso = SE_NUM(VAR_TipoTop==99,0,1)

      //Luca 11/02/2020 debug, solo TEC
      if( HideTOP==1 ) { @escluso = 1 }

      @base_0.x = base_0.x - Sbrd_SX
      @base_0.y = base_0.y
      @base_0.z = base_0.z - Sbrd_RT
      @X = Xt
      @Y = SpessorePiano
      @Z = Zt

      @c_rivestimento = [200,200,200]
      @f_rivestimento = "0.9"
   }

   Posiziona Blocco MasMTsx
   {
      @escluso = 1
      if( Con_MasMT_SX==1 ) { @escluso = 0 }

      @base_0.x = base_0.x - Sbrd_ST_SX - 23
      @base_0.y = base_0.y - SpessoreSottoPiano
      @base_0.z = base_0.z - Sbrd_ST_RT

      @X = 23
      @Y = SpessoreSottoPiano
      @Z = Z_SottoTop

      FIN_var = "C028"
      GOSUB rivestimento

      @NoPrint_StpTop = 1
   }

   Posiziona Blocco MasMTdx
   {
      @escluso = 1
      if( Con_MasMT_DX==1 ) { @escluso = 0 }

      @base_0.x = base_0.x - Sbrd_ST_SX + X_SottoTop
      @base_0.y = base_0.y - SpessoreSottoPiano
      @base_0.z = base_0.z - Sbrd_ST_RT

      @X = 23
      @Y = SpessoreSottoPiano
      @Z = Z_SottoTop
      GOSUB rivestimento

      @NoPrint_StpTop = 1
   }

   Posiziona SottoTop_generico stop
   {
      @escluso = 0
      if( EscSottotop==1 | TopUnico==1 ) { @escluso = 1 }

      @base_0.x = base_0.x - Sbrd_ST_SX
      @base_0.y = base_0.y - SpessoreSottoPiano
      @base_0.z = base_0.z - Sbrd_ST_RT

      if( DividiSottoTop==2 ) { @base_0.z = base_0.z + Z - Z_SottoTop - Sbrd_ST_RT }

      @X = X_SottoTop
      @Y = SpessoreSottoPiano
      @Z = Z_SottoTop

      idx_pann_stop = ATTUALE()
   }

   Posiziona SottoTop_generico stop2
   {
      @escluso = 1
      if( DividiSottoTop > 0 ) { @escluso = 0 }

      //Luca 30/07/2019
      if( EscSottotop==1 )     { @escluso = 1 }

      if( TopUnico==1 ) { @escluso = 1 }

      @base_0.x = base_0.x - Sbrd_ST2_SX
      @base_0.y = base_0.y - SpessoreSottoPiano
      @base_0.z = base_0.z - Sbrd_ST2_RT
      @ang_y = 0

      @X = X_SottoTop2
      @Y = SpessoreSottoPiano
      @Z = Z_SottoTop2

      //divido in Z
      if( DividiSottoTop==2 )
      {
         @ang_y = 180
         @base_0.x = base_0.x + X - Sbrd_ST2_SX
         @base_0.z = base_0.z + Z_SottoTop2
      }

      idx_pann_stop2 = ATTUALE()
   }

   //{ VASCHE TERMOFORMATE
   Posiziona VascaTermoformata vas1
   {
      @escluso = 1
      if( FLAG_ConVascheTermoformate==1 ) { @escluso = 0 }

      @base_0.x = base_0.x + X/2 - @X/2
      @base_0.y = alto_0.y - @Y
      wk_offz_1 = @OffsetZ + @Z - 1
      @base_0.z = base_0.z + Zt - wk_offz_1

      @idx_base_ref = VT_idxBase_V1

      if( VT_NumVasche==2 )  { @base_0.x = base_0.x + X/4 - @X/2 }

      if( VT_PosBase_V1>0 )
      {
         //aggiorno posizione al volo
         if( IS_VAR_FIXED(ATTUALE(),"OffsetX")==0 & IS_IDX(VT_idxBase_V1)==1 )
         {
            @OffsetX = VAR_VAL(VT_idxBase_V1,"X")/2 - @X/2
         }

         @base_0.x = base_0.x + VT_OffsetX_V1 + @OffsetX
      }

      @VT_IndVasca = 1

      VT_idxVasc_V1 = ATTUALE()
   }

   Posiziona VascaTermoformata vas2
   {
      @escluso = 1
      if( FLAG_ConVascheTermoformate==1 & VT_NumVasche==2 ) { @escluso = 0 }

      @base_0.x = base_0.x + X/2 + X/4 - @X/2
      @base_0.y = alto_0.y - @Y
      //@base_0.z = base_0.z + Z/2 - @Z/2
      wk_offz_2 = @OffsetZ + @Z - 1
      @base_0.z = base_0.z + Zt - wk_offz_2

      //@OffsetX      = VT_OffsetX_V2
      //@OffsetZ      = VT_OffsetZ_V2
      @idx_base_ref = VT_idxBase_V2

      if( VT_PosBase_V1>0 )
      {
         //aggiorno posizione al volo
         if( IS_VAR_FIXED(ATTUALE(),"OffsetX")==0 & IS_IDX(VT_idxBase_V2)==1 )
         {
            @OffsetX = VAR_VAL(VT_idxBase_V2,"X")/2 - @X/2
         }

         @base_0.x = base_0.x + VT_OffsetX_V2 + @OffsetX
      }

      @VT_IndVasca = 2
      VT_idxVasc_V2 = ATTUALE()
   }
   //} VASCHE TERMOFORMATE

   //Posiziona Blocco nsx
   Posiziona _cont_per_near_sx nsx
   {
      idx_near_sx=ATTUALE()
      @base_0.x = base_0.x + 3
      @base_0.y = alto_0.y - 10 - SpessorePiano
      @base_0.z = base_0.z
      @X = 20
      @Y = SpessorePiano + 10
      @Z = Z
   }

   //Posiziona Blocco ndx
   Posiziona _cont_per_near_dx ndx
   {
      idx_near_dx=ATTUALE()
      //@base_0.x = base_3.x - 20
      @base_0.x = base_3.x - 23
      @base_0.y = alto_0.y - 10 - SpessorePiano
      @base_0.z = base_0.z

      @X = 20
      @Y = SpessorePiano + 10
      @Z = Z
   }

   Posiziona _cont_per_near_sx nfsx
   {
      idx_near_fsx=ATTUALE()
      //Luca 09/10/2020
      //@base_0.x = base_0.x + 15
      @base_0.x = base_0.x + 21
      @base_0.y = alto_0.y - 10 - SpessorePiano
      @base_0.z = base_0.z + Z + 30
      @X = 300
      @Y = SpessorePiano + 10
      @Z = 20
   }

   Posiziona _cont_per_near_dx nfdx
   {
      idx_near_fdx=ATTUALE()
      //Luca 09/10/2020
      //@base_0.x = base_3.x - 15 - 300
      @base_0.x = base_3.x - 21 - 300
      @base_0.y = alto_0.y - 10 - SpessorePiano
      @base_0.z = base_0.z + Z + 30
      @X = 300
      @Y = SpessorePiano + 10
      @Z = 20
   }

   //per fare near SOTTO
   Posiziona _cont_per_near_dn ndn
   {
      idx_near_dn=ATTUALE()
      @base_0.y = base_0.y-20
      @base_0.x = base_0.x+1
      @base_0.z = base_0.z+1
      @X=Xt-2 @Y=20 @Z=Z-2
   }

   //per fare near SOPRA
   Posiziona _cont_per_near_up nup
   {
      idx_near_up=ATTUALE()

      @base_0.y = base_0.y+Y-1
      @base_0.x = base_0.x+1
      @base_0.z = base_0.z+1

      @X=Xt-2 @Y=100 @Z=Z-2
   }

   Posiziona _cont_per_near nsc_sx
   {
      idx_near_SNACK_sx = ATTUALE()
      @base_0.x = base_0.x - 20
      @base_0.y = base_0.y - SpessoreSottoPiano
      @base_0.z = base_0.z + 20
      @X = 40
      @Y = 50
      @Z = Z - 40
   }

   Posiziona _cont_per_near nsc_dx
   {
      idx_near_SNACK_dx = ATTUALE()
      @base_0.x = base_0.x + X - 20
      @base_0.y = base_0.y - SpessoreSottoPiano
      @base_0.z = base_0.z + 20
      @X = 40
      @Y = 50
      @Z = Z - 40
   }
}

Elemento Top_generico_2P0
{
   Descrizione = "Super top"
   Code        = TOP
   Gruppo      = ""
   Tipo = Contenitore
   Forma = ""
   Alias TopM4

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X                            "Larghezza"                  1000   ShowAlways
      //ShowAlways
      Y                            "Spessore"                   30     ShowAlways
      Z                            "Profondità"                 600    ShowAlways

      VAR_TipoTop                  ""                           0      Implicit
      VAR_TipoTopStr               ""                           ""     Implicit

      TopUnico                     ""                           0      Implicit

      Sbrd_ST_SX                   "sbordo sottotop sx "        0
      Sbrd_ST_DX                   "sbordo sottotop dx "        0
      Sbrd_ST_FR                   "sbordo sottotop frontale"   0
      Sbrd_ST_RT                   "sbordo sottotop retro"      0

      X_SottoTop                   ""                           0      Implicit
      Y_SottoTop                   ""                           19     Implicit
      Z_SottoTop                   ""                           0      Implicit

      DividiSottoTop               ""                           0      Implicit
      Sbrd_ST2_SX                  ""                           0      Implicit
      Sbrd_ST2_DX                  ""                           0      Implicit
      Sbrd_ST2_FR                  ""                           0      //Implicit
      Sbrd_ST2_RT                  ""                           0      //Implicit
      X_SottoTop2                  ""                           0      Implicit
      Z_SottoTop2                  ""                           0      Implicit

      Smusso_FS                    "Smusso TOP fronte sx"       0      Implicit
      Smusso_FD                    "Smusso TOP fronte dx"       0      Implicit
      Smusso_RS                    "Smusso TOP retro sx"        0      Implicit
      Smusso_RD                    "Smusso TOP retro dx"        0      Implicit

      passa_CodTop                 ""                           ""
      GEST_CODICE                  ""                           ""

      SpessorePiano                ""                           40     Implicit
      SpessoreSottoPiano           ""                           19     Implicit

      FLAG_TopIsolaisola           ""                           0

      FLAG_TopFusion               ""                           0      Implicit
      FSN_ScsPos                   ""                           ""     Implicit
      FSN_ScsX                     ""                           0      Implicit
      FSN_ScsZ                     ""                           0      Implicit
      FSN_Scs_ST_X                 ""                           0      Implicit
      FSN_Scs_ST_Z                 ""                           0      Implicit

      FLAG_ConVascheTermoformate   ""                           0      Implicit

      HideTOP                      "Nascondi Top"               0      Implicit

      Scassa_Chi_Plus_RaggioInt    ""                           ""     Implicit

      alias_plus                   ""                           ""

      FIN_var                      ""                           "C028"
      FIN_orie                     ""                           "O"

      COD_EREDITA                  ""                           "POST"

      XGLASS                       "Num. XGLASS"                ""     Utente   (   )
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Stato_8

      if ( alias_plus != "" ) { kk=ALIAS_PLUS(ATTUALE(),1) }

      idx_pdr = PADRE(ATTUALE(),1)

      SET_#(idx_pdr)

      Sbrd_ST_SX  = #Sbrd_SX*(-1) + #Sbrd_ST_SX
      Sbrd_ST_DX  = #Sbrd_DX*(-1) + #Sbrd_ST_DX
      Sbrd_ST_FR  = #Sbrd_FR*(-1) + #Sbrd_ST_FR
      Sbrd_ST_RT  = #Sbrd_RT*(-1) + #Sbrd_ST_RT

      Sbrd_ST2_FR = Sbrd_ST_FR
      Sbrd_ST2_RT = Sbrd_ST_RT

      GOSUB Setta_Dimensioni_SottoTop_2P0

      //Luca 24/07/2019
      //*** FUSION **
      FSN_scassox_top = FSN_ScsX
      FSN_scassoz_top = FSN_ScsZ

      if( RIGHT(FSN_ScsPos,1)=="D" ) { FSN_scassox_top = FSN_ScsX + VAR_VAL(idx_pdr,"aa_sbrd_dx") }
      if( RIGHT(FSN_ScsPos,1)=="S" ) { FSN_scassox_top = FSN_ScsX + VAR_VAL(idx_pdr,"aa_sbrd_sx") }

      //FSN_scassox_stop = FSN_ScsX
      //FSN_scassoz_stop = FSN_ScsZ

      FSN_scassox_stop = FSN_Scs_ST_X
      FSN_scassoz_stop = FSN_Scs_ST_Z

      //if( RIGHT(FSN_ScsPos,1)=="D" ) { FSN_scassox_stop = FSN_ScsX - VAR_VAL(idx_pdr,"aa_st_rie_dx") }
      //if( RIGHT(FSN_ScsPos,1)=="S" ) { FSN_scassox_stop = FSN_ScsX - VAR_VAL(idx_pdr,"aa_st_rie_sx") }
      //*** FUSION ***

      //Luca 03/05/2019
      Var_NoSottoTop = VAR_VAL(idx_pdr,"EscSottotop")

      if( TopUnico==1 | Var_NoSottoTop==1 )
      {
         VAR_SET_MODE(ATTUALE(),"X",$MODE_SHOWALWAYS)
      }
      else
      {
         if( VAR_VAL(ATTUALE(),"ORD_XMAX")>0 ) { VAR_SET_MENU(ATTUALE(),"X",STRCAT("( 10-",STR(ORD_XMAX), ")")) }
      }

      //Luca 06/05/2020
      if( FLAG_ConVascheTermoformate ) { FIN_var = "C079" }

      grafica_archetipo = "_top_grafica_M4"
      if( VAR_TipoTop != 23
        & ( Smusso_FS > 0
          | Smusso_FD > 0
          | Smusso_RS > 0
          | Smusso_RD > 0)) { grafica_archetipo = "BloccoSmussatoY" }
   }

   PuntiNotevoli
   {
      GOSUB punti

      vano_0_0 = base_0
      vano_l_0 = X
      vano_p_0 = Z

      pnt_sx  = [base_0.x,base_0.y,base_0.z]
      pnt_sx1 = [base_1.x,base_0.y,base_1.z]

      pnt_dx  = [base_3.x,base_0.y,base_0.z]
      pnt_sx_fro = pnt_sx
      pnt_sx_fro.z = base_1.z
      pnt_dx_fro = pnt_dx
      pnt_dx_fro.z = base_1.z

      pnt_sx_frobl = pnt_sx_fro
      pnt_dx_frobl = pnt_dx_fro
   }

   Controlli
   {
      GOSUB CtrlComune
   }

   Procedura OnTabEredita
   {
      if( TABER_REGOLA=="POST" )
      {
         if( FLAG_ConVascheTermoformate == 1 )
         {
            if( IS_VAR_FIXED(ATTUALE(),"GEST_C074") )
            {
               DEL_VAR_MODIFICATE(ATTUALE(),"GEST_C074")
               GEST_C074 = VAR_VAL_STR(PADRE(ATTUALE(),1),"GEST_C074")
            }
         }
      }
   }

   Gestionale
   {
      GOSUB GestComune

      //riduzioni gestionali dovute a tagli
      //GEST_X = X
      GEST_X = X
      //i codici le radici hanno sp 10 o 20
      GEST_Y = SpessorePiano
      // lo spessore del piano deve essere quello effettivo del materiale ripristino valore gestionale
      GEST_Z = Z

      GEST_CODICE = passa_CodTop

      FLAG_RADICE = $FLAG_STANDARD + $NORID_X + $NORID_Y + $NORID_Z

      ////per evitare ricalcoli,riassegno descedit(radice dipende dal materiale che viene settato in post config del padre)
      //DescEdit__ = STRCAT(VAR_VAL_STR(idx_att,"ORD_COD")," - ",VAR_VAL_STR(idx_att,"ORD_DES"))

      if( VAR_TipoTop == 23 )   { GEST_Y = 80 }

      GOSUB GestComune_Post
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }


   Posiziona %grafica_archetipo% graM4
   {
      @escluso = 0
      if( HideTOP == 1)                             { @escluso = 1 }
      if( X < 0.1 | Z < 0.1)                        { @escluso = 1 }
      if( FLAG_TopFusion == 2)                      { @escluso = 1 }

      if( $VIRTUO | $VIRTUO_TEST | $OnTREND)
      {
         if( IS_MATCH( VAR_TipoTopStr , "VETRO*")
           | IS_MATCH( VAR_TipoTopStr , "XGLASS*")) { @escluso = 1 }
      }

      if( @escluso == 0) { idx_top_generico = ATTUALE() }

      @X = X
      @Y = SpessorePiano
      @Z = Z

      @base_0 = base_0
      @base_0.y = base_0.y + Y - SpessorePiano

      @R0 = Smusso_RS
      @R1 = Smusso_FS
      @R2 = Smusso_FD
      @R3 = Smusso_RD

      GOSUB rivestimento
   }

   Posiziona VR_Vetro VV
   {
      @escluso = 1

      if( $VIRTUO | $VIRTUO_TEST | $OnTREND  )
      {
         if( IS_MATCH( VAR_TipoTopStr , "VETRO*" )
           | IS_MATCH( VAR_TipoTopStr , "XGLASS*" ) ) { @escluso = 0 }
      }

      if( FLAG_TopFusion==2 )   { @escluso = 1 }

      @base_0 = base_0
      @base_0.y = base_0.y + Y - SpessorePiano
      @X = X
      @Y = SpessorePiano
      @Z = Z

      @OrieVetro = "TOP"

      @FIN_var = FIN_var

      GOSUB rivestimento
   }


   Posiziona _graf_top_fusion gtf
   {
      @escluso = 1
      if( FLAG_TopFusion==2 )   { @escluso = 0 }

      //Luca 11/02/2020 debug, solo TEC
      if( HideTOP==1 ) { @escluso = 1 }

      @base_0 = base_0
      @base_0.y = base_0.y + Y - SpessorePiano

      @X = X
      @Y = SpessorePiano
      @Z = Z

      @FSN_ScsPos = FSN_ScsPos
      @FSN_ScsX   = FSN_scassox_top
      @FSN_ScsZ   = FSN_scassoz_top

      if ( @escluso == 0 ) { idx_top_generico = ATTUALE() }

      //if( IS_MATCH( VAR_TipoTopStr , "VETRO*" )
      //  | IS_MATCH( VAR_TipoTopStr , "XGLASS*" ) ) { @RaggiaTopVetro = 1 }

      ////Luca 30/06/2021
      //RaggioInterno = 0
      //if( IS_MATCH( VAR_TipoTopStr , "VETRO*" )
      //  | IS_MATCH( VAR_TipoTopStr , "XGLASS*" ) )  { RaggioInterno = 8 }
      //
      //if( VAR_TipoTopStr == "QUARZO_12" )           { RaggioInterno = 4 }
      //if( IS_MATCH( VAR_TipoTopStr , "ACCIAIO*" ) ) { RaggioInterno = 3 }

      @RaggioInterno = RaggioInterno


      GOSUB rivestimento
   }

   Posiziona ScassaRaggoIntFusion scsrag
   //Posiziona Blocco scsrag
   {
      @escluso = 1
      if( FLAG_TopFusion==2 )   { @escluso = 0 }

      //Luca 11/02/2020 debug, solo TEC
      if( HideTOP==1 ) { @escluso = 1 }

      if( RaggioInterno <= 0  ) { @escluso = 1 }

      @Raggio = RaggioInterno

      @X = RaggioInterno*2
      @Z = RaggioInterno*2

      @base_0 = base_0
      @base_0.y = base_0.y + Y - SpessorePiano - 10

      @FSN_ScsPos = FSN_ScsPos


      if( FSN_ScsPos=="FS" )
      {
         @base_0.x = base_0.x + FSN_scassox_top     - RaggioInterno
         @base_0.z = base_0.z + Z - FSN_scassoz_top - RaggioInterno
      }

      if( FSN_ScsPos=="FD" )
      {
         @base_0.x = base_0.x + X - FSN_scassox_top - RaggioInterno
         @base_0.z = base_0.z + Z - FSN_scassoz_top - RaggioInterno
      }

      if( FSN_ScsPos=="RS" )
      {
         @base_0.x = base_0.x + FSN_scassox_top - RaggioInterno
         @base_0.z = base_0.z + FSN_scassoz_top - RaggioInterno
      }

      if( FSN_ScsPos=="RD" )
      {
         @base_0.x = base_0.x + X - FSN_scassox_top - RaggioInterno
         @base_0.z = base_0.z + FSN_scassoz_top     - RaggioInterno
      }

      @Scassa_Chi_Plus = Scassa_Chi_Plus_RaggioInt
   }

   Posiziona Blocco stop
   {
      @escluso = 1
      if( TopUnico==1 )        { @escluso = 0 }
      if( FLAG_TopFusion==2 )  { @escluso = 1 }

      //Luca 11/02/2020 debug, solo TEC
      if( HideTOP==1 ) { @escluso = 1 }

      @base_0.x = base_0.x - Sbrd_ST_SX
      @base_0.y = base_0.y
      @base_0.z = base_0.z - Sbrd_ST_RT

      @X = X_SottoTop
      @Y = SpessoreSottoPiano
      @Z = Z_SottoTop

      if( DividiSottoTop==2 )
      {
         @Z = Z_SottoTop + Z_SottoTop2 + 40
      }

      if( VAR_TipoTopStr == "ACCIAIO_PEN_80" )
      {
         @base_0.y = base_0.y - SpessoreSottoPiano
      }

      //@tag_sx = tag_sx
      //@tag_dx = tag_dx
      //@ang_a_sx = ang_a_sx
      //@ang_a_dx = ang_a_dx
      //@Rid_dx=Rid_dx
      //@Rid_sx=Rid_sx

      @UsoSottoTop = 1

      //LZ 01/09/2021: scasso base frigo
      @pnt_sx_fro = pnt_sx_fro
      @pnt_dx_fro = pnt_dx_fro

      idx_pann_stop = ATTUALE()
      GOSUB rivestimento
   }

   //Luca 09/07/2020 mantis 22886: Top laminglass/fenix: gestione sottotop
   Posiziona Blocco stop2
   {
      @escluso = 1
      if( TopUnico==1
        & DividiSottoTop==1 ) { @escluso = 0 }

      if( FLAG_TopFusion==2 )  { @escluso = 1 }

      //Luca 11/02/2020 debug, solo TEC
      if( HideTOP==1 ) { @escluso = 1 }

      @base_0.x = base_0.x - Sbrd_ST2_SX - Sbrd_ST_SX
      @base_0.y = base_0.y
      @base_0.z = base_0.z - Sbrd_ST2_RT

      @X = X_SottoTop2
      @Y = SpessoreSottoPiano
      @Z = Z_SottoTop2

      //@tag_sx = tag_sx
      //@tag_dx = tag_dx
      //@ang_a_sx = ang_a_sx
      //@ang_a_dx = ang_a_dx
      //@Rid_dx=Rid_dx
      //@Rid_sx=Rid_sx

      @UsoSottoTop = 1

      //LZ 01/09/2021: scasso base frigo
      @pnt_sx_fro = pnt_sx_fro
      @pnt_dx_fro = pnt_dx_fro

      idx_pann_stop2 = ATTUALE()
      GOSUB rivestimento
   }

   Posiziona _graf_top_fusion gstf
   {
      @escluso = 1
      if( FLAG_TopFusion==2 & TopUnico==1 )   { @escluso = 0 }

      //Luca 11/02/2020 debug, solo TEC
      if( HideTOP==1 ) { @escluso = 1 }

      @base_0.x = base_0.x  - Sbrd_ST_SX
      @base_0.y = base_0.y
      @base_0.z = base_0.z  - Sbrd_ST_RT

      @X = X_SottoTop
      @Y = SpessoreSottoPiano
      @Z = Z_SottoTop

      @FSN_ScsPos = FSN_ScsPos
      @FSN_ScsX   = FSN_scassox_stop
      @FSN_ScsZ   = FSN_scassoz_stop

      @UsoSottoTop = 1

      if ( @escluso == 0 ) { idx_pann_stop = ATTUALE() }

      // @RaggioInterno = 0
      //if( IS_MATCH( VAR_TipoTopStr , "VETRO*" )
      //  | IS_MATCH( VAR_TipoTopStr , "XGLASS*" ) )  { @RaggioInterno = 8 }
      //
      //if( VAR_TipoTopStr == "QUARZO_12" )           { @RaggioInterno = 4 }
      //if( IS_MATCH( VAR_TipoTopStr , "ACCIAIO*" ) ) { @RaggioInterno = 3 }

      GOSUB rivestimento
   }
}

Elemento SottoTop_2P0
{
   Descrizione = "Top"
   Code        = TOP
   Gruppo      = "Piani"
   Tipo        = Contenitore
   Forma       = ""
   Alias BDM_Top;TSTP_NoQuota;StpTop

   Variabili
   {
      #include %path_bdm%\var_db.inc
      //#include %install_dir%\bdm\var_db.inc

      X    "(Lunghezza nominale)"  1000 ShowAlways
      Xt   "(Lunghezza totale)"    1000 ShowAlways

      Y    "(Spessore)"              19 ShowAlways

      Z    "(Profondità nominale)"  602 ShowAlways
      Zt   "(Profondità totale)"    602 ShowAlways

#ifdef TEC;AZI
      TOP_UTENTE "TOP UTENTE" 0 Boolean
#endif
#ifndef TEC;AZI
      TOP_UTENTE "TOP UTENTE" 0
#endif
      Sbrd_ST_SX  "Sbordo SOTTOTOP sx"                0 SaveAlways
      Sbrd_ST_DX  "Sbordo SOTTOTOP dx"                0 SaveAlways
      Sbrd_ST_FR  "Sbordo SOTTOTOP fronte"            0 SaveAlways
      Sbrd_ST_RT  "Sbordo SOTTOTOP retro"             0 SaveAlways

      X_SottoTop_Tot "" 0 SaveAlways
      Z_SottoTop_Tot "" 0 SaveAlways

      X_SottoTop     ""  0 SaveAlways
      Z_SottoTop     ""  0 SaveAlways

      SottoTopTraBasi  "" 0
      SpessoreTopCliente   "Spessore Top Cliente" 0 Utente ( 0-100 )

      ang_y "" 0
      HIDE "" 0

      //4manuale + 2selezione
      M4_DIALOG "" 6
      M4_A_MURO "" 1

      FLAG_TopIsola          "Top ISOLA"  0 SaveAlways

      COD_EREDITA "" "PRE;POST"

      no_collisione "" 1 //escludo collisioni

      Scassa_SottoTop  "" 0

      CMP2_AZIONI "" "M"

      perRADICE "" ""
      NO_GEST "" 0

      LungMaxTop "" 2700

      ID_Sin "" -1
      ID_Des "" -1

      //top in accosto a sx/dx
      idx_topvic_sx "" -1
      idx_topvic_dx "" -1

      idx_rif_steso_sx "" -1
      idx_rif_steso_dx "" -1

      idx_rif_steso_iso_sx "" -1
      idx_rif_steso_iso_dx "" -1


      idx_near_dn "" -1
      idx_near_up "" -1
      idx_near_sx "" -1
      idx_near_dx "" -1

      M4_MIS "" "Filler*;X*;Y*;Z*;SpessoreTopCliente"

      FillerM2G " " "" ShowAlways
   }

   Assegnazioni
   {
      GOSUB AssComune
      Cucina_Versione_Idx = SE_NUM( IS_IDX(idx_rif_steso_sx), idx_rif_steso_sx, idx_rif_steso_dx)
      GOSUB Cucina_Versione

      //M4_GRUPPO__ = "Piani"
      M4_GRUPPO__ = MSG(1004)
      //se draggato, diventa posizionato
      M4_CNT_LINK_MODE__ = 0

      //escludo collisioni
      no_collisione = 1

      if( $ATTIVA_DLL )
      {
         HIDE_ON_EDIT2(ATTUALE(),"SpessoreTopCliente",1)

         if( TOP_UTENTE==1 )
         {
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_SX" , $MODE_USER+$MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_DX" , $MODE_USER+$MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_FR" , $MODE_USER+$MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_RT" , $MODE_USER+$MODE_SAVEALWAYS)
         }
         else
         {
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_SX" , $MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_DX" , $MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_FR" , $MODE_SAVEALWAYS)
            VAR_SET_MODE(ATTUALE(), "Sbrd_ST_RT" , $MODE_SAVEALWAYS)

            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_ST_SX")==1 )     { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_ST_SX") }
            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_ST_DX")==1 )     { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_ST_DX") }
            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_ST_FR")==1 )     { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_ST_FR") }
            if( IS_VAR_FIXED(ATTUALE(),"Sbrd_ST_RT")==1 )     { DEL_VAR_MODIFICATE(ATTUALE(),"Sbrd_ST_RT") }
         }
      }
   }

   PuntiNotevoli
   {
      Yt = Y
      Xt = X + Sbrd_ST_SX + Sbrd_ST_DX
      Zt = Z + Sbrd_ST_RT + Sbrd_ST_FR

      GOSUB punti_Yt

      //Punti per stampe
      pnt_sx  = [base_0.x,base_0.y,base_0.z ]
      pnt_dx  = [base_3.x,base_0.y,base_0.z ]

      pnt_sx_fro = pnt_sx
      pnt_sx_fro.z = base_1.z
      pnt_dx_fro = pnt_dx
      pnt_dx_fro.z = base_1.z

      pnt_stop_b0 = base_0   pnt_stop_b0.x = pnt_stop_b0.x - Sbrd_ST_SX        pnt_stop_b0.z = pnt_stop_b0.z - Sbrd_ST_RT
      pnt_stop_b1 = base_1   pnt_stop_b1.x = pnt_stop_b1.x - Sbrd_ST_SX        pnt_stop_b1.z = pnt_stop_b1.z + Sbrd_ST_FR
      pnt_stop_b2 = base_2   pnt_stop_b2.x = pnt_stop_b2.x + Sbrd_ST_DX        pnt_stop_b2.z = pnt_stop_b2.z + Sbrd_ST_FR
      pnt_stop_b3 = base_3   pnt_stop_b3.x = pnt_stop_b3.x + Sbrd_ST_DX        pnt_stop_b3.z = pnt_stop_b3.z - Sbrd_ST_RT

      base_so = base_0
      alto_ne = alto_2
   }
   #include %path_bdm%\TLib\Orie.inc

   //Procedura OnQueryBdmLocal
   //{
   //   if ( $query_type==1 )
   //   {
   //      if ( $M4_DragInfo_Mode==1 )
   //      {
   //         idx_att = ATTUALE()
   //         nome_att = NOME(idx_att)
   //         M4_snap = $M4_DragInfo_Snap
   //         M4_idx_muro = $M4_DragInfo_WallIdx
   //
   //         // angolo del muro
   //         $wk_res = GET_INF_MURO(3,M4_idx_muro)
   //         $P1 = $muro_pt1
   //         $P2 = $muro_pt2
   //         GOSUB calcola_ang_y_3
   //
   //         $query_p1 = M4_snap
   //         $query_p2 = $wk_ang_y_3
   //
   //         $QueryResult__ = 1
   //      }
   //   }
   //}

   Controlli
   {
      GOSUB CtrlComune

      //in stesura salvo idx riferimenti
      if ( ID_Sin>=0 ) { idx_rif_steso_sx = ID_Sin }
      if ( ID_Des>=0 ) { idx_rif_steso_dx = ID_Des }

      GOSUB Trova_idx_basi_sotto

      //Luca 17/06/2019
      //verifico se sono un sottotop tra basi
      if( ACTION()>0 & COMPONENDO()==0 & ACTION()!=2 )
      {
         SottoTopTraBasi = 0
         BOX_MODE(0)
         NEAR("wk_bas_up",idx_near_up,1,0,"ScoccaT_Ba*")
         if( wk_bas_up>0 )  { SottoTopTraBasi = 1 }
      }

      //trovo tutti gli elementi da scassare
      if( ACTION()>0 & COMPONENDO()==0 )
      {
         if( VAR_EXIST(ATTUALE(),"Scassa_SottoTop_prec")==0 ) { Scassa_SottoTop_prec = Scassa_SottoTop }

         Scassa_SottoTop = 0
         //trovo l'idx da scassare
         COMPONENTI2("wk_bl",ATTUALE(),"*")
         i = 1
         while ( i<=wk_bl )
         {
            if( FORMA(wk_bl[i])!=$FORMA_CONTENITORE ) {  idx_da_scassare = wk_bl[i] }
            i = i + 1
         }

         BOX_MODE(0)
         NEAR_GLOBALE("wk_bl",ATTUALE(),5,1,"Cuc_Fondo")
         i = 1
         while ( i<=wk_bl )
         {
            if( UN_PADRE2(wk_bl[i],"FustoBaseLavello")
              & VAR_VAL(wk_bl[i],"VAR_FresataLav")==1 )
            {
               Scassa_SottoTop = 1
               VAR_VALUESTR_SET(wk_bl[i],"Scassa_Chi_Plus",STR(idx_da_scassare))
            }
            i = i + 1
         }

         if( Scassa_SottoTop!=Scassa_SottoTop_prec )
         {
            GOSUB EliminaScassi
            COMANDO("PROCEDURA M4_Scassi // Scassa_e_Taglia ")
            Scassa_SottoTop_prec = Scassa_SottoTop
         }
      }
   }

   Procedura Stendi
   {
      //se la selezione è errata non passo la seconda volta
      if( VAR_VAL(ATTUALE(),"delme")==1 ) { EXIT() }

      stesi_mode_sx=$stesi_mode_sx
      stesi_mode_dx=$stesi_mode_dx

      //-1 se != $stesi_Elemento
      if( stesi_mode_sx == $stesi_Elemento ) { stesi_idx_sx_loc = $stesi_idx_sx }
      else                                   { stesi_idx_sx_loc = -1 }
      if( stesi_mode_dx == $stesi_Elemento ) { stesi_idx_dx_loc = $stesi_idx_dx }
      else                                   { stesi_idx_dx_loc = -1 }

      //evito ricalcolo della PGDV (fatto in Notifica)
      NO_Ricalcola_PostGestDllValida = 1

      TaglioMaschioAMuro = 1

      gia_steso=0
      if( gia_steso==0 )
      {

         GOSUB Top_stendi_2P0
         //GOSUB SottoTop_stendi
      }
   }

   Gestionale
   {
      GOSUB GestComune

      GEST_CODICE = ""
      RADICE  = "STTOP"
      if( Cucina_Versione > 2 ) { RADICE = "STTOP3" }

      //Luca 09/03/2020
      GEST_X = Xt
      GEST_Z = Zt

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura Notifica
   {
      if( VAR_VAL(ATTUALE(),"delme")==1 )
      {
         COMANDO(STRCAT("DELETE3 ",STR(idx_att)," //Notifica ",NOME(ATTUALE())))
         EXIT()
      }

      GOSUB Notifica_Top_2P0
   }

   Procedura CtrlStatici
   {
      GOSUB CtrlStatici_Top_2P0
   }

   Posiziona SottoTop_generico stop
   {
      @escluso = 0

      //@base_0.x = base_0.x
      //@base_0.z = base_0.z

      @base_0.x = base_0.x - Sbrd_ST_SX
      @base_0.y = base_0.y
      @base_0.z = base_0.z - Sbrd_ST_RT

      @X = Xt
      @Y = Y
      @Z = Zt

      idx_pann_stop = ATTUALE()
   }

   Posiziona _cont_per_near_sx nsx
   {
      idx_near_sx=ATTUALE()
      @base_0.x = base_0.x + 15
      @base_0.y = alto_0.y - 12
      @base_0.z = base_0.z
      @X = 20
      @Y = 10
      @Z = Z
   }

   Posiziona _cont_per_near_dx ndx
   {
      idx_near_dx=ATTUALE()
      //rientro dello sbordo automatico:essendo variabile,non assicurava una situazioen stabile
      @base_0.x = base_3.x - 35
      @base_0.y = alto_0.y - 12
      @base_0.z = base_0.z

      @X = 20
      @Y = 10
      @Z = Z
   }

   //per fare near SOTTO
   Posiziona _cont_per_near_dn ndn
   {
      idx_near_dn=ATTUALE()
      @base_0.y = base_0.y-20
      @base_0.x = base_0.x+1
      @base_0.z = base_0.z+1
      @X=Xt-2 @Y=20 @Z=Z-2
   }

   //le basi hanno l'ingombro che comprende il sottotop
   //quindi per trovare solo le basi che stanno effettivamente sopra, il cont_per_near viene messo 2 mm più alto
   //per fare near SOPRA
   Posiziona _cont_per_near_up nup
   {
      idx_near_up=ATTUALE()

      @base_0.x = base_0.x + 1
      @base_0.y = alto_0.y + 2
      @base_0.z = base_0.z + 1

      @X=Xt-2 @Y=5 @Z=Z-2
   }
}
//} TOP 2.0

//Luca 20/12/2019
Elemento LavaboKERA
{
   Descrizione = "Lavabo KERA"
   Code        = CUB
   Gruppo      = "Lavabo"
   Tipo        = Contenitore
   Forma       = ""
   Alias       Kera
   Attrezzabile ScoccaT_BaseStandard Mensola_Air
   //Top_2P0

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X                          "Larghezza"                            500   Menu     (   LarLavKERA   )
      Y                          "Altezza"                              140
      Z                          "Profondità"                           560   Menu     (   PrfLavKERA   )

      idx_top                    ""                                     -1
      idx_bas                    ""                                     -1

      OffsetX                    "Offset X (sx base-sx foro)"           0     Utente   (   )
      OffsetZ                    "Offset Z (fronte base-fronte foro)"   0     Utente   (   )

      ScsTop_X                   ""                                     0
      ScsTop_Z                   ""                                     0

      ScsSTop_X                  ""                                     0
      ScsSTop_Z                  ""                                     0

      RigeneraScasso             "Rigenera Scasso"                      0     Boolean

      Scassa_Chi_Plus            ""                                     ""
      Scassa_Chi_Plus_SottoTop   ""                                     ""

      VediIngombro               ""                                     1
      VediIngScassi              ""                                     0

      VAR_Rubinetto              "Con foro rubinetto"                   0     Menu     (   SiNo         )
      Pos_Rubinetto              "Posizione foro rubinetto"             0     Menu     (   DXCNSX       )

      VAR_TipoTopStr             ""                                     ""

      REV_Pos_Rubinetto          "Revisione Pos foro rubinetto"         0     SaveAlways

      idx_cnear                  ""                                     -1

      FIN_var                    ""                                     "C028"

      M4_NO_OFFS                 ""                                     1

      M4_MIS                     ""                                     "Filler*;X;Y;Z;OffsetX;OffsetZ;VAR_Rubinetto;Pos_Rubinetto"

      HIDE                       ""                                     0
      CMP2_AZIONI                ""                                     "A"

      FillerM2G                  " "                                    ""    ShowAlways
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Cucina_Versione
      SetRevisioneElemento( ATTUALE(), "BDM_REV_Pos_Rubinetto_Kera", "REV_Pos_Rubinetto")

      Y_SottoPiano = 60

      if( $ATTIVA_DLL==1 )
      {
         VAR_SET_MODE(ATTUALE(),"X",$MODE_NONE)
         VAR_SET_MODE(ATTUALE(),"Z",$MODE_NONE)

         HIDE_ON_EDIT2(ATTUALE(),"OffsetZ",1)
         HIDE_ON_EDIT2(ATTUALE(),"VAR_Rubinetto",0)
         HIDE_ON_EDIT2(ATTUALE(),"Pos_Rubinetto",1 - VAR_Rubinetto)
      }

      if( UN_PADRE("Mensola_Air") )
      {
         off_x_max = VAR_VAL(PADRE(ATTUALE(),1),"X") - X - 101
         VAR_SET_MENU(ATTUALE(),"OffsetX",STRCAT("( 101-",STR(off_x_max)," )"))

         Stp_Quota_Foro = 1
      }

      FIN_var = GetFirstValidVarGest( ATTUALE(), "C028;C209")
   }

   PuntiNotevoli
   {
      GOSUB punti

      base_so = base_0  base_so.y = -21
      alto_ne = alto_2

      pnt_scs_centro = [X/2,0,Z/2]

      //Luca 03/12/2020
      pnt_stp_letter_sx = base_0
      pnt_stp_letter_sx.x = pnt_stp_letter_sx.x + 50
      pnt_stp_letter_sx.z = pnt_stp_letter_sx.z + Z/2

      pnt_scs_top_0  = [ X/2 - ScsTop_X/2  , 0 ,  Z/2 - ScsTop_Z/2  ]
      pnt_scs_top_1  = [ X/2 - ScsTop_X/2  , 0 ,  Z/2 + ScsTop_Z/2  ]
      pnt_scs_top_2  = [ X/2 + ScsTop_X/2  , 0 ,  Z/2 + ScsTop_Z/2  ]
      pnt_scs_top_3  = [ X/2 + ScsTop_X/2  , 0 ,  Z/2 - ScsTop_Z/2  ]

      pnt_scs_stop_0 = [ X/2 - ScsSTop_X/2 , 0 ,  Z/2 - ScsSTop_Z/2 ]
      pnt_scs_stop_1 = [ X/2 - ScsSTop_X/2 , 0 ,  Z/2 + ScsSTop_Z/2 ]
      pnt_scs_stop_2 = [ X/2 + ScsSTop_X/2 , 0 ,  Z/2 + ScsSTop_Z/2 ]
      pnt_scs_stop_3 = [ X/2 + ScsSTop_X/2 , 0 ,  Z/2 - ScsSTop_Z/2 ]

      //Luca 04/05/2021
      vano_0_0 = base_0
      vano_l_0 = X
      vano_p_0 = Z
   }
   #include %path_bdm%\TLib\Orie.inc

   //Blocco inserimento su top profondità < 440mm
   //TODO: mancano specifiche per limite in X
   Procedura OnQueryBdmLocal
   {
      if( $query_type == 8)
      {
         if( NOME($query_p1) == "ScoccaT_BaseStandard")
         {
            idx_top        = VAR_VAL( $query_p1, "idx_top")
            VAR_TipoTopStr = VAR_VAL_STR( idx_top, "VAR_TipoTopStr")

            wk_lim_X = 120
            if( VAR_TipoTopStr == "WILDWOOD_80")       { wk_lim_X = 80 }

            if( VAR_VAL($query_p1,"Zt")< 440
              | VAR_VAL($query_p1,"X") < X + wk_lim_X) { $QueryResult__ = 0 }

            // Su top sp.4 non si possono attrezzare lavelli\pc
            if( IS_MATCH( VAR_TipoTopStr , "*_4"))     { $QueryResult__ = 0 }
         }

         //Luca 06/12/2021 sul 552 non posso attrezzare
         if( NOME($query_p1) == "Mensola_Air")
         {
            if( VAR_VAL($query_p1,"X") < 736 )         { $QueryResult__ = 0 }

            //Simone 09/03/2022 - Permetto l'attrezzaggio di tutti i Kera se sono abilitate le staffe del depth (FLAG_LavaboKERA==1)
            if( VAR_VAL($query_p1,"FLAG_LavaboKERA") == 0)
            {
               if( VAR_VAL( $query_p1, "X") > 736
                 & VAR_VAL( $query_p1, "X") <= 920)
               {
                  $QueryResult__ = 0

                  if( X == 400 & Z == 400 )            { $QueryResult__ = 1 }
                  if( X == 500 & Z == 380 )            { $QueryResult__ = 1 }
               }
            }

            if( VAR_VAL($query_p1,"Z") < 440)          { $QueryResult__ = 0 }

            if( VAR_VAL($query_p1,"Z") < 460
              & VAR_VAL($query_p1,"Z") >= 440)
            {
               if( Z > 380 )                           { $QueryResult__ = 0 }
            }
         }
      }
   }

   Attrezza
   {
      GOSUB AttrezzaEldomSuTop

      base_0.y = @alto_0.y - Y_SottoPiano

      if( ATTREZZA_SU=="BASE" )
      {
         if( IS_IDX(idx_top) ) { base_0.y = @alto_0.y - Y_SottoPiano + VAR_VAL(idx_top,"SpessorePiano") }
      }
   }

   Controlli
   {
      GOSUB CtrlComune

      GOSUB TrovaIdxTopDaScassare

      //LZ 25/08/2021: TODO
      GOSUB TrovaIdx_DaScassare_MensolaAir

      //GOSUB SetVar_PCotturaLavello
      GOSUB CtrlScasso_LavaboKERA

      //rigenera scasso manuale
      if( RigeneraScasso == 1)
      {
         if( IS_VAR_FIXED(ATTUALE(),"RigeneraScasso")==1 ) { DEL_VAR_MODIFICATE(ATTUALE(),"RigeneraScasso") }
         RigeneraScasso = 0

         GOSUB EliminaScassi
         //COMANDO(STRCAT("PROCEDURA M4_Scassi ",STR(ATTUALE()),"  // Scassa_e_Taglia "))
         COMANDO("PROCEDURA M4_Scassi // Scassa_e_Taglia ")
      }

      //Simone 21/06/2022
      wk_zp = VAR_VAL(PADRE(ATTUALE(),1),"Zt")

      if( REV_Pos_Rubinetto > 1 )
      {
         VAR_Rubinetto = 0
         if( IS_VAR_FIXED(ATTUALE(),"VAR_Rubinetto") == 0 )  { VAR_Rubinetto = 1 }

         //non ci sta il rubinetto
         if( wk_zp < 520 )
         {
            VAR_Rubinetto = 0
            if( IS_VAR_FIXED(ATTUALE(),"VAR_Rubinetto") == 1 ) { DEL_VAR_MODIFICATE(ATTUALE(),"VAR_Rubinetto") }

            HIDE_ON_EDIT2(ATTUALE(),"VAR_Rubinetto",1)
         }
      }

      //calcolo la distanza da muro
      if( ACTION() > 0 )
      {
         DistanzaDaMuro = 0
         if( GetTopLevel(ATTUALE()) != ATTUALE() )
         {
            b0_lav = base_0

            SET_#(GetTopLevel(ATTUALE()))
            b0_str = #base_0

            ang_test = ANG_TOT_NOR(GetTopLevel(ATTUALE())) + 90

            DistanzaDaMuro = DistanzaFraPunti(b0_lav,b0_str, ang_test )
         }
      }

      if( IS_IDX(idx_top) )
      {
         wk_var_val  = VAR_VAL_STR(idx_top,"GEST_C028")
         wk_str_test = STRCAT("GEST_C028;",wk_var_val)
         wk_no_sig = STRDADB(idx_top,"DAMMI_NONSIGNIF",wk_str_test)

         wk_KERA_finTOP = "V"
         if( wk_no_sig=="WW000" )  { wk_KERA_finTOP = "W" }
         if( wk_no_sig=="FX000"
           | wk_no_sig=="LA000"  ) { wk_KERA_finTOP = "L" }

         if( wk_KERA_finTOP == "V" )
         {
            if( X == 400 & Z == 400 )
            {
               ScsTop_X  = 350.1
               ScsSTop_X = 350.1

               ScsTop_Z  = 350.1
               ScsSTop_Z = 350.1
            }
            if( X == 500 & Z == 380 )
            {
               ScsTop_X  = 451
               ScsSTop_X = 451

               ScsTop_Z  = 331.08
               ScsSTop_Z = 331.08
            }

            if( X == 600 & Z == 380 )
            {
               ScsTop_X  = 550.1
               ScsSTop_X = 550.1

               ScsTop_Z  = 330.1
               ScsSTop_Z = 330.1
            }

            if( X == 650 & Z == 400 )
            {
               ScsTop_X  = 602.1
               ScsSTop_X = 602.1

               ScsTop_Z  = 352.1
               ScsSTop_Z = 352.1
            }

            if( X == 750 & Z == 400 )
            {
               ScsTop_X  = 701.49
               ScsSTop_X = 701.49

               ScsTop_Z  = 351.44
               ScsSTop_Z = 351.44
            }

            //Simone 19/10/2022
            if( REV_Pos_Rubinetto > 2 )
            {
               if( X == 400 & Z == 400 )
               {
                  ScsSTop_X = 354.1
                  ScsSTop_Z = 354.1
               }

               if( X == 500 & Z == 380 )
               {
                  ScsSTop_X = 455
                  ScsSTop_Z = 335.08
               }

               if( X == 600 & Z == 380 )
               {
                  ScsSTop_X = 554.1
                  ScsSTop_Z = 334.1
               }

               if( X == 650 & Z == 400 )
               {
                  ScsTop_X  = 600.1
                  ScsSTop_X = 604.1

                  ScsTop_Z  = 350.1
                  ScsSTop_Z = 354.1
               }

               if( X == 750 & Z == 400 )
               {
                  ScsTop_X  = 699.49
                  ScsSTop_X = 703.49

                  ScsTop_Z  = 349.44
                  ScsSTop_Z = 353.44
               }
            }
         }

         if( wk_KERA_finTOP == "W" )
         {
            if( X == 400 & Z == 400 )
            {
               ScsTop_X  = 374.94
               ScsSTop_X = 344.72

               ScsTop_Z  = 374.94
               ScsSTop_Z = 344.72
            }
            if( X == 500 & Z == 380 )
            {
               ScsTop_X  = 479.99
               ScsSTop_X = 444.74

               ScsTop_Z  = 354.99
               ScsSTop_Z = 324.74
            }

            if( X == 600 & Z == 380 )
            {
               ScsTop_X  = 574.99
               ScsSTop_X = 544.74

               ScsTop_Z  = 354.99
               ScsSTop_Z = 324.74
            }

            if( X == 650 & Z == 400 )
            {
               ScsTop_X  = 624.99
               ScsSTop_X = 594.74

               ScsTop_Z  = 374.99
               ScsSTop_Z = 344.74
            }

            if( X == 750 & Z == 400 )
            {
               ScsTop_X  = 724.95
               ScsSTop_X = 694.73

               ScsTop_Z  = 374.95
               ScsSTop_Z = 344.73
            }

            //Simone 19/10/2022 - ScsTop è il foro interno passante
            //                  - su ScsSTop riporto lo spianamento di -2mm (non utile)
            //   /_______                         _______\
            //   \      |____  spianamento   ____|       /
            //   /          |    ScsTop     |            \
            //   \__________|               |___________/
            //   /                                      \
            if( REV_Pos_Rubinetto > 2 )
            {
               if( X == 400 & Z == 400 )
               {
                  ScsTop_X  = 344.72
                  ScsSTop_X = 374.94

                  ScsTop_Z  = 344.72
                  ScsSTop_Z = 374.94
               }

               if( X == 500 & Z == 380 )
               {
                  ScsTop_X  = 444.74
                  ScsSTop_X = 479.99

                  ScsTop_Z  = 324.74
                  ScsSTop_Z = 354.99
               }

               if( X == 600 & Z == 380 )
               {
                  ScsTop_X  = 544.74
                  ScsSTop_X = 574.99

                  ScsTop_Z  = 324.74
                  ScsSTop_Z = 354.99
               }

               if( X == 650 & Z == 400 )
               {
                  ScsTop_X  = 594.74
                  ScsSTop_X = 624.99

                  ScsTop_Z  = 344.74
                  ScsSTop_Z = 374.99
               }

               if( X == 750 & Z == 400 )
               {
                  ScsTop_X  = 694.73
                  ScsSTop_X = 724.95

                  ScsTop_Z  = 344.73
                  ScsSTop_Z = 374.95
               }
            }

            if( VAR_VAL(idx_top,"VAR_TipoTop") == 22 )
            {
               ScsSTop_X = 300
               ScsSTop_Z = VAR_VAL(idx_top,"Z") - (OffsetZ + Z/2 - 120 )
            }
         }

         if( wk_KERA_finTOP == "L" )
         {
            if( X == 400 & Z == 400 )
            {
               ScsTop_X  = 344.72
               ScsSTop_X = 344.72

               ScsTop_Z  = 344.72
               ScsSTop_Z = 344.72
            }
            if( X == 500 & Z == 380 )
            {
               ScsTop_X  = 444.74
               ScsSTop_X = 444.74

               ScsTop_Z  = 324.74
               ScsSTop_Z = 324.74
            }

            if( X == 600 & Z == 380 )
            {
               ScsTop_X  = 544.74
               ScsSTop_X = 544.74

               ScsTop_Z  = 324.74
               ScsSTop_Z = 324.74
            }
            if( X == 650 & Z == 400 )
            {
               ScsTop_X  = 594.74
               ScsSTop_X = 594.74

               ScsTop_Z  = 344.74
               ScsSTop_Z = 344.74
            }
            if( X == 750 & Z == 400 )
            {
               ScsTop_X  = 694.73
               ScsSTop_X = 694.73

               ScsTop_Z  = 344.73
               ScsSTop_Z = 344.73
            }
         }
      }
   }

   Gestionale
   {
      GOSUB GestComune

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura PostGestDllValida
   {
      if( $OnLoadOrder2==1 | $OnRigenera==1 )     { EXITSUB() }
      //if( ACTION()<=0 | ACTION()==2 )             { EXITSUB() }
      if( $CNP==1 )                               { EXITSUB() }

      if( IS_IDX(idx_top) == 0 )                  { EXITSUB() }

      $wk_EliminaScassi_da_idx = GetTopLevel(ATTUALE())
      GOSUB EliminaScassi
      COMANDO(STRCAT("PROCEDURA M4_Scassi ",STR(GetTopLevel(ATTUALE())),"  // Scassa_e_Taglia "))
      COMANDO(STRCAT("RICALCOLA_UNA ",STR(GetTopLevel(ATTUALE())),"  // PostGestDllValida Lavabo Kera"))
   }

   Procedura cancella
   {
      GOSUB Elimina_Scasso

      COMANDO(STRCAT("RICALCOLA_UNA ",STR(GetTopLevel(ATTUALE())),"  // PostGestDllValida Lavabo Kera"))
   }

   Posiziona __import__ bl
   {
      GOSUB Posa_Elemento
      @import = STRCAT($path_sat,"Lavabi\KERA_",STR(X),"x",STR(Z),".sat")
      @base_0.x = base_0.x + X/2
      @base_0.y = base_0.y + Y
      @base_0.z = base_0.z + Z/2
   }

   Posiziona Import_Scassa scs
   {
      GOSUB Posa_Elemento
      @import = STRCAT($path_sat,"Lavabi\KERA_",STR(X),"x",STR(Z),"_scs.sat")
      @base_0.x = base_0.x + X/2
      @base_0.y = base_0.y + Y_SottoPiano + 10
      @base_0.z = base_0.z + Z/2

      //Luca 02/12/2021
      //@Scassa_Chi_Plus = STRCAT(Scassa_Chi_Plus,";",Scassa_Chi_Plus_SottoTop)
      @Scassa_Chi_Plus = STRCAT(Scassa_Chi_Plus)
   }

   //Luca 02/12/2021
   Posiziona Import_Scassa scst
   {
      @escluso = 0
      if( IS_IDX(idx_top) )
      {
         if( VAR_VAL(idx_top,"VAR_TipoTop") == 22 )  { @escluso = 1 }
      }

      GOSUB Posa_Elemento
      @import = STRCAT($path_sat,"Lavabi\KERA_",STR(X),"x",STR(Z),"_scs_ST.sat")
      @base_0.x = base_0.x + X/2
      @base_0.y = base_0.y - Y_SottoPiano + 10
      @base_0.z = base_0.z + Z/2

      @Scassa_Chi_Plus = STRCAT(Scassa_Chi_Plus_SottoTop)
   }

   Posiziona Blocco_Scassa scst2
   {
      @escluso = 1
      if( IS_IDX(idx_top) )
      {
         if( VAR_VAL(idx_top,"VAR_TipoTop") == 22 )  { @escluso = 0 }
      }
      @X = 300
      @Y = Y
      @Z = 520
      @base_0.x = base_0.x + X/2 - @X/2
      @base_0.y = base_0.y - Y_SottoPiano + 10
      @base_0.z = base_0.z + Z/2 + 120 - @Z

      @Scassa_Chi_Plus = STRCAT(Scassa_Chi_Plus_SottoTop)
   }

   Posiziona RubinettoGenerico rub
   {
      @escluso = 1 - VAR_Rubinetto

      @TipoRubinetto = 0

      @VAR_OffZ = 60
      //Simone 03/06/2022
      if( REV_Pos_Rubinetto > 0 )
      {
         @VAR_OffZ = 70 - (Z - ScsSTop_Z)/2
      }

      //Simone 18/10/2022 - Le specifiche fanno riferimento allo scasso sul top, non sul sottotop, correggo
      if( REV_Pos_Rubinetto > 2 )
      {
         @VAR_OffZ = 65 - (Z - ScsTop_Z)/2
      }
      @VAR_OffX = 0

      if( Pos_Rubinetto < 0 )
      {
         @VAR_OffX = -1*(X/2) + 50
         @VAR_OffZ = 30
         //Simone 03/06/2022
         if( REV_Pos_Rubinetto > 0 )
         {
            @VAR_OffX = -1*(X/2) + (X - ScsSTop_X)/2 + 45
         }

         if( REV_Pos_Rubinetto > 2 )
         {
            @VAR_OffX = -1*(X/2) + (X - ScsTop_X)/2 + 50
         }
      }

      if( Pos_Rubinetto > 0 )
      {
         @VAR_OffX = X/2 - 50
         @VAR_OffZ = 30
         //Simone 03/06/2022
         if( REV_Pos_Rubinetto > 0 )
         {
            @VAR_OffX = X/2 - (X - ScsSTop_X)/2 - 45
         }

         if( REV_Pos_Rubinetto > 2 )
         {
            @VAR_OffX = X/2 - (X - ScsTop_X)/2 - 50
         }
      }

      @base_0.x = base_0.x + X/2 //+ @VAR_OffX
      @base_0.y = base_0.y + Y
      @base_0.z = base_0.z //- @VAR_OffZ

      idx_rubinetto = ATTUALE()
   }

   Posiziona Piletta pil
   {
      @escluso = 1
      if( Cucina_Versione > 2 ) { @escluso = 0 }

      @X = 72
      @Y = 10
      @Z = 72

      @base_0.x = base_0.x + X/2 - @X/2
      @base_0.y = base_0.y + @Y + 17.5
      @base_0.z = base_0.z + Z/2 - @Z/2
   }

   //Posiziona Blocco in_c
   //{
   //   @base_0 = base_centro
   //   @X=10
   //   @Y=Y
   //   @Z=10
   //   @c_rivestimento = [120,120,255]
   //   @f_rivestimento = "0.9"
   //}

   Posiziona _cont_per_near near
   //Posiziona Blocco near
   {
      @base_0.x = base_0.x + 20
      @base_0.y = base_0.y - 50
      @base_0.z = base_0.z + 20
      @X = X - 40
      @Y = 120
      @Z = Z - 40
      idx_cnear = ATTUALE()
   }
}

Elemento VascaTermoformata
{
   Descrizione = "Vasca"
   Code        = CUB
   Gruppo      = "Lavabo"
   Tipo        = Contenitore
   Forma       = ""
   Alias       OnChangedVar

   Variabili
   {
      X                 "Larghezza"                           500
      Y                 "Altezza"                             140
      Z                 "Profondità"                          560

      CambiaBase        "--> CAMBIA BASE RIFERIMENTO <--"     0     Boolean

      OffsetX           "Offset X (sx base-sx foro)"          0     Utente   (   40-      )   SaveAlways
      OffsetZ           "Offset Z (fronte top-fronte foro)"   100   Utente   (   70-      )   SaveAlways

      Filler_VT         " "                                   ""    ShowAlways

      VT_TipoVasca      ""                                    0     Implicit
      VT_TipoVascaStr   ""                                    ""    Implicit
      VT_NumVasche      ""                                    0     Implicit
      VT_IndVasca       ""                                    0

      VT_file_sat       ""                                    ""    Implicit
      VT_file_sat_scs   ""                                    ""    Implicit
      VT_idx_scassa     ""                                    ""    Implicit
      VT_idx_scassaST   ""                                    ""

      VT_Miscelatore    ""                                    0     Implicit
      VT_MiscPos        "Miscelatore posizione"               0     Menu     (   DXCNSX   )

     #ifdef TEC
      VT_MiscUTENTE     "Miscelatore posizione da U.T."       0     Boolean
     #endif
     #ifndef TEC
      VT_MiscUTENTE     ""                                    0
     #endif

      VT_Misc_OX        "Miscelatore offset X"                0     Utente   (   )
      VT_Misc_OZ        "Miscelatore offset Z"                0     Utente   (   )
      VT_MiscDiam       ""                                    35

      idx_base_ref      ""                                    -1

      ResetVAR          ""                                    0     Boolean
      VediIng           ""                                    0     Boolean

      StpQuotaScasso    ""                                    1

      M4_MIS            ""                                    "Filler*;OffsetX;OffsetZ;CambiaBase;Filler_VT;VT_MiscPos;VT_MiscUTENTE;VT_Misc_OX;VT_Misc_OZ"
      M4_NO_OFFS        ""                                    1

      FIN_var           ""                                    "C079"

      HIDE              ""                                    0
      CMP2_AZIONI       ""                                    "A"
      COD_EREDITA       ""                                    "PRE;POST"
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Cucina_Versione

      FIN_idx_gest = GetPrimoGest( ATTUALE(), 1)
      if( Cucina_Versione <= 2) { DescEdit__ = MSG(1017) }

      Y = 140
      if( VT_TipoVascaStr == "OCCHIETTO") { X = 600  Z = 310 }
      if( VT_TipoVascaStr == "OVALE"    ) { X = 480  Z = 340 }
      if( VT_TipoVascaStr == "RETT_50"  ) { X = 500  Z = 310 }
      if( VT_TipoVascaStr == "RETT_68"  ) { X = 680  Z = 320 }

     #ifndef TE
      if( ACTION()==0 ) { HIDE_ON_EDIT(ATTUALE(),"ResetVAR;VediIng",1) }
     #endif

      HIDE_ON_EDIT(ATTUALE(),"VT_Misc*",1)
      HIDE_ON_EDIT(ATTUALE(),"Filler_VT*",1)
      if( VT_Miscelatore==1 )
      {
         HIDE_ON_EDIT(ATTUALE(),"Filler_VT*",0)
         HIDE_ON_EDIT2(ATTUALE(),"VT_MiscUTENTE",0)
         HIDE_ON_EDIT2(ATTUALE(),"VT_MiscPos",0)

         HIDE_ON_EDIT2(ATTUALE(),"VT_Misc_OX",1)
         HIDE_ON_EDIT2(ATTUALE(),"VT_Misc_OZ",1)

         if( VT_MiscUTENTE==1 )
         {
            HIDE_ON_EDIT2(ATTUALE(),"VT_Misc_OX",0)
            HIDE_ON_EDIT2(ATTUALE(),"VT_Misc_OZ",0)
         }
      }
   }

   PuntiNotevoli
   {
      GOSUB punti

      pnt_scs_centro = [X/2,Y,Z/2]

      pnt_scs_top_0 = base_0
      pnt_scs_top_1 = base_1
      pnt_scs_top_2 = base_2
      pnt_scs_top_3 = base_3

      off_scs_stop = 15

      pnt_scs_stop_0 = base_0    pnt_scs_stop_0.x = base_0.x - off_scs_stop      pnt_scs_stop_0.z = base_0.z - off_scs_stop
      pnt_scs_stop_1 = base_1    pnt_scs_stop_1.x = base_1.x - off_scs_stop      pnt_scs_stop_1.z = base_1.z + off_scs_stop
      pnt_scs_stop_2 = base_2    pnt_scs_stop_2.x = base_2.x + off_scs_stop      pnt_scs_stop_2.z = base_2.z + off_scs_stop
      pnt_scs_stop_3 = base_3    pnt_scs_stop_3.x = base_3.x + off_scs_stop      pnt_scs_stop_3.z = base_3.z - off_scs_stop

      vano_0_0 = base_0
      vano_l_0 = X
      vano_p_0 = Z
   }

   Controlli
   {
      GOSUB CtrlComune

      GOSUB Ctrl_CambiaPos_VascheTermoformate

      idx_top = PADRE(ATTUALE(),1)

      GOSUB Ctrl_Limiti_VascheTermoformate

      //CERCO SOLO I SOTTOTOP DA SCASSARE
      VT_idx_scassaST = ""
      SplitStringToArray(VT_idx_scassa,";",0,"wk_scassa_chi",idx_att)

      if( VAR_VAL(ATTUALE(),"wk_scassa_chi")>0 )
      {
         i = 1
         while ( i<=wk_scassa_chi )
         {
            if( UN_PADRE2(wk_scassa_chi[i],"SottoTop_generico") )
            {
               VT_idx_scassaST = STRCAT(VT_idx_scassaST,STR(wk_scassa_chi[i]),";")
            }

            i = i + 1
         }
      }

      //SOLO TEC -- RESET VARIABILI FORZATE
      if( ResetVAR==1 )
      {
         DEL_VAR_MODIFICATE(ATTUALE(),"ResetVAR")
         ResetVAR = 0

         DEL_VAR_MODIFICATE(ATTUALE(),"OffsetX")
         DEL_VAR_MODIFICATE(ATTUALE(),"OffsetZ")

         if( IS_IDX(idx_base_ref) ) { OffsetX = VAR_VAL(idx_base_ref,"X")/2 - X/2 }
         idx_top = PADRE(ATTUALE(),1)
         VAR_VALUE_SET(idx_top,"RigeneraScasso",1)
         COMANDO(STRCAT("RICALCOLA ",STR(idx_top)))
      }
   }

   Procedura OnTabEredita
   {
      GOSUB Set_Gest_E008_VascaTermoformata
   }

   Gestionale
   {
      if( Cucina_Versione <= 2) { EXITSUB() }

      GOSUB GestComune
      GEST_CODICE = SE_STR( VT_TipoVascaStr != "", "LVL3", "")
      GOSUB GestComune_Post
   }

   Procedura OnChangedVar
   {
      #ifndef TEC
         if( $ChangedVar=="OffsetZ" )
         {
            if( VT_NumVasche==2 )
            {
               wk_altra_vasca = VAR_VAL(idx_top,"VT_idxVasc_V2")
               if( VT_IndVasca==2 ) { wk_altra_vasca = VAR_VAL(idx_top,"VT_idxVasc_V1") }

               COMANDO(STRCAT("VAR_CHANGE 1 ",STR(wk_altra_vasca)," OffsetZ=",STR(OffsetZ) ," //OnChangedVar ",NOME(ATTUALE())))
            }
         }
      #endif

      if( $ChangedVar=="VT_MiscUTENTE" )
      {
         if( VT_MiscUTENTE==0 )
         {
            DISPLAY2("Verranno ripristinate le posizioni di default")
            DEL_VAR_MODIFICATE(ATTUALE(),"VT_Misc_OX")
            DEL_VAR_MODIFICATE(ATTUALE(),"VT_Misc_OZ")

            COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE())))
            VAR_VALUE_SET(idx_top,"RigeneraScasso",1)
            COMANDO(STRCAT("RICALCOLA ",STR(idx_top)))
         }
      }

      if( $ChangedVar=="OffsetX"    | $ChangedVar=="OffsetZ"
        | $ChangedVar=="VT_MiscPos"
        | $ChangedVar=="VT_Misc_OX" | $ChangedVar=="VT_Misc_OZ"  )
      {
         //{
         //   if( VT_Misc_OZ>60 )
         //   {
         //      wk_str = STRCAT(MSG(1090),"\n",MSG(1139),"\n",MSG(1140))
         //      DISPLAY2(wk_str)
         //   }
         //}

         idx_top = PADRE(ATTUALE(),1)
         VAR_VALUE_SET(idx_top,"RigeneraScasso",1)
         COMANDO(STRCAT("RICALCOLA ",STR(idx_top)))

         if( VT_NumVasche==2 )
         {
            wk_idx_v2 = -1
            SET_#(idx_top)
            if( VT_IndVasca==1 ) { wk_idx_v2 = #VT_idxVasc_V2 }
            else                 { wk_idx_v2 = #VT_idxVasc_V1 }

            if( IS_IDX(wk_idx_v2) ) { COMANDO(STRCAT("Procedura CtrlStatici ",STR(wk_idx_v2))) }
         }
      }
   }

   Procedura CtrlStatici
   {
      GOSUB Ctrl_Limiti_VascheTermoformate
   }

   Procedura cancella
   {
      if( VAR_EXIST(-1,"StartingDel__")
        & INSERIMENTO2(ATTUALE())==$ins2_componente )
      {
         if( $StartingDel__==ATTUALE() ) { $no_cancel = 1 }
         else                            { $no_cancel = 0 }
      }
   }

   //per debug
   Posiziona Blocco Ing
   {
      @escluso = 1 - VediIng

      //sempre
      #ifndef TEC
         @escluso = 1
      #endif

      GOSUB posa_blocco
      @Y = Y + 10
      @c_rivestimento = [120,120,255]
      @f_rivestimento = "0.9"
   }

   Posiziona Blocco Ing1
   {
      @escluso = 1 - VediIng

      //sempre
      #ifndef TE
         @escluso = 1
      #endif

      GOSUB posa_blocco
      @X = X/2
      @Z = Z/2
      @Y = Y + 15
      @c_rivestimento = [120,120,255]
      @f_rivestimento = "0.9"
   }

   Posiziona __import__ vas1
   {
      @base_0.x = base_0.x + X/2
      @base_0.y = base_0.y + Y
      @base_0.z = base_0.z + Z/2

      GOSUB rivestimento

      @import   = VT_file_sat
      @NoPrint_StpTop = 1
   }

   Posiziona Import_Scassa vas1s
   {
      GOSUB posa_blocco

      @base_0.x = base_0.x + X/2
      @base_0.y = base_0.y + Y
      @base_0.z = base_0.z + Z/2

      @import          = VT_file_sat_scs
      @Scassa_Chi_Plus = VT_idx_scassa
   }

   Posiziona VascaTermoformata_Misc misc
   {
      @escluso = 1
      if( VT_Miscelatore==1 ) { @escluso = 0 }

      @base_0.x = base_0.x + X/2 + VT_Misc_OX - VT_MiscDiam/2
      @base_0.y = base_0.y
      @base_0.z = base_0.z - VT_Misc_OZ - VT_MiscDiam/2
      @Y = Y
   }
}

//gestisco livello miscelatore per compatibilità stampa
Elemento VascaTermoformata_Misc
{
   Descrizione = "Vasca"
   Code        = CUB
   Gruppo      = "Lavabo"
   Tipo        = Contenitore
   Forma       = ""
   Alias       OnChangedVar

   Variabili
   {
      X    ""   500
      Y    ""   140
      Z    ""   560

      VT_MiscDiam       ""  35 Implicit

      idx_base_ref        ""  -1

      //StpQuotaScasso_Cil  ""  1

      VT_idx_scassa       "" "" Implicit
      VT_idx_scassaST     "" "" Implicit

      HIDE "" 1
   }

   Assegnazioni
   {
      GOSUB AssComune

      VT_MiscDiamSt = VT_MiscDiam + 6

      //per stampe
      Diametro   = VT_MiscDiam
      DiametroST = VT_MiscDiamSt
   }

   PuntiNotevoli
   {
      X = VT_MiscDiam
      Z = VT_MiscDiam

      GOSUB punti

      //per stampe
      pnt_scs_centro = [X/2,0,Z/2]
   }

   Controlli
   {
      GOSUB CtrlComune
   }

   Posiziona CilindroY_Scassa scs_cil
   {
      @base_0.x = base_0.x
      @base_0.y = base_0.y
      @base_0.z = base_0.z

      @X = VT_MiscDiam
      @Y = Y + 20

      @Scassa_Chi_Plus = VT_idx_scassa
      @StpQuotaScasso_Cil = 1
   }

   Posiziona CilindroY_Scassa scs_st
   {
      @base_0.x = base_0.x - 3
      @base_0.y = base_0.y
      @base_0.z = base_0.z - 3

      @X = VT_MiscDiamSt
      @Y = Y + 20

      @Scassa_Chi_Plus = VT_idx_scassaST
      @StpQuotaScasso_Cil = 2
   }
}

Elemento Piletta
{
   Descrizione = "Piletta lavabo"
   Code        = COD
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X             "Larghezza"       72
      Y             "Altezza"         10
      Z             "Profondità"      72

      TipoLavaboStr         ""        ""      Implicit

      FIN_var               ""        "C210"

      GEST_CODICE           ""        ""
      COD_EREDITA           ""        "PRE"

      //c_rivestimento_C210   ""        [ 128, 128, 128]
   }

   Assegnazioni
   {
      GOSUB AssComune
      HIDE = 1
      if( GEST_CODICE != "" ) { HIDE = 0 }

      Raggio = X/2
      Raggio = Raggio - 0.01

      K = Raggio - Raggio*SENO(45)
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Gestionale
   {
      GOSUB GestComune

      GEST_CODICE = ""
      if( UN_PADRE("LavaboKERA") )   { GEST_CODICE = "CU02701" }

      if( UN_PADRE("LavaboGenerico")
        & TipoLavaboStr == "ELYSSA") { GEST_CODICE = "CU02702" }

      GEST_Y = 150

      GOSUB GestComune_Post
   }

   Procedura OnTabEredita
   {
      if( TABER_REGOLA=="PRE" ) { BloccaModificaCatGest_Cmp_368 ( ATTUALE(), "GEST_C210" ) }
   }

   Posiziona _graf_piletta_lavabo pil
   {
      GOSUB posa_blocco
      GOSUB rivestimento

      if( TipoLavaboStr == "CELLULE" ) { @c_rivestimento = $c_bianco }
   }
}

Elemento _graf_piletta_lavabo
{
   Descrizione = "Grafica piletta"
   Code        = COD
   Gruppo      = ""
   Tipo        = ""
   Forma       = PathSweep

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X             "Larghezza"       72
      Y             "Altezza"         10
      Z             "Profondità"      72

      HIDE          ""                1
   }

   Assegnazioni
   {
      Raggio = X/2
      Raggio = Raggio - 0.01

      K = Raggio - Raggio*SENO(45)
   }

   PuntiNotevoli
   {
      base_0        =   [ 0,          0,        Raggio   ]
      base_1        =   [ Raggio,     0,        Raggio   ]
      base_2        =   [ Raggio,     Y,        Raggio   ]
      arc_2         =   [ COSENO(30), SENO(30), Raggio   ]

      // base_path_0   =   [ 0,          0,        Raggio   ]
      // arc_path_0    =   [ K,          0,        Z-K      ]
      // base_path_1   =   [ Raggio,     0,        Z        ]
      // arc_path_1    =   [ X-K,        0,        Z-K      ]
      // base_path_2   =   [ X,          0,        Z-Raggio ]
      // arc_path_2    =   [ X-K,        0,        K        ]
      // base_path_3   =   [ X-Raggio,   0,        0        ]
      // arc_path_3    =   [ K,          0,        K        ]
      // base_path_4   =   base_path_0

      base_path_0   =   [ 0,       0,  Raggio ]
      arc_path_0    =   [ Raggio,  0,  Z      ]
      base_path_1   =   [ X,       0,  Raggio ]
      arc_path_1    =   [ Raggio,  0,  0      ]
      base_path_2   =   base_path_0

      base_so       =   [ 0, 0, 0 ]
      alto_ne       =   [ X, Y, Z ]
   }
}

Elemento Elemento_Pickit
{
   Descrizione = ""
   Code        = INT
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      Y "" 100
      Z "" 100
      X "" 100

      M4_DIALOG "" 34
   }

   Assegnazioni
   {
      GOSUB AssComune
   }

   PuntiNotevoli
   {
      GOSUB punti
   }
   #include %path_bdm%\Tlib\orie.inc

   Procedura OnQueryBdmLocal
   {
      //Stesura con due pick
      if($query_type==3)
      {
         $QueryResult__ = 1
         EXITSUB()
      }
   }

   Procedura Stendi
   {
      //se la selezione è errata non passo la seconda volta
      if( VAR_VAL(ATTUALE(),"delme")==1 ) { EXIT() }

      if( $stesi_mode_sx==$stesi_Elemento
        & $stesi_mode_dx==$stesi_Elemento  )
      {
         $wk_PICKIT = $stesi_idx1
         delme = 1
      }
   }

   Procedura Notifica
   {
      if( ACTION()!=12 ) { EXITSUB() }

      if( VAR_VAL(ATTUALE(),"delme")==1 )
      {
         COMANDO(STRCAT("DELETE3 ",STR(idx_att)," //Notifica ",NOME(ATTUALE())))
         EXITSUB()
      }
   }

   Controlli
   {
      GOSUB CtrlComune
   }
}

Subroutine
{
   PROCEDURA ScassaTop_M4
   {
      $wk_commento = "   // ScassaTop_M4"
      $wk_scasso = ATTUALE()

      $wk_scassabile = -1

      NEAR("tops",ATTUALE(),10,$ignora_esclusi,"Top*")

      nt = 1
      while( nt<=tops )
      {
         COMPONENTI2("topg",tops[nt],"_top_grafica_M4")
         if( topg>0 )
         {
            $wk_scassabile = topg[1]
            GOSUB Scasso_M4
         }

         nt = nt + 1
      }


      if ( $wk_scassabile!=-1 )
      {
         $wk_idx_alias = $wk_scasso
         GOSUB add_alias_M4_SCASSANTE
      }
   }

   PROCEDURA ImpostaTopPartArr
   {
      if ( ACTION()>0
         & VAR_EXIST(ATTUALE(),"cmp_name") )
      {
// Se ho un taglio maschio a dx/sx, mi salvo la relativa femmina
// per la stampa multitop
         TopPart = ATTUALE()
         if ( IS_MATCH(AA_TAGLIO_SX, "01*")
            | IS_MATCH(AA_TAGLIO_SX, "52*")
            | IS_MATCH(AA_TAGLIO_SX, "66*") )
         {
            if ( IS_IDX(top_a_sx) )
            {
               SET_#(top_a_sx)
               ok = 0
               if ( IS_MATCH(AA_TAGLIO_SX, "01*")
                  & IS_MATCH(#AA_TAGLIO_DX, "03*") )
                  { ok = 1 }
               if ( IS_MATCH(AA_TAGLIO_SX, "52*")
                  & IS_MATCH(#AA_TAGLIO_DX, "51*") )
                  { ok = 1 }
               if ( IS_MATCH(AA_TAGLIO_SX, "66*")
                  & IS_MATCH(#AA_TAGLIO_DX, "65*") )
                  { ok = 1 }
               if ( ok )
                  { TopPart = top_a_sx }
            }
         }

         TopArr = ATTUALE()
         if ( IS_MATCH(AA_TAGLIO_DX, "01*")
            | IS_MATCH(AA_TAGLIO_DX, "52")
            | IS_MATCH(AA_TAGLIO_DX, "66*") )
         {
            if ( IS_IDX(top_a_dx) )
            {
               SET_#(top_a_dx)
               ok = 0
               if ( IS_MATCH(AA_TAGLIO_DX, "01*")
                  & IS_MATCH(#AA_TAGLIO_SX, "03*") )
                  { ok = 1 }
               if ( IS_MATCH(AA_TAGLIO_DX, "52*")
                  & IS_MATCH(#AA_TAGLIO_SX, "51*") )
                  { ok = 1 }
               if ( IS_MATCH(AA_TAGLIO_DX, "66*")
                  & IS_MATCH(#AA_TAGLIO_SX, "65*") )
                  { ok = 1 }
               if ( ok )
                  { TopArr = top_a_dx }
            }
         }
      }
   }

   //{
   PROCEDURA Trova_Top_A_DXSX
   {
      //{ modificata non trovava il top corretto quando c'era anche il telaio sotto piano 24/03/2010 ******
      top_a_sx = -1
      top_a_dx = -1

      ins2_att = INSERIMENTO2(idx_att)
      if( ins2_att==$ins2_posizionato
        | ins2_att==$ins2_agganciato )
      {
         near_sx = 0
         DEL_VAR(idx_att,"near_sx_##*")
         DEL_VAR(idx_att,"nome_top_a_sx")
         NEAR("near_sx",idx_near_sx,40,0,"Top*")

         k=1
         while( k<=near_sx )
         {
            idx_top_now = near_sx[k]

            // se sono sottopiano cerco sottopiani
            if( idx_top_now!=idx_att )
            {
               if( VAR_VAL(idx_att,"sottopiano")==1 )
               {
                  if( VAR_VAL(idx_top_now,"sottopiano")==1 )
                  {
                     top_a_sx = idx_top_now
                     nome_top_a_sx = NOME(top_a_sx)
                  }
               }
               else
               {
                  if( VAR_VAL(idx_top_now,"sottopiano")==0 )
                  {
                     top_a_sx = idx_top_now
                     nome_top_a_sx = NOME(top_a_sx)
                  }
               }
            }
            k=k+1
         }

         near_dx = 0
         DEL_VAR(idx_att,"near_dx_##*")
         DEL_VAR(idx_att,"nome_top_a_dx")
         NEAR("near_dx",idx_near_dx,40,0,"Top*")
         j=1
         while( j<=near_dx )
         {
            idx_top_now = near_dx[j]

            // se sono sottopiano cerco sottopiani
            if( idx_top_now!=idx_att )
            {
               if( VAR_VAL(idx_att,"sottopiano")==1 )
               {
                  if( VAR_VAL(idx_top_now,"sottopiano")==1 )
                  {
                     top_a_dx = idx_top_now
                     nome_top_a_dx = NOME(top_a_dx)
                  }
               }
               else
               {
                  if( VAR_VAL(idx_top_now,"sottopiano")==0 )
                  {
                     top_a_dx = idx_top_now
                     nome_top_a_dx = NOME(top_a_dx)
                  }
               }
            }
            j=j+1
         }
         //} modificata non trovava il top corretto quando c'era anche il telaio sotto piano ******
      }
      else
      {
         // if ( ID_Sin!=-1 & ID_Des!=-1 )
         if( IS_IDX(ID_Sin) & IS_IDX(ID_Des) )
         {
            // steso
            // attenzione trova i top sopra le basi angolo,
            // NON due top vicini sopra due basi adiacenti
            ID_find = ID_Sin

            DaTopSx=1
            GOSUB FindAllTop
            DaTopSx=0
            if( quanti_top>0 )
            {
               top_a_sx = top1
               if ( top1==idx_att | top1==-1 ) { top_a_sx = top2 }

               // Controllo aggiuntivo: se sono steso completamente su una base angolo
               // la proc FindAllTop mi trova solo "l'altro", senza curarsi della
               // sua posizione (es. cerco top a sx e mi trova quello a dx)
               if( VAR_EXIST(idx_att,"tipo_ang") )
               {
                  if( ID_Sin==ID_Des
                    & IS_MATCH(tipo_ang,"SX*")
                    & HAS_ALIAS(ID_Sin,"ElePerAngolo") )  { top_a_sx = -1 }
               }
            }

            if( top_a_sx==-1 )
            {
               // vedo se questo top è vicino a un altro top steso su una base adiacente
               DEL_VAR(idx_att,"near_##*")
               near = 0
               NEAR("near",idx_near_sx,40,0,"Top*")
               k = 1
               while( k<=near & top_a_sx==-1 )
               {
                  idx_near = near[k]
                  if( idx_near!=idx_att )
                  //{ sono telaio, deve essere telaio
                  {
                     sottopiano_suo=VAR_VAL(idx_near,"sottopiano")
                     sottopiano_mio=VAR_VAL(idx_att,"sottopiano")
                     if( sottopiano_suo==sottopiano_mio ) { top_a_sx = idx_near }
                  }
                  //}se sono telaio, deve essere telaio
                  k = k + 1
               }
            }

            // attenzione trova i top sopra le basi angolo,
            // NON due top vicini sopra due basi adiacenti
            ID_find = ID_Des

            DaTopDx=1
            GOSUB FindAllTop
            DaTopDx=0
            if( quanti_top>0 )
            {
               top_a_dx = top1
               if( top1==idx_att | top1==-1 ) { top_a_dx = top2 }

               // Controllo aggiuntivo: se sono steso completamente su una base angolo
               // la proc FindAllTop mi trova solo "l'altro", senza curarsi della
               // sua posizione (es. cerco top a sx e mi trova quello a dx)
               if( VAR_EXIST(idx_att,"tipo_ang") )
               {
                  if( ID_Sin==ID_Des
                    & IS_MATCH(tipo_ang,"DX*")
                    & HAS_ALIAS(ID_Sin,"ElePerAngolo") ) { top_a_dx = -1 }
               }
            }

            if( top_a_dx==-1 )
            {
               // vedo se questo top è vicino a un altro top steso su una base adiacente
               DEL_VAR(idx_att,"near_##*")
               near = 0
               NEAR("near",idx_near_dx,40,0,"Top*")
               k = 1
               while( k<=near & top_a_dx==-1 )
               {
                  idx_near = near[k]
                  if( idx_near!=idx_att )
                  //{ se sono telaio, deve essere telaio
                  {
                     sottopiano_suo=VAR_VAL(idx_near,"sottopiano")
                     sottopiano_mio=VAR_VAL(idx_att,"sottopiano")
                     if( sottopiano_suo==sottopiano_mio ) { top_a_dx = idx_near }
                  }
                  //} se sono telaio, deve essere telaio
                  k = k + 1
               }
            }
         }
      }
   }
   //}

   PROCEDURA Trova_FFVic_UP
   {
      idx_ffvic_sx  = -1
      dist_ffvic_sx = 0
      idx_ffvic_dx  = -1
      dist_ffvic_dx = 0

      if( ACTION() <= 0)            { EXITSUB() }
      if( IS_IDX(idx_near_up) == 0) { EXITSUB() }

      NEAR( "wk_ff_vic", idx_near_up, 0.1, 0, "FiancoFinitura")

      wk_ff_num = 0
      while( inc(wk_ff_num) <= wk_ff_vic)
      {
         wk_ff_att  = wk_ff_vic[wk_ff_num]

         if( wk_ff_att == idx_ffvic_sx
           | wk_ff_att == idx_ffvic_dx)  { continue }

         SET_#(wk_ff_att)
         wk_ff_dist = Punti_Distanza ( pnt_top_cnr, #pnt_cnr, base_0, base_3, "xz", -0.01, 0)

         if( wk_ff_dist < dist_ffvic_sx) { idx_ffvic_sx = wk_ff_att  dist_ffvic_sx = wk_ff_dist + #X/2  continue }
         if( wk_ff_dist > dist_ffvic_dx) { idx_ffvic_dx = wk_ff_att  dist_ffvic_dx = wk_ff_dist - #X/2  continue }
      }
   }

   PROCEDURA Trova_TopVic_SXDX
   {
      idx_topvic_sx = -1
      idx_topvic_dx = -1

      idx_topang_sx = -1
      idx_topang_dx = -1

      idx_top_SNACK_sx = -1
      idx_top_SNACK_dx = -1

      if ( ACTION()<=0 ) { EXITSUB() }

      if ( IS_IDX(idx_near_sx) == 0 | IS_IDX(idx_near_dx) == 0 ) { EXITSUB() }

      wk_cerca = NOME(ATTUALE())
      BOX_MODE(0)
      NEAR("wk_top_vic_sx",idx_near_sx,40,0,wk_cerca)
      while ( wk_top_vic_sx>0 & IS_IDX(idx_topvic_sx) == 0 )
      {
         if ( wk_top_vic_sx[wk_top_vic_sx] != idx_att ) { idx_topvic_sx = wk_top_vic_sx[wk_top_vic_sx] }

         wk_top_vic_sx = wk_top_vic_sx -1
      }

      NEAR("wk_top_vic_dx",idx_near_dx,40,0,wk_cerca)
      while ( wk_top_vic_dx>0 & IS_IDX(idx_topvic_dx) == 0 )
      {
         if ( wk_top_vic_dx[wk_top_vic_dx] != idx_att )
            { idx_topvic_dx = wk_top_vic_dx[wk_top_vic_dx] }

         wk_top_vic_dx = wk_top_vic_dx -1
      }

      if( VAR_EXIST(ATTUALE(),"idx_near_fsx")==1 )
      {
         NEAR("wk_top_ang_sx",idx_near_fsx,20,0,wk_cerca)
         while ( wk_top_ang_sx>0 & IS_IDX(idx_topang_sx) == 0 )
         {
            if ( wk_top_ang_sx[wk_top_ang_sx] != idx_att )
            {
               idx_topang_sx = wk_top_ang_sx[wk_top_ang_sx]

               //Luca 30/03/2021 mantis 24825: Top cucina: accosto laminglass lineari
               //stesso angolo e profondità diverse
               if( ABS( ANG_TOT_NOR(idx_topang_sx) - ANG_TOT_NOR(ATTUALE()) ) < 0.1 )
               {
                  if( VAR_VAL(idx_topang_sx,"Z") > VAR_VAL(ATTUALE(),"Z") ) { idx_topang_sx = -1 }
               }

            }
            wk_top_ang_sx = wk_top_ang_sx -1
         }

         NEAR("wk_top_ang_dx",idx_near_fdx,20,0,wk_cerca)
         while ( wk_top_ang_dx>0 & IS_IDX(idx_topang_dx) == 0 )
         {
            if ( wk_top_ang_dx[wk_top_ang_dx] != idx_att )
            {
               idx_topang_dx = wk_top_ang_dx[wk_top_ang_dx]

               //Luca 30/03/2021 mantis 24825: Top cucina: accosto laminglass lineari
               //stesso angolo e profondità diverse
               if( ABS( ANG_TOT_NOR(idx_topang_dx) - ANG_TOT_NOR(ATTUALE()) ) < 0.1 )
               {
                  if( VAR_VAL(idx_topang_dx,"Z") > VAR_VAL(ATTUALE(),"Z") ) { idx_topang_dx = -1 }
               }
            }
            wk_top_ang_dx = wk_top_ang_dx -1
         }
      }


      if( VAR_EXIST(ATTUALE(),"idx_near_SNACK_sx")==0 ) { EXITSUB() }

      if ( IS_IDX(idx_near_SNACK_sx) == 0 | IS_IDX(idx_near_SNACK_dx) == 0 ) { EXITSUB() }

      //Luca 15/07/2019
      //cerco i _cont_per_near_SNACK perchè l'ingombro del piano è 'pieno'
      NEAR_GLOBALE("wk_tmp_num_sx",idx_near_SNACK_sx,10,1,"_cont_per_near_SNACK")
      if( wk_tmp_num_sx>0 ) { idx_top_SNACK_sx = wk_tmp_num_sx[1] }

      NEAR_GLOBALE("wk_tmp_num_dx",idx_near_SNACK_dx,10,1,"_cont_per_near_SNACK")
      if( wk_tmp_num_dx>0 ) { idx_top_SNACK_dx = wk_tmp_num_dx[1] }
   }

   PROCEDURA Trova_PenisioleAppoggio
   {
      idx_penisola = -1

      if ( ACTION()<=0 ) { EXITSUB() }

      if ( IS_IDX(idx_near_up) == 0 ) { EXITSUB() }

      BOX_MODE(0)
      NEAR("wk_tmp_num",idx_near_up,20,0,"Penisola")

      while ( wk_tmp_num>0 & IS_IDX(idx_penisola) == 0 )
      {
         if ( wk_tmp_num[wk_tmp_num] != idx_att )
            { idx_penisola = wk_tmp_num[wk_tmp_num] }

         wk_tmp_num = wk_tmp_num -1
      }

      ConPenisolaApp = 0
      if ( IS_IDX(idx_penisola) == 0 )       { EXITSUB() }

      if( VAR_VAL(ATTUALE(),"TopUnico")==1 ) { EXITSUB() }


      SET_#(idx_penisola)
      //if( ( alto_0.y - #base_0.y) > 0 ) { ConPenisolaApp = 1 }
      //Luca 24/09/2019 miglioro il controllo
      wk_ctr_alt = 0
      if( ( alto_0.y - #base_0.y) > 0 ) { wk_ctr_alt = 1 }
      //se penisola a muro non considero
      wk_ctr_pos = 0
      if( VAR_VAL(idx_penisola,"VAR_TipoPen")==0 ) { wk_ctr_pos = 1 }

      if( wk_ctr_pos==1 & wk_ctr_alt==1 ) { ConPenisolaApp = 1 }
   }

   //Luca 22/07/2019
   PROCEDURA Ctrl_TopFusion
   {
      idx_top_fusion = -1

      if ( ACTION()<=0 ) { EXITSUB() }

      #ifndef TEC
      EXITSUB()
      #endif

      if( IS_IDX(idx_topvic_sx)==0 & IS_IDX(idx_topvic_dx)==0 ) { EXITSUB() }

      wk_idx_test = -1

      if( IS_IDX(idx_topvic_sx)==1 )
      {
         if( Zt>VAR_VAL(idx_topvic_sx,"Zt")
          & VAR_VAL(idx_topvic_sx,"TopFusion")==1 ) { wk_idx_test = idx_topvic_sx }
      }
      if( IS_IDX(idx_topvic_dx)==1 )
      {
         if( Zt>VAR_VAL(idx_topvic_dx,"Zt")
          & VAR_VAL(idx_topvic_dx,"TopFusion")==1 ) { wk_idx_test = idx_topvic_dx }
      }

      FSN_ScsPos  = ""
      FSN_ScsX    = 0
      FSN_ScsZ    = 0
      idx_top_fusion = -1

      if( IS_IDX(wk_idx_test)==0 ) { EXITSUB() }

      //se angolo diversi esco subito
      if( ABS(ANG_TOT2(ATTUALE())-ANG_TOT2(wk_idx_test))>0.1 ) { EXITSUB() }

      TopFusion = 2

      //COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " | DEBUG ---- "))

      //Testo i punti dei top per definire se posizione e dimensione scasso
      TF2_0 = base_0    TF2_0.y = 0
      TF2_1 = base_1    TF2_1.y = 0
      TF2_2 = base_2    TF2_2.y = 0
      TF2_3 = base_3    TF2_3.y = 0

      TF2_ang = ANG_TOT2(ATTUALE())

      //top fusion minore, lineare
      SET_#(wk_idx_test)
      TF1_0 = #base_0    TF1_0.y = 0
      TF1_1 = #base_1    TF1_1.y = 0
      TF1_2 = #base_2    TF1_2.y = 0
      TF1_3 = #base_3    TF1_3.y = 0

      //proietto base_0 del top lineare tra base_0/base_3 top maggiore
      PX_1 = INTERFERISCI(TF1_0,TF2_ang+90,TF2_0,TF2_3)

      //proietto base_3 del top lineare tra base_0/base_3 top maggiore
      PX_2 = INTERFERISCI(TF1_3,TF2_ang+90,TF2_0,TF2_3)

      //proietto base_0 del top lineare tra base_1/base_2 top maggiore
      PX_3 = INTERFERISCI(TF1_0,TF2_ang,TF2_0,TF2_1)

      //proietto base_0 del top lineare tra base_1/base_2 top maggiore
      PX_4 = INTERFERISCI(TF1_1,TF2_ang,TF2_0,TF2_1)

      wk_pos_par2 = ""
      if(PX_1.x!=$ERR_INTER & PX_1.y!=$ERR_INTER & PX_1.z!=$ERR_INTER) { wk_pos_par2 = "D" }
      if(PX_2.x!=$ERR_INTER & PX_2.y!=$ERR_INTER & PX_2.z!=$ERR_INTER) { wk_pos_par2 = "S" }

      if(PX_1.x!=$ERR_INTER & PX_1.y!=$ERR_INTER & PX_1.z!=$ERR_INTER
       & PX_2.x!=$ERR_INTER & PX_2.y!=$ERR_INTER & PX_2.z!=$ERR_INTER)
      {
         wk_pos_par2 = "S"
         if( DISTANZA(PX_1,TF2_0)>DISTANZA(PX_2,TF2_3) ) { wk_pos_par1 = "D" }
      }

      wk_pos_par1 = ""
      if(PX_3.x!=$ERR_INTER & PX_3.y!=$ERR_INTER & PX_3.z!=$ERR_INTER) { wk_pos_par1 = "R" }
      if(PX_4.x!=$ERR_INTER & PX_4.y!=$ERR_INTER & PX_4.z!=$ERR_INTER) { wk_pos_par1 = "F" }

      if(PX_3.x!=$ERR_INTER & PX_3.y!=$ERR_INTER & PX_3.z!=$ERR_INTER
       & PX_4.x!=$ERR_INTER & PX_4.y!=$ERR_INTER & PX_4.z!=$ERR_INTER)
      {
         wk_pos_par1 = "R"
         //if( DISTANZA(PX_3,TF2_0)>DISTANZA(PX_4,TF2_0) ) { wk_pos_par1 = "F" }
         if( DISTANZA(PX_4,TF2_1)<DISTANZA(PX_3,TF2_0) ) { wk_pos_par1 = "F" }
      }

      FSN_ScsPos = STRCAT(wk_pos_par1,wk_pos_par2)

      //se non ho trovato una posizione valida --> esco
      if( FSN_ScsPos!="RS" & FSN_ScsPos!="RD"
       &  FSN_ScsPos!="FS" & FSN_ScsPos!="FD"  ) { EXITSUB() }


      if( RIGHT(FSN_ScsPos,1)=="D" ) { FSN_ScsX = DistanzaFraPunti(TF1_0,TF2_3,TF2_ang) }
      else                           { FSN_ScsX = DistanzaFraPunti(TF1_3,TF2_0,TF2_ang) }

      TF2_ang2 = TF2_ang+90

      if( LEFT(FSN_ScsPos,1)=="R" )
      {
         FSN_ScsZ = DistanzaFraPunti(TF1_1,TF2_0,TF2_ang2)

         //Luca 29/07/2020
         if( VAR_VAL(wk_idx_test,"Sbrd_RT") < 0 )
         {
            FSN_ScsZ = FSN_ScsZ + ABS(VAR_VAL(wk_idx_test,"Sbrd_RT"))

         }
      }
      else
      {
         FSN_ScsZ = DistanzaFraPunti(TF1_0,TF2_1,TF2_ang2)
      }
   }

   PROCEDURA FindAllTop
   {
      arraysd=0

      top1=-1
      top2=-1
      quanti_top=0

      arraysd = 1
      arraysd[1] = idx_att
      BOX_MODE(0)

      alt_test=base_0.y

      que_ord_find = -1
      if(VAR_EXIST(ID_find,"QUE_ORD"))
      {
         SET_#(ID_find)
         que_ord_find = #QUE_ORD
         //nello stendi (ctrl_su_stendi=1)
         //non ho ancora il valore corretto di base_0.y,
         //per i test uso l'alto_0 della struttura di riferimento
         if ( VAR_EXIST(idx_att,"ctrl_su_stendi")
            | INSERIMENTO2(idx_att) == $ins2_steso )
         {
            alt_test=#alto_0.y
            //if ( NOME(idx_att) != "TelaioGamma" )
            //{
            //   NEAR("$wk_tmp_num",ID_find,70,$ignora_esclusi,"TelaioGamma")
            //   if ( $wk_tmp_num>0 ) { alt_test = alt_test + $Spe_Telaio_Top }
            //}
         }
      }

      //contatore arraysd
      a = 1

      NEAR("arrtop",ID_find,70,$ignora_esclusi,"Top*")
      n = 1
      while(n<=arrtop & que_ord_find!=1)
      {
         SET_#(arrtop[n])
         //Confronto i QUE_ORD su cui è stato steso il top con
         //quello della struttura di riferimento ID_find: se
         //almeno uno è uguale allora prendo in considerazione
         //il top
         if ( #que_ord_sx==que_ord_find
            | #que_ord_dx==que_ord_find )
         {
            nome_top = NOME(arrtop[n])
            if ( alt_test==#base_0.y & arrtop[n]!=idx_att )
            {
               a = a + 1
               arraysd = a
               arraysd[a] = arrtop[n]
            }
         }
         n = n + 1
      }

      //se sono telaiogola,cerco miei simili
      //if ( NOME(idx_att) == "TelaioGamma" )
      //{
      //   NEAR("arrtop",ID_find,70,$ignora_esclusi,"TelaioGamma")
      //   n = 1
      //   while(n<=arrtop & que_ord_find!=1)
      //   {
      //      SET_#(arrtop[n])
      //      //Confronto i QUE_ORD su cui è stato steso il top con
      //      //quello della struttura di riferimento ID_find: se
      //      //almeno uno è uguale allora prendo in considerazione
      //      //il top
      //      if ( #que_ord_sx==que_ord_find
      //         | #que_ord_dx==que_ord_find )
      //      {
      //         nome_top = NOME(arrtop[n])
      //         if ( alt_test==#base_0.y & arrtop[n]!=idx_att )
      //         {
      //            a = a + 1
      //            arraysd = a
      //            arraysd[a] = arrtop[n]
      //         }
      //      }
      //      n = n + 1
      //   }
      //}

      it=1
      while(it<=arraysd)
      {
         idt=ARRAY("arraysd", it)

         //if ( NOME(idx_att) == "TelaioGamma"
         //   & NOME(idt) == "TelaioGamma" ) { ok_quanti_top = 1 }
         //else                              { ok_ quanti_top = 0 }
         ok_quanti_top = 0

         if ( IS_MATCH(NOME(idt), "Top*")
            | IS_MATCH(NOME(idt), "Mensol*")
            | ok_quanti_top == 1 )
         {
            quanti_top=quanti_top+1
            if ( quanti_top==1 ) { top1=idt }
            if ( quanti_top==2 ) { top2=idt }
            if ( quanti_top >2 ) { $num_msg=18  GOSUB MANDA_MSG }
         }
         it=it+1
      }

   }

   PROCEDURA Notifica_Top
   {
      //Per effetto del comando DLINK2POS:
      if ( ACTION()==12 & escluso==0 )
      {
         if( VAR_VAL(ATTUALE(),"MandaMsg_LungMaxTop")==1 )
         {
            wk_msg1 = "ATTENZIONE!"
            wk_msg2 = ""
            if( VAR_VAL_STR(ATTUALE(),"ORD_COD")!="" )
            {
               wk_msg2 = STRCAT("\n",ORD_COD," - ",ORD_DES)
            }
            wk_msg3 = STRCAT("\nMassima lunghezza consentita: ",STR(LungMaxTop), "mm.")
            wk_msg4 = "\n\nIl top verrà steso della lunghezza massima possibile."

            DISPLAY2(STRCAT(wk_msg1,wk_msg2,wk_msg3,wk_msg4))

            MandaMsg_LungMaxTop = 1
         }

         OnNotifica_Top = 1

         //spengo grafica .
         COMANDO("show abilita off")

         VAR_rendi_posizionato=0 VAR_post_posizionato=1
         COMANDO(STRCAT("VAR_CHANGE 1 ",STR(idx_att)," steso=1 VAR_post_posizionato=1 VAR_Posizionamento_teorico=",STR(base_0.y)))

         Sposta_Profondita= 0
         steso=1

         if ( IS_VAR_FIXED(idx_att,"X")==0
            | AA_SBORDO_SX!=0 | AA_SBORDO_DX!=0 )
         {
            wk_save_sb_sx=AA_SBORDO_SX
            X_Tot = X + AA_SBORDO_SX + AA_SBORDO_DX
            AA_SBORDO_SX = 0
            AA_SBORDO_DX = 0
            COMANDO(STRCAT("VAR_CHANGE 1 ",STR(idx_att)," X=",STR(X_Tot) ," AA_SBORDO_SX=0 AA_SBORDO_DX=0"))
         }

         if(IS_VAR_FIXED(idx_att,"Z")==0) { COMANDO(STRCAT("VAR_CHANGE 1 ",STR(idx_att)," Z=",STR(Z))) }

         ////Salvo eventuali stondature per i top
         //GOSUB SalvaTagliTerm

         strcmd = ""
         strcmd = STRCAT(strcmd," AA_TAGLIO_SX=",APICI(),AA_TAGLIO_SX,APICI())
         strcmd = STRCAT(strcmd," AA_TAGLIO_DX=",APICI(),AA_TAGLIO_DX,APICI())
         strcmd = STRCAT(strcmd," AA_TAGLIO_FS_SX=",APICI(),AA_TAGLIO_FS_SX,APICI())
         strcmd = STRCAT(strcmd," AA_TAGLIO_FS_DX=",APICI(),AA_TAGLIO_FS_DX,APICI())
         strcmd = STRCAT(strcmd," TaglioMaschioAMuro=",STR(TaglioMaschioAMuro))

         if ( IS_IDX(ID_Sin) )
            { if ( VAR_EXIST(ID_Sin,"QUE_ORD") ) { SET_#(ID_Sin)  strcmd = STRCAT(strcmd," que_ord_sx=",STR(#QUE_ORD)) } }
         if ( IS_IDX(ID_Des) )
            { if ( VAR_EXIST(ID_Des,"QUE_ORD") ) { SET_#(ID_Des)  strcmd = STRCAT(strcmd," que_ord_dx=",STR(#QUE_ORD)) } }
         ID_Sin=-1 ID_Des=-1

         strcmd = STRCAT(strcmd," ang_a_sx=",STR(ang_a_sx))
         strcmd = STRCAT(strcmd," ang_a_dx=",STR(ang_a_dx))
         //Claudio 21/01/2019 strcmd = STRCAT(strcmd," zzsotto=",STR(zsotto))
         strcmd = STRCAT(strcmd," zsotto=",STR(zsotto))
         strcmd = STRCAT(strcmd," zsotto_sx=",STR(zsotto_sx))
         strcmd = STRCAT(strcmd," zsotto_dx=",STR(zsotto_dx))
         strcmd = STRCAT(strcmd," tag_fusqu_sx=",STR(tag_fusqu_sx))
         strcmd = STRCAT(strcmd," tag_fusqu_dx=",STR(tag_fusqu_dx))
         strcmd = STRCAT(strcmd," steso_isola=",STR(steso_isola))
         if ( IS_VAR_FIXED(idx_att,"tipo_ang") ) { strcmd = STRCAT(strcmd," solo_angolo=",STR(solo_angolo)) }
         if ( VAR_EXIST(idx_att,"allungamento_sx") ) { strcmd = STRCAT(strcmd," allungamento_sx=",STR(allungamento_sx)) }
         if ( VAR_EXIST(idx_att,"allungamento_dx") ) { strcmd = STRCAT(strcmd," allungamento_dx=",STR(allungamento_dx)) }
         //
         COMANDO(STRCAT("VAR_CHANGE 1 ",STR(idx_att),strcmd))
         strcmd = ""

         // - secondo comando
         //strcmd = ""
         //strcmd = STRCAT(strcmd," tag_prof_mas_sx=",STR(tag_prof_mas_sx))
         //strcmd = STRCAT(strcmd," tag_prof_mas_dx=",STR(tag_prof_mas_dx))
         ////
         //COMANDO(STRCAT("VAR_CHANGE 1 ",STR(idx_att),strcmd))
         strcmd = ""

         COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_att)," no_agganciate // notifica Top"))

         ////Claudio 05/09/2018 a beneficio della Sagoma_ALS_Top (altrimenti spostarla in ctrl??)
         //COMANDO(STRCAT("Procedura CtrlStatici ",STR(idx_att),"  // notifica Top"))

         ////scasso il top inserito
         //COMANDO(STRCAT("Procedura M4_Scassi ",STR(idx_att)," // notifica Top"))

         //riattivo grafica
         COMANDO("show abilita on")
         COMANDO(STRCAT("SETTA ", STR(idx_att)," //notifica top"))

         //Luca 03/05/2019 aggancio il top alla base
         if( steso_isola==0 )
         {
            wk_offx = 0
            wk_offy = SpessorePiano
            wk_offz = VAR_VAL(ATTUALE(),"AggancioOffsetZ")

            wk_cnt = STRCAT("CNT S + 0,A + 0,R + 0, ",STR(wk_offx)," ",STR(wk_offy)," ",STR(wk_offz)," 0.0")

            //Luca 23/10/2019
            wk_offy = 0
            wk_cnt = STRCAT("CNT S + 0,A - 0,R + 0, ",STR(wk_offx)," ",STR(wk_offy)," ",STR(wk_offz)," 0.0")

            //Luca 23/10/2019
            if( NOME(idx_rif_steso_sx)=="ScoccaT_BaseAngPan"
              & VAR_VAL(idx_rif_steso_sx,"Verso")<0 )
            {
               wk_offx = VAR_VAL(idx_rif_steso_sx,"Xt")
               wk_cnt = STRCAT("CNT D - 0,A + 0,R + 0, -",STR(wk_offx)," ",STR(wk_offy)," ",STR(wk_offz)," 0.0")
            }
            COMANDO(wk_cnt)
            COMANDO(STRCAT("POS2LINK ",STR(ATTUALE()), " ", STR(idx_rif_steso_sx), " //Notifica ",NOME(ATTUALE())))
         }
         //else
         //{
         //   wk_offx = 0
         //   wk_offy = SpessorePiano
         //   wk_offz = 0
         //
         //   wk_cnt = STRCAT("CNT S + 0,A + 0,F + 0, ",STR(wk_offx)," ",STR(wk_offy)," ",STR(wk_offz)," 0.0")
         //   COMANDO(wk_cnt)
         //   COMANDO(STRCAT("POS2LINK ",STR(ATTUALE()), " ", STR(idx_rif_steso_sx), " //Notifica ",NOME(ATTUALE())))
         //}

         //Claudio 08/06/2018
         COMANDO(STRCAT("VAR_CHANGE 0 ",STR(idx_att)," OnNotifica_Top=0"))

         //Luca 03/05/2019
         if( IS_IDX(idx_topvic_sx)==1 ) { COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_topvic_sx)," no_agganciati //Motifica TOP")) }
         if( IS_IDX(idx_topvic_dx)==1 ) { COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_topvic_dx)," no_agganciati //Motifica TOP")) }

      }
   }

   PROCEDURA Top_stendi
   {
      top_steso=1
      //GOSUB stendi_esteso_standard

      solo_angolo=-1

      if ( $stesi_mode_sx == $stesi_Elemento
         & $stesi_mode_dx == $stesi_Elemento )
      {
         ID_Sin = $stesi_idx1
         ID_Des = $stesi_idx2

         //Inverto sx con dx se il pick è stato fatto al contrario
         CTLR_SEQUENZA_SXDX( ID_Sin, ID_Des )

         if( VAR_EXIST(ID_Sin, "punto_sx_top") &
             VAR_EXIST(ID_Sin, "ang_sx_top")   &
             VAR_EXIST(ID_Sin, "Z_sx_top")     &
             VAR_EXIST(ID_Des, "punto_dx_top") )
         {
            strlog=STRCAT("****** Top_stendi ","1")
            GOSUB TOLOG

            GOSUB Ctrl_Scocca_Ang_sx
            if ( ID_Sin==ID_Des
               & si_el_an )
            {
               strlog=STRCAT("****** Top_stendi ","2")
               GOSUB TOLOG

               SET_#(ID_Sin)

               AngDaPrimoEle=0
               GOSUB SettaTipoAng
               k=ATOI(STRMID(3,1,tipo_ang))
               solo_angolo=k

               //Z1 per zsotto
               SET_#(ID_Sin)
               // 1-> copro parte sx della base angolo
               if ( k==1 ) { Z1 = #Z_sx_top }
               // 0-> copro parte dx della base angolo
               else        { Z1 = #Z_dx_top }
               //e zsotto_dx zsotto_sx
               GOSUB imposta_zsotto_sx
               GOSUB imposta_zsotto_dx

               //Claudio 10/11/2016 da verificare:sembra venga steso a coprire l'intero ingombro della scocca
               SET_#(ID_Sin)
               if ( IS_MATCH(NOME(ID_Sin),"ScoccaT_BaseAngolo*") )
               {
                  strlog=STRCAT("****** Top_stendi ","3")
                  GOSUB TOLOG

                  // copre parte destra
                  if(k==0)
                  {
                     P1=#punto_sx_top_fro
                     P2=#punto_dx_top_fro_sing
                     Sposta_Profondita= -Z

                     ID_Des=-1
                  }
                  else
                  {
                     P1=#punto_sx_top_fro_sing
                     P2=#punto_dx_top_fro
                     Sposta_Profondita= -Z

                     ID_Sin=-1
                  }
               }
               else
               {
                  if ( IS_MATCH(NOME(ID_Sin),"ScoccaT_BaseAngPan*") )
                  {
                     strlog=STRCAT("****** Top_stend  i ","4")
                     GOSUB TOLOG

                     SET_#(ID_Sin)
                     // copre parte destra
                     if(k==0)
                     {
                        P1=#punto_sx_top_fro
                        P2=#punto_dx_top_fro_sing
                        Sposta_Profondita= -Z

                        ID_Des=-1
                     }
                     else
                     {
                        P1=#punto_sx_top_fro_sing
                        P2=#punto_dx_top_fro
                        Sposta_Profondita= -Z

                        ID_Sin=-1
                     }
                  }
               }
            }
            else
            {
               strlog=STRCAT("****** Top_stendi ","5")
               GOSUB TOLOG

               SET_#(ID_Sin)
               P1 = #punto_sx_top
               Z1 = #Z_sx_top

               // se la base a DX è più profonda attribuisco la profondità di quest'ultima
               //if( Z1<VAR_VAL(ID_Des,"Z_sx_top") )  { Z1 = VAR_VAL(ID_Des,"Z_sx_top") }

               //Luca 24/07/2019
               //Se profondità diverse chiedo se voglio un top fusion
            #ifdef TEC
               if( Z1!=VAR_VAL(ID_Des,"Z_sx_top") )
               {
                  msg = "Rilevate profondità diverse, si vuole inserire Top Fusion?"
                  if( VAR_VAL(ATTUALE(),"ChiediFusion")==0 )
                  {
                     r = DISPLAY3(msg,$MB_YESNO+$MB_ICONQUESTION)
                     ChiediFusion = 1
                  }

                  if( r==$MB_ID_NO )
                  {
                     if( Z1<VAR_VAL(ID_Des,"Z_sx_top") )  { Z1 = VAR_VAL(ID_Des,"Z_sx_top") }
                  }
                  else
                  {
                     //Devo prendere la profondità minore
                     TopFusion = 1
                     if( Z1>VAR_VAL(ID_Des,"Z_sx_top") )  { Z1 = VAR_VAL(ID_Des,"Z_sx_top") }
                  }
               }
            #endif

               //per zsotto
               if( STRSTR(NOME(ID_Sin),"Scocca")!="" & STRSTR(NOME(ID_Sin),"AngPan")!="" ) { Z1 = #Z_dx_top }
               if( STRSTR(NOME(ID_Sin),"Scocca")!="" & STRSTR(NOME(ID_Sin),"Angolo")!="" ) { Z1 = #Z_dx_top }

               //zsotto_sx
               GOSUB imposta_zsotto_sx
               ang_y_old = #ang_sx_top

               SET_#(ID_Des)
               P2 = #punto_dx_top
               GOSUB imposta_zsotto_dx

               //Luca 24/07/2019
               //se è stato selezionato TopFusion lineare, deve considerare il filo retro della base minore
               if( TopFusion==1 )
               {
                  if( VAR_VAL(ID_Sin,"Zt")<VAR_VAL(ID_Des,"Zt") )
                  {
                     wk_dist = DistanzaFraPunti(P1,P2,ang_y_old)
                     P2 = P1
                     P2.x = P1.x + COSENO(ang_y_old)*wk_dist
                     P2.z = P1.z -   SENO(ang_y_old)*wk_dist
                  }
                  else
                  {
                     AggancioOffsetZ = DistanzaFraPunti(P1,P2,ang_y_old+90)

                     wk_dist = DistanzaFraPunti(P1,P2,ang_y_old)
                     P1 = P2
                     P1.x = P2.x - COSENO(ang_y_old)*wk_dist
                     P1.z = P2.z +   SENO(ang_y_old)*wk_dist

                  }
               }

               //filo retro
               Sposta_Profondita = 0

               //Luca 03/05/2019 verifico lunghezza massima
               GOSUB SubTop_Stendi_CheckLungMax

               //Luca 25/03/2019
               if( steso_isola==1 )
               {
                  if( Z_adat_retro>0 ) { Sposta_Profondita = -1* (Z_adat_retro + $Cuc_Spe_BarraIso) }
               }

               //if( VAR_EXIST(ID_Sin, "punto_sx_top_fro")
               //  & VAR_EXIST(ID_Des, "punto_dx_top_fro") )
               //{
               //   SET_#(ID_Sin)  P1 = #punto_sx_top_fro
               //   SET_#(ID_Des)  P2 = #punto_dx_top_fro
               //
               //   Sposta_Profondita = -Z
               //}

            }
            GOSUB ricava_ang_y
         }
         else
         {
            GOSUB non_stendo
            EXIT()
         }

         GOSUB fai_zsotto

         x1=P1.x
         z1=P1.z
         x2=P2.x
         z2=P2.z
         x12=x2-x1
         z12=z2-z1
         ca=COSENO(ang_y)
         sa=SENO(-ang_y)
         X = FLOOR(((x12*ca+z12*sa)+0.005)*100)/100
         x_steso_dbg = X

         base_0=P1

         //adatta la Z del top alle basi sottostanti
         if ( adatta_Z ) { GOSUB adatta_z_top }
      }
   }

   PROCEDURA SubTop_Stendi_CheckLungMax
   {
      x1=P1.x
      z1=P1.z
      x2=P2.x
      z2=P2.z
      x12=x2-x1
      z12=z2-z1
      ca=COSENO(ang_y)
      sa=SENO(-ang_y)
      wk_x = FLOOR(((x12*ca+z12*sa)+0.005)*100)/100

      if( debug )
      {
         COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ang_y: ",STR(ang_y), " wk_x=",STR(wk_x)," LungMaxTop=",STR(LungMaxTop)))
      }

      if( wk_x > LungMaxTop )
      {
         MandaMsg_LungMaxTop = 1

         wk_ok = 0
         wk_id_test = -1
         if( VAR_EXIST(ID_Des,"idx_sx") ) { wk_id_test = #idx_sx }

         while( wk_ok==0 & IS_IDX(wk_id_test) )
         {
            if( VAR_EXIST(wk_id_test,"punto_dx_top")  )
            {
               SET_#(wk_id_test)
               P2 = #punto_dx_top

               //Luca 03/05/2019
               //verifico lunghezza massima
               x1=P1.x
               z1=P1.z
               x2=P2.x
               z2=P2.z
               x12=x2-x1
               z12=z2-z1
               ca=COSENO(ang_y)
               sa=SENO(-ang_y)
               wk_x = FLOOR(((x12*ca+z12*sa)+0.005)*100)/100

               if( wk_x <= LungMaxTop )
               {
                  wk_ok = 1
               }
               else
               {
                  SET_#(wk_id_test)
                  if( VAR_EXIST(wk_id_test,"idx_sx") ) { wk_id_test = #idx_sx }
                  else                                 { wk_id_test =  -1 }
               }
            }
            else
            {
               wk_id_test = -1
            }
         }

         GOSUB imposta_zsotto_dx

         if( wk_ok==0 )
         {
            GOSUB non_stendo
            EXIT()
         }
      }
   }

   PROCEDURA SottoTop_stendi
   {
      top_steso=1

      if ( $stesi_mode_sx == $stesi_Elemento
         & $stesi_mode_dx == $stesi_Elemento )
      {
         ID_Sin = $stesi_idx1
         ID_Des = $stesi_idx2

         //Inverto sx con dx se il pick è stato fatto al contrario
         CTLR_SEQUENZA_SXDX( ID_Sin, ID_Des )

         if( VAR_EXIST(ID_Sin, "punto_sx_top") &
             VAR_EXIST(ID_Sin, "ang_sx_top")   &
             VAR_EXIST(ID_Sin, "Z_sx_top")     &
             VAR_EXIST(ID_Des, "punto_dx_top") )
         {
            strlog=STRCAT("****** Top_stendi ","1")
            GOSUB TOLOG

            SET_#(ID_Sin)
            P1 = #punto_sx_top
            Z1 = #Z_sx_top

            // se la base a DX è più profonda attribuisco la profondità di quest'ultima
            if( Z1<VAR_VAL(ID_Des,"Z_sx_top") ) { Z1 = VAR_VAL(ID_Des,"Z_sx_top") }

            //zsotto_sx
            GOSUB imposta_zsotto_sx
            ang_y_old = #ang_sx_top

            SET_#(ID_Des)
            P2 = #punto_dx_top

            //Luca 03/05/2019
            GOSUB SubTop_Stendi_CheckLungMax

            GOSUB imposta_zsotto_dx

            //filo retro
            Sposta_Profondita = 0

            //Luca 25/03/2019
            if( steso_isola==1 )
            {
               if( Z_adat_retro>0 ) { Sposta_Profondita = -1* (Z_adat_retro + $Cuc_Spe_BarraIso) }
            }

            GOSUB ricava_ang_y
         }
         else
         {
            GOSUB non_stendo
            EXIT()
         }

         GOSUB fai_zsotto

         x1=P1.x
         z1=P1.z
         x2=P2.x
         z2=P2.z
         x12=x2-x1
         z12=z2-z1
         ca=COSENO(ang_y)
         sa=SENO(-ang_y)
         Xt = FLOOR(((x12*ca+z12*sa)+0.005)*100)/100
         x_steso_dbg = Xt

         base_0 = P1
         base_0.y = base_0.y - Y

         Z = zsotto

         //adatta la Z del top alle basi sottostanti
         //if ( adatta_Z ) { GOSUB adatta_z_top }

      }
   }

   PROCEDURA Notifica_SottoTop
   {
      //Per effetto del comando DLINK2POS:
      if ( ACTION()==12 & escluso==0 )
      {
         OnNotifica_Top = 1

         steso=1

         wk_cmd = STRCAT("Xt=",STR(Xt), " Z=",STR(Z))
         COMANDO(STRCAT("VAR_CHANGE 1 ",STR(idx_att), " " ,wk_cmd , " //Notifica_SottoTop"))

         //Claudio 08/06/2018
         COMANDO(STRCAT("VAR_CHANGE 0 ",STR(idx_att)," OnNotifica_Top=0"))

         if( VAR_VAL(ATTUALE(),"MandaMsg_LungMaxTop")==1 )
         {
            wk_msg1 = "ATTENZIONE!"
            wk_msg2 = ""
            if( VAR_VAL_STR(ATTUALE(),"ORD_COD")!="" )
            {
               wk_msg2 = STRCAT("\n",ORD_COD," - ",ORD_DES)
            }
            wk_msg3 = STRCAT("\nMassima lunghezza consentita: ",STR(LungMaxTop), "mm.")
            wk_msg4 = "\n\nIl sotto top verrà steso della lunghezza massima possibile."

            DISPLAY2(STRCAT(wk_msg1,wk_msg2,wk_msg3,wk_msg4))

            MandaMsg_LungMaxTop = 1
         }

         //Luca 03/05/2019 aggancio il top alla base
         if( steso_isola==0 )
         {
            wk_offx = 0
            wk_offy = 0
            wk_offz = 0

            wk_cnt = STRCAT("CNT S + 0,A + 0,R + 0, ",STR(wk_offx)," ",STR(wk_offy)," ",STR(wk_offz)," 0.0")
            COMANDO(wk_cnt)
            COMANDO(STRCAT("POS2LINK ",STR(ATTUALE()), " ", STR(idx_rif_steso_sx), " //Notifica ",NOME(ATTUALE())))
         }
      }
   }

   PROCEDURA TOLOG
   {
      //*****************************************************
      // INPUT:
      //    strlog = stringa da passare a file log del TRACE
      //*****************************************************
      if( $AttivaDebugSuTrace )
      {
         strToWrite = VAR_VAL_STR(ATTUALE(),"strlog")
         if( STRCMP(strToWrite,"")==0 ) { strToWrite="DEFAULT per log" }
         COMANDO2(STRCAT("LOGMSG - (IDX) = ",STR(ATTUALE())," - ACT: ",STR(ACTION())," - ",strlog))
      }
   }

   PROCEDURA Ctrl_Scocca_Ang_sx
   {
      si_el_an = 0
      if ( IS_MATCH(NOME(ID_Sin),"ScoccaT_BaseAng*")
         | IS_MATCH(NOME(ID_Sin),"ScoccaT_ColAng*")
         | IS_MATCH(NOME(ID_Sin),"ScoccaS_PensileAng*") )
      { si_el_an = 1 }
   }

   PROCEDURA Ctrl_Scocca_Ang_dx
   {
      si_el_an = 0
      if ( IS_MATCH(NOME(ID_Des),"ScoccaT_BaseAng*")
         | IS_MATCH(NOME(ID_Des),"ScoccaT_ColAng*")
         | IS_MATCH(NOME(ID_Des),"ScoccaS_PensileAng*") )
      { si_el_an = 1 }
   }

   PROCEDURA SettaTipoAng
   {
      if(ACTION()==2 & CMD()==$CMD_INTERATTIVO)
      {
         chiedi_ang = 0
         //cerco se c'è un'altro top angolo
         ctrl_su_stendi=1 ID_find=ID_Sin
         GOSUB FindAllTop
         DEL_VAR(idx_att,"ctrl_su_stendi")

         if ( quanti_top==2 )
         {
            if(top1==idx_att) { topx=top2 }
            else              { topx=top1 }

            if(IS_VAR_FIXED(topx,"tipo_ang"))
            {
               SET_#(topx)
               if ( #tipo_ang == "SX_1" ) { chiedi_ang=0 tipo_ang="DX_0" }
               if ( #tipo_ang == "DX_0" ) { chiedi_ang=0 tipo_ang="SX_1" }
            }
            // tipo_ang potrebbe non esser fissato nel top adiacente perchè è steso da altra base,fino a ID_find
            else
            {
               if ( VAR_EXIST(topx,"que_ord_sx")
                  & VAR_EXIST(topx,"que_ord_dx")
                  & VAR_EXIST(ID_find,"QUE_ORD") )
               {
                  if ( VAR_VAL(topx,"que_ord_dx") == VAR_VAL(ID_find,"QUE_ORD") ) { chiedi_ang=0 tipo_ang="DX_0" }
                  if ( VAR_VAL(topx,"que_ord_sx") == VAR_VAL(ID_find,"QUE_ORD") ) { chiedi_ang=0 tipo_ang="SX_1" }
               }
            }
         }

         if ( IS_VAR_FIXED(idx_att,"tipo_ang")==0 )
         {
            if ( chiedi_ang ) { res=CHIEDI(ATTUALE(),"tipo_ang") }
            else
               { COMANDO(STRCAT("VAR_CHANGE 1 ",STR(idx_att)," tipo_ang=",APICI(),tipo_ang,APICI())) }
         }
      }
   }

   PROCEDURA imposta_zsotto_sx
   {
      zsotto_sx = Z1

      if( VAR_EXIST(ID_Sin,"Z_sx_top") )  { zsotto_sx = #Z_sx_top }
   }

   PROCEDURA imposta_zsotto_dx
   {
      zsotto_dx = Z2

      //scocca std
      if( VAR_EXIST(ID_Des,"Z_sx_top") ) { zsotto_dx = #Z_sx_top }
   }

   PROCEDURA ricava_ang_y
   {
      // ricava l'angolo in base ai punti di "partenza" e "arrivo"
      ang_y = GRADI(ATAN2((P1.z-P2.z),(P2.x-P1.x)))
   }

   PROCEDURA non_stendo
   {
      $wk_canc_non_stendo=1

      if ( $OnLoadOrder ) { $wk_canc_non_stendo=0 }

      if($wk_canc_non_stendo)
      {
         //if ( $OnLoadOrder | $CNP__ )
         //{
         //   DISPLAY2("ATTENZIONE: rimosso elemento steso impropriamente")
         //   COMANDO("LOGMSG ATTENZIONE: rimosso elemento steso impropriamente")
         //}

         $str_msg=STRCAT(MSG(1090),"\n",MSG(1098))
         //if( VAR_VAL(ATTUALE(),"wk_msg_per_angolo")==1 )
         //{
         //   $str_msg=STRCAT($str_msg,"\n",MSG(1098))
         //}
         DISPLAY2($str_msg)

         NO_PostGestDllValida = 1

         escluso=1
         COMANDO (STRCAT("SETTA ",STR(ATTUALE())))
         COMANDO("DELETE1 // non_stendo")
      }
   }

   PROCEDURA fai_zsotto
   {
      //GOSUB fai_Rie_Basi_Piano

      if ( VAR_EXIST(ATTUALE(),"Z1") ) { zsotto = Z1 }
      else                             { zsotto = Z }
   }

   PROCEDURA adatta_z_top
   {
      if ( IS_VAR_FIXED(idx_att,"Z")==0 )
      {
         Sposta_Profondita = 0

         Z_adat = zsotto
         Z_adat_retro = 0
         Z_adat_isola = 0
         steso_isola = 0

         //adatto all'isola
         if ( ID_Sin > -1 & ID_Des > -1 )
         {
            // - sx
            $wk_idx_test_isola = ID_Sin
            $wk_lato_test_isola = -1
            $wk_filo_test_isola = 1
            GOSUB ctrl_retro_isola

            zsin_retro = 0
            zsin_isola = 0

            if( IS_IDX($wk_idx_find_isola) )
            {
               zsin_retro = VAR_VAL($wk_idx_find_isola,"Z_sx_top")
               zsin_isola = VAR_VAL($wk_idx_find_isola,"Z_sx_top") + VAR_VAL(ID_Sin,"Z_sx_top") + $Cuc_Spe_BarraIso
               // + 2*wk_Rie_Basi
            }

            // - dx
            $wk_idx_test_isola  = ID_Des
            $wk_lato_test_isola = 1
            $wk_filo_test_isola = 1
            GOSUB ctrl_retro_isola
            zdes_retro = 0
            zdes_isola = 0

            if( IS_IDX($wk_idx_find_isola) )
            {
               zdes_retro = VAR_VAL($wk_idx_find_isola,"Z_sx_top")
               zdes_isola = VAR_VAL($wk_idx_find_isola,"Z_sx_top") + VAR_VAL(ID_Des,"Z_sx_top") + $Cuc_Spe_BarraIso
               //+ 2*wk_Rie_Basi
            }

            if( zsin_retro==0 & zdes_retro==0 )
            {
               Z_adat = zsotto
               Z_adat_retro = 0
            }
            else
            {
               if ( zsin_retro > zdes_retro )   { Z_adat_retro = zsin_retro + wk_Rie_Basi }
               else                             { Z_adat_retro = zdes_retro + wk_Rie_Basi }

               if ( Z_adat_retro != wk_Rie_Basi )
               {
                  Z_adat = Z_adat + Z_adat_retro
                  steso_isola = 1

                  //Claudio 18/02/2019 tra le prof dei 2 lati, prendo quella di somma maggiore
                  Z_adat_isola = zsin_isola
                  if ( zdes_isola > Z_adat_isola ) { Z_adat_isola = zdes_isola }
                  Z_adat_isola = Z_adat_isola
                  Z_adat = Z_adat_isola

                  Sposta_Profondita = Z_adat_retro + $Cuc_Spe_BarraIso
               }
            }

         }

         COMANDO(STRCAT("VAR_CHANGE 3 ",STR(idx_att)," Z=",STR(Z_adat)," Z_adat=",STR(Z_adat)," Z_adat_retro=",STR(Z_adat_retro)," Z_adat_isola=",STR(Z_adat_isola)))
         Z = Z_adat

         //Sposta_Profondita = -Z

      }
   }

//Verifico se isola
//IN
//    $wk_idx_test_isola  = base da controllare
//    $wk_lato_test_isola = lato di test (-1=sx 1=dx)
//    $wk_filo_test_isola = basso(-1) alto (1)  non verificare(0)
//OUT
//    $wk_idx_find_isola  = base da controllare
   PROCEDURA ctrl_retro_isola
   {
      $wk_idx_find_isola = -1

      //al momento non considero ang (sarebbero da gestire i punti lato)
      if( STRSTR(NOME($wk_idx_test_isola),"Ang") != "" ) { EXITSUB() }

      //200 per sentire le scocche con fianchi allungati (cmq ctrl i punti)
      NEAR("$wk_near_basi",$wk_idx_test_isola,200,$ignora_esclusi,"ScoccaT_*")

      //Claudio 26/11/2018 non li considerò più validi per l'isola
      ////Claudio 23/10/2018 schienale retro base (macro stesura zoccolo)
      //NEAR("$wk_near_basi2",$wk_idx_test_isola,1,$ignora_esclusi,"SchienaleRetroBase")
      //// aggiunti casi di altri schienali associati a mensole e banconi
      //BOX_MODE(0)
      //if( $wk_near_basi2==0 ) { NEAR_GLOBALE("$wk_near_basi2",$wk_idx_test_isola,50,$ignora_esclusi,"SchienaleP40") }
      //if( $wk_near_basi2==0 ) { NEAR_GLOBALE("$wk_near_basi2",$wk_idx_test_isola,50,$ignora_esclusi,"SchienaleP40Sosp") }
      //if( $wk_near_basi2==0 ) { NEAR_GLOBALE("$wk_near_basi2",$wk_idx_test_isola,50,$ignora_esclusi,"SchienaleP50") }
      //if( $wk_near_basi2==0 ) { NEAR_GLOBALE("$wk_near_basi2",$wk_idx_test_isola,50,$ignora_esclusi,"SchienaleH8Sotto") }
      //while ( $wk_near_basi2> 0)
      //{
      //   //considero solo se non a terra
      //   if ( VAR_VAL_STR($wk_near_basi2[$wk_near_basi2],"GEST_CLM") != "T" )
      //   {
      //      $wk_near_basi_tmp = $wk_near_basi + 1
      //      $wk_near_basi = $wk_near_basi_tmp
      //      $wk_near_basi[$wk_near_basi_tmp] =  $wk_near_basi2[$wk_near_basi2]
      //   }
      //   $wk_near_basi2 = $wk_near_basi2 - 1
      //}

      //punti base di test
      SET_#($wk_idx_test_isola)
      $wk_b0_test_lat=#base_0 $wk_b3_test_lat=#base_3

      //allungo segmento di 1mm per lato
      $P1 = $wk_b0_test_lat
      $P2 = $wk_b3_test_lat
      GOSUB calcola_ang_y_3

      $wk_b0_test_lat.x = $wk_b0_test_lat.x - 1*COSENO($wk_ang_y_3)
      $wk_b0_test_lat.z = $wk_b0_test_lat.z + 1*SENO($wk_ang_y_3)
      $wk_b3_test_lat.x = $wk_b3_test_lat.x + 1*COSENO($wk_ang_y_3)
      $wk_b3_test_lat.z = $wk_b3_test_lat.z - 1*SENO($wk_ang_y_3)

      $wk_n=1
      while ( $wk_n<=$wk_near_basi & $wk_idx_find_isola==-1 )
      {
         $wk_ok_lat_isola = 0

         if( STRCMP(STRSTR(NOME($wk_near_basi[$wk_n]),"Ang"),"")==0 )
         {
            SET_#($wk_near_basi[$wk_n])

            $wk_ok_filo_test_isola = 0

            //filo alto
            if( $wk_filo_test_isola==1 )
            {
               if ( ABS( VAR_VAL($wk_idx_test_isola,"alto_0.y") - VAR_VAL($wk_near_basi[$wk_n],"alto_0.y") )<=10 )
                  { $wk_ok_filo_test_isola = 1 }
            }

            if( $wk_filo_test_isola==-1 )
            {
               //Claudio 23/11/2018 se la scocca ha VAR_Alt_Zoc,allora lo considero nel confronto del filo basso
               //Es. base con contrapposto SchienaleH8Sotto : deve essere accettata l'isola
               //    base: b0y=0  e VAR_Alt_Zoc = 60
               //    SchienaleH8Sotto :  b0y=60 e VAR_Alt_Zoc= 0
               //
               //if ( ABS( VAR_VAL($wk_idx_test_isola,"base_0.y") - VAR_VAL($wk_near_basi[$wk_n],"base_0.y") )<=10 )
               //   { $wk_ok_filo_test_isola = 1 }
               $wk_b0y_test_isola = VAR_VAL($wk_idx_test_isola,"base_0.y")   + VAR_VAL($wk_idx_test_isola,"VAR_Alt_Zoc")
               $wk_b0y_near_isola = VAR_VAL($wk_near_basi[$wk_n],"base_0.y") + VAR_VAL($wk_near_basi[$wk_n],"VAR_Alt_Zoc")
               if ( ABS( $wk_b0y_test_isola - $wk_b0y_near_isola )<=10 )
                  { $wk_ok_filo_test_isola = 1 }
            }

            if( $wk_filo_test_isola==0 ) { $wk_ok_filo_test_isola = 1 }

            if( $wk_ok_filo_test_isola )
            {
               $wk_b0_near_lat = #base_0 $wk_b0_near_lat.y = $wk_b0_test_lat.y
               $wk_b3_near_lat = #base_3 $wk_b3_near_lat.y = $wk_b0_test_lat.y

               //Claudio 23/10/2018 schienale retro base: la faccia b1-b2 è quella agganciata alla base
               if ( NOME($wk_near_basi[$wk_n]) == "SchienaleRetroBase"
                  // altri schienali retro base
                  | HAS_ALIAS($wk_near_basi[$wk_n],"SchRetroZoc") )
               {
                  $wk_b0_near_lat = #base_2 $wk_b0_near_lat.y = $wk_b0_test_lat.y
                  $wk_b3_near_lat = #base_1 $wk_b3_near_lat.y = $wk_b0_test_lat.y
               }

               //controllo lato sx
               if( $wk_lato_test_isola == -1 )
               {
                  $wk_p1_iint = INTERFERISCI($wk_b3_near_lat,$wk_ang_y_3+90,$wk_b0_test_lat,$wk_b3_test_lat)
                  if( DISTANZA($wk_p1_iint,$wk_b0_test_lat) <=10 ) { $wk_ok_lat_isola = 1 }
                  // i punti son allineati in X, ma potrebbero essere distanti in Z (near iniziale 200)
                  //..sarebbe da completare controllando i fianchi allungati
               }
               //controllo lato dx
               if( $wk_lato_test_isola == 1 )
               {
                  $wk_p1_iint = INTERFERISCI($wk_b0_near_lat,$wk_ang_y_3+90,$wk_b0_test_lat,$wk_b3_test_lat)
                  if( DISTANZA($wk_p1_iint,$wk_b3_test_lat) <=10 ) { $wk_ok_lat_isola = 1 }
                  // i punti son allineati in X, ma potrebbero essere distanti in Z (near iniziale 200)
                  //..sarebbe da completare controllando i fianchi allungati
               }
            }
         }

         //verifico l'angolo
         if ( $wk_ok_lat_isola==1 )
         {
            $wk_diff_ang = ANG_TOT2($wk_idx_test_isola) - ANG_TOT2($wk_near_basi[$wk_n])
            if ( ABS ( ABS($wk_diff_ang) - 180 ) <= 0.1 ) { $wk_idx_find_isola = $wk_near_basi[$wk_n] }

            //Claudio 23/10/2018 sch retro base, ha stesso angolo della base a cui è agganciata
            if ( NOME($wk_near_basi[$wk_n]) == "SchienaleRetroBase"
               // altri schienali retro base
               | HAS_ALIAS($wk_near_basi[$wk_n],"SchRetroZoc") )
            {
               if ( ABS($wk_diff_ang) <= 0.1 ) { $wk_idx_find_isola = $wk_near_basi[$wk_n] }
            }
         }
         $wk_n = $wk_n +1
      }
   }

   PROCEDURA calcola_ang_y_3
   {
      a_z=$P1.z-$P2.z
      a_x=$P2.x-$P1.x
      if(a_z==0 & a_x==0)  { $wk_ang_y_3=0 }
      else                 { $wk_ang_y_3=GRADI(ATAN2(a_z,a_x)) }
   }

   PROCEDURA decodifica_tag_sxdx
   {
      tag_sx=ATOI(LEFT(AA_TAGLIO_SX,2))
      res = ANG_TOP_FS_funcBDM(ang_a_sx)
      if ( res ) { tag_sx=ATOI(LEFT(AA_TAGLIO_FS_SX,2)) }

      tag_dx=ATOI(LEFT(AA_TAGLIO_DX,2))
      res = ANG_TOP_FS_funcBDM(ang_a_dx)
      if ( res ) { tag_dx=ATOI(LEFT(AA_TAGLIO_FS_DX,2)) }
   }

   PROCEDURA Ctl_Lung_Top
   {
      // con le anagrafiche specializzate in Gemo non funziona il ritorno della dim max e min
      // temporaneamente le gestisco "manualmente" a BDM in base al materiale del top
      // Misure MAX in lunghezza:
      // ACR    --> acrilico                4800
      // PIETRA --> pietra                  2700
      // CONGLQ --> conqlomerato di quarzo  3000
      // CARBON --> carbontech              3300
      // INOX   --> inox                    4500
      // UNITOP --> laminato uniline        4180
      // LAMTOP --> lamminato               4180
      // VLO    --> vetro laccato opaco     4500
      // VLU    --> vetro laccato lucido    4500

      X_Max_Top_BDM = VAR_VAL(ATTUALE(),"ORD_XMAX")

      //if( MaterialeTop == "ACR"    ) { X_Max_Top_BDM = 4800 } else {
      //if( MaterialeTop == "PIETRA" ) { X_Max_Top_BDM = 2800 } else {
      //if( MaterialeTop == "CONGLQ" ) { X_Max_Top_BDM = 3000 } else {
      //if( MaterialeTop == "CARBON" ) { X_Max_Top_BDM = 3300 } else {
      //if( MaterialeTop == "INOX"   ) { X_Max_Top_BDM = 4500 } else {
      //if( MaterialeTop == "UNITOP" ) { X_Max_Top_BDM = 4180 } else {
      //if( MaterialeTop == "LAMTOP" ) { X_Max_Top_BDM = 4180 } else {
      //if( MaterialeTop == "VLO"    ) { X_Max_Top_BDM = 4500 } else {
      //if( MaterialeTop == "VLU"    ) { X_Max_Top_BDM = 4500 } } } } } } } } }

       // X_Tot -> dimensione passata a gestionale

      // leggo la dimensione massima del top da DB per utilizzare le regole di specializzazione
      // per materiale e non dover cambiare e gestire questi limiti a BDM
      //GOSUB LeggiRegolaTop

      if( VAR_EXIST(ATTUALE(),"DimMaxTop") )
      {
         if( VAR_VAL_STR(ATTUALE(),"DimMaxTop")!="0" ) { X_Max_Top_BDM=ATOI(DimMaxTop) }
      }

      if( ACTION()>0
//        & DLL_VALIDATO
        & $OnLoadOrder==0
        //& VAR_VAL(idx_att,"ORD_XMAX") > 0
        //& X_Tot > VAR_VAL(idx_att,"ORD_XMAX")
        //& ABS(X_Tot - VAR_VAL(idx_att,"ORD_XMAX")) > 0.001 )
        & X_Max_Top_BDM > 0
        & X_Tot > X_Max_Top_BDM
        & ABS(X_Tot - X_Max_Top_BDM) > 0.001 )
      {
         $wk_caption = "  Messaggio PIANI \n"
         $wk_r1=STRCAT(ORD_COD," - ",ORD_DES)
         //$wk_r2=STRCAT("Massima lunghezza consentita: ",STR(ORD_XMAX))
         $wk_r2=STRCAT("\nMassima lunghezza consentita: ",STR(X_Max_Top_BDM))

         //arr_in = X_Tot - ORD_XMAX GOSUB arrotonda
         arr_in = X_Tot - X_Max_Top_BDM
         //GOSUB arrotonda
         arr_out=FLOOR(arr_in*10)/10
         $wk_r3 = STRCAT("\n\nL'eccedenza vale: ",STR(arr_out) )
         $wk_r4 = ""
         $wk_r5 = "\nAdesso sarà chiesta la misura da impostare."
         $wk_r6 = STRCAT("\nMisura totale attuale: ",STR(X_Tot) )
         DISPLAY3(STRCAT($wk_caption,$wk_r1,$wk_r2,$wk_r3,$wk_r5,$wk_r6),$MB_ICONQUESTION)
         //COMANDO2(STRCAT("run_dll_cmd bdmdialog MakeDialog ",APICI(),$path_bdm,"Dialog.txt|Messaggio",APICI()))
         $wk_caption = ""  $wk_r1 = "" $wk_r2 = "" $wk_r3 = "" $wk_r4 = "" $wk_r5 = "" $wk_r6 = ""

         //wk_msg1 = "ATTENZIONE!"
         //wk_msg2 = STRCAT("\n",ORD_COD," - ",ORD_DES)
         //wk_msg3 = STRCAT("\nMassima lunghezza consentita: ",STR(X_Max_Top_BDM))
         //
         //wk_msg4 = STRCAT("\n\nMisura totale attuale: ",STR(X_Tot) )
         //
         //arr_in  = X_Tot - X_Max_Top_BDM
         //arr_out =FLOOR(arr_in*10)/10
         //wk_msg5 = STRCAT("\n\nL'eccedenza vale: ",STR(arr_out) )
         //DISPLAY3(STRCAT($wk_caption,$wk_r1,$wk_r2,$wk_r3,$wk_r5,$wk_r6),$MB_ICONQUESTION+$MB_YESNO)

         //VAR_CREATE_NUM(-1,"Misura_Da_Impostare",ORD_XMAX,$MODE_USER+$MODE_NOSAVE,"")
         VAR_CREATE_NUM(-1,"Misura_Da_Impostare",X_Max_Top_BDM,$MODE_USER+$MODE_NOSAVE,"")
         res=CHIEDI(-1,"Misura_Da_Impostare")

         //calcolo la X in modo che X_Tot risulti quanto impostato (...annullo AA_SBORDO_ ,così non li conteggio per la X)
         $wk_tmp_num = $Misura_Da_Impostare  - brd_dx - brd_sx + Rid_dx + Rid_sx  -aa_sbrd_sx-aa_sbrd_dx
         COMANDO2(STRCAT("VAR_CHANGE 1 ",STR(idx_att)," X=",STR($wk_tmp_num)," AA_SBORDO_SX=0 AA_SBORDO_DX=0"))
         X = $wk_tmp_num
         AA_SBORDO_SX = 0
         AA_SBORDO_DX = 0

         //aggiorno X_Tot
         GOSUB top_calcola_xt
         //
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_att)," //proc Ctl_Lung_Top"))
      }
   }

   PROCEDURA top_calcola_xt
   {
      brd_sx=0
      brd_dx=0

      Xt = X + AA_SBORDO_SX + AA_SBORDO_DX + brd_dx + brd_sx + aa_sbrd_sx + aa_sbrd_dx

      //dim passata a gestionale (e controllata come dim max)
      X_Tot = Xt - Rid_dx - Rid_sx
   }

   PROCEDURA posiz_teorico_top
   {
      idx_att = ATTUALE()
      nome_att = NOME(idx_att)

      if ( VAR_EXIST(-1,"alt_base") )  { fusto_base = $alt_base }
      else                             { fusto_base = 760 }

      if ( IS_VAR_FIXED(idx_att,"VAR_Posizionamento_teorico")==0 )
      {
         VAR_Posizionamento_teorico = 600
         VAR_Posizionamento_teorico = wk_altz*10 + fusto_base
      }

//} agg condizione per appoggio monoblocchi su basi 19/11/07 ******
   }

   //trovo le basi sotto
   PROCEDURA Trova_idx_basi_sotto
   {
      if( ACTION()<=0 | ACTION()==2 ) { EXITSUB() }
      //if( ACTION()<=0 ) { EXITSUB() }

      idx_rif_steso_sx = -1
      idx_rif_steso_dx = -1

      idx_rif_steso_iso_sx = -1
      idx_rif_steso_iso_dx = -1

      if( IS_IDX(ID_Sin) & IS_IDX(ID_Des) )
      {
         idx_rif_steso_sx = ID_Sin
         idx_rif_steso_dx = ID_Des

         //EXITSUB()
      }

      ang_att = ANG_TOT2(ATTUALE())
      if( ang_att<0 )    { ang_att = ang_att + 360 }
      if( ang_att>=360 ) { ang_att = ang_att - 360 }

      BOX_MODE(0)
      //NEAR("wk_bass_sx",idx_near_sx,10,0,"ScoccaT_Ba*")
      NEAR("wk_bass_sx",idx_near_sx,2,0,"ScoccaT_Ba*")

      //while ( wk_bass_sx>0 & IS_IDX(idx_rif_steso_sx) == 0 )
      while ( wk_bass_sx>0 )
      {
         ang_test = ANG_TOT2(wk_bass_sx[wk_bass_sx])
         if( ang_test<0 )    { ang_test = ang_test + 360 }
         if( ang_test>=360 ) { ang_test = ang_test - 360 }

         if ( ABS(ang_test-ang_att)<0.1  )
         {
            idx_rif_steso_sx = wk_bass_sx[wk_bass_sx]
         }
         else
         {
            if( NOME(wk_bass_sx[wk_bass_sx])=="ScoccaT_BaseAngoloIsola" )
            {
               SET_#(wk_bass_sx[wk_bass_sx])
               if ( ABS(#AngoloDx-ang_att)<0.1  ) { idx_rif_steso_sx = wk_bass_sx[wk_bass_sx] }
            }

            if( IS_MATCH(NOME(wk_bass_sx[wk_bass_sx]),"ScoccaT_BaseAng*")!=1 )
            {
               idx_rif_steso_iso_sx = wk_bass_sx[wk_bass_sx]
            }
         }

         wk_bass_sx = wk_bass_sx -1
      }

      BOX_MODE(0)
      NEAR("wk_bass_dx",idx_near_dx,2,0,"ScoccaT_Ba*")
      //NEAR("wk_bass_dx",idx_near_dx,10,0,"ScoccaT_Ba*")
      //NEAR("wk_bass_dx",idx_near_dx,20,0,"ScoccaT_Ba*")
      //while ( wk_bass_dx>0 & IS_IDX(idx_rif_steso_dx) == 0 )
      while ( wk_bass_dx>0 )
      {
         ang_test = ANG_TOT2(wk_bass_dx[wk_bass_dx])
         if( ang_test<0 )    { ang_test = ang_test + 360 }
         if( ang_test>=360 ) { ang_test = ang_test - 360 }

         if ( ABS(ang_test-ang_att)<0.1  ) { idx_rif_steso_dx = wk_bass_dx[wk_bass_dx] }
         else
         {
            if( NOME(wk_bass_dx[wk_bass_dx])=="ScoccaT_BaseAngoloIsola" )
            {
               SET_#(wk_bass_dx[wk_bass_dx])
               if ( ABS(#AngoloSx-ang_att)<0.1  ) { idx_rif_steso_dx = wk_bass_dx[wk_bass_dx] }
            }

            if( IS_MATCH(NOME(wk_bass_dx[wk_bass_dx]),"ScoccaT_BaseAng*")!=1 )
            {
               idx_rif_steso_iso_dx = wk_bass_dx[wk_bass_dx]
            }
         }
         wk_bass_dx = wk_bass_dx -1
      }
   }

   PROCEDURA Setta_VarTipoTop
   {
      //VAR_TipoTop 0 - 9 TOP Nobile + SOTTOTOP
      //VAR_TipoTop = 0 Vetro    23mm  -->  4mm + 19mm
      //VAR_TipoTop = 1 Vetro    29mm  --> 10mm + 19mm
      //VAR_TipoTop = 2 Quarzo   31mm  --> 12mm + 19mm
      //VAR_TipoTop = 3 Laminato 29mm  --> 10mm + 19mm
      //VAR_TipoTop = 4 Laminato 31mm  --> 12mm + 19mm
      //
      //VAR_TipoTop 10 - 19 TOP CORPO UNICO
      //VAR_TipoTop = 10 Laminato 29mm  --> 10mm + 19mm
      //VAR_TipoTop = 11 Acciaio  29mm  --> 10mm + 19mm
      //VAR_TipoTop = 12 Wildwood 30mm  --> 11mm + 19mm
      //VAR_TipoTop = 13 Laminato 31mm  --> 12mm + 19mm
      //
      //VAR_TipoTop 20 - 29 TOP 80
      //VAR_TipoTop = 20 Madeterraneo  80 mm  --> 80mm + 19mm
      //VAR_TipoTop = 21 Acciaio Steel 80mm   --> 80mm + 19mm
      //VAR_TipoTop = 22 Wildwood      80mm   -->  80mm + 19mm
      //VAR_TipoTop = 23 Acciaio Steel Penisola 80mm   --> 80mm

      SpessorePiano = 4
      SpessoreSottoPiano = 19

      TopUnico      = 0

      LungMaxTop     = 4000

      ProfMinTop     = 331
      ProfMaxTop     = 1440

      passa_CodTop = ""
      passa_RadTop = ""

      //if( VAR_TipoTop==0 )  { SpessorePiano = 4   passa_CodTop = "T04902"  passa_RadTop = "TOPVTR4" }
      //if( VAR_TipoTop==1 )  { SpessorePiano = 10  passa_CodTop = "T04901"  passa_RadTop = "TOPVTR10" }
      if( VAR_TipoTop==0 )
      {
         SpessorePiano = 4   passa_CodTop = "T04902"  passa_RadTop = "TOPVTR"   LungMaxTop=3510
         if( Zt>730 ) { passa_RadTop = "TOPVTR_2"   LungMaxTop=3200 }
         ProfMaxTop     = 1450
      }
      if( VAR_TipoTop==1 )
      {
         //Luca 31/08/2020 riporto modifiche di LAGO
         //SpessorePiano = 10  passa_CodTop = "T04901"  passa_RadTop = "TOPVTR"   LungMaxTop=3200
         //if( Zt>730 ) { passa_RadTop = "TOPVTR_2"   LungMaxTop=3200 }
         SpessorePiano = 10  passa_CodTop = "T04901"  passa_RadTop = "TOPVTR"   LungMaxTop=3510
         if( Zt>730 ) { passa_RadTop = "TOPVTR_2"   LungMaxTop=2800 }
         //LZ 28/07/2020
         if( Zt>1150 ) { passa_RadTop = "TOPVTR_3"   LungMaxTop=2220 }
         ProfMaxTop     = 1450
      }
      if( VAR_TipoTop==2 )
      {
         SpessorePiano = 12  passa_CodTop = "T06901"  passa_RadTop = "TOPQRZ"   LungMaxTop=2980
         if( Zt>758 )  { passa_RadTop = "TOPQRZ_2"   LungMaxTop=2800 }
         if( Zt>1178 ) { passa_RadTop = "TOPQRZ_3"   LungMaxTop=2220 }
      }

      if( VAR_TipoTop==3 )   { SpessorePiano = 10  passa_CodTop = "T03901"  passa_RadTop = "TOPFENIX" LungMaxTop=4200 TopUnico=1 }
      if( VAR_TipoTop==4 )   { SpessorePiano = 12  passa_CodTop = "T03901"  passa_RadTop = "TOPFENIX" LungMaxTop=4200 TopUnico=1 }

      if( VAR_TipoTop==6 )
      {
         SpessorePiano = 4   passa_CodTop = "T05902"  passa_RadTop = "TOPXG"    LungMaxTop=3510
         if( Zt>730 ) { passa_RadTop = "TOPXG_2"   LungMaxTop=3200 }
         ProfMaxTop     = 1450
      }
      if( VAR_TipoTop==7 )
      {
         SpessorePiano = 10  passa_CodTop = "T05901"  passa_RadTop = "TOPXG"    LungMaxTop=3510
         if( Zt>730 ) { passa_RadTop = "TOPXG_2"   LungMaxTop=3200 }
         ProfMaxTop     = 1450
      }

      if( VAR_TipoTop==10 )  { SpessorePiano = 10  passa_CodTop = "T02901"  passa_RadTop = "TOPLAM"   LungMaxTop=4200 TopUnico=1 }
      if( VAR_TipoTop==13 )  { SpessorePiano = 12  passa_CodTop = "T02901"  passa_RadTop = "TOPLAM"   LungMaxTop=4200 TopUnico=1 }
      if( VAR_TipoTop==11 )  { SpessorePiano = 10  passa_CodTop = "T09901"  passa_RadTop = "TOPSTEEL" LungMaxTop=4000 TopUnico=1 }
      if( VAR_TipoTop==12 )
      {
         SpessorePiano = 10  passa_CodTop = "T07901"  passa_RadTop = "TOPWW"    LungMaxTop=2944 TopUnico=1
         if( Zt>1150 ) { passa_RadTop = "TOPWW_2"   LungMaxTop=2500 }
      }

      if( VAR_TipoTop==20 )  { SpessorePiano = 80  passa_CodTop = "T08901"  passa_RadTop = "TOPMADET" LungMaxTop=4200 }
      if( VAR_TipoTop==21 )  { SpessorePiano = 80  passa_CodTop = "T09902"  passa_RadTop = "TOPSTEEL" LungMaxTop=4000 }
      if( VAR_TipoTop==22 )
      {
         SpessorePiano = 80  passa_CodTop = "T07902"  passa_RadTop = "TOPWW"    LungMaxTop=2944
         if( Zt>1150 ) { passa_RadTop = "TOPWW_2"   LungMaxTop=2500 }
      }

      // 14/04/21 - Gestione per TOP PENISOLA STEEL
      if( VAR_TipoTop==23 )  { SpessorePiano = 10  passa_CodTop = "T09013"  passa_RadTop = "TOPENSTEEL" LungMaxTop=4000 }

      //Luca 23/10/2019
      if( VAR_TipoTop==99 ) { SpessorePiano = SpessoreTopCliente }

      //Luca 03/05/2019 se definita in gemo, uso quella
      if( VAR_VAL(ATTUALE(),"ORD_XMAX")>0 ) { LungMaxTop  = VAR_VAL(ATTUALE(),"ORD_XMAX") }

      VAR_SET_MENU(ATTUALE(),"X",STRCAT("( 10-",STR(LungMaxTop), ")"))

      VAR_SET_MENU(ATTUALE(),"Zt",STRCAT("( ",STR(ProfMinTop),"-",STR(ProfMaxTop), ")"))

      //TEMPORANEO
      //TopUnico      = 0
   }

   PROCEDURA Setta_Sbordi_Top
   {
      if ( ACTION() == 1064 | ACTION() < 0 ) { EXITSUB() }

      //if( IS_VAR_FIXED(ATTUALE(),"aa_sbrd_sx")==0 ) { aa_sbrd_sx  = 0 }
      //if( IS_VAR_FIXED(ATTUALE(),"aa_sbrd_dx")==0 ) { aa_sbrd_dx  = 0 }
      //if( IS_VAR_FIXED(ATTUALE(),"aa_sbrd_fr")==0 ) { aa_sbrd_fr  = 0 }
      //if( IS_VAR_FIXED(ATTUALE(),"aa_sbrd_rt")==0 ) { aa_sbrd_rt  = 0 }

      ConFiancoFin_Sx = 0
      ConFiancoFin_Dx = 0

      ConFusion_Sx = 0
      ConFusion_Dx = 0

      if( IS_IDX(idx_rif_steso_sx)==0 & IS_IDX(idx_rif_steso_dx)==0 ) { EXITSUB() }

      aa_sbrd_rt = -1

      if( IS_IDX(idx_rif_steso_iso_sx) | IS_IDX(idx_rif_steso_iso_dx) )
      {
         aa_sbrd_rt = 25

         //verifico presenza ww
         wk_con_ww_rt = 0
         if( IS_IDX(idx_rif_steso_iso_dx) ) { wk_con_ww_rt = Ctrl_presenza_WildWood(idx_rif_steso_iso_dx) }
         else                               { wk_con_ww_rt = Ctrl_presenza_WildWood(idx_rif_steso_iso_sx) }

         aa_sbrd_rt = aa_sbrd_rt + wk_con_ww_rt
      }

      //default 25, se presente almeno un frontale wildwood va aumentato di 1 mm
      aa_sbrd_fr  = 25

      wk_con_ww = Ctrl_presenza_WildWood(idx_rif_steso_sx)

      aa_sbrd_fr = aa_sbrd_fr + wk_con_ww

      wk_basi = 1
      if( idx_rif_steso_sx!=idx_rif_steso_dx ) { wk_basi = 2 }

      if( VAR_EXIST(idx_rif_steso_sx,"idx_sx") )
      {
         aa_sbrd_sx = 0

         SET_#(idx_rif_steso_sx)

         //oppure non allineato sopra
         //wk_diffy_sx = VAR_VAL(idx_rif_steso_sx,"alto0y_abs") - VAR_VAL(#idx_sx,"alto_3.y")
         //if( IS_IDX(#idx_sx)==0 | wk_diffy_sx>5 )
         if( IS_IDX(#idx_sx)==0 )
         {
            aa_sbrd_sx = 2
            if( wk_basi==1 ) { aa_sbrd_sx = 1 }
         }

         //aa_sbrd_sx = aa_sbrd_sx + 4*VAR_VAL(idx_rif_steso_sx,"ConFiancoFinSx")
         if( VAR_VAL(idx_rif_steso_sx,"ConFiancoFinSx")==1 )
         {
            //ConFiancoFin_Sx = 1
            //verifico che sia un fianco superiore
            SET_#(idx_rif_steso_sx)
            if( IS_IDX(#idx_fiaf_sx) )
            {
               //if( ABS(#alto_0.y - VAR_VAL(idx_rif_steso_sx,"alto_0.y"))<20 )
               if( ABS(#alto_0.y - VAR_VAL(#idx_fiaf_sx,"alto_0.y"))<20 ) { ConFiancoFin_Sx = 1 }
            }
         }
         else
         {
            if( IS_IDX(idx_rif_steso_iso_sx) )
            {
               if( VAR_VAL(idx_rif_steso_iso_sx,"ConFiancoFinDx")==1 ) { ConFiancoFin_Sx = 1 }
            }
         }
         aa_sbrd_sx = aa_sbrd_sx + 4*ConFiancoFin_Sx

         //se non ho il fianco di finitura a sx
         //verifico se ho un altro top e controllo lo sbordo
         if( ConFiancoFin_Sx==0 )
         {
            if( IS_IDX(idx_topvic_sx)==1 )
            {
               if( VAR_VAL(idx_topvic_sx,"ConFiancoFin_Dx") )
               {
                  aa_sbrd_sx = -1*VAR_VAL(idx_topvic_sx,"aa_sbrd_dx")
               }
            }
         }

         //Luca 07/06/2019 **** FUSION ****
         //if( VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX")==1 )
         //{
         //   aa_sbrd_sx = 2
         //   ConFusion_Sx = 1
         //
         //   //Luca 13/06/2019
         //   //eccezione lavastoviglie
         //   if( VAR_EXIST(idx_rif_steso_sx,"idx_alto_sx") )
         //   {
         //      wk_idx_sx = VAR_VAL(idx_rif_steso_sx,"idx_alto_sx")
         //      if( IS_MATCH(NOME(wk_idx_sx),"ScoccaT_BaseLvs*") )
         //      {
         //         aa_sbrd_sx = -6
         //      }
         //   }
         //}
         //else
         //{
         //   if( IS_IDX(idx_topvic_sx)==1 )
         //   {
         //      if( VAR_VAL(idx_topvic_sx,"ConFusion_Dx") )
         //      {
         //         aa_sbrd_sx = -1*VAR_VAL(idx_topvic_sx,"aa_sbrd_dx")
         //      }
         //   }
         //}

         if( VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX")==1 )
         {
            aa_sbrd_sx = -6
         }

         if( VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX")==2
           | VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX")==3 )
         {
            aa_sbrd_sx = 6
            ConFusion_Sx = 1
         }

         idx_test_base_vicina_sx = -1
         if( VAR_EXIST(idx_rif_steso_sx,"idx_alto_sx") ) { idx_test_base_vicina_sx = VAR_VAL(idx_rif_steso_sx,"idx_alto_sx") }
         else                                            { idx_test_base_vicina_sx = VAR_VAL(idx_rif_steso_sx,"idx_sx") }

         if( IS_IDX(idx_test_base_vicina_sx) )
         {
            if( VAR_VAL(idx_test_base_vicina_sx,"FSN_flag_DX") == 4 )
            {
               aa_sbrd_sx = 6
               ConFusion_sx = 1
            }
         }

      }

      if( VAR_EXIST(idx_rif_steso_dx,"idx_dx") )
      {
         //verifcio che alto_0.y di attuale non sia maggioare di alto_0.y
         aa_sbrd_dx = 0

         SET_#(idx_rif_steso_dx)

         //oppure non allineato sopra
         //wk_diffy_dx = VAR_VAL(idx_rif_steso_dx,"alto0y_abs") - VAR_VAL(#idx_dx,"alto_0.y")
         //if( IS_IDX(#idx_dx)==0 | wk_diffy_dx>5 )
         if( IS_IDX(#idx_dx)==0 )
         {
            aa_sbrd_dx = 2
            if( wk_basi==1 ) { aa_sbrd_dx = 1 }
         }

         SET_#(idx_rif_steso_dx)
         wk_diff_y = VAR_VAL(ATTUALE(),"alto0y_abs") - #alto_3.y
         if( wk_diff_y<5 )
         {
            aa_sbrd_dx = 0

            SET_#(idx_rif_steso_dx)
            if( IS_IDX(#idx_dx)==0 )
            {
               aa_sbrd_dx = 2
               if( wk_basi==1 ) { aa_sbrd_dx = 1 }
            }
         }

         //aa_sbrd_dx = aa_sbrd_dx + 4*VAR_VAL(idx_rif_steso_dx,"ConFiancoFinDx")
         if( VAR_VAL(idx_rif_steso_dx,"ConFiancoFinDx")==1 )
         {
            //ConFiancoFin_Dx = 1
            //verifico che sia un fianco superiore
            SET_#(idx_rif_steso_dx)
            if( IS_IDX(#idx_fiaf_dx) )
            {
               if( ABS(#alto_0.y - VAR_VAL(#idx_fiaf_dx,"alto_0.y"))<20 )
               {
                  ConFiancoFin_Dx = 1
               }
            }
         }
         else
         {
            if( IS_IDX(idx_rif_steso_iso_dx) )
            {
               if( VAR_VAL(idx_rif_steso_iso_dx,"ConFiancoFinSx")==1 )  { ConFiancoFin_Dx = 1 }
            }
         }

         aa_sbrd_dx = aa_sbrd_dx + 4*ConFiancoFin_Dx


         //se non ho il fianco di finitura a sx
         //verifico se ho un altro top e controllo lo sbordo
         if( ConFiancoFin_Dx==0 )
         {
            if( IS_IDX(idx_topvic_dx)==1 )
            {
               if( VAR_VAL(idx_topvic_dx,"ConFiancoFin_Sx") )
               {
                  aa_sbrd_dx = -1*VAR_VAL(idx_topvic_dx,"aa_sbrd_sx")
               }
            }
         }


         //Luca 07/06/2019 **** FUSION ****
         //if( VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX") )
         //{
         //   ConFusion_Dx = 1
         //   aa_sbrd_dx = 2
         //
         //   //Luca 13/06/2019
         //   //eccezione lavastoviglie
         //   if( VAR_EXIST(idx_rif_steso_dx,"idx_alto_dx") )
         //   {
         //      wk_idx_dx = VAR_VAL(idx_rif_steso_dx,"idx_alto_dx")
         //      if( IS_MATCH(NOME(wk_idx_dx),"ScoccaT_BaseLvs*") )
         //      {
         //         aa_sbrd_dx = -6
         //      }
         //   }
         //}
         //else
         //{
         //   if( IS_IDX(idx_topvic_dx)==1 )
         //   {
         //      if( VAR_VAL(idx_topvic_dx,"ConFusion_Sx") )
         //      {
         //         aa_sbrd_dx = -1*VAR_VAL(idx_topvic_dx,"aa_sbrd_sx")
         //      }
         //   }
         //}

         if( VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX")==1 )
         {
            aa_sbrd_dx = -6
         }

         if( VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX")==2
           | VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX")==3 )
         {
            aa_sbrd_dx = 6
            ConFusion_dx = 1
         }

         idx_test_base_vicina_dx = -1
         if( VAR_EXIST(idx_rif_steso_dx,"idx_alto_dx") ) { idx_test_base_vicina_dx = VAR_VAL(idx_rif_steso_dx,"idx_alto_dx") }
         else                                            { idx_test_base_vicina_dx = VAR_VAL(idx_rif_steso_dx,"idx_dx") }

         if( IS_IDX(idx_test_base_vicina_dx) )
         {
            if( VAR_VAL(idx_test_base_vicina_dx,"FSN_flag_SX") == 4 )
            {
               aa_sbrd_dx = 6
               ConFusion_dx = 1
            }
         }
      }

      //Luca 26/02/2019
      //{ bordi in caso di angolo
      if( IS_IDX(idx_rif_steso_sx) )
      {
         if( NOME(idx_rif_steso_sx)=="ScoccaT_BaseAngPan" ) { aa_sbrd_sx = -1 }
      }

      if( VAR_EXIST(idx_rif_steso_sx,"idx_sx") )
      {
         SET_#(idx_rif_steso_sx)
         if( IS_IDX(#idx_sx) )
         {
            if( NOME(#idx_sx)=="ScoccaT_BaseAngPan" )
            {
               //Luca 23/10/2019
               //if( ABS(ANG_TOT2(idx_rif_steso_sx)-ANG_TOT2(#idx_sx))>0.1 ) { aa_sbrd_sx = 6 }
               if( ABS(ANG_TOT2(idx_rif_steso_sx)-ANG_TOT2(#idx_sx))>0.1 ) { aa_sbrd_dx = 7 }
            }
            if( NOME(#idx_sx)=="ScoccaT_BaseAngoloIsola" ) { aa_sbrd_sx = 7 }
         }
      }

      if( IS_IDX(idx_rif_steso_dx) )
      {
         if( NOME(idx_rif_steso_dx)=="ScoccaT_BaseAngPan" ) { aa_sbrd_dx = -1 }
      }

      if( VAR_EXIST(idx_rif_steso_dx,"idx_dx") )
      {
         SET_#(idx_rif_steso_dx)
         if( IS_IDX(#idx_dx) )
         {
            if( NOME(#idx_dx)=="ScoccaT_BaseAngPan" )
            {
               //Luca 23/10/2019
               //if( ABS(ANG_TOT2(idx_rif_steso_dx)-ANG_TOT2(#idx_dx))>0.1 ) { aa_sbrd_dx = 6 }
               if( ABS(ANG_TOT2(idx_rif_steso_dx)-ANG_TOT2(#idx_dx))>0.1 ) { aa_sbrd_dx = 7 }
            }
            if( NOME(#idx_dx)=="ScoccaT_BaseAngoloIsola" ) { aa_sbrd_dx = 7 }
         }
      }
      //} bordi in caso di angolo

      //se almeno una base è bifacciale, allungo dietro
      idx_test = idx_rif_steso_sx
      if( IS_IDX(idx_test)==0 ) { idx_test = idx_rif_steso_dx }

      wk_con_biff = 0
      while( IS_IDX(idx_test) & wk_con_biff==0 )
      {
         if( VAR_VAL(idx_test,"ConBifacciale")==1 ) { wk_con_biff = 1 }

         if( VAR_EXIST(idx_test,"idx_dx") ) { idx_test = VAR_EXIST(idx_test,"idx_dx") }
         else                               { idx_test = -1 }
      }

      if( wk_con_biff ) { aa_sbrd_rt = 25 }
      //TODO -- verificare se i bifacciali sono wildwood

      //Luca 28/05/2019
      //verifico la presenta di penisole in appoggio
      if( ConPenisolaApp==1 & IS_IDX(idx_penisola) )
      {
         SET_#(idx_penisola)
         wk_pos_penisola = 0

         //verifico se hanno lo stesso angolo
         //if( ABS(ANG_TOT2(ATTUALE())-ANG_TOT2(idx_penisola))<0.1 )
         //{
         //   wk_pos_penisola = VAR_VAL(idx_penisola,"VAR_PosPenisola")
         //}
         wk_pos_penisola = VAR_VAL(idx_penisola,"VAR_PosPenisola")

         wk_appoggio_penisola = VAR_VAL(idx_penisola,"VAR_Appoggio")

         if( wk_pos_penisola==-1 )
         {
            aa_sbrd_sx =  -wk_appoggio_penisola - 1
         }

         if( wk_pos_penisola==1  )
         {
            aa_sbrd_dx =  -wk_appoggio_penisola - 1
         }

         if( wk_pos_penisola==10  )
         {
            aa_sbrd_dx =  (-1)*( #Zt - #VAR_SbordoLat) - 1
         }

         if( wk_pos_penisola==-10  )
         {
            aa_sbrd_sx = (-1)*( #Zt - #VAR_SbordoLat ) - 1
         }
      }

      //Luca 15/07/2019
      //{ in caso di presenza di SNACK a L
      if( IS_IDX(idx_top_SNACK_sx)==1 ) { aa_sbrd_sx = 0 }
      if( IS_IDX(idx_top_SNACK_dx)==1 ) { aa_sbrd_dx = 0 }
      //} in caso di presenza di SNACK a L
   }

   PROCEDURA Setta_Sbordi_SottoTop
   {
      if ( ACTION() == 1064 | ACTION() <= 0 | $OnLoadOrder==1 ) { EXITSUB() }

      if( IS_IDX(idx_rif_steso_sx)==0 & IS_IDX(idx_rif_steso_dx)==0 ) { EXITSUB() }

      if( IS_VAR_FIXED(ATTUALE(),"aa_st_rie_sx")==0 ) { aa_st_rie_sx = 0 }
      if( IS_VAR_FIXED(ATTUALE(),"aa_st_rie_dx")==0 ) { aa_st_rie_dx = 0 }
      if( IS_VAR_FIXED(ATTUALE(),"aa_st_rie_fr")==0 ) { aa_st_rie_fr = 0 }
      if( IS_VAR_FIXED(ATTUALE(),"aa_st_rie_rt")==0 ) { aa_st_rie_rt = 0 }

      aa_st_rie_sx = 1
      aa_st_rie_dx = 1

      if( IS_IDX(idx_topvic_sx) ) { aa_st_rie_sx = 0 }
      if( IS_IDX(idx_topvic_dx) ) { aa_st_rie_dx = 0 }


      //{ verifica basi fusion
      //if( VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX") ) { aa_st_rie_sx = 5 }
      //if( VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX") ) { aa_st_rie_dx = 5 }
      //
      //if( VAR_EXIST(idx_rif_steso_sx,"idx_alto_sx") )
      //{
      //   SET_#(idx_rif_steso_sx)
      //   if( IS_IDX(#idx_alto_sx) )
      //   {
      //      if( VAR_VAL(#idx_alto_sx,"FSN_flag_DX") ) { aa_st_rie_sx = 1 }
      //   }
      //}
      //
      //if( VAR_EXIST(idx_rif_steso_dx,"idx_alto_dx") )
      //{
      //   SET_#(idx_rif_steso_dx)
      //   if( IS_IDX(#idx_alto_dx) )
      //   {
      //      if( VAR_VAL(#idx_alto_dx,"FSN_flag_SX") ) { aa_st_rie_dx = 1 }
      //   }
      //}

      if( VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX")==1 ) { aa_st_rie_sx = 5 }
      if( VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX")==2
        | VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX")==3  ) { aa_st_rie_sx = 1 }

      if( VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX")==1 ) { aa_st_rie_dx = 5 }

      if( VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX")==2
        | VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX")==3 ) { aa_st_rie_dx = 1 }

      //if( VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX") ) { aa_st_rie_sx = 5 }
      //if( VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX") ) { aa_st_rie_dx = 5 }
      //
      //if( VAR_EXIST(idx_rif_steso_sx,"idx_alto_sx") )
      //{
      //   SET_#(idx_rif_steso_sx)
      //   if( IS_IDX(#idx_alto_sx) )
      //   {
      //      if( VAR_VAL(#idx_alto_sx,"FSN_flag_DX") ) { aa_st_rie_sx = 1 }
      //   }
      //}
      //
      //if( VAR_EXIST(idx_rif_steso_dx,"idx_alto_dx") )
      //{
      //   SET_#(idx_rif_steso_dx)
      //   if( IS_IDX(#idx_alto_dx) )
      //   {
      //      if( VAR_VAL(#idx_alto_dx,"FSN_flag_SX") ) { aa_st_rie_dx = 1 }
      //   }
      //}
      //} verifica basi fusion

      //Luca 26/02/2019
      //{ bordi in caso di angolo
      if( VAR_EXIST(idx_rif_steso_sx,"idx_sx") )
      {
         SET_#(idx_rif_steso_sx)
         if( IS_IDX(#idx_sx) )
         {
            if( NOME(#idx_sx)=="ScoccaT_BaseAngPan" )
            {
               //if( ABS(ANG_TOT2(idx_rif_steso_sx)-ANG_TOT2(#idx_sx))>0.1 ) { aa_st_rie_sx = -32 }
               if( ABS(ANG_TOT2(idx_rif_steso_sx)-ANG_TOT2(#idx_sx))>0.1 ) { aa_st_rie_sx = -30 }
            }
            if( NOME(#idx_sx)=="ScoccaT_BaseAngoloIsola"  ) { aa_st_rie_sx = -30 }
         }
      }

      if( VAR_EXIST(idx_rif_steso_dx,"idx_dx") )
      {
         SET_#(idx_rif_steso_dx)
         if( IS_IDX(#idx_dx) )
         {
            if( NOME(#idx_dx)=="ScoccaT_BaseAngPan" )
            {
               //if( ABS(ANG_TOT2(idx_rif_steso_dx)-ANG_TOT2(#idx_dx))>0.1 ) { aa_st_rie_dx = -32 }
               if( ABS(ANG_TOT2(idx_rif_steso_dx)-ANG_TOT2(#idx_dx))>0.1 ) { aa_st_rie_dx = -30 }
            }

            if( NOME(#idx_dx)=="ScoccaT_BaseAngoloIsola"  ) { aa_st_rie_dx = -30 }
         }
      }
      //} bordi in caso di angolo


      //if( aa_sbrd_sx<0 & aa_st_rie_sx<ABS(aa_sbrd_sx) ) { aa_st_rie_sx = -1*aa_sbrd_sx }
      //if( aa_sbrd_dx<0 & aa_st_rie_dx<ABS(aa_sbrd_dx) ) { aa_st_rie_dx = -1*aa_sbrd_dx }
   }

   PROCEDURA Setta_Dimensioni_SottoTop
   {
      if ( ACTION() == 1064 | ACTION() <=0 ) { EXITSUB() }

      idx_pdr = PADRE(ATTUALE(),1)

      if( $OnLoadOrder==1 & NOME(ATTUALE())=="Top" )
      {
         onload_DividiSottoTop = DividiSottoTop
         onload_X_SottoTop     = X_SottoTop
         onload_X_SottoTop2    = X_SottoTop2
         onload_Z_SottoTop2    = Z_SottoTop2

         EXITSUB()
      }

      X_SottoTop = X - aa_st_rie_sx - aa_st_rie_dx
      Z_SottoTop = Z - aa_st_rie_fr - aa_st_rie_rt

      if( NOME(ATTUALE())!="Top" ) { EXITSUB() }

      if( IS_IDX(idx_rif_steso_sx)==0 & IS_IDX(idx_rif_steso_dx)==0 )
      {
         if( VAR_EXIST(ATTUALE(),"onload_DividiSottoTop")==1 )
         {
            DividiSottoTop = onload_DividiSottoTop
            X_SottoTop     = onload_X_SottoTop
            X_SottoTop2    = onload_X_SottoTop2
            Z_SottoTop2    = onload_Z_SottoTop2

            aa_st2_rie_sx = X_SottoTop + aa_st_rie_sx
         }
         EXITSUB()
      }


      if( IS_VAR_FIXED( ATTUALE(), "DividiSottoTop") == 0)
      {
         DividiSottoTop = 0

         if( X_SottoTop > 2700) { DividiSottoTop = 1 }

         if( steso_isola == 1
           & Z_SottoTop > 1200) { DividiSottoTop = 2 }

         if( TopUnico == 1)     { DividiSottoTop = 0 }
      }

      aa_st2_rie_sx = 0
      aa_st2_rie_rt = 0
      Ang_SottoTop2 = 0
      X_SottoTop2   = 0
      Z_SottoTop2   = 0

      if( TopUnico == 1) { EXITSUB() }

      if( DividiSottoTop == 1)
      {
         X_SottoTop_nom = X

         //idx_rif_steso_sx
         //idx_rif_steso_dx

         wk_xdiv =  X/2

         //trovo la base dove interromperlo
         wk_idx_test = idx_rif_steso_sx
         wk_xp = 0
         wk_ok = 0

         while ( wk_ok==0 & IS_IDX(wk_idx_test) )
         {
            wk_xp  = wk_xp + VAR_VAL(wk_idx_test,"X")
            wk_xp2 = wk_xp

            wk_idx_next = -1
            if( VAR_EXIST(wk_idx_test,"idx_dx") )
            {
               SET_#(wk_idx_test)
               wk_idx_next = #idx_dx
               if( IS_IDX(wk_idx_next) ){  wk_xp2 = wk_xp + VAR_VAL(wk_idx_next,"X") }
            }

            if( wk_xp<=wk_xdiv & wk_xp2>=wk_xdiv )
            {
               wk_ok = 1

               wk_diff   = wk_xdiv - wk_xp
               wk_diff2  = wk_xp - wk_xdiv

               if( wk_diff<=wk_diff2 ) { X_SottoTop_nom = wk_xp }
               else                    { X_SottoTop_nom = wk_xp2 }
            }
            else
            {
               wk_idx_test = wk_idx_next
            }
         }

         //calcolo dimensioni corrette e sbordi
         X_SottoTop =  X_SottoTop_nom - aa_st_rie_sx
         X_SottoTop2 = X - X_SottoTop_nom - aa_st_rie_dx
         aa_st2_rie_sx = X_SottoTop_nom

         aa_st_rie_dx = 0
         aa_st2_rie_rt = aa_st_rie_rt
         Z_SottoTop2 = Z_SottoTop
      }

      if( DividiSottoTop == 2)
      {
         if( IS_IDX(idx_rif_steso_sx)==1
           & IS_IDX(idx_rif_steso_iso_dx)==1  )
         {
            Z_SottoTop  = VAR_VAL(idx_rif_steso_sx,"Z")
            Z_SottoTop2 = VAR_VAL(idx_rif_steso_iso_dx,"Z")
         }

         X_SottoTop2 = X_SottoTop
         aa_st2_rie_sx = aa_st_rie_dx
      }
   }

   PROCEDURA Setta_VarTipoSch
   {
      VAR_TipoSchStr = ""

      passa_CodTop = ""
      passa_RadTop = ""

      wk_Xmax1=-1  wk_Xmax2=-1  wk_Xmax3=-1
      wk_Ymax1=-1  wk_Ymax2=-1  wk_Ymax3=-1

      //0   Vetro 4mm
      //1   Vetro 10mm
      //2   Quarzo 12mm
      //3   Fenix 10mm
      //4   Laminglass 10mm
      //5   Steel 10mm
      //6   XGlass 4mm
      //7   XGlass 10mm
      //8   Fenix 12mm
      //9   Laminglass 12mm
      //10  Mdi 12mm
      //100 Alzatina 8mm
      //101 Alzatina 21mm
      //102 Alzatina 15mm

      if( VAR_TipoSch==0 ) { VAR_TipoSchStr = "VET4"  Z = 4   x_min = 120  x_max = 3200  y_min = 92  y_max = 1440  passa_CodSch = "T04904"  passa_RadSch = "SCHVTR" }
      if( VAR_TipoSch==1 )
      {
         VAR_TipoSchStr = "VET10" Z = 10  x_min = 120  x_max = 3510  y_min = 92  y_max = 1440  passa_CodSch = "T04903"  passa_RadSch = "SCHVTR"

         if( X  > 2500 )  { y_max = 1199.5 }
         if( Y  >= 1200 ) { x_max = 2500   }
      }

      if( VAR_TipoSch==6 ) { VAR_TipoSchStr = "XGL4"  Z = 4   x_min = 120  x_max = 3200  y_min = 92  y_max = 1440  passa_CodSch = "T05904"  passa_RadSch = "SCHXG" }
      if( VAR_TipoSch==7 )
      {
         VAR_TipoSchStr = "XGL10" Z = 10  x_min =  120  x_max = 3510  y_min = 92  y_max = 1440  passa_CodSch = "T05903"  passa_RadSch = "SCHXG"

         if( X  > 2500 )  { y_max = 1199.5 }
         if( Y  >= 1200 ) { x_max = 2500   }
      }

      if( VAR_TipoSch==3 )  { VAR_TipoSchStr = "FEN10" Z = 10  x_min = 120  x_max = 4200  y_min = 80  y_max = 1280 passa_CodSch = "T03902"  passa_RadSch = "SCFENIX"  }
      if( VAR_TipoSch==8 )  { VAR_TipoSchStr = "FEN12" Z = 12  x_min = 120  x_max = 4200  y_min = 80  y_max = 1280 passa_CodSch = "T03902"  passa_RadSch = "SCFENIX"  }
      if( VAR_TipoSch==4 )  { VAR_TipoSchStr = "LAM10" Z = 10  x_min = 120  x_max = 4200  y_min = 80  y_max = 1280 passa_CodSch = "T02902"  passa_RadSch = "SCLAM"    }
      if( VAR_TipoSch==9 )  { VAR_TipoSchStr = "LAM12" Z = 12  x_min = 120  x_max = 4200  y_min = 80  y_max = 1280 passa_CodSch = "T02902"  passa_RadSch = "SCLAM"    }

      if( VAR_TipoSch==2 )
      {
         VAR_TipoSchStr = "QRZ"   Z = 12  x_min = 120  x_max = 3040  y_min = 92  y_max = 1380 passa_CodSch = "T06902"  passa_RadSch = "SCHQRZ"

         if( X <= 1500 ) { y_min = 20   }
         if( Y  <   92 ) { x_max = 1500 }
      }

      if( VAR_TipoSch==5 )  { VAR_TipoSchStr = "STEEL"  Z = 10  x_min = 184  x_max = 4000  y_min = 92  y_max = 736 passa_CodSch = "T09904"  passa_RadSch = "SCHSTEEL" }
      if( VAR_TipoSch==10 ) { VAR_TipoSchStr = "MDI"    Z = 12  x_min = 120  x_max = 3200  y_min = 92  y_max = 829 passa_CodSch = "T12902"  passa_RadSch = "SCHMDI"   }

      if( VAR_TipoSch==100 ) { VAR_TipoSchStr = "ALZ8"  Z = 8   x_min = 184  x_max = 4200  y_min = 8   y_max = 8  passa_CodSch = ""  passa_RadSch = "ALZAL"  }
      if( VAR_TipoSch==101 ) { VAR_TipoSchStr = "ALZ21" Z = 15  x_min = 184  x_max = 3800  y_min = 21  y_max = 21 passa_CodSch = ""  passa_RadSch = "ALZAL" }
      if( VAR_TipoSch==102 ) { VAR_TipoSchStr = "ALZ15" Z = 15  x_min = 184  x_max = 4200  y_min = 15  y_max = 15 passa_CodSch = ""  passa_RadSch = "ALZAL" }

      if( Cucina_Versione > 2 )
      {
         if( VAR_TipoSchStr != "ALZ8"
           & VAR_TipoSchStr != "FEN10"
           & VAR_TipoSchStr != "FEN12"
           & VAR_TipoSchStr != "LAM10"
           & VAR_TipoSchStr != "LAM12" ) { passa_RadSch = STRCAT( passa_RadSch, "3" )}
      }

      if( ACTION() > 0 & ACTION()!=2 & $OnLoadOrder != 1 & $ATTIVA_DLL & $CNP == 0 & VAR_VAL( ATTUALE(), "FLAG_Speciale") == 0 )
      {
         VarSetMenuLimiti( ATTUALE() , "X", x_min, x_max, 1 )
         VarSetMenuLimiti( ATTUALE() , "Y", y_min, y_max, 1 )
      }
   }

   //{ procedure per penisole
   PROCEDURA Setta_VarTipoPenisola
   {
      //VAR_TipoPen 20 - 29 TOP 80
      //VAR_TipoPen = 20 Madeterraneo  80mm  --> 80mm
      //VAR_TipoPen = 21 Acciaio Steel 80mm  --> 80mm
      //VAR_TipoPen = 22 Wildwood      80mm  --> 80mm

      LungMaxTop_prec = VAR_VAL( ATTUALE(), "LungMaxTop")
      LargMaxTop_prec = VAR_VAL( ATTUALE(), "LargMaxTop")
      LungMaxTop    = 2944
      LargMaxTop    = -1

      SpessorePiano = 4

      passa_CodTop = ""
      passa_RadTop = ""

      //if( VAR_TipoTop==20 )  { SpessorePiano = 80  passa_CodTop = "T08901"  passa_RadTop = "TOPMADET" LungMaxTop=4200 }
      if( VAR_TipoPiano==21 )  { SpessorePiano = 80  passa_CodTop = "T09905"  passa_RadTop = "PENSTEEL" LungMaxTop=3000 }

//LUCA 04/03/2020 riporto modifiche LAGO
      //Luca 21/01/2020
      //aggiungo modifica fatta da Luca Z.
      //if( VAR_TipoPiano==22 )  { SpessorePiano = 80  passa_CodTop = "T07903"  passa_RadTop = "PENWW"    LungMaxTop=2944 }
      //if( VAR_TipoPiano==22 )
      //{
      //   SpessorePiano = 80  passa_CodTop = "T07016"  passa_RadTop = "PENWW"    LungMaxTop=2944
     //    if(Zt>900)
      //   {
      //      SpessorePiano = 80  passa_CodTop = "T07017"  passa_RadTop = "PENWW_2"    LungMaxTop=2294
      //   }
      //}

      if( VAR_TipoPiano==22 )
      {
         SpessorePiano = 80  passa_CodTop = "T07903"  passa_RadTop = "PENWW"    LungMaxTop = 2208   LargMaxTop = 900

         if(X<=2208)
         {
            LargMaxTop = 1250
         }

         if(Zt>900)
         {
            SpessorePiano = 80  passa_CodTop = "T07903"  passa_RadTop = "PENWW_2"    LungMaxTop = 2208
         }
         else
         {
            LungMaxTop = 2944
         }
      }

      //Luca 04/03/2020 riporto gestione FENIX fatta da LAGO
      if( VAR_TipoPiano==23 )
      {
         SpessorePiano = 80  passa_CodTop = "T03903"  passa_RadTop = "PENFENIX"    LungMaxTop=2944
         if(Zt>900)
         {
            SpessorePiano = 80  passa_CodTop = "T03903"  passa_RadTop = "PENFENIX_2"    LungMaxTop=2208
         }
      }

      //Luca 03/05/2019 se definita in gemo, uso quella
      if( VAR_VAL( ATTUALE(), "ORD_ERRORE") == 0 )
      {
         if( VAR_VAL(ATTUALE(),"ORD_XMAX") > 0 ) { LungMaxTop  = VAR_VAL(ATTUALE(),"ORD_XMAX") }
      }

      VAR_SET_MENU(ATTUALE(),"X",STRCAT("( 520-",STR(LungMaxTop), ")"))
      if( LargMaxTop > 0 )
      {
         VAR_SET_MENU(ATTUALE(),"Z",STRCAT("( 437-",STR(LargMaxTop), ")"))
      }

      HIDE_ON_EDIT2(ATTUALE(),"VAR_RieXSuppDis",1)
      if( VAR_RieXSupp==0 ) { HIDE_ON_EDIT2(ATTUALE(),"VAR_RieXSuppDis",0) }

      wk_min_rie  = 92
      if( VAR_TipoTeste==1 ) { wk_min_rie  = 184 }
      VAR_SET_MENU(ATTUALE(),"VAR_RieXSuppDis",STRCAT("( ",STR(wk_min_rie),"-552 )"))

      //wk_max_sorm = X - 368
      //VAR_SET_MENU(ATTUALE(),"VAR_Appoggio",STRCAT("( 520-",STR(wk_max_sorm)," )"))
      //if( VAR_NSupp==2 ) { VAR_SET_MENU(ATTUALE(),"VAR_Appoggio","( 184-520 )") }

      if( ACTION()==0 & $ATTIVA_DLL )
      {
         //se a muro nascondo tipo appoggio
         if( VAR_TipoPen==1 ) { HIDE_ON_EDIT2(ATTUALE(),"VAR_Appoggio",1) }

         HIDE_ON_EDIT2(ATTUALE(),"VAR_TipoPiano",1)
         HIDE_ON_EDIT2(ATTUALE(),"VAR_TipoPen",1)
      }
   }

   PROCEDURA ConfiguraPenisola
   {
      if( ACTION()<=0 | $ATTIVA_DLL==0 | $CNP__==1 | $OnLoadOrder==1 ) { EXITSUB() }

      if( IS_VAR_FIXED(ATTUALE(),"X")==1 ) { EXITSUB() }

      //se penisola a muro, chiedi X, rientro di testa
      if( VAR_TipoPen==1 )
      {
         r = CHIEDI(ATTUALE(),"X")
         r = CHIEDI(ATTUALE(),"Z")

         if( X>1667 ) { VAR_NSupp  = 2 }

         //r = CHIEDI(ATTUALE(),"VAR_TipoTeste")

         r = CHIEDI(ATTUALE(),"VAR_RieXSupp")
         if( VAR_RieXSupp==0 )
         {
            //wk_min_rie  = 92
            //if( VAR_TipoTeste==1 ) { wk_min_rie  = 184 }
            //VAR_SET_MENU(ATTUALE(),"VAR_RieXSuppDis",STRCAT("( ",STR(wk_min_rie),"-552 )"))

            r = CHIEDI(ATTUALE(),"VAR_RieXSuppDis")
         }

         EXITSUB()
      }

      VAR_NSupp    = 1
      VAR_Appoggio = 520

      r = CHIEDI(ATTUALE(),"X")

      idx_agg = AGGANCIATA(ATTUALE(),"*")

      if( IS_IDX(idx_agg) )
      {
         Z = VAR_VAL(idx_agg,"Z")
         if( VAR_EXIST(idx_agg,"Zt") ) { Z = VAR_VAL(idx_agg,"Zt") }
      }
      else
      {
         r = CHIEDI(ATTUALE(),"Z")
      }

      //r = CHIEDI(ATTUALE(),"VAR_SbordoZ")

      if( X > 2187 )
      {
         VAR_NSupp = 2
         VAR_Appoggio = 184
         VAR_SET_MENU(ATTUALE(),"VAR_Appoggio","( 184-520 )")
         r = CHIEDI(ATTUALE(),"VAR_Appoggio")
      }
      else
      {
         wk_min_sorm = 520
         wk_max_sorm = X - 368

         if( wk_max_sorm < 0 )           { wk_max_sorm = 0 }
         if( wk_min_sorm > wk_max_sorm ) { wk_min_sorm = wk_max_sorm }
         VAR_SET_MENU(ATTUALE(),"VAR_Appoggio",STRCAT("( ",STR(wk_min_sorm),"-",STR(wk_max_sorm)," )"))
         r = CHIEDI(ATTUALE(),"VAR_Appoggio")

         //r = CHIEDI(ATTUALE(),"VAR_TipoTeste")

         r = CHIEDI(ATTUALE(),"VAR_RieXSupp")
         if( VAR_RieXSupp==0 )
         {
            //wk_min_rie  = 92
            //if( VAR_TipoTeste==1 ) { wk_min_rie  = 184 }
            //VAR_SET_MENU(ATTUALE(),"VAR_RieXSuppDis",STRCAT("( ",STR(wk_min_rie),"-552 )"))
            r = CHIEDI(ATTUALE(),"VAR_RieXSuppDis")
         }
      }
   }

   PROCEDURA OnQuery_Penisola
   {
      //livelli per penisola a muro
      if( VAR_TipoPen==1 )
      {
         if( $query_type==5 )
         {
            COMANDO2("LIVELLI CLEAR OnWall")

            liv_wall =  3
            liv_wall[1] = 581
            liv_wall[2] = 736
            liv_wall[3] = 900

            i = 1
            while ( i<=liv_wall )
            {
               COMANDO2( STRCAT("LIVELLI ADD OnWall ", STR(liv_wall[i]), " ", STR(liv_wall[i])) )
               i = i + 1
            }

            $QueryResult__ = 1
         }
      }

      if( $query_type==1 )
      {
         if( VAR_TipoPen==1 )
         {
            //nel post action2 ruoto la penisola
            if( $M4_DragInfo_Mode==1 )
            {
               PenMuro_RuotaP2A = 1
               Yt = $M4_DragInfo_Snap.y
            }
         }

         if( VAR_TipoPen==0 )
         {
            //Se a riferimento
            if( $M4_DragInfo_Mode==0 )
            {
               if( $M4_DragInfo_SxDx==-1 ) { VAR_PosPenisola = -1 }
               if( $M4_DragInfo_SxDx== 1 ) { VAR_PosPenisola =  1 }

               idx_ref = $M4_DragInfo_Ref

               if( IS_MATCH(NOME(idx_ref),"ScoccaT*")==1 )
               {
                  BOX_MODE(0)
                  NEAR_GLOBALE2("wk_top",idx_ref,5,"Top")
                  if( wk_top>0 )
                  {
                     $M4_DragInfo_Ref = wk_top[1]
                     COMANDO(STRCAT("SETTA ",STR($M4_DragInfo_Ref)))

                     //Luca 28/05/2019 se top corpo unico, in appoggio
                     if( VAR_VAL(wk_top[1],"TopUnico")==1  )
                     {
                        wk_sd = SE_STR($M4_DragInfo_SxDx>0,"D","S")
                        cnt_new = CostruisciStrCnt(wk_sd,"A","R",0,0,0,0)
                        $M4_DragInfo_Cnt = cnt_new
                        $QueryResult__ = 3
                     }
                  }
                  else
                  {
                     wk_sd = SE_STR($M4_DragInfo_SxDx>0,"D","S")
                     cnt_new = CostruisciStrCnt(wk_sd,"A-","R",0,0,0,0)

                     $M4_DragInfo_Cnt = cnt_new
                     $QueryResult__ = 3
                  }
               }
            }
         }
      }
   }

   PROCEDURA CtrlPosizionePenisolaAppoggio
   {
      if( ACTION()<=0 | ACTION()==2 | $OnLoadOrder==1 )  { EXITSUB() }

      if( VAR_TipoPen==1 ) { EXITSUB() }

      idx_agg = AGGANCIATA(ATTUALE(),"*")

      if( IS_IDX(idx_agg)==0 ) { EXITSUB() }

      wk_cnt = CNT_STR(ATTUALE())

      wk_sd  = GetParamStrCnt(wk_cnt,"SD")
      wk_ab  = GetParamStrCnt(wk_cnt,"AB")
      if( wk_ab=="A" ) { wk_ab = "A-" }
      wk_fr  = GetParamStrCnt(wk_cnt,"FR")

      if( VAR_PosPenisola==-11
        | VAR_PosPenisola==11 ) { wk_fr  = "R-" }
      if( VAR_PosPenisola==10 ) { wk_fr  = "F-" }

      wk_ox  = ATOI(GetParamStrCnt(wk_cnt,"OX"))
      wk_oy  = ATOI(GetParamStrCnt(wk_cnt,"OY"))
      wk_oz  = ATOI(GetParamStrCnt(wk_cnt,"OZ"))
      wk_ang = ATOI(GetParamStrCnt(wk_cnt,"ANG"))

      //ricostruisco per averla con la stessa sintassi
      wk_cnt = CostruisciStrCnt(wk_sd,wk_ab,wk_fr,wk_ox,wk_oy,wk_oz,wk_ang)

      wk_new_sd  = "S"
      if( VAR_PosPenisola>0 ) { wk_new_sd  = "D" }

      wk_new_ab  = "A-"
      wk_new_fr  = "R"

      wk_new_ox  = VAR_Appoggio
      if( VAR_PosPenisola>0 ) { wk_new_ox  = (-1)*VAR_Appoggio }

      wk_new_oy  = 0
      wk_new_oz  = -VAR_SbordoRet

      if( NOME(idx_agg)=="Top" )
      {
         wk_new_oy  = (-1)*VAR_VAL(idx_agg,"SpessorePiano")
         wk_new_oz  = (-1)*VAR_VAL(idx_agg,"aa_sbrd_rt") + (-1)*VAR_SbordoRet

         if( VAR_VAL(idx_agg,"TopUnico")==1 ) { wk_new_oy  = 0 }
      }
      wk_new_ang = 0

      //SX - PERPENDICOLARE FRONTE
      //"S+0,A-0,F+0, -sbordox 0 -appoggio basi -90"
      if( VAR_PosPenisola==-10 )
      {
         wk_new_sd  = "S"
         wk_new_fr  = "F"
         wk_new_ox  = Zt - VAR_SbordoLat
         wk_new_oz  = (-1)*VAR_Appoggio
         wk_new_ang = 90
      }
      //SX - PERPENDICOLARE RETRO
      //"S-0,A-0,R-0, -sbordox 0 +appoggio basi -90"
      if( VAR_PosPenisola==-11 )
      {
         wk_new_sd  = "S"
         wk_new_fr  = "R-"
         wk_new_ox  = 0
         wk_new_ox  = (-1)*VAR_SbordoLat
         wk_new_oz  = VAR_Appoggio
         wk_new_ang = -90
      }

      //DX - PERPENDICOLARE FRONTE
      //"D-0,A-0,F-0, +sbordox 0 -appoggio basi -90"
      if( VAR_PosPenisola==10 )
      {
         wk_new_sd  = "D"
         wk_new_fr  = "F-"

         wk_new_ox  = VAR_SbordoLat
         //wk_new_ox  = 0
         wk_new_oz  = (-1)*VAR_Appoggio
         wk_new_ang = -90
      }

      //DX - PERPENDICOLARE RETRO
      //"D-0,A-0,R-0, +sbordox 0 +appoggio basi +90"
      if( VAR_PosPenisola==11 )
      {
         wk_new_sd  = "D"
         wk_new_fr  = "R-"

         wk_new_ox  = VAR_SbordoLat
         //wk_new_ox  = 0
         wk_new_oz  = VAR_Appoggio

         wk_new_ang = 90
      }

      wk_cnt_new = CostruisciStrCnt(wk_new_sd,wk_new_ab,wk_new_fr,wk_new_ox,wk_new_oy,wk_new_oz,wk_new_ang)

      //COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), "     wk_cnt = ",wk_cnt," | DEBUG ---- CtrlPosizionePenisolaAppoggio"))
      //COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " wk_cnt_new = ",wk_cnt_new," | DEBUG ---- CtrlPosizionePenisolaAppoggio"))

      if( wk_cnt_new==wk_cnt ) { EXITSUB() }

      COMANDO(STRCAT("SETTA ",STR(ATTUALE())))
      COMANDO(STRCAT("CONNESSIONE_EDIT ",wk_cnt_new))
   }
   //} procedure per penisole

   //{ procedure elementi SNACK
   PROCEDURA PianoSNACK_stendi
   {
      top_steso=1

      $SNC_debug = 0
      $SNC_debug_msg  = "Start"     LogProcedura2("SNC_STENDI")

      debug = $SNC_debug
      VAR_SET_MODE(-1,"SNC_debug",$MODE_NOSAVE)
      VAR_SET_MODE(-1,"SNC_debug_msg",$MODE_NOSAVE)

      if ( $stesi_mode_sx == $stesi_Elemento
         & $stesi_mode_dx == $stesi_Elemento)
      {
         ID_Sin = $stesi_idx1
         if( NOME(ID_Sin) == "Cuc_AntaBifacciale"
           & IsIdx( ID_Sin, "idx_struttura") == 1) { ID_Sin = VAR_VAL( ID_Sin, "idx_struttura") }

         ID_Des = $stesi_idx2
         if( NOME(ID_Des) == "Cuc_AntaBifacciale"
           & IsIdx( ID_Des, "idx_struttura") == 1) { ID_Des = VAR_VAL( ID_Des, "idx_struttura") }

         if( IS_MATCH(NOME(ID_Sin),"ScoccaT_Bas*")==0
           | IS_MATCH(NOME(ID_Des),"ScoccaT_Bas*")==0 )
         {
            //DISPLAY2(MSG(1066))
            wk_msg = STRCAT(MSG(1090),"\n",MSG(1066))
            DISPLAY2(wk_msg)

            escluso=1
            COMANDO (STRCAT("SETTA ",STR(ATTUALE())))
            COMANDO("DELETE1 // non_stendo")

            EXITSUB()
         }

         //primo giro
         $SNC_debug_msg = STRCAT("ID_Sin=",STR(ID_Sin),"-", NOME(ID_Sin),  " ID_Des=",STR(ID_Des) ,"-", NOME(ID_Des))
         LogProcedura2("SNC_STENDI")

         //Inverto sx con dx se il pick è stato fatto al contrario
         CTLR_SEQUENZA_SXDX( ID_Sin, ID_Des )

         $SNC_debug_msg = "CTLR_SEQUENZA_SXDX"
         LogProcedura2("SNC_STENDI")

         wk_idx_piano = ATTUALE()
         wk_id_sin    = ID_Sin
         wk_id_des    = ID_Des

         OnStendi_PianoSNACK      = 1
         OnCtrlGlobali_PianoSNACK = 0

         GOSUB Check_Inserimento_PianoSNACK

         if( IS_ESCLUSO(ATTUALE()) == 1) { EXITSUB() }

         //chiedo se dx o sx
         if( VAR_TipoSnack > 0)
         {
            //verifico se ho qualcosa a sx della base di sx
            wk_idx_sxsx = -1
            if( VAR_EXIST(ID_Sin,"idx_sx")==1 )
            {
               wk_idx_sx = VAR_VAL(ID_Sin,"idx_sx")
               if( IS_IDX(wk_idx_sx) ) { wk_idx_sxsx = wk_idx_sx }
            }
            //verifico se ho qualcosa a dx della base di dx
            wk_idx_dxdx = -1
            if( VAR_EXIST(ID_Des,"idx_dx")==1 )
            {
               wk_idx_dx = VAR_VAL(ID_Des,"idx_dx")
               if( IS_IDX(wk_idx_dx) ) { wk_idx_dxdx = wk_idx_dx }
            }

            if( IS_IDX(wk_idx_sxsx)==1 & IS_IDX(wk_idx_dxdx)==0 ) { VAR_Verso =  1 }
            if( IS_IDX(wk_idx_sxsx)==0 & IS_IDX(wk_idx_dxdx)==1 ) { VAR_Verso = -1 }
            if( IS_IDX(wk_idx_sxsx)==1 & IS_IDX(wk_idx_dxdx)==1 )
            {
               NO_PostGestDllValida = 1

               DISPLAY2(MSG(1064))

             #ifndef TEC
               escluso=1
               COMANDO (STRCAT("SETTA ",STR(ATTUALE())))
               COMANDO("DELETE1 // non_stendo")

               EXITSUB()
             #endif
            }

            if( IS_IDX(wk_idx_sxsx) == 0
              & IS_IDX(wk_idx_dxdx) == 0)
            {
               if( IS_VAR_FIXED( ATTUALE(), "VAR_Verso") == 0)
               {
                  r = CHIEDI( ATTUALE(), "VAR_Verso")
               }
            }
         }

         // Colleziono informazioni dalla base
         wk_idx_ref = SE_NUM( VAR_Verso > 0, ID_Des, ID_Sin)
         Cucina_Versione_Idx = wk_idx_ref
         GOSUB Cucina_Versione

         /// Sinistra
         SET_#(ID_Sin)

         P1 = #alto_0
         if( NOME(ID_Sin)=="ScoccaT_BaseAngPan" )
         {
            if( VAR_VAL(ID_Sin,"Verso")<0 ) { P1 = #alto_1 }
         }
         if( NOME(ID_Sin)=="ScoccaT_BaseAngoloIsola" )
         {
            if( VAR_VAL(ID_Sin,"Verso") > 0 ) { P1 = #alto_3 }
         }

         ConFiancoFinSx = VAR_VAL( ID_Sin, "ConFiancoFinSx")

         /// Destra
         SET_#(ID_Des)
         P2 = #alto_3

         if( NOME(ID_Des)=="ScoccaT_BaseAngPan" )
         {
            if( VAR_VAL(ID_Des,"Verso") > 0) { P2 = #alto_5 }
         }
         if( NOME(ID_Des)=="ScoccaT_BaseAngoloIsola" )
         {
            if( VAR_VAL(ID_Des,"Verso") < 0) { P2 = #alto_0 }
         }

         ConFiancoFinDx = VAR_VAL( ID_Des, "ConFiancoFinDx")

         GOSUB ricava_ang_y

         x1=P1.x
         z1=P1.z
         x2=P2.x
         z2=P2.z
         x12=x2-x1
         z12=z2-z1
         ca=COSENO(ang_y)
         sa=SENO(-ang_y)

         X1 = FLOOR(((x12*ca+z12*sa)+0.005)*100)/100

         wk_lung_tot = X1
         if( VAR_TipoSnack > 0) { wk_lung_tot = X1 + X2 }
         if( VAR_PosizioneSnack <= 0)
         {
            wk_lung_tot = X1 + 12
            if( VAR_TipoSnack > 0) { wk_lung_tot = X1 + X2 + 6 }
         }

         if( wk_lung_tot > X_Max)
         {
            //DISPLAY2(MSG(1067))
            wk_msg = STRCAT(MSG(1090),"\n",MSG(1067))
            DISPLAY2(wk_msg)

           #ifndef TEC
            escluso=1
            COMANDO (STRCAT("SETTA ",STR(ATTUALE())))
            COMANDO("DELETE1 // non_stendo")

            EXITSUB()
           #endif
         }

         rie_zr = VAR_VAL( wk_idx_ref, "Bifa_Spe")
         rie_zr = SE_NUM( rie_zr > 0, rie_zr, 25)
         if( VAR_PosizioneSnack <= 0)
         {
            rie_zr = rie_zr + SE_NUM( Cucina_Versione > 2, 2, 1)
         }

         // A listino Z1 è fisso a 470 e la Z max totale è 1100
         // Questo comporta che, con la base di prof max 800 + 25 bifa -> 170 rientro da fronte
         sbr_zf = -170
         if( VAR_PosizioneSnack <= 0)
         {
            sbr_zf = VAR_VAL( wk_idx_ref, "Anta_Spe") + VAR_VAL( wk_idx_ref, "Anta_Aria_Z")
            sbr_zf = SE_NUM( sbr_zf > 0, sbr_zf, 25)
            sbr_zf = sbr_zf + SE_NUM( Cucina_Versione > 2, 2, 1)
         }

         base_0 = P1
         base_0.x = base_0.x -   SENO(ang_y)*(Z1+rie_zr)
         base_0.y = base_0.y - Y + wk_top_h
         base_0.z = base_0.z - COSENO(ang_y)*(Z1+rie_zr)

         if( VAR_TipoSnack > 0)
         {
            Z2 = VAR_VAL( wk_idx_ref, "Z") + sbr_zf + rie_zr

            if( VAR_Verso < 0)
            {
               base_0.x = base_0.x - COSENO(ang_y)*X2
               base_0.z = base_0.z +   SENO(ang_y)*X2
            }
         }

         if( VAR_PosizioneSnack > 0)
         {
            base_0.y = Yt

            if( VAR_Verso < 0
              & VAR_TipoSnack > 0
              & ConFiancoFinSx > 0)
            {
               base_0.x = base_0.x - COSENO(ang_y) * 4
               base_0.z = base_0.z +   SENO(ang_y) * 4
            }
         }
      }
   }

   PROCEDURA PianoSNACK_Notifica
   {
      if( ACTION()==12 & escluso==0 )
      {
         //OnNotifica_SNACK = 1

         //if( VAR_VAL_STR(ATTUALE(),"MessaggioBlocco")!="" )
         //{
         //   DISPLAY2(MessaggioBlocco)
         //   COMANDO(STRCAT("CANCELLA ",STR(ATTUALE())," //cancella SNACk - da NOTIFICA"))
         //   MessaggioBlocco = ""
         //   EXIT()
         //}

         wk_cmd = STRCAT("X1=",STR(X1))
         if( VAR_TipoSnack==1 | VAR_TipoSnack==2 )  { wk_cmd = STRCAT(wk_cmd, " Z2=",STR(Z2)) }
         COMANDO(STRCAT("VAR_CHANGE 1 ",STR(idx_att), " " ,wk_cmd , " //SNACK NOTIFICA"))

         //aggancio alla prima base...
         //devo calcolarmi la stringa di connessione corretta
         //CONNESSIONE_EDIT S + 0, A + 0, R + 0 , 0 0 0 0
         //z = Z1
         //x = 0
         wk_offx = -1 * (VAR_Sbordo_SX + aa_sbordo_sx)
         if( VAR_Verso < 0
           & VAR_TipoSnack > 0)
         {
            wk_offx = -1 * X2
            if( VAR_PosizioneSnack > 0) { wk_offx = -1 * (X2 + aa_sbordo_sx) }
         }

         wk_offy = wk_top_h
         if( VAR_PosizioneSnack > 0)
         {
            wk_offy = Yt + Y - VAR_VAL( wk_idx_ref, "alto0y_abs")
         }

         wk_offz = -1*(Z1+rie_zr)
         wk_cnt = STRCAT("CNT S + 0,A + 0,R + 0, ",STR(wk_offx)," ",STR(wk_offy)," ",STR(wk_offz)," 0.0")

         //Luca 23/10/2019
         if( NOME(ID_Sin)=="ScoccaT_BaseAngPan"
           & VAR_VAL(ID_Sin,"Verso")<0 )
         {
            wk_offx = VAR_VAL(ID_Sin,"Xt")
            wk_cnt = STRCAT("CNT D - 0,A + 0,R + 0, -",STR(wk_offx)," ",STR(wk_offy)," ",STR(wk_offz)," 0.0")
         }

         if( NOME(ID_Sin)=="ScoccaT_BaseAngoloIsola" & VAR_VAL(ID_Sin,"Verso") > 0  )
         {
            wk_offx = VAR_VAL(ID_Sin,"Z")
            wk_cnt = STRCAT("CNT D - 0,A + 0,R + 0, -",STR(wk_offx)," ",STR(wk_offy)," ",STR(wk_offz)," 0.0")
         }

         COMANDO(wk_cnt)
         COMANDO(STRCAT("POS2LINK ",STR(ATTUALE()), " ", STR(ID_Sin), " //Notifica ",NOME(ATTUALE())))

         //RicalcolaElementiVicini_PianoSNACK = 1
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE())," no_agganciati // PianoSNACK_Notifica"))
      }
   }

   PROCEDURA TrovaIdxVicini_PianoSNACK
   {
      if( ACTION()<=0 | ACTION()==2 ) { EXITSUB() }
      if( $OnLoadOrder )              { EXITSUB() }

      idx_top  = -1
      idx_base_sx = -1
      idx_base_dx = -1

      if( IS_IDX(ID_Sin) ) { idx_base_sx = ID_Sin }
      if( IS_IDX(ID_Des) ) { idx_base_dx = ID_Des }

      //Luca 14/07/2020 aggiungo controllo su angolo.. devono avere sempre lo stesso angolo per funzionare correttamente
      //il piano SNACK è pensato per andare sempre dietro alle base, non in corrispondeza di ante
      ang_att = ANG_TOT_NOR(ATTUALE())

      BOX_MODE(0)
      if( IS_IDX(ID_Sin)==0 )
      {
         NEAR_GLOBALE("wk_basi_sx",idx_near_fsx,5,0,"ScoccaT_B*")
         if( wk_basi_sx>0 )
         {
            ang_bas = ANG_TOT_NOR(wk_basi_sx[1])

            //Luca 04/09/2020
            if( NOME(wk_basi_sx[1]) == "ScoccaT_BaseAngoloIsola" ) { ang_bas = VAR_VAL(wk_basi_sx[1],"AngoloDx") }

            if( ABS(ang_bas - ang_att)<0.1 ) { idx_base_sx = wk_basi_sx[1] }


            //idx_base_sx = wk_basi_sx[1]
         }
      }

      if( IS_IDX(ID_Des)==0 )
      {
         NEAR_GLOBALE("wk_basi_dx",idx_near_fdx,5,0,"ScoccaT_B*")
         if( wk_basi_dx>0 )
         {
            ang_bas = ANG_TOT_NOR(wk_basi_dx[1])

            //Luca 04/09/2020
            if( NOME(wk_basi_dx[1]) == "ScoccaT_BaseAngoloIsola" ) { ang_bas = VAR_VAL(wk_basi_dx[1],"AngoloSx") }

            if( ABS(ang_bas - ang_att)<0.1 ) { idx_base_dx = wk_basi_dx[1]  }

            //idx_base_dx = wk_basi_dx[1]
         }
      }

      BOX_MODE(0)
      NEAR_GLOBALE("wk_top",idx_near_top,5,0,"Top*")

      wk_i = 1
      while( wk_i <= wk_top )
      {
         wk_top_att = wk_top[wk_i]

         if( wk_top_att == PADRE(wk_top_att, -1) )
         {
            idx_top = wk_top_att
            wk_i = wk_top
         }

         wk_i = wk_i + 1
      }
   }

   PROCEDURA SettaSbordi_PianoSNACK
   {
      if( ACTION() <= 0 | ACTION() == 2) { EXITSUB() }
      if( $OnLoadOrder)                  { EXITSUB() }
      if( $OnLoadOrder2)                 { EXITSUB() }

      wk_check_sb_sx = 0
      wk_check_sb_dx = 0

      if( VAR_TipoSnack == 0)
      {
         if( IS_IDX(idx_base_sx) == 1)
         {
            if( VAR_EXIST( idx_base_sx, "idx_sx"))
            {
               SET_#(idx_base_sx)
               if( IS_IDX(#idx_sx) == 0) { wk_check_sb_sx = 1 }
            }
         }
         if( IS_IDX(idx_base_dx) == 1)
         {
            if( VAR_EXIST( idx_base_dx, "idx_dx"))
            {
               SET_#(idx_base_dx)
               if( IS_IDX(#idx_dx) == 0) { wk_check_sb_dx = 1 }
            }
         }
      }

      if( VAR_TipoSnack > 0)
      {
         if( VAR_Verso < 0)
         {
            if( VAR_EXIST( idx_base_dx, "idx_dx"))
            {
               SET_#(idx_base_dx)
               if( IS_IDX(#idx_dx) == 0) { wk_check_sb_dx = 1 }
            }
         }
         else
         {
            if( VAR_EXIST( idx_base_sx, "idx_sx"))
            {
               SET_#(idx_base_sx)
               if( IS_IDX(#idx_sx) == 0) { wk_check_sb_sx = 1 }
            }
         }
      }

      if( IS_VAR_FIXED( ATTUALE(), "VAR_Sbordo_SX") == 1)
      {
         if( VAR_Sbordo_SX == 0) { DEL_VAR_MODIFICATE( ATTUALE(), "VAR_Sbordo_SX") }
         else                    { wk_check_sb_sx = 0   aa_sbordo_sx = 0 }
      }

      if( IS_VAR_FIXED(ATTUALE(),"VAR_Sbordo_DX")==1 )
      {
         if( VAR_Sbordo_DX == 0) { DEL_VAR_MODIFICATE( ATTUALE(), "VAR_Sbordo_DX") }
         else                    { wk_check_sb_dx = 0   aa_sbordo_dx = 0 }
      }

      if( IS_IDX(idx_top))
      {
         if( wk_check_sb_sx == 1) { aa_sbordo_sx = VAR_VAL( idx_top, "Sbrd_SX") }
         if( wk_check_sb_dx == 1) { aa_sbordo_dx = VAR_VAL( idx_top, "Sbrd_DX") }
      }

      if( VAR_PosizioneSnack > 0)
      {
         aa_sbordo_sx = 4 * ConFiancoFinSx
         aa_sbordo_dx = 4 * ConFiancoFinDx
      }
   }

   PROCEDURA RicalcolaElementiVicini_PianoSNACK
   {
      if( VAR_VAL(ATTUALE(),"RicalcolaElementiVicini_PianoSNACK")==0 ) { EXITSUB() }

      RicalcolaElementiVicini_PianoSNACK = 0

      //devo ricalcolare Basi, bifacciali e fianchi di finitura
      BOX_MODE(0)
      NEAR_GLOBALE("wk_bas",ATTUALE(),50,0,"ScoccaT_Bas*")
      NEAR_GLOBALE("wk_bif",ATTUALE(),50,0,"Cuc_AntaBifacciale")
      NEAR_GLOBALE("wk_ffin",ATTUALE(),50,0,"FiancoFinitura")
      NEAR_GLOBALE("wk_top",ATTUALE(),50,0,"Top")

      i = 1
      while ( i<=wk_bas )
      {
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(wk_bas[i])," no_agganciati //PianoSNACK_Notifica"))
         i = i + 1
      }

      i = 1
      while ( i<=wk_bif )
      {
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(wk_bif[i])," no_agganciati //PianoSNACK_Notifica"))
         i = i + 1
      }
      i = 1
      while ( i<=wk_ffin )
      {
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(wk_ffin[i])," no_agganciati //PianoSNACK_Notifica"))
         i = i + 1
      }
      i = 1
      while ( i<=wk_top )
      {
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(wk_top[i])," no_agganciati //PianoSNACK_Notifica"))
         i = i + 1
      }
   }

   PROCEDURA CtrlPosizione_PianoSNACK
   {
      if( ACTION()<=0 | ACTION()==2 ) { EXITSUB() }
      if( $OnLoadOrder )              { EXITSUB() }

      wk_agg = AGGANCIATA(ATTUALE(),"*")

      if( IS_IDX(wk_agg)==0 ) { EXITSUB() }

      wk_cnt_str = CNT_STR(ATTUALE())

      //COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " wk_cnt_str=",wk_cnt_str," | DEBUG ---- 1"))

      wk_cnt_str_sd = GetParamStrCnt(wk_cnt_str,"SD+")
      wk_cnt_str_ab = GetParamStrCnt(wk_cnt_str,"AB+")
      wk_cnt_str_fr = GetParamStrCnt(wk_cnt_str,"FR+")

      wk_cnt_str_ox = ATOI(GetParamStrCnt(wk_cnt_str,"OX"))
      wk_cnt_str_oy = ATOI(GetParamStrCnt(wk_cnt_str,"OY"))
      wk_cnt_str_oz = ATOI(GetParamStrCnt(wk_cnt_str,"OZ"))
      wk_cnt_str_ang = ATOI(GetParamStrCnt(wk_cnt_str,"ANG"))

      //rigenero per averla nello stesso formato
      wk_cnt_str = CostruisciStrCnt(wk_cnt_str_sd,wk_cnt_str_ab,wk_cnt_str_fr,wk_cnt_str_ox,wk_cnt_str_oy,wk_cnt_str_oz,wk_cnt_str_ang)

      //COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " wk_cnt_str=",wk_cnt_str," | DEBUG ---- 2"))

      wk_cnt_str_new_sd = "S+"
      wk_cnt_str_new_ab = "A+"
      wk_cnt_str_new_fr = "R+"

      wk_cnt_offx = 0

      //Luca 23/10/2019
      if( NOME(wk_agg)=="ScoccaT_BaseAngPan" & VAR_VAL(wk_agg,"Verso")<0 )
      {
         wk_cnt_str_new_sd = "D-"
         //wk_cnt_offx       =  VAR_VAL(wk_agg,"X")
         wk_cnt_offx       =  VAR_VAL(wk_agg,"Xt")
      }

      //Luca 04/09/2020
      if( NOME(wk_agg)=="ScoccaT_BaseAngoloIsola" & VAR_VAL(wk_agg,"Verso") > 0 )
      {
         wk_cnt_str_new_sd = "D-"
         wk_cnt_offx       =  VAR_VAL(wk_agg,"Z")
      }

      wk_cnt_str_new_ox = -1 * (VAR_Sbordo_SX + aa_sbordo_sx + wk_cnt_offx)
      if( VAR_Verso < 0
        & VAR_TipoSnack > 0)
      {
         wk_cnt_str_new_ox = -1 * (X2 + wk_cnt_offx)
         if( VAR_PosizioneSnack > 0) { wk_cnt_str_new_ox = -1 * (X2 + aa_sbordo_sx + wk_cnt_offx) }
      }

      wk_cnt_str_new_oy = wk_cnt_str_oy
      if( IS_IDX(idx_top)
        & VAR_PosizioneSnack <= 0) { wk_cnt_str_new_oy = VAR_VAL(idx_top,"SpessorePiano") }

      rie_zr = VAR_VAL( wk_agg, "Bifa_Spe")
      rie_zr = SE_NUM( rie_zr > 0, rie_zr, 25)
      if( VAR_PosizioneSnack <= 0)
      {
         rie_zr = rie_zr + SE_NUM( Cucina_Versione > 2, 2, 1)
      }
      wk_cnt_str_new_oz = -1*(Z1+rie_zr)

      wk_cnt_str_new_ang = wk_cnt_str_ang

      wk_cnt_new = CostruisciStrCnt(wk_cnt_str_new_sd,wk_cnt_str_new_ab,wk_cnt_str_new_fr,wk_cnt_str_new_ox,wk_cnt_str_new_oy,wk_cnt_str_new_oz,wk_cnt_str_new_ang)

      //COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " wk_cnt_new=",wk_cnt_new," | DEBUG ---- 3"))

      if( wk_cnt_new==wk_cnt_str ) { EXITSUB() }

      COMANDO(STRCAT("SETTA ",STR(ATTUALE())))
      COMANDO(STRCAT("CONNESSIONE_EDIT ",wk_cnt_new, " //CtrlPosizione_PianoSNACK"))
   }

   PROCEDURA CtrlStaffe_PianoSNACK
   {
      if( ACTION() <= 0 | ACTION() == 2) { EXITSUB() }
      if( $OnLoadOrder )                 { EXITSUB() }

      if( IS_IDX(idx_base_sx) == 0
        | IS_IDX(idx_base_dx) == 0)      { EXITSUB() }

      debug = 0
     #ifdef TEC
      debug = 1
     #endif

      if( debug == 1)
      {
         COMANDO2(STRCAT("LOGMSG CtrlStaffe_PianoSNACK ATTUALE: ",STR(ATTUALE()), " | START "))
         COMANDO2(STRCAT("LOGMSG CtrlStaffe_PianoSNACK ATTUALE: ",STR(ATTUALE()), " | NStaffe=",STR(NStaffe)))
         COMANDO2(STRCAT("LOGMSG CtrlStaffe_PianoSNACK ATTUALE: ",STR(ATTUALE()), " | ACTION()=",STR(ACTION()) , " $OnLoadOrder=",STR($OnLoadOrder)))
         COMANDO2(STRCAT("LOGMSG CtrlStaffe_PianoSNACK ATTUALE: ",STR(ATTUALE()), " | idx_base_sx=",STR(idx_base_sx) , " idx_base_dx=",STR(idx_base_dx)))
      }

      //creo l'array con tutte le basi della composizione partendo da idx_base_sx
      wk_array_basi = 0

      if( idx_base_sx == idx_base_dx)
      {
         wk_array_basi = 1
         wk_array_basi[1] = idx_base_sx
      }
      else
      {
         idx_test = idx_base_sx

         while( IS_IDX(idx_test))
         {
            ne = wk_array_basi + 1
            wk_array_basi = ne
            wk_array_basi[ne] = idx_test

            if( idx_test==idx_base_dx ) { idx_test = -1 }
            else
            {
               if( VAR_EXIST(idx_test,"idx_alto_dx") )
               {
                  SET_#(idx_test)
                  if( IS_IDX(#idx_alto_dx) )
                  {
                     idx_test = #idx_alto_dx
                  }

                  else
                  {
                     if( VAR_EXIST(idx_test,"idx_dx") )
                     {
                        SET_#(idx_test)
                        if( IS_IDX(#idx_dx) ) { idx_test = #idx_dx }
                        else                  { idx_test =  -1 }
                     }
                     else                     { idx_test =  -1 }
                  }
               }
               else
               {
                  if( VAR_EXIST(idx_test,"idx_dx") )
                  {
                     SET_#(idx_test)
                     if( IS_IDX(#idx_dx) ) { idx_test = #idx_dx }
                     else                  { idx_test =  -1 }
                  }
                  else                     { idx_test =  -1 }
               }
            }
         }
      }

      if( IS_VAR_FIXED( ATTUALE(), "NStaffe") == 0)
      {
         NStaffe = wk_array_basi
         if( VAR_PosizioneSnack <= 0) { NStaffe = NStaffe + 1 }
      }

      if( debug == 1)
      {
         COMANDO2(STRCAT("LOGMSG CtrlStaffe_PianoSNACK ATTUALE: ",STR(ATTUALE()), " | wk_array_basi=",STR(wk_array_basi)))
         COMANDO2(STRCAT("LOGMSG CtrlStaffe_PianoSNACK ATTUALE: ",STR(ATTUALE()), " | NStaffe=",STR(NStaffe)))
      }

      SpeStaffa = 10
      PosStaffe = NStaffe

      OffXStaffa = VAR_Sbordo_SX + aa_sbordo_sx
      if( VAR_Verso < 0
        & VAR_TipoSnack > 0)
      {
        OffXStaffa = X2
        if( VAR_PosizioneSnack > 0) { OffXStaffa = X2 + aa_sbordo_sx }
      }

      if( NOME(idx_base_sx)=="ScoccaT_BaseAngPan" & VAR_VAL(idx_base_sx,"Verso") == -1 )
      {
         SET_#(idx_base_sx)
         OffXStaffa = OffXStaffa + #Xt - #X
      }

      if( NStaffe >= 1)
      {
         PosStaffe[1] = OffXStaffa + $Cuc_Spe_Fia + SpeStaffa/2
      }

      if( NStaffe >= 2
        & VAR_PosizioneSnack <= 0)
      {
         PosStaffe[2] = OffXStaffa + VAR_VAL(idx_base_sx,"X") - $Cuc_Spe_Fia - SpeStaffa/2

         if( NOME(idx_base_sx)=="ScoccaT_BaseAngoloIsola" & VAR_VAL(idx_base_sx,"Verso") == 1)
         {
            PosStaffe[2] = OffXStaffa + VAR_VAL(idx_base_sx,"Z") - $Cuc_Spe_Fia - SpeStaffa/2
         }
      }

      i = SE_NUM( VAR_PosizioneSnack > 0, 1, 2)
      while ( i <= wk_array_basi)
      {
         ne = i + 1

         PosStaffa_prec = PosStaffe[ne - 1] + $Cuc_Spe_Fia + SpeStaffa/2
         PosStaffe[ne] = PosStaffa_prec +  VAR_VAL(wk_array_basi[i],"X") - $Cuc_Spe_Fia - SpeStaffa/2

         i = i + 1
      }
   }

   PROCEDURA PosaStaffa_PianoSNACK
   {
      @escluso = 1
      if( NStaffe >= nstaffa)      { @escluso = 0 }

      @base_0.x = base_0.x + VAR_VAL( idx_att, GetArrayVar( "PosStaffe", nstaffa)) - @X/2
      @base_0.y = alto_0.y - @Y - SE_NUM( VAR_Revisione > 0, 18, 31)
      @base_0.z = base_0.z + Z1 - 232

      // Tavolo integrato
      if( VAR_PosizioneSnack <= 0) { EXITSUB()    }
      if( $OnLoadOrder > 0)        { @escluso = 1 }

      if( IsIdx( idx_att, GetArrayVar( "wk_array_basi", nstaffa)))
      {
         @X = VAR_VAL( wk_array_basi[nstaffa], "X") - 2*$Cuc_Spe_Fia
      }

      @base_0.x = base_0.x + VAR_VAL( idx_att, GetArrayVar( "PosStaffe", nstaffa)) - 5
      @base_0.y = base_0.y + (Y - @Y)/2
      @base_0.z = base_0.z + Z1 + VAR_VAL( idx_att, "rie_zr")

      @FronteRetro = "R"
      @CatAlluminio = 1
      @GEST_C003 = "CS001" //TODO: da cancellare e gestire
   }

   PROCEDURA PosaCorno_Catena_PianoSNACK
   {
      @escluso = SE_NUM( cornoNum <= corni, 0, 1)

      @X = cornoDim.x
      @Y = cornoDim.y
      @Z = cornoDim.z

      @base_0.x = base_0.x + (X - @X)/2
      @base_0.y = base_0.y + (Y - @Y)/2
      @base_0.z = base_0_m4.z
   }

   PROCEDURA ScassaCorno_Catena_PianoSNACK
   {
      if( $modalita != "TEC"
        & $modalita != "AZI")     { EXITSUB() }
      if( ACTION() <= 0)          { EXITSUB() }
      if( COMPONENDO() != 0)      { EXITSUB() }

      BOX_MODE(0)
      scassiRicalcola = 0

      // Bifacciali
      scassoBif_Elm = ""
      while( IsIdx( ATTUALE(), "scassoBif_Idx") == 1)
      {
         NEAR_GLOBALE2( "wk_bifacciali", scassoBif_Idx, 1, "Cuc_AntaBifacciale")
         if( wk_bifacciali <= 0)                                             { break }

         wk_bifNum = 0
         while( inc(wk_bifNum) <= wk_bifacciali)
         {
            wk_bifCmp = TrovaIdx_Grafica(wk_bifacciali[wk_bifNum])
            lstAdd( scassoBif_Elm, wk_bifCmp)
         }

         if( scassoBif_Elm == VAR_VAL_STR( ATTUALE(), "scassoBif_Elm_prec")) { break }

         scassoBif_Elm_prec = scassoBif_Elm
         scassiRicalcola = scassiRicalcola + 1
         break
      }

      // Masselli
      scassoMas_Elm = ""
      while( IsIdx( ATTUALE(), "scassoMas_Idx") == 1)
      {
         NEAR_GLOBALE2( "wk_masselli", scassoMas_Idx, 1, "MasselloStaffa_SNACK")
         if( wk_masselli <= 0)                                               { break }

         wk_masNum = 0
         while( inc(wk_masNum) <= wk_masselli)
         {
            wk_masCmp = TrovaIdx_Grafica(wk_masselli[wk_masNum])
            lstAdd( scassoMas_Elm, wk_masCmp)
         }

         if( scassoMas_Elm == VAR_VAL_STR( ATTUALE(), "scassoMas_Elm_prec")) { break }

         scassoMas_Elm_prec = scassoMas_Elm
         scassiRicalcola = scassiRicalcola + 2
         break
      }

      if( scassiRicalcola == 0)   { EXITSUB() }

      GOSUB Scassa_e_Taglia
   }

   PROCEDURA PosaMasselloStaffa_PianoSNACK
   {
      @escluso = 1
      if( NumMasStaffe >= nmassello) { @escluso = 0 }

      @X = VAR_VAL( idx_att, GetArrayVar( "DimMasStaffe", nmassello))
      @Y = Spe_MasAbe
      @Z = Lar_MasAbe

      @base_0.x = base_0.x + VAR_VAL( idx_att, GetArrayVar("PosMasStaffe", nmassello))
      @base_0.y = base_0.y + 18
      @base_0.z = base_0.z + Z1 - Lar_Maregg - Lar_MasAbe

      //Luca 07/02/2022 prima dell'ultima staffa
      if( Testa_sx_Rev1 >= 2 & nmassello == 1 )
      {
         if( VAR_EXIST(idx_att,"PosStaffe_##1") )
         {
            @base_0.x = base_0.x + PosStaffe[1] + 15 + Lar_MasAbeL + RieX_MasAbe
         }
      }
   }

   PROCEDURA CtrlMasselliPerStaffe_PianoSNACK
   {
      //ho previsto un massimo di 6 staffe
      //quindi gestisco al massimo 7 spezzoni di massello

      //condisero come dimensione minima del massello 5cm
      //quindi dal bordo devo tenere un minimo di 147.5mm

      if( ACTION()<=0 | ACTION()==2 ) { EXITSUB() }
      if( $OnLoadOrder )              { EXITSUB() }

      //eredito PosStaffe calcolato sul padre
      i = 1
      while ( i<= PosStaffe)
      {
         VAR_CREATE_NUM( ATTUALE(), GetArrayVar( "PosStaffe", i), 0, $MODE_IMPLICIT, "")
         i = i + 1
      }
      VAR_IMPLICITLY_INHERITS( idx_att, 0)

      wk_off_x = Spe_BordoL + Lar_MasTru + RieX_MasAbe

      //Default -- massello intero
      NumMasStaffe    = 1
      PosMasStaffe    = 1
      PosMasStaffe[1] = wk_off_x
      DimMasStaffe    = 1
      DimMasStaffe[1] = X - wk_off_x*2

      if( VAR_PosizioneSnack > 0) { EXITSUB() }

      //Luca 07/02/2022 prima dell'ultima staffa
      if( Testa_sx_Rev1 >= 2 )
      {
         //wk_off_x_sx = PosStaffe[1] + 15 + Lar_MasAbe + RieX_MasAbe
         wk_off_x_sx = PosStaffe[1] + 15 + Lar_MasAbeL + RieX_MasAbe
         PosMasStaffe[1] = wk_off_x_sx
         DimMasStaffe[1] = X - wk_off_x - wk_off_x_sx
      }

      //calcolo i numero di masselli necessari
      //NumMasStaffe = NStaffe + 1

      wk_pos_staffe = 0

      i = 1
      while ( i<= PosStaffe )
      {
         limite_x = 147.5

         if( PosStaffe[i] > limite_x
           & PosStaffe[i] < X - limite_x )
         {
            ne = wk_pos_staffe + 1
            wk_pos_staffe = ne
            wk_pos_staffe[ne] = PosStaffe[i]
         }
         i = i + 1
      }

      if( wk_pos_staffe==0 )  { EXITSUB() }

      NumMasStaffe = wk_pos_staffe + 1
      PosMasStaffe = NumMasStaffe
      DimMasStaffe = NumMasStaffe

      i = 1
      while ( i<=wk_pos_staffe )
      {
         DimMasStaffe[i] = wk_pos_staffe[i] - 15 - PosMasStaffe[i]
         PosMasStaffe[i+1] =  wk_pos_staffe[i] + 15

         i = i + 1
      }

      //Luca 07/02/2022
      if( Testa_dx_Rev1 >= 2 )
      {
         //wk_off_x = X - PosStaffe[NStaffe] + 15 + Lar_MasAbe + RieX_MasAbe
         wk_off_x = X - PosStaffe[NStaffe] + 15 + Lar_MasAbeL + RieX_MasAbe
      }

      DimMasStaffe[DimMasStaffe] = X - wk_off_x - PosMasStaffe[DimMasStaffe]
   }

   //Luca 29/06/2020
   //devo replicare nel fine ordine tutti i controlli che vengono fatti
   //in fase di inserimento di ogni piano SNACK
   PROCEDURA Ctrl_Globali_PianoSNACK
   {
      debug = 0
      #ifdef TE
         debug = 1
      #endif

      if( debug==1 ) { COMANDO2("LOGMSG [ Ctrl_Globali_PianoSNACK START") }

      if( $CNP__ == 1 ) { EXITSUB() }

      WITH_ALIAS("wk_piani","PianoSNACK")

      if( debug==1 )
      {
         if( wk_piani == 0 )
         {
            COMANDO2("LOGMSG ] Ctrl_Globali_PianoSNACK ( NO PIANI ) END")
            EXITSUB()
         }
         COMANDO2(STRCAT("LOGMSG ] Ctrl_Globali_PianoSNACK TROVATI ",STR(wk_piani), " PIANI SNACK"))
      }

      i = 1
      while ( i <= wk_piani )
      {
         wk_idx_piano = wk_piani[i]

         SET_#(wk_idx_piano)

         wk_id_sin =  #idx_base_sx
         wk_id_des =  #idx_base_dx

         OnStendi_PianoSNACK      = 0
         OnCtrlGlobali_PianoSNACK = 1

         if( debug==1 )
         {
            COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK[",STR(wk_idx_piano),"] " ))
            COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK[",STR(wk_idx_piano),"] wk_id_sin=",STR(wk_id_sin), " - wk_id_des=",STR(wk_id_des)))
         }

         GOSUB Check_Inserimento_PianoSNACK

         i = i + 1
      }
   }

   PROCEDURA Check_Inserimento_PianoSNACK
   {
      //Luca 07/07/2020 può essere a 1 solo per TEC
      //se viene abilitata da TEC e poi il fine ordine viene eseguito da AZI, non deve cancellare il piano

      //#ifdef TEC
      if( VAR_VAL(wk_idx_piano,"NON_ESEGUIRE_CONTROLLI")==1 ) { EXITSUB() }
      //#endif

      //verifico se posso stendere
      //1 - basi devono essere allineate in altezza
      //2 - altezza massima basi
      //2.2 - altezza minima basi
      //3 - lunghezza totale composizione (>=1840)
      //4 - profondità basi (>=630)
      //5 - tutte le basi devono avere il bifacciale
      //6 - altezza top (>=10 e <=12)
      //7 - orientamento, non possono esserci basi contrappòoste
      idx_test  = wk_id_sin

      //test 1  - allineamento
      wk_all_prec = VAR_VAL(idx_test,"alto_0.y")
      wk_all_ok   = 1
      //test 2 - altezza massima
      wk_alt_max  = 1
      wk_alt_ok   = 1
      //test 2.1 -- basi superiore devono essere almeno 368
      wk_alt_bs_ok  = 1
      //test 2.2 -- altezza corpo (basi sovrapposte)
      wk_alt_cp     = 0
      wk_alt_cp_ok  = 1
      //test 3 - lunghezza totale
      wk_lun_tot  = 1
      wk_lun_ok   = 1
      //test 4 - profondità
      wk_prof_ok   = 1
      //test 5 - presenza bifacciale alto almeno 368
      wk_biff_ok   = 1
      //test 6 - altezza top
      //wk_top_h    = 10
      wk_top_h    = 0
      wk_top_ok   = 1

      //test 7 - orientamento
      wk_orie_prec = ANG_TOT2(idx_test)
      if( NOME(idx_test) == "ScoccaT_BaseAngoloIsola" )
      {
         wk_orie_prec = VAR_VAL(idx_test,"AngoloDx")
      }

      wk_orie_ok   = 1

      //trovo il primo elemento della composizione
      idx_primo = wk_id_sin
      idx_test  = wk_id_sin

      wk_limit = 99
      while( IS_IDX(idx_test)
           & wk_limit >= 0 )
      {
         wk_limit = wk_limit - 1

         if( VAR_EXIST(idx_test,"idx_sx")==1 )
         {
            wk_idx_sx = VAR_VAL(idx_test,"idx_sx")
            if( IS_IDX(wk_idx_sx) )
            {
               wk_ang_test_sx = ANG_TOT_NOR(wk_idx_sx)

               //Luca 04/09/2020
               if( VAR_EXIST(wk_idx_sx,"AngoloDx") ) { wk_ang_test_sx = VAR_VAL(wk_idx_sx,"AngoloDx") }

               //Luca 26/02/2020 aggiungo controllo angolo
               if( ABS(ANG_TOT_NOR(idx_test)-wk_ang_test_sx)<0.1 )
               {
                  idx_test  = wk_idx_sx
                  idx_primo = idx_test
               }
               else  { idx_test = -1 }
            }
            else     { idx_test = -1 }
         }
         else        { idx_test = -1 }
      }

      if( debug==1 ) { COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK [",STR(wk_idx_piano),"]  PRIMO GIRO - idx_test=",STR(idx_primo),"-",NOME(idx_primo) )) }

      //primo giro ciclo tutta la composizione per vedere la lunghezza totale
      idx_test = idx_primo
      valv = 1
      while( IS_IDX(idx_test) & valv<100 )
      {
         //calcolo lunghezza totale
         wk_lun_tot = wk_lun_tot + VAR_VAL(idx_test,"X")

         if( VAR_EXIST(idx_test,"idx_alto_dx")==1 )
         {
            wk_idx_dx = VAR_VAL(idx_test,"idx_alto_dx")
            if( IS_IDX(wk_idx_dx) ) { idx_test = wk_idx_dx }
            else                    { idx_test = -1 }
         }
         else
         {
            if( VAR_EXIST(idx_test,"idx_dx")==1 )
            {
               wk_idx_dx = VAR_VAL(idx_test,"idx_dx")
               if( IS_IDX(wk_idx_dx) ) { idx_test = wk_idx_dx }
               else                    { idx_test = -1 }
            }
            else
            {
               idx_test = -1
            }
         }
         valv = valv + 1
      }

      if( debug==1 ) { COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK [",STR(wk_idx_piano),"]  SECONDO GIRO" )) }

      //secondo giro ciclo solo le basi da selezione a selezione (da ID_SIN a ID_Des)
      idx_test = wk_id_sin
      while( IS_IDX(idx_test) )
      {
         if( debug==1 ) { COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK[",STR(wk_idx_piano),"]  CICLO -- ",NOME(idx_test),"[",STR(idx_test),"]")) }

         //verifico allineamento superiore
         wk_h_att = VAR_VAL(idx_test,"alto_0.y")
         if( ABS(wk_h_att-wk_all_prec)<0.1 ) { wk_all_prec = wk_h_att }
         else                                { wk_all_ok  = 0 }

         //verifico l'orientamento delle base
         wk_orie_att = ANG_TOT2(idx_test)

         //Luca 04/09/2020
         //if( NOME(idx_test) == "ScoccaT_BaseAngoloIsola" )
         //{
         //   if( idx_test == wk_id_sin ) { wk_orie_att = VAR_VAL(idx_test,"AngoloDx") }
         //   else                        { wk_orie_att = VAR_VAL(idx_test,"AngoloSx") }
         //}

         if( ABS(wk_orie_att-wk_orie_prec)<0.1 ) { wk_orie_prec = wk_orie_att }
         else                                    { wk_orie_ok  = 0 }

         //test 2 -- altezza massima
         if( VAR_VAL(idx_test,"alto_0.y") > wk_alt_max ) { wk_alt_max = VAR_VAL(idx_test,"alto_0.y") }

         //test 2.1 -- altezza minima base
         if( VAR_VAL(idx_test,"Y")<368  ) { wk_alt_bs_ok = 0 }

         //test 4 -- profondità minima base
         if( VAR_VAL(idx_test,"Zt")<630  ) { wk_prof_ok = 0 }

         //test 5 -- presenza del bifacciale
         if( VAR_VAL(idx_test,"ConBifacciale")==0  ) { wk_biff_ok = 0 }

         wk_alt_cp = VAR_VAL(idx_test,"Y")
         if( VAR_EXIST(idx_test,"idx_sotto") )
         {
            idx_test_st = VAR_VAL(idx_test,"idx_sotto")
            while( IS_IDX(idx_test_st) )
            {
               wk_alt_cp = wk_alt_cp + VAR_VAL(idx_test_st,"Y")
               if( VAR_EXIST(idx_test_st,"idx_sotto") ) { idx_test_st = VAR_VAL(idx_test_st,"idx_sotto") }
               else                                     { idx_test_st = -1 }
            }
         }
         if( wk_alt_cp<736 | wk_alt_cp>920 ) { wk_alt_cp_ok = 0 }

         if( VAR_VAL( idx_test, "ConBifacciale") == 0) { wk_biff_ok = 0 }

         if( idx_test == wk_id_des)  { idx_test = -1 }
         else
         {
            if( VAR_EXIST(idx_test,"idx_alto_dx")==1 )
            {
               wk_idx_dx = VAR_VAL(idx_test,"idx_alto_dx")
               if( IS_IDX(wk_idx_dx) ) { idx_test = wk_idx_dx }
               else                    { idx_test = -1 }
            }
            else
            {
               if( VAR_EXIST(idx_test,"idx_dx")==1 )
               {
                  wk_idx_dx = VAR_VAL(idx_test,"idx_dx")
                  if( IS_IDX(wk_idx_dx) ) { idx_test = wk_idx_dx }
                  else                    { idx_test = -1 }
               }
               else
               {
                  idx_test = -1
               }
            }
         }
      }

      if( debug==1 ) { COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK[",STR(wk_idx_piano),"]  TERZO GIRO" )) }

      //test 1 -- composizione minima composizione
      wk_lun_min = SE_NUM( VAR_VAL( wk_idx_piano, "Cucina_Versione") > 2, 1780, 1820)
      if( wk_lun_tot < wk_lun_min) { wk_lun_ok = 0 }

      //test 8 - almeno 920
      //LZ 14/11 cambiata regola inserimento SNACK
      //wk_920_ok = 1
      //if( ID_Sin==ID_Des )
      //{
      //   if( VAR_VAL(ID_Sin,"X")<920 ) { wk_920_ok = 0 }
      //}
      wk_736_ok = 1
      if( wk_id_sin == wk_id_des )
      {
         if( VAR_VAL(wk_id_sin,"X")<736 ) { wk_736_ok = 0 }
      }

      //test 5 - verifico altezza bifacciali
      if( wk_biff_ok > 0
        & IsIdx( wk_idx_piano, "idx_cnear_lar"))
      {
         BOX_MODE(0)
         NEAR_GLOBALE2( "wk_bif", VAR_VAL( wk_idx_piano, "idx_cnear_lar"), 10, "Cuc_AntaBifacciale")

         wk_bif_num = 0
         while( inc(wk_bif_num) <= wk_bif)
         {
            wk_bif_y = VAR_VAL( wk_bif[wk_bif_num], "Y")

            if( wk_bif_y > 0
              & wk_bif_y < 368) { wk_biff_ok = 0  break }
         }
      }

      //test 6 - verifico presenza e altezza del top (o sottotop con indicata altezza top cliente)
      wk_top_ok = 0
      while( wk_top_ok == 0)
      {
         if( VAR_VAL( wk_idx_piano, "VAR_PosizioneSnack") > 0) { wk_top_ok = 1   break }

         wk_idx_top = -1
         if( IsIdx( wk_id_sin, "idx_cnear_up") <= 0) { break }

         NEAR_GLOBALE( "wk_tops", VAR_VAL( wk_id_sin, "idx_cnear_up"), 5, 0, "Top_2P0")
         if( wk_tops <= 0)
         {
            NEAR_GLOBALE("wk_tops",VAR_VAL(wk_id_sin,"idx_cnear_up"),5,0,"SottoTop_2P0")
         }
         if( wk_tops <= 0)                           { break }

         wk_idx_top = wk_tops[1]
         if( NOME(wk_idx_top) == "SottopTop"
           | NOME(wk_idx_top) == "SottoTop_2P0") { wk_top_h = VAR_VAL(wk_idx_top,"SpessoreTopCliente") }
         else                                    { wk_top_h = VAR_VAL(wk_idx_top,"SpessorePiano")      }

         if( wk_top_h < 10 | wk_top_h > 12)          { break }

         wk_top_ok = 1
         break
      }

      //if( wk_alt_max+wk_top_h>920
      //  | wk_alt_max+wk_top_h<736  ) { wk_alt_ok = 0 }
      if( wk_alt_max>937.01 ) { wk_alt_ok = 0 }

      if( debug==1 )
      {
         COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK[",STR(wk_idx_piano),"]  CONTROLLI FINITI" ))
         COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK[",STR(wk_idx_piano),"]  CONTROLLI FINITI wk_all_ok    = ",STR(wk_all_ok     )))
         COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK[",STR(wk_idx_piano),"]  CONTROLLI FINITI wk_alt_ok    = ",STR(wk_alt_ok     )))
         COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK[",STR(wk_idx_piano),"]  CONTROLLI FINITI wk_alt_bs_ok = ",STR(wk_alt_bs_ok  )))
         COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK[",STR(wk_idx_piano),"]  CONTROLLI FINITI wk_alt_cp_ok = ",STR(wk_alt_cp_ok  )))
         COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK[",STR(wk_idx_piano),"]  CONTROLLI FINITI wk_lun_ok    = ",STR(wk_lun_ok     )))
         COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK[",STR(wk_idx_piano),"]  CONTROLLI FINITI wk_prof_ok   = ",STR(wk_prof_ok    )))
         COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK[",STR(wk_idx_piano),"]  CONTROLLI FINITI wk_biff_ok   = ",STR(wk_biff_ok    )))
         COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK[",STR(wk_idx_piano),"]  CONTROLLI FINITI wk_top_ok    = ",STR(wk_top_ok     )))
         COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK[",STR(wk_idx_piano),"]  CONTROLLI FINITI wk_orie_ok   = ",STR(wk_orie_ok    )))
         COMANDO2(STRCAT("LOGMSG   Ctrl_Globali_PianoSNACK PIANO_SNACK[",STR(wk_idx_piano),"]  CONTROLLI FINITI wk_736_ok    = ",STR(wk_736_ok     )))
      }

      continua_stendi = 1
      if( wk_all_ok    ==0
        | wk_alt_ok    ==0
        | wk_alt_bs_ok ==0
        | wk_alt_cp_ok ==0
        | wk_lun_ok    ==0
        | wk_prof_ok   ==0
        | wk_biff_ok   ==0
        | wk_top_ok    ==0
        | wk_orie_ok   ==0
        | wk_736_ok    ==0
        )
      {
         continua_stendi = 0

         MessaggioBlocco = MSG(1056)
         if( wk_all_ok==0    )  { MessaggioBlocco = STRCAT(MessaggioBlocco,"\n - ",MSG(1057))                        }
         if( wk_alt_ok==0    )  { MessaggioBlocco = STRCAT(MessaggioBlocco,"\n - ",MSG(1058))                        }
         if( wk_alt_bs_ok==0 )  { MessaggioBlocco = STRCAT(MessaggioBlocco,"\n - ",MSG(1068))                        }
         if( wk_alt_cp_ok==0 )  { MessaggioBlocco = STRCAT(MessaggioBlocco,"\n - ",MSG(1069))                        }
         if( wk_lun_ok==0    )  { MessaggioBlocco = STRCAT(MessaggioBlocco,"\n - ",FMT( MSG(1059), STR(wk_lun_min))) }
         if( wk_prof_ok==0   )  { MessaggioBlocco = STRCAT(MessaggioBlocco,"\n - ",MSG(1060))                        }
         if( wk_biff_ok==0   )  { MessaggioBlocco = STRCAT(MessaggioBlocco,"\n - ",MSG(1061))                        }
         if( wk_top_ok==0    )  { MessaggioBlocco = STRCAT(MessaggioBlocco,"\n - ",MSG(1062))                        }
         if( wk_736_ok==0    )  { MessaggioBlocco = STRCAT(MessaggioBlocco,"\n - ",MSG(1063))                        }
         if( wk_orie_ok==0   )  { MessaggioBlocco = STRCAT(MessaggioBlocco,"\n - ",MSG(1065))                        }

         if( OnStendi_PianoSNACK == 1 )
         {
            NO_PostGestDllValida = 1
            DISPLAY2(MessaggioBlocco)
            //LZ 20/01/2021: sblocco per gestione speciali
#ifndef TEC
            escluso=1
            COMANDO (STRCAT("SETTA ",STR(wk_idx_piano)))
            COMANDO("DELETE1 // non_stendo")
            EXITSUB()
#endif
         }

         if( OnCtrlGlobali_PianoSNACK == 1 )
         {
            MessaggioBlocco = STRCAT(MSG(1090),"\n\n",MessaggioBlocco,"\n\n",MSG(1146))
            HI(wk_idx_piano,1)
            DISPLAY3(MessaggioBlocco,$MB_OK+$MB_ICONERROR)
            HI(wk_idx_piano,0)
            //LZ 20/01/2021: sblocco per gestione speciali
#ifndef TEC
            COMANDO2(STRCAT("SETTA ",STR(wk_idx_piano)))
            COMANDO2("DELETE1")
#endif
         }
      }
   }
   //} procedure elementi SNACK

   //Luca 22/10/2019
   PROCEDURA Set_Gest_C008_Top
   {
      if( VAR_EXIST(ATTUALE(),"GEST_C008")==0 ) { EXITSUB() }

#ifdef TEC;AZI
      //Luca 23/03/2020 mantis 0022345
      //in alcuni ordini si è reso necessario configurare manualmente le lavorazioni per i top, ma le scelte dell'utente vengono sovrascritte.
      //Nel caso allegato, per esempio, se si potesse impostare GEST_C008 a TP001 eviteremmo la modifica manuale del prezzo, che viene maggiorato direttamente nel gestionale.
      //TI chiedo di limitare la modifica a i non RIV,
      if( STR_INDEX_OF(VAR_VAL_STR(ATTUALE(),"VarsUser__"),0,"GEST_C008")>0 ) { EXITSUB() }
#endif
      //if( IS_VAR_FIXED(ATTUALE(),"GEST_C008") ) { DEL_VAR_MODIFICATE(ATTUALE(),"GEST_C007") }

      CAT_VM_var = "C008"
      //CAT_VM_opz = "TP001;TP004;TP005;TP006;TP008"
      CAT_VM_opz = "TP005;TP006;TP008;TP013;TP014;TP015;TP016;TP017;TP018;TP019;TP020;TP025;TP026;TP027;TP028"
      CAT_VM_sel = ""

      //Luca 10/06/2020
      idx_test = ATTUALE()
      //Luca 10/06/2020 solo nel caso di TOP-GENERICO
      if( NOME(ATTUALE())=="SottoTop_generico" )  { idx_test = PADRE(ATTUALE(),1) }

      //verifico se sono interessato da uno scasso
      wk_eld_array = "LavelloGenerico;PianoCotturaGenerico;ScassoTopGenerico;Scasso_EldomTop;LavaboKERA;VascaTermoformata"

      BOX_MODE(0)
      NEAR_GLOBALE2( "wk_eld", idx_test, 1, "*")

      wk_eld_num = 1
      while( wk_eld_num <= wk_eld)
      {
         if( Is_In_StrArray( NOME(wk_eld[wk_eld_num]), wk_eld_array, ";") != 1)
         {
            DEL_ARRAY_ITEM( ATTUALE(), "wk_eld", wk_eld_num)
            wk_eld_num = wk_eld_num - 1
         }

         wk_eld_num = wk_eld_num + 1
      }

      wk_appoggio = 0
      wk_filotop  = 0
      wk_sottotop = 0

      wk_eld_num = 1
      while( wk_eld_num <= wk_eld)
      {
         wk_eld_att = wk_eld[wk_eld_num]

         if( VAR_EXIST( wk_eld_att, "VAR_ELD_TipoIncasso") == 1)
         {
            if( VAR_VAL( wk_eld_att, "VAR_ELD_TipoIncasso") == 0) { wk_appoggio = wk_appoggio + 1 }
            if( VAR_VAL( wk_eld_att, "VAR_ELD_TipoIncasso") == 1) { wk_filotop  = wk_filotop  + 1 }
            if( VAR_VAL( wk_eld_att, "VAR_ELD_TipoIncasso") == 2) { wk_sottotop = wk_sottotop + 1 }
         }

         if( NOME(wk_eld_att) == "Scasso_EldomTop")               { wk_appoggio = wk_appoggio + 1 }
         if( NOME(wk_eld_att) == "LavaboKERA")                    { wk_appoggio = wk_appoggio + 1 }
         if( NOME(wk_eld_att) == "VascaTermoformata")
         {
            wk_appoggio = wk_appoggio + VAR_VAL( wk_eld_att, "VT_Miscelatore")
         }

         wk_eld_num = wk_eld_num + 1
      }

      if( IS_MATCH( NOME(ATTUALE()), "SottoTop*") == 1 ) { wk_appoggio = wk_appoggio + wk_filotop + wk_sottotop }


      wk_appoggio_val = ""
      wk_sottotop_val = ""
      wk_filotop_val  = ""

      if( wk_appoggio==1 ) { wk_appoggio_val = "TP008" }
      if( wk_appoggio==2 ) { wk_appoggio_val = "TP025" }
      if( wk_appoggio==3 ) { wk_appoggio_val = "TP026" }
      if( wk_appoggio==4 ) { wk_appoggio_val = "TP027" }
      if( wk_appoggio>=5 ) { wk_appoggio_val = "TP028" }

      if( wk_filotop==1 )  { wk_filotop_val = "TP005" }
      if( wk_filotop==2 )  { wk_filotop_val = "TP013" }
      if( wk_filotop==3 )  { wk_filotop_val = "TP014" }
      if( wk_filotop==4 )  { wk_filotop_val = "TP015" }
      if( wk_filotop>=5 )  { wk_filotop_val = "TP016" }

      if( wk_sottotop==1 ) { wk_sottotop_val = "TP006" }
      if( wk_sottotop==2 ) { wk_sottotop_val = "TP017" }
      if( wk_sottotop==3 ) { wk_sottotop_val = "TP018" }
      if( wk_sottotop==4 ) { wk_sottotop_val = "TP019" }
      if( wk_sottotop>=5 ) { wk_sottotop_val = "TP020" }

      CAT_VM_sel = ""
      if( wk_appoggio_val!="" ) { CAT_VM_sel = STRCAT(CAT_VM_sel,wk_appoggio_val,";") }
      if( wk_filotop_val !="" ) { CAT_VM_sel = STRCAT(CAT_VM_sel,wk_filotop_val,";") }
      if( wk_sottotop_val!="" ) { CAT_VM_sel = STRCAT(CAT_VM_sel,wk_sottotop_val,";") }

      GOSUB Gest_CAT_VM
   }

   //{ PROCEDURE TOP 2.0
   PROCEDURA Setta_VarTipoTop_2P0
   {
      // Decodifico tipo top
      /// VAR_TipoTop 0 - 9 TOP Nobile + SOTTOTOP
      /// VAR_TipoTop = 0 Vetro    23mm  -->  4mm + 19mm
      /// VAR_TipoTop = 1 Vetro    29mm  --> 10mm + 19mm
      /// VAR_TipoTop = 2 Quarzo   31mm  --> 12mm + 19mm
      /// VAR_TipoTop = 3 Laminato 29mm  --> 10mm + 19mm
      /// VAR_TipoTop = 4 Laminato 31mm  --> 12mm + 19mm
      /// VAR_TipoTop = 6 XGlass   23mm  -->  4mm + 19mm
      /// VAR_TipoTop = 7 XGlass   29mm  --> 10mm + 19mm
      /// VAR_TipoTop = 8 MdI      31mm  --> 12mm + 19mm
      if( VAR_TipoTop == 0)  { VAR_TipoTopStr = "VETRO_4"         }
      if( VAR_TipoTop == 1)  { VAR_TipoTopStr = "VETRO_10"        }

      if( VAR_TipoTop == 2)  { VAR_TipoTopStr = "QUARZO_12"       }
      if( VAR_TipoTop == 3)  { VAR_TipoTopStr = "FENIX_10"        }
      if( VAR_TipoTop == 4)  { VAR_TipoTopStr = "FENIX_12"        }

      if( VAR_TipoTop == 6)  { VAR_TipoTopStr = "XGLASS_4"        }
      if( VAR_TipoTop == 7)  { VAR_TipoTopStr = "XGLASS_10"       }

      if( VAR_TipoTop == 8)  { VAR_TipoTopStr = "MDI_12"          }

      /// VAR_TipoTop 10 - 19 TOP CORPO UNICO
      /// VAR_TipoTop = 10 Laminato 29mm  --> 10mm + 19mm
      /// VAR_TipoTop = 11 Acciaio  29mm  --> 10mm + 19mm
      /// VAR_TipoTop = 12 Wildwood 30mm  --> 11mm + 19mm
      /// VAR_TipoTop = 13 Laminato 31mm  --> 12mm + 19m
      if( VAR_TipoTop == 10) { VAR_TipoTopStr = "LAMINATO_10"     }
      if( VAR_TipoTop == 11) { VAR_TipoTopStr = "ACCIAIO_10"      }
      if( VAR_TipoTop == 12) { VAR_TipoTopStr = "WILDWOOD_19"     }
      if( VAR_TipoTop == 13) { VAR_TipoTopStr = "LAMINATO_12"     }

      /// VAR_TipoTop 20 - 29 TOP 80
      /// VAR_TipoTop = 20 Madeterraneo  80 mm  --> 80mm + 19mm
      /// VAR_TipoTop = 21 Acciaio Steel 80mm   --> 80mm + 19mm
      /// VAR_TipoTop = 22 Wildwood      80mm   -->  80mm + 19mm
      /// VAR_TipoTop = 23 Acciaio Steel Penisola 80mm   --> 80mm
      if( VAR_TipoTop == 20) { VAR_TipoTopStr = "MADETERRANEO_80" }
      if( VAR_TipoTop == 21) { VAR_TipoTopStr = "ACCIAIO_80"      }
      if( VAR_TipoTop == 22) { VAR_TipoTopStr = "WILDWOOD_80"     }

      if( VAR_TipoTop == 99) { VAR_TipoTopStr = "CLIENTE"         }

      // Default
      TopUnico     = 0

      SpessorePiano = 4
      SpessoreSottoPiano = 19

      LungMaxTop   = 4000
      ProfMinTop   = 331
      ProfMaxTop   = 1440

      passa_CodTop = ""
      passa_RadTop = ""

      // Per tipologia
      if( VAR_TipoTopStr == "VETRO_4")
      {
         SpessorePiano = 4
         LungMaxTop = 3510
         ProfMaxTop = 1450
         passa_CodTop = "T04902"
         passa_RadTop = "TOPVTR"

         if( Zt > 758)
         {
            LungMaxTop = 2800
            passa_RadTop = "TOPVTR_2"
         }

         if( Zt > 1178)
         {
            LungMaxTop = 2220
            passa_RadTop = "TOPVTR_3"
         }

         if( Cucina_Versione > 2)
         {
            LungMaxTop = 3200
            ProfMaxTop = 1440
            passa_RadTop = "TOP3VETRO_4"
         }
      }

      if( VAR_TipoTopStr == "VETRO_10")
      {
         SpessorePiano = 10
         LungMaxTop = 3510
         ProfMaxTop = 1450
         passa_CodTop = "T04901"
         passa_RadTop = "TOPVTR"

         if( Zt > 758)
         {
            LungMaxTop = 2800
            passa_RadTop = "TOPVTR_2"
         }

         if( Zt > 1178)
         {
            LungMaxTop = 2220
            passa_RadTop = "TOPVTR_3"
         }

         if( FLAG_ConVascheTermoformate == 1)
         {
            LungMaxTop = 3014
            ProfMaxTop = 630
            passa_CodTop = "T04906"
            passa_RadTop = SE_STR( VT_NumVasche == 2, "TO2VAIN", "TO1VAIN")
         }

         if( Cucina_Versione > 2)
         {
            LungMaxTop = 3500
            ProfMaxTop = 1440
            passa_RadTop = "TOP3VETRO_10"

            if( Zt > 825 + 2 + 2)
            {
               LungMaxTop = 2500
               passa_RadTop = "TOP3VETRO_10_1"
            }

            if( FLAG_ConVascheTermoformate == 1)
            {
               LungMaxTop = 3014
               ProfMinTop = 520
               ProfMaxTop = 549
               passa_CodTop = "T04906"
               passa_RadTop = ""
            }
         }
      }

      if( VAR_TipoTopStr == "QUARZO_12")
      {
         SpessorePiano = 12
         LungMaxTop= 2980
         passa_CodTop = "T06901"
         passa_RadTop = "TOPQRZ"

         if( Zt > 758)
         {
            LungMaxTop= 2800
            passa_RadTop = "TOPQRZ_2"
         }

         if( Zt > 1178)
         {
            LungMaxTop= 2220
            passa_RadTop = "TOPQRZ_3"
         }

         if( Cucina_Versione > 2)
         {
            LungMaxTop = 2980
            ProfMaxTop = 1380
            passa_RadTop = "TOP3QUARZO_12"

            if( Zt > 725 + 2 + 2)
            {
               LungMaxTop = 2800
               passa_RadTop = "TOP3QUARZO_12_1"
            }

            if( Zt > 1200 + 2 + 2)
            {
               LungMaxTop = 2220
               passa_RadTop = "TOP3QUARZO_12_2"
            }
         }
      }

      if( VAR_TipoTopStr == "FENIX_10")
      {
         TopUnico= 1
         SpessorePiano = 10
         LungMaxTop= 4200
         passa_CodTop = "T03901"
         passa_RadTop = "TOPFENIX"
      }

      if( VAR_TipoTopStr == "FENIX_12")
      {
         TopUnico= 1
         SpessorePiano = 12
         LungMaxTop= 4200
         passa_CodTop = "T03901"
         passa_RadTop = "TOPFENIX"

         if( Cucina_Versione > 2)
         {
            LungMaxTop = 4180
            ProfMaxTop = 1280
            passa_RadTop = "TOP3FENIX_12"
         }
      }

      if( VAR_TipoTopStr == "XGLASS_4")
      {
         SpessorePiano = 4
         LungMaxTop = 3510
         ProfMaxTop = 1450
         passa_CodTop = "T05902"
         passa_RadTop = "TOPXG"

         if( Zt>758)
         {
            LungMaxTop = 2800
            passa_RadTop = "TOPXG_2"
         }

         if( Zt>1178)
         {
            LungMaxTop = 2220
            passa_RadTop = "TOPXG_3"
         }

         if( Cucina_Versione > 2)
         {
            LungMaxTop = 3200
            ProfMaxTop = 1440
            passa_RadTop = "TOP3XGLASS_4"
         }
      }

      if( VAR_TipoTopStr == "XGLASS_10")
      {
         SpessorePiano = 10
         LungMaxTop = 3510
         ProfMaxTop = 1450
         passa_CodTop = "T05901"
         passa_RadTop = "TOPXG"

         if( Zt>758)
         {
            LungMaxTop = 2800
            passa_RadTop = "TOPXG_2"
         }

         if( Zt>1178)
         {
            LungMaxTop = 2220
            passa_RadTop = "TOPXG_3"
         }

         if( Cucina_Versione > 2)
         {
            LungMaxTop = 3500
            ProfMaxTop = 1440
            passa_RadTop = "TOP3XGLASS_10"

            if( Zt > 825 + 2 + 2)
            {
               LungMaxTop = 2500
               passa_RadTop = "TOP3XGLASS_10_1"
            }
         }
      }

      if( VAR_TipoTopStr == "MDI_12")
      {
         SpessorePiano = 12
         LungMaxTop = 3200
         passa_CodTop = "T12901"
         passa_RadTop = "TOP3MDI_12"
      }

      if( VAR_TipoTopStr == "LAMINATO_10")
      {
         TopUnico = 1
         SpessorePiano = 10
         LungMaxTop = 4200
         passa_CodTop = "T02901"
         passa_RadTop = "TOPLAM"
      }

      if( VAR_TipoTopStr == "LAMINATO_12")
      {
         TopUnico = 1
         SpessorePiano = 12
         LungMaxTop = 4200
         passa_CodTop = "T02901"
         passa_RadTop = "TOPLAM"

         if( Cucina_Versione > 2)
         {
            LungMaxTop = 4180
            ProfMaxTop = 1280
            passa_RadTop = "TOP3LAMINATO_12"
         }
      }

      if( VAR_TipoTopStr == "ACCIAIO_10")
      {
         TopUnico = 1
         SpessorePiano = 10
         LungMaxTop = 4000
         passa_CodTop = "T09901"
         passa_RadTop = "TOPSTEEL"

         if( Cucina_Versione > 2)
         {
            LungMaxTop = 4000
            ProfMaxTop = 1400
            passa_RadTop = "TOP3ACCIAIO_10"
         }
      }

      if( VAR_TipoTopStr == "WILDWOOD_19")
      {
         TopUnico = 1
         SpessorePiano = 10
         LungMaxTop = 2944
         passa_CodTop = "T07901"
         passa_RadTop = "TOPWW"

         if( Zt > 1150)
         {
            LungMaxTop = 2500
            passa_RadTop = "TOPWW_2"
         }

         if( Cucina_Versione > 2)
         {
            LungMaxTop = 3500
            ProfMaxTop = 1440
            passa_RadTop = "TOP3WILDWOOD_19"
         }
      }

      if( VAR_TipoTopStr == "MADETERRANEO_80")
      {
         SpessorePiano = 80
         LungMaxTop = 4200
         passa_CodTop = "T08901"
         passa_RadTop = "TOPMADET"
      }

      if( VAR_TipoTopStr == "ACCIAIO_80")
      {
         SpessorePiano = 80
         LungMaxTop = 4000
         passa_CodTop = "T09902"
         passa_RadTop = "TOPSTEEL"

         if( Cucina_Versione > 2)
         {
            LungMaxTop = 4000
            ProfMaxTop = 1400
            passa_RadTop = "TOP3ACCIAIO_80"
         }
      }

      if( VAR_TipoTopStr == "WILDWOOD_80")
      {
         SpessorePiano = 80
         LungMaxTop = 2944
         passa_CodTop = "T07902"
         passa_RadTop = "TOPWW"

         if( Zt > 1150)
         {
            LungMaxTop = 2500
            passa_RadTop = "TOPWW_2"
         }

         if( Cucina_Versione > 2)
         {
            LungMaxTop = 3500
            ProfMaxTop = 1440
            passa_RadTop = "TOP3WILDWOOD_80"

            if( Zt > 825 + 2 + 2)
            {
               LungMaxTop = 2500
               passa_RadTop = "TOP3WILDWOOD_80_1"
            }
         }
      }

      if( VAR_TipoTopStr == "CLIENTE") { SpessorePiano = SpessoreTopCliente }

      if( Cucina_Versione > 2)
      {
         // Correggo valori massimi tenendo conto degli sbordi
         LungMaxTop = LungMaxTop + 6 + 6
         ProfMaxTop = ProfMaxTop + 2 + 2

         // Salvo sempre numero di vasche termoformate
         if( FLAG_ConVascheTermoformate > 0)
         {
            VAR_SET_MODE( ATTUALE(), "VT_NumVasche", $MODE_SAVEALWAYS)
         }
      }

      // Dimenione massima e menu
      if( VAR_VAL(ATTUALE(),"ORD_XMAX") > 0) { LungMaxTop  = VAR_VAL( ATTUALE(), "ORD_XMAX") }

      VAR_SET_MENU( ATTUALE(), "X", STRCAT( "( 10-", STR(LungMaxTop), ")"))
      VAR_SET_MENU( ATTUALE(), "Zt", STRCAT( "( ", STR(ProfMinTop), "-", STR(ProfMaxTop), ")"))

      //[ 14/04/21 - Gestione per TOP STEEL PENISOLA
      GOSUB SetTopSteelPenisola
      //] 14/04/21 - Gestione per TOP STEEL PENISOLA
   }

   PROCEDURA top_calcola_xt_2P0
   {
      brd_sx=0
      brd_dx=0

      Xt = X + AA_SBORDO_SX + AA_SBORDO_DX + brd_dx + brd_sx + aa_sbrd_sx + aa_sbrd_dx

      //dim passata a gestionale (e controllata come dim max)
      X_Tot = Xt - Rid_dx - Rid_sx
   }

   PROCEDURA Top_stendi_2P0
   {
      if( VAR_VAL(ATTUALE(),"steso")>0 ) { EXITSUB() }

      //non eseguo gli scassi fino alla notifica
      WAIT_Scassi = 1

      //top_steso   = 1
      solo_angolo = -1
      steso = 1
      if( ACTION()==2 )  { steso = 2 }

      if ( $stesi_mode_sx == $stesi_Elemento
         & $stesi_mode_dx == $stesi_Elemento )
      {
         ID_Sin = $stesi_idx1
         ID_Des = $stesi_idx2

         //Inverto sx con dx se il pick è stato fatto al contrario
         CTLR_SEQUENZA_SXDX( ID_Sin, ID_Des )

         GOSUB Sub_Stendi_2P0
      }
   }

   PROCEDURA Sub_Stendi_2P0
   {
      debug = VAR_VAL(-1,"ATTIVA_LOG_DBG")
#ifndef TE
      debug = 0
#endif
      wk_prof_diverse = 0
      wk_filo_fronte  = 0
      wk_filo_retro   = 0

      wk_top_stendi_isola = 0
      wk_sposta_z    = 0
      wk_prof_basi_retro = 0
      wk_con_barra = 1

      SpostaProfondita = 0

      //analizzo la sequenza di idx selezionati e verifico se sono nel caso di un top isola oppure un potenziale FUSION
      //1    - verifico se tutte hanno la stessa profondità
      //1.1  - verifico allineamento basi selezionate

      //2    - verifico se tutte le base selezionate hanno la barra isola
      wk_valvola = 1
      wk_idx_test = ID_Sin
      wk_z_prec = VAR_VAL(ID_Sin,"Z")

      FLAG_Basi180    = 0

      //COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ATTUALE: ",STR(ATTUALE()), " ID_Sin=",STR(ID_Sin), " - ",STR(ANG_TOT2(ID_Sin))," ID_Des=",STR(ID_Des)," - ",STR(ANG_TOT2(ID_Des))," wk_prof_uguale --> angoli diversi "))
      if( debug )
      {
         COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ",STR(ATTUALE()), " ID_Sin=",STR(ID_Sin), "-",NOME(ID_Sin), " ID_Des=",STR(ID_Des), "-",NOME(ID_Des) ))
         COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ATTUALE: ",STR(ATTUALE()), " ID_Sin=",STR(ID_Sin), " - ",STR(ANG_TOT2(ID_Sin))," ID_Des=",STR(ID_Des)," - ",STR(ANG_TOT2(ID_Des)),""))
         COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ATTUALE: ",STR(ATTUALE()), " ID_Sin=",STR(ID_Sin), " - ",STR(ANG_TOT_NOR(ID_Sin))," ID_Des=",STR(ID_Des)," - ",STR(ANG_TOT_NOR(ID_Des))," ANG_TOT_NOR"))
      }

      //verifico angolo
      //if( ABS(ANG_TOT2(ID_Sin)-ANG_TOT2(ID_Des))>0.1 )
      if( ABS(ANG_TOT_NOR(ID_Sin)-ANG_TOT_NOR(ID_Des))>0.1 )
      {
         //VERIFICA BASI AFFIANCATE CON ANGOLO + 180
         //verifico:
         // - se hanno la stessa profondità
         // - se hanno angolo +180
         // - se sono allineate
         if( VAR_VAL(ID_Sin,"Z")==VAR_VAL(ID_Des,"Z") )
         {
            if( VAR_EXIST(ID_Sin,"punto_sx_top")==1
              & VAR_EXIST(ID_Des,"punto_dx_top")==1 )
            {
               SET_#(ID_Sin)
               wk_sx_psxr = #punto_sx_top
               wk_sx_psxf = #punto_sx_top_fro

               SET_#(ID_Des)
               wk_dx_psxr = #punto_sx_top
               wk_dx_psxf = #punto_sx_top_fro

               wk_ang_rt = ANG_2_PUNTI(wk_sx_psxr,wk_dx_psxf)
               wk_ang_fr = ANG_2_PUNTI(wk_sx_psxf,wk_dx_psxr)


               //if( ABS(wk_ang_rt)<0.1    ) { wk_ang_rt = wk_ang_rt + 360 }
               //if( ABS(wk_ang_rt)>=359.9 ) { wk_ang_rt = wk_ang_rt - 360 }
               //
               //if( ABS(wk_ang_fr)<0.1    ) { wk_ang_fr = wk_ang_fr + 360 }
               //if( ABS(wk_ang_fr)>=359.9 ) { wk_ang_fr = wk_ang_fr - 360 }

               //if( wk_ang_fr<0 )    { wk_ang_fr = wk_ang_fr + 360 }
               //if( wk_ang_fr>=360 ) { wk_ang_fr = wk_ang_fr - 360 }

               if( debug )
               {
                  COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ATTUALE: ",STR(ATTUALE()), " ID_Sin=",STR(ID_Sin)," ID_Des=",STR(ID_Des)," wk_prof_uguale --> angoli diversi "))
                  COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ATTUALE: ",STR(ATTUALE()), " wk_ang_rt=",STR(wk_ang_rt)," wk_ang_fr=",STR(wk_ang_fr)," wk_prof_uguale --> angoli diversi "))
               }

               wk_ang_sin = ANG_TOT2(ID_Sin)
               wk_ang_des = ANG_TOT2(ID_Des)

               if( ABS(ANG_TOT2(ID_Sin)-wk_ang_rt)<0.1 ) { FLAG_Basi180 = 1 }
               if( ABS(ANG_TOT2(ID_Sin)-wk_ang_fr)<0.1 ) { FLAG_Basi180 = 2 }
            }
         }

         //Luca 06/12/2019
         wk_ok_angolo = 0
         if( NOME(ID_Sin)=="ScoccaT_BaseAngoloIsola" & NOME(ID_Des)!="ScoccaT_BaseAngoloIsola"  )
         {
            SET_#(ID_Sin)
            ang_iso_dx = #AngoloDx

            if( ABS(ang_iso_dx-ANG_TOT2(ID_Des))<0.1 ) { wk_ok_angolo = 1 }
         }

         if( NOME(ID_Sin)!="ScoccaT_BaseAngoloIsola" & NOME(ID_Des)=="ScoccaT_BaseAngoloIsola"  )
         {
            SET_#(ID_Des)
            ang_iso_dx = #AngoloSx

            if( ABS(ANG_TOT2(ID_Sin)-ang_iso_dx)<0.1 ) { wk_ok_angolo = 1 }
         }

         //Luca 22/05/2020
         if( NOME(ID_Sin)=="ScoccaT_AngoloCieco" & NOME(ID_Des)!="ScoccaT_AngoloCieco"  )
         {
            SET_#(ID_Sin)
            ang_iso_dx = #AngoloDx
            if( ang_iso_dx<0 ) { ang_iso_dx = ang_iso_dx + 360 }

            ang_bas_dx = ANG_TOT2(ID_Des)
            if( ang_bas_dx<0 ) { ang_bas_dx = ang_bas_dx + 360 }

            if( ABS(ang_iso_dx-ANG_TOT2(ID_Des))<0.1 ) { wk_ok_angolo = 1 }
         }
         //if( NOME(ID_Sin)!="ScoccaT_AngoloCieco" & NOME(ID_Des)=="ScoccaT_AngoloCieco"  )
         //{
         //   SET_#(ID_Des)
         //   ang_iso_dx = #AngoloSx
         //
         //   if( ABS(ANG_TOT2(ID_Sin)-ang_iso_dx)<0.1 ) { wk_ok_angolo = 1 }
         //}

         if( FLAG_Basi180==0 & wk_ok_angolo==0 )
         {
            //wk_msg_per_angolo = 1
            //GOSUB non_stendo
            //top_steso = 1
            //EXIT()
            steso = 1
            delme = 1
            $str_msg=STRCAT(MSG(1090),"\n",MSG(1098))
            DISPLAY3($str_msg,$MB_ICONERROR)
            NO_GEST = 1
            EXIT()
         }
      }

      wk_procedi_stendi = 1

      if( IS_MATCH(NOME(ID_Sin),"ScoccaT_B*")!=1
        & IS_MATCH(NOME(ID_Sin),"ScoccaT_Angolo*")!=1 ) { wk_procedi_stendi = 0 }

      if( IS_MATCH(NOME(ID_Des),"ScoccaT_B*")!=1
        & IS_MATCH(NOME(ID_Des),"ScoccaT_Angolo*")!=1 ) { wk_procedi_stendi = 0 }

      //if( IS_MATCH(NOME(ID_Sin),"ScoccaT_B*")!=1
      //  | IS_MATCH(NOME(ID_Des),"ScoccaT_B*")!=1 )
      if( wk_procedi_stendi==0 )
      {
         if( debug ) { COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ",STR(ATTUALE()), " ID_Sin=",STR(ID_Sin), "-",NOME(ID_Sin), " ID_Des=",STR(ID_Des), "-",NOME(ID_Des) , " NON POSSO STENDERE" )) }

         //wk_msg_per_angolo = 1
         //GOSUB non_stendo
         //top_steso = 1
         //EXIT()
         steso = 1
         delme = 1
         $str_msg=STRCAT(MSG(1090),"\n",MSG(1098))
         DISPLAY3($str_msg,$MB_ICONERROR)
         NO_GEST = 1
         EXIT()
      }

      if( debug )
      {
         COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ATTUALE: ",STR(ATTUALE()), " ID_Sin=",STR(ID_Sin)," ID_Des=",STR(ID_Des)))
         COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ATTUALE: ",STR(ATTUALE()), " wk_idx_test=",STR(wk_idx_test)," wk_z_prec=",STR(wk_z_prec)))
         COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ATTUALE: ",STR(ATTUALE()), " FLAG_Basi180=",STR(FLAG_Basi180)))
      }

      while( IS_IDX(wk_idx_test) & wk_valvola<20  )
      {
         wk_z_test = VAR_VAL(wk_idx_test,"Z")

         //Luca 06/12/2019
         if( NOME(wk_idx_test)=="ScoccaT_BaseAngoloIsola" )
         {
            //Se prima delle selezione verifico la profondità per continuare a dx
            if( wk_idx_test==ID_Sin ) { wk_z_test = VAR_VAL(wk_idx_test,"Z_dx_top") }
            else                      { wk_z_test = VAR_VAL(wk_idx_test,"Z_sx_top")  }
         }

         if( wk_z_test!=wk_z_prec ) { wk_prof_diverse = 1 }

         //COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 wk_valvola: ",STR(wk_valvola), " wk_idx_test=",STR(wk_idx_test)," wk_z_test=",STR(wk_z_test )))

         if( VAR_VAL(wk_idx_test,"ConBarraIsola")!=1 ) { wk_con_barra = 0 }

         //COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0   - -  -  FNC_VICINESXDX_cuc ",STR(wk_idx_test), " (",STR(ACTION()),")"))
         FNC_VICINESXDX_cuc(wk_idx_test,"ScoccaT_*","*")

         if( wk_idx_test==ID_Des )  { wk_idx_test = -1 }
         else
         {
            //if( VAR_EXIST(wk_idx_test,"idx_dx") )
            if( VAR_EXIST(wk_idx_test,"idx_alto_dx") )
            {
               SET_#(wk_idx_test)
               //wk_idx_test = #idx_dx
               wk_idx_test = #idx_alto_dx
            }
            else
            {
               wk_idx_test = -1
            }
         }
         //if( wk_idx_test==ID_Des )  { wk_idx_test = -1 }

         wk_valvola = wk_valvola + 1
      }

      if( wk_prof_diverse==1 )
      {
         SET_#(ID_Sin)
         wk_b0_sin = #base_0
         wk_b1_sin = #base_1
         if( NOME(ID_Sin)=="ScoccaT_BaseAngPan" )
         {
            wk_b1_sin.x = wk_b0_sin.x +   SENO(ANG_TOT2(ID_Sin))*(#Zr)
            wk_b1_sin.z = wk_b0_sin.z + COSENO(ANG_TOT2(ID_Sin))*(#Zr)
         }

         SET_#(ID_Des)
         wk_b0_des = #base_0
         wk_b1_des = #base_1

         if( debug )
         {
            COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ATTUALE: ",STR(ATTUALE()), " ID_Sin=",STR(ID_Sin)," ID_Des=",STR(ID_Des)," wk_prof_diverse **** "))
            COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ATTUALE: ",STR(ATTUALE()), " wk_b0_sin=[",STR(wk_b0_sin.x),",",STR(wk_b0_sin.y),",",STR(wk_b0_sin.z),"] wk_b1_sin=[",STR(wk_b1_sin.x),",",STR(wk_b1_sin.y),",",STR(wk_b1_sin.z),"]"))
            COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ATTUALE: ",STR(ATTUALE()), " wk_b0_des=[",STR(wk_b0_des.x),",",STR(wk_b0_des.y),",",STR(wk_b0_des.z),"] wk_b1_des=[",STR(wk_b1_des.x),",",STR(wk_b1_des.y),",",STR(wk_b1_des.z),"]"))
         }

         wk_ang_rt = ANG_2_PUNTI(wk_b0_sin,wk_b0_des)
         wk_ang_fr = ANG_2_PUNTI(wk_b1_sin,wk_b1_des)

         if( ABS(ANG_TOT2(ID_Sin)-wk_ang_rt)<0.1 ) { wk_filo_retro  = 1 }
         if( ABS(ANG_TOT2(ID_Sin)-wk_ang_fr)<0.1 ) { wk_filo_fronte = 1 }
      }

      if( wk_con_barra==1 )
      {
         wk_top_stendi_isola = 1

         //Luca 05/12/2019
         //chiedo se voglio stendere isola o meno
         r = DISPLAY3(MSG(1099),$MB_YESNO+$MB_ICONQUESTION)

         if( $MB_ID_NO==r ) { wk_top_stendi_isola = 0 }

         if( wk_top_stendi_isola==1 )
         {
            //calcolo l'offset z per il posizionamento corretto del top -- usato poi per agganciare il top corretta
            wk_idx_bar = -1
            BOX_MODE(0)
            NEAR_GLOBALE("wk_bar",ID_Sin,1,1,"BarraIsola")
            if( wk_bar>0 ) { wk_idx_bar = wk_bar[1] }

            if( IS_IDX(wk_idx_bar) )
            {
               SET_#(wk_idx_bar)
               wk_trovato_latoa = 0
               i = 1
               while ( i<= #BasiLatoA )
               {
                  if( ID_Sin==#BasiLatoA[i] )  { wk_trovato_latoa  = 1 }
                  i = i + 1
               }

               if( wk_trovato_latoa==1 )
               {
                  if( #BasiLatoB>0 ) { wk_prof_basi_retro = VAR_VAL(#BasiLatoB[1],"Z") }
               }
               else
               {
                  if( #BasiLatoA>0 ) { wk_prof_basi_retro = VAR_VAL(#BasiLatoA[1],"Z") }
               }

               wk_sposta_z = wk_prof_basi_retro + $Cuc_Spe_BarraIso
            }
         }
      }

      SET_#(ID_Sin)
      P1 = #punto_sx_top
      Z1 = #Z
      if( VAR_EXIST(ID_Sin,"Z_sx_top") ) { Z1 = #Z_sx_top  }

      SET_#(ID_Des)
      P2 = #punto_dx_top
      Z2 = Z1
      if( VAR_EXIST(ID_Des,"Z_dx_top") ) { Z2 = #Z_dx_top }

      //Luca 06/12/2019
      if( NOME(ID_Sin)=="ScoccaT_BaseAngoloIsola" & ID_Sin!=ID_Des )
      {
         SET_#(ID_Sin)
         wk_ang_bai = #AngoloDx
         Z1 = #Z_dx_top
         //se angolo diverso, cambio punto
         if( ABS(ANG_TOT2(ID_Sin)-ANG_TOT2(ID_Des))>0.1 )
         {
            P1 = #punto_dx_top
            wk_ang_bai = #AngoloDx
         }

         //se non sono allineati retro, avanto il punto 1
         if( ABS(ANG_2_PUNTI(P1,P2)-ANG_TOT2(ID_Sin))>0.1 )
         {
            wk_dist = DistanzaFraPunti(P1,P2,wk_ang_bai+90)
            P1.x = P1.x +   SENO(ANG_TOT2(ID_Sin))*wk_dist
            P1.z = P1.z + COSENO(ANG_TOT2(ID_Sin))*wk_dist
         }
      }

      //Luca 06/12/2019
      if( NOME(ID_Des)=="ScoccaT_BaseAngoloIsola" & ID_Sin!=ID_Des )
      {
         Z2 = #Z_sx_top
         wk_ang_bai = #AngoloSx

         //se angolo diverso, cambio punto
         if( ABS(ANG_TOT2(ID_Sin)-ANG_TOT2(ID_Des))>0.1 )
         {
            P2 = #punto_sx_top
            wk_ang_bai = #AngoloDx
         }

         //se non sono allineati retro, avanto il punto 2
         if( ABS(ANG_2_PUNTI(P1,P2)-ANG_TOT2(ID_Sin))>0.1 )
         {
            wk_dist = DistanzaFraPunti(P1,P2,wk_ang_bai+90)
            P2.x = P2.x +   SENO(ANG_TOT2(ID_Sin))*wk_dist
            P2.z = P2.z + COSENO(ANG_TOT2(ID_Sin))*wk_dist
         }
      }

      //Luca 10/06/2020
      if( NOME(ID_Sin)=="ScoccaT_BaseAngoloIsola" & ID_Sin==ID_Des )
      {
         SET_#(ID_Sin)
         Z1 = #Z_sx_top
         SpostaProfondita = -20
         if( #Verso>0 )
         {
            Z1 = #Z_dx_top
            SpostaProfondita = 0
         }

         wk_prof_diverse = 0
         wk_filo_fronte  = 0
         wk_filo_retro   = 0

      }

      ////Luca 22/05/2020
      //if( NOME(ID_Sin)=="ScoccaT_AngoloCieco" & ID_Sin!=ID_Des )
      //{
      //   SET_#(ID_Sin)
      //   wk_ang_bai = #AngoloDx
      //   Z1 = #Z_dx_top
      //   //se angolo diverso, cambio punto
      //   if( ABS(ANG_TOT2(ID_Sin)-ANG_TOT2(ID_Des))>0.1 )
      //   {
      //      P1 = #punto_dx_top
      //      wk_ang_bai = #AngoloDx
      //   }
      //
      //   //se non sono allineati retro, avanto il punto 1
      //   if( ABS(ANG_2_PUNTI(P1,P2)-ANG_TOT2(ID_Sin))>0.1 )
      //   {
      //      wk_dist = DistanzaFraPunti(P1,P2,wk_ang_bai+90)
      //      P1.x = P1.x +   SENO(ANG_TOT2(ID_Sin))*wk_dist
      //      P1.z = P1.z + COSENO(ANG_TOT2(ID_Sin))*wk_dist
      //   }
      //}

      if( NOME(ID_Sin)=="ScoccaT_AngoloCieco" & ID_Sin!=ID_Des )
      {
         SET_#(ID_Sin)
         P1 = #alto_3
         Z1 = #Z_dx_top
      }

      if( NOME(ID_Des)=="ScoccaT_AngoloCieco" )
      {
         SET_#(ID_Des)
         Z2 = #Z_sx_top
         P2 = #alto_3
      }

      if( FLAG_Basi180>0 )
      {
         P2 = #punto_sx_top
         if( FLAG_Basi180==2 ) { P2 = #punto_sx_top_fro }
      }

      GOSUB imposta_zsotto_dx

      zsotto = Z1
      if( wk_prof_diverse==1 & wk_filo_retro==1 )
      {
         if( Z1>Z2 ) { zsotto = Z2 }
         if( Z2>Z1 ) { zsotto = Z1 }
      }

      if( wk_prof_diverse==1 & wk_filo_fronte==1 )
      {
         if( Z1>Z2 )
         {
            wk_sposta2_z = Z1-Z2
            P1.x = P1.x +   SENO(ANG_TOT2(ID_Sin))*wk_sposta2_z
            P1.z = P1.z + COSENO(ANG_TOT2(ID_Sin))*wk_sposta2_z
            zsotto = Z2
            SpostaProfondita = wk_sposta2_z
         }
         if( Z2>Z1 )
         {
            zsotto = Z1

            wk_sposta2_z = Z2-Z1
            P2.x = P2.x +   SENO(ANG_TOT2(ID_Sin))*wk_sposta2_z
            P2.z = P2.z + COSENO(ANG_TOT2(ID_Sin))*wk_sposta2_z
         }
      }

      if( wk_top_stendi_isola )
      {
         zsotto = Z1 + wk_sposta_z

         P1.x = P1.x -   SENO(ANG_TOT2(ID_Sin))*wk_sposta_z
         P1.z = P1.z - COSENO(ANG_TOT2(ID_Sin))*wk_sposta_z

         P2.x = P2.x -   SENO(ANG_TOT2(ID_Sin))*wk_sposta_z
         P2.z = P2.z - COSENO(ANG_TOT2(ID_Sin))*wk_sposta_z

         SpostaProfondita = -1*wk_sposta_z
      }

      GOSUB ricava_ang_y
      ang_y = ANG_2_PUNTI(P1,P2)

      GOSUB SubTop_Stendi_CheckLungMax

      x1=P1.x  z1=P1.z
      x2=P2.x  z2=P2.z
      x12=x2-x1
      z12=z2-z1

      ca=COSENO(ang_y)
      sa=SENO(-ang_y)

      X = FLOOR(((x12*ca+z12*sa)+0.005)*100)/100

      idx_rif_steso_sx = ID_Sin

      base_0 = P1

      if( NOME(ATTUALE())=="SottoTop_2P0" ) { base_0.y = base_0.y - Y }

      ////adatta la Z del top alle basi sottostanti
      //if ( adatta_Z ) { GOSUB adatta_z_top }
      Z = zsotto

      //Luca 06/05/2020
      if( VAR_VAL(ATTUALE(),"FLAG_ConVascheTermoformate")==1 )
      {
         wk_blocca_ins = 0
         x_min = 736
         #ifdef TEC
         x_min = 680
         #endif
         x_max = 3000

         z_min = 420
         z_max = 606

         //da verificare
         if( VT_NumVasche==2 ) { x_min = 1290 }

         //Luca 26/06/2020 mantis 22827: Vasche termoformate: gestione su base H184
         if( IS_IDX(ID_Sin)==1 )
         {
            if( VAR_VAL(ID_Sin,"Y") < 368  )
            {
               #ifdef AGE;RIV
               wk_blocca_ins = 1
               #endif

               #ifndef AGE;RIV
               // LZ: Modifica limite
               //if( VAR_VAL(ID_Sin,"Zt") < 630  ) { wk_blocca_ins = 1 }
               if( VAR_VAL(ID_Sin,"Zt") < 520  ) { wk_blocca_ins = 1 }
               #endif

            }
         }
         if( IS_IDX(ID_Des)==1 )
         {
            if( VAR_VAL(ID_Des,"Y") < 368  )
            {
               #ifdef AGE;RIV
               wk_blocca_ins = 1
               #endif

               #ifndef AGE;RIV
               // LZ: Modifica limite
               //if( VAR_VAL(ID_Des,"Zt") < 630  ) { wk_blocca_ins = 1 }
               if( VAR_VAL(ID_Des,"Zt") < 520  ) { wk_blocca_ins = 1 }
               #endif
            }
         }

         if( Z > z_max | Z < z_min )  { wk_blocca_ins = 1 }
         if( X > x_max | X < x_min )  { wk_blocca_ins = 2 }

         if( wk_blocca_ins>0 )
         {
            if( debug ) { COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ATTUALE: ",STR(ATTUALE()), " X=",STR(X)," Z=",STR(Z) ," wk_blocca_ins=",STR(wk_blocca_ins))) }
            steso = 1
            delme = 1
            $str_msg=STRCAT(MSG(1090),"\n",MSG(1098),"\n",MSG(1136))
            DISPLAY3($str_msg,$MB_ICONERROR)
            NO_GEST = 1
         }
      }

      if( debug )
      {
         COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 ATTUALE: ",STR(ATTUALE()), " ID_Sin=",STR(ID_Sin)," ID_Des=",STR(ID_Des) , " idx_rif_steso_sx=",STR(idx_rif_steso_sx)))
         COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 wk_prof_diverse= ",STR(wk_prof_diverse), " wk_filo_fronte=",STR(wk_filo_fronte)," wk_filo_retro=",STR(wk_filo_retro)))
         COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 wk_top_stendi_isola=",STR(wk_top_stendi_isola), " wk_con_barra=",STR(wk_con_barra)," wk_sposta_z=",STR(wk_sposta_z)))
      }
   }

   PROCEDURA Notifica_Top_2P0
   {
      //Per effetto del comando DLINK2POS:
      if ( ACTION()==12 & escluso==0 )
      {
         if( VAR_VAL(ATTUALE(),"MandaMsg_LungMaxTop")==1 )
         {
            wk_msg1 = "ATTENZIONE!"
            wk_msg2 = ""
            if( VAR_VAL_STR(ATTUALE(),"ORD_COD")!="" )
            {
               wk_msg2 = STRCAT("\n",ORD_COD," - ",ORD_DES)
            }
            wk_msg3 = STRCAT("\nMassima lunghezza consentita: ",STR(LungMaxTop), "mm.")
            wk_msg4 = "\n\nIl top verrà steso della lunghezza massima possibile."

            DISPLAY2(STRCAT(wk_msg1,wk_msg2,wk_msg3,wk_msg4))

            MandaMsg_LungMaxTop = 1
         }

         OnNotifica_Top = 1

         // LP 19/04/2021 - alla prima notifica (quando ho le misure corrette, chiedo
         GOSUB SetTopSteelPenisola

         //spengo grafica .
         COMANDO("show abilita off")

         steso = 1
         wk_str_cmd = "steso=1"
         if( VAR_VAL(ATTUALE(),"wk_top_stendi_isola")==1 )
         {
            wk_str_cmd = STRCAT(wk_str_cmd," FLAG_TopIsola=1")
         }
         wk_str_cmd = STRCAT(wk_str_cmd," X=",STR(X))
         wk_str_cmd = STRCAT(wk_str_cmd," Z=",STR(Z))

         COMANDO(STRCAT("VAR_CHANGE 1 ",STR(idx_att)," ",wk_str_cmd))

         COMANDO(STRCAT("SETTA ", STR(idx_att)," //notifica top"))

         wk_offx = 0
         wk_offy = 0
         wk_offz = SpostaProfondita

         if( NOME(ATTUALE())=="SottoTop_2P0" ) { wk_offy = (-1)*Y }

         wk_cnt = STRCAT("CNT S + 0,A - 0,R + 0, ",STR(wk_offx)," ",STR(wk_offy)," ",STR(wk_offz)," 0.0")

         if( NOME(idx_rif_steso_sx)=="ScoccaT_BaseAngPan" )
         {
            if( VAR_VAL(idx_rif_steso_sx,"Verso")<0 )
            {
               wk_offx = (-1)*VAR_VAL(idx_rif_steso_sx,"Xt")
               wk_cnt = STRCAT("CNT D - 0,A - 0,R + 0, ",STR(wk_offx)," ",STR(wk_offy)," ",STR(wk_offz)," 0.0")
            }
         }
         if( NOME(idx_rif_steso_sx)=="ScoccaT_BaseAngoloIsola" )
         {
            wk_offx = (-1)*VAR_VAL(idx_rif_steso_sx,"X")
            if( VAR_VAL(idx_rif_steso_sx,"Verso")>0 ) { wk_offx = (-1)*VAR_VAL(idx_rif_steso_sx,"Z") }

            wk_cnt = STRCAT("CNT D - 0,A - 0,R + 0, ",STR(wk_offx)," ",STR(wk_offy)," ",STR(wk_offz)," 0.0")
         }

         //Luca 22/05/2020
         if( NOME(idx_rif_steso_sx)=="ScoccaT_AngoloCieco" )
         {
            wk_offx = (-1)*VAR_VAL(idx_rif_steso_sx,"X")
            wk_cnt = STRCAT("CNT D - 0,A - 0,R + 0, ",STR(wk_offx)," ",STR(wk_offy)," ",STR(wk_offz)," 0.0")
         }

         //Luca 13/12/2019
         if( NOME(idx_rif_steso_sx)=="ScoccaT_BaseTamponamento" )
         {
            wk_filo_fr = "F"
            wk_offz = -24

            SET_#(idx_rif_steso_sx)
            if( IS_IDX(#idx_dx) )
            {
               if( ABS( ANG_TOT2(idx_rif_steso_sx) - ANG_TOT2(#idx_dx) ) < 0.1
                 & IS_MATCH(NOME(#idx_dx),"ScoccaT_Bas*") == 1 )
               {
                  wk_offx = (-1)*VAR_VAL(idx_rif_steso_sx,"X")
                  idx_rif_steso_sx = #idx_dx
                  wk_filo_fr = "R"
                  wk_offz = 0

               }
            }

            wk_cnt  = STRCAT("CNT S + 0,A - 0,",wk_filo_fr," + 0, ",STR(wk_offx)," ",STR(wk_offy)," ",STR(wk_offz)," 0.0")
         }

         COMANDO(wk_cnt)
         COMANDO(STRCAT("POS2LINK ",STR(ATTUALE()), " ", STR(idx_rif_steso_sx), " //Notifica ",NOME(ATTUALE())))

         //Ricalcolo top stesso
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_att)," no_agganciate //Notifica Top"))

         //COMANDO(STRCAT("VAR_CHANGE 0 ",STR(idx_att)," OnNotifica_Top=0"))
         COMANDO("show abilita on")

         //Ricalcolo top vicini
         if( IS_IDX(idx_topvic_sx)==1 ) { COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_topvic_sx)," no_agganciati //Notifica TOP")) }
         if( IS_IDX(idx_topvic_dx)==1 ) { COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_topvic_dx)," no_agganciati //Notifica TOP")) }

         //Ricalcolo basi sottostanti
         BOX_MODE(0)
         NEAR( "wk_basi_dn", idx_near_dn, 1, 0, "ScoccaT_B*")
         wk_base_num = 1
         while( wk_base_num <= wk_basi_dn )
         {
            COMANDO( STRCAT( "RICALCOLA_UNA ",STR(wk_basi_dn[wk_base_num])," no_agganciate //Notifica Top"))

            wk_base_num = wk_base_num + 1
         }

         COMANDO(STRCAT("Procedura CtrlStatici ",STR(idx_att),"  // notifica Top"))

         //scasso il top inserito
         //COMANDO(STRCAT("Procedura M4_Scassi ",STR(idx_att)," // notifica Top"))

         WAIT_Scassi = 0
      }
   }

   PROCEDURA CtrlStatici_Top_2P0
   {
      ScriviSuLog(0,"CtrlStatici_Top_2P0",STR(ATTUALE()))

      GOSUB Top_stendi_2P0

      GOSUB Trova_idx_basi_sotto

      GOSUB Trova_TopVic_SXDX

      GOSUB Trova_PenisioleAppoggio

      //COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 CtrlStatici_Top_2P0 -- idx_att=",STR(ATTUALE()) , " ACTION()=",STR(ACTION()) , " $OnLoadOrder=",STR($OnLoadOrder)))
      //COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 idx_rif_steso_sx: ",STR(idx_rif_steso_sx), " idx_rif_steso_dx=",STR(idx_rif_steso_dx)))
      //COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 idx_rif_steso_iso_sx: ",STR(idx_rif_steso_iso_sx), " idx_rif_steso_iso_dx=",STR(idx_rif_steso_iso_dx)))
      //COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 idx_topvic_sx: ",STR(idx_topvic_sx), " idx_topvic_dx=",STR(idx_topvic_dx)))
      //COMANDO2(STRCAT("LOGMSG Sub_Stendi_2P0 idx_penisola: ",STR(idx_penisola)))

      GOSUB Setta_Sbordi_Top_2P0

      GOSUB Setta_Sbordi_SottoTop_2P0

      GOSUB Setta_Dimensioni_SottoTop_2P0

      if ( ACTION() == 1064 | ACTION() <=0 | $OnLoadOrder==1 | $OnLoadOrder2==1 ) { EXITSUB() }

      COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE()), " no_agganciati //CtrlStatici_Top_2P0"))
   }

   PROCEDURA Setta_Sbordi_Top_2P0
   {
      if( TOP_UTENTE == 1)                   { EXITSUB() }
      if( $OnLoadOrder == 1)                 { EXITSUB() }
      if( ACTION() == 1064 | ACTION() < 0)   { EXITSUB() }
      if( NOME(ATTUALE()) == "SottoTop_2P0") { EXITSUB() }

      ConFiancoFin_Sx = 0
      ConFiancoFin_Dx = 0

      ConFusion_Sx = 0
      ConFusion_Dx = 0

      if( IS_IDX(idx_rif_steso_sx) == 0
        & IS_IDX(idx_rif_steso_dx) == 0)     { EXITSUB() }

      // 0 - Analisi
      wk_basi = SE_NUM( idx_rif_steso_sx != idx_rif_steso_dx, 2, 1)

      // 1 - Sbordo retro
      Sbrd_RT = -1

      //TOP UNICO
      if( TopUnico==1 ) { Sbrd_RT = 0 }

      if( IS_IDX(idx_rif_steso_iso_sx) | IS_IDX(idx_rif_steso_iso_dx) )
      {
         Sbrd_RT = 25

         //verifico presenza ww
         wk_con_ww_rt = 0
         if( IS_IDX(idx_rif_steso_iso_dx) ) { wk_con_ww_rt = Ctrl_presenza_WildWood(idx_rif_steso_iso_dx) }
         else                               { wk_con_ww_rt = Ctrl_presenza_WildWood(idx_rif_steso_iso_sx) }

         Sbrd_RT = Sbrd_RT + wk_con_ww_rt

         if( Cucina_Versione > 2) { Sbrd_RT = 27 }
      }

      // 2 - Sbordo frontale
      //default 25, se presente almeno un frontale wildwood va aumentato di 1 mm
      Sbrd_FR  = 25

      wk_con_ww  = Ctrl_presenza_WildWood(idx_rif_steso_sx)
      wk_con_nob = Ctrl_presenza_Nob_Lac(idx_rif_steso_sx)

      Sbrd_FR = Sbrd_FR + wk_con_ww - 2*wk_con_nob
      if( Cucina_Versione > 2) { Sbrd_FR = 27 }

      // 3 - Sbordo sinistro
      if( VAR_EXIST(idx_rif_steso_sx,"idx_sx"))
      {
         Sbrd_SX = 0

         SET_#(idx_rif_steso_sx)

         //oppure non allineato sopra
         //wk_diffy_sx = VAR_VAL(idx_rif_steso_sx,"alto0y_abs") - VAR_VAL(#idx_sx,"alto_3.y")
         //if( IS_IDX(#idx_sx)==0 | wk_diffy_sx>5 )
         //Luca 19/12/2019
         //verifico se terminale di dx (niente a dx oppure elemento con angolo diverso)
         wk_term_sx = 0
         if( IS_IDX(#idx_sx)==0 ) { wk_term_sx = 1 }
         else
         {
            if( NOME(idx_rif_steso_sx)=="ScoccaT_BaseAngPan" )
            {
               if( ABS(ANG_TOT(idx_rif_steso_sx)-ANG_TOT2(#idx_sx))>0.1 ) { wk_term_sx = 1 }
            }
         }

         //Luca 22/05/2020 sempre a muro
         if( NOME(idx_rif_steso_sx)=="ScoccaT_AngoloCieco" )
         {
            Sbrd_SX = -1
            wk_term_sx = 0
         }

         //Luca 26/06/2020 mantis 22828: Tamponamenti basi: modifica sbordo top
         if( NOME(idx_rif_steso_sx)=="ScoccaT_BaseTamponamento" )
         {
            Sbrd_SX = 0
            wk_term_sx = 0
         }

         //if( IS_IDX(#idx_sx)==0 )
         if( wk_term_sx==1 )
         {
            Sbrd_SX = 2
            if( wk_basi == 1
              & Cucina_Versione <= 2) { Sbrd_SX = 1 }

            //verifico se a muro
            wk_dist = QUERY_WALL(idx_rif_steso_sx,"distance from face S")
            if( wk_dist==0 )
            {
               Sbrd_SX = 0
               //Luca 03/07/2020 mantis 21232: Top basi cucina 2.0: nessuna sporgenza se base affiancata a muro
               //if( TopUnico==0 ) { Sbrd_SX = -1 }
               if( TopUnico==0 ) { Sbrd_SX = 0 }
            }
         }

         //Sbrd_SX = Sbrd_SX + 4*VAR_VAL(idx_rif_steso_sx,"ConFiancoFinSx")
         if( VAR_VAL(idx_rif_steso_sx,"ConFiancoFinSx")==1 )
         {
            //ConFiancoFin_Sx = 1
            //verifico che sia un fianco superiore
            SET_#(idx_rif_steso_sx)
            if( IS_IDX(#idx_fiaf_sx) )
            {
               //if( ABS(#alto_0.y - VAR_VAL(idx_rif_steso_sx,"alto_0.y"))<20 )
               if( ABS(#alto_0.y - VAR_VAL(#idx_fiaf_sx,"alto_0.y"))<20 ) { ConFiancoFin_Sx = 1 }
            }
         }
         else
         {
            if( IS_IDX(idx_rif_steso_iso_sx) )
            {
               if( VAR_VAL(idx_rif_steso_iso_sx,"ConFiancoFinDx")==1 ) { ConFiancoFin_Sx = 1 }
            }
         }
         Sbrd_SX = Sbrd_SX + 4*ConFiancoFin_Sx

         //Luca 06/12/2019
         if( NOME(idx_rif_steso_sx)=="ScoccaT_BaseAngoloIsola" )
         {
            Sbrd_SX = 1
            //verifico se a muro
            wk_dist = QUERY_WALL(idx_rif_steso_sx,"distance from face R")
            if( wk_dist==0 ) { Sbrd_SX = 0 }

            //verifico elemento di sx
            if( VAR_VAL(idx_rif_steso_sx,"Verso")<0 )
            {
               SET_#(idx_rif_steso_sx)
               if( IS_IDX(#idx_sx) )
               {
                  if( VAR_VAL(#idx_sx,"ConBifacciale")==1 ) { Sbrd_SX = 25 }
               }
            }
            else
            {
               if( VAR_VAL(idx_rif_steso_sx,"ConFiancoFinDx")==1 ) { Sbrd_SX = 5 }
            }

            //Luca 10/06/2020 TOP STESO SOLO SU BASE ANGOLO ISOLA
            if( idx_rif_steso_sx==idx_rif_steso_dx )
            {
               if( VAR_VAL(idx_rif_steso_sx,"Verso")<0 ) { Sbrd_SX = 25 }
               else                                      { Sbrd_RT = 25 }
            }

            if( IS_IDX(idx_rif_steso_dx)==0 )
            {
               if( VAR_VAL(idx_rif_steso_sx,"Verso")>0 ) { Sbrd_RT = 25 }
            }
         }

         if( VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX")==1 )
         {
            Sbrd_SX = -6

            if( #FSN_offy_SX + #FSN_alte_SX < #Y
              & NOME(idx_rif_steso_sx) == "ScoccaT_BaseLvst") { Sbrd_SX = 2 }
         }

         if( VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX")==2 )
         {
            //Sbrd_SX = 4
            Sbrd_SX = 6
            ConFusion_Sx = 1
         }

         if( VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX")==3 )
         {
            Sbrd_SX = 6
            ConFusion_Sx = 1
         }

         if( VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX")==4 )
         {
            Sbrd_SX = -6
            ConFusion_Sx = 1
         }

         idx_test_base_vicina_sx = -1
         if( VAR_EXIST(idx_rif_steso_sx,"idx_alto_sx") ) { idx_test_base_vicina_sx = VAR_VAL(idx_rif_steso_sx,"idx_alto_sx") }
         else                                            { idx_test_base_vicina_sx = VAR_VAL(idx_rif_steso_sx,"idx_sx") }

         if( IS_IDX(idx_test_base_vicina_sx) )
         {
            if( VAR_VAL(idx_test_base_vicina_sx,"FSN_flag_DX") == 4
              | VAR_VAL(idx_test_base_vicina_sx,"FSN_flag_DX") == 3
              | VAR_VAL(idx_test_base_vicina_sx,"FSN_flag_DX") == 1  )
            {
               Sbrd_SX = 6
               ConFusion_Sx = 1
            }

            if( VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX") == 3
              & NOME(idx_test_base_vicina_sx) == "ScoccaT_BaseLvst")
            {
               Sbrd_SX = -6
            }
         }
      }

      // 4 - Sbordo destro
      if( VAR_EXIST(idx_rif_steso_dx,"idx_dx"))
      {
         //verifico che alto_0.y di attuale non sia maggiore di alto_0.y
         Sbrd_DX = 0

         SET_#(idx_rif_steso_dx)

         //oppure non allineato sopra
         //wk_diffy_dx = VAR_VAL(idx_rif_steso_dx,"alto0y_abs") - VAR_VAL(#idx_dx,"alto_0.y")
         //if( IS_IDX(#idx_dx)==0 | wk_diffy_dx>5 )

         //Luca 19/12/2019
         //verifico se terminale di dx (niente a dx oppure elemento con angolo diverso)
         wk_term_dx = 0
         if( IS_IDX(#idx_dx)==0 ) { wk_term_dx = 1 }
         else
         {
            if( NOME(idx_rif_steso_dx)=="ScoccaT_BaseAngPan" )
            {
               if( ABS(ANG_TOT(idx_rif_steso_dx)-ANG_TOT2(#idx_dx))>0.1 ) { wk_term_dx = 1 }
            }
         }

         //Luca 26/06/2020 mantis 22828: Tamponamenti basi: modifica sbordo top
         if( NOME(idx_rif_steso_dx)=="ScoccaT_BaseTamponamento" )
         {
            Sbrd_DX = 0
            wk_term_dx = 0
         }

         if( wk_term_dx == 1)
         {
            Sbrd_DX = 2
            if( wk_basi==1
              & Cucina_Versione <= 2) { Sbrd_DX = 1 }

            //verifico se a muro
            wk_dist = QUERY_WALL(idx_rif_steso_dx,"distance from face D")
            if( wk_dist==0 )
            {
               Sbrd_DX = 0
               //Luca 03/07/2020 mantis 21232: Top basi cucina 2.0: nessuna sporgenza se base affiancata a muro
               //if( TopUnico==0 ) { Sbrd_DX = -1 }
               if( TopUnico==0 ) { Sbrd_DX = 0 }
            }
         }

         SET_#(idx_rif_steso_dx)
         wk_diff_y = VAR_VAL(ATTUALE(),"alto0y_abs") - #alto_3.y
         if( wk_diff_y < 5)
         {
            Sbrd_DX = 0

            SET_#(idx_rif_steso_dx)
            if( IS_IDX(#idx_dx)==0 )
            {
               Sbrd_DX = 2
               if( wk_basi==1 ) { Sbrd_DX = 1 }
            }
         }

         //Sbrd_DX = Sbrd_DX + 4*VAR_VAL(idx_rif_steso_dx,"ConFiancoFinDx")
         if( VAR_VAL(idx_rif_steso_dx,"ConFiancoFinDx")==1 )
         {
            //ConFiancoFin_Dx = 1
            //verifico che sia un fianco superiore
            SET_#(idx_rif_steso_dx)
            if( IS_IDX(#idx_fiaf_dx) )
            {
               if( ABS(#alto_0.y - VAR_VAL(#idx_fiaf_dx,"alto_0.y"))<20 ) { ConFiancoFin_Dx = 1 }
            }
         }
         else
         {
            if( IS_IDX(idx_rif_steso_iso_dx) )
            {
               if( VAR_VAL(idx_rif_steso_iso_dx,"ConFiancoFinSx")==1 )  { ConFiancoFin_Dx = 1 }
            }
         }

         Sbrd_DX = Sbrd_DX + 4*ConFiancoFin_Dx

         //Luca 06/12/2019
         if( NOME(idx_rif_steso_dx)=="ScoccaT_BaseAngoloIsola" )
         {
            Sbrd_DX = 1
            //verifico se a muro
            wk_dist = QUERY_WALL(idx_rif_steso_dx,"distance from face R")
            if( wk_dist==0 ) { Sbrd_DX = 0 }

            //verifico elemento di sx
            SET_#(idx_rif_steso_dx)
            if( IS_IDX(#idx_dx) )
            {
               if( VAR_VAL(#idx_dx,"ConBifacciale")==1 ) { Sbrd_DX = 25 }
            }
         }

         //Luca 22/05/2020
         if( NOME(idx_rif_steso_dx)=="ScoccaT_AngoloCieco"   ) { Sbrd_FR = 25 }

         if( VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX")==1 )
         {
            Sbrd_DX = -6

            if( #FSN_offy_DX + #FSN_alte_DX < #Y
              & NOME(idx_rif_steso_dx) == "ScoccaT_BaseLvst") { Sbrd_DX = 2  }
         }

         if( VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX")==2 )
         {
            Sbrd_DX = 4
            ConFusion_Dx = 1
         }

         if( VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX")==3 )
         {
            Sbrd_DX = 6
            ConFusion_Dx = 1
         }

         //Luca 02/12/2019
         if( VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX")==4 )
         {
            Sbrd_DX = -6
            ConFusion_Dx = 1
         }

         idx_test_base_vicina_dx = -1
         if( VAR_EXIST(idx_rif_steso_dx,"idx_alto_dx") ) { idx_test_base_vicina_dx = VAR_VAL(idx_rif_steso_dx,"idx_alto_dx") }
         else                                            { idx_test_base_vicina_dx = VAR_VAL(idx_rif_steso_dx,"idx_dx") }

         if( IS_IDX(idx_test_base_vicina_dx) )
         {
            if( VAR_VAL(idx_test_base_vicina_dx,"FSN_flag_SX") == 4
              //Luca 18/09/2020
              | VAR_VAL(idx_test_base_vicina_dx,"FSN_flag_SX") == 3
              | VAR_VAL(idx_test_base_vicina_dx,"FSN_flag_SX") == 1  )
            {
               Sbrd_DX = 6
               ConFusion_Dx = 1
            }

            if( VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX") == 3
              & NOME(idx_test_base_vicina_dx) == "ScoccaT_BaseLvst")
            {
               Sbrd_DX = -6
            }
         }
      }

      //Luca 26/02/2019
      //{ bordi in caso di angolo
      if( IS_IDX(idx_rif_steso_sx) )
      {
         if( NOME(idx_rif_steso_sx)=="ScoccaT_BaseAngPan"
           & VAR_VAL(idx_rif_steso_sx,"Verso")<0
           & idx_rif_steso_sx!=idx_rif_steso_dx )
         {
            //Luca 24/02/2022
            //no per fenix e laminato
            if( IS_MATCH( VAR_TipoTopStr, "FENIX*") != 1
              & IS_MATCH( VAR_TipoTopStr, "LAMINATO*") != 1 )
            {
               Sbrd_SX    = -1
            }

            //Luca 24/02/2022
            if( IS_IDX(idx_topvic_sx) )
            {
               if( IsIdx(idx_topvic_sx,"idx_rif_steso_dx") == 0 )
               {
                  Sbrd_SX = -1*VAR_VAL(idx_topang_sx,"Zt")
               }
            }
         }
      }

      if( VAR_EXIST(idx_rif_steso_sx,"idx_sx") )
      {
         SET_#(idx_rif_steso_sx)
         if( IS_IDX(#idx_sx) )
         {
            if( NOME(#idx_sx)=="ScoccaT_BaseAngPan" )
            {
               //Luca 23/10/2019
               //if( ABS(ANG_TOT2(idx_rif_steso_sx)-ANG_TOT2(#idx_sx))>0.1 ) { Sbrd_SX = 6 }
               if( ABS(ANG_TOT2(idx_rif_steso_sx)-ANG_TOT2(#idx_sx))>0.1 )
               {
                  Sbrd_SX = 7

                  //LZ 15/12/2021
                  if( VAR_EXIST( ATTUALE(), "idx_topvic_sx")
                    & IS_IDX( VAR_VAL( ATTUALE(), "idx_topvic_sx")))
                  {
                     Sbrd_SX = $Cuc_ZMontante - VAR_VAL( idx_topvic_sx, "Sbrd_FR")
                  }
               }
            }

            if( NOME(#idx_sx)=="ScoccaT_AngoloCieco"
              | NOME(#idx_sx)=="ScoccaT_BaseAngoloIsola")
            {
               Sbrd_SX = SE_NUM( Cucina_Versione >= 2.5, 5, 7)
            }

            //Luca 03/12/2019
            if( NOME(#idx_sx)=="ScoccaT_ColAngPan" )
            {
               if( ABS(ANG_TOT2(idx_rif_steso_sx)-ANG_TOT2(#idx_sx))>0.1 ) { Sbrd_SX = 31 }
            }
         }
      }

      if( IS_IDX(idx_rif_steso_dx) )
      {
         if( NOME(idx_rif_steso_dx)=="ScoccaT_BaseAngPan"
           & VAR_VAL(idx_rif_steso_dx,"Verso")<0
           & idx_rif_steso_dx!=idx_rif_steso_sx )
         {
            //Luca 24/02/2022
            //no per fenix e laminato
            //Sbrd_DX = -1

            if( IS_MATCH( VAR_TipoTopStr, "FENIX*") != 1
              & IS_MATCH( VAR_TipoTopStr, "LAMINATO*") != 1 ) { Sbrd_DX = -1 }

            //Luca 24/02/2022
            if( IS_IDX(idx_topvic_dx) )
            {
               if( IsIdx(idx_topvic_dx,"idx_rif_steso_sx") == 0 )
               {
                  Sbrd_DX = -1*VAR_VAL(idx_topang_dx,"Zt")
               }
            }

         }
      }

      if( VAR_EXIST(idx_rif_steso_dx,"idx_dx") )
      {
         SET_#(idx_rif_steso_dx)
         if( IS_IDX(#idx_dx) )
         {
            if( NOME(#idx_dx)=="ScoccaT_BaseAngPan" )
            {
               //Luca 23/10/2019
               //if( ABS(ANG_TOT2(idx_rif_steso_dx)-ANG_TOT2(#idx_dx))>0.1 ) { Sbrd_DX = 6 }
               if( ABS(ANG_TOT2(idx_rif_steso_dx)-ANG_TOT2(#idx_dx))>0.1 )
               {
                  Sbrd_DX = 7

                  //LZ 15/12/2021
                  if( VAR_EXIST( ATTUALE(), "idx_topvic_dx")
                    & IS_IDX( VAR_VAL( ATTUALE(), "idx_topvic_dx")))
                  {
                     Sbrd_DX = $Cuc_ZMontante - VAR_VAL( idx_topvic_dx, "Sbrd_FR")
                  }
               }
            }

            if( NOME(#idx_dx)=="ScoccaT_AngoloCieco"
              | NOME(#idx_dx)=="ScoccaT_BaseAngoloIsola")
            {
               Sbrd_DX = SE_NUM( Cucina_Versione >= 2.5, 5, 7)
            }

            //Luca 03/12/2019
            if( NOME(#idx_dx)=="ScoccaT_ColAngPan" )
            {
               if( ABS(ANG_TOT2(idx_rif_steso_dx)-ANG_TOT2(#idx_dx))>0.1 ) { Sbrd_DX = 31 }
            }

            if( NOME(idx_rif_steso_dx)=="ScoccaT_BaseAngPan" )
            {
               if( ABS(ANG_TOT(idx_rif_steso_dx)-ANG_TOT2(#idx_dx))>0.1 ) { Sbrd_DX = 0 }
            }
         }
      }
      //} bordi in caso di angolo

      //se almeno una base è bifacciale, allungo dietro
      idx_test = idx_rif_steso_sx
      if( IS_IDX(idx_test)==0 ) { idx_test = idx_rif_steso_dx }

      wk_con_biff = 0
      vv = 1
      while( IS_IDX(idx_test) & wk_con_biff == 0 & vv < 50 )
      {
         if( VAR_VAL(idx_test,"ConBifacciale")==1 ) { wk_con_biff = 1 }

         if( VAR_EXIST(idx_test,"idx_dx") & idx_test != idx_rif_steso_dx )
         {
            SET_#(idx_test)

            if( IS_IDX(#idx_dx) )
            {
               if( ABS( ANG_TOT_NOR(idx_test) - ANG_TOT_NOR(#idx_dx) ) < 0.1 ) { idx_test = #idx_dx  }
               else
               {
                  if( NOME(idx_test)=="ScoccaT_BaseAngoloIsola" )
                  {
                     if( ABS(VAR_VAL(idx_test,"AngoloDx")-ANG_TOT2(#idx_dx))<0.1 ) { idx_test = #idx_dx  }
                     else                                                          { idx_test = -1  }
                  }
                  else  {  idx_test = -1  }
               }
            }
            else  { idx_test = -1 }
         }
         else     { idx_test = -1 }

         vv = vv + 1
      }

      if( wk_con_biff != 1
        & VAR_VAL( idx_rif_steso_dx, "ConBifacciale") == 1) { wk_con_biff = 1 }
      if( wk_con_biff) { Sbrd_RT = SE_NUM( Cucina_Versione > 2, 27, 25) }

      //Luca 28/05/2019
      //verifico la presenta di penisole in appoggio
      if( ConPenisolaApp==1 & IS_IDX(idx_penisola) )
      {
         SET_#(idx_penisola)
         wk_pos_penisola = 0

         //verifico se hanno lo stesso angolo
         //if( ABS(ANG_TOT2(ATTUALE())-ANG_TOT2(idx_penisola))<0.1 )
         //{
         //   wk_pos_penisola = VAR_VAL(idx_penisola,"VAR_PosPenisola")
         //}
         wk_pos_penisola = VAR_VAL(idx_penisola,"VAR_PosPenisola")

         wk_appoggio_penisola = VAR_VAL(idx_penisola,"VAR_Appoggio")

         if( wk_pos_penisola==-1 )
         {
            Sbrd_SX =  -wk_appoggio_penisola - 1
         }

         if( wk_pos_penisola==1  )
         {
            Sbrd_DX =  -wk_appoggio_penisola - 1
         }

         if( wk_pos_penisola==10  )
         {
            Sbrd_DX =  (-1)*( #Zt - #VAR_SbordoLat) - 1
         }

         if( wk_pos_penisola==-10  )
         {
            Sbrd_SX = (-1)*( #Zt - #VAR_SbordoLat ) - 1
         }
      }

      //Luca 15/07/2019
      //{ in caso di presenza di SNACK a L
      if( IS_IDX(idx_top_SNACK_sx) == 1) { Sbrd_SX = 0 }
      if( IS_IDX(idx_top_SNACK_dx) == 1) { Sbrd_DX = 0 }
      //} in caso di presenza di SNACK a L

      //Luca 20/04/2021
      if( VAR_TipoTopStr == "ACCIAIO_PEN_80" )
      {
         if( PosX_SteelPen == -1 ) { Sbrd_SX = 0 }
         if( PosX_SteelPen ==  1 ) { Sbrd_DX = 0 }
      }
   }

   PROCEDURA Setta_Sbordi_SottoTop_2P0
   {
      if( TOP_UTENTE == 1)                                       { EXITSUB() }
      if( ACTION() == 1064 | ACTION() <= 0 | $OnLoadOrder == 1)  { EXITSUB() }

      // 1 - Fianco sx
      while(1)
      {
         // 1.1 - Reset variabili
         Sbrd_ST_SX = -1
         Con_MasMT_SX = 0

         if( IS_IDX(idx_rif_steso_sx) == 0)               { break }

         // 1.2 - Fianco alto
         wk_fianco_alto_sx = VAR_VAL( idx_rif_steso_sx, "VAR_Fianco_Alto")
         if( NOME(idx_rif_steso_sx) != "ScoccaT_BaseAngoloIsola"
           & ( wk_fianco_alto_sx < 0 | wk_fianco_alto_sx >= 2) )
         {
            Sbrd_ST_SX = Sbrd_ST_SX - $Cuc_Spe_Fia

            break
         }

         // 1.3 - Sottotop tra basi, non servono ulteriori valutazioni
         if( VAR_VAL( ATTUALE(), "SottoTopTraBasi") == 1) { break }

         // 1.4 - Casi non esclusivi
         // 1.4.1 - Top e sottotop sono corpo unico
         if( NOME(ATTUALE()) != "SottoTop_2P0"
           & VAR_VAL( ATTUALE(), "TopUnico") == 1)
         {
            if( Sbrd_SX == 0)                              { Sbrd_ST_SX = 0  }
         }

         // 1.4.2 - Accosto con altri top
         if( IS_IDX(idx_topvic_sx))                        { Sbrd_ST_SX = 0  }

         // 1.4.3 - Fusion
         if( VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX") == 1) { Sbrd_ST_SX = -5 }

         if( VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX") == 2
           | VAR_VAL(idx_rif_steso_sx,"FSN_flag_SX") == 3) { Sbrd_ST_SX = -1 }

         // 1.4.4 - Angolo
         if( VAR_EXIST( idx_rif_steso_sx, "idx_sx") != 1)  { break }

         SET_#(idx_rif_steso_sx)
         if( IS_IDX(#idx_sx))
         {
            if( NOME(#idx_sx) == "ScoccaT_BaseAngPan")
            {
               if( ABS(ANG_TOT2(idx_rif_steso_sx) - ANG_TOT2(#idx_sx)) > 0.1)
               {
                  Sbrd_ST_SX = 30

                  if( VAR_VAL(ATTUALE(),"VAR_TipoTop") == 3
                    | VAR_VAL(ATTUALE(),"VAR_TipoTop") == 4
                    | VAR_VAL(ATTUALE(),"VAR_TipoTop") == 10
                    | VAR_VAL(ATTUALE(),"VAR_TipoTop") == 13)
                  {
                     Sbrd_ST_SX   = VAR_VAL( ATTUALE(), "Sbrd_SX")
                     Con_MasMT_SX = 1
                  }
               }
            }
            if( NOME(#idx_sx)=="ScoccaT_ColAngPan")
            {
               if( ABS(ANG_TOT2(idx_rif_steso_sx) - ANG_TOT2(#idx_sx)) > 0.1) { Sbrd_ST_SX = 31 }
            }

            if( NOME(#idx_sx) == "ScoccaT_AngoloCieco"
              | NOME(#idx_sx)=="ScoccaT_BaseAngoloIsola")                     { Sbrd_ST_SX = 30 }

            if( VAR_VAL(#idx_sx,"FSN_flag_DX") == 1)                          { Sbrd_ST_SX = -1 }
         }

         if( NOME(idx_rif_steso_sx)=="ScoccaT_BaseAngPan"
           & VAR_VAL(idx_rif_steso_sx,"Verso")<0
           & idx_rif_steso_sx!=idx_rif_steso_dx )
         {
            if( IS_IDX(idx_topvic_sx) )
            {
                if( IsIdx(idx_topvic_sx,"idx_rif_steso_dx") == 0 )
               {
                  Sbrd_ST_SX   = VAR_VAL( ATTUALE(), "Sbrd_SX")
                  Con_MasMT_SX = 1
               }
            }
         }

         break
      }

      // 2 - Fianco dx
      while(1)
      {
         // 2.1 - Reset variabili
         Sbrd_ST_DX = -1
         Con_MasMT_DX = 0

         if( IS_IDX(idx_rif_steso_dx) == 0)               { break }

         // 2.2 - Fianco alto
         wk_fianco_alto_dx = VAR_VAL( idx_rif_steso_dx, "VAR_Fianco_Alto")
         if( wk_fianco_alto_dx > 0
           & NOME(idx_rif_steso_dx) != "ScoccaT_BaseAngoloIsola" )
         {
            Sbrd_ST_DX = Sbrd_ST_DX - $Cuc_Spe_Fia

            break
         }

         // 2.3 - Sottotop tra basi, non servono ulteriori valutazioni
         if( VAR_VAL( ATTUALE(), "SottoTopTraBasi") == 1) { break }

         // 2.4 - Casi non esclusivi
         // 2.4.1 - Top e sottotop sono corpo unico
         if( NOME(ATTUALE()) != "SottoTop_2P0"
           & VAR_VAL( ATTUALE(), "TopUnico") == 1)
         {
            if( Sbrd_DX == 0)                              { Sbrd_ST_DX = 0  }
         }

         // 2.4.2 - Accosto con altri top
         if( IS_IDX(idx_topvic_dx))                        { Sbrd_ST_DX = 0  }

         // 2.4.3 - Fusion
         if( VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX") == 1) { Sbrd_ST_DX = -5 }

         if( VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX") == 2
           | VAR_VAL(idx_rif_steso_dx,"FSN_flag_DX") == 3) { Sbrd_ST_DX = -1 }

         // 2.4.5 - Angolo
         if( VAR_EXIST(idx_rif_steso_dx,"idx_dx") != 1)    { break }

         SET_#(idx_rif_steso_dx)
         if( IS_IDX(#idx_dx))
         {
            if( NOME(#idx_dx)=="ScoccaT_BaseAngPan")
            {
               if( ABS(ANG_TOT2(idx_rif_steso_dx) - ANG_TOT2(#idx_dx)) > 0.1)
               {
                  Sbrd_ST_DX = 30

                  if( VAR_VAL(ATTUALE(),"VAR_TipoTop") == 3
                    | VAR_VAL(ATTUALE(),"VAR_TipoTop") == 4
                    | VAR_VAL(ATTUALE(),"VAR_TipoTop") == 10
                    | VAR_VAL(ATTUALE(),"VAR_TipoTop") == 13)
                  {
                     Sbrd_ST_DX   = VAR_VAL( ATTUALE(), "Sbrd_DX")
                     Con_MasMT_DX = 1
                  }
               }
            }

            if( NOME(#idx_dx) == "ScoccaT_ColAngPan")
            {
               if( ABS(ANG_TOT2(idx_rif_steso_dx) - ANG_TOT2(#idx_dx)) > 0.1) { Sbrd_ST_DX = 31 }
            }

            if( NOME(#idx_dx)=="ScoccaT_AngoloCieco"
              | NOME(#idx_dx)=="ScoccaT_BaseAngoloIsola")                     { Sbrd_ST_DX = 30 }

            if( VAR_VAL(#idx_dx,"FSN_flag_SX") == 1)                          { Sbrd_ST_DX = -1 }
         }

         if( NOME(idx_rif_steso_dx) == "ScoccaT_BaseAngPan"
           & VAR_VAL(idx_rif_steso_dx,"Verso") < 0
           & idx_rif_steso_dx!=idx_rif_steso_sx)
         {
            if( IS_IDX(idx_topvic_dx))
            {
                if( IsIdx(idx_topvic_dx,"idx_rif_steso_sx") == 0)
               {
                  Sbrd_ST_DX   = VAR_VAL( ATTUALE(), "Sbrd_DX")
                  Con_MasMT_DX = 1
               }
            }
         }

         break
      }

      X_SottoTop_Tot = X + Sbrd_ST_SX + Sbrd_ST_DX
      Z_SottoTop_Tot = Z + Sbrd_ST_RT + Sbrd_ST_FR
   }

   PROCEDURA Setta_Dimensioni_SottoTop_2P0
   {
      if ( ACTION() == 1064 | ACTION() <=0 | $OnLoadOrder==1 ) { EXITSUB() }

      idx_pdr = PADRE(ATTUALE(),1)

      X_SottoTop_Tot = X + Sbrd_ST_SX + Sbrd_ST_DX
      Z_SottoTop_Tot = Z + Sbrd_ST_RT + Sbrd_ST_FR

      //Luca 02/12/2019
      if( NOME(ATTUALE())=="Top_generico_2P0" )
      {
         if( VAR_VAL(PADRE(ATTUALE(),1),"VAR_TipoTop") != 3
           & VAR_VAL(PADRE(ATTUALE(),1),"VAR_TipoTop") != 4
           & VAR_VAL(PADRE(ATTUALE(),1),"VAR_TipoTop") != 10
           & VAR_VAL(PADRE(ATTUALE(),1),"VAR_TipoTop") != 13
           //Luca 20/04/2021
           & VAR_VAL(PADRE(ATTUALE(),1),"VAR_TipoTop") !=  23 )
         {
            X_SottoTop = X_SottoTop_Tot
            Z_SottoTop = Z_SottoTop_Tot
         }

         EXITSUB()
      }

      //*savealways
      if( $OnLoadOrder2 == 1 ) { EXITSUB() }

      DividiSottoTop = 0

      aa_st2_rie_sx = 0
      aa_st2_rie_rt = 0

      Ang_SottoTop2 = 0
      X_SottoTop2   = 0
      Z_SottoTop2   = 0

      X_SottoTop = X_SottoTop_Tot
      Z_SottoTop = Z_SottoTop_Tot

      //if( VAR_VAL(ATTUALE(),"TopUnico")==1 ) { EXITSUB() }
      wk_esci_ctrl_div_sottop = 0
      if( VAR_VAL(ATTUALE(),"TopUnico")==1 )
      {
         wk_esci_ctrl_div_sottop = 1
         if( VAR_VAL(ATTUALE(),"VAR_TipoTop") == 3
           | VAR_VAL(ATTUALE(),"VAR_TipoTop") == 4
           | VAR_VAL(ATTUALE(),"VAR_TipoTop") == 10
           | VAR_VAL(ATTUALE(),"VAR_TipoTop") == 13 ) { wk_esci_ctrl_div_sottop = 0 }

         //if( NOME(ATTUALE())=="Top_generico_2P0" )
         //{
         //   if( VAR_VAL(PADRE(ATTUALE(),1),"VAR_TipoTop") == 10
         //     | VAR_VAL(PADRE(ATTUALE(),1),"VAR_TipoTop") ==  3 ) { wk_esci_ctrl_div_sottop = 0 }
         //}
      }
      if( wk_esci_ctrl_div_sottop==1  ) { EXITSUB() }


      if( X_SottoTop_Tot>2700 ) { DividiSottoTop = 1 }

      if( FLAG_TopIsola==1 & Z_SottoTop_Tot>1200 ) { DividiSottoTop = 2 }

      if( DividiSottoTop==0 ) { EXITSUB() }

      if( DividiSottoTop == 1 )
      {
         X_SottoTop_nom = X

         wk_xdiv =  X/2

         //trovo la base dove interromperlo
         //wk_idx_test = idx_rif_steso_sx
         wk_idx_test = VAR_VAL(ATTUALE(),"idx_rif_steso_sx")
         if( NOME(ATTUALE())=="Top_generico_2P0" ) { wk_idx_test = VAR_VAL(PADRE(ATTUALE(),1),"idx_rif_steso_sx") }

         wk_xp = 0
         wk_ok = 0

         while ( wk_ok==0 & IS_IDX(wk_idx_test) )
         {
            if( NOME(wk_idx_test)=="ScoccaT_BaseAngPan" )  { wk_xp  = wk_xp + VAR_VAL(wk_idx_test,"Xt") }
            else                                           { wk_xp  = wk_xp + VAR_VAL(wk_idx_test,"X")  }

            wk_xp2 = wk_xp

            wk_idx_next = -1
            if( VAR_EXIST(wk_idx_test,"idx_dx") )
            {
               SET_#(wk_idx_test)
               wk_idx_next = #idx_dx

               if( IS_IDX(wk_idx_next) )
               {
                  if( ABS(ANG_TOT2(wk_idx_test)-ANG_TOT2(wk_idx_next))>0.1 ) { wk_idx_next = -1 }
               }

               if( IS_IDX(wk_idx_next) )
               {
                  if( NOME(wk_idx_next)=="ScoccaT_BaseAngPan" )  { wk_xp2 = wk_xp + VAR_VAL(wk_idx_next,"Xt") }
                  else                                           { wk_xp2 = wk_xp + VAR_VAL(wk_idx_next,"X")  }
               }
            }

            if( wk_xp<=wk_xdiv & wk_xp2>=wk_xdiv )
            {
               wk_ok = 1

               wk_diff   = wk_xdiv - wk_xp
               wk_diff2  = wk_xp - wk_xdiv

               if( wk_diff<=wk_diff2 ) { X_SottoTop_nom = wk_xp }
               else                    { X_SottoTop_nom = wk_xp2 }
            }
            else
            {
               wk_idx_test = wk_idx_next
            }
         }


         //calcolo dimensioni corrette e sbordi
         X_SottoTop =  X_SottoTop_nom + Sbrd_ST_SX
         X_SottoTop2 = X - X_SottoTop_nom + Sbrd_ST_DX

         //Sbrd_ST2_SX = -1*(X_SottoTop_nom + 1)
         //X_SottoTop  = X_SottoTop  - 1
         //X_SottoTop2 = X_SottoTop2 - 1
         //Sbrd_ST_DX = -1

         Sbrd_ST2_SX = -1*(X_SottoTop_nom)

         X_SottoTop  = X_SottoTop
         X_SottoTop2 = X_SottoTop2

         Sbrd_ST2_DX = Sbrd_ST_DX

         Sbrd_ST_DX  = 0
         Sbrd_ST2_FR = Sbrd_ST_FR
         Sbrd_ST2_RT = Sbrd_ST_RT

         Z_SottoTop2 = Z_SottoTop
      }

      if( DividiSottoTop == 2 )
      {
         if( IS_IDX(idx_rif_steso_sx)==1
           & IS_IDX(idx_rif_steso_iso_dx)==1  )
         {
            Z_SottoTop = VAR_VAL(idx_rif_steso_sx,"Z")
            Z_SottoTop2 = VAR_VAL(idx_rif_steso_iso_dx,"Z")
         }

         X_SottoTop2 = X_SottoTop
         Sbrd_ST2_SX = Sbrd_ST_DX
      }
   }

   //Luca 05/12/2019
   //calcolo rientri per top FUSION
   PROCEDURA Ctrl_TopFusion_2P0
   {
      idx_top_fusion = -1

      if ( ACTION()<=0  | ACTION()==2  | $OnLoadOrder==1 ) { EXITSUB() }

      if( FLAG_Basi180>0 ) { EXITSUB() }

      if( IS_IDX(idx_topvic_sx)==0 & IS_IDX(idx_topvic_dx)==0 )
      {
         FLAG_TopFusion_USER = 0
         FLAG_TopFusion = 0
         EXITSUB()
      }

      wk_idx_test = -1
      if( IS_IDX(idx_topvic_sx)==1 ) { wk_idx_test = idx_topvic_sx }
      if( IS_IDX(idx_topvic_dx)==1 ) { wk_idx_test = idx_topvic_dx }

      debug = 0
   #ifdef TE
      debug = 1
   #endif

      FLAG_TopFusion_prec = VAR_VAL(ATTUALE(),"FLAG_TopFusion")

      //se angolo diversi esco subito
      //if( ABS(ANG_TOT2(ATTUALE())-ANG_TOT2(wk_idx_test))>0.1 ) { EXITSUB() }
      if( ABS(ANG_TOT_NOR(ATTUALE())-ANG_TOT_NOR(wk_idx_test))>0.1 )
      {
         if( debug==1 ) { COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 ATT=",STR(ATTUALE()), " wk_idx_test=",STR(wk_idx_test), " ESCO - ANGOLO DIVERSO")) }
         EXITSUB()
      }

      if( debug==1 ) { COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 ATT=",STR(ATTUALE()), " wk_idx_test=",STR(wk_idx_test))) }


      //Luca 05/12/2019 definisco in automatico il top fusion
      //1.1 -- verifico se c'è collisione tra i due top (potrei trovare anche top solamente affiancati)
      //ang_top_att = ANG_TOT2(ATTUALE())
      ang_top_att = ANG_TOT_NOR(ATTUALE())

      SET_#(wk_idx_test)
      wk_tv_B0 = #base_0   wk_tv_B0.y = 0
      wk_tv_B3 = #base_3   wk_tv_B3.y = 0

      wk_B0 = base_0   wk_B0.y = 0
      wk_B3 = base_3   wk_B3.y = 0

      PX1 = INTERFERISCI(wk_tv_B0,ang_top_att+90,wk_B0,wk_B3)
      PX2 = INTERFERISCI(wk_tv_B3,ang_top_att+90,wk_B0,wk_B3)

      if( debug==1 )
      {
         COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 ATTUALE: ",STR(ATTUALE()), " wk_B0=[",STR(wk_B0.x),",",STR(wk_B0.y),",",STR(wk_B0.z),"] "))
         COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 ATTUALE: ",STR(ATTUALE()), " wk_B3=[",STR(wk_B3.x),",",STR(wk_B3.y),",",STR(wk_B3.z),"] "))

         COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 ATTUALE: ",STR(ATTUALE()), " wk_tv_B0=[",STR(wk_tv_B0.x),",",STR(wk_tv_B0.y),",",STR(wk_tv_B0.z),"] "))
         COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 ATTUALE: ",STR(ATTUALE()), " wk_tv_B3=[",STR(wk_tv_B3.x),",",STR(wk_tv_B3.y),",",STR(wk_tv_B3.z),"] "))

         COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 ATTUALE: ",STR(ATTUALE()), " PX1=[",STR(PX1.x),",",STR(PX1.y),",",STR(PX1.z),"] "))
         COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 ATTUALE: ",STR(ATTUALE()), " PX2=[",STR(PX2.x),",",STR(PX2.y),",",STR(PX2.z),"] "))
      }

      wk_continua = 0

      if(PX1.x!=$ERR_INTER & PX1.y!=$ERR_INTER & PX1.z!=$ERR_INTER)
      {
         //wk_continua = 1
         wk_dist_A = DISTANZA(PX1,wk_B0)
         wk_dist_B = DISTANZA(PX1,wk_B3)

         if( debug==1 )
         {
            COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 ATTUALE: ",STR(ATTUALE()), " wk_dist_A=",STR(wk_dist_A),"   -- wk_dist_B=",STR(wk_dist_B)))
         }

         if( ABS(DISTANZA(PX1,wk_B0))>0.1
           & ABS(DISTANZA(PX1,wk_B3))>0.1 ) { wk_continua = 1 }
      }
      if(PX2.x!=$ERR_INTER & PX2.y!=$ERR_INTER & PX2.z!=$ERR_INTER)
      {
         //wk_continua = 1

         wk_dist_A = DISTANZA(PX2,wk_B0)
         wk_dist_B = DISTANZA(PX2,wk_B3)

         if( debug==1 )
         {
            COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 ATTUALE: ",STR(ATTUALE()), " wk_dist_A=",STR(wk_dist_A),"   -- wk_dist_B=",STR(wk_dist_B)))
         }

         if( ABS(DISTANZA(PX2,wk_B3))>0.1
           & ABS(DISTANZA(PX2,wk_B0))>0.1 ) { wk_continua = 1 }
      }

      if( debug==1 ) { COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 ATT=",STR(ATTUALE()), " wk_idx_test=",STR(wk_idx_test), " wk_continua=",STR(wk_continua)," INTERFERENZE")) }

      //CONTROLLO COMPATIBILITA' TRA TOP
      if( wk_continua==1 )
      {
         FLAG_FUSION_COMPATIBILE = 1

         //VETRO - XGLASS
         if( VAR_TipoTop==0 | VAR_TipoTop==1
           | VAR_TipoTop==6 | VAR_TipoTop==7 )
         {
            //LAMINATO - FENIX - ACCIAIO - MADETERRANEO - CLIENTE
            if( VAR_VAL(wk_idx_test,"VAR_TipoTop")==10
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==13
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==3
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==4
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==11
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==21
//              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==23
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==20
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==99 ) { FLAG_FUSION_COMPATIBILE = 0 }
         }
         //LAMINATO
         if( VAR_TipoTop==10
           | VAR_TipoTop==13 )
         {
            //QUARZO - CLIENTE
            if( VAR_VAL(wk_idx_test,"VAR_TipoTop")==2
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==99 ) { FLAG_FUSION_COMPATIBILE = 0 }
         }
         //FENIX
         if( VAR_TipoTop==3
           | VAR_TipoTop==4 )
         {
            //QUARZO - CLIENTE
            if( VAR_VAL(wk_idx_test,"VAR_TipoTop")==2
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==99 ) { FLAG_FUSION_COMPATIBILE = 0 }
         }
         //QUARZO
         if( VAR_TipoTop==2 )
         {
            //VETRO - MADETERRANEO - ACCIAIO - LAMINATO - FENIX - CLIENTE
            if( VAR_VAL(wk_idx_test,"VAR_TipoTop")==0
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==1
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==6
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==7
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==20
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==11
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==21
//              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==23
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==10
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==13
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==2
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==3
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==4
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==99 ) { FLAG_FUSION_COMPATIBILE = 0 }
         }
         //ACCIAIO
         // if( VAR_TipoTop==11 | VAR_TipoTop==21 )
         if( VAR_TipoTop==11 | VAR_TipoTop==21 | VAR_TipoTop==23 )
         {
            //QUARZO - MADETERRANEO - ACCIAIO - LAMINATO - FENIX - CLIENTE
            if( VAR_VAL(wk_idx_test,"VAR_TipoTop")==2
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==20
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==11
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==21
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==23
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==10
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==13
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==3
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==4
              | VAR_VAL(wk_idx_test,"VAR_TipoTop")==99 ) { FLAG_FUSION_COMPATIBILE = 0 }
         }

         wk_continua = FLAG_FUSION_COMPATIBILE
      }

      if( debug==1 ) { COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 ATT=",STR(ATTUALE()), " wk_idx_test=",STR(wk_idx_test), " wk_continua=",STR(wk_continua)," FLAG_FUSION_COMPATIBILE")) }

      //Luca 30/06/2021 recupere eventuali info del top fusion sagomato
      FLAG_TopFusion2 = 1
      if( VAR_VAL(wk_idx_test,"FLAG_TopFusion") == 2 )
      {
         FLAG_TopFusion2 = 1
         idx_top_fusion = wk_idx_test
         FSN_NearPos    = VAR_VAL(idx_top_fusion,"FSN_ScsPos")
      }

      if( wk_continua==0 )
      {
         FLAG_TopFusion_USER = 0
         FLAG_TopFusion = 0
         EXITSUB()
      }

      //1.2 verifico se sono il top maggiore
      if( Zt > VAR_VAL(wk_idx_test,"Zt") ) { FLAG_TopFusion = 2 }

      if( debug==1 ) { COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 ATT=",STR(ATTUALE()), " Zt=",STR(Zt), " TEST[",STR(wk_idx_test),"] Zt=",STR(VAR_VAL(wk_idx_test,"Zt")))) }

      if( Zt == VAR_VAL(wk_idx_test,"Zt") )
      {
         if( $CNP != 1
           & $OnLoadOrder2 == 0
           & FLAG_TopFusion_USER != 1
           & VAR_VAL(wk_idx_test,"FLAG_TopFusion_USER") != 1 )
         {
            HI(ATTUALE(),1)
            wk_msg = STRCAT(MSG(1100),"\n",MSG(1101))
            r = DISPLAY3(wk_msg,$MB_YESNO+$MB_ICONQUESTION)
            HI(ATTUALE(),0)

            if( $MB_ID_YES==r )
            {
               FLAG_TopFusion_USER = 1
            }
            else
            {
               VAR_VALUE_SET(wk_idx_test,"FLAG_TopFusion_USER",1)
            }
         }

         if( FLAG_TopFusion_USER==1 ) { FLAG_TopFusion = 2 }
      }

      if( debug==1 ) { COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 ATT=",STR(ATTUALE()), " wk_idx_test=",STR(wk_idx_test), " FLAG_TopFusion=",STR(FLAG_TopFusion)," definisco TIPO TOP FUSION")) }

      if( IS_IDX(wk_idx_test)==0 ) { EXITSUB() }

      if( FLAG_TopFusion!=2 ) { EXITSUB() }

      //desto i punti dei top per definire se posizione e dimensione scasso
      TF2_0 = base_0    TF2_0.y = 0
      TF2_1 = base_1    TF2_1.y = 0
      TF2_2 = base_2    TF2_2.y = 0
      TF2_3 = base_3    TF2_3.y = 0

      //TF2_ang = ANG_TOT2(ATTUALE())
      TF2_ang = ANG_TOT_NOR(ATTUALE())

      //top fusion minore, lineare
      SET_#(wk_idx_test)
      TF1_0 = #base_0    TF1_0.y = 0
      TF1_1 = #base_1    TF1_1.y = 0
      TF1_2 = #base_2    TF1_2.y = 0
      TF1_3 = #base_3    TF1_3.y = 0

      //proietto base_0 del top lineare tra base_0/base_3 top maggiore
      PX_1 = INTERFERISCI(TF1_0,TF2_ang+90,TF2_0,TF2_3)

      //proietto base_3 del top lineare tra base_0/base_3 top maggiore
      PX_2 = INTERFERISCI(TF1_3,TF2_ang+90,TF2_0,TF2_3)

      //proietto base_0 del top lineare tra base_0/base_1 top maggiore
      PX_3 = INTERFERISCI(TF1_0,TF2_ang,TF2_0,TF2_1)

      //proietto base_0 del top lineare tra base_1/base_2 top maggiore
      PX_4 = INTERFERISCI(TF1_1,TF2_ang,TF2_0,TF2_1)

      wk_pos_par2 = ""
      if(PX_1.x!=$ERR_INTER & PX_1.y!=$ERR_INTER & PX_1.z!=$ERR_INTER) { wk_pos_par2 = "D" }
      if(PX_2.x!=$ERR_INTER & PX_2.y!=$ERR_INTER & PX_2.z!=$ERR_INTER) { wk_pos_par2 = "S" }

      if(PX_1.x!=$ERR_INTER & PX_1.y!=$ERR_INTER & PX_1.z!=$ERR_INTER
       & PX_2.x!=$ERR_INTER & PX_2.y!=$ERR_INTER & PX_2.z!=$ERR_INTER)
      {
         wk_pos_par2 = "S"
         if( DISTANZA(PX_1,TF2_0)>DISTANZA(PX_2,TF2_3) ) { wk_pos_par1 = "D" }
      }

      wk_pos_par1 = ""
      if(PX_3.x!=$ERR_INTER & PX_3.y!=$ERR_INTER & PX_3.z!=$ERR_INTER) { wk_pos_par1 = "R" }
      if(PX_4.x!=$ERR_INTER & PX_4.y!=$ERR_INTER & PX_4.z!=$ERR_INTER) { wk_pos_par1 = "F" }

      if(PX_3.x!=$ERR_INTER & PX_3.y!=$ERR_INTER & PX_3.z!=$ERR_INTER
       & PX_4.x==$ERR_INTER & PX_4.y==$ERR_INTER & PX_4.z==$ERR_INTER) { wk_pos_par1 = "F" }

      if(PX_3.x==$ERR_INTER & PX_3.y==$ERR_INTER & PX_3.z==$ERR_INTER
       & PX_4.x!=$ERR_INTER & PX_4.y!=$ERR_INTER & PX_4.z!=$ERR_INTER) { wk_pos_par1 = "R" }

      if(PX_3.x!=$ERR_INTER & PX_3.y!=$ERR_INTER & PX_3.z!=$ERR_INTER
       & PX_4.x!=$ERR_INTER & PX_4.y!=$ERR_INTER & PX_4.z!=$ERR_INTER)
      {
         wk_pos_par1 = "R"
         //if( DISTANZA(PX_3,TF2_0)>DISTANZA(PX_4,TF2_0) ) { wk_pos_par1 = "F" }
         if( DISTANZA(PX_4,TF2_1)<DISTANZA(PX_3,TF2_0) ) { wk_pos_par1 = "F" }
      }

      FSN_ScsPos = STRCAT(wk_pos_par1,wk_pos_par2)

      //se non ho trovato una posizione valida --> esco
      if( FSN_ScsPos!="RS" & FSN_ScsPos!="RD"
       &  FSN_ScsPos!="FS" & FSN_ScsPos!="FD"  ) { EXITSUB() }


      if( RIGHT(FSN_ScsPos,1)=="D" ) { FSN_ScsX = DistanzaFraPunti(TF1_0,TF2_3,TF2_ang) + Sbrd_DX + #Sbrd_SX  }
      else                           { FSN_ScsX = DistanzaFraPunti(TF1_3,TF2_0,TF2_ang) + Sbrd_SX + #Sbrd_DX  }

      FSN_Scs_ST_X = FSN_ScsX

      //Luca 30/11/2021 top wildwood
      if( VAR_TipoTop == 12 | VAR_TipoTop == 22  )
      {
         if( RIGHT(FSN_ScsPos,1)=="D" ) { FSN_Scs_ST_X = FSN_ScsX - Sbrd_DX }
         else                           { FSN_Scs_ST_X = FSN_ScsX - Sbrd_SX }
      }

      TF2_ang2 = TF2_ang+90

      //if( LEFT(FSN_ScsPos,1)=="R" )  { FSN_ScsZ = DistanzaFraPunti(TF1_1,TF2_0,TF2_ang2) }
      //else                           { FSN_ScsZ = DistanzaFraPunti(TF1_0,TF2_1,TF2_ang2) }

      if( LEFT(FSN_ScsPos,1)=="R" )
      {
         //wk_par1 = SE_NUM(#Sbrd_FR>0,#Sbrd_FR,0) + Sbrd_RT + #Sbrd_RT

         //wk_par1 = Sbrd_FR + #Sbrd_RT
         wk_par1 = Sbrd_FR +  SE_NUM(#Sbrd_RT>0 , #Sbrd_RT , 0)


         FSN_ScsZ = DistanzaFraPunti(TF1_1,TF2_0,TF2_ang2) + wk_par1

         FSN_Scs_ST_Z = FSN_ScsZ

         //+ SE_NUM(#Sbrd_FR>0,#Sbrd_FR,0) + SE_NUM(Sbrd_FR>0,Sbrd_FR,0)
         if( debug==1 ) { COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 TF2=",STR(ATTUALE()), " TF1=",STR(wk_idx_test), " wk_par1=",STR(wk_par1), " DistanzaFraPunti(TF1_1,TF2_0,TF2_ang2) =",STR(DistanzaFraPunti(TF1_1,TF2_0,TF2_ang2) ) )) }
      }
      else
      {
         //wk_par1 = SE_NUM(#Sbrd_RT>0,#Sbrd_RT,0) + Sbrd_FR + #Sbrd_FR
         wk_par1 = Sbrd_FR  + #Sbrd_RT
         if( debug==1 ) { COMANDO2(STRCAT("LOGMSG Ctrl_TopFusion_2P0 TF2=",STR(ATTUALE()), " TF1=",STR(wk_idx_test), " wk_par1=",STR(wk_par1), " DistanzaFraPunti(TF1_0,TF2_1,TF2_ang2)  =",STR(DistanzaFraPunti(TF1_0,TF2_1,TF2_ang2)) )) }

         FSN_Scs_ST_Z = DistanzaFraPunti(TF1_0,TF2_1,TF2_ang2)

         FSN_ScsZ = DistanzaFraPunti(TF1_0,TF2_1,TF2_ang2) + wk_par1
         //+ SE_NUM(Sbrd_RT>0,Sbrd_FR,0) + SE_NUM(Sbrd_FR>0,Sbrd_FR,0)
         //+ SE_NUM(#Sbrd_RT>0,#Sbrd_RT,0)
      }

      //Luca 30/06/2021
      Scassa_Chi_Plus_RaggioInt = ""

      COMPONENTI2("wk_scs",wk_idx_test,"_top_grafica_M4")
      i = 1
      while ( i <= wk_scs )
      {
         if( VAR_VAL(wk_scs[i],"UsoSottoTop") == 0 )
         {
            Scassa_Chi_Plus_RaggioInt = STRCAT(Scassa_Chi_Plus_RaggioInt,STR(wk_scs[i]),";")
         }

         i = i + 1
      }

      if( FLAG_TopFusion != FLAG_TopFusion_prec )
      {
         if( FLAG_TopFusion == 1 )
         {
            COMANDO(STRCAT("PROCEDURA M4_Scassi ",STR(ATTUALE()),"  // Ctrl_TopFusion_2P0 ",NOME(ATTUALE())))
         }
      }
   }

   //Luca 10/12/2019
   PROCEDURA Ctrl_CheckAccostoMuro_2P0
   {
      if( ACTION()<=0 | ACTION()==2 | $OnLoadOrder==1 ) { EXITSUB() }

      //FLAG_UTILIZZATI IN STAMPA
      Muro_sx = 0
      Muro_dx = 0
      Muro_rt = 0

      wk_dist = QUERY_WALL(idx_att,"distance from face R")
      if( wk_dist==0 )  { Muro_rt = 1 }

      wk_dist = QUERY_WALL(idx_att,"distance from face S")
      if( wk_dist==0 )  { Muro_sx = 1 }

      wk_dist = QUERY_WALL(idx_att,"distance from face D")
      if( wk_dist==0 )  { Muro_dx = 1 }
   }
   //} PROCEDURE TOP 2.0

   PROCEDURA CtrlScasso_LavaboKERA
   {
      if( ACTION()<=0 | $OnLoadOrder==1 ) { EXITSUB() }

      if( ACTION() == 2 )  { EXITSUB() }

      if( VAR_EXIST(ATTUALE(),"OffX_prec")==0 )   { OffX_prec   = OffsetX }
      if( VAR_EXIST(ATTUALE(),"OffZ_prec")==0 )   { OffZ_prec   = OffsetZ }
      if( VAR_EXIST(ATTUALE(),"insert_prec")==0 ) { insert_prec = 0 }

      //Luca 23/06/2022 in inserimento lo faccio su postgest
      //inserimento
      insert = 0

      if( insert_prec!=insert
        | OffX_prec!=OffsetX
        | OffZ_prec!=OffsetZ
        )
      {
         insert_prec = insert
         //se viene spostato
         OffX_prec = OffsetX
         OffZ_prec = OffsetZ

         //COMANDO(STRCAT("PROCEDURA M4_Scassi ",STR(ATTUALE()),"  // Scassa_e_Taglia "))

         if( UN_PADRE("Mensola_Air") )
         {
            $wk_EliminaScassi_da_idx = GetTopLevel(ATTUALE())
            GOSUB EliminaScassi
            COMANDO(STRCAT("PROCEDURA M4_Scassi ",STR(GetTopLevel(ATTUALE())),"  // CtrlScasso_LavaboKERA "))
            COMANDO(STRCAT("RICALCOLA_UNA ",STR(GetTopLevel(ATTUALE())),"  // CtrlScasso_LavaboKERA Lavobo Kera"))
         }
         else
         {
            GOSUB EliminaScassi
            COMANDO("PROCEDURA M4_Scassi // Scassa_e_Taglia -- CtrlScasso_LavaboKERA")
         }
      }
   }

   PROCEDURA Ctrl_VascheTermoformate
   {
      if( ACTION()<=0 | $OnLoadOrder==1 )   { EXITSUB() }

      HIDE_ON_EDIT2(ATTUALE(),"RigeneraScasso",1)
      if( FLAG_ConVascheTermoformate == 0 ) { EXITSUB() }

      HIDE_ON_EDIT2(ATTUALE(),"RigeneraScasso",0)

      //salvo solo se top con vasche
      VAR_SET_MODE(ATTUALE(),"VT_TipoVasca",$MODE_SAVEALWAYS)
      VAR_SET_MODE(ATTUALE(),"VT_PosBase_V1",$MODE_SAVEALWAYS)
      VAR_SET_MODE(ATTUALE(),"VT_PosBase_V2",$MODE_SAVEALWAYS)

      VT_file_sat_prec    = VAR_VAL_STR(ATTUALE(),"VT_file_sat")
      if( VAR_EXIST(ATTUALE(),"VT_Miscelatore_prec")==0 ) { VT_Miscelatore_prec = VT_Miscelatore }

      VT_file_sat   = ""
      VT_idx_scassa = ""

      wk_nome_sat   = ""
      if( VT_TipoVasca == 1 ) { wk_nome_sat = "VASCAT_OVALE" }
      if( VT_TipoVasca == 2 ) { wk_nome_sat = "VASCA_OCCHIETTO" }
      if( VT_TipoVasca == 3 ) { wk_nome_sat = "VASCAT_RETT_500x310" }
      if( VT_TipoVasca == 4 ) { wk_nome_sat = "VASCAT_RETT_680x320" }

      //se ancora non ho configurato la tipologia della vasca
      if( wk_nome_sat=="" ) { EXITSUB() }

      if( wk_nome_sat != "" )
      {
         VT_file_sat     = STRCAT($path_sat,"Lavabi\",wk_nome_sat,".sat")
         VT_file_sat_scs = STRCAT($path_sat,"Lavabi\",wk_nome_sat,"_scs.sat")
      }

      wk_idx_graf_top  = VAR_VAL(idx_pann_top,"idx_top_generico")
      wk_idx_graf_stop = VAR_VAL(idx_pann_stop,"idx_stop_generico")
      VT_idx_scassa = STRCAT(STR(wk_idx_graf_top),";",STR(wk_idx_graf_stop))

      if( IS_ESCLUSO(idx_pann_stop2)==0 )
      {
         wk_idx_graf_stop2 = VAR_VAL(idx_pann_stop2,"idx_stop_generico")
         VT_idx_scassa = STRCAT(VT_idx_scassa,";",STR(wk_idx_graf_stop2))
      }

      if( VT_file_sat != VT_file_sat_prec )
      {
         RigeneraScasso = 1
         VT_file_sat_prec = VT_file_sat
      }

      if( VT_Miscelatore_prec != VT_Miscelatore )
      {
         RigeneraScasso = 1
         VT_Miscelatore_prec = VT_Miscelatore
      }

      //Luca 08/05/2020
      //in caricamento non faccio gli scassi, parte Scassa_e_Taglia generale alla fine del caricamento
      if( $OnLoadOrder2==1 ) { RigeneraScasso = 0 }

      //aspetto la notifica per fare gli scassi
      if( VAR_VAL(ATTUALE(),"WAIT_Scassi")==1 )
      {
         RigeneraScasso = 0
         VT_file_sat = ""
      }

      //Luca 06/05/2020
      if( RigeneraScasso==1 )
      {
         if( IS_VAR_FIXED(ATTUALE(),"RigeneraScasso")==1 ) { DEL_VAR_MODIFICATE(ATTUALE(),"RigeneraScasso") }
         RigeneraScasso = 0

         $wk_EliminaScassi_da_idx = ATTUALE()
         GOSUB EliminaScassi
         COMANDO(STRCAT("PROCEDURA M4_Scassi ",STR(ATTUALE()),"  // Scassa_e_Taglia "))
         //COMANDO("PROCEDURA M4_Scassi // Scassa_e_Taglia ")
      }

      GOSUB Ctrl_Posizione_VascheTermoformate
   }

   //Luca 08/05/2020
   PROCEDURA Ctrl_Posizione_VascheTermoformate
   {
      if( ACTION()<=0 | ACTION()==2 | $OnLoadOrder==1 )   { EXITSUB() }
      if( FLAG_ConVascheTermoformate == 0 ) { EXITSUB() }

      debug = 0
      #ifdef TE
         debug = 1
      #endif

      VT_idxBase_V1 = -1
      VT_idxBase_V2 = -1

      VT_TipoVascaStr = "OVALE"
      wk_prof_vasca   = 340
      if( VT_TipoVasca==2 ) { VT_TipoVascaStr = "OCCHIETTO"  wk_prof_vasca = 310 }
      if( VT_TipoVasca==3 ) { VT_TipoVascaStr = "RETT_50"    wk_prof_vasca = 310 }
      if( VT_TipoVasca==4 ) { VT_TipoVascaStr = "RETT_68"    wk_prof_vasca = 320 }

      if( debug ) { COMANDO2(STRCAT("LOGMSG Ctrl_Posizione_VascheTermoformate [",STR(ATTUALE()), "] -- ACTION=", STR(ACTION()), " VT_TipoVascaStr=", VT_TipoVascaStr, " VT_NumVasche=", STR(VT_NumVasche))) }

      wk_basi_sotto = 0
      BOX_MODE(0)
      NEAR_GLOBALE("wk_basi_sotto",idx_near_dn,5,1,"ScoccaT_*")
      SORT_POINT(base_0,"wk_basi_sotto","alto_0")

      if( debug ) { COMANDO2(STRCAT("LOGMSG Ctrl_Posizione_VascheTermoformate [",STR(ATTUALE()), "] -- wk_basi_sotto=",STR(wk_basi_sotto))) }

      //CICLO LE BASI TROVATE E VERIFICO SOLO QUELLE DISPONIBILI PER IL TIPO DI VASCA
      VT_basi= 0

      i = 1
      while ( i<=wk_basi_sotto )
      {
         wk_idx_test = wk_basi_sotto[i]
         wk_ok_base  = 0

         if( VT_TipoVascaStr == "OVALE" )
         {
            if( VAR_VAL(wk_idx_test,"X")>=660
              & VAR_VAL(wk_idx_test,"Zt")>=480  ) { wk_ok_base  = 1 }
         }
         if( VT_TipoVascaStr == "OCCHIETTO" )
         {
            if( VAR_VAL(wk_idx_test,"X")>=780
              & VAR_VAL(wk_idx_test,"Zt")>=450  ) { wk_ok_base  = 1 }
         }
         if( VT_TipoVascaStr == "RETT_50")
         {
            if( VAR_VAL(wk_idx_test,"X")>=680
              & VAR_VAL(wk_idx_test,"Zt")>=450  ) { wk_ok_base  = 1 }
         }
         if( VT_TipoVascaStr == "RETT_68" )
         {
            if( VAR_VAL(wk_idx_test,"X")>=860
              & VAR_VAL(wk_idx_test,"Zt")>=460  ) { wk_ok_base  = 1 }
         }

         if( wk_ok_base==1 )
         {
            ne = VT_basi + 1
            VT_basi = ne
            VT_basi[ne] = wk_idx_test
         }

         i = i + 1
      }

      if( debug )
      {
         COMANDO2(STRCAT("LOGMSG Ctrl_Posizione_VascheTermoformate [",STR(ATTUALE()), "] -- VT_basi=",STR(VT_basi)))
         i = 1
         while ( i<=VT_basi )
         {
            COMANDO2(STRCAT("LOGMSG Ctrl_Posizione_VascheTermoformate [",STR(ATTUALE()), "] -- VT_basi=",STR(VT_basi), " --> ",STR(VT_basi[i])))
            i = i + 1
         }
      }

      //SE NON HO BASI DISPONIBILI CANCELLO IL TOP ED ESCO
      if( VT_basi < VT_NumVasche )
      {
         steso = 1
         delme = 2
         //per evitare la notifica
         M4_DLINK_MODE__ = 1
         $str_msg=STRCAT(MSG(1090),"\n",MSG(1098),"\n",MSG(1137))
         DISPLAY3($str_msg,$MB_ICONERROR)
         FLAG_RADICE = $NO_RAD
         COMANDO(STRCAT("SETTA ",STR(ATTUALE())," // da Ctrl_Posizione_VascheTermoformate"))
         COMANDO("DELETE1")
         if( debug ) { COMANDO2(STRCAT("LOGMSG Ctrl_Posizione_VascheTermoformate [",STR(ATTUALE()), "] -- NON POSSO INSERIRE IL TOP")) }
         EXIT()
      }

      GOSUB Ctrl_PosizioneDef_VascheTermoformate

      if( VT_PosBase_V1>0  ) { VT_idxBase_V1 = VT_basi[VT_PosBase_V1] }
      if( VT_PosBase_V2>0  ) { VT_idxBase_V2 = VT_basi[VT_PosBase_V2] }

      if( IS_IDX(VT_idxBase_V1) )
      {
         SET_#(VT_idxBase_V1)
         VT_OffsetX_V1 = DistanzaFraPunti(base_0,#base_0,ANG_TOT2(ATTUALE()))

         if( debug ) { COMANDO2(STRCAT("LOGMSG Ctrl_Posizione_VascheTermoformate [",STR(ATTUALE()), "] -- VT_PosBase_V1=",STR(VT_PosBase_V1)," -- VT_idxBase_V1=",STR(VT_idxBase_V1) ," -- VT_OffsetX_V1=",STR(VT_OffsetX_V1))) }
      }

      if( IS_IDX(VT_idxBase_V2) )
      {
         SET_#(VT_idxBase_V2)
         VT_OffsetX_V2 = DistanzaFraPunti(base_0,#base_0,ANG_TOT2(ATTUALE()))

         if( debug ) { COMANDO2(STRCAT("LOGMSG Ctrl_Posizione_VascheTermoformate [",STR(ATTUALE()), "] -- VT_PosBase_V2=",STR(VT_PosBase_V2)," -- VT_idxBase_V2=",STR(VT_idxBase_V2) ," -- VT_OffsetX_V2=",STR(VT_OffsetX_V2))) }
      }
   }

   //Luca 08/05/2020
   //solo la prima volta definisco il defaut, poi posso cambiare la posizione dalla singola vasca
   PROCEDURA Ctrl_PosizioneDef_VascheTermoformate
   {
      if( VT_NumVasche == 1
        & VT_PosBase_V1 > 0) { EXITSUB() }

      if( VT_NumVasche == 2
        & VT_PosBase_V1 > 0
        & VT_PosBase_V2 > 0) { EXITSUB() }

      if( VT_basi == VT_NumVasche )
      {
         if( debug ) { COMANDO2(STRCAT("LOGMSG Ctrl_Posizione_VascheTermoformate [",STR(ATTUALE()), "] -- VT_basi = VT_NumVasche")) }

         if( VT_NumVasche == 1)
         {
            VT_PosBase_V1 = 1
            if( debug ) { COMANDO2(STRCAT("LOGMSG Ctrl_Posizione_VascheTermoformate [",STR(ATTUALE()), "] -- VT_PosBase_V1=",STR(VT_PosBase_V1))) }
         }

         if( VT_NumVasche == 2)
         {
            VT_PosBase_V1 = 1
            VT_PosBase_V2 = 2
            if( debug ) { COMANDO2(STRCAT("LOGMSG Ctrl_Posizione_VascheTermoformate [",STR(ATTUALE()), "] -- VT_PosBase_V1=",STR(VT_PosBase_V1), " VT_PosBase_V2=",STR(VT_PosBase_V2))) }
         }
      }

      if( VT_basi > VT_NumVasche)
      {
         if( debug ) { COMANDO2(STRCAT("LOGMSG Ctrl_Posizione_VascheTermoformate [",STR(ATTUALE()), "] -- VT_basi > VT_NumVasche")) }

         //GESTISCO ALCUNI DEFAULT
         //-- EVENTUALEMENTE DA GESTIRE LA SCELTA INIZIALE
         if( VT_NumVasche==1 )
         {
            //SX O CENTRO
            VT_PosBase_V1 = 1
            if( VT_basi==3 ) { VT_PosBase_V1 = 2 }
            if( VT_basi==5 ) { VT_PosBase_V1 = 3 }
            if( VT_basi==7 ) { VT_PosBase_V1 = 5 }
         }

         if( VT_NumVasche==2  )
         {
            //SEMPRE AGLI ESTREMI
            VT_PosBase_V1 = 1
            VT_PosBase_V2 = VT_basi
         }
      }
   }

   PROCEDURA Ctrl_CambiaPos_VascheTermoformate
   {
      if( ACTION()<=0 | ACTION()==2 | $OnLoadOrder==1 )  { EXITSUB() }

      //LEGGO L'ARRAY DELLE BASI DISPONIBILI CREATO SUL TOP
      VAR_CREATE_NUM(ATTUALE(),"VT_basi",0,$MODE_IMPLICIT,"")
      VAR_IMPLICITLY_INHERITS(idx_att, 0)

      i = 1
      while ( i<=VT_basi )
      {
         VAR_CREATE_NUM(ATTUALE(),STRCAT("VT_basi_##",STR(i)),0,$MODE_IMPLICIT,"")
         i = i + 1
      }
      VAR_IMPLICITLY_INHERITS(idx_att, 0)

      //RENDO DISPONIBILE LA POSSIBILITA' DI SELEZIONARE LA BASE SOLO SE HO BASI DISPONIBILI
      if( VT_basi > VT_NumVasche  ) { HIDE_ON_EDIT2(ATTUALE(),"CambiaBase",0) }
      else                          { HIDE_ON_EDIT2(ATTUALE(),"CambiaBase",1) }

      if( CambiaBase==1 )
      {
         DEL_VAR_MODIFICATE(ATTUALE(),"CambiaBase")
         CambiaBase = 0

         idx_top = PADRE(ATTUALE(),1)

         //MI SALVO LA POSIZIONE MIA E DELL'EVENTUALE ALTRA VASCA
         wk_pos_att = VAR_VAL(idx_top,STRCAT("VT_PosBase_V",STR(VT_IndVasca)))
         wk_pos_vv  = 0
         if( VT_NumVasche==2 )
         {
            wk_pos_vv =  VAR_VAL(idx_top,"VT_PosBase_V2")
            if( VT_IndVasca==2 ) { wk_pos_vv =  VAR_VAL(idx_top,"VT_PosBase_V1") }
         }

         //CREO L'ARRAY CON TUTTE LE VASCHE DISPONIBILI ESCLUDENDO QUELLA GIA' OCCUPATA (NEL CASO DI 2 VASCHE)
         $wk_base_disp = 0
         $wk_pos = 0

         i = 1
         while ( i<=VT_basi )
         {
            if( i!=wk_pos_vv )
            {
               ne = $wk_base_disp + 1
               $wk_base_disp = ne
               $wk_base_disp[ne] = VT_basi[i]

               if( i==wk_pos_att ) { $wk_pos = $wk_base_disp }
            }

            i = i + 1
         }

         //INIZIALEMENTE SELEZIONO LA BASE ATTUALE, CAMBIO BASE AL CLICK SU DIALOG
         $wk_base_sel = $wk_base_disp[$wk_pos]
         HI($wk_base_sel,1)
         $wk_dlg_caption  = ""
         $wk_dlg_lbl1     = MSG(1138)
         $wk_dlg_lbl2     = ""
         $wk_dlg_bnt_prev = STRCAT($path_bdm,"bmp\Dialog\Btn_Prev.png")
         $wk_dlg_bnt_next = STRCAT($path_bdm,"bmp\Dialog\Btn_Next.png")
         $wk_dlg_bnt_azione = "VT_CambiaBase_Azione"

         COMANDO2(STRCAT("run_dll_cmd bdmdialog MakeDialog ",APICI(),$path_bdm,"Dialog.txt|ScorriSxDX_Freccie",APICI()))

         if($DlgResult__==0 )
         {
            HI($wk_base_sel,0)
            EXITSUB()
         }
         HI($wk_base_sel,0)

         //SE RIMASTA SELEZIONATA LA STESSA BASE ESCO
         if( $wk_base_sel==idx_base_ref ) { EXITSUB() }

         //TROVO LA POSIZIONE DELLA NUOVA BASE E AGGIORNO SCASSI DEL TOP
         wk_pos_new = 0
         i = 1
         while ( i<=VT_basi )
         {
            if( VT_basi[i]==$wk_base_sel ) { wk_pos_new = i }

            i = i + 1
         }

         VAR_VALUE_SET(idx_top,STRCAT("VT_PosBase_V",STR(VT_IndVasca)),wk_pos_new)
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_top) , " // Ctrl_CambiaPos_VascheTermoformate"))
         VAR_VALUE_SET(idx_top,"RigeneraScasso",1)
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_top) , " // Ctrl_CambiaPos_VascheTermoformate"))
      }
   }

   PROCEDURA VT_CambiaBase_Azione
   {
      HI($wk_base_sel,0)

      if( $wk_dlg_azione<0 )
      {
         $wk_pos_prec = $wk_pos
         $wk_pos_new = $wk_pos - 1
         if( $wk_pos_new==0 ) { $wk_pos_new = $wk_base_disp }
      }
      if( $wk_dlg_azione>0 )
      {
         $wk_pos_prec = $wk_pos
         $wk_pos_new = $wk_pos + 1
         if( $wk_pos_new > $wk_base_disp ) { $wk_pos_new = 1 }
      }

      $wk_pos = $wk_pos_new
      $wk_base_sel = $wk_base_disp[$wk_pos]

      HI($wk_base_sel,1)
   }

   PROCEDURA Ctrl_Limiti_VascheTermoformate
   {
      if( ACTION()<=0 | ACTION()==2 | $OnLoadOrder==1 )  { EXITSUB() }

      idx_top = PADRE(ATTUALE(),1)

      //LIMITI SPOSTAMENTO VASCA IN BASE ALLA BASE DI RIFERIMENTO
      if( IS_IDX(idx_base_ref) )
      {
         //40 da fianco
         //90 da fine top

         wk_x_base = VAR_VAL(idx_base_ref,"X")

         OffsetX_min = 40
         OffsetX_max = wk_x_base - X - 40

         //verifico la distanza dalla fine del top
         SET_#(idx_top)
         wk_top_b0 = #pnt_top_b0
         wk_top_b3 = #pnt_top_b3

         SET_#(idx_base_ref)
         wk_base_b0 = #base_0
         wk_base_b3 = #base_3

         wk_ang = ANG_TOT2(idx_top)

         wk_dist_sx = DistanzaFraPunti(wk_top_b0,wk_base_b0,wk_ang)
         wk_dist_dx = DistanzaFraPunti(wk_top_b3,wk_base_b3,wk_ang)

         wk_x_min = 40
         if( wk_dist_sx < 90 ) { OffsetX_min = 90 - wk_dist_sx }
         if( wk_dist_dx < 90 )
         {
            wk_lim_sx = 90 - wk_dist_dx
            OffsetX_max = wk_x_base - X - wk_lim_sx
         }

         //Luca 26/06/2020 mantis 22827: Vasche termoformate: gestione su base H184
         //Limite presente solo se con cassetto, non con frontale fisso
         COMPONENTI2("wk_cass", idx_base_ref, "Cuc_Cassetto")
         if( VAR_VAL(idx_base_ref,"Y") < 368 & wk_cass > 0 )
         {
            OffsetX_min = 200
            OffsetX_max = wk_x_base - X - 200
         }

         //verifico distanza dall'anta vasca
         if( VT_NumVasche==2 )
         {
            SET_#(idx_top)
            if( VT_IndVasca==1 ) { SET_#(#VT_idxVasc_V2)  }
            else                 { SET_#(#VT_idxVasc_V1)  }
            wk_pnt_centro_v2 = #pnt_scs_centro

            wk_inter = DistanzaFraPunti(pnt_scs_centro,wk_pnt_centro_v2,wk_ang)

            wk_diff_sx = OffsetX - OffsetX_min
            wk_inter_ipotetico_sx = wk_inter - wk_diff_sx

            wk_magg_off_min_x = 0
            if( wk_inter_ipotetico_sx<700 ) { wk_magg_off_min_x = OffsetX_min + (700 - wk_inter_ipotetico_sx) }

            wk_diff_dx = OffsetX_max - OffsetX
            wk_inter_ipotetico_dx = wk_inter - wk_diff_dx

            wk_magg_off_max_x = 0
            if( wk_inter_ipotetico_dx<700 ) { wk_magg_off_max_x = (700 - wk_inter_ipotetico_dx) }

            wk_v2_a_sx = 0
            wk_v2_a_dx = 0

            SET_#(idx_top)
            if( VT_IndVasca == 1 )
            {
               if( #VT_OffsetX_V2 > #VT_OffsetX_V1 ) { wk_v2_a_sx = 0   wk_v2_a_dx = 1 }
               else                                  { wk_v2_a_sx = 1   wk_v2_a_dx = 0 }
            }
            if( VT_IndVasca == 2 )
            {
               if( #VT_OffsetX_V2>#VT_OffsetX_V1 )   { wk_v2_a_sx = 1   wk_v2_a_dx = 0 }
               else                                  { wk_v2_a_sx = 0   wk_v2_a_dx = 1 }
            }

            //verifico la posizione dell'altra vasca
            if( wk_v2_a_sx==1 )
            {
               if( wk_magg_off_min_x>40 )  { OffsetX_min = wk_magg_off_min_x }
            }
            if( wk_v2_a_dx==1 ) { OffsetX_max = OffsetX_max - wk_magg_off_max_x }
         }

         VAR_SET_MENU(ATTUALE(),"OffsetX",STRCAT("( ",STR(OffsetX_min),"-",STR(OffsetX_max)," )"))

         OffsetZ_min = 70
         OffsetZ_max = VAR_VAL(idx_top,"Zt") - Z - 70
         if( VAR_VAL(idx_top,"VT_Miscelatore")==1 )
         {
            OffsetZ_max = VAR_VAL(idx_top,"Zt") - Z - 100
         }

         //Luca 26/06/2020 mantis 22827: Vasche termoformate: gestione su base H184
         if( VAR_VAL(idx_base_ref,"Y") < 368 )
         {
            COMPONENTI2("wk_cass",idx_base_ref,"Cuc_Cassetto")
            if( wk_cass>0 ) { OffsetZ_min = OffsetZ_max - 25 }
         }

         VAR_SET_MENU(ATTUALE(),"OffsetZ",STRCAT("( ",STR(OffsetZ_min),"-",STR(OffsetZ_max)," )"))

         //Luca 26/06/2020
         //ASPETTO LA NOTIFICA DEL TOP LEVEL
         if( VAR_VAL(PADRE(ATTUALE(),1),"WAIT_Scassi")==0 )
         {
            if( VAR_EXIST(ATTUALE(),"valv_chiedi_ox")==0 ) { valv_chiedi_ox = 0 }
            if( VAR_EXIST(ATTUALE(),"valv_chiedi_oz")==0 ) { valv_chiedi_oz = 0 }

            if( OffsetX < OffsetX_min | OffsetX > OffsetX_max )
            {
               if( valv_chiedi_ox < 10 )
               {
                  if( OffsetX_min < OffsetX_max  ) { CHIEDI(ATTUALE(),"OffsetX") }
                  valv_chiedi_ox = valv_chiedi_ox + 1
               }
            }
            if( OffsetZ < OffsetZ_min | OffsetZ > OffsetZ_max )
            {
               if( valv_chiedi_oz < 10 )
               {
                  if( OffsetZ_min < OffsetZ_max  ) { CHIEDI(ATTUALE(),"OffsetZ") }
                  valv_chiedi_oz = valv_chiedi_oz + 1
               }
            }
         }
      }

      //POSIZIONE DEFAULT VASCA E MISCELATORE

      //verifico possibili spostamenti
      HIDE_ON_EDIT2(ATTUALE(),"VT_MiscPos",1)
      if( VT_TipoVascaStr=="OVALE" | VT_TipoVascaStr=="OCCHIETTO" )
      {
         HIDE_ON_EDIT2(ATTUALE(),"VT_MiscPos",0)
         wk_menu  = "DXSX"
         if( VAR_VAL(idx_top,"Zt")>575 ) { wk_menu  = "DXCNSX" }

         VAR_SET_MENU(ATTUALE(),"VT_MiscPos",wk_menu)
      }
      //imposto il default
      if( IS_VAR_FIXED(ATTUALE(),"VT_MiscPos")==1 )
      {
         if( VT_TipoVascaStr!="OVALE" & VT_TipoVascaStr!="OCCHIETTO" )
         {
            if( VT_MiscPos!=0 )  { DEL_VAR_MODIFICATE(ATTUALE(),"VT_MiscPos") }
         }
         else
         {
            //se non è permessa la posizione centrale --> sblocco
            if( wk_menu=="DXSX" & VT_MiscPos==0 ) { DEL_VAR_MODIFICATE(ATTUALE(),"VT_MiscPos") }
         }
      }
      if( IS_VAR_FIXED(ATTUALE(),"VT_MiscPos")==0 )
      {
         VT_MiscPos = 0
         if( VT_TipoVascaStr=="OVALE" | VT_TipoVascaStr=="OCCHIETTO" )
         {
            if( VAR_VAL(idx_top,"Zt")<=575 ) { VT_MiscPos = -1 }

            if( VT_NumVasche==2 )
            {
               VT_PosVasca = 0
               if( VT_NumVasche==2 )
               {
                  VT_PosVasca = -1
                  SET_#(idx_top)
                  if( VT_IndVasca == 1 )
                  {
                     if( #VT_OffsetX_V2 < #VT_OffsetX_V1 ) { VT_PosVasca = 1  }
                  }
                  if( VT_IndVasca == 2 )
                  {
                     if( #VT_OffsetX_V2>#VT_OffsetX_V1 )   { VT_PosVasca = 1  }
                  }

                  if( VT_PosVasca==1 ) { VT_MiscPos = 1 }
               }
            }
         }
      }

      //IN LARGHEZZA SEMPRE CENTRATO DI DEFAULT
      if( IS_VAR_FIXED(ATTUALE(),"OffsetX")==0 & IS_IDX(idx_base_ref) )
      {
         OffsetX = VAR_VAL(idx_base_ref,"X")/2 - X/2
      }

      if( IS_VAR_FIXED(ATTUALE(),"OffsetZ")==0 )
      {
         OffsetZ = 80
         if( VAR_VAL(idx_top,"Zt")>545 ) { OffsetZ = 115 }

         if( VT_TipoVascaStr=="OVALE" )
         {
            OffsetZ = 115
            if( VAR_VAL(idx_top,"Zt")<=574.5 ) { OffsetZ = (VAR_VAL(idx_top,"Zt") - Z )/2 }
         }

         if( VT_TipoVascaStr=="OCCHIETTO" )
         {
            OffsetZ = 115
            if( VAR_VAL(idx_top,"Zt")<=544.5 ) { OffsetZ = (VAR_VAL(idx_top,"Zt") - Z )/2 }
         }
      }

      //POSIZIONE MISCELATORE
      if( VT_Miscelatore==1 )
      {
         wk_offx =  0
         wk_offz = 40

         if( VT_MiscPos<0 )
         {
            wk_offx = -234
            wk_offz = -1*(Z/2 - 135)
         }

         if( VT_MiscPos>0 )
         {
            wk_offx = 234
            wk_offz = -1*(Z/2 - 135)
         }

         if( IS_VAR_FIXED(ATTUALE(),"VT_Misc_OX")==0 ) { VT_Misc_OX = wk_offx }
         if( IS_VAR_FIXED(ATTUALE(),"VT_Misc_OZ")==0 ) { VT_Misc_OZ = wk_offz }
      }
   }

   //[ LP 14/04/21 - Gestione per TOP STEEL A SBALZO
   PROCEDURA SetTopSteelPenisola
   {
      if( VAR_VAL(ATTUALE(),"VAR_TipoTop") != 23 )   { EXITSUB() }

      // 14/04/21 - Gestione per TOP PENISOLA STEEL
      SpessorePiano = 10
      passa_CodTop = "T09903"
      passa_RadTop = "TOPENSTEEL"
      LungMaxTop=4000

      //Luca 20/04/2021
      TopUnico = 1

      // 14/04/21 - Gestione per TOP PENISOLA STEEL
      VAR_TipoTopStr = "ACCIAIO_PEN_80"

      if( VAR_VAL(ATTUALE(),"ORD_XMAX")>0 ) { LungMaxTop  = VAR_VAL(ATTUALE(),"ORD_XMAX") }


      sbalzo_min = 5
      sbalzo_max = LungMaxTop - X

      sbalzo_max = sbalzo_max - Sbrd_SX - Sbrd_DX

      if( IS_VAR_FIXED(idx_att, "OffX_SteelPen" ) != 1 )   { OffX_SteelPen = sbalzo_max }

      // attivo le variabili per la gestione dello sbalzo al primo inserimento
      if( ACTION() == 2 | ACTION() == 12 )
      {
         VAR_SET_MODE(idx_att, "FillerInSteelPen", $MODE_SHOWALWAYS)
         VAR_SET_MODE(idx_att, "FillerOutSteelPen", $MODE_SHOWALWAYS)

         if( sbalzo_max > sbalzo_min )
         {
            menu_x = STRCAT("(", STR(sbalzo_min), "-", STR(sbalzo_max), ")")
            VAR_CREATE_NUM(idx_att, "OffX_SteelPen", OffX_SteelPen, $MODE_USER, menu_x)
            VAR_CREATE_NUM(idx_att, "PosX_SteelPen", PosX_SteelPen, $MODE_MISURE, "PosX_SteelPen")
         }

         //M4_MIS = VAR_VAL_STR(idx_att, "M4_MIS")
         //if( STRSTR(M4_MIS, "OffX_SteelPen") == "" )      { M4_MIS = STRCAT(M4_MIS, ";OffX_SteelPen" }
         //if( STRSTR(M4_MIS, "PosX_SteelPen") == "" )      { M4_MIS = STRCAT(M4_MIS, ";PosX_SteelPen" }
         //if( STRSTR(M4_MIS, "FillerInSteelPen") == "" )   { M4_MIS = STRCAT(M4_MIS, ";FillerInSteelPen" }
         //if( STRSTR(M4_MIS, "FillerOutInSteelPen") == "" )  { M4_MIS = STRCAT(M4_MIS, ";FillerOutInSteelPen" }
      }

      if( ACTION() >= 0 & ACTION() !=2 & $OnLoadOrder != 1 )
      {
         if( sbalzo_max > sbalzo_min )
         {
            menu_x = STRCAT("(", STR(sbalzo_min), "-", STR(sbalzo_max), ")")
            VAR_CREATE_NUM(idx_att, "OffX_SteelPen", OffX_SteelPen, $MODE_USER, menu_x)
            VAR_CREATE_NUM(idx_att, "PosX_SteelPen", PosX_SteelPen, $MODE_MISURE, "PosX_SteelPen")
         }

         if( sbalzo_max < OffX_SteelPen ) { CHIEDI(ATTUALE(),"OffX_SteelPen") }
      }

      // Alla notifica chiedo le variabili
      if( ACTION() == 12 & CMD() == 0 )
      {
         CHIEDI_MULTIPLO(idx_att, "PosX_SteelPen;OffX_SteelPen")
      }
   }

   PROCEDURA CtrlTopSteelPenisola
   {
      if( VAR_TipoTop != 23 )   { EXITSUB() }

      debug_CtrlTopSteelPenisola = 0

      Xc = X + OffX_SteelPen
      Yt = 80

      // ingombro per collisione
      if( PosX_SteelPen == -1 )
      {
         // aggiungo lo sbordo contrario
         //Xt = Xc + Sbrd_DX
         Xt = Xc + Sbrd_DX + Sbrd_SX

         base_0_m4 = [-OffX_SteelPen, 0, 0]
         alto_2_m4 = [Xt, Yt, Zt]
      }
      else
      {
         // aggiungo lo sbordo contrario
         Xt = Xc + Sbrd_SX + Sbrd_DX
         base_0_m4 = [-Sbrd_SX, 0, 0]
         alto_2_m4 = [Xc, Yt, Zt]
      }

      if( VAR_EXIST(idx_att, "OffX_SteelPen_prec") != 1 )   { OffX_SteelPen_prec = 0 }
      if( VAR_EXIST(idx_att, "PosX_SteelPen_prec") != 1 )   { PosX_SteelPen_prec = 0 }

      if( ACTION() == 2 )
      {
         OffX_SteelPen_prec = OffX_SteelPen
         PosX_SteelPen_prec = PosX_SteelPen
      }

      if( debug_CtrlTopSteelPenisola > 0 )
      {
         DISPLAY2(STRCAT("Xt=", STR(Xt)
                        , "\nX=", STR(X)
                        , "\nOffX_SteelPen=", STR(OffX_SteelPen)
                        , "\nOffX_SteelPen_prec=", STR(OffX_SteelPen_prec)
                        , "\nPosX_SteelPen=", STR(PosX_SteelPen)
                        , "\nPosX_SteelPen_prec=", STR(PosX_SteelPen_prec)
                        , "\nACTION()=", STR(ACTION())
                        , "\nCMD()=", STR(CMD())
                        ))

      }


      // se cambio la variabile chiamo l'aggiornamento grafico per gli scassi
      // Sono in punti notevoli, quindi non vado a verificare l'ACTION, perchè
      // potrebbe essere correttamente anche negativa (-1)
      if( CMD() == 0
        & $OnLoadOrder == 0 & $OnLoadOrder2 == 0
        & VAR_VAL(-1, "__loading__") == 0
        )
      {
         if( OffX_SteelPen != OffX_SteelPen_prec
           | PosX_SteelPen != PosX_SteelPen_prec
           )
         {
            if( debug_CtrlTopSteelPenisola > 0 )
            {
               DISPLAY2(STRCAT("Rinfresco gli scassi"
                              , "\nXt=", STR(Xt)
                              , "\nX=", STR(X)
                              , "\nOffX_SteelPen=", STR(OffX_SteelPen)
                              , "\nOffX_SteelPen_prec=", STR(OffX_SteelPen_prec)
                              , "\nPosX_SteelPen=", STR(PosX_SteelPen)
                              , "\nPosX_SteelPen_prec=", STR(PosX_SteelPen_prec)
                              , "\nACTION()=", STR(ACTION())
                              , "\nCMD()=", STR(CMD())
                              ))
            }


            GOSUB EliminaScassi
            COMANDO("PROCEDURA M4_Scassi // Scassa_e_Taglia ")

            OffX_SteelPen_prec = OffX_SteelPen
            PosX_SteelPen_prec = PosX_SteelPen
         }
      }
   }
   //] LP 14/04/21 - Gestione per TOP STEEL A SBALZO

   PROCEDURA Set_Gest_C033_Penisola_AirKitchen
   {
      VarAdd = STRCAT( "GEST_", FIN_var_fnd)
      wk_fin_var  = STRCAT( "GEST_", FIN_var_pia)

      if( ACTION() <= 0 | ACTION() == 2 )               { EXITSUB() }

      if( VAR_VAL_STR( ATTUALE(), wk_fin_var) == "" )   { EXITSUB() }

      if( IS_VAR_FIXED( ATTUALE(), VarAdd) == 1
        & FinituraUtente( ATTUALE(), wk_fin_var) == 0 ) { DEL_VAR_MODIFICATE( ATTUALE(), VarAdd) }

      if( IS_VAR_FIXED( ATTUALE(), VarAdd) == 1 )       { EXITSUB() }

      VAR_VALUESTR_SET( ATTUALE(), VarAdd, GetLaccatoCorrispondente( VAR_VAL_STR( ATTUALE(), STRCAT( "GEST_", FIN_var_pia))))

      GOSUB Add_TABER_VARSETTATE
   }

   //Luca 17/05/2022
   PROCEDURA Set_Gest_C008_SchienaleTop
   {
      if( ACTION() <= 0 | ACTION() == 2 )       { EXITSUB() }

      if( $OnLoadOrder )                        { EXITSUB() }

      if( VAR_EXIST(ATTUALE(),"GEST_C008")==0 ) { EXITSUB() }

      #ifdef AGE;RIV
        if( IS_VarsUser__(ATTUALE(),"GEST_C008") ) { DEL_VAR_MODIFICATE(ATTUALE(),"GEST_C008") }
      #endif

      #ifndef AGE;RIV
        if( IS_VarsUser__(ATTUALE(),"GEST_C008") ) { EXITSUB() }
      #endif

      COMPONENTI2("scs",ATTUALE(),"Scasso_SchienaleTop")

      CAT_VM_var = "C008"
      CAT_VM_opz = "SPEC1;TP007;TP021;TP022;TP023;TP024"
      CAT_VM_sel = ""

      if( scs == 1 )  { CAT_VM_sel = "SPEC1;TP007" }
      if( scs == 2 )  { CAT_VM_sel = "SPEC1;TP021" }
      if( scs == 3 )  { CAT_VM_sel = "SPEC1;TP022" }
      if( scs == 4 )  { CAT_VM_sel = "SPEC1;TP023" }
      if( scs == 5 )  { CAT_VM_sel = "SPEC1;TP024" }

      GOSUB Gest_CAT_VM
   }

   PROCEDURA Blocco_LavaboKera_Top_Sp4
   {
      WITH_ALIAS( "$wk_lav_kera", "Kera")
      if( $wk_lav_kera == 0 ) { EXITSUB() }

      $wk_CG_Nome    = "Blocco_LavaboKera_Top_Sp4"
      $wk_CG_Blocca  = 0
      $wk_CG_Items   = 0
      $wk_CG_Tipo    = "BLOCCO"
      $wk_CG_Msg     = MSG(1343)
      $wk_CG_Info    = ""

      $wk_i = 1
      while( $wk_i <= $wk_lav_kera )
      {
         $idx_kera_test = $wk_lav_kera[$wk_i]
         $tipo_top_kera_test = VAR_VAL_STR($idx_kera_test,"VAR_TipoTopStr")

         $wk_blocca = 0
         if( $tipo_top_kera_test == "VETRO_4"
           | $tipo_top_kera_test == "XGLASS_4" ) { $wk_blocca = 1 }

         if( $wk_blocca
           & VAR_VAL($idx_kera_test,"FLAG_Speciale") == 0 ) { AddItem2Array(-1,"wk_CG_Items",$idx_kera_test,"") }

         $wk_i = $wk_i + 1
      }

      if( $wk_CG_Items > 0 ) { $wk_CG_Blocca = 1 }

      GOSUB CG_CFO_FineControllo
   }

   PROCEDURA Set_Gest_E008_VascaTermoformata
   {
      if( Cucina_Versione <= 2)                              { EXITSUB() }
      if( VT_TipoVascaStr == "")                             { EXITSUB() }
      if( ACTION() <= 0 | ACTION() == 2 | $OnLoadOrder == 1) { EXITSUB() }

      VarAdd = "GEST_E008"

      gest_E008 = "LV0001"
      if( VT_TipoVascaStr == "OVALE"    ) { gest_E008 = "LV0002" }
      if( VT_TipoVascaStr == "RETT_50"  ) { gest_E008 = "LV0003" }
      if( VT_TipoVascaStr == "RETT_68"  ) { gest_E008 = "LV0004" }

      if( VAR_VAL_STR( idx_att, VarAdd) == gest_E008)        { EXITSUB() }

      if( IS_VAR_FIXED( idx_att, VarAdd)) { DEL_VAR_MODIFICATE( idx_att, VarAdd) }

      GEST_E008 = gest_E008
      GOSUB Add_TABER_VARSETTATE
   }
}

Funzioni
{
   // Dato un angolo (tipicamente ang_a_sx/ang_a_dx del Top),restituisce 1 se fs (Result)
   // 1 se è fs (!= 0 != 90)
   // o 0 se è 90° o 0°
   number ANG_TOP_FS_funcBDM ( number ang )
   {
      if ( ABS ( ang -  0 ) >= 1
         & ABS ( ang - 90 ) >= 1 )  { Result = 1 }
      else                          { Result = 0 }
   }

   //Luca 20/01/2020
   //normalizzo angolo
   number ANG_TOT_NOR ( number idx )
   {
      ang = ANG_TOT2(idx)
      while( ang<0 )    { ang = ang + 360 }
      while( ang>=360 ) { ang = ang - 360 }

      Result = ang
   }

   //Luca 13/10/2020 duplicata
   //// metto in sequenza da sx a dx due strutture, che abbiano lo stesso angolo
   //void CTLR_SEQUENZA_SXDX ( VAR number idx_1, VAR number idx_2 )
   //{
   //   if( IS_IDX(idx_1)==0 | IS_IDX(idx_2)==0 ) { EXITSUB() }
   //
   //   //1 - proietto un punto a distanza quasi infinita
   //   ang_rif = ANG_TOT2(idx_1)
   //
   //   SET_#(idx_1)
   //   P1 = #base_0    P1.y = 0
   //   SET_#(idx_2)
   //   P2 = #base_0    P2.y = 0
   //
   //   P0.x = P1.x - 99999*COSENO(ang_rif)
   //   P0.y = 0
   //   P0.z = P1.z + 99999*SENO(ang_rif)
   //
   //   PX = INTERFERISCI(P2,ang_rif+90,P0,P1)
   //
   //   if( DISTANZA(P0,PX)<99999 )
   //   {
   //      idx = idx_1
   //      idx_1 = idx_2
   //      idx_2 = idx
   //   }
   //}

   //partendo da idx_test, scorro verso dx per capire se c'è almeno un frontale wildwood
   number Ctrl_presenza_WildWood ( number idx_test )
   {
      con_ww = 0

      valvola_loop = 0

      while( IS_IDX(idx_test) & con_ww==0 & valvola_loop < 20 )
      {
         if( IS_MATCH(VAR_VAL_STR(idx_test,"GEST_C001"),"WW*") ) { con_ww = 1 }

         if( VAR_EXIST(idx_test,"idx_dx") )
         {
            //idx_test = VAR_VAL(idx_test,"idx_dx")
            SET_#(idx_test)
            if( IS_IDX(#idx_dx) )
            {
               if( ABS(ANG_TOT2(idx_test)-ANG_TOT2(#idx_dx))<0.1 ) { idx_test = #idx_dx  }
               else                                                { idx_test = -1 }
            }
            else  { idx_test = -1 }
         }
         else                               { idx_test = -1 }

         valvola_loop = valvola_loop + 1
      }

      Result = con_ww
   }

   //Simone 10/12/21 - partendo da idx_test, scorro verso dx per capire se tutti i frontali sono nobilitati/laccati
   number Ctrl_presenza_Nob_Lac ( number idx_test )
   {
      con_nob = 0

      valvola_loop = 0

      //conto le basi che testo
      n_basi = 0

      while( IS_IDX(idx_test) & valvola_loop < 20 )
      {
         n_basi = n_basi + 1

         if( VAR_VAL_STR(idx_test,"MaterialeFrontale") == "MELAMINICO"
           | VAR_VAL_STR(idx_test,"MaterialeFrontale") == "NOBILITATO" ) { con_nob = con_nob + 1 }

         if( VAR_EXIST(idx_test,"idx_dx") )
         {
            SET_#(idx_test)
            if( IS_IDX(#idx_dx) )
            {
               if( ABS(ANG_TOT2(idx_test)-ANG_TOT2(#idx_dx))<0.1 ) { idx_test = #idx_dx  }
               else                                                { idx_test = -1 }
            }
            else  { idx_test = -1 }
         }
         else     { idx_test = -1 }

         valvola_loop = valvola_loop + 1
      }

      Result = 0
      if( n_basi == con_nob ) { Result = 1 }
   }

   //Identifico piano valido
   string Piano_Tipo ( string piano )
   {
      Result = ""

      piano = LOWER(piano)
      if( piano == "" ) { piano = "xz" }

      if( STRLEN(piano) != 2 )
      {
         DISPLAY2( "Piano_Tipo - Errore utilizzo - specificare due lettere per il piano da utilizzare, es: 'xz'.")
         EXITSUB()
      }

      piano_x = SE_NUM( STR_INDEX_OF( piano, 0, "x") < 0, 0, 1)
      piano_y = SE_NUM( STR_INDEX_OF( piano, 0, "y") < 0, 0, 1)
      piano_z = SE_NUM( STR_INDEX_OF( piano, 0, "z") < 0, 0, 1)

      if( piano_x + piano_y + piano_z != 2 )
      {
         DISPLAY2( PRINTF( "Piano_Tipo - Errore utilizzo - il piano '%s' non è valido.", piano, ""))
         EXITSUB()
      }

      Result = piano
   }

   //Angolo definito dalla retta passante per punto_1 e punto_2 nei confronti del primo asse del piano specificato
   // Es.: Punti_Angolo( base_0, base_3, "XZ", 0, 1) di un blocco restituisce l'angolo dell'elemento stesso rispetto l'asse X
   number Punti_Angolo ( xyz punto_1, xyz punto_2, string piano, number tolleranza, number normalizza )
   {
      Result = 0

      if( punto_1.x == punto_2.x
        & punto_1.y == punto_2.y
        & punto_1.z == punto_2.z ) { EXITSUB() }

      //0 - Controlli preliminari
      if( piano == "" )            { EXITSUB() }

      piano = Piano_Tipo(piano)

      //1 - Variabili appoggio
      // 1.1 - Estraggo due assi
      asse_1 = STRMID( 0, 1, piano)
      asse_2 = STRMID( 1, 1, piano)

      // 1.2 - Calcolo delta per asse
      // 1.2.1 - Porto punti in globali, necessarie per VAR_VAL
      $wk_Punti_Angolo_punto_1 = punto_1
      $wk_Punti_Angolo_punto_2 = punto_2

      // 1.2.2 - Delta
      asse_1_delta = VAR_VAL( -1, STRCAT( "wk_Punti_Angolo_punto_2.", asse_1)) - VAR_VAL( -1, STRCAT( "wk_Punti_Angolo_punto_1.", asse_1))
      asse_2_delta = VAR_VAL( -1, STRCAT( "wk_Punti_Angolo_punto_1.", asse_2)) - VAR_VAL( -1, STRCAT( "wk_Punti_Angolo_punto_2.", asse_2))

      if( asse_1_delta == 0
        & asse_2_delta == 0 )      { EXITSUB() }

      Result = GRADI( ATAN2( asse_2_delta, asse_1_delta))
      if( tolleranza != 0)
      {
         if( tolleranza > 0 )      { Result     = ABS(Result)     }
         else                      { tolleranza = ABS(tolleranza) }

         Result = MRound( Result, tolleranza)
      }

      if( normalizza != 0)         { Result = NORMALIZZA_ANG( Result) }

      //Log
      EXITSUB()

      COMANDO2( STRCAT( "LOGMSG Punti_Angolo -> punto_1: ",      APICI(), Point2String(punto_1), APICI(),
                                            " - punto_2: ",      APICI(), Point2String(punto_2), APICI(),
                                            " - piano: ",        APICI(), piano, APICI(),
                                            " - tolleranza: ",   APICI(), STR(tolleranza), APICI(),
                                            " - normalizza: ",   APICI(), STR(normalizza), APICI(),
                                            " - asse_1: ",       APICI(), asse_1, APICI(),
                                            " - asse_2: ",       APICI(), asse_2, APICI(),
                                            " - asse_1_delta: ", APICI(), STR(asse_1_delta), APICI(),
                                            " - asse_2_delta: ", APICI(), STR(asse_2_delta), APICI(),
                                            " - Result IN: ",    APICI(), STR(GRADI( ATAN2( asse_2_delta, asse_1_delta))), APICI(),
                                            " - Result OUT: ",   APICI(), STR(Result), APICI()))
   }

   //DistanzaFraPunti con possibilità di specificare il piano da considerare
   number Punti_Distanza ( xyz punto_1, xyz punto_2, xyz punto_1_ref, xyz punto_2_ref, string piano, number tolleranza, number normalizza )
   {
      Result = 0

      if( punto_1.x == punto_2.x
        & punto_1.y == punto_2.y
        & punto_1.z == punto_2.z )         { EXITSUB() }

      if( punto_1_ref.x == punto_2_ref.x
        & punto_1_ref.y == punto_2_ref.y
        & punto_1_ref.z == punto_2_ref.z ) { EXITSUB() }

      // 0 - controlli preliminari
      piano = Piano_Tipo(piano)
      if( piano == "" )                    { EXITSUB() }

      //1 - Variabili appoggio
      //1.1 - Estraggo due assi
      asse_1 = STRMID( 0, 1, piano)
      asse_2 = STRMID( 1, 1, piano)

      //TODO
      if( asse_1 == "y"
        | asse_2 == "y" )          { DISPLAY2( "Asse Y non testato, da verificare.") EXITSUB() }

      //1.2 - Punto 2 di appoggio
      $wk_Punti_Distanza_punto_1     = punto_1
      $wk_Punti_Distanza_punto_2     = punto_2
      $wk_Punti_Distanza_punto_2_tmp = punto_1

      VAR_VALUE_SET( -1, STRCAT( "wk_Punti_Distanza_punto_2_tmp.", asse_1), VAR_VAL( -1, STRCAT( "wk_Punti_Distanza_punto_2.", asse_1)))
      VAR_VALUE_SET( -1, STRCAT( "wk_Punti_Distanza_punto_2_tmp.", asse_2), VAR_VAL( -1, STRCAT( "wk_Punti_Distanza_punto_2.", asse_2)))

      punto_2 = $wk_Punti_Distanza_punto_2_tmp

      //1.3 - Distanza tra i due punti
      distanza = DISTANZA( punto_1, punto_2)

      //1.4 - Angoli
      angolo_toll    = 0.001
      angolo_p12     = Punti_Angolo( punto_1, punto_2, piano, -angolo_toll, 0)
      angolo_ref     = Punti_Angolo( punto_1_ref, punto_2_ref, piano, -angolo_toll, 0)
      angolo_delta   = MRound( angolo_p12 - angolo_ref, angolo_toll)

      //2 - Distanza proiettata
      Result = distanza * COSENO(angolo_delta)

      if( tolleranza != 0 ) { Result = MRound( Result, tolleranza) }
      if( normalizza > 0  ) { Result = ABS(Result) }

      //Log
      EXITSUB()

      COMANDO2( STRCAT( "LOGMSG Punti_Distanza -> Result: ",       APICI(), STR(Result), APICI(),
                                              " - punto_1: ",      APICI(), Point2String(punto_1), APICI(),
                                              " - punto_2: ",      APICI(), Point2String($wk_Punti_Distanza_punto_2), APICI(),
                                              " - piano: ",        APICI(), piano, APICI(),
                                              " - tolleranza: ",   APICI(), STR(tolleranza), APICI(),
                                              " - normalizza: ",   APICI(), STR(normalizza), APICI(),
                                              " - asse_1: ",       APICI(), asse_1, APICI(),
                                              " - asse_2: ",       APICI(), asse_2, APICI(),
                                              " - punto_2 NEW: ",  APICI(), Point2String(punto_2), APICI(),
                                              " - distanza: ",     APICI(), STR(distanza), APICI(),
                                              " - angolo_p12: ",   APICI(), STR(angolo_p12), APICI(),
                                              " - angolo_ref: ",   APICI(), STR(angolo_ref), APICI(),
                                              " - angolo_delta: ", APICI(), STR(angolo_delta), APICI()))
   }

   xyz Punti_Distanze_Idx ( xyz punto , number idx , xyz puntoRef1 , xyz puntoRef2 , string piano , number tolleranza , number normalizza )
   {
      Result = [ $ERR_INTER, $ERR_INTER, $ERR_INTER ]

      // 0 - Controlli preliminari
      if( IS_IDX(idx) != 1) { EXITSUB() }
      SET_#(idx)

      // 1 - Colleziono i punti
      punti = 0

      // 1.1 - Basi
      LISTA_VARIABILI( idx, 0, "base", "base_*")

      baseNum = 0
      while( inc(baseNum) <= base) { punti[inc(punti)] = base[baseNum] }

      // 1.2 - Alto
      LISTA_VARIABILI( idx, 0, "alto", "alto_*")

      altoNum = 0
      while( inc(altoNum) <= alto) { punti[inc(punti)] = alto[altoNum] }

      if( punti <= 0)       { EXITSUB() }

      puntoNum = 0
      while( inc(puntoNum) <= punti)
      {
         puntoVar = punti[puntoNum]
         EVAL( FMT( "puntoAtt = #{}", puntoVar))

         puntoDst = Punti_Distanza( punto, puntoAtt, puntoRef1, puntoRef2, piano, tolleranza, normalizza)

         if( puntoNum == 1)
         {
            Result = [ puntoDst, puntoDst, puntoDst ]
            continue
         }

         if( puntoDst < Result.x) { Result.x = puntoDst }
         if( puntoDst > Result.z) { Result.z = puntoDst }
      }

      Result.y = Result.x + (Result.z - Result.x) / 2
   }

   number Punti_Distanza_Idx ( xyz punto_1, xyz punto_2, number idx, string piano, number tolleranza )
   {
      Result = 0

      if( punto_1.x == punto_2.x
        & punto_1.y == punto_2.y
        & punto_1.z == punto_2.z ) { EXITSUB() }

      // 0 - controlli preliminari
      piano = Piano_Tipo(piano)
      if( piano == "" )            { EXITSUB() }

      //1 - Variabili appoggio
      //1.1 - Estraggo due assi
      asse_1 = STRMID( 0, 1, piano)
      asse_2 = STRMID( 1, 1, piano)

      //1.2 - Angolo idx. TODO: gestire decentemente
      SET_#(idx)
      punto_1_ref = #base_0 punto_2_ref = #base_3
      if( asse_1 == "z" ) { punto_2_ref = #base_1 }

      //2 - Distanza
      Result = Punti_Distanza( punto_1, punto_2, punto_1_ref, punto_2_ref, "xz", tolleranza, 1)
   }

   //Luca 17/07/2019
   //calcolo la distanza X tra 2 punti non allineati
   //
   //      P1
   //        --------------
   //                      P2
   //
   // per aver la distanza corretta proietto i due punti in una retta per allinearli
   //
   //
   //R1------------------------------R2
   //      P1-new           P2-new
   //       |               |
   //       |               |
   //       P1              |
   //         ------------- |
   //                       P2
   //
   number DistanzaFraPunti ( xyz P1 , xyz P2 , number ang )
   {
      Result = -1

      R1 = [-1,0,-1]
      R2 = [-1,0,-1]
      PX = [-1,0,-1]

      offsetz = 1000
      offsetx = 10000

      //partendo da P1, proietto il punto
      PX.x = P1.x - offsetz*SENO(ang)
      PX.z = P1.z - offsetz*COSENO(ang)

      R1.x = PX.x - offsetx*COSENO(ang)
      R1.z = PX.z + offsetx*SENO(ang)

      R2.x = PX.x + offsetx*COSENO(ang)
      R2.z = PX.z - offsetx*SENO(ang)

      P1.y = 0
      P2.y = 0

      //DISPLAY2(STRCAT("R1 = [",STR(R1.x),",",STR(R1.y),",",STR(R1.z),"] \nR2 = [",STR(R2.x),",",STR(R2.y),",",STR(R2.z),"]"))

      //ora proietto i punti P1 e P2 nella ratta R1-R2
      P1n = INTERFERISCI(P1,ang+90,R1,R2)
      P2n = INTERFERISCI(P2,ang+90,R1,R2)

      //DISPLAY2(STRCAT("P1n = [",STR(P1n.x),",",STR(P1n.y),",",STR(P1n.z),"] \nP2n = [",STR(P2n.x),",",STR(P2n.y),",",STR(P2n.z),"]"))

      if( P1n.x!=$ERR_INTER & P1n.y!=$ERR_INTER & P1n.z!=$ERR_INTER
        & P2n.x!=$ERR_INTER & P2n.y!=$ERR_INTER & P2n.z!=$ERR_INTER )
      {
         dist = DISTANZA(P1n,P2n)
         Result = ROUND2(dist,2)
      }
   }

   string GetValMenuStr ( number idx, string nomeVarNum )
   {
      Result = ""

      if( idx != -1
        & IS_IDX(idx) != 1 )                  { EXITSUB() }
      if( VAR_EXIST(idx, nomeVarNum) != 1 )   { EXITSUB() }
      if( VAR_TYPE(idx, nomeVarNum) != 0 )    { EXITSUB() }

      Result = VAL_MENU( VAR_MENU(idx, nomeVarNum),  VAR_VAL(idx, nomeVarNum))
   }
}
