//Collezione LAGO LINEA - 30 MM
//
// - elementi/procedure avranno suffisso  _30MM
// - variabili globali iniziano per L30 (Linea 30)

Globali
{
   SVN_30MM_Rev        "SVN revision"        "$Revision$" NoSave

   L30_Alt_Pie         "Altezza piedini"                 17 NoSave

   L30_GRIGLIA_X        ""    184 NoSave
   L30_GRIGLIA_Y        ""    184 NoSave
   L30_GRIGLIA_OFFY     ""     17 NoSave

   //griglia per inserimento 30mm
   L30_ATTIVA_GRIGLIA   ""      1 NoSave
   //punti aggiuntivi per ripiani e fianchi
   L30_ATTIVA_SNAPAGG   ""      0 NoSave
   //gestione allineamento automatico ripiani
   L30_ATTIVA_ALLRIPA   ""      0 NoSave

   L30_PROFONDITA       ""      0

   //Larghezza triade
   Triade_DimX          "Triade - Larghezza" 144 NoSave
}

Misure
{
   Lar_30MM  "Larghezza" < OnlyDesc >
   {
      Nominali 184  368  552  736  920  1104  1472  1840  2208  2576  2944
      Reali    184  368  552  736  920  1104  1472  1840  2208  2576  2944
   }

   LarVe_30MM  "Larghezza" < OnlyDesc >
   {
      Nominali 184  368  552  736  920  1104  1472  1840
      Reali    184  368  552  736  920  1104  1472  1840
   }

   Alt_30MM  "Altezza" < OnlyDesc >
   {
      Nominali 184  368  552  736  920  1104  1472  1840  2208  2576  2944
      Reali    184  368  552  736  920  1104  1472  1840  2208  2576  2944
   }

   Prf_30MM  "Profonditą" < OnlyDesc >
   {
      Nominali 136  222  248  358  384
      Reali    136  222  248  358  384
   }

   PrfFia_30MM  "Profonditą" < OnlyDesc >
   {
      Nominali 136  248  384
      Reali    136  248  384
   }

   PrfFiaEV_30MM  "Profonditą" < OnlyDesc >
   {
      Nominali   299  435
      Reali      299  435
   }

   LarMens_30MM  "Larghezza" < OnlyDesc >
   {
      Nominali 368  552  736  920  1104  1472  1840  2208
      Reali    368  552  736  920  1104  1472  1840  2208
   }

   PrfRip_30MM  "Profonditą" < OnlyDesc >
   {
      Nominali 136  248  384
      Reali    136  248  384
   }

   PrfRipV_30MM  "Profonditą" < OnlyDesc >
   {
      Nominali 248  384
      Reali    248  384
   }


   PrfRipS_30MM  "Profonditą"  < OnlyDesc >
   {
      Nominali 222 358
      Reali    222 358
   }

   PosRip30MM "Posizione Ripiano 30MM" < OnlyDesc >
   {
      Nominali "Sotto"   "Sopra"
      Reali      -1          1
   }

   LarTeca4_30MM  "Larghezza" < OnlyDesc >
   {
      Nominali 184  368  552  736  920  1104  1472  1840  2208
      Reali    184  368  552  736  920  1104  1472  1840  2208
   }

   AltTeca_30MM  "Altezza" < OnlyDesc >
   {
      Nominali 184  368
      Reali    184  368
   }

   //Luca 14/04/2021
   AltTeca3_30MM  "Altezza" < OnlyDesc >
   {
      Nominali 154  338
      Reali    154  338
   }

   AltTeca4_30MM  "Altezza" < OnlyDesc >
   {
      Nominali 184  368  552  736  1104  1288  1472  1840  2208  2576  2944
      Reali    184  368  552  736  1104  1288  1472  1840  2208  2576  2944
   }

   AltTeca4a_30MM  "Altezza" < OnlyDesc >
   {
      Nominali 184  368  552  736  1104  1288
      Reali    184  368  552  736  1104  1288
   }
   AltTeca4b_30MM  "Altezza" < OnlyDesc >
   {
      Nominali 184  368  552  736  1104
      Reali    184  368  552  736  1104
   }
   AltTeca4c_30MM  "Altezza" < OnlyDesc >
   {
      Nominali 184  368  552  736  1104
      Reali    184  368  552  736  1104
   }

   ProfTeca_30MM  "Altezza" < OnlyDesc >
   {
      Nominali 284  384
      Reali    284  384
   }

   AltCol_30mm "Altezza colonna (1) 30 mm x colonne sp. 30"
   {
      Nominali   "1/2 MODULO   H  18,4 cm"  "1   MODULO   H  36,8 cm"                 "1   MODULO e ½  H  55,2 cm"               "2   MODULO   H  73,6 cm"                "2   MODULO e ½  H  92,0 cm"              "3   MODULO   H 110,4 cm"                 "3   MODULO e ½  H 128,8 cm"              "4   MODULO   H 147,2 cm"                "5   MODULO   H 184,0 cm"                "6   MODULO   h 220,8 cm"                "7   MODULO   H 257,6 cm"               "8   MODULO   H 294,4 cm"
      Reali       184                        368                                       552                                        736                                      920                                       1104                                      1288                                      1472                                     1840                                     2208                                     2576                                    2944
      Image       %path_bdm%\Bmp\vuoto.jpg   %path_bdm%\Bmp\Menu\30MM\30mm_ALT1.jpg    %path_bdm%\Bmp\Menu\30MM\30mm_ALT1e5.jpg   %path_bdm%\Bmp\Menu\30MM\30mm_ALT2.jpg   %path_bdm%\Bmp\Menu\30MM\30mm_ALT2e5.jpg  %path_bdm%\Bmp\Menu\30MM\30mm_ALT3.jpg    %path_bdm%\Bmp\Menu\30MM\30mm_ALT3e5.jpg  %path_bdm%\Bmp\Menu\30MM\30mm_ALT4.jpg   %path_bdm%\Bmp\Menu\30MM\30mm_ALT5.jpg   %path_bdm%\Bmp\Menu\30MM\30mm_ALT6.jpg   %path_bdm%\Bmp\Menu\30MM\30mm_ALT7.jpg  %path_bdm%\Bmp\Menu\30MM\30mm_ALT8.jpg
   }

   LarDiagoLinea  "Larghezza" < OnlyDesc >
   {
      Nominali 552  736  1104
      Reali    552  736  1104
   }
}

Elemento Contenitore_30MM
{
   Descrizione = "Contenitore 30mm"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Alias NoCollision

   Variabili
   {
      X       "Larghezza"         1472 Menu ( Lar_30MM ) Utente ( 300-4000 )

      Y       "Altezza"           2000 Utente ( ) ShowAlways SaveAlways

      Z       "Profonditą"        384  Menu ( PrfFia_30MM )

      //VAR_FixMuro       "Fissato a muro"      0 Menu ( SiNo )
      //VAR_FixTerra      "Solo a terra"        0 Menu ( SiNo )

      idx_fia_up  "" -1
      idx_fia_dw  "" -1
      idx_sch_sx  "" -1
      idx_sch_dx  "" -1

      ConPiedini         "" 0
      ConAttaccaglie     "" 0

      COD_EREDITA        ""  "PRE;POST"

      CMP2_AZIONI        ""  "S"

      M4_A_MURO          ""   0
      M4_CNT_LINK_MODE__ ""   0
      M4_CNT_MODE__      ""   1
      M4_CNT_MODE2__     ""   1

      //M4_LINK2WALL_MODE__ "" 7

      M4_MIS             "" "X;Y;Z;FillerM2G"
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB AssElementi_30MM

      DescEdit__ = MSG(1028)

      if( ACTION() > 0 )
      {
         Y = H_DA_SOFFITTO(ATTUALE(),"")
      }
   }

   PuntiNotevoli
   {
      GOSUB punti

      DEL_VAR(ATTUALE(),"pnt_cont_30MM*")

      np = 1
      step_x = 184 + 15
      step_y = 184
      np_alt = (Y / step_y) + 1
      np_lar = (X + 30) / step_x + 1

      off_x = 0
      off_y = $L30_Alt_Pie

      i = 1
      while ( i<= np_alt )
      {
         off_x = 15

         il = 1
         while ( il<= np_lar )
         {
            VAR_CREATE_XYZ( ATTUALE() , STRCAT("pnt_cont_30MM_",STR(np)) , off_x , off_y , 0 , 0 , "" )
            off_x = 15 + step_x*il

            np = np + 1
            il = il + 1
         }
         off_y =  $L30_Alt_Pie +  step_y*i

         i = i + 1
      }
   }

   #include %path_bdm%\Tlib\orie.inc

   Procedura OnQueryBdmLocal
   {
      GOSUB OnQueryBdmLocal_30MM


      if( $query_type == 13 )
      {
         $QueryResult__ = 1
         $POPUP_MENU = 0
         AddPopupMenu("Scegli misure")
      }

      if( $query_type == 14 )
      {
         $QueryResult__ = 1
         // scelta del 1° valore del popup menu
         if( $query_p2 == 0 ) { DlgGetDimensioni(ATTUALE(),"YZX" , "Macro" ) }
      }
   }

   Controlli
   {
      GOSUB CtrlComune
      ChiediMisureInserimento(ATTUALE())

      if( ACTION()<=0 | ACTION()==2 | COMPONENDO() )  { EXITSUB() }

      GOSUB SettaPosizioneFianco_30MM
   }

   Posiziona Blocco bl
   {
      GOSUB posa_blocco
      @X = X + 30
      @Z = 1

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

Elemento Colonna_30MM
{
   Descrizione = "Colonna 30mm"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   //Alias       NoCollision;OnChangedVar
   //NoCollisionCG solo da proc Ctrl_Collisioni_30MM
   Alias       OnChangedVar;NoCollisionCG

   Variabili
   {
      X       "Larghezza"         368  Menu ( Lar_30MM )    Utente ( 184-2208 )

      Y       "Altezza"           1104 Menu ( AltCol_30mm ) Utente ( 184-2944 )

      Z       "Profonditą"        384  Menu ( PrfRip_30MM ) Utente ( 136-384 )

      //Luca 20/04/2022
      BdmCollision_Local    "" 1

      VAR_RipianoAttrezzati "" 0

      num_ripiani "" 2

      Filler2 " " " " ShowAlways

      ConFondo     "Con Fondo"      1  Menu ( SiNo )
      ConCoperchio "Con Coperchio"  1  Menu ( SiNo )

      //Luca 20/07/2021
      FLAG_Weightless   "Fianco weightless"          0 Boolean
      FLAG_EtVoila      "Colonna EtVoila"            0 Boolean

      //Luca 16/09/2021
      FLAG_BinAnta_EV    "" 0

      COD_EREDITA        ""  "PRE;POST"

      CMP2_AZIONI        ""  "S"

      M4_A_MURO          ""  -1
      M4_CNT_LINK_MODE__ ""   0
      M4_CNT_MODE__      ""   1
      M4_CNT_MODE2__     ""   1

      Stendi_TOP_30MM    ""   1

      //M4_LINK2WALL_MODE__ "" 7

      M4_WALL_GRID__      ""  1

      M4_MIS             "" "X;Y;Z;Filler2;ConFondo;ConCoperchio"
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB AssElementi_30MM

      if( ACTION()==0 & $ATTIVA_DLL==1 )
      {
         if( VAR_RipianoAttrezzati == 1 )
         {
            VAR_SET_MENU(ATTUALE(),"Y","Alt_30MM" )
            HIDE_ON_EDIT2(ATTUALE(),"ConFondo",1)
            HIDE_ON_EDIT2(ATTUALE(),"ConCoperchio",1)
         }

         HIDE_ON_EDIT2(ATTUALE(),"FLAG_Weightless",$ATTIVA_DLL)
         HIDE_ON_EDIT2(ATTUALE(),"FLAG_EtVoila",$ATTIVA_DLL)
      }

      //Luca 20/07/2021
      if( FLAG_Weightless == 1 )
      {
         //Luca 21/04/2022 a terra o a soffitto
         //M4_LINK2WALL_MODE__ = 4
         M4_LINK2WALL_MODE__ = 5
         M4_CNT_LINK_MODE__ = 1

         ALIAS_ADD( ATTUALE() , "ColonnaWTL_30MM" )
      }

      GOSUB Stato_7
      FLAG_RADICE = $NO_RAD

      SpeRip = 30
      Z_Max  = 384

      DescEdit__ = MSG(1029)
   }

   PuntiNotevoli
   {
      AltPie  = 0
      Yt = Y + AltPie

      GOSUB punti_Yt

      vano_0_0 = base_0
      vano_0_0.y = AltPie

      vano_l_0 = X
      vano_p_0 = Z

      if( FLAG_EtVoila > 0  )
      {
         pnt_etvoila_sx_1 = base_1
         pnt_etvoila_sx_2 = alto_1

         pnt_etvoila_dx_1 = base_2
         pnt_etvoila_dx_2 = alto_2
      }

      //per stesura selezione
      punto_sx_top = alto_0         punto_sx_top_fro = alto_1
      punto_dx_top = alto_3         punto_dx_top_fro = alto_2
   }

   #include %path_bdm%\Tlib\orie.inc

   Procedura OnQueryBdmLocal
   {
      if( $query_type == 1 )
      {
         if( $M4_DragInfo_Mode == 0  )
         {
            FLAG_WeightlessRef = VAR_VAL($M4_DragInfo_Ref,"FLAG_Weightless")
            FLAG_EtVoilaRef = VAR_VAL($M4_DragInfo_Ref,"FLAG_EtVoila")

            //Luca 20/07/2021 aggancio filo alto
            if( FLAG_Weightless == 1
              | FLAG_EtVoila > 0 )
            {
               if( NOME($M4_DragInfo_Ref) == "Fianco_30MM" )
               {
                  lato = "S"
                  if( $M4_DragInfo_SxDx == 1 ) { lato = "D" }

                  cnt_new = CostruisciStrCnt(lato,"A","R",0,0,0,0)
                  $M4_DragInfo_Cnt = cnt_new
                  $QueryResult__ = 3
               }

               if( FLAG_Weightless == 1
                 & FLAG_WeightlessRef != 1 )
               {
                  DELETE_ME = 1
                  DELETE_ME_msg = STRCAT(MSG(1090),"\n",MSG(1284))
               }

               if( FLAG_EtVoila == 1
                 & FLAG_EtVoilaRef < 1 )
               {
                  DELETE_ME = 1
                  DELETE_ME_msg = STRCAT(MSG(1090),"\n",MSG(1284))
               }
            }
            else
            {
               if( FLAG_WeightlessRef == 1 | FLAG_EtVoilaRef == 1 )
               {
                  DELETE_ME = 1
                  DELETE_ME_msg = STRCAT(MSG(1090),"\n",MSG(1285))
               }
            }

            if( NOME($M4_DragInfo_Ref) == "Fianco_30MM" )
            {
               //Simone 26/04/2022
               wk_A_PARETE = VAR_VAL( $M4_DragInfo_Ref, "wk_A_PARETE" )

               if( VAR_VAL($M4_DragInfo_Ref,"ConPiedini") == 1 )
               {
                  lato = "S"
                  if( $M4_DragInfo_SxDx == 1 ) { lato = "D" }

                  offy = $L30_Alt_Pie

                  cnt_new = CostruisciStrCnt(lato,"B","R",0,offy,0,0)
                  $M4_DragInfo_Cnt = cnt_new
                  $QueryResult__ = 3
               }
            }
         }
      }

      if( $query_type == 2 )
      {
         $QueryResult__ = 0
         if( VAR_RipianoAttrezzati == 1 )
         {
            if( NOME($query_p1) == "Ripiano_30MM"
              | NOME($query_p1) == "RipianoVetro_30MM" )  { $QueryResult__ = 1 }

            if( FLAG_Weightless == 1 )
            {
               if( NOME($query_p1) == "SchienaWeightless_30MM"
                 | NOME($query_p1) == "SchienaVetroWTL_30MM"    )  { $QueryResult__ = 1 }
            }

            //Luca 21/04/2022
            if( wk_A_TERRA == 1 & wk_A_PARETE == 0 )
            {
               if( NOME($query_p1) == "SchienaWeightless_30MM" ) { $QueryResult__ = 1 }
            }
         }
      }

      //livelli inserimento muro
      if( $query_type==5 )
      {
         COMANDO2("LIVELLI CLEAR OnWall")

         liv_wall =  11

         liv_wall[1]  = 0
         liv_wall[2]  = 201
         liv_wall[3]  = 385
         liv_wall[4]  = 569
         liv_wall[5]  = 753
         liv_wall[6]  = 937
         liv_wall[7]  = 1121
         liv_wall[8]  = 1305
         liv_wall[9]  = 1489
         liv_wall[10] = 1673
         liv_wall[11] = 1857

         i = 1
         while ( i<=liv_wall )
         {
            COMANDO2( STRCAT("LIVELLI ADD OnWall ", STR(liv_wall[i]), " ", STR(liv_wall[i])) )
            i = i + 1
         }

         $QueryResult__ = 1
      }
   }

   Controlli
   {
      GOSUB CtrlComune

      GOSUB DefPuntiStendiSchiena_Colonna_30MM

      if( ACTION()==2 & $OnLoadOrder==0 & IS_VAR_FIXED(ATTUALE(),"Y")==0 & VAR_RipianoAttrezzati==0 ) { CHIEDI(ATTUALE(),"Y") }

      if( VAR_RipianoAttrezzati ) { ChiediMisureInserimento(ATTUALE()) }

      num_ripiani = 2
      if( Y >  552 ) { num_ripiani = 3 }
      if( Y >  920 ) { num_ripiani = 4 }
      if( Y > 1104 ) { num_ripiani = 5 }
      if( Y > 1472 ) { num_ripiani = 6 }
      if( Y > 1840 ) { num_ripiani = 7 }
      if( Y > 2208 ) { num_ripiani = 8 }
      if( Y > 2576 ) { num_ripiani = 9 }

      if( VAR_RipianoAttrezzati == 1 )  { num_ripiani = 2 }

      GOSUB CtrlPosizione_FiancoColWeightless_30MM

      if( ACTION()> 0 )
      {
         COMPONENTI2("wk_rip",ATTUALE(),"Ripiano_30MM")

         idx_bin_anta_ev = -1
         FLAG_BinAnta_EV = 0

         if( wk_rip > 0 )
         {
            SORT_POINT(base_0,"wk_rip","base_0")

            idx_bin_anta_ev = VAR_VAL(wk_rip[wk_rip],"idx_bin_anta_ev")
            FLAG_BinAnta_EV = VAR_VAL(wk_rip[wk_rip],"FLAG_BinAnta_EV")
         }
      }

      wk_A_TERRA  = 0
      wk_A_PARETE = 0
      //Simone 26/04/2022
      wk_dist = QUERY_WALL(ATTUALE(),"distance from face R")
      if( wk_dist == 0 )              { wk_A_PARETE = 1 }
      if( base_0.y <= $L30_Alt_Pie  ) { wk_A_TERRA = 1 }

      //Luca 21/04/2022
      if( wk_A_TERRA == 1 & wk_A_PARETE == 0 ) { ALIAS_ADD( ATTUALE() , "ColonnaTerra_30MM" ) }
      else                                     { ALIAS_REMOVE( ATTUALE() , "ColonnaTerra_30MM" ) }

      //Simone 27/04/2022
      X_Min = 184
      X_Max = 2944
      if( FLAG_Weightless == 1 ) { X_Max = 736 }

      //Luca 21/04/2022
      Z_min = 136
      if( FLAG_Weightless == 1
        | (wk_A_TERRA == 1 & wk_A_PARETE == 0) ) { Z_min = 248 }

      Z_Max  = 384

      if( ACTION() >= 0 )
      {
         VAR_SET_MENU(ATTUALE(),"Z",STRCAT("PrfRip_30MM( ",STR(Z_min),"-",STR(Z_Max)," )"))
         //Simone 27/04/2022
         VAR_SET_MENU(ATTUALE(),"X",STRCAT("Lar_30MM( ",STR(X_Min),"-",STR(X_Max)," )"))
      }
   }

   Procedura OnQueryBdmCollision
   {
      BdmCollision_Local_Result = 1

      GOSUB Exit_BdmCollision

      if( exit_collision ==1  )  { EXITSUB() }

      if( NOME(ATTUALE()) == "Colonna_30MM" )
      {
         $wk_i = 1
         while ( $wk_i <= $query_p1 )
         {
            if( NOME($query_p1[$wk_i]) == "Colonna_30MM" )
            {
               idx_colliso = $query_p1[$wk_i]
               BdmCollision_Local_Result = 0
               $wk_i = $query_p1
            }
            $wk_i = $wk_i + 1
         }
      }
   }

   Procedura PostAction2
   {
      GOSUB PostAction2_30MM

      //GOSUB PostAction2_FiancoWeightless_30MM
   }

   Procedura OnChangedVar
   {
      GOSUB OnChangedVar_Prof_30MM
   }

   Posiziona Ripiano_30MM rip1
   {
      nrip = 1
      GOSUB PosaRipiano_Colonna_30MM
   }
   Posiziona Ripiano_30MM rip2
   {
      nrip = 2
      GOSUB PosaRipiano_Colonna_30MM
   }
   Posiziona Ripiano_30MM rip3
   {
      nrip = 3
      GOSUB PosaRipiano_Colonna_30MM
   }
   Posiziona Ripiano_30MM rip4
   {
      nrip = 4
      GOSUB PosaRipiano_Colonna_30MM
   }

   Posiziona Ripiano_30MM rip5
   {
      nrip = 5
      GOSUB PosaRipiano_Colonna_30MM
   }
   Posiziona Ripiano_30MM rip6
   {
      nrip = 6
      GOSUB PosaRipiano_Colonna_30MM
   }
   Posiziona Ripiano_30MM rip7
   {
      nrip = 7
      GOSUB PosaRipiano_Colonna_30MM
   }
   Posiziona Ripiano_30MM rip8
   {
      nrip = 8
      GOSUB PosaRipiano_Colonna_30MM
   }
   Posiziona Ripiano_30MM rip9
   {
      nrip = 9
      GOSUB PosaRipiano_Colonna_30MM
   }

   Posiziona _cont_per_near cn_up
   {
      @base_0.x = base_0.x + 2
      @base_0.y = alto_0.y - 1
      @base_0.z = base_0.z + 10

      @X = X - 4
      @Y = 2
      @Z = Z - 20

      idx_cnear_up = ATTUALE()
   }

   Posiziona _cont_per_near cn_sx
   {
      @base_0.x = base_0.x - 30
      @base_0.y = base_0.y + 15
      @base_0.z = base_0.z + 15

      @X = 35
      @Y = Y - 30
      @Z = Z - 30

      idx_cnear_sx = ATTUALE()
   }

   Posiziona _cont_per_near cn_dx
   {
      @base_0.x = base_0.x + X - 5
      @base_0.y = base_0.y + 15
      @base_0.z = base_0.z + 15

      @X = 35
      @Y = Y - 30
      @Z = Z - 30

      idx_cnear_dx = ATTUALE()
   }

   // FT 23/07/2021 - per debug/visualizzazione
   // ingombro colonna
   Posiziona _vedi_schiena ls
   {
      @escluso = 1
      @base_0 = base_0
      @X = X
      @Y = Y
      @SimmetriaX = 1
   }
}

Elemento Fianco_30MM
{
   Descrizione = "Fianco 30mm"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   //Luca 16/06/2022
   //TSTP_NoQuota_PROSPETTI_LAR --> non quota in larghezza
   Alias       CamInciso;CamIncidente;OnChangedVar;Fia30MM
   Stendibile  Contenitore_30MM

   Variabili
   {
      #include %path_bdm%\var_db.inc

      genera_disegno_collo__ "Variabile per la gestione delle bindelle" 1

      Y       "Altezza"           368 Menu ( Alt_30MM ) Utente ( 184-2944 )
      Yt      "Altezza c/piedini" 368

      Z       "Profonditą"        248 Menu ( PrfFia_30MM ) Utente ( 136-384 )

      X       "Larghezza"           30 ShowAlways

      //VAR_FixMuro       "Fissato a muro"      0 Menu ( SiNo )
      //VAR_FixTerra      "Solo a terra"        0 Menu ( SiNo )

      idx_fia_up  "" -1
      idx_fia_dw  "" -1
      idx_sch_sx  "" -1
      idx_sch_dx  "" -1

      ConPiedini         "" 0
      ConAttaccaglie     "" 0

      FLAG_CompostoGEN  "Modalitą composto GENERICO" 1 Boolean

      FLAG_Weightless   "Fianco weightless"          0 Boolean
      //Luca 13/09/2021
      //1 - fianco etvoila std
      //2 - fianco etvoila esterno
      FLAG_EtVoila      "Fianco Et Voila"            0 Utente ( )
      ConTessuto        "Fianco con tessuto"         0
      VersoFianco       "Verso Fianco"              -1 Menu ( DXSX )
      ConTelo           ""                           0

      COD_EREDITA        ""  "PRE;POST"

      CMP2_AZIONI        ""  "S"

      M4_A_MURO          ""  -1
      M4_CNT_LINK_MODE__ ""   0
      M4_CNT_MODE__      ""   1
      M4_CNT_MODE2__     ""   1

      //GESTIONE STENDI
      M4_DIALOG "" 32
      M4_DLINK_MODE__ "rimane steso"  0
      M4_STENDI_RIPETIZIONI      "" 1
      //M4_STENDI_CON_INTERRUZIONI "" 1
      M4_STENDI_BREAK_AND_RESTART__ "" 1

      Stendi_PosRipiano  "Posizione Ripiano 30MM" -1 Menu ( PosRip30MM )

      M4_MIS             "" "X;Y;Z;FillerM2G;VersoFianco"

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

      //idenifico possibilitą di stesura top
      Stendi_TOP_30MM         "" 1

      //Luca 16/03/2021
      BdmCollision_Local "" 1

      FillerM2G          " " "" ShowAlways

      M4_WALL_GRID__      ""  1

      NFC_Categoria ""  "LIVING"
      NFC_Priorita  ""  999999

      //VARIABILI TECNICHE
      VT_GV_3630  "Numero giunzioni vert. 368-30MM" 0

      #ifdef TEC
         VAR_Regola_Elements "Config.Elements" "" Utente ( )
      #endif
      #ifndef TEC
         VAR_Regola_Elements "" ""
      #endif
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB AssElementi_30MM

      //Luca 23/02/2021
      if( ACTION() > 0 )
      {
         y_min = 184   y_max = 2944
         if( FLAG_Weightless > 0 ) {               y_max = 2576 }
         if( FLAG_EtVoila == 2 )   { y_min = 368   y_max = 2700 }
         if( Z < 248  )            {               y_max = 1104 }

         VAR_SET_MENU(ATTUALE(),"Y",STRCAT("Alt_30MM( ",STR(y_min),"-",STR(y_max)," )"))

         //Simone 06/06/2022 - Per gestione speciali
         if( VAR_VAL(ATTUALE(),"FLAG_Speciale") != 1 )
         {
            if( Z < 248 & Y > 1104 )  { CHIEDI(ATTUALE(),"Y") }
         }

         //Luca 13/09/2021 nota 47973 mantis 25427
         //I fianchi per et voilą hanno profonditą std 248 e 384, con riduzione a prof. minima 175 - per TEC invece fino a 136'
         z_min = 136
      #ifndef TEC
         if( FLAG_EtVoila == 1 ) { z_min = 175 }
      #endif

         //Luca 21/04/2022
         if( FLAG_Weightless == 1
           | VAR_VAL(ATTUALE(),"wk_A_TERRA")==1 ) { z_min = 248 }

         z_max = 384

         VAR_SET_MENU(ATTUALE(),"Z",STRCAT("PrfFia_30MM( ",STR(z_min),"-",STR(z_max)," )"))

         if( FLAG_EtVoila == 2 )
         {
            z_min = 299
            z_max = 435
            VAR_SET_MENU(ATTUALE(),"Z","PrfFiaEV_30MM")
         }

         HIDE_ON_EDIT2(ATTUALE(),"FLAG_EtVoila",$ATTIVA_DLL)
         HIDE_ON_EDIT2(ATTUALE(),"FLAG_Weightless",$ATTIVA_DLL)

         //Luca 13/09/2021
         HIDE_ON_EDIT2(ATTUALE(),"VersoFianco", 1 - ConTessuto)
      }

      //Luca 20/07/2021
      if( FLAG_Weightless == 1 )
      {
         M4_CNT_LINK_MODE__ = 1
         M4_LINK2WALL_MODE__ = 4
      }

      //LZ 12/04/2021
      STP_Bollina = 1
      STP_Bollina_Cat = "C028"
   }

   PuntiNotevoli
   {
      Yt = Y + ConPiedini*$L30_Alt_Pie

      GOSUB punti_Yt

      GOSUB DefPuntiSnapPasso184_30MM

      GOSUB DefPuntiStendiSchiena_30MM

      vano_0_0 = base_0
      vano_l_0 = Y
      vano_p_0 = Z

      //per stesura selezione
      punto_sx_top = alto_0         punto_sx_top_fro = alto_1
      punto_dx_top = alto_3         punto_dx_top_fro = alto_2

      //Luca 17/02/2021
      punto_sx_alto_top_30MM = alto_0
      punto_dx_alto_top_30MM = alto_3

      punto_sx_basso_top_30MM = base_0
      punto_dx_basso_top_30MM = base_3

      base_0_np = base_0      base_0_np.y = base_0.y + ConPiedini*$L30_Alt_Pie
      base_1_np = base_1      base_1_np.y = base_1.y + ConPiedini*$L30_Alt_Pie
      base_2_np = base_2      base_2_np.y = base_2.y + ConPiedini*$L30_Alt_Pie
      base_3_np = base_3      base_3_np.y = base_3.y + ConPiedini*$L30_Alt_Pie

      //Simone 24/10/2022
      base_0_ctrl = base_0    base_0_ctrl.z = base_0.z - 0.01
      base_1_ctrl = base_1    base_1_ctrl.z = base_1.z + 0.01

      //if( FLAG_EtVoila == 1 )
      if( FLAG_EtVoila > 0 )
      {
         pnt_etvoila_sx_1 = base_1_np
         pnt_etvoila_sx_2 = alto_1

         pnt_etvoila_dx_1 = base_2_np
         pnt_etvoila_dx_2 = alto_2

         if( FLAG_EtVoila == 2 )
         {
            //Luca 25/11/2021 visto con Simone
            //punto_sx_top_fro.z = alto_1.z + 20
            //punto_dx_top_fro.z = alto_2.z + 20
            punto_sx_top_fro.z = alto_1.z + 19
            punto_dx_top_fro.z = alto_2.z + 19

            //Simone 23/01/2023 - Per gestire correttamente il caso di telo steso tra un fianco e un ripiano
            pnt_etvoila_sx_1.z = base_1_np.z - 48
            pnt_etvoila_sx_2.z = alto_1.z - 48

            pnt_etvoila_dx_1.z = base_2_np.z - 48
            pnt_etvoila_dx_2.z = alto_2.z - 48
         }
      }

      STP_Bollina_Pnt = [X/2 , 30 , Z + 30 ]
   }

   #include %path_bdm%\Tlib\orie.inc

   Procedura OnQueryBdmLocal
   {
      GOSUB OnQueryBdmLocal_30MM

      if( $query_type == 2 )
      {
         $QueryResult__ = 0

         if( NOME($query_p1) == "Passacavi_368" ) { $QueryResult__ = 1 }

         NEAR_GLOBALE2("teca",ATTUALE(),1,"Teca_30MM")
         if( teca > 0 & NOME($query_p1) == "Passacavi_368" ) { $QueryResult__ = 0 }
      }

      if( $query_type == 13 )
      {
         $QueryResult__ = 1
         $POPUP_MENU = 0
         AddPopupMenu("Scegli misure")
      }

      if( $query_type == 14 )
      {
         $QueryResult__ = 1
         // scelta del 1° valore del popup menu
         if( $query_p2 == 0 ) { DlgGetDimensioni(ATTUALE(),"YZX" , "Macro" ) }
      }
   }

   Procedura OnPcfStore
   {
      GOSUB OnPcfStore_Componenti_Elements
   }

   Controlli
   {
      GOSUB CtrlComune

      ChiediMisureInserimento(ATTUALE())

      GOSUB CtrlFianco_30MM

      GOSUB ContaGiunzioni_368

      GOSUB CtrlPosizione_FiancoColWeightless_30MM

      GOSUB GetRegola_Componenti_Elements
   }

   Gestionale
   {
      GOSUB GestComune

      GOSUB GestElementi_30MM

      GOSUB Set_Gest_C003_Fianco_30MM

      //rob_pec 11/02/2021
      GOSUB Set_Gest_C087_Fianco_30MM

      GOSUB Set_Gest_C008_Fianco_30MM

      #ifndef TEC;AZI
      if( VAR_EXIST(ATTUALE(),"GEST_C088") == 1 ) { ORD_FILTRO_C088 = "FR009;FR010" }
      #endif

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   //gestione stendi
   Procedura Stendi
   {
      GOSUB Stendi_Elemento_30MM
   }

   Procedura Notifica
   {
      GOSUB Notifica_Elemento_30MM
   }

   Procedura OnTabEredita
   {
      if( TABER_REGOLA == "PRE" )
      {
         GOSUB PCF_Elements_RegoleEredita

         GOSUB Set_Gest_C003_Fianco_30MM

         //rob_pec 11/02/2021
         GOSUB Set_Gest_C087_Fianco_30MM

         //Luca 22/03/2021
         GOSUB Set_Gest_C008_Fianco_30MM
      }

      if( TABER_REGOLA == "POST" )
      {
         if( FLAG_EtVoila == 2 )
         {
            ConTessuto = 0
            if( VAR_VAL_STR(ATTUALE(),"GEST_C049") == "FE002" ) { ConTessuto = 1 }
         }
      }

      //GOSUB OnTabEredita_30MM
   }

   Procedura PostAction2
   {
      GOSUB PostAction2_30MM

      //GOSUB PostAction2_FiancoWeightless_30MM
      //GOSUB CtrlPosizione_FiancoColWeightless_30MM

      if( $ATTIVA_DLL == 1 )  { EXITSUB() }

      if( VAR_EXIST(ATTUALE(),"M4_FIX_Y") ) { DEL_VAR(ATTUALE(),"M4_FIX_Y") }
   }

   Procedura OnChangedVar
   {
      GOSUB OnChangedVar_Prof_30MM

      if( $ChangedIdx!=ATTUALE() ) { EXITSUB() }

      ////Luca 20/07/2021
      //if( $ChangedVar == "Y" )
      //{
      //   GOSUB PostAction2_FiancoWeightless_30MM
      //}
   }

   Procedura PostGestDllValida
   {
      if( $OnRigenera | $OnLoadOrder | ACTION()<=0 ) { EXITSUB() }

      if( FLAG_Weightless == 1 )
      {
         COMANDO(STRCAT("RICALCOLA ",STR(ATTUALE())," no_agganciati //PostGestDllValida ",NOME(ATTUALE())))
      }
   }

   Procedura Offset
   {
      GOSUB Offset_Fianco_30MM

      //Luca 04/03/2021
      GOSUB CtrlVincolaAMuro_30MM
   }

   Procedura OnQueryBdmCollision
   {
      GOSUB BdmCollision_30MM
   }

   Posiziona Cuc_piedino rt
   {
      @escluso = 1 - ConPiedini

      Cuc_Dia_Pie = 15
      GOSUB PosaPiedino
      @Y = $L30_Alt_Pie

      @base_0.x = base_0.x + X/2 - @X/2
      @base_0.z = base_0.z + 52 - @Z/2
      if( VAR_VAL(idx_pdr,"wk_A_PARETE") == 0 & VAR_VAL(idx_pdr,"wk_A_TERRA") == 1 ) { @base_0.z = base_0.z + 30 - @Z/2 }

      @rag1 = Cuc_Dia_Pie
   }

   Posiziona Cuc_piedino fr
   {
      @escluso = 1 - ConPiedini

      GOSUB PosaPiedino
      @Y = $L30_Alt_Pie

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

      @rag1 = Cuc_Dia_Pie
   }

   Posiziona Blocco bl
   {
      @escluso = 0
      if( ConTessuto )  { @escluso = 1 }

      GOSUB posa_blocco
      if( ConPiedini == 1 ) { @base_0.y = base_0.y + $L30_Alt_Pie }

      if( ConTessuto )  { @Z = Z - 2 }

      GOSUB rivestimento
   }

   //Luca 11/10/2021
   Posiziona FiancoXTessuto_EtVoila ftes
   {
      @escluso = 1
      if( ConTessuto )  { @escluso = 0 }

      GOSUB posa_blocco
      if( ConPiedini == 1 ) { @base_0.y = base_0.y + $L30_Alt_Pie }

      //@Z = Z - 2
   }

   //Luca 13/09/2021
   //Posiziona Blocco tes
   //Posiziona _ysweep_graf_Telo_Fianco_EtVoila tes
   //{
   //   @escluso = 1
   //   if( ConTessuto )  { @escluso = 0 }
   //
   //   GOSUB posa_blocco
   //
   //   @Spe = 2
   //   @X = X +  @Spe
   //   @base_0.x = base_0.x - @Spe
   //   if( VersoFianco > 0 ) { @base_0.x = base_0.x }
   //
   //   //@X = X
   //   //@base_0.x = base_0.x - @X
   //   //if( VersoFianco > 0 ) { @base_0.x = base_3.x  }
   //   if( ConPiedini == 1 ) { @base_0.y = base_0.y + $L30_Alt_Pie }
   //
   //   @Verso = VersoFianco
   //
   //   FIN_var = "C104"
   //   GOSUB rivestimento
   //
   //   //ripristino
   //   FIN_var = "C028"
   //}

   Posiziona TessutoFianco_EtVoila tes
   {
      @escluso = 1
      if( ConTessuto )  { @escluso = 0 }

      Spe_Tessuto = 3

      GOSUB posa_blocco

      @Spe = 3
      @X = X +  @Spe

      if( ConPiedini == 1 ) { @base_0.y = base_0.y + $L30_Alt_Pie }

      if( VersoFianco < 0 )  { @base_0.x = base_0.x - @Spe }

      //@base_0.y = base_0.y + Alt_Pie
      //@Z = Zt

      @Verso = VersoFianco
      @Spe_Tessuto = Spe_Tessuto

      @FLAG_30MM = 1
   }

   #ifdef TEC;AZI
   Posiziona G368_GruppoLavorazione G368SX
   {
      GOSUB G368_PosaGrLavorazione
      if( ConPiedini == 1 ) { @base_0.y = base_0.y + $L30_Alt_Pie }

      @X = X/2 - $M368_Giu_Sporgenza

      @Lato = "SX"
   }

   Posiziona G368_GruppoLavorazione G368DX
   {
      GOSUB G368_PosaGrLavorazione

      @X = X/2 - $M368_Giu_Sporgenza

      @base_0.x = base_3.x - @X
      if( ConPiedini == 1 ) { @base_0.y = base_0.y + $L30_Alt_Pie }

      @Lato = "DX"
   }

   Posiziona G368_ContCollisioni ginf
   {
      @Y = 107.5
      @Z = 86
      @base_0.x = base_0.x
      @base_0.y = base_0.y
      @base_0.z = base_0.z
      @Fianco30MM_inf = 1
   }

   Posiziona G368_ContCollisioni gsup
   {
      @Y = 175.5
      @Z = 93.5
      @base_0.x = base_0.x
      @base_0.y = base_0.y + Y - @Y
      @base_0.z = base_0.z
      @Fianco30MM_sup = 1
   }
   #endif

   //aree da evitare per passacavi, non ci sono specifiche che le individuino con precisione
   Posiziona PCV_ContCollisioni_368 pcvc_r
   {
      limite_dw = 40
      limite_up = 35
      limite_rt = 25
      limite_fr = 10

      @base_0.x = base_0.x - 5
      @base_0.y = base_0.y + $L30_Alt_Pie*ConPiedini
      @base_0.z = base_0.z
      @X = X + 10
      @Y = Y
      @Z = limite_rt
   }

   Posiziona PCV_ContCollisioni_368 pcvc_f
   {
      @base_0.x = base_0.x - 5
      @base_0.y = base_0.y + $L30_Alt_Pie*ConPiedini
      @base_0.z = base_0.z + Z - limite_fr
      @X = X + 10
      @Y = Y
      @Z = limite_fr
   }

   Posiziona PCV_ContCollisioni_368 pcvc_dw
   {
      @base_0.x = base_0.x - 5
      @base_0.y = base_0.y + $L30_Alt_Pie*ConPiedini
      @base_0.z = base_0.z + limite_rt
      @X = X + 10
      @Y = limite_dw
      @Z = Z - limite_rt - limite_fr
   }

   Posiziona PCV_ContCollisioni_368 pcvc_up
   {
      @base_0.x = base_0.x - 5
      @base_0.y = base_0.y + Y - limite_up + $L30_Alt_Pie*ConPiedini
      @base_0.z = base_0.z + limite_rt
      @X = X + 5
      @Y = limite_up
      @Z = Z - limite_rt - limite_fr
   }

   //agganci
   Posiziona PCV_ContCollisioni_368 pcv_aup
   {
      limite_att_up_y = 160
      limite_att_up_z = 120

      @base_0.x = base_0.x - 5
      @base_0.y = base_0.y + Y - limite_up - limite_att_up_y + $L30_Alt_Pie*ConPiedini
      @base_0.z = base_0.z
      @X = X + 5
      @Y = limite_att_up_y
      @Z = limite_att_up_z
   }

   Posiziona PCV_ContCollisioni_368 pcv_adw
   {
      @escluso = 1
      if( Y >= 400 ) { @escluso = 0 }

      limite_att_inf_y = 100
      limite_att_inf_z = 80

      @base_0.x = base_0.x - 5
      @base_0.y = base_0.y + $L30_Alt_Pie*ConPiedini
      @base_0.z = base_0.z
      @X = X + 5
      @Y = limite_att_inf_y
      @Z = limite_att_inf_z
      if( ConPiedini == 1 ) { @Z = Z }
   }

   #include %path_bdm%\Linea30mm_cont.inc
   //#include %path_bdm%\Linea30mm_cont_DBG.inc
}

Elemento FiancoXTessuto_EtVoila
{
   Descrizione = "tessuto Fianco"
   Code        = ARM20
   Gruppo      = "ARM20"
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      #include %path_bdm%\var_db.inc

      Z       "Profonditą"      368
      Y       "Altezza"         366
      X       "Spessore"          4

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

      RADICE      "" "FTEV3"

      M4_MIS      "" "Filler*;Z"
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Stato_8
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Controlli
   {
      GOSUB CtrlEscluso
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune
      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }

   Posiziona Blocco bl
   {
      GOSUB posa_blocco

      @Z = Z - 3

      GOSUB rivestimento
   }
}

Elemento Ripiano_30MM
{
   Descrizione = "Ripiano 30mm"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   //Luca 16/06/2022
   //TSTP_NoQuota_PROSPETTI_A0  --> quota solo base_0
   //TSTP_NoQuota_PROSPETTI_ALT --> non quota in altezza
   Alias       CamInciso;CamIncidente;Rip30MM;OnChangedVar
   Altimetro    Auto
   Attrezzabile Colonna_30MM

   Variabili
   {
      #include %path_bdm%\var_db.inc

      genera_disegno_collo__ "Variabile per la gestione delle bindelle" 1

      X       "Larghezza"         368 Menu ( Lar_30MM ) Utente ( 184-2208 )

      Z       "Profonditą"        248 Menu ( Prf_30MM ) Utente ( 136-384 )

      Y       "Spessore"           30 ShowAlways

      //VAR_FixMuro       "Fissato a muro"      0 Menu ( SiNo )
      //VAR_FixTerra      "Solo a terra"        0 Menu ( SiNo )

      //solo per ripiani attrezzati
      VAR_PosRipiano       "Posizione ripiano"  0 Menu ( DXCNSX )

      // 23/07/2021 - Passato dal padre
      VAR_UsoRipianoStrut  "Uso Ripiano se strutturale"   "STAND-ALONE"

      // 0 -- MENSOLA
      // 1 -- RIPIANO
      // 2 -- RIPIANO TERMINALE
      // 3 -- RIPIANO SCHIENALE
      TipoRipiano        "" 1 SaveAlways
      TipoRipianoStr     "" "MENSOLA"

      //in caso di ripiano schienale,
      //verifico la tipologia di schienale retro
      TipoRipianoSch     "" "LACCATO"

      FLAG_RipConModular   "Ripiano con agganci modular"          0 Menu ( SiNo )
      FLAG_AggTerm         "Lavorazione per aggancio terminale"   0 Menu ( SiNo )

      FLAG_BinAnta_EV      "Presenza del binario Anta EtVoila" 0 SaveAlways

      //PER RIPIANO TERMINALE
      PosizioneRip        "" 0 SaveAlways

      RientroZ_RipianoSch "" 0 SaveAlways

      ConSupporto         "" 0
      ConBarraTV          "" 0

      //Luca 13/09/2021
      ConSupportoBinario  "" 0

      //RipTerminale       "" 0
      //RipSchienale       "" 0

      idx_fia_sx         "" -1
      idx_fia_dx         "" -1
      idx_368_sx         "" -1
      idx_368_dx         "" -1
      idx_sch_rt         "" -1

      idx_rip_sx         "" -1
      idx_rip_dx         "" -1

      //Simone
      idx_rip_fr         "" -1
      idx_rip_rt         "" -1

      idx_rip_ang_sx     "" -1
      idx_rip_ang_dx     "" -1

      idx_bin_anta_ev    "" -1

      //schienali sopra e sotto per controllo inserimento led
      idx_sch_up         "" -1
      idx_sch_dw         "" -1

      idx_led_up         "" -1
      idx_led_dw         "" -1

      idx_tec_up         "" -1
      idx_tec_dw         "" -1

      idx_ripV_up        "" -1
      idx_ripV_dw        "" -1

      ConAttaccaglie     "" 0

      ConTriade          "" 0

      VediLimiti_PCV     "" 0

      idx_cnear_sx   "" -1
      idx_cnear_dx   "" -1
      idx_cnear_up   "" -1
      idx_cnear_dw   "" -1
      idx_cnear_fr   "" -1
      idx_cnear_rt   "" -1
      idx_cnear_rsch "" -1

      //LZ 09/09/2021
      VT_CF30_368    "Numero contenitori 368 a lato" 0

      FLAG_CompostoGEN  "Modalitą composto GENERICO" 1 Boolean
      FLAG_EtVoila      "Ripiano 30mm EtVoila"       0 Boolean Implicit

      //idenifico possibilitą di stesura top
      Stendi_TOP_30MM         "" 1

      FLAG_Composto "" 0

      VARGEST_AGGIUNTIVE "" "FLAG_RipConModular"

      COD_EREDITA        ""  "PRE;POST"

      CMP2_AZIONI        ""  "S"

      M4_A_MURO          ""   -1
      M4_CNT_LINK_MODE__ ""   0

      M4_CNT_MODE__      ""   1
      M4_CNT_MODE2__     ""   1

      //GESTIONE STENDI
      M4_DIALOG "" 32
      M4_DLINK_MODE__ "rimane steso"  0
      M4_STENDI_RIPETIZIONI         "" 1
      M4_STENDI_BREAK_AND_RESTART__ "" 1

      Stendi_PosRipiano  "Posizione Ripiano 30MM" 0 Menu ( PosRip30MM )

      M4_MIS             "" "X;Y;Z;FillerM2G;VAR_PosRipiano"

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

      //Luca 16/03/2021
      BdmCollision_Local "" 1

      FillerM2G          " " "" ShowAlways

      M4_WALL_GRID__      ""  1

      //VARIABILI PER GESTIONE NFC
      NFC_Attiva    ""  0 SaveAlways
      NFC_Categoria ""  "LIVING"
      NFC_Priorita  ""  20
      NFC_Point     ""  [0,0,0]

      //GESTIONE NFC
      VT_NFC         "NFC"  0

      //GESTIONE CARB
      VT_CARB        "CARB" ""
      CARB_Attiva      ""    0  SaveAlways

      #ifdef TEC
         VAR_Regola_Elements "Config.Elements" "" Utente ( )
      #endif
      #ifndef TEC
         VAR_Regola_Elements "" ""
      #endif
   }

   Assegnazioni
   {
      GOSUB AssComune

      X_Max = 2944

      GOSUB AssElementi_30MM

      GOSUB DecodificaTipoRipiano_30MM

      HIDE_ON_EDIT2(ATTUALE(),"VAR_PosRipiano",1)
      if( ins2_att == $ins_attrezzato ) { HIDE_ON_EDIT2(ATTUALE(),"VAR_PosRipiano",0) }

      //Luca 25/03/2021
      //mantis 24852: 30MM - Ripiano terminale con doppia lavorazione modular
      #ifdef AGE;RIV
         HIDE_ON_EDIT2(ATTUALE(),"FLAG_RipConModular",1)
         HIDE_ON_EDIT2(ATTUALE(),"FLAG_AggTerm",1)
      #endif

      #ifndef AGE;RIV
         if( TipoRipianoStr == "RIPIANO"
           | TipoRipianoStr == "RIPIANO_TER" ) { HIDE_ON_EDIT2(ATTUALE(),"FLAG_RipConModular",0) }
         else                                  { HIDE_ON_EDIT2(ATTUALE(),"FLAG_RipConModular",1) }

         HIDE_ON_EDIT2(ATTUALE(),"FLAG_AggTerm",0)
      #endif

      //Luca 14/09/2021
      if( ACTION()==0 & $ATTIVA_DLL==1 )
      {
         HIDE_ON_EDIT2(ATTUALE(),"FLAG_EtVoila",$ATTIVA_DLL)
      }

      //Luca 06/04/2021
      VT_NFC = NFC_Attiva

      //Simone 28/06/2021
      VT_CARB = CARB_Attiva

      //LZ 12/04/2021
      STP_Bollina = 1
      STP_Bollina_Cat = "C028"
   }

   PuntiNotevoli
   {
      GOSUB punti

      GOSUB DefPuntiSnapPasso184_30MM

      GOSUB DefPuntiStendiSchiena_30MM

      //Luca 17/02/2021
      vano_0_0 = base_0
      vano_l_0 = X
      vano_p_0 = Z

      //per stesura selezione
      punto_sx_top = alto_0         punto_sx_top_fro = alto_1
      punto_dx_top = alto_3         punto_dx_top_fro = alto_2

      //punti per controllo posizionament teca
      punto_sx_ctrl_teca = base_0  punto_sx_teca.x = base_0.x - 2
      punto_dx_ctrl_teca = base_3  punto_dx_teca.x = base_3.x + 2

      //per stesura punti
      punto_sx_alto_top_30MM = alto_0
      punto_dx_alto_top_30MM = alto_3

      punto_sx_basso_top_30MM = base_0
      punto_dx_basso_top_30MM = base_3


      if( FLAG_EtVoila == 1 )
      {
         pnt_etvoila_sx_1 = base_1
         pnt_etvoila_sx_2 = alto_1

         pnt_etvoila_dx_1 = base_2
         pnt_etvoila_dx_2 = alto_2

         //punto_sx_top_fro.z = alto_1.z + 20
         //punto_dx_top_fro.z = alto_2.z + 20
      }

      NFC_Point = base_2

      STP_Bollina_Pnt = [X/2 , Y/2 - 56.5 , Z + 30 ]
   }
   #include %path_bdm%\Tlib\orie.inc

   Procedura OnSetupLivelli
   {
      idx_ref  = $__lev_ref__
      vano_ref = $__lev_vano__

      annulla_ins = 0
      DEL_VAR(idx_att,"liv2add*")
      liv2add    = 0

      step = 184
      liv_att = 0

      liv_max = VAR_VAL(idx_ref,"Y") +20

      while ( liv_att < liv_max )
      {
         AddItem2Array(ATTUALE(),"liv2add",liv_att,"")
         liv_att = liv_att + step
      }

      ArrayCopy(ATTUALE(),"liv2add","liv2addscr")
      GOSUB livelli_add2
   }

   Procedura OnQueryBdmLocal
   {
      GOSUB OnQueryBdmLocal_30MM

      if( $query_type == 2 )
      {
         $QueryResult__ = 0

         if( NOME($query_p1) == "RigaOrdine_Attrezzata" )
         {
            $QueryResult__ = 1
            EXITSUB()
         }

         if( NOME($query_p1) == "Faretto_368"
           | NOME($query_p1) == "Led_30MM"
           | NOME($query_p1) == "Passacavi_368"
           | NOME($query_p1) == "BarraRipianoPTV_30MM"
           | NOME($query_p1) == "SupportoRipiano_30MM"
            //Luca 04/05/2021
           | NOME($query_p1) == "AccessorioBagno"
           //| NOME($query_p1) == "Teca3lati_30MM"
           | NOME($query_p1) == "Teca_30MM" ) { $QueryResult__ = 1 }

         COMPONENTI2("pcv",ATTUALE(),"Passacavi_368")
         if( pcv > 0 & NOME($query_p1) == "Teca_30MM" ) { $QueryResult__ = 0 }

         COMPONENTI2("teca",ATTUALE(),"Teca_30MM")
         if( teca > 0 & NOME($query_p1) == "Passacavi_368" ) { $QueryResult__ = 0 }

         //Luca 14/09/2021
         if( NOME($query_p1) == "Led_30MM" & ConSupportoBinario ) { $QueryResult__ = 0 }
      }

      if( $query_type == 13 )
      {
         $QueryResult__ = 1
         $POPUP_MENU = 0
         AddPopupMenu("Scegli misure")
      }

      if( $query_type == 14 )
      {
         $QueryResult__ = 1
         // scelta del 1° valore del popup menu
         if( $query_p2 == 0 ) { DlgGetDimensioni(ATTUALE(),"XZY" , "Macro" ) }
      }
   }

   Attrezza
   {
      idx_ref = @idx_att

      if( IS_VAR_FIXED(ATTUALE(),"X") == 0 )  { X = $larghezza }
      if( IS_VAR_FIXED(ATTUALE(),"Z") == 0 )  { Z = $profondita }

      base_0 = $vano_0
      base_0.y = base_0.y + $livello

      base_0.x = $vano_0.x
      if( VAR_PosRipiano == 0 )  { base_0.x = $vano_0.x + $larghezza/2 - X/2 }
      if( VAR_PosRipiano  > 0 )  { base_0.x = $vano_0.x + $larghezza   - X }

      if( TipoRipianoStr == "RIPIANO_SCH" )
      {
         if( IS_VAR_FIXED(ATTUALE(),"Z") == 0 )  { Z = $profondita - RientroZ_RipianoSch }
         base_0.z = @base_0.z + RientroZ_RipianoSch
      }
   }

   Procedura OnPcfStore
   {
      GOSUB OnPcfStore_Componenti_Elements
   }

   Controlli
   {
      GOSUB CtrlEscluso
      GOSUB CtrlComune

      if( ins2_att == $ins2_posizionato ) { ChiediMisureInserimento(ATTUALE()) }

      GOSUB CtrlRipiano_30MM

      GOSUB GetRegola_Componenti_Elements
   }

   Gestionale
   {
      GOSUB GestComune

      GOSUB GestElementi_30MM

      GOSUB Set_Gest_C003_Ripiano_30MM

      //Luca 25/03/2021
      GOSUB Set_Gest_C008_Ripiano_30MM
      GOSUB Set_Gest_C009_Ripiano_30MM

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   //gestione stendi
   Procedura Stendi
   {
      GOSUB Stendi_Elemento_30MM
   }

   Procedura Notifica
   {
      GOSUB Notifica_Elemento_30MM
   }

   Procedura OnTabEredita
   {
      if( TABER_REGOLA == "PRE" )
      {
         GOSUB PCF_Elements_RegoleEredita

         //Simone 06/05/2022
         GOSUB Set_Gest_C003_Ripiano_30MM

         GOSUB Set_Gest_C008_Ripiano_30MM
      }
      //GOSUB OnTabEredita_30MM
   }

   Procedura PostAction2
   {
      GOSUB PostAction2_30MM

      if( $ATTIVA_DLL==1 & $OnLoadOrder == 0 )
      {
         if( VAR_EXIST(ATTUALE(),"M4_FIX_Y") ) { DEL_VAR(ATTUALE(),"M4_FIX_Y") }
      }
   }

   Procedura PostGestDllValida
   {
      if( $OnRigenera | $OnLoadOrder | ACTION()<=0 ) { EXITSUB() }

      COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE())," //PostGestDllValida ",NOME(ATTUALE())))
   }

   Procedura Offset
   {
      GOSUB Offset_Ripiano_30MM

      //Luca 04/03/2021
      GOSUB CtrlVincolaAMuro_30MM
   }

   Procedura OnChangedVar
   {
      GOSUB OnChangedVar_Prof_30MM
   }

   Procedura OnQueryBdmCollision
   {
      GOSUB BdmCollision_30MM
   }

   Procedura cancella
   {
   }

   Posiziona FerramentaRipiano_30MM fer
   {
      #ifdef AGE;RIV
         @escluso = 1
      #endif

      GOSUB posa_blocco
   }

   Posiziona Blocco bl
   {
      GOSUB posa_blocco
      GOSUB rivestimento
   }

   Posiziona SupportoRipiano_30MM spv
   {
      @escluso = 1 - ConSupporto
      @base_0.x = base_0.x + X/2 - @X/2
      //@base_0.y = base_0.y + Y/2 - @Y/2
      @base_0.y = base_0.y
      @base_0.z = base_0.z

      @NO_GEST = 1
   }

   Posiziona SupportoRipianoBinario_30MM spvetv
   {
      @escluso = 1 - ConSupportoBinario

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

   Posiziona BarraRipianoPTV_30MM bar
   {
      @escluso = 1 - ConBarraTV
      @base_0.x = base_0.x
      @base_0.y = base_0.y - 1
      @base_0.z = base_0.z - 1
      @X = X
      @NO_GEST = 1
   }

   #include %path_bdm%\Linea30mm_cont.inc
   //#include %path_bdm%\Linea30mm_cont_DBG.inc

   //#ifdef TEC;AZI
   //Posiziona G368_GruppoLavorazione G368SX
   //{
   //   GOSUB G368_PosaGrLavorazione
   //   @X = 1
   //
   //   @Lato = "SX"
   //}
   //
   //Posiziona G368_GruppoLavorazione G368DX
   //{
   //   GOSUB G368_PosaGrLavorazione
   //   @base_0.x = base_3.x - 1
   //   @X = 1
   //
   //   @Lato = "DX"
   //}
   //#endif

   // specifico per binario et voila
   Posiziona _cont_per_near cn_frb
   //Posiziona Blocco cn_frb
   {
      @escluso = 1
      idx_cnear_fr_bin = -1

      if( FLAG_EtVoila == 1 & VAR_UsoRipianoStrut != "RIPIANO-CENTRALE-COLONNA")
      {
         @escluso = 0
         idx_cnear_fr_bin = ATTUALE()
      }

      @base_0.x = base_0.x + 5
      @base_0.y = base_0.y - Y
      @base_0.z = base_1.z + 5

      @X = X - 10
      @Y = Y * 3
      @Z = 1
   }

   //specifico per gestione schiena retro
   Posiziona _cont_per_near cn_rtsc
   {
      @base_0.x = base_0.x + 5
      @base_0.y = base_0.y + 5
      @base_0.z = base_0.z - 150

      @X = X - 10
      @Y = Y - 10
      @Z = Z - 100 + 150

      idx_cnear_rsch = ATTUALE()
   }

   Posiziona PCV_ContCollisioni_368 pcvc_r
   {
      limite_sx = 40
      limite_dx = 40
      limite_rt = 10
      limite_fr = 10
      if( TipoRipianoStr != "RIPIANO" )      { limite_rt    = 15 }
      if( TipoRipianoStr == "RIPIANO_TER" )
      {
         limite_rt    = 15

         if( IS_IDX(idx_fia_dx) ) { limite_sx = 25 }
         if( IS_IDX(idx_fia_sx) ) { limite_dx = 25 }
      }
      if( TipoRipianoStr == "MENSOLA" )
      {
         limite_sx = 10
         limite_dx = 10
      }

      @base_0.x = base_0.x
      @base_0.y = base_0.y - 5
      @base_0.z = base_0.z
      @X = X
      @Y = Y + 10
      @Z = limite_rt
   }

   Posiziona PCV_ContCollisioni_368 pcvc_f
   {
      @base_0.x = base_0.x
      @base_0.y = base_0.y - 5
      @base_0.z = base_0.z + Z - limite_fr
      @X = X
      @Y = Y + 10
      @Z = limite_fr
   }

   Posiziona PCV_ContCollisioni_368 pcvc_sx
   {
      @base_0.x = base_0.x
      @base_0.y = base_0.y - 5
      @base_0.z = base_0.z + limite_rt
      @X = limite_sx
      @Y = Y + 10
      @Z = Z - limite_rt - limite_fr
   }
   Posiziona PCV_ContCollisioni_368 pcvc_dx
   {
      @base_0.x = base_0.x + X - limite_dx
      @base_0.y = base_0.y - 5
      @base_0.z = base_0.z + limite_rt
      @X = limite_dx
      @Y = Y + 10
      @Z = Z - limite_rt - limite_fr
   }

   Posiziona TAG_NFC nfc
   {
      @escluso = 1 - NFC_Attiva

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

Elemento FerramentaRipiano_30MM
{
   Descrizione = "FerramentaRipiano_30MM"
   Code        = BBSS
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      X  ""  500
      Y  ""  720
      Z  ""  560

      TipoRipiano    "" 0  Implicit
      TipoRipianoStr "" "" Implicit
      PosizioneRip   "" 0  Implicit

      PosX_Triade1   "" 0
      PosX_Triade2   "" 0
      PosX_Triade3   "" 0
      PosX_Triade4   "" 0
      PosX_Triade5   "" 0

      NrTriade       "" 0
      Esc_Triade1    "" 0

      M4_NO_OFFS "" 1

      VediLimiti_PCV "" 0 Implicit

      FLAG_RipConModular   "" 0 Implicit
   }

   Assegnazioni
   {
      GOSUB AssComune

      DescEdit__ = "FERRAMENTA"
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Controlli
   {
      GOSUB CtrlComune

      HIDE = 3
      if( ACTION() == 2 | $OnLoadOrder == 1 | $ATTIVA_DLL == 0 ) { EXITSUB() }

      PosX_Triade1 = 0  PosX_Triade2 = 0 PosX_Triade3 = 0
      PosX_Triade4 = 0  PosX_Triade5 = 0
      NrTriade = 0      Esc_Triade1  = 0

      No_Triade = 0

      if( TipoRipianoStr == "RIPIANO" | TipoRipianoStr == "RIPIANO_SCH" )  { No_Triade = 1 }

      if( TipoRipianoStr == "RIPIANO" & FLAG_RipConModular ) { No_Triade = 0 }

      if( No_Triade == 1 ) { EXITSUB() }

      NrTriade = 2
      if( X >= 651  )  { NrTriade = 3 }
      if( X >= 1197 )  { NrTriade = 4 }
      if( X >= 1501 )  { NrTriade = 5 }

      offl = 92
      offx = (X - 2*offl)/(NrTriade-1)

      //LZ 16/12/2021: specifiche errate, la dimensione minima dovrebbe essere 92+144+92 = 328mm, ma č permessa riduzione fino a 313mm
      //               se non sono terminale o con modular ( e quindi ho realmente pił di un triade) e i triade sono in collisione uno con l'altro,
      //               divido equamente lo spazio che mi rimiane
      if( TipoRipianoStr != "RIPIANO_TER"
        & FLAG_RipConModular == 0
        & offx < $Triade_DimX )
      {
         offl = (X - $Triade_DimX*NrTriade)/(NrTriade+1)
         offl = offl + $Triade_DimX/2
         offx = offl + $Triade_DimX/2
      }

      PosX_Triade1 = offl
      PosX_Triade2 = X - offl
      if( NrTriade > 2 )
      {
         PosX_Triade2 = PosX_Triade1 + offx
         PosX_Triade3 = X - offl
      }
      if( NrTriade > 3 )
      {
         PosX_Triade3 = PosX_Triade2 + offx
         PosX_Triade4 = X - offl
      }
      if( NrTriade > 4 )
      {
         PosX_Triade4 = PosX_Triade3 + offx
         PosX_Triade5 = X - offl
      }

      if( TipoRipianoStr == "RIPIANO_TER" )
      {
         //Se terminale DX escludo Triade1
         if( PosizioneRip > 0 ) { Esc_Triade1 = 1 }

         //Se terminale SX escludo l'ultima Triade
         if( PosizioneRip < 0 ) { NrTriade = NrTriade - 1 }
      }

      if( FLAG_RipConModular == 1 )
      {
         if( TipoRipianoStr == "RIPIANO_TER" )
         {
            //Se terminale DX escludo Triade1
            if( PosizioneRip > 0 ) { Esc_Triade1 = 0 }

            //Se terminale SX escludo l'ultima Triade
            if( PosizioneRip < 0 ) { NrTriade = NrTriade + 1 }
         }
         //Luca 25/03/2021
         NrTriade = NrTriade - 1

         offx = X / (NrTriade + 1)

         PosX_Triade1 = offx
         PosX_Triade2 = offx*2
         if( NrTriade >= 3 ) { PosX_Triade3 = offx*3  }
         if( NrTriade >= 4 ) { PosX_Triade4 = offx*4  }
         if( NrTriade == 5 ) { PosX_Triade5 = offx*5  }
      }

      #ifdef TEC
         if( NrTriade > 0 ) { HIDE = 0 }
      #endif

      //Luca 18/02/2021
      VAR_VALUE_SET(PADRE(ATTUALE(),1),"ConTriade",SE_NUM(NrTriade>0,1,0))
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }

   //{ Gestione Triade
   Posiziona TriadeRipiano_30MM tri1
   {
      NrTri = 1
      GOSUB PosaTriade_30MM
      if( Esc_Triade1 == 1 ) { @escluso = 1 }
   }

   Posiziona TriadeRipiano_30MM tri2
   {
      NrTri = 2
      GOSUB PosaTriade_30MM
   }

   Posiziona TriadeRipiano_30MM tri3
   {
      NrTri = 3
      GOSUB PosaTriade_30MM
   }

   Posiziona TriadeRipiano_30MM tri4
   {
      NrTri = 4
      GOSUB PosaTriade_30MM
   }

   Posiziona TriadeRipiano_30MM tri5
   {
      NrTri = 5
      GOSUB PosaTriade_30MM
   }

   Posiziona TriadeRipiano_30MM tri6
   {
      NrTri = 6
      GOSUB PosaTriade_30MM
   }
   //} Gestione Triade
}

Elemento TriadeRipiano_30MM
{
   Descrizione = "Triade x Ripiano"
   Code        = 30MM
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X "Larghezza"        144
      Y "Spessore"          20
      Z "Profonditą"       165

      c_colore "" [128,128,128 ] XyzAbsolute

      VediLimiti_PCV "" 0 Implicit

      FLAG_BinAnta_EV "" 0  Implicit

      RADICE         "" "TRIADE"

      M4_NO_OFFS "" 1
   }

   Assegnazioni
   {
      GOSUB AssComune
      //DescEdit__ = "TRIADE"

      prof_gest = 150
      if( Z <= 199.5 ) { prof_gest = 110 }
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Controlli
   {
      GOSUB CtrlEscluso
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune

      RADICE = "TRIADE"
      GEST_CODICE = ""

      GEST_X = 0
      GEST_Y = 0
      GEST_Z = prof_gest

      //Luca 11/10/2021 mantis 25427
      if( FLAG_BinAnta_EV == 1 )
      {
         RADICE = ""
         GEST_CODICE = "D06015"
      }

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }

   Posiziona Blocco b1
   {
      GOSUB posa_blocco
      @base_0.z = base_0.z - 0.1
      @Z = 8.1
      @c_rivestimento = c_colore
   }

   //per quota centro
   Posiziona Blocco bc
   {
      GOSUB posa_blocco
      @base_0.z = base_0.z - 0.3
      @X = X/2
      @Z = 8
      @c_rivestimento = c_colore
   }

   Posiziona Blocco b2
   {
      GOSUB posa_blocco
      @X = 78
      @Z = 31.5
      @base_0.x = base_0.x + X/2 - @X/2
      @base_0.z = base_0.z + 8
      @c_rivestimento = c_colore
   }

   Posiziona Blocco b3
   {
      GOSUB posa_blocco
      @X = 14
      zstaffa = 125.5
      //@Z = 125.5
      if( Z <= 199.5 ) { zstaffa = 80 }

      @Z = zstaffa
      @base_0.x = base_0.x + X/2 - @X/2
      @base_0.z = base_0.z + 8 + 31.5
      @c_rivestimento = c_colore
   }

   //per la parte retro, utilizzo il cont del ripiano
   Posiziona PCV_ContCollisioni_368 pcv
   {
      larg_pcv = 78 + 20
      @base_0.x = base_0.x + X/2 - larg_pcv/2
      @base_0.y = base_0.y - 15
      @base_0.z = base_0.z + 8
      @X = larg_pcv
      @Y = Y + 50
      @Z = 41.5
   }

   Posiziona PCV_ContCollisioni_368 pcv2
   {
      larg_pcv = 14 + 20
      @base_0.x = base_0.x + X/2 - larg_pcv/2
      @base_0.y = base_0.y - 15
      @base_0.z = base_0.z + 8 + 31.5 + 10
      @X = larg_pcv
      @Y = Y + 50
      @Z = zstaffa + 10
   }
}

Elemento SupportoRipiano_30MM
{
   Descrizione = "Supporto per Schienale"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente
   Altimetro    Auto
   Attrezzabile Ripiano_30MM

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X "Larghezza"        50
      Y "Spessore"         22
      Z "Profonditą"       22

      NO_GEST            "" 0

      GEST_CODICE "" "TER600"

      VediLimiti_PCV     ""  0 Implicit

      FIN_var  "" "C028"
   }

   Assegnazioni
   {
      GOSUB AssComune
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Procedura OnQueryBdmLocal
   {
      if( $query_type == 8 )
      {
         $QueryResult__ = 1
         COMPONENTI2("barra",$query_p1,"BarraRipianoPTV_30MM")
         COMPONENTI2("supp",$query_p1,"SupportoRipiano_30MM")

         if( barra > 0 | supp > 0 ) { $QueryResult__ = 0 }

         if( VAR_VAL_STR($query_p1,"TipoRipianoStr") == "RIPIANO_SCH"
           & VAR_VAL_STR($query_p1,"TipoRipianoSch") == "VETRO"  ) { $QueryResult__ = 0 }

         //Luca 01/03/2021
         //deve essere bloccata per mensole e ripiani terminali, disponibile solo per i ripiani tra due fianchi
         if( VAR_VAL_STR($query_p1,"TipoRipianoStr") == "MENSOLA"
           | VAR_VAL_STR($query_p1,"TipoRipianoStr") == "RIPIANO_TER" ) { $QueryResult__ = 0 }
      }
   }

   Procedura OnSetupLivelli
   {
      idx_ref  = $__lev_ref__
      vano_ref = $__lev_vano__

      annulla_ins = 0
      DEL_VAR(idx_att,"liv2add*")
      liv2add    = 1
      liv2add[1] = 0

      COMPONENTI2("barra",idx_ref,"BarraRipianoPTV_30MM")
      COMPONENTI2("supp",idx_ref,"SupportoRipiano_30MM")

      if( barra > 0 | supp > 0)  { annulla_ins = 1 }

      ArrayCopy(ATTUALE(),"liv2add","liv2addscr")
      GOSUB livelli_add2
   }

   Attrezza
   {
      idx_ref = @idx_att
      vano_n  = $vano_n

      base_0  = $vano_0
      base_0.x = $vano_0.x + @X/2 - X/2
      base_0.y = $vano_0.y
   }

   Controlli
   {
      GOSUB CtrlEscluso
      GOSUB CtrlComune

      GOSUB CtrlTipoRipiano_Barra_Supporto_30MM
   }

   Gestionale
   {
      GOSUB GestComune

      if( NO_GEST==1 )
      {
         GEST_CODICE = ""
         FLAG_RADICE = $NO_RAD

         HIDE  = 1
         EXITSUB()
      }

      HIDE  = 0
      GEST_CODICE = "TER600"

      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__ bl
   {
      GOSUB Posa_Elemento
      @base_0.z = base_0.z -1
      @c_rivestimento = $c_alluminio
      @import = STRCAT($path_sat,"30MM_mezzaluna.sat")
   }

   Posiziona PCV_ContCollisioni_368 pcv
   {
      larg_pcv = 70
      @base_0.x = base_0.x + X/2 - larg_pcv/2
      @base_0.y = base_0.y - 11
      @base_0.z = base_0.z
      @X = larg_pcv
      @Y = Y + 22
      @Z = 30
   }
}

Elemento SupportoRipianoBinario_30MM
{
   Descrizione = "Supporto per Schienale"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X "Larghezza"        130
      Y "Spessore"          24
      Z "Profonditą"       150

      NO_GEST            "" 0

      GEST_CODICE "" "D06015"

      FIN_var  "" "C028"
   }

   Assegnazioni
   {
      GOSUB AssComune
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Controlli
   {
      GOSUB CtrlEscluso
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune
      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }

   Posiziona Blocco ing
   {
      GOSUB posa_blocco
   }

   //Posiziona __import__ bl
   //{
   //   GOSUB Posa_Elemento
   //   @base_0.z = base_0.z -1
   //   @c_rivestimento = $c_alluminio
   //   @import = STRCAT($path_sat,"30MM_mezzaluna.sat")
   //}
   //
   Posiziona PCV_ContCollisioni_368 pcv
   {
      larg_pcv = X + 30
      @base_0.x = base_0.x + X/2 - larg_pcv/2
      @base_0.y = base_0.y - 11
      @base_0.z = base_0.z
      @X = larg_pcv
      @Y = Y + 22
      @Z = Z + 15
   }
}

Elemento RipianoVetro_30MM
{
   Descrizione = "Ripiano Vetro 30mm"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamInciso;CamIncidente;Rip30MM
   Altimetro    Auto
   Attrezzabile Colonna_30MM

   Variabili
   {
      #include %path_bdm%\var_db.inc

      genera_disegno_collo__          "Variabile per la gestione delle bindelle"   1

      X                               "Larghezza"                                  368   Menu      (   LarVe_30MM   )   Utente   (   184-1840   )

      Z                               "Profonditą"                                 248   Menu      (   Prf_30MM     )   Utente   (   136-384    )

      Y                               "Spessore"                                   8     ShowAlways


      //VAR_FixMuro "Fissato a muro" 0 Menu ( SiNo )
      //VAR_FixTerra "Solo a terra" 0 Menu ( SiNo )

      // NO 0 -- MENSOLA
      // 1 -- RIPIANO
      // NO 2 -- RIPIANO TERMINALE
      // 3 -- RIPIANO SCHIENALE
      TipoRipiano                     ""                                           1     SaveAlways
      TipoRipianoStr                  ""                                           "RIPIANO"

      //solo per ripiani attrezzati
      VAR_PosRipiano                  "Posizione ripiano"                          0     Menu      (   DXCNSX      )

      //PER RIPIANO TERMINALE
      PosizioneRip                    ""                                           0     SaveAlways
      RientroZ_RipianoSch             ""                                           0     SaveAlways

      //RipTerminale "" 0
      //RipSchienale "" 0

      idx_fia_sx                      ""                                           -1
      idx_fia_dx                      ""                                           -1
      idx_368_sx                      ""                                           -1
      idx_368_dx                      ""                                           -1
      idx_sch_rt                      ""                                           -1

      ConAttaccaglie                  ""                                           0

      FLAG_CompostoGEN                "Modalitą composto GENERICO"                 1     Boolean
      FLAG_EtVoila                    "Ripiano 30mm EtVoila"                       0     Boolean   Implicit
      FLAG_BinAnta_EV                 ""                                           0

      FLAG_RipConModular              ""                                           0

      COD_EREDITA                     ""                                           "PRE;POST"

      CMP2_AZIONI                     ""                                           "S"

      M4_A_MURO                       ""                                           1
      M4_CNT_LINK_MODE__              ""                                           0

      M4_CNT_MODE__                   ""                                           1
      M4_CNT_MODE2__                  ""                                           1

      //GESTIONE STENDI
      M4_DIALOG                       ""                                           32
      M4_DLINK_MODE__                 "rimane steso"                               0
      M4_STENDI_RIPETIZIONI           ""                                           1
      M4_STENDI_BREAK_AND_RESTART__   ""                                           1

      M4_MIS                          ""                                           "X;Y;Z;FillerM2G"

      FIN_var                         ""                                           "C014"
      FIN_orie                        ""                                           "O"

      M4_WALL_GRID__                  ""                                           1

      BdmCollision_Local              ""                                           1

      FillerM2G                       " "                                          ""    ShowAlways
   }

   Assegnazioni
   {
      GOSUB AssComune

      X_Max = 1840

      GOSUB AssElementi_30MM

      HIDE_ON_EDIT2(ATTUALE(),"VAR_PosRipiano",1)
      if( ins2_att == $ins_attrezzato ) { HIDE_ON_EDIT2(ATTUALE(),"VAR_PosRipiano",0) }

      GOSUB DecodificaTipoRipiano_30MM
   }

   PuntiNotevoli
   {
      Xr = X - 7
      GOSUB punti

      GOSUB DefPuntiSnapPasso184_30MM

      GOSUB DefPuntiStendiSchiena_30MM
   }
   #include %path_bdm%\Tlib\orie.inc

   Procedura OnSetupLivelli
   {
      idx_ref  = $__lev_ref__
      vano_ref = $__lev_vano__

      annulla_ins = 0
      DEL_VAR(idx_att,"liv2add*")
      liv2add    = 0

      step = 184
      liv_att = 0

      liv_max = VAR_VAL(idx_ref,"Y") +20

      while ( liv_att < liv_max )
      {
         AddItem2Array(ATTUALE(),"liv2add",liv_att,"")
         liv_att = liv_att + step
      }

      ArrayCopy(ATTUALE(),"liv2add","liv2addscr")
      GOSUB livelli_add2
   }

   Procedura OnQueryBdmLocal
   {
      GOSUB OnQueryBdmLocal_30MM

      if( $query_type == 13 )
      {
         $QueryResult__ = 1
         $POPUP_MENU = 0
         AddPopupMenu("Scegli misure")
      }

      if( $query_type == 14 )
      {
         $QueryResult__ = 1
         // scelta del 1° valore del popup menu
         if( $query_p2 == 0 ) { DlgGetDimensioni(ATTUALE(),"XZY" , "Macro" ) }
      }
   }

   Attrezza
   {
      idx_ref = @idx_att

      if( IS_VAR_FIXED(ATTUALE(),"X") == 0 )  { X = $larghezza }
      if( IS_VAR_FIXED(ATTUALE(),"Z") == 0 )  { Z = $profondita }

      base_0 = $vano_0
      base_0.y = base_0.y + $livello

      base_0.x = $vano_0.x
      if( VAR_PosRipiano == 0 )  { base_0.x = $vano_0.x + $larghezza/2 - X/2 }
      if( VAR_PosRipiano  > 0 )  { base_0.x = $vano_0.x + $larghezza   - X }

      if( TipoRipianoStr == "RIPIANO_SCH" )
      {
         if( IS_VAR_FIXED(ATTUALE(),"Z") == 0 )  { Z = $profondita - RientroZ_RipianoSch }
         base_0.z = @base_0.z + RientroZ_RipianoSch
      }
   }

   Controlli
   {
      GOSUB CtrlComune

      if( ins2_att == $ins2_posizionato ) { ChiediMisureInserimento(ATTUALE()) }

      GOSUB CtrlRipiano_30MM
   }

   Gestionale
   {
      GOSUB GestComune

      GEST_X = Xr
      GOSUB GestElementi_30MM

      GOSUB GestComune_Post
      GOSUB CAMBIA_VAR
   }

   //gestione stendi
   Procedura Stendi
   {
      GOSUB Stendi_Elemento_30MM
   }

   Procedura Notifica
   {
      GOSUB Notifica_Elemento_30MM
   }

   Procedura OnTabEredita
   {
   }

   Procedura PostAction2
   {
      GOSUB PostAction2_30MM

      if( $ATTIVA_DLL==1 & $OnLoadOrder == 0 )
      {
         if( VAR_EXIST(ATTUALE(),"M4_FIX_Y") ) { DEL_VAR(ATTUALE(),"M4_FIX_Y") }
      }
   }

   Procedura Offset
   {
      GOSUB Offset_Ripiano_30MM
   }

   Procedura OnQueryBdmCollision
   {
      GOSUB BdmCollision_30MM
   }

   Procedura cancella
   {
   }

   Posiziona Blocco bl
   {
      GOSUB posa_blocco
      @base_0.x = base_0.x + X/2 - Xr/2
      @X = Xr
      GOSUB rivestimento
      @f_rivestimento = "0.8"
   }

   #include %path_bdm%\Linea30mm_cont.inc
   //#include %path_bdm%\Linea30mm_cont_DBG.inc

   //specifico per gestione schiena retro
   Posiziona _cont_per_near cn_rtsc
   {
      @base_0.x = base_0.x + 5
      @base_0.y = base_0.y + 5
      @base_0.z = base_0.z - 150

      @X = X - 10
      @Y = Y - 10
      @Z = Z - 100 + 150

      idx_cnear_rsch = ATTUALE()
   }
}


//Schiena per vani (utilizzo stesso sistema di stesura per lo schienale vani utilizzato nel 368
//stesa oppure attrezzata su colonne
Elemento Schiena_30MM
{
   Descrizione = "Schienale vano"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Alias       Schiena30MM;StampaXG

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X       "Larghezza"       368 Menu ( Lar_30MM ) Utente ( 184-2208 )

   #ifdef  TEC;AZI
      Y       "Altezza"         368 Menu ( Alt_30MM ) Utente ( 120-2208 )
   #endif
   #ifndef TEC;AZI
      Y       "Altezza"         368 Menu ( Alt_30MM ) Utente ( 368-2208 )
   #endif

      Z       "Spessore"         20 ShowAlways

      //LACCATO --> Laccat/Gentle pannello unico
      //VETRO --> Vetro/XGLASS
      TipoSchienale  "" "LACCATO"

      TLED_Attiva          "" 0 SaveAlways
      TLED_Tipologia1      "" 1 SaveAlways
      TLED_Tipologia2      "" 1 SaveAlways
      TLED_Watt            "" 0

      //TLED_TipoLavorazione = 1 - 1 ALIMENTATORE -  24 WW
      //TLED_TipoLavorazione = 2 - 1 ALIMENTATORE -  30 WW
      //TLED_TipoLavorazione = 3 - 1 ALIMENTATORE - 100 WW
      //TLED_TipoLavorazione = 4 - 2 ALIMENTATORE -  30 WW
      //TLED_TipoLavorazione = 5 - 1 ALIMENTATORE - 24 WW

      //TLED_TipoLavorazione = 5 - 1 ALIMENTATORE -  24 WW
      //TLED_TipoLavorazione = 1 - 1 ALIMENTATORE -  30 WW
      //TLED_TipoLavorazione = 2 - 1 ALIMENTATORE - 100 WW
      //TLED_TipoLavorazione = 3 - 2 ALIMENTATORE -  30 WW
      //TLED_TipoLavorazione = 4 - 2 ALIMENTATORE - 100  WW
      TLED_Lavorazione      "" 0 SaveAlways
      TLED_TipoLavorazione  "" 0 SaveAlways
      TLED_Lavorazione_USER "" 0 SaveAlways

      FLAG_CompostoGEN  "Modalitą composto GENERICO" 1 Boolean
      FLAG_EtVoila      "Schiena 30mm EtVoila"       0 Boolean Implicit

      NO_GEST      "" 0

      CMP2_AZIONI      ""      "MS"

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

      COD_EREDITA "" "PRE;POST"

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

      M4_DIALOG "" 32

      M4_LINK2WALL_MODE__   ""  3

      //M4_STENDI_RIPETIZIONI "" 1

      M4_DLINK_MODE__ "rimane steso"  0

      FillerM2G            " " "" ShowAlways

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

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB AssElementi_30MM

      Spe_PanLac = 19

      Spe_Pan = 16
      Spe_Vtr = 4

      RieX_Lac = 0.2
      //RieY_Lac = 0.2
      RieY_Lac =  2

      //RiePanX_Vtr = 3.5
      //RiePanY_Vtr = 3.5
      RiePanX_Vtr = 3
      RiePanY_Vtr = 2

      RieVtrX_Vtr = 0.5
      //RieVtrY_Vtr = 1
      RieVtrY_Vtr = 2

      //FIN_var_pan  = "C033"
      FIN_var_pan  = "C048"
      FIN_var_fin  = "C048"

      if( ACTION()>0 & $OnLoadOrder==0 & $ATTIVA_DLL==1 )
      {
         HIDE_ON_EDIT2(ATTUALE(),"FLAG_CompostoGEN",1)

         //if( FLAG_CompostoGEN == 0 )
         //{
         //VarDimX = "X"   ValDeltaX = 0   VarMenuX = ""  VarMenuFissoX = ""   VarFlgChangeX = 1
         //VarDimY = "Y"   ValDeltaY = 0   VarMenuY = ""  VarMenuFissoY = ""   VarFlgChangeY = 1
         //
         //CtrlRangeRidM2G(ATTUALE(),"X")
         //CtrlRangeRidM2G(ATTUALE(),"Y")
         //}
         //
         //if( FLAG_CompostoGEN == 1 )
         //{
         //   VAR_SET_MODE(ATTUALE(),"X",$MODE_SHOWALWAYS)
         //   VAR_SET_MODE(ATTUALE(),"Y",$MODE_SHOWALWAYS)
         //}
      }

      GOSUB NO_AUTO

      STP_Bollina = 1

      if( FLAG_CompostoGEN == 0 ) {  CMP2_AZIONI = "S" }
   }

   PuntiNotevoli
   {
      GOSUB punti

      //Luca 19/04/2021
      STP_XG_B0 = [RieVtrX_Vtr,RieVtrY_Vtr,0]
      STP_XG_B3 = [X-RieVtrX_Vtr,RieVtrY_Vtr,0]
      STP_XG_A0 = [RieVtrX_Vtr,Y-RieVtrY_Vtr,0]

      STP_XG_ValX = X - 2*RieVtrX_Vtr
      STP_XG_ValY = Y - 2*RieVtrY_Vtr

      base_so = base_0
      //per evitare collisioni con ripiano
      alto_ne = alto_2  alto_ne.z = Z - 0.5

      //Luca 04/06/2021
      STP_Bollina = 1
   }

   #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_stendisch3*")
         EXIT()
      }

      GOSUB Stendi_Schienale_30MM
   }

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

      GOSUB Notifica_Schiena_30MM
   }

   Controlli
   {
      GOSUB CtrlComune

      GOSUB CtrlSchiena_TrovaElementiVicini_30MM

      //Luca 03/03/2021
      GOSUB TLED_CalcolaTrasformatore_30MM
   }

   Procedura OnTabEredita
   {
      if( TABER_REGOLA == "POST" )
      {
         TipoSchienale = "LACCATO"
         wk_gest_c048  = VAR_VAL_STR(ATTUALE(),"GEST_C048")
         if( IS_MATCH( wk_gest_c048 ,"VL*" ) == 1  | IS_MATCH( wk_gest_c048 ,"VO*" ) == 1
           | IS_MATCH( wk_gest_c048 ,"XE*" ) == 1  | IS_MATCH( wk_gest_c048 ,"XF*" ) == 1
           | IS_MATCH( wk_gest_c048 ,"XL*" ) == 1  | IS_MATCH( wk_gest_c048 ,"XO*" ) == 1 ) { TipoSchienale = "VETRO" }
      }
   }

   Gestionale
   {
      GOSUB GestComune

      if( NO_GEST==1 )
      {
         FLAG_RADICE = $NO_RAD

         GOSUB GestComune_Post
         EXITSUB()
      }

      if( FLAG_CompostoGEN == 1 )
      {
         if( IS_VAR_FIXED( ATTUALE(), "RADICE") == 0
           & IS_VAR_FIXED( ATTUALE(), "GEST_CODICE") == 0 )
         {
            GEST_CODICE = ""

            perRADICE = "SCVN368"

            RADICE = perRADICE
         }
      }

      GOSUB Set_Gest_C008_Schiena_30MM

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura PostGestDllValida
   {
      if( $OnRigenera | $OnLoadOrder | ACTION()<=0 ) { EXITSUB() }

      COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE())," //PostGestDllValida ",NOME(ATTUALE())))
   }

   Procedura Offset
   {
      if( VAR_VAL(-1,"offset_idx") != ATTUALE() )  { EXITSUB() }

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_rip_fr",idx_cnear_fr,1,"Ripiano*30MM")
      while( wk_rip_fr > 0 )
      {
         //VAR_VALUE_SET(wk_rip_fr[wk_rip_fr],"OnCancellaSchiena",1)
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(wk_rip_fr[wk_rip_fr])," no_agganciati //PostGestDllValida ",NOME(ATTUALE())))
         wk_rip_fr = wk_rip_fr -1
      }
   }

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

      GOSUB Cancella_Schienale_30MM

      //RICALCOLARE TUTTI I RIPIANI
      BOX_MODE(0)
      NEAR_GLOBALE2("wk_rip_fr",idx_cnear_fr,1,"Ripiano*30MM")
      while( wk_rip_fr > 0 )
      {
         VAR_VALUE_SET(wk_rip_fr[wk_rip_fr],"OnCancellaSchiena",1)
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(wk_rip_fr[wk_rip_fr])," no_agganciati //PostGestDllValida ",NOME(ATTUALE())))
         wk_rip_fr = wk_rip_fr -1
      }
   }

   Posiziona PannelloSchiena_30MM panr
   {
      @X = X - 2*RieX_Lac
      @Y = Y - 2*RieY_Lac
      @Z = Spe_PanLac

      @base_0.x = base_0.x + RieX_Lac
      @base_0.y = base_0.y + RieY_Lac
      @base_0.z = base_0.z
      @FIN_var = FIN_var_fin

      if( TipoSchienale == "VETRO" )
      {
         @X = X - 2*RiePanX_Vtr
         @Y = Y - 2*RiePanY_Vtr
         @Z = Spe_Pan

         @base_0.x = base_0.x + RiePanX_Vtr
         @base_0.y = base_0.y + RiePanY_Vtr
         @base_0.z = base_0.z

         @FIN_var = FIN_var_pan
      }

      @TipoSchienale = TipoSchienale
   }

   //vetro
   Posiziona Blocco panf
   {
      @escluso = 1
      if( TipoSchienale == "VETRO" ) { @escluso = 0 }

      @X = X - 2*RieVtrX_Vtr
      @Y = Y - 2*RieVtrY_Vtr
      @Z = Spe_Vtr

      @base_0.x = base_0.x + RieVtrX_Vtr
      @base_0.y = base_0.y + RieVtrY_Vtr
      @base_0.z = base_0.z + Spe_Pan

      FIN_var = FIN_var_fin
      GOSUB rivestimento
   }

   //Luca 03/03/2021
   Posiziona LavTrasformatoreLED_368 LavTra
   {
      GOSUB posa_lavorazione_trasformatore_30MM
   }

   //Luca 03/03/2021
   Posiziona TrasformatoreLED_368 Tras1
   {
      ntrasf = 1
      GOSUB posa_trasformatore_30MM
   }

   Posiziona TrasformatoreLED_368 Tras2
   {
      ntrasf = 2
      GOSUB posa_trasformatore_30MM
   }

   #include %path_bdm%\Linea30mm_cont.inc
   //#include %path_bdm%\Linea30mm_cont_DBG.inc
}

Elemento PannelloSchiena_30MM
{
   Descrizione = "Schienale generico"
   Code        = CUB
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""
   Alias  CamIncidente

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

      X "" 1
      Y "" 1
      Z "" 1

      //FIN_var     ""  "C033"

      //RADICE       ""  ""
      //COD_EREDITA  ""  "PRE;POST"

      HIDE "" 1

      TipoSchienale "" ""
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Stato_78

      FIN_idx_gest = PADRE(ATTUALE(),1)
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Controlli
   {
      GOSUB CtrlComune
   }

   //Gestionale
   //{
   //   GOSUB GestComune
   //
   //   GOSUB GestComune_Post
   //}

   Posiziona Blocco bl
   {
      GOSUB posa_blocco
      GOSUB rivestimento
      if( TipoSchienale == "VETRO" )
      {
         @m_rivestimento = ""
         @c_rivestimento = $c_pomice
      }
   }
}

Elemento SchienaWeightless_30MM
{
   Descrizione = "Schiena 30mm"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Altimetro    Auto
   Vestibile    Colonna_30MM
   Alias        CamInciso;CamIncidente

   Variabili
   {
      #include %path_bdm%\var_db.inc

      genera_disegno_collo__ "Variabile per la gestione delle bindelle" 1

      X       "Larghezza"         368 Menu ( Lar_30MM ) Utente ( 184-2208 )

      Y       "Altezza "          368 Menu ( Alt_30MM ) Utente ( 184-1472 )

      Z       "Profonditą"         30 ShowAlways

      //0 laccato
      //1 vetro
      VAR_FinituraSch    "" 0

      VediLimiti_PCV     "" 0

      idx_cnear_sx   "" -1
      idx_cnear_dx   "" -1
      idx_cnear_up   "" -1
      idx_cnear_dw   "" -1

      FLAG_CompostoGEN  "Modalitą composto GENERICO" 1 Boolean

      FLAG_Composto "" 0

      COD_EREDITA        ""  "PRE;C033_PRE;POST"

      CMP2_AZIONI        ""  "V"

      M4_MIS             "" "X;Y;Z;FillerM2G;VAR_PosRipiano"

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

      //Luca 16/03/2021
      BdmCollision_Local "" 1

      XGLASS             "Num. XGLASS"

      FillerM2G          " " "" ShowAlways
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB AssElementi_30MM

      RieX_Lat = 13.5
      Spe_Rip  = 30

      //Simone 09/05/2022
      Yt = Y

      //LZ 12/04/2021
      STP_Bollina = 1
      STP_Bollina_Cat = "C028"
   }

   PuntiNotevoli
   {
      GOSUB punti

      STP_Bollina_Pnt = [X/2 , Y/2 - 45 , Z + 30 ]
   }
   #include %path_bdm%\Tlib\orie.inc

   Procedura OnQueryBdmLocal
   {
      if( $query_type == 8 )
      {
         idx_ref = $query_p1
         GOSUB SchienaWTL_TrovaLivelli
         //Luca 20/04/2022
         if( liv2add < 2 ) { $QueryResult__ = 0 }

         //if( VAR_VAL(idx_ref,"FLAG_Weightless") == 0 ) { $QueryResult__ = 0 }
         //if( VAR_VAL(idx_ref,"wk_A_TERRA") == 1 )      { $QueryResult__ = 0 }
      }
   }

   Procedura OnSetupLivelli
   {
      idx_ref  = $__lev_ref__
      vano_ref = $__lev_vano__

      annulla_ins = 0
      DEL_VAR(idx_att,"liv2add*")
      liv2add    = 0

      GOSUB SchienaWTL_TrovaLivelli

      if( liv2add < 2  ) { annulla_ins = 1 }

      ArrayCopy(ATTUALE(),"liv2add","liv2addscr")
      GOSUB livelli_add2
   }

   Vesti
   {
      idx_ref = @idx_att

      if( IS_VAR_FIXED(ATTUALE(),"X") == 0 )  { X = $larghezza + 2*RieX_Lat }
      if( IS_VAR_FIXED(ATTUALE(),"Y") == 0 )  { Y = $altezza + Spe_Rip }

      base_0 = $vano_0
      base_0.y = base_0.y + $livello - Spe_Rip/2
      base_0.x = $vano_0.x - RieX_Lat
      //Luca 20/04/2022
      //base_0.z = $vano_0.z - 5
      base_0.z = $vano_0.z - 4
      if( VAR_FinituraSch == 0 ) { base_0.z = $vano_0.z - 5 }
   }

   Controlli
   {
      GOSUB CtrlEscluso
      GOSUB CtrlComune

      GOSUB CtrlDimensioneSchiena_WTL_30MM
   }

   Gestionale
   {
      GOSUB GestComune

      GOSUB GestElementi_30MM

      //GEST_X = X - 27
      GEST_Z = 30

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura OnTabEredita
   {
      if( TABER_REGOLA == "C033_PRE" )
      {
         if( IS_VAR_FIXED(ATTUALE(),"GEST_C033")==0 )
         {
            wk_var_gest  = "GEST_C001"
            wk_gest_fro = VAR_VAL_STR(ATTUALE(),wk_var_gest)
            gest_fro_new = GetLaccatoCorrispondente(wk_gest_fro)
            if( gest_fro_new!="" )
            {
               GEST_C033 = gest_fro_new
               VarAdd = "GEST_C033"   GOSUB Add_TABER_VARSETTATE
            }
         }
      }

      //Simone 06/09/2022
      if( TABER_REGOLA=="PRE" )
      {
         if( VAR_VAL(ATTUALE(),"FLAG_Speciale") == 0 ) { BloccaModificaCatGest( ATTUALE(),STRCAT("GEST_C033") ) }
      }

      if( TABER_REGOLA == "POST" )
      {
         wk_var_val  = VAR_VAL_STR(ATTUALE() ,"GEST_C001")
         wk_str_test = STRCAT("GEST_C001;",wk_var_val)
         wk_no_sig = STRDADB(ATTUALE(),"DAMMI_NONSIGNIF",wk_str_test)

         Z = 29
         VAR_FinituraSch = 1
         if( wk_no_sig == "LC000" )
         {
            Z = 30
            VAR_FinituraSch = 0
         }
      }
   }

   Procedura PostAction2
   {
      GOSUB PostAction2_30MM
   }

   Procedura PostGestDllValida
   {
      if( $OnRigenera | $OnLoadOrder | ACTION()<=0 ) { EXITSUB() }

      COMANDO(STRCAT("RICALCOLA_UNA ",STR(GetTopLevel(ATTUALE()))," //PostGestDllValida ",NOME(ATTUALE())))
   }

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

      //RICALCOLARE TUTTI I RIPIANI
      BOX_MODE(0)
      NEAR_GLOBALE2("wk_rip_fr",idx_cnear_fr,1,"Ripiano*30MM")
      while( wk_rip_fr > 0 )
      {
         VAR_VALUE_SET(wk_rip_fr[wk_rip_fr],"OnCancellaSchiena",1)
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(wk_rip_fr[wk_rip_fr])," no_agganciati //cancella ",NOME(ATTUALE())))
         wk_rip_fr = wk_rip_fr -1
      }

      if( UN_PADRE("Colonna_30MM") )
      {
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(PADRE(ATTUALE(),1))," no_agganciati //cancella ",NOME(ATTUALE())))
      }
   }

   Posiziona Blocco bl1
   {
      GOSUB posa_blocco
      @Z = 25
      @X = X - 2*RieX_Lat - 1
      @base_0.x = base_0.x + RieX_Lat + 0.5
      @base_0.z = base_0.z + 4
      FIN_var = "C033"

      if( VAR_FinituraSch == 0 )
      {
         FIN_var = "C001"
         @base_0.z = base_0.z + 5
      }

      GOSUB rivestimento
   }

   Posiziona Blocco bl2
   {
      GOSUB posa_blocco
      @Z = 4
      if( VAR_FinituraSch == 0 ) { @Z = 5 }

      FIN_var = "C001"
      GOSUB rivestimento
   }

   //Luca 20/04/2022
   Posiziona _cont_per_near cns
   {
      idx_cnear = ATTUALE()
      @X = X - 50
      @Y = Y
      @Z = 20

      @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 + Z

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

   #include %path_bdm%\Linea30mm_cont.inc
}

Elemento SchienaVetroWTL_30MM
{
   Descrizione = "Schiena 30mm"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Altimetro     Auto
   Attrezzabile  Colonna_30MM
   Alias CamInciso;CamIncidente

   Variabili
   {
      #include %path_bdm%\var_db.inc

      genera_disegno_collo__ "Variabile per la gestione delle bindelle" 1

      X       "Larghezza"         368 //Menu ( Lar_30MM ) Utente ( 184-2208 )

      Y       "Altezza "          368 //Menu ( Alt_30MM ) Utente ( 184-1472 )

      Z       "Profonditą"          8 ShowAlways

      VediLimiti_PCV     "" 0

      idx_cnear_sx   "" -1
      idx_cnear_dx   "" -1
      idx_cnear_up   "" -1
      idx_cnear_dw   "" -1

      FLAG_CompostoGEN  "Modalitą composto GENERICO" 1 Boolean

      FLAG_Composto "" 0

      COD_EREDITA        ""  "PRE;C033_PRE;POST"

      CMP2_AZIONI        ""  "V"

      M4_MIS             "" "X;Y;Z;FillerM2G;VAR_PosRipiano"

      FIN_var            ""  "C014"
      FIN_orie           ""  "O"

      //Luca 16/03/2021
      BdmCollision_Local "" 1

      FillerM2G          " " "" ShowAlways
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB AssElementi_30MM
      Spe_Rip = 30

      //Simone 09/05/2022 - Per raggiungere la misura nominale sommo il rip. sup. e il rip. inf. + 2 mm di aria
      Yt = Y + 60 + 2
      //Yt = Y + 2
   }

   PuntiNotevoli
   {
      GOSUB punti
   }
   #include %path_bdm%\Tlib\orie.inc

   Procedura OnQueryBdmLocal
   {
      if( $query_type == 8 )
      {
         idx_ref = $query_p1
         GOSUB SchienaVetWTL_TrovaLivelli
         //Luca 20/04/2022
         if( liv2add < 1 ) { $QueryResult__ = 0 }
      }
   }

   Procedura OnSetupLivelli
   {
      idx_ref  = $__lev_ref__
      vano_ref = $__lev_vano__

      annulla_ins = 0
      DEL_VAR(idx_att,"liv2add*")
      liv2add    = 0

      GOSUB SchienaVetWTL_TrovaLivelli

      if( liv2add < 1  ) { annulla_ins = 1 }

      ArrayCopy(ATTUALE(),"liv2add","liv2addscr")
      GOSUB livelli_add2
   }

   Attrezza
   {
      idx_ref = @idx_att
      COMPONENTI2("rip",idx_ref,"Ripiano_30MM")

      SET_#(idx_ref)
      SORT_POINT(#base_0,"rip","base_0")

      idx_rip_sotto = -1
      idx_rip_sopra = -1

      col_b0 = VAR_VAL(idx_ref,"base0y_abs")

      i = 1
      while ( i < rip )
      {
         b0_rip = VAR_VAL(rip[i],"base_0.y") + Spe_Rip/2 - col_b0

         if( ABS( b0_rip - $livello) < 10 )
         {
            idx_rip_sotto = rip[i]
            idx_rip_sopra = rip[i+1]
         }

         i = i + 1
      }

      if( IS_VAR_FIXED(ATTUALE(),"X") == 0 )  { X = $larghezza  }
      if( IS_VAR_FIXED(ATTUALE(),"Y") == 0 )
      {
         if( IS_IDX(idx_rip_sotto)
           & IS_IDX(idx_rip_sopra) )
         {
            Y = VAR_VAL(idx_rip_sopra,"base_0.y") - VAR_VAL(idx_rip_sotto,"alto_0.y") - 2
         }
      }

      base_0 = $vano_0
      base_0.y = base_0.y + $livello + Spe_Rip/2 + 1
      base_0.x = $vano_0.x
      base_0.z = $vano_0.z + 6.25
   }

   Controlli
   {
      GOSUB CtrlEscluso
      GOSUB CtrlComune

      GOSUB CtrlDimensioneSchiena_WTL_30MM
   }

   Gestionale
   {
      GOSUB GestComune

      GOSUB GestElementi_30MM

      GEST_X = X + 18
      //GEST_Y = Yt

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura PostAction2
   {
      GOSUB PostAction2_30MM
   }

   Procedura PostGestDllValida
   {
      if( $OnRigenera | $OnLoadOrder | ACTION()<=0 ) { EXITSUB() }

      COMANDO(STRCAT("RICALCOLA_UNA ",STR(GetTopLevel(ATTUALE()))," //PostGestDllValida ",NOME(ATTUALE())))
   }

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

      if( UN_PADRE("Colonna_30MM") )
      {
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(PADRE(ATTUALE(),1))," no_agganciati //cancella ",NOME(ATTUALE())))
      }
   }

   Posiziona Blocco bl1
   {
      GOSUB posa_blocco
      GOSUB rivestimento
      @f_rivestimento = "0.8"
   }

   //#include %path_bdm%\Linea30mm_cont.inc
}

Elemento PiastraWeightless_30MM
{
   Descrizione = "Piastra weightless 30mm"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Stendibile   Fianco_30MM
   Alias NoCollision;CamIncidente

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X      "Lunghezza"                 1000 ShowAlways
      Y      "Altezza"                     20 ShowAlways
      Z      "Profonditą"                 300 ShowAlways

      Pia_Spe     "Spessore"                2
      Pia_R       "Raggio"                  5

      X_int  "Lunghezza piastra interna" 1000
      X_est  "Lunghezza piastra esterna" 1000

      NrPiastreAdd   ""  1
      NrPiastra      ""  1
      VersoPiastra   ""  0

      auto "" 0
      M4_A_MURO               "" -1

      M4_DLINK_MODE__         "rimane steso" 0
      //M4_DIALOG               "" 2
      M4_DIALOG               "" 2

      CMP2_AZIONI       "" "M"
      ORD_MISAMETRO     "" "X"

      FIN_var  "" "C082"

      FillerM2G            " " "" ShowAlways

      M4_MIS "" "FillerM2G;X;Z;Y"
   }

   Assegnazioni
   {
      GOSUB AssComune

      X_Min = 244
      X_Max = 1622

      Rie_Lat = 4
      Rie_Prf = 24

      GOSUB NO_AUTO

      //if(ACTION()==2 & CMD()==$CMD_INTERATTIVO & $ATTIVA_DLL==1)
      //{
      //   if ( ins2_att==$ins2_posizionato
      //      | ins2_att==$ins2_agganciato
      //      | ins2_att==$ins2_accessorio )
      //   {
      //      VAR_SET_MODE(ATTUALE(),"X",$MODE_USER)
      //      VAR_SET_MENU(ATTUALE(),"X",STRCAT("( ",STR(X_Min),"-",STR(X_Max)," )"))
      //      VAR_SET_MODE(ATTUALE(),"Z",$MODE_USER)
      //      VAR_SET_MENU(ATTUALE(),"Z",STRCAT("( ",STR(Z_Min),"-",STR(Z_Max)," )"))
      //      CHIEDI(idx_att,"X")
      //      CHIEDI(idx_att,"Z")
      //   }
      //}
   }

   PuntiNotevoli
   {
      GOSUB punti
   }
   #include %path_bdm%\TLib\orie.inc

   Procedura Stendi
   {
      if( VAR_VAL(ATTUALE(),"delme")==1 ) { EXITSUB() }

      if( VAR_VAL(ATTUALE(),"steso")==1 ) { EXITSUB() }

      steso = 1

      //devo controllare i casi in cui non č possibile stendere
      blocca_stesura = 0
      blocca_stesura_msg = ""

      stesi_mode_sx = $stesi_mode_sx
      stesi_mode_dx = $stesi_mode_dx

      if ( $stesi_mode_sx==$stesi_Elemento
         & $stesi_mode_dx==$stesi_Elemento )
      {
         ID_Sin = $stesi_idx1
         ID_Des = $stesi_idx2

         CTLR_SEQUENZA_SXDX(ID_Sin,ID_Des)

         su_ang = 0

         //se hanno angolo diversi , non stendo
         if( ABS(ANG_TOT_NOR(ID_Sin)-ANG_TOT_NOR(ID_Des))>0.1 ) { blocca_stesura = 1 }

         SET_#(ID_Sin)
         P1 = #alto_0
         Z1 = #Z


         SET_#(ID_Des)
         P2 = #alto_3
         Z2 = #Z


         ScriviSuLog(0,"Stendi Piastra 30MM ",STRCAT("ID_Sin=",STR(ID_Sin), " P1=",Point2String(P1) , "  P1.y=",STR(P1.y)))
         ScriviSuLog(0,"Stendi Piastra 30MM ",STRCAT("ID_Des=",STR(ID_Des), " P2=",Point2String(P2) , "  P2.y=",STR(P2.y) , " DIFF=",STR(ABS( P2.y - P1.y ))))


         if( ABS( P2.y - P1.y ) > 0.1  ) { blocca_stesura = 2 }

         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)

         X_tot = FLOOR(((x12*ca+z12*sa)+0.005)*100)/100

         X = X_tot - 2*Rie_Lat

         X_int = X
         X_est = X

         //controllo misura e verifico quante piastre devo inserire
         if( X > X_Max )
         {
            NrPiastreAdd = FLOOR(X_tot/X_Max) + 1

            X_new = X/NrPiastreAdd

            X_int = X_new
            X_est = X_new

            //Se la nuova dimensione non č un numero tondo, sposto i decimali solo su una delle staffe interne
            X_new_arr = MRound( X_new, 0.5)
            if( X_new != X_new_arr )
            {
               X_est = X_new_arr
               X_int = X - X_est*(NrPiastreAdd - 1)
            }
         }

         X = X_est

         z_check = Z1
         if( Z2 > Z1 ) { z_check = Z2 }

         z_check = z_check - 2*Rie_Prf
         Z = z_check

         base_0 = P1
         idx_ref = ID_Sin
      }

      if( blocca_stesura > 0 )
      {
         delme = 1
         FLAG_RADICE = $NO_RAD
         if( blocca_stesura_msg!="" )  { DISPLAY2(blocca_stesura_msg) }

         //DISPLAY2(STRCAT("blocca stesura piastra wtl ---> " , STR(blocca_stesura)))

         //COMANDO2("Show Abilita ON")
         NO_GEST = 1
         EXIT()
      }
   }

   Controlli
   {
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune

      GEST_Y = 18

      GEST_CODICE = ""
      RADICE = "PFS"

      GOSUB GestComune_Post
   }

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

      if( VAR_VAL(ATTUALE(),"delme")==1 )
      {
         COMANDO(STRCAT("DELETE3 ",STR(idx_att)," //Notifica ",NOME(ATTUALE())))
         EXIT()
      }

      wk_verso = 2
      if( NrPiastreAdd > 1 ) { wk_verso = -1 }
      COMANDO(STRCAT("VAR_CHANGE 1 ",STR(ATTUALE()) ," X=",STR(X) , " Z=",STR(Z) ," auto=",STR(auto) , " id_piastra=", STR(ATTUALE()), " VersoPiastra=", STR(wk_verso)))

      if( IS_IDX(idx_ref) )
      {
         wk_offx = Rie_Lat
         wk_offy = 0
         wk_offz = Rie_Prf
         wk_cnt = STRCAT("CNT S + 0,A - 0,R + 0, ",STR(wk_offx)," ",STR(wk_offy)," ",STR(wk_offz)," 0")
         COMANDO(wk_cnt)
         COMANDO(STRCAT("POS2LINK ",STR(ATTUALE()), " ", STR(idx_ref), " //Notifica ",NOME(ATTUALE())))
      }

      COMANDO(STRCAT("RICALCOLA ", STR(idx_att)," //Notifica Piastra"))
      COMANDO("Show Abilita ON")
      COMANDO("Show ALL")
      //COMANDO(STRCAT("SHOW STRUTTURE IDX ADD ", STR(idx_att)))

      id_piastra = ATTUALE()

      if( NrPiastreAdd <= 1 ) { EXITSUB() }

      COMANDO("PUSH_SITUAZIONE")

      wk_offx = 0

      i = 2
      while ( i <= NrPiastreAdd )
      {
         wk_x = X_est

         wk_verso = 0
         if( i == NrPiastreAdd ) { wk_verso = 1 }

         if( NrPiastreAdd > 2 )
         {
            wk_check_min = CEIL( NrPiastreAdd/2 ) - 1
            wk_check_max = CEIL( NrPiastreAdd/2 ) + 1

            if( i > wk_check_min
              & i < wk_check_max ) { wk_x = X_int }
         }

         nome_elemento = cmp_name
         COMANDO(STRCAT("ELEMENTO ",nome_elemento))
         COMANDO("STRUTTURA")
         COMANDO(STRCAT("VAR_SET NO_AUTO=1 id_piastra=", STR(id_piastra+1), " NrPiastra=", STR(i), " VersoPiastra=", STR(wk_verso)))
         COMANDO(STRCAT("VAR_FIX X=",STR(wk_x) , " Z=",STR(Z)))
         lato_ref = "D"
         filo_ab  = "B"
         filo_acc = "R"
         offx     = wk_offx

         COMANDO(STRCAT("CONNESSIONE ",lato_ref," - 0,",filo_ab," + 0,",filo_acc," + 0, ",STR(offx)," 0.0 0.0 0.0"))
         COMANDO(STRCAT("SETTA ",STR(id_piastra)))
         COMANDO("AGGANCIA")

         //WITH_VAR("wk_pia","id_piastra",0,1,STR(id_piastra+1))
         //if( wk_pia > 0 ) { id_piastra = wk_pia[1] }

         wk_offx = wk_offx + wk_x
         i = i + 1
      }

      COMANDO("POP_SITUAZIONE")

      ////cerco l'idx posizionato
      //idx_test = idx_ref
      //valv = 1
      //
      //while( INSERIMENTO2(idx_test)!= $ins2_posizionato & valv <= 50)
      //{
      //   idx_test = AGGANCIATA(idx_test,"*")
      //   valv = valv + 1
      //}

      //if( INSERIMENTO2(idx_test) == $ins2_posizionato  )
      //{
      //   COMANDO(STRCAT("EDITPOS_REL ",STR(idx_test) , " ",STR(0), " -",STR(Y) ," " ,STR(0) , " 0"))
      //}
   }

   Procedura PostGestDllValida
   {
      if( $OnRigenera | $OnLoadOrder | ACTION()<=0 ) { EXITSUB() }

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_items",idx_cnear_dw,1,"*30MM")
      i = 1
      while( i < wk_items )
      {
         if( NOME(wk_items[i]) == "Fianco_30MM"
           | NOME(wk_items[i]) == "Colonna_30MM"  )
         {
            COMANDO(STRCAT("RICALCOLA_UNA ",STR(wk_items[i])," no_agganciati //PostGestDllValida ",NOME(ATTUALE())))
         }
         i = i + 1
      }
   }

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

      AGGANCIATI("wk_agg","*",ATTUALE())
      i = 1
      while ( i <= wk_agg )
      {
         if( NOME(wk_agg[i]) == "PiastraWeightless_30MM" )
         {
            COMANDO(STRCAT("LINK2POS ",STR(wk_agg[i]), "  //cancella ",NOME(ATTUALE())))
         }

         i = i + 1
      }

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_items",idx_cnear_dw,1,"*30MM")
      i = 1
      while( i < wk_items )
      {
         if( NOME(wk_items[i]) == "Fianco_30MM"
           | NOME(wk_items[i]) == "Colonna_30MM"  )
         {
            COMANDO(STRCAT("RICALCOLA_UNA ",STR(wk_items[i])," no_agganciati //cancella ",NOME(ATTUALE())))
         }
         i = i + 1
      }
   }

   Posiziona _graf_PiastraWeightless_30MM pia
   {
      GOSUB posa_blocco

      @X = X - Pia_Spe * ABS(VersoPiastra)

      if( VersoPiastra == -1
        | VersoPiastra ==  2 )
      {
         @base_0.x = base_0.x + Pia_Spe
      }

      GOSUB rivestimento
   }

   Posiziona _graf_Testa_PiastraWeightless_30MM tp_sx
   {
      @escluso = 1
      if( VersoPiastra < 0
        | VersoPiastra == 2 ) { @escluso = 0 }

      GOSUB posa_blocco

      @X = Pia_Spe

      GOSUB rivestimento
   }

   Posiziona _graf_Testa_PiastraWeightless_30MM tp_dx
   {
      @escluso = 1
      if( VersoPiastra > 0 ) { @escluso = 0 }

      GOSUB posa_blocco

      @X = Pia_Spe
      @base_0.x = X - @X

      GOSUB rivestimento
   }

   Posiziona _cont_per_near cn_dw
   {
      @base_0.x = base_0.x + 2
      @base_0.y = base_0.y - 1
      @base_0.z = base_0.z + 10

      @X = X - 4
      @Y = 2
      @Z = Z - 20

      idx_cnear_dw = ATTUALE()
   }
}

Elemento _graf_PiastraWeightless_30MM
{
   Descrizione = "Grafica Piastra Weightless 30MM"
   Code        = STF
   Gruppo      = ""
   Tipo        = ""
   Forma       = PathSweep

   Variabili
   {
      X           "Larghezza"       1000
      Y           "Altezza"         20
      Z           "Profonditą"      300

      Pia_Spe     "Spessore"        2   Implicit
      Pia_R       "Raggio"          5   Implicit
      Pia_Rie     "Rientro Z"       20

      HIDE        ""                1
   }

   Assegnazioni
   {
      i = Pia_R * (1 - SENO(45))

      c_rivestimento = $c_grafite
   }

   PuntiNotevoli
   {
      base_0_m4 = [ 0, 0, 0]
      alto_2_m4 = [ X, Y, Z]

      base_0  = [ 0,       0, Pia_Rie ]
      base_1  = [ X,       0, Pia_Rie ]
      base_2  = [ X, Pia_Spe, Pia_Rie ]
      base_3  = [ 0, Pia_Spe, Pia_Rie ]

      base_path_0 = base_0
      base_path_1 = [ 0,         0,               Pia_R ]
      arc_path_1  = [ 0,         i,                   i ]
      base_path_2 = [ 0,     Pia_R,                   0 ]
      base_path_3 = [ 0, Y - Pia_R,                   0 ]
      arc_path_3  = [ 0,     Y - i,                   i ]
      base_path_4 = [ 0,         Y,               Pia_R ]
      base_path_5 = [ 0,         Y,           Z - Pia_R ]
      arc_path_5  = [ 0,     Y - i,               Z - i ]
      base_path_6 = [ 0, Y - Pia_R,                   Z ]
      base_path_7 = [ 0,     Pia_R,                   Z ]
      arc_path_7  = [ 0,         i,               Z - i ]
      base_path_8 = [ 0,         0,           Z - Pia_R ]
      base_path_9 = [ 0,         0, Z - Pia_R - Pia_Rie ]
   }
}

Elemento _graf_Testa_PiastraWeightless_30MM
{
   Descrizione = "Grafica Piastra Weightless 30MM"
   Code        = STF
   Gruppo      = ""
   Tipo        = ""
   Forma       = XSweep

   Variabili
   {
      X          "Larghezza"       2
      Y          "Altezza"         20
      Z          "Profonditą"      300

      Pia_R      "Raggio"          5  Implicit

     HIDE        ""                1
   }

   Assegnazioni
   {
      i = Pia_R * (1 - SENO(45))

      c_rivestimento = $c_grafite
   }

   PuntiNotevoli
   {
      base_0 = [ 0,         0,     Pia_R]
      arc_0  = [ 0,         i,         i]
      base_1 = [ 0,     Pia_R,         0]
      base_2 = [ 0, Y - Pia_R,         0]
      arc_2  = [ 0,     Y - i,         i]
      base_3 = [ 0,         Y,     Pia_R]
      base_4 = [ 0,         Y, Z - Pia_R]
      arc_4  = [ 0,     Y - i,     Z - i]
      base_5 = [ 0, Y - Pia_R,         Z]
      base_6 = [ 0,     Pia_R,         Z]
      arc_6  = [ 0,         i,     Z - i]
      base_7 = [ 0,         0, Z - Pia_R]

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

      alto_0   = base_0
      alto_0.x = X
   }
}

Elemento ProfiloRaccordoAngolo_30MM
{
   Descrizione = "Raccordo angolo 368"
   Code        = T68
   Gruppo      = "M368"
   Tipo        = Contenitore
   Forma       = ""
   Alias       Pensile

   Variabili
   {
      #include %path_bdm%\var_db.inc

      genera_disegno_collo__ "Variabile per la gestione delle bindelle" 1

      Z       "Profonditą accosto SX"   248 Menu ( Prf_30MM )

      Y       "Altezza"                 184 Menu ( Alt_30MM )
      Yt      "Altezza c/piedini"       184

      X       "Profonditą accosto DX"   248 Menu ( Prf_30MM )


      ConPiedini         "" 0
      ConAttaccaglie     "" 0

      idx_cnear_sx   "" -1
      idx_cnear_dx   "" -1

      CMP2_AZIONI      ""      "S"

      //gestione angolo FS
      tipo_ang_muro "" "S"
      offset_muro   ""  0

      TIPO__             "per M4 definisce il tipo di elemento" 1

      M4_A_MURO          ""  -1
      M4_CNT_LINK_MODE__ ""   0
      M4_CNT_MODE__      ""   1
      M4_CNT_MODE2__     ""   1

      M4_MIS "" "X;Y;Z"

      FillerM2G            " " "" ShowAlways

      FIN_var           "" "C028"
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB AssElementi_30MM

      LarProf = 50
      ProProf = 50
   }

   PuntiNotevoli
   {
      Yt = Y + ConPiedini * $L30_Alt_Pie

      GOSUB punti_Yt

      offset_muro = -X

      base_so = base_0
      alto_ne = alto_2

      base_o0 = base_0     alto_o0 = alto_0
      base_o1 = base_1     alto_o1 = alto_1
      base_o2 = base_1     alto_o2 = alto_1
      base_o3 = base_2     alto_o3 = alto_2

      pnt_sx_0 = base_o0
      pnt_sx_1 = alto_o1
      pnt_dx_0 = base_o3
      pnt_dx_1 = alto_o2
   }

   Orientamenti
   {
      Sinistra base_o0, base_o1, alto_o0, alto_o1
      Destra   base_o3, base_o2, alto_o3, alto_o2
      Alto     alto_o0, alto_o1, alto_o3, alto_o2
      Basso    base_o0, base_o1, base_o2, base_o2
      Fronte   base_o1, base_o2, alto_o1, alto_o2
      Retro    base_o0, alto_o3, alto_o0, base_o3
   }

   Procedura OnQueryBdmLocal
   {
      GOSUB OnQueryBdmLocal_30MM
   }

   Controlli
   {
      GOSUB CtrlComune

      if( ACTION() > 0 & ACTION()!=2 ) { GOSUB SettaPosizione_368 }
   }

   Gestionale
   {
      GOSUB GestComune

      GEST_X = LarProf
      GEST_Z = ProProf

      GOSUB GestComune_Post
   }

   Procedura Offset
   {
      if( VAR_VAL(-1,"offset_idx") != ATTUALE() )  { EXITSUB() }

      GOSUB SettaPosizione_368
      COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE()) , " no_agganciati //Offset ", NOME(ATTUALE())))

      GOSUB Offset_Modulo_368
   }

   Procedura cancella
   {
      GOSUB Cuc_cancella_std2
   }

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

   Posiziona Blocco prof
   {
      GOSUB posa_blocco
      @X = LarProf
      @Z = ProProf
      //@base_0.x = base_0.x + X - @X
      @base_0.z = base_0.z + Z - @Z

      if( ConPiedini == 1 ) { @base_0.y = base_0.y + $M368_Alt_Pie }

      GOSUB rivestimento
   }

   Posiziona _cont_per_near nsx
   {
      idx_cnear_sx = ATTUALE()
      @base_0.x = base_0.x - 1
      @base_0.y = base_0.y + 5
      @base_0.z = base_0.z + 5
      @X = 2
      @Y = Y - 10
      @Z = Z - 10
   }

   Posiziona _cont_per_near ndx
   {
      idx_cnear_dx = ATTUALE()
      @base_0.x = base_0.x + X - 5
      @base_0.y = base_0.y + 5
      @base_0.z = base_0.z + Z - 1
      @X = 2
      @Y = Y - 10
      @Z = X - 10
      @ang_y = -90
   }
}

Elemento BarraRipianoPTV_30MM
{
   Descrizione = "Barra ripiano Porta TV"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente
   Altimetro    Auto
   Attrezzabile Ripiano_30MM

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X       "Larghezza"         368 Menu ( Lar_30MM ) Utente ( 184-2208 )

      Y       "Spessore"           20
      Z       "Profonditą"         20

      VediLimiti_PCV     "" 0

      NO_GEST            "" 0

      FLAG_CompostoGEN  "Modalitą composto GENERICO" 1

      COD_EREDITA        ""  "PRE;POST"

      CMP2_AZIONI        ""  "S"

      M4_A_MURO          ""   1
      M4_CNT_LINK_MODE__ ""   0

      M4_CNT_MODE__      ""   1
      M4_CNT_MODE2__     ""   1

      M4_MIS             "" "X;Y;Z;FillerM2G"

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

      FillerM2G          " " "" ShowAlways
   }

   Assegnazioni
   {
      GOSUB AssComune

      if( $ins_attrezzato == ins_att )  { ALIAS_ADD( ATTUALE() , "BarraTV_30MM" ) }
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Procedura OnQueryBdmLocal
   {
      if( $query_type == 8 )
      {
         $QueryResult__ = 1
         COMPONENTI2("barra",$query_p1,"BarraRipianoPTV_30MM")

         if( barra > 0  ) { $QueryResult__ = 0 }

         //solo se c'č un supporto attrezzato manualmente
         COMPONENTI2("supp",$query_p1,"SupportoRipiano_30MM")
         if( supp > 0 & VAR_VAL($query_p1,"ConSupporto")==0 ) { $QueryResult__ = 0 }

         //if( VAR_VAL_STR($query_p1,"TipoRipianoStr") == "RIPIANO_SCH"
         //  & VAR_VAL_STR($query_p1,"TipoRipianoSch") == "VETRO"  ) { $QueryResult__ = 0 }

         //Luca 19/03/2021
         if( VAR_VAL_STR($query_p1,"TipoRipianoStr") == "RIPIANO_SCH"
           | VAR_VAL_STR($query_p1,"TipoRipianoStr") == "MENSOLA"
           | VAR_VAL_STR($query_p1,"TipoRipianoStr") == "RIPIANO_TER" ) { $QueryResult__ = 0 }

         if( VAR_VAL($query_p1,"X") <552 ) { $QueryResult__ = 0 }
      }
   }

   Procedura OnSetupLivelli
   {
      idx_ref  = $__lev_ref__
      vano_ref = $__lev_vano__

      annulla_ins = 0
      DEL_VAR(idx_att,"liv2add*")
      liv2add    = 1
      liv2add[1] = 0

      COMPONENTI2("barra",idx_ref,"BarraRipianoPTV_30MM")
      COMPONENTI2("supp",idx_ref,"SupportoRipiano_30MM")

      if( barra > 0 | supp > 0)  { annulla_ins = 1 }

      ArrayCopy(ATTUALE(),"liv2add","liv2addscr")
      GOSUB livelli_add2
   }

   Attrezza
   {
      idx_ref = @idx_att
      vano_n  = $vano_n

      base_0  = $vano_0
      base_0.z = $vano_0.z - 1
      base_0.y = $vano_0.y - 1

      X = $larghezza
   }

   Controlli
   {
      GOSUB CtrlComune

      GOSUB CtrlTipoRipiano_Barra_Supporto_30MM
   }

   Gestionale
   {
      GOSUB GestComune

      if( NO_GEST==1 )
      {
         GEST_CODICE = ""
         FLAG_RADICE = $NO_RAD

         HIDE  = 1

         GOSUB GestComune_Post
         EXITSUB()
      }

      GEST_Y = 3
      GEST_Z = 3

      GEST_CODICE = ""
      RADICE      = "BATV30"

      GOSUB GestComune_Post
   }

   Posiziona _grafica_barra_ptv_30MM bl
   {
      GOSUB posa_blocco
      @c_rivestimento = $c_alluminio
   }
}

Elemento _grafica_barra_ptv_30MM
{
   Descrizione = "Fianco "
   Code        = CUB
   Gruppo      = ""
   Tipo        = ""
   Forma       = XSweep

   Variabili
   {
      X "" 1
      Y "" 1
      Z "" 1

      c_rivestimento "" [255,255,255]
      HIDE "" 1
   }

   PuntiNotevoli
   {
      spe = 3

      base_0 = [0,0,0]
      base_1 = [0,0,Z]
      base_2 = [0,spe,Z]
      base_3 = [0,spe,spe]
      base_4 = [0,Y,spe]
      base_5 = [0,Y,0]

      alto_0 = base_0
      alto_0.x = X

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

//Luca 18/02/2021
Elemento Led_30MM
{
   Descrizione = "Ripiano 30mm"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Altimetro    Auto
   Attrezzabile Ripiano_30MM Teca_30MM
   Alias        Led_30MM;CamIncidente

   Variabili
   {
      #include %path_bdm%\var_db.inc

      genera_disegno_collo__ "Variabile per la gestione delle bindelle" 1

      X                  "Larghezza"         368 ShowAlways
      Y                  "Spessore"          9
      Z                  "Profonditą"        6.5

      X_Min              "Largh. min"        367
      X_Max              "Largh. max"        3128

      RieZLed            "Rientro retro LED" 26
      //Utente ( )

      LED_Watt           "WATT LED"          0 ShowAlways

      //1 Superiore
      //2 Inferiore
      PosizioneLED       ""                  1 SaveAlways

      VediIlluminazione  ""                  1

      idx_rif            ""                 -1

      FLAG_CompostoGEN   "Modalitą comp GEN" 1 Boolean

      COD_EREDITA        ""                  "PRE;POST"


      CMP2_AZIONI        ""                  "A"

      M4_MIS             ""                  "X;Y;Z;FillerM2G;RieZLed"

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

      M4_NO_OFFS         ""                   1

      FillerM2G          " "                 "" ShowAlways
   }

   Assegnazioni
   {
      GOSUB AssComune

      // assorbimento 11w/m
      xm = X/1000
      LED_Watt = 11 * xm

      #ifndef TEC
         HIDE_ON_EDIT2(ATTUALE(),"RieZLed",1)
      #endif
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

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

         //LZ: solo se effettivamente ripiano
         //if( NOME($query_p1) == "Ripiano_30MM" )
         if( NOME($query_p1) == "Ripiano_30MM"
           & VAR_VAL_STR( $query_p1, "TipoRipianoStr") == "RIPIANO" )
         {
            #ifndef AGE;RIV
               $QueryResult__ = 1
            #endif

            #ifdef AGE;RIV
               SET_#($query_p1)
               if( IS_IDX(#idx_sch_up)
                 | IS_IDX(#idx_sch_dw)
                 | IS_IDX(#idx_tec_up)
                 | IS_IDX(#idx_tec_dw)  ) { $QueryResult__ = 1 }
            #endif

            //Luca 03/03/2021
            SET_#($query_p1)
            #ifndef AGE;RIV
               nled = 2
               if( IS_IDX(#idx_led_dw) ) { nled = nled - 1 }

               if( IS_IDX(#idx_led_up) ) { nled = nled - 1 }

               if( IS_IDX(#idx_tec_up) )
               {
                  //Luca 18/03/2021
                  // Mantis 024797: 30MM - Led sul ripiano di una teca 3 lati
                  //se teca a 3 lati, non mosso mettere neanche quello sotto
                  if( VAR_VAL(#idx_tec_up,"TipoTeca")==3 )  { nled = nled - 2 }
               }
            #endif

            #ifdef AGE;RIV
               nled = 2
               if( IS_IDX(#idx_led_dw) ) { nled = nled - 1 }

               if( IS_IDX(#idx_led_up) ) { nled = nled - 1 }

               if( IS_IDX(#idx_tec_up) )
               {
                  nled = nled - 1

                  //Luca 18/03/2021
                  // Mantis 024797: 30MM - Led sul ripiano di una teca 3 lati
                  //se teca a 3 lati, non mosso mettere neanche quello sotto
                  if( VAR_VAL(#idx_tec_up,"TipoTeca")==3 )  { nled = nled - 1 }
               }
            #endif

            //COMPONENTI2("wk_led",$query_p1,"Led_30MM")
            //wk_nr = nled - wk_led
            //if( wk_nr <= 0 ) { $QueryResult__ = 0 }
            //if( wk_led >= nled ) { $QueryResult__ = 0 }
            if( nled <= 0 ) { $QueryResult__ = 0 }
         }

         //Luca 05/03/2021
         if( NOME($query_p1) == "Teca_30MM" )
         {
            if( VAR_VAL($query_p1,"TipoTeca") == 3 )
            {
               $QueryResult__ = 1
               COMPONENTI2("wk_led",$query_p1,"Led_30MM")
               if( wk_led >= 1  ) { $QueryResult__ = 0 }

               //se ho un ripiano sopra, blocco
               SET_#($query_p1)
               if( IS_IDX(#idx_rip_up) ) { $QueryResult__ = 0 }
            }
         }
      }
   }

   Procedura OnSetupLivelli
   {
      idx_ref  = $__lev_ref__
      vano_ref = $__lev_vano__

      annulla_ins = 0
      DEL_VAR(idx_att,"liv2add*")
      liv2add    = 0

      if( NOME(idx_ref) == "Ripiano_30MM" )
      {
         SET_#(idx_ref)

         livello_inferiore = 0
         livello_superiore = 0

         if( IS_IDX(#idx_led_dw) == 0 ) { livello_inferiore = 1 }
         if( IS_IDX(#idx_tec_up) )
         {
            //Luca 18/03/2021
            // Mantis 024797: 30MM - Led sul ripiano di una teca 3 lati
            //se teca a 3 lati, non mosso mettere neanche quello sotto
            if( VAR_VAL(#idx_tec_up,"TipoTeca")==3 ) { livello_inferiore = 0 }
         }

         if( livello_inferiore )
         {
            ne = liv2add + 1
            liv2add = ne
            liv2add[ne] = 0
         }

         #ifdef AGE;RIV
            if( IS_IDX(#idx_led_up) == 0 & IS_IDX(#idx_tec_up) == 0 ) { livello_superiore = 1 }
         #endif

         #ifndef AGE;RIV
            if( IS_IDX(#idx_led_up) == 0 ) { livello_superiore = 1 }

            if( IS_IDX(#idx_tec_up) )
            {
               if( VAR_VAL(#idx_tec_up,"TipoTeca")==3 ) { livello_superiore = 0 }
            }

         #endif

         if( livello_superiore )
         {
            ne = liv2add + 1
            liv2add = ne
            liv2add[ne] = VAR_VAL(idx_ref,"Y")
         }
      }

      //Luca 05/03/2021
      if( NOME(idx_ref) == "Teca_30MM" )
      {
         ne = liv2add + 1
         liv2add = ne
         liv2add[ne] = VAR_VAL(idx_ref,"Y")

         COMPONENTI2("wk_led",idx_ref,"Led_30MM")
         if( wk_led > 0 )  { annulla_ins = 1 }
      }


      if( liv2add == 0 ) { annulla_ins = 1 }

      ArrayCopy(ATTUALE(),"liv2add","liv2addscr")
      GOSUB livelli_add2
   }

   Attrezza
   {
      idx_ref = @idx_att
      vano_n = $vano_n

      PosizioneLED = 2
      if( $livello > @Y/2 ) { PosizioneLED = 1 }

      X = $larghezza - 1

      base_0.x = @base_0.x + 0.5
      base_0.y = @base_0.y + $livello - 1
      if( PosizioneLED == 1  ) { base_0.y = @base_0.y + $livello - Y + 1 }

      base_0.z = @base_0.z + RieZLed

      if( NOME(idx_ref) == "Teca_30MM" )
      {
         X = $larghezza - 6

         base_0.x = @base_0.x + 3

         PosizioneLED = 1
         base_0.y = @base_0.y + @Y - Y - 12.5
         base_0.z = @base_0.z + 8.5

         if( $livello == 0 )
         {
            PosizioneLED = 2
            base_0.y = @base_0.y
         }
      }

      if( ACTION() == 2 & $OnLoadOrder == 0 )
      {
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_ref)," //PostGestDllValida ",NOME(ATTUALE())))
      }
   }

   Controlli
   {
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune

      RADICE = "LEDPAN368"
      GEST_CODICE = ""

      GEST_Y = 7
      GEST_Z = 8.6

      GOSUB GestComune_Post
   }

   Procedura PostAction2
   {
      if( $OnRigenera == 1 | $OnLoadOrder==1 ) { EXITSUB() }

      #ifdef AGE;RIV
         EXITSUB()
      #endif

      //verifico se non č presente uno schienali e/o teca per l'alloggiamento del trasformatore e avviso

      //vedi procedura Ctrl_Led_SenzaTrasf_30MM

      idx_rip = PADRE(ATTUALE(),1)
      if( NOME(idx_rip) != "Ripiano_30MM" )  { EXITSUB() }

      SET_#(idx_rip)

      if( IS_IDX(#idx_sch_dw) == 0
        & IS_IDX(#idx_sch_up) == 0
        & IS_IDX(#idx_tec_up) == 0
        & IS_IDX(#idx_tec_dw) == 0  )
      {
         msg = STRCAT(MSG(1090),"\n",MSG(1255))
         DISPLAY2(msg)
      }
   }

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

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

      COMANDO(STRCAT("RICALCOLA_UNA ",STR(GetTopLevel(ATTUALE())),"  // cancella LED_30MM"))
   }

   Posiziona Blocco_Luce bl
   {
      GOSUB posa_blocco

      @FacciaLuminosa = "DW"
      if( PosizioneLED == 1  ) { @FacciaLuminosa = "UP" }
   }

   Posiziona VediLuce vd1
   {
      npl = 1
      if( X >= 1000 )  { npl = 2 }
      if( X >= 2000 )  { npl = 3 }

      @escluso = 1 - VediIlluminazione
      @base_0.x = base_0.x + X/(npl+1) - @X/2

      @base_0.y = base_0.y - @Y - 2
      @ang_x = 0
      @base_0.z = base_0.z + 1
      if( PosizioneLED == 1  )
      {
         @base_0.y = base_0.y + Y + @Y + 2
         @ang_x = 180
      }
   }

   Posiziona VediLuce vd2
   {
      @escluso = 1

      if( VediIlluminazione )
      {
         if( npl >= 2 )  { @escluso = 0 }
      }

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

      @base_0.y = base_0.y - @Y - 2
      @ang_x = 0
      @base_0.z = base_0.z + 1
      if( PosizioneLED == 1  )
      {
         @base_0.y = base_0.y + Y + @Y + 2
         @ang_x = 180
      }
   }

   Posiziona VediLuce vd3
   {
      @escluso = 1

      if( VediIlluminazione )
      {
         if( npl >= 3 )  { @escluso = 0 }
      }

      @base_0.x = base_0.x + X/2 - @X/2
      @base_0.y = base_0.y - @Y - 2
      @ang_x = 0
      @base_0.z = base_0.z + 1
      if( PosizioneLED == 1  )
      {
         @base_0.y = base_0.y + Y + @Y + 2
         @ang_x = 180
      }
   }
}

//Elemento Teca3lati_30MM
Elemento Teca_30MM
{
   Descrizione = "Teca 3 lati 30mm"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Alias       Teca_30MM
   Altimetro    Auto
   Attrezzabile Ripiano_30MM

   Variabili
   {
      #include %path_bdm%\var_db.inc

      genera_disegno_collo__ "Variabile per la gestione delle bindelle" 1

      X       "Larghezza"         368 Menu ( Lar_30MM )      Utente ( 184-2944 )
      //LZ 05/05/2021: modifico max e default Y effettiva teca, č 30mm pił piccola del fianco
      //Y       "Altezza"           368 Menu ( AltTeca_30MM )  Utente ( 154-368 )
      Y       "Altezza"           338 Menu ( AltTeca_30MM )  Utente ( 154-338 )
      Z       "Profonditą"        248 Menu ( ProfTeca_30MM ) Utente ( 284-384 )

      //tipologia 3/4 lati
      TipoTeca    "" 3

      ConLedSopra "" 0
      ConLedSotto "" 0

      idx_vetro_fiasx "" -1
      idx_vetro_fiadx "" -1
      idx_vetro_cop "" -1
      idx_vetro_base "" -1

      L30_Spe_VetTec  "Spessore vetri teca"     4
      L30_Spe_SchTec  "Spessore schiena teca"  23
      Aria_Vet        "Aria fra vetri" 0.5

      //per continuitą di vena
      t_rivestimento_sch  ""  ""

      idx_fia_up  "" -1
      idx_fia_dw  "" -1
      idx_sch_sx  "" -1
      idx_sch_dx  "" -1

      FLAG_CompostoGEN  "Modalitą composto GENERICO" 1 Boolean

      COD_EREDITA        ""  "PRE;C048_PRE;POST"

      CMP2_AZIONI        ""  "A"

      M4_A_MURO          ""  -1
      M4_CNT_LINK_MODE__ ""   0
      M4_CNT_MODE__      ""   1
      M4_CNT_MODE2__     ""   1

      //Luca 16/04/2021 x stampa
      #ifdef TE
      EsplodiTECA        ""   0 Boolean
      #endif
      #ifndef TE
      EsplodiTECA        ""   0
      #endif

      ////GESTIONE STENDI
      //M4_DIALOG "" 32
      //M4_DLINK_MODE__ "rimane steso"  0
      //M4_STENDI_RIPETIZIONI      "" 1
      ////M4_STENDI_CON_INTERRUZIONI "" 1
      //M4_STENDI_BREAK_AND_RESTART__ "" 1
      //Stendi_PosRipiano  "Posizione Ripiano 30MM" -1 Menu ( PosRip30MM )

      M4_MIS             "" "X;Y;Z;FillerM2G"

      FIN_var            ""  "C042"
      FIN_orie           ""  "O"

      FillerM2G          " " "" ShowAlways

      //LZ 12/04/2021
      STP_Bollina = 1
      STP_Bollina_Cat = "C042"
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB AssElementi_30MM

      //Simone 16/04/24 - Su indicazione di Ale R. abbasso il limite a 308
      //X_Min = 368
      X_Min = 308
      X_Max = 2944

      Y_Min = 154
      //LZ 05/05/2021: modifico max Y effettiva teca, č 30mm pił piccola del fianco
      //Y_Max = 368
      Y_Max = 338

      Cop_RidZ_Led = 7

      GOSUB Set_Dimensioni_Teca_30MM

      Z_Min = 248
      Z_Max = 384

      L30_Spe_VetTec = 4
      L30_Spe_SchTec = 23

      RieZ_Sch = 0

      menu_x = "Lar_30MM"

      if( TipoTeca == 4 )
      {
         X_Max = 2208
         //Y_Max = 1158
         //menu_y = "AltTeca4_30MM"
         menu_x = "LarTeca4_30MM"

         L30_Spe_SchTec = 20
         RieZ_Sch = 6.5
      }

      if( $ATTIVA_DLL==1 & ACTION()>0 )
      {
         VAR_SET_MENU(ATTUALE(),"X",STRCAT(menu_x,"( ",STR(X_Min),"-",STR(X_Max)," )"))
         VAR_SET_MENU(ATTUALE(),"Y",STRCAT(menu_y,"( ",STR(Y_Min),"-",STR(Y_Max)," )"))
         VAR_SET_MENU(ATTUALE(),"Z",STRCAT("ProfTeca_30MM( ",STR(Z_Min),"-",STR(Z_Max)," )"))
      }

      GOSUB HideFigliInseriti2
   }

   PuntiNotevoli
   {
      GOSUB punti

      vano_0_0 = base_0
      vano_l_0 = X
      vano_p_0 = Z + 10

      pnt_cont_30MM_1 = base_0
      pnt_cont_30MM_2 = base_3
      pnt_cont_30MM_3 = alto_0
      pnt_cont_30MM_4 = alto_3

      STP_Bollina_Pnt = [ X/2 , Y/2 - 56.5 , Z ]
   }

   #include %path_bdm%\Tlib\orie.inc

   Procedura OnQueryBdmLocal
   {
      GOSUB OnQueryBdmLocal_30MM

      if( $query_type == 8 )
      {
         $QueryResult__ = 1
         if( NOME($query_p1) == "Ripiano_30MM" )
         {
            //#ifndef AGE;RIV
            //   $QueryResult__ = 1
            //#endif

            //#ifdef AGE;RIV
            //   SET_#($query_p1)
            //   if( IS_IDX(#idx_sch_up) | IS_IDX(#idx_sch_dw) ) { $QueryResult__ = 1 }
            //#endif

            //LZ 05/07/2021: controllo che il ripiano sia del tipo corretto
            if( VAR_VAL( $query_p1, "TipoRipiano") != 1 ) { $QueryResult__ = 0 }

            //Luca 24/02/2021
            COMPONENTI2("wk_teche",$query_p1,"Teca_30MM")
            if( wk_teche > 0 )  { $QueryResult__ = 0 }

            if( VAR_VAL($query_p1,"X") < X_Min
              | VAR_VAL($query_p1,"X") > X_Max ) { $QueryResult__ = 0 }

            if( VAR_VAL($query_p1,"Z") < Z_Min
              | VAR_VAL($query_p1,"Z") > Z_Max ) { $QueryResult__ = 0 }

            //Luca 03/03/2021 non posso attrezzare la teca se ho un led sopra
            SET_#($query_p1)
            if( IS_IDX(#idx_led_up) )  { $QueryResult__ = 0 }

            //Luca 04/03/2021
            if( IS_IDX(#idx_tec_up) )  { $QueryResult__ = 0 }
         }
      }

   }

   Procedura OnSetupLivelli
   {
      idx_ref  = $__lev_ref__
      vano_ref = $__lev_vano__

      annulla_ins = 0
      DEL_VAR(idx_att,"liv2add*")
      liv2add    = 0

      SET_#(idx_ref)

      //if( IS_IDX(#idx_tec_dw) == 0 )
      //{
      //   ne = liv2add + 1
      //   liv2add = ne
      //   liv2add[ne] = 0
      //}

      if( IS_IDX(#idx_tec_up) == 0 )
      {
         ne = liv2add + 1
         liv2add = ne
         liv2add[ne] = VAR_VAL(idx_ref,"Y")
      }

      if( liv2add == 0 ) { annulla_ins = 1 }

      ArrayCopy(ATTUALE(),"liv2add","liv2addscr")
      GOSUB livelli_add2
   }

   Attrezza
   {
      idx_ref = @idx_att
      vano_n = $vano_n

      X = $larghezza
      if( X > X_Max ) { X = X_Max }

      base_0.x = @base_0.x
      base_0.y = @base_0.y + $livello
      base_0.z = @base_0.z

      Z = $profondita
      if( Z > Z_Max ) { Z = Z_Max }
   }

   Controlli
   {
      GOSUB CtrlComune

      //GOSUB CtrlFianco_30MM
      GOSUB CtrlFianco_TrovaRipiano_UpDw_30MM

      if( ins2_att == $ins2_posizionato )  { ChiediMisureInserimento(ATTUALE()) }

      if( ACTION() > 0 & ACTION()!=2 & IS_VAR_FIXED(ATTUALE(),"Y")==0 )
      {
         BOX_MODE(0)
         NEAR_GLOBALE2("wk_rip",idx_cnear_sup,2,"Ripiano_30MM")

         if( wk_rip > 0 )
         {
            SORT_POINT(base_0,"wk_rip","base_0")
            SET_#(wk_rip[1])
            wk_y = #base_0.y - base_0.y

            if( wk_y > Y_Max )  { wk_y = Y_Max }
            Y = wk_y
            VAR_SET_MODIFICATA(ATTUALE(),"Y","")
         }

         //Luca 31/03/2021
         //controllo dim fianco sx e dx
         //Mantis 24620: 30MM - Altezza teca 3 Lati
         idx_fia_sx = -1
         idx_fia_dx = -1
         NEAR_GLOBALE2("wk_fiasx",idx_cnear_sx,2,"Fianco_30MM")
         NEAR_GLOBALE2("wk_fiadx",idx_cnear_dx,2,"Fianco_30MM")
         if( wk_fiasx > 0 ) { idx_fia_sx = wk_fiasx[1] }
         if( wk_fiadx > 0 ) { idx_fia_dx = wk_fiadx[1] }

         if( TipoTeca==3 )
         {
            y_max_sx = Y
            y_max_dx = Y

            if( IS_IDX(idx_fia_sx) )
            {
               SET_#(idx_fia_sx)
               wk_diffy_sx = #alto_0.y - base_0.y
               if( wk_diffy_sx > 0
                 & wk_diffy_sx < y_max_sx ) { y_max_sx = wk_diffy_sx  }
            }

            if( IS_IDX(idx_fia_dx) )
            {
               SET_#(idx_fia_dx)
               wk_diffy_dx = #alto_0.y - base_0.y
               if( wk_diffy_dx > 0
                 & wk_diffy_dx < y_max_dx ) { y_max_dx = wk_diffy_dx  }
            }

            if( y_max_dx < Y | y_max_sx < Y )
            {
               Y =  y_max_dx
               if( y_max_sx < y_max_dx ) { Y =  y_max_sx }
               VAR_SET_MODIFICATA(ATTUALE(),"Y","")
            }
         }
      }

      //Luca 03/03/2021
      if( ACTION() > 0 & ACTION()!=2 & $OnLoadOrder != 1 )
      {
         ConLedSopra = 0
         ConLedSotto = 0

         BOX_MODE(0)
         NEAR_GLOBALE2("wk_led",idx_vetro_cop,5,"Led_30MM")
         if( wk_led > 0 ) { ConLedSopra = 1 }

         BOX_MODE(0)
         NEAR_GLOBALE2("wk_led",idx_vetro_base,5,"Led_30MM")
         if( wk_led > 0 ) { ConLedSotto = 1 }
      }
   }

   Gestionale
   {
      GOSUB GestComune

      GOSUB GestElementi_30MM

      //GOSUB Set_Gest_C003_Fianco_30MM
      //rob_pec 11/02/2021
      //GOSUB Set_Gest_C087_Fianco_30MM
      //GOSUB Set_Gest_C008_Fianco_30MM

      GOSUB Set_Gest_C009_Teca_30MM

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura OnTabEredita
   {
      if( TABER_REGOLA == "PRE" )
      {
         GOSUB Set_Gest_C009_Teca_30MM
      }

      if( TABER_REGOLA == "C048_PRE" )
      {
         if( VAR_VAL_STR(ATTUALE(),"GEST_C042") != ""
           & IS_VAR_FIXED(ATTUALE(),"GEST_C048") ==0 )
         {
            C048 = VAR_VAL_STR(ATTUALE(),"GEST_C042")
            VarAdd = "C048"   GOSUB Add_TABER_VARSETTATE
         }
      }
   }

   //Procedura PostAction2
   //{
   //   if( $ATTIVA_DLL==1 & $OnLoadOrder == 0 )
   //   {
   //      if ( IS_VAR_FIXED(idx_att,"M4_FIX_Y") !=1 )
   //      {
   //         base0y = FLOOR(base_0.y*10)/10
   //         COMANDO(STRCAT("VAR_CHANGE 1 ",STR(idx_att)," M4_FIX_Y=",STR(base0y)))
   //      }
   //   }
   //}

   Procedura CtrlPosDim_Teca_30MM
   {
      GOSUB CtrlPosDim_Teca_30MM
   }

   Procedura PostAction2
   {
      GOSUB PostAction2_30MM
   }

   Procedura PostGestDllValida
   {
      if( $OnRigenera | $OnLoadOrder | ACTION()<=0 ) { EXITSUB() }

      COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE())," //PostGestDllValida ",NOME(ATTUALE())))

      GOSUB Ctrl_Dimensioni_Teca_30MM
   }

   Procedura Offset
   {
   }

   Procedura cancella
   {
   }

   Posiziona BaseTeca_30MM bt
   {
      @base_0.x = base_0.x + Aria_Vet
      @base_0.y = base_0.y
      @base_0.z = base_0.z + L30_Spe_SchTec + Aria_Vet
      @X = X - 2*Aria_Vet
      @Y = L30_Spe_VetTec
      @Z = Z - L30_Spe_SchTec - Aria_Vet

      if( TipoTeca == 4 )
      {
         @base_0.z = base_0.z + L30_Spe_SchTec + Aria_Vet + RieZ_Sch
         @Z = Z - L30_Spe_SchTec - Aria_Vet - RieZ_Sch
      }

      //Luca 03/03/2021
      if( ConLedSotto )
      {
         @base_0.z = @base_0.z + Cop_RidZ_Led
         @Z = @Z - Cop_RidZ_Led
      }
      @ConLed = ConLedSotto

      idx_vetro_base = ATTUALE()

      @t_rivestimento = Calcola_T_Rivestimento_Offset(t_rivestimento_sch, 0, - @Z)
   }

   Posiziona CopTeca_30MM ct
   {
      @escluso = 1
      if( TipoTeca == 4 )  { @escluso = 0 }

      @base_0.x = base_0.x + Aria_Vet
      @base_0.y = base_0.y + Y - L30_Spe_VetTec
      @base_0.z = base_0.z + L30_Spe_SchTec + Aria_Vet + RieZ_Sch
      @X = X - 2*Aria_Vet
      @Y = L30_Spe_VetTec
      @Z = Z - L30_Spe_SchTec - Aria_Vet - RieZ_Sch

      //Luca 03/03/2021
      if( ConLedSopra )
      {
         @base_0.z = @base_0.z + Cop_RidZ_Led
         @Z = @Z - Cop_RidZ_Led
      }

      idx_vetro_cop = ATTUALE()

      @ConLed = ConLedSopra

      @t_rivestimento = Calcola_T_Rivestimento_Offset(t_rivestimento_sch, 0, Y)
   }

   Posiziona FiancoTeca_30mm ftsx
   {
      GOSUB posa_blocco
      @base_0.y = base_0.y + L30_Spe_VetTec + Aria_Vet
      //@base_0.z = base_0.z + L30_Spe_SchTec + L30_Spe_VetTec + Aria_Vet
      @base_0.z = base_0.z + L30_Spe_SchTec + Aria_Vet
      @X = L30_Spe_VetTec
      @Y = Y - L30_Spe_VetTec - Aria_Vet
      //@Z = Z - L30_Spe_SchTec - L30_Spe_VetTec - Aria_Vet
      @Z = Z - L30_Spe_SchTec - Aria_Vet

      if( TipoTeca == 4 )
      {
         @base_0.z = base_0.z + L30_Spe_SchTec + Aria_Vet + RieZ_Sch
         @Z = Z - L30_Spe_SchTec - Aria_Vet - RieZ_Sch
         @Y = Y - 2*(L30_Spe_VetTec + Aria_Vet)
      }

      @Verso = -1
      idx_vetro_fiasx = ATTUALE()

      @t_rivestimento = Calcola_T_Rivestimento_Offset(t_rivestimento_sch, - @Z - 0.5, 4)
   }

   Posiziona FiancoTeca_30mm ftdx
   {
      GOSUB posa_blocco
      @base_0.x = base_0.x + X - L30_Spe_VetTec
      @base_0.y = base_0.y + L30_Spe_VetTec + Aria_Vet
      //@base_0.z = base_0.z + L30_Spe_SchTec + L30_Spe_VetTec + Aria_Vet
      @base_0.z = base_0.z + L30_Spe_SchTec + Aria_Vet
      @X = L30_Spe_VetTec
      @Y = Y - L30_Spe_VetTec - Aria_Vet
      //@Z = Z - L30_Spe_SchTec - L30_Spe_VetTec - Aria_Vet
      @Z = Z - L30_Spe_SchTec - Aria_Vet

      if( TipoTeca == 4 )
      {
         @base_0.z = base_0.z + L30_Spe_SchTec + Aria_Vet + RieZ_Sch
         @Z = Z - L30_Spe_SchTec - Aria_Vet - RieZ_Sch

         @Y = Y - 2*(L30_Spe_VetTec + Aria_Vet)
      }

      @Verso =  1
      idx_vetro_fiadx = ATTUALE()

      @t_rivestimento = Calcola_T_Rivestimento_Offset(t_rivestimento_sch, X + 0.5, 4)
   }

   Posiziona SchienaTeca_30mm st
   {
      GOSUB posa_blocco
      @base_0.x = base_0.x + Aria_Vet
      @base_0.y = base_0.y + Aria_Vet
      @X = X - 2*Aria_Vet
      @Y = Y - Aria_Vet
      @Z = L30_Spe_SchTec

      if( TipoTeca == 4 )
      {
         @base_0.z = base_0.z + RieZ_Sch

         @base_0.y = base_0.y + 2
         @Y = Y - 4
      }

      idx_schiena_teca   = ATTUALE()
      t_rivestimento_sch = VAR_VAL_STR(ATTUALE(),"t_rivestimento")
   }

   Posiziona _cont_per_near cn_sup
   {
      @base_0.x = base_0.x + 20
      @base_0.y = base_0.y + 20
      @base_0.z = base_0.z + 20

      @X = X - 40
      @Y = Y_Max + 30
      @Z = Z - 40

      idx_cnear_sup = ATTUALE()
   }

   #include %path_bdm%\Linea30mm_cont.inc
   //#include %path_bdm%\Linea30mm_cont_DBG.inc

}

Elemento BaseTeca_30MM
{
   Descrizione = "Base Teca 30mm"
   Code        = 30MM
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamInciso;CamIncidente;TopVet368

   Variabili
   {
      #include %path_bdm%\var_db.inc

      genera_disegno_collo__ "Variabile per la gestione delle bindelle" 1

      X       "Larghezza"         368
      Y       "Spessore"            8
      Z       "Profonditą"        248

      TipoTeca "" 3 Implicit

      idx_pannello  "" -1

      AttivaPanMartire "" 0
      PanMar_X    "" 0
      PanMar_Y    "" 0
      PanMar_Z    "" 0
      PanMar_OffX "" 0

      t_rivestimento   "" ""

      VediLimiti_PCV   "" 0

      ConLed      "" 0

      //GEST_CODICE "" "VTE005"

      //per stampe
      EsplodiTECA        ""  0 Implicit

      Ord_Sost_Allegato  ""  1

      COD_EREDITA        ""  "PRE;POST"

      FIN_var            ""  "C042"
      FIN_orie           ""  "O"

      FillerM2G          " " "" ShowAlways

      //VARIABILE TECNICA
      XGLASS      "Num. XGLASS" "" Utente ( )
   }

   Assegnazioni
   {
      GOSUB AssComune
   }

   PuntiNotevoli
   {
      GOSUB punti

      vano_0_0 = base_0
      vano_l_0 = X
      vano_p_0 = Z

      //LZ 24/11/2021: stampe scassi
      pnt_top_b0 = base_0
      pnt_top_b1 = base_1
      pnt_top_b2 = base_2
      pnt_top_b3 = base_3
   }
   //#include %path_bdm%\Tlib\orie.inc

   Controlli
   {
      GOSUB CtrlComune

      GOSUB CtrlTeca_TrovaPannello_30MM
   }

   Gestionale
   {
      GOSUB GestComune

      //GOSUB GestElementi_30MM

      GEST_CODICE = "VTE005"
      if( TipoTeca == 4 )  { GEST_CODICE = "VTE001" }

      //LZ 24/11/2021
      //Luca 16/04/2021 25131: Teca 4 lati - Lavorazioni vetro ripiano
      //if( TipoTeca == 4 )
      //{
      //   C008 = "__"
      //   if( ConLed ==1 )  { C008 = "SM074" }
      //   VarAdd = "C008"   GOSUB Add_TABER_VARSETTATE
      //}
      GOSUB Set_Gest_C008_VetroTeca_30MM

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }


   Procedura OnTabEredita
   {
      #ifndef TEC
         if( TABER_REGOLA=="PRE" )
         {
            BloccaModificaCatGest_Cmp_368( ATTUALE() , STRCAT("GEST_",FIN_var) )

            //Luca 16/04/2021
            BloccaModificaCatGest_Cmp_368( ATTUALE() , "GEST_C008" )
         }
      #endif
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }

   Posiziona BloccoBlend bl
   {
      @escluso = 0
      if( $VIRTUO | $VIRTUO_TEST | $OnTREND  ) { @escluso = 1 }

      GOSUB posa_blocco
      GOSUB rivestimento

      @f_rivestimento = "0.4"
      if( t_rivestimento != "" ) { @t_rivestimento = t_rivestimento }

      @BLEND__ = 1

      @STP_XG_VISTA_ISO = 1
   }

   //Luca 21/02/2022
   Posiziona VR_Vetro vrv
   {
      @escluso = 1
      if( $VIRTUO | $VIRTUO_TEST | $OnTREND  ) { @escluso = 0 }

      GOSUB posa_blocco
      GOSUB rivestimento

      @OrieVetro = "TOP"

      @FIN_var = FIN_var
   }

   //Luca 16/04/2021
   Posiziona Blocco st2
   {
      @escluso = 1 - EsplodiTECA

      GOSUB posa_blocco
      GOSUB rivestimento

      //Luca 19/04/2021
      @base_0.y = base_0.y - 2.5
      if( ConLed  ) { @base_0.y = base_0.y - 9.5 }

      @STP_XG_VISTA_ESPLOSO = 1

      @ang_x = 90
   }

   Posiziona PannelloMartireTeca_30mm panm
   {
      @escluso = 1 - AttivaPanMartire

      @Y = 19
      @X = PanMar_X
      @Z = PanMar_Z

      @base_0.x = base_0.x - PanMar_OffX
      @base_0.y = base_0.y - @Y
      @base_0.z = base_0.z + Z - PanMar_Z
   }

   Posiziona _cont_per_near cn
   {
      @base_0.x = base_0.x + 20
      @base_0.y = base_0.y - 5
      @base_0.z = base_0.z + 20

      @X = X - 40
      @Y = 10
      @Z = Z - 40

      idx_cnear = ATTUALE()
   }

   //{ CONTROLLO COLLISIONI PASSACAVI
   Posiziona PCV_ContCollisioni_368 cs1
   {
      limite = 50

      @base_0.x = base_0.x
      @base_0.y = base_0.y - Y/2
      @base_0.z = base_0.z
      @X = X
      @Y = 40
      @Z = limite
   }

   Posiziona PCV_ContCollisioni_368 cs2
   {
      @base_0.x = base_0.x
      @base_0.y = base_0.y - Y/2
      @base_0.z = base_0.z + Z - limite
      @X = X
      @Y = 40
      @Z = limite
   }
   Posiziona PCV_ContCollisioni_368 cs3
   {
      @base_0.x = base_0.x
      @base_0.y = base_0.y - Y/2
      @base_0.z = base_0.z + limite
      @X = limite
      @Y = 40
      @Z = Z - 2*limite
   }
   Posiziona PCV_ContCollisioni_368 cs4
   {
      @base_0.x = base_0.x + X - limite
      @base_0.y = base_0.y - Y/2
      @base_0.z = base_0.z + limite
      @X = limite
      @Y = 40
      @Z = Z - 2*limite
   }
   //} CONTROLLO COLLISIONI PASSACAVI

   //#include %path_bdm%\Linea30mm_cont.inc
   //#include %path_bdm%\Linea30mm_cont_DBG.inc
}

Elemento CopTeca_30MM
{
   Descrizione = "Coperchio Teca 30mm"
   Code        = 30MM
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamInciso;CamIncidente;TopVet368

   Variabili
   {
      #include %path_bdm%\var_db.inc

      genera_disegno_collo__ "Variabile per la gestione delle bindelle" 1

      X       "Larghezza"         368
      Y       "Spessore"            8
      Z       "Profonditą"        248

      TipoTeca "" 4 Implicit

      idx_pannello  "" -1

      AttivaPanMartire "" 0
      PanMar_X    "" 0
      PanMar_Y    "" 0
      PanMar_Z    "" 0
      PanMar_OffX "" 0

      t_rivestimento     "" ""

      VediLimiti_PCV     "" 0

      GEST_CODICE "" "VTE002"

      ConLed      "" 0

      COD_EREDITA        ""  "PRE;POST"

      FIN_var            ""  "C042"
      FIN_orie           ""  "O"

      FillerM2G          " " "" ShowAlways

      //per stampe
      EsplodiTECA        ""   0 Implicit

      Ord_Sost_Allegato  ""   1

      //VARIABILE TECNICA
      XGLASS      "Num. XGLASS" "" Utente ( )
   }

   Assegnazioni
   {
      GOSUB AssComune
   }

   PuntiNotevoli
   {
      GOSUB punti

      base_so = base_0
      alto_ne = alto_2

      //LZ 24/11/2021: stampe scassi
      pnt_top_b0 = base_0
      pnt_top_b1 = base_1
      pnt_top_b2 = base_2
      pnt_top_b3 = base_3
   }

   Controlli
   {
      GOSUB CtrlComune

      GOSUB CtrlTeca_TrovaPannello_30MM
   }

   Gestionale
   {
      GOSUB GestComune

      //LZ 24/11/2021
      //Luca 16/04/2021 25131: Teca 4 lati - Lavorazioni vetro ripiano
      //C008 = "__"
      //if( ConLed ==1 )  { C008 = "SM074" }
      //VarAdd = "C008"   GOSUB Add_TABER_VARSETTATE
      GOSUB Set_Gest_C008_VetroTeca_30MM

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura OnTabEredita
   {
      #ifndef TEC
         if( TABER_REGOLA=="PRE" )
         {
            BloccaModificaCatGest_Cmp_368( ATTUALE() , STRCAT("GEST_",FIN_var) )

            //Luca 16/04/2021
            BloccaModificaCatGest_Cmp_368( ATTUALE() , "GEST_C008" )
         }
      #endif
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }

   Posiziona BloccoBlend bl
   {
      GOSUB posa_blocco
      GOSUB rivestimento
      @f_rivestimento = "0.4"
      if( t_rivestimento != "" ) { @t_rivestimento = t_rivestimento }

      @BLEND__ = 1
      @STP_XG_VISTA_ISO = 1
   }

   //Luca 16/04/2021
   Posiziona Blocco st2
   {
      @escluso = 1 - EsplodiTECA

      GOSUB posa_blocco
      GOSUB rivestimento

      @STP_XG_VISTA_ESPLOSO = 1

      @ang_x = -90
      @base_0.y = @base_0.y + Y

      //Luca 19/04/2021
      @base_0.y = base_0.y + Y + 2.5
      if( ConLed  ) { @base_0.y = base_0.y + Y + 9.5}
   }

   Posiziona PannelloMartireTeca_30mm panm
   {
      @escluso = 1 - AttivaPanMartire

      @Y = 19
      @X = PanMar_X
      @Z = PanMar_Z

      @base_0.x = base_0.x - PanMar_OffX
      @base_0.y = alto_0.y
      @base_0.z = base_0.z + Z - PanMar_Z
   }

   Posiziona _cont_per_near cn
   {
      @base_0.x = base_0.x + 20
      @base_0.y = base_0.y + Y - 5
      @base_0.z = base_0.z + 20

      @X = X - 40
      @Y = 10
      @Z = Z - 40

      idx_cnear = ATTUALE()
   }

   //{ CONTROLLO COLLISIONI PASSACAVI
   Posiziona PCV_ContCollisioni_368 cs1
   {
      limite = 50

      @base_0.x = base_0.x
      @base_0.y = base_0.y + Y
      @base_0.z = base_0.z
      @X = X
      @Y = 60
      @Z = limite
   }

   Posiziona PCV_ContCollisioni_368 cs2
   {
      @base_0.x = base_0.x
      @base_0.y = base_0.y + Y
      @base_0.z = base_0.z + Z - limite
      @X = X
      @Y = 60
      @Z = limite
   }
   Posiziona PCV_ContCollisioni_368 cs3
   {
      @base_0.x = base_0.x
      @base_0.y = base_0.y + Y
      @base_0.z = base_0.z + limite
      @X = limite
      @Y = 60
      @Z = Z - 2*limite
   }
   Posiziona PCV_ContCollisioni_368 cs4
   {
      @base_0.x = base_0.x + X - limite
      @base_0.y = base_0.y + Y
      @base_0.z = base_0.z + limite
      @X = limite
      @Y = 60
      @Z = Z - 2*limite
   }
   //} CONTROLLO COLLISIONI PASSACAVI
}

Elemento FiancoTeca_30mm
{
   Descrizione = "Fianco Teca 30mm"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamInciso;CamIncidente

   Variabili
   {
      #include %path_bdm%\var_db.inc

      genera_disegno_collo__ "Variabile per la gestione delle bindelle" 1

      X       "Larghezza"         368
      Y       "Spessore"            8
      Z       "Profonditą"        248

      Verso      "" -1

      idx_pannello  "" -1


      TipoTeca   "" 3 Implicit

      AttivaPanMartire "" 0

      PanMar_X    "" 0
      PanMar_Y    "" 0
      PanMar_Z    "" 0
      //PanMar_OffX "" 0
      PanMar_OffY "" 0
      //PanMar_OffZ "" 0

      t_rivestimento     ""  ""

      COD_EREDITA        ""  "PRE;POST"

      FIN_var            ""  "C042"
      FIN_orie           ""  "O"

      FillerM2G          " " "" ShowAlways

      //per stampe
      EsplodiTECA        ""  0  Implicit

      Ord_Sost_Allegato  ""  1

      //VARIABILE TECNICA
      XGLASS      "Num. XGLASS" "" Utente ( )
   }

   Assegnazioni
   {
      GOSUB AssComune
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Controlli
   {
      GOSUB CtrlComune

      GOSUB CtrlTeca_TrovaPannello_30MM
   }

   Gestionale
   {
      GOSUB GestComune

      //GOSUB GestElementi_30MM

      GEST_CODICE = "VTE006"
      if( TipoTeca == 4 )  { GEST_CODICE = "VTE003" }

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }


   Procedura OnTabEredita
   {
      #ifndef TEC
         if( TABER_REGOLA=="PRE" )
         {
            BloccaModificaCatGest_Cmp_368( ATTUALE() , STRCAT("GEST_",FIN_var) )
         }
      #endif
   }

   Posiziona BloccoBlend bl
   {
      @escluso = 0
      if( $VIRTUO | $VIRTUO_TEST | $OnTREND  ) { @escluso = 1 }

      GOSUB posa_blocco
      GOSUB rivestimento
      @f_rivestimento = "0.4"
      if( t_rivestimento != "" ) { @t_rivestimento = t_rivestimento }

      @BLEND__ = 1

      @STP_XG_VISTA_ISO = 1
   }

   //Luca 21/02/2022
   Posiziona VR_Vetro vrv
   {
      @escluso = 1
      if( $VIRTUO | $VIRTUO_TEST | $OnTREND  ) { @escluso = 0 }

      GOSUB posa_blocco
      GOSUB rivestimento

      @OrieVetro = "FIA"

      @Verso = -1*Verso

      @FIN_var = FIN_var
   }

   Posiziona Blocco bl2
   {
      @escluso = 1 - EsplodiTECA

      GOSUB posa_blocco
      GOSUB rivestimento

      @STP_XG_VISTA_ESPLOSO = 1

      if( Verso > 0  )
      {
         @base_0.x = @base_0.x + @X + 4
         @ang_y = 90

      }
      else
      {
         @base_0.x = @base_0.x - 4
         @ang_y = -90
      }
   }

   //Luca 24/02/2021
   Posiziona PannelloMartireTeca_30mm panm
   {
      @escluso = 1 - AttivaPanMartire

      @X = 19
      @Y = PanMar_Y
      @Z = PanMar_Z

      if( Verso < 0 ) { @base_0.x = base_0.x - @X }
      else            { @base_0.x = base_0.x + X }
      @base_0.y = base_0.y - PanMar_OffY
      @base_0.z = base_0.z + Z - PanMar_Z
   }

   Posiziona _cont_per_near cn
   {
      @base_0.x = base_0.x - 5
      if( Verso > 0 ) { @base_0.x = base_0.x + X - 5 }

      @base_0.y = base_0.y + 20
      @base_0.z = base_0.z + 20

      @X = 10
      @Y = Y - 40
      @Z = Z - 40

      idx_cnear = ATTUALE()
   }

   //#include %path_bdm%\Linea30mm_cont.inc
   //#include %path_bdm%\Linea30mm_cont_DBG.inc
}

Elemento SchienaTeca_30mm
{
   Descrizione = "Schiena Teca 30mm"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamInciso;CamIncidente

   Variabili
   {
      #include %path_bdm%\var_db.inc

      genera_disegno_collo__ "Variabile per la gestione delle bindelle" 1

      X       "Larghezza"         368
      Y       "Spessore"            8
      Z       "Profonditą"        248

      TipoTeca              "" 3 Implicit

      TLED_Attiva           "" 0 SaveAlways
      TLED_Tipologia1       "" 1 SaveAlways
      TLED_Tipologia2       "" 1 SaveAlways
      TLED_Watt             "" 0

      TLED_Lavorazione      "" 0 SaveAlways
      TLED_TipoLavorazione  "" 0 SaveAlways
      TLED_Lavorazione_USER "" 0 SaveAlways

      ConLED                "" 0 SaveAlways

      //GEST_CODICE "" "VTE007"

      COD_EREDITA        ""  "PRE;POST"

      FIN_var            ""  "C042"
      FIN_orie           ""  "O"

      Ord_Sost_Allegato  ""   1

      FillerM2G          " " "" ShowAlways

      //VARIABILE TECNICA
      XGLASS      "Num. XGLASS" "" Utente ( )
   }

   Assegnazioni
   {
      GOSUB AssComune
      Z_Vetro  = 4
   }

   PuntiNotevoli
   {
      GOSUB punti
   }
   //#include %path_bdm%\Tlib\orie.inc


   Controlli
   {
      GOSUB CtrlComune

      //Luca 03/03/2021
      GOSUB TLED_CalcolaTrasformatore_30MM
   }

   Gestionale
   {
      GOSUB GestComune

      GOSUB GestElementi_30MM

      GEST_CODICE = "VTE007"
      if( TipoTeca == 4 )  { GEST_CODICE = "VTE004" }

      GOSUB Set_Gest_C008_Schiena_30MM

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura OnTabEredita
   {
      if( TABER_REGOLA == "PRE" )
      {
         if( IS_VAR_FIXED(ATTUALE(),"GEST_C042") )  { DEL_VAR_MODIFICATE(ATTUALE(),"GEST_C042") }

         idx_pad = PADRE(ATTUALE(),1)
         C042 = VAR_VAL_STR(idx_pad,"GEST_C048")
         VarAdd = "C042"   GOSUB Add_TABER_VARSETTATE
      }
   }

   Procedura cancella
   {
      GOSUB Cancella_Schienale_30MM
      GOSUB BloccaCancellaComponente
   }

   Posiziona Blocco pan
   {
      GOSUB posa_blocco
      @Z = Z - 4

      if( TipoTeca == 3 )
      {
         @base_0.y = base_0.y + 0.5
         @Y = Y - 14

         //Luca 14/04/2021
         @base_0.x = base_0.x + 2.5
         @X = X - 5
      }

      if( TipoTeca == 4 )
      {
         @base_0.x = base_0.x + 2.5
         @X = X - 5
      }

      //GOSUB rivestimento
      @c_rivestimento = $c_pomice
   }

   Posiziona Blocco vet
   {
      @escluso = 0
      if( $VIRTUO | $VIRTUO_TEST | $OnTREND  ) { @escluso = 1 }

      GOSUB posa_blocco
      @base_0.z = base_0.z + Z - 4
      @Z = 4
      GOSUB rivestimento

      @f_rivestimento = "0.2"
      t_rivestimento  = VAR_VAL_STR(ATTUALE(),"t_rivestimento")

      @STP_XG_VISTA_ISO = 1
      @STP_XG_VISTA_ESPLOSO = 1
   }

   //Luca 21/02/2022
   Posiziona VR_Vetro vrv
   {
      @escluso = 1
      if( $VIRTUO | $VIRTUO_TEST | $OnTREND  ) { @escluso = 0 }

      GOSUB posa_blocco
      @base_0.z = base_0.z + Z - 4
      @Z = 4
      GOSUB rivestimento

      @OrieVetro = "FRO"

      @FIN_var = FIN_var
   }

   //Luca 03/03/2021
   Posiziona LavTrasformatoreLED_368 LavTra
   {
      GOSUB posa_lavorazione_trasformatore_30MM
   }

   //Luca 03/03/2021
   Posiziona TrasformatoreLED_368 Tras1
   {
      ntrasf = 1
      GOSUB posa_trasformatore_30MM
   }

   Posiziona TrasformatoreLED_368 Tras2
   {
      ntrasf = 2
      GOSUB posa_trasformatore_30MM
   }

   Posiziona _cont_per_near cn_up
   {
      @base_0.x = base_0.x + 2
      @base_0.y = alto_0.y - 10
      @base_0.z = base_0.z + 10

      @X = X - 4
      @Y = 20
      @Z = 50

      idx_cnear_up = ATTUALE()
   }

   Posiziona _cont_per_near cn_dw
   {
      @base_0.x = base_0.x + 2
      @base_0.y = base_0.y - 10
      @base_0.z = base_0.z + 10

      @X = X - 4
      @Y = 20
      @Z = 50

      idx_cnear_dw = ATTUALE()
   }

   //#include %path_bdm%\Linea30mm_cont.inc
   //#include %path_bdm%\Linea30mm_cont_DBG.inc
}

//TODO -->
//       manca codice
//       da capire se va maggiorato rispetto al vetro
//pannello martire per sostituzione
Elemento PannelloMartireTeca_30mm
{
   Descrizione = "Base Teca 30mm"
   Code        = 30MM
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamInciso

   Variabili
   {
      #include %path_bdm%\var_db.inc

      genera_disegno_collo__ "Variabile per la gestione delle bindelle" 1

      X       "Larghezza"         368
      Y       "Spessore"            8
      Z       "Profonditą"        248

      GEST_CODICE  "" "2BO006"


      COD_EREDITA        ""  "PRE;POST"

      FIN_var            ""  "C042"
      FIN_orie           ""  "O"

      FillerM2G          " " "" ShowAlways
   }

   Assegnazioni
   {
      GOSUB AssComune
   }

   PuntiNotevoli
   {
      GOSUB punti
   }

   Controlli
   {
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune
      GEST_X = X
      GEST_Y = Y
      GEST_Z = Z

      if( UN_PADRE("BaseTeca_30MM")
        | UN_PADRE("CopTeca_30MM") )
      {
         GEST_Y = Z
         GEST_Z = Y
      }

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura cancella
   {
      GOSUB BloccaCancellaComponente
   }

   Posiziona Blocco bl
   {
      //Luca 24/02/2021 non serve la grafica
      @escluso = 1

      GOSUB posa_blocco
      GOSUB rivestimento
   }
}

//{ DIAGO LINEA
Elemento DiagoLinea_30MM
{
   Descrizione = "Mensola DiagoLinea"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Alias       OnChangedVar;NoCollision2

   Variabili
   {
      #include %path_bdm%\var_db.inc

      genera_disegno_collo__ "Variabile per la gestione delle bindelle" 1

      X       "Larghezza"         368 Menu ( LarDiagoLinea )

      Z       "Profonditą"        248 ShowAlways

      Y       "Spessore"           30 ShowAlways

      Filler2           " " "" ShowAlways


      VAR_NrSupporti     "Numero Supporti"       1 Utente ( 1-2 )
      VAR_PosSupporto    "Lato Supporto"         1 Menu ( DXSX )

      VAR_Angolo         "Angolo Inclinazione"   0 Utente ( )

      VediLimiti_PCV     "" 0

      idx_grafica        "" -1

      COD_EREDITA        ""  "PRE;POST"

      CMP2_AZIONI        ""  "S"

      M4_A_MURO          ""   -1
      M4_CNT_LINK_MODE__ ""   0

      M4_CNT_MODE__      ""   1
      M4_CNT_MODE2__     ""   1

      M4_MIS             "" "X;Y;Z;Filler*;VAR_NrSupporti;VAR_PosSupporto;VAR_Angolo"

      FillerM2G          " " "" ShowAlways

      M4_WALL_GRID__      ""  1

      //VARIABILI PER GESTIONE NFC
      NFC_Attiva    ""  0 SaveAlways
      NFC_Categoria ""  "LIVING"
      NFC_Priorita  ""  20
      NFC_Point     ""  [0,0,0]

      //GESTIONE NFC
      VT_NFC         "NFC"  0
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB AssElementi_30MM

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

      if( VAR_NrSupporti == 2 )  { HIDE_ON_EDIT2(ATTUALE(),"VAR_PosSupporto",1) }
      else                       { HIDE_ON_EDIT2(ATTUALE(),"VAR_PosSupporto",0) }


      //Luca 06/04/2021
      VT_NFC = NFC_Attiva

      //LZ 12/04/2021
      //STP_Bollina = 1
      //STP_Bollina_Cat = "C104"
   }

   PuntiNotevoli
   {
      GOSUB punti_DiagoLinea
      //GOSUB DefPuntiSnapPasso184_30MM

      //vano_0_0 = base_0
      //vano_l_0 = X
      //vano_p_0 = Z

      ////per stesura selezione
      //punto_sx_top = alto_0         punto_sx_top_fro = alto_0
      //punto_dx_top = alto_3         punto_dx_top_fro = alto_3
      //
      ////per stesura punti
      //punto_sx_alto_top_30MM = alto_0
      //punto_dx_alto_top_30MM = alto_3
      //
      //punto_sx_basso_top_30MM = base_0
      //punto_dx_basso_top_30MM = base_3

      NFC_Point = base_2

   }
   #include %path_bdm%\Tlib\orie.inc

   Procedura OnQueryBdmLocal
   {
      GOSUB OnQueryBdmLocal_30MM
   }

   Controlli
   {
      GOSUB CtrlComune

      GOSUB CtrlVincolaAMuro_30MM


      if( IS_IDX(idx_grafica) )
      {
         SET_#(idx_grafica)
         STP_Bollina_Pnt = #STP_Bollina_Pnt
      }

   }

   Gestionale
   {
      GOSUB GestComune

      GEST_Z = Z - 6

      GOSUB GestComune_Post
   }

   //Procedura OnTabEredita
   //{
   //   if( TABER_REGOLA == "PRE" )
   //   {
   //      if( IS_VAR_FIXED(ATTUALE(),"GEST_C003") ) { DEL_VAR_MODIFICATE(ATTUALE(),"GEST_C003") }
   //
   //      GEST_C003 = "SX001"
   //      if( IS_IDX(idx_fia_sx) ) { GEST_C003 = "DX001" }
   //      TABER_VARSETTATE = "GEST_C003"
   //
   //      GOSUB Set_Gest_C008_Ripiano_30MM
   //   }
   //}

   Procedura PostAction2
   {
      GOSUB PostAction2_30MM

      if( $ATTIVA_DLL==1 & $OnLoadOrder == 0 )
      {
         if( VAR_EXIST(ATTUALE(),"M4_FIX_Y") ) { DEL_VAR(ATTUALE(),"M4_FIX_Y") }
      }
   }

   Procedura Offset
   {
      //Luca 04/03/2021
      GOSUB CtrlVincolaAMuro_30MM
   }

   Procedura cancella
   {
   }

   Posiziona DiagoLinea_cmp_30MM bl
   {
      GOSUB posa_blocco

      //Luca 19/07/2021 mantengo la stessa logica presente su Metron/FW
      @ang_z = VAR_Angolo
      if( VAR_PosSupporto == 1 & VAR_NrSupporti ==1 )
      {
         @ang_z = -1 * VAR_Angolo
      }

      idx_grafica = ATTUALE()
   }

   //Posiziona SupportoRipiano_30MM spv
   //{
   //   @escluso = 1 - ConSupporto
   //   @base_0.x = base_0.x + X/2 - @X/2
   //   //@base_0.y = base_0.y + Y/2 - @Y/2
   //   @base_0.y = base_0.y
   //   @base_0.z = base_0.z
   //
   //   @NO_GEST = 1
   //}
}

Elemento DiagoLinea_cmp_30MM
{
   Descrizione = "Vetro Fianco"
   Code        = 30MM
   Gruppo      = ""
   Tipo        = Contenitore
   Forma       = ""
   Alias       NoCollision2

   Variabili
   {
      X       ""        368
      Z       ""        248
      Y       ""         30

      VAR_NrSupporti     "Numero Supporti"       1 Implicit
      VAR_PosSupporto    "Lato Supporto"         1 Implicit

      OffX_Sup  "" 150

      FIN_var     ""  "C103"
      FIN_orie    ""  "O"

      M4_MIS             "" "Filler*;Z"

      NFC_Attiva "" 0 Implicit

      HIDE "" 3
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB Stato_7
      FIN_idx_gest = PADRE(ATTUALE(),1)

      OffX_Sup = 92
      if( X > 552 )  { OffX_Sup = 184 }

      STP_Bollina = 1
      STP_Bollina_Cat = "C103"
   }

   PuntiNotevoli
   {
      GOSUB punti

      vano_0_0 = base_0
      vano_l_0 = X
      vano_p_0 = Z

      STP_Bollina_Pnt = [X/2 , Y/2 , Z + 30 ]
   }

   Controlli
   {
      GOSUB CtrlComune
   }

   Posiziona Blocco bl
   {
      GOSUB posa_blocco
      @base_0.z = base_0.z + 6
      @Z = Z - 6
      GOSUB rivestimento
   }

   Posiziona SupportoDiagoLinea_30MM supp1
   {
      @base_0.x = base_0.x + OffX_Sup - @X/2
      @base_0.y = base_0.y + Y/2 - @Y/2
      @base_0.z = base_0.z

      if( VAR_NrSupporti == 1 & VAR_PosSupporto == 1 )
      {
         @base_0.x = base_0.x + X - OffX_Sup - @X/2
      }

      @NrSupporto = 1

      if( UN_PADRE("DiagoMensola_30MM") ) { @escluso = 1 }
   }

   Posiziona SupportoDiagoLinea_30MM supp2
   {
      @escluso = 1
      if( VAR_NrSupporti == 2 )  { @escluso = 0 }

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

      @NrSupporto = 2

      if( UN_PADRE("DiagoMensola_30MM") ) { @escluso = 1 }
   }

   Posiziona TAG_NFC nfc
   {
      @escluso = 1 - NFC_Attiva

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

   Posiziona __import__ sup
   {
      @escluso = 1
      if( UN_PADRE("DiagoMensola_30MM") ) { @escluso = 0 }

      GOSUB posa_blocco

      @X = 159
      if( X > 300 ) { @X = 250 }

      @Y = Y - 4

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

      @import = STRCAT($path_sat,"DiagoLinea\DL_SuppMensola_",STR(X),".sat")

      //GOSUB rivestimento
      @c_rivestimento = $c_alluminio
   }
}

Elemento SupportoDiagoLinea_30MM
{
   Descrizione = ""
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X       ""        80
      Y       ""        80
      Z       ""       170

      NrSupporto "" 0

      FIN_var     ""  "C102"
      FIN_orie    ""  "O"

      GEST_CODICE ""  "PM0002"

      M4_MIS             "" "Filler*;Z"
   }

   Assegnazioni
   {
      GOSUB AssComune
   }

   PuntiNotevoli
   {
      GOSUB punti
   }
   #include %path_bdm%\Tlib\orie.inc

   Controlli
   {
      GOSUB CtrlEscluso
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune

      //di serie č compreso un solo supporto, il secondo riga a parte
      if( NrSupporto == 2 ) { FLAG_RADICE = $FLAG_STANDARD + $MAKE_ROW }

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Posiziona __import__ bl
   {
      GOSUB posa_blocco
      @import = STRCAT($path_sat,"DiagoLinea\DL_SupportoMensola.sat")

      GOSUB rivestimento
   }
}

Elemento ReggiLibriDiagoLinea_30MM
{
   Descrizione = ""
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  DiagoLinea_cmp_30MM
   Altimetro     Zero

   Variabili
   {
      #include %path_bdm%\var_db.inc

      X       ""       101
      Y       ""       210
      Z       ""       167

      OffX    "Offset X" 225 Utente ( 225-  )

      Verso   ""        -1 Menu ( DXSX )

      FIN_var     ""  "C082"
      FIN_orie    ""  "O"

      M4_MIS             "" "Filler*;OffX"
   }

   Assegnazioni
   {
      GOSUB AssComune

      if( ACTION()==0 & $ATTIVA_DLL==1 ) { HIDE_ON_EDIT2(ATTUALE(),"Verso",1) }

      if( UN_PADRE("DiagoLinea_cmp_30MM") )
      {
         off_x_max = VAR_VAL(PADRE(ATTUALE(),1),"X") - 225 - X
         VAR_SET_MENU(ATTUALE(),"OffX",STRCAT("( 225-",STR(off_x_max)," )"))
      }
   }

   PuntiNotevoli
   {
      GOSUB punti

      STP_Bollina_Pnt = [X/2,Y/2,Z+30]
      STP_Bollina = 1
      STP_Bollina_Cat = "C082"
   }
   #include %path_bdm%\Tlib\orie.inc

   Attrezza
   {
      idx_ref = @idx_att

      base_0 = $vano_0
      base_0.y = $vano_0.y + @Y
      base_0.x = $vano_0.x + OffX
   }

   Controlli
   {
      GOSUB CtrlEscluso
      GOSUB CtrlComune
   }

   Gestionale
   {
      GOSUB GestComune

      //codificato come 97
      GEST_X = 97

      GOSUB GestComune_Post

      GOSUB CAMBIA_VAR
   }

   Procedura PostGestDllValida
   {
      if( $OnRigenera | $OnLoadOrder | ACTION()<=0 ) { EXITSUB() }

      COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE())," //PostGestDllValida ",NOME(ATTUALE())))
   }

   Posiziona __import__ bl
   {
      GOSUB posa_blocco
      @import = STRCAT($path_sat,"DiagoLinea\DL_Reggilibri_SX.sat")
      if( Verso > 0 ) { @import = STRCAT($path_sat,"DiagoLinea\DL_Reggilibri_DX.sat") }

      GOSUB rivestimento
   }
}

Elemento DiagoMensola_30MM
{
   Descrizione = "Mensola DiagoLinea"
   Code        = 30MM
   Gruppo      = "30MM"
   Tipo        = Contenitore
   Forma       = ""
   Alias       OnChangedVar

   Variabili
   {
      #include %path_bdm%\var_db.inc

      genera_disegno_collo__ "Variabile per la gestione delle bindelle" 1

      X       "Larghezza"         368 Utente ( )
      Z       "Profonditą"        248 ShowAlways
      Y       "Spessore"           30 ShowAlways

      Filler2           " " "" ShowAlways

      VAR_NrSupporti     "" 3
      VAR_PosSupporto    "" 0

      VAR_Angolo         "Angolo Inclinazione"   0 Utente ( )

      VediLimiti_PCV     "" 0

      COD_EREDITA        ""  "PRE;POST"

      CMP2_AZIONI        ""  "S"

      M4_A_MURO          ""   -1
      M4_CNT_LINK_MODE__ ""   0

      M4_CNT_MODE__      ""   1
      M4_CNT_MODE2__     ""   1

      M4_MIS             "" "X;Y;Z;Filler*;VAR_Angolo"

      FillerM2G          " " "" ShowAlways

      M4_WALL_GRID__      ""  1

      //VARIABILI PER GESTIONE NFC
      NFC_Attiva    ""  0 SaveAlways
      NFC_Categoria ""  "LIVING"
      NFC_Priorita  ""  20
      NFC_Point     ""  [0,0,0]

      //GESTIONE NFC
      VT_NFC         "NFC"  0
   }

   Assegnazioni
   {
      GOSUB AssComune
      GOSUB AssElementi_30MM

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

      //Luca 06/04/2021
      VT_NFC = NFC_Attiva

   }

   PuntiNotevoli
   {
      GOSUB punti_DiagoLinea

      NFC_Point = base_2
      STP_Bollina_Pnt = [X/2 , Y/2 - 45 , Z + 30 ]

   }
   #include %path_bdm%\Tlib\orie.inc

   Procedura OnQueryBdmLocal
   {
      GOSUB OnQueryBdmLocal_30MM
   }

   Controlli
   {
      GOSUB CtrlComune

      GOSUB CtrlVincolaAMuro_30MM
   }

   Gestionale
   {
      GOSUB GestComune

      GEST_Z = Z - 6

      GOSUB GestComune_Post
   }

   //Procedura OnTabEredita
   //{
   //   if( TABER_REGOLA == "PRE" )
   //   {
   //      if( IS_VAR_FIXED(ATTUALE(),"GEST_C003") ) { DEL_VAR_MODIFICATE(ATTUALE(),"GEST_C003") }
   //
   //      GEST_C003 = "SX001"
   //      if( IS_IDX(idx_fia_sx) ) { GEST_C003 = "DX001" }
   //      TABER_VARSETTATE = "GEST_C003"
   //
   //      GOSUB Set_Gest_C008_Ripiano_30MM
   //   }
   //}

   Procedura PostAction2
   {
      GOSUB PostAction2_30MM

      if( $ATTIVA_DLL==1 & $OnLoadOrder == 0 )
      {
         if( VAR_EXIST(ATTUALE(),"M4_FIX_Y") ) { DEL_VAR(ATTUALE(),"M4_FIX_Y") }
      }
   }

   Procedura Offset
   {
      //Luca 04/03/2021
      GOSUB CtrlVincolaAMuro_30MM
   }

   Procedura cancella
   {
   }

   Posiziona DiagoLinea_cmp_30MM bl
   {
      GOSUB posa_blocco

      //Luca 19/07/2021 mantengo la stessa logica presente su Metron/FW
      @ang_z = VAR_Angolo
      //if( VAR_PosSupporto == 1 & VAR_NrSupporti ==1 )
      //{
      //   @ang_z = -1 * VAR_Angolo
      //}

   }

   //Posiziona SupportoRipiano_30MM spv
   //{
   //   @escluso = 1 - ConSupporto
   //   @base_0.x = base_0.x + X/2 - @X/2
   //   //@base_0.y = base_0.y + Y/2 - @Y/2
   //   @base_0.y = base_0.y
   //   @base_0.z = base_0.z
   //
   //   @NO_GEST = 1
   //}
}
//} DIAGO LINEA

Subroutine
{
   PROCEDURA OnQueryBdmLocal_30MM
   {
      //inserimento
      if( $query_type==1)
      {
         GOSUB SettaPosizioneFianco_30MM
         GOSUB SettaPosizioneRipiano_30MM
      }

      //livelli inserimento muro
      if( $query_type==5 )
      {
         COMANDO2("LIVELLI CLEAR OnWall")

         liv_wall =  11

         liv_wall[1]  = 0
         liv_wall[2]  = 201
         liv_wall[3]  = 385
         liv_wall[4]  = 569
         liv_wall[5]  = 753
         liv_wall[6]  = 937
         liv_wall[7]  = 1121
         liv_wall[8]  = 1305
         liv_wall[9]  = 1489
         liv_wall[10] = 1673
         liv_wall[11] = 1857

         i = 1
         while ( i<=liv_wall )
         {
            COMANDO2( STRCAT("LIVELLI ADD OnWall ", STR(liv_wall[i]), " ", STR(liv_wall[i])) )
            i = i + 1
         }

         $QueryResult__ = 1
      }
   }

   PROCEDURA SettaPosizioneFianco_30MM
   {
      if( $ATTIVA_DLL == 0 )  { EXITSUB() }

      if( IS_MATCH(NOME(ATTUALE()),"Fianco_30MM*")!=1
        & IS_MATCH(NOME(ATTUALE()),"Contenitore_30MM")!=1  ) { EXITSUB() }

      //OnQueryBdmLocal
      if( ACTION()==-12 )
      {
         wk_A_TERRA  = 1 - APPESO( ATTUALE(), 1 , "$M4_DRAGINFO_SNAP" )
         wk_A_PARETE = 0

         if( $M4_DragInfo_Mode == 0 )
         {
            wk_dist = QUERY_WALL($M4_DragInfo_Ref,"distance from face R")
            if( wk_dist <= 0 ) { wk_A_PARETE = 1 }

            //Luca 24/02/2021
            if( NOME(ATTUALE())=="Fianco_30MM"
              & NOME($M4_DragInfo_Ref)=="Colonna_30MM" )
            {
               Y = VAR_VAL($M4_DragInfo_Ref,"Y")
               Z = VAR_VAL($M4_DragInfo_Ref,"Z")

               //Luca 13/09/2021
               if( VAR_VAL(ATTUALE(),"FLAG_EtVoila") == 2 )
               {
                  Z = VAR_VAL($M4_DragInfo_Ref,"Z") + 51
               }

               VAR_SET_MODIFICATA(ATTUALE(),"Y","")
               VAR_SET_MODIFICATA(ATTUALE(),"Z","")

               NoChiediMisureOnInsert = 1
            }

            //Luca 20/07/2021 aggancio filo alto
            if( FLAG_Weightless == 1 )
            {
               lato = "S"
               if( $M4_DragInfo_SxDx == 1 ) { lato = "D" }

               cnt_new = CostruisciStrCnt(lato,"A","R",0,0,0,0)
               $M4_DragInfo_Cnt = cnt_new
               $QueryResult__ = 3

               if( VAR_VAL($M4_DragInfo_Ref,"FLAG_Weightless") == 0 )
               {
                  DELETE_ME = 1
                  DELETE_ME_msg = STRCAT(MSG(1090),"\n",MSG(1284))

               }
            }
            else
            {
               if( VAR_VAL($M4_DragInfo_Ref,"FLAG_Weightless") == 1 )
               {
                  DELETE_ME = 1
                  DELETE_ME_msg = STRCAT(MSG(1090),"\n",MSG(1285))
               }
            }
         }
         else
         {
            id_wall = $M4_DragInfo_WallIdx
            r = QUERY_WALL(0,"listwall")
            i = 1
            while ( i<=$Query_Wall )
            {
               if( $Query_Wall[i]==id_wall ) { wk_A_PARETE = 1 }
               i = i + 1
            }
         }

      }
      else
      {
         wk_A_TERRA  = 1 - APPESO( ATTUALE(), 1 , "" )

         wk_A_PARETE = 0
         wk_dist = QUERY_WALL(ATTUALE(),"distance from face R")
         if( wk_dist <= 0  ) { wk_A_PARETE = 1 }

         //Luca 17/02/2021
         //aggiungo controllo che non sia sotto al pavimento (e se a 17 forzo posizione a terra)
         forza_0 = 0
         if( base_0.y < 0 ) { forza_0 = 1 }

         //Luca 21/12/2021
         if( NOME(ATTUALE()) == "Fianco_30MM"
           & VAR_VAL(ATTUALE(),"FLAG_Weightless") == 1 ) { forza_0 = 0 }

         if( forza_0 == 1 )
         {
            offy = ABS(base_0.y)
            COMANDO(STRCAT("EDITPOS_REL ",STR(ATTUALE()) , " ",STR(0), " ",STR(offy) ," " ,STR(0) , " 0 //SettaPosizioneFianco_30MM"))
         }
      }

      ConPiedini      = 0
      ConAttaccaglie  = 0

      if( wk_A_TERRA  == 1  )
      {
         ConPiedini = 1

         //rob_pec 11/02/2021: controlla valore variante per impostare altezza piedini
         wk_gest_c088  = VAR_VAL_STR(ATTUALE(),"GEST_C088")
         if( IS_MATCH( wk_gest_c088 ,"FR008" ) == 1) { $L30_Alt_Pie = 0  ConPiedini = 0 }
         if( IS_MATCH( wk_gest_c088 ,"FR009" ) == 1) { $L30_Alt_Pie = 17 }
         if( IS_MATCH( wk_gest_c088 ,"FR010" ) == 1) { $L30_Alt_Pie = 5  }

         //Simone 06/05/2022 - Piedino 5mm per fianchi a centro stanza
         if( wk_A_PARETE == 0 )
         {
            if( VAR_VAL(ATTUALE(),"FLAG_Speciale") == 0 ) { DEL_VAR_MODIFICATE(ATTUALE(),"GEST_C088") }
            GEST_C088 = "FR010"
         }
      }
      if( wk_A_PARETE == 1  ) { ConAttaccaglie = 1 }
   }

   //rob_pec 16/02/2021: posizione il ripiano al centro del livello
   PROCEDURA SettaPosizioneRipiano_30MM
   {
      if( $ATTIVA_DLL == 0 )  { EXITSUB() }

      if( IS_MATCH(NOME(ATTUALE()),"Ripiano*_30MM") !=1 ) { EXITSUB() }

      if( $M4_DragInfo_Mode==1 )
      {
         $query_p1 = $M4_DragInfo_Snap
         $query_p1.y = $M4_DragInfo_Snap.y-Y/2

         //cerco l'angolo del muro per passarlo all'elemento che posiziono

         a=QUERY_WALL($M4_DragInfo_WallIdx,"tracepoints")
         $P1=$Query_Wall_##1
         $P2=$Query_Wall_##2
         GOSUB calcola_ang_y_3
         $query_p2 = $wk_ang_y_3

         $QueryResult__ = 1
      }

      //Luca 21/04/2022
      //aggancio filo basi a fianchi con piedini
      if( $M4_DragInfo_Mode == 0  )
      {
         if( NOME($M4_DragInfo_Ref) == "Fianco_30MM" )
         {
            if( VAR_VAL($M4_DragInfo_Ref,"ConPiedini") == 1 )
            {
               lato = "S"
               if( $M4_DragInfo_SxDx == 1 ) { lato = "D" }

               offy = $L30_Alt_Pie

               cnt_new = CostruisciStrCnt(lato,"B","R",0,offy,0,0)
               $M4_DragInfo_Cnt = cnt_new
               $QueryResult__ = 3
            }
         }
      }

   }

   PROCEDURA DefPuntiSnapPasso184_30MM
   {
      DEL_VAR(ATTUALE(),"M4_SNAP_P*")

      np = 1
      step = 184
      np_alt = (Y / step) - 1
      np_lar = (X / step) - 1

      off_y = VAR_VAL(ATTUALE(),"ConPiedini") * $L30_Alt_Pie

      if( $L30_ATTIVA_SNAPAGG == 1 )
      {
         i = 1
         while ( i<= np_alt )
         {
            px = 0   pz = 0
            VAR_CREATE_XYZ( ATTUALE() , STRCAT("M4_SNAP_P",STR(np)) , px , off_y + step*i , pz , 0 , "" )
            //VAR_CREATE_XYZ( ATTUALE() , STRCAT("txt_pos_",STR(np-1))  , px , off_y + step*i , pz , 0 , "" )
            //VAR_CREATE_STR( ATTUALE() , STRCAT("txt_str_",STR(np-1)) , STR(np-1 ) , 0 , "" )

            np = np + 1

            px = X   pz = 0
            VAR_CREATE_XYZ( ATTUALE() , STRCAT("M4_SNAP_P",STR(np)) , px , off_y + step*i , pz , 0 , "" )
            //VAR_CREATE_XYZ( ATTUALE() , STRCAT("txt_pos_",STR(np-1))  , px , off_y + step*i , pz , 0 , "" )
            //VAR_CREATE_STR( ATTUALE() , STRCAT("txt_str_",STR(np-1)) , STR(np-1 ) , 0 , "" )

            np = np + 1

            i = i + 1
         }

         i = 1
         while ( i<= np_lar )
         {
            VAR_CREATE_XYZ( ATTUALE() , STRCAT("M4_SNAP_P",STR(np)) , step*i , off_y + Y , 0 , 0 , "" )
            //VAR_CREATE_XYZ( ATTUALE() , STRCAT("txt_pos_",STR(np-1))  , step*i , off_y + Y , 0 , 0 , "" )
            //VAR_CREATE_STR( ATTUALE() , STRCAT("txt_str_",STR(np-1)) , STR(np-1 ) , 0 , "" )
            np = np + 1

            VAR_CREATE_XYZ( ATTUALE() , STRCAT("M4_SNAP_P",STR(np)) , step*i , 0 , 0 , 0 , "" )
            //VAR_CREATE_XYZ( ATTUALE() , STRCAT("txt_pos_",STR(np-1))  , step*i , 0 , 0 , 0 , "" )
            //VAR_CREATE_STR( ATTUALE() , STRCAT("txt_str_",STR(np-1)) , STR(np-1 ) , 0 , "" )

            np = np + 1

            i = i + 1
         }
      }

      if( NOME(ATTUALE()) == "Fianco_30MM" )
      {
         DEL_VAR(ATTUALE(),"pnt_cont_30MM")
         np = 1

         np_alt = np_alt + 2
         off_y  = VAR_VAL(ATTUALE(),"ConPiedini") * $L30_Alt_Pie

         i = 1
         while ( i <= np_alt )
         {
            VAR_CREATE_XYZ( ATTUALE() , STRCAT("pnt_cont_30MM_",STR(np)) , 0 , off_y , 0 , 0 , "" )
            np = np + 1
            VAR_CREATE_XYZ( ATTUALE() , STRCAT("pnt_cont_30MM_",STR(np)) , X , off_y , 0 , 0 , "" )
            np = np + 1

            off_y = VAR_VAL(ATTUALE(),"ConPiedini") * $L30_Alt_Pie + step*i

            i = i + 1
         }
      }
      if( NOME(ATTUALE()) == "Ripiano_30MM" )
      {
         DEL_VAR(ATTUALE(),"pnt_cont_30MM")
         np = 1
         pnt_cont_30MM_np = 1


         np_lar = np_lar + 2
         off_x  = 0

         i = 1
         while ( i<= np_lar )
         {
            VAR_CREATE_XYZ( ATTUALE() , STRCAT("pnt_cont_30MM_",STR(np)) , off_x , 0 , 0 , 0 , "" )
            np = np + 1
            VAR_CREATE_XYZ( ATTUALE() , STRCAT("pnt_cont_30MM_",STR(np)) , off_x , Y , 0 , 0 , "" )
            np = np + 1

            off_x = step*i

            i = i + 1
         }

         pnt_cont_30MM_np = np - 1
      }
   }

   PROCEDURA DefPuntiStendiSchiena_30MM
   {
      punto_stendisch30_sx_1 = base_0    punto_stendisch30_dx_1 = alto_0
      punto_stendisch30_sx_2 = base_3    punto_stendisch30_dx_2 = alto_3
   }

   PROCEDURA DefPuntiStendiSchiena_Colonna_30MM
   {
      if( ACTION() <= 0 | ACTION() ==2  | $OnLoadOrder==1  )  {  EXITSUB() }

      DEL_VAR(ATTUALE(),"punto_stendisch30*")
      DEL_VAR(ATTUALE(),"pnt_cont_30MM_*")

      DEL_VAR(ATTUALE(),"M4_SNAP_P*")

      np_sx = 1
      np_dx = 1

      np_snap = 1

      np_stendi_fr = 1

      COMPONENTI2("rip",ATTUALE(),"Ripiano_30MM")

      i = 1
      while ( i <= rip )
      {
         SET_#(rip[i])

         nome_punto = STRCAT("punto_stendisch30_sx_",STR(np_sx))
         EVAL(STRCAT(nome_punto,"=#punto_stendisch30_sx_1"))
         np_sx = np_sx + 1

         nome_punto = STRCAT("punto_stendisch30_sx_",STR(np_sx))
         EVAL(STRCAT(nome_punto,"=#punto_stendisch30_sx_2"))
         np_sx = np_sx + 1

         nome_punto = STRCAT("punto_stendisch30_dx_",STR(np_dx))
         EVAL(STRCAT(nome_punto,"=#punto_stendisch30_dx_1"))
         np_dx = np_dx + 1

         nome_punto = STRCAT("punto_stendisch30_dx_",STR(np_dx))
         EVAL(STRCAT(nome_punto,"=#punto_stendisch30_dx_2"))
         np_dx = np_dx + 1


         //Luca 23/04/2021 aggiungo punti snap
         nome_punto = STRCAT("M4_SNAP_P",STR(np_snap))
         EVAL(STRCAT(nome_punto,"=#base_0"))
         np_snap = np_snap + 1

         nome_punto = STRCAT("M4_SNAP_P",STR(np_snap))
         EVAL(STRCAT(nome_punto,"=#alto_0"))
         np_snap = np_snap + 1

         nome_punto = STRCAT("M4_SNAP_P",STR(np_snap))
         EVAL(STRCAT(nome_punto,"=#base_3"))
         np_snap = np_snap + 1

         nome_punto = STRCAT("M4_SNAP_P",STR(np_snap))
         EVAL(STRCAT(nome_punto,"=#alto_3"))
         np_snap = np_snap + 1

         //punti per stesura fianco/ripiano
         //utilizzo sono i punti di altezza dei ripiani, per coordinate x e z utilizzo i punti della colonna
         nome_punto = STRCAT("pnt_cont_30MM_",STR(np_stendi_fr))
         val_punto = [base_0.x,#base_0.y,base_0.z]
         EVAL(STRCAT(nome_punto,"=val_punto"))
         np_stendi_fr = np_stendi_fr + 1

         nome_punto = STRCAT("pnt_cont_30MM_",STR(np_stendi_fr))
         val_punto = [base_3.x,#base_3.y,base_3.z]
         EVAL(STRCAT(nome_punto,"=val_punto"))
         np_stendi_fr = np_stendi_fr + 1

         nome_punto = STRCAT("pnt_cont_30MM_",STR(np_stendi_fr))
         val_punto = [alto_0.x,#alto_0.y,alto_0.z]
         EVAL(STRCAT(nome_punto,"=val_punto"))
         np_stendi_fr = np_stendi_fr + 1

         nome_punto = STRCAT("pnt_cont_30MM_",STR(np_stendi_fr))
         val_punto = [alto_3.x,#alto_3.y,alto_3.z]
         EVAL(STRCAT(nome_punto,"=val_punto"))
         np_stendi_fr = np_stendi_fr + 1

         i = i + 1
      }
   }

   PROCEDURA AssElementi_30MM
   {
      if( ACTION() < 0 )  { EXITSUB() }

      if( $ATTIVA_DLL==1 & VAR_EXIST(ATTUALE(),"FLAG_CompostoGEN") )
      {
         HIDE_ON_EDIT2(ATTUALE(),"FLAG_CompostoGEN",1)
      }

      if( ACTION() == 0  )
      {
         HIDE_ON_EDIT2(ATTUALE(),"Stendi_PosRipiano",1)
         HIDE_ON_EDIT2(ATTUALE(),"FLAG_CompostoGEN",1 - $ATTIVA_DLL)
      }

      M4_GRUPPO__  = MSG(1027)

      //Luca 16/03/2021
      if( $L30_ATTIVA_GRIGLIA == 0 )
      {
         DEL_VAR(ATTUALE(),"M4_WALL_GRID_*")
         EXITSUB()
      }

      M4_WALL_GRID_X__       =  $L30_GRIGLIA_X
      M4_WALL_GRID_Y__       =  $L30_GRIGLIA_Y
      M4_WALL_GRID_OFFSY__   =  $L30_GRIGLIA_OFFY
   }

   PROCEDURA GestElementi_30MM
   {
      if( COMPONENDO() | ACTION()<0 | $M4RicalcoloOffset__) { EXITSUB() }

      if( VAR_VAL( ATTUALE(), "FLAG_CompostoGEN") == 0 )    { EXITSUB() }

      if( VAR_VAL(ATTUALE(),"NO_GEST") == 1 )
      {
         FLAG_RADICE = $NO_RAD
         GEST_CODICE = ""
         RADICE      = ""
         EXITSUB()
      }

      GEST_CODICE = ""

      perRADICE = ""
      RADICE_prec = VAR_VAL_STR( ATTUALE(), "RADICE")

      if( NOME(ATTUALE()) == "Fianco_30MM" )
      {
         perRADICE = "30RF"
         if( FLAG_Weightless == 1 ) { perRADICE = "30RFW" }
         if( FLAG_EtVoila == 2 )    { perRADICE = "30RFE" }
      }

      if( NOME(ATTUALE()) == "SchienaWeightless_30MM" ) { perRADICE = "SB30" }
      if( NOME(ATTUALE()) == "SchienaVetroWTL_30MM" )   { perRADICE = "SV30" }

      if( NOME(ATTUALE()) == "Teca_30MM" )              { perRADICE = STRCAT( "30RW", STR(TipoTeca)) }


      GOSUB GestRipiano_SetRadice_30MM

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

      GOSUB GestComune_Post
      GOSUB CAMBIA_VAR

      if( $OnLoadOrder == 1 | $OnLoadOrder2 == 1 )  { EXITSUB() }

      //Luca 01/03/2021 cancello eventuale mezzaluna attrezzata
      if( NOME(ATTUALE()) == "Ripiano_30MM"  & RADICE != RADICE_prec )
      {
         if( RADICE == "30RV" | RADICE == "30RT"  )
         {
            if( RADICE_prec == "30RP" | RADICE_prec == "30RS"  )
            {
               COMPONENTI2("wk_ml",ATTUALE(),"SupportoRipiano_30MM")
               i = 1
               while ( i <=wk_ml  )
               {
                  if( INSERIMENTO2(wk_ml[i]) == $ins2_attrezzato )
                  {
                     msg = STRCAT(MSG(1090),"\n",MSG(1251))
                     if( $CNP == 0 )
                     {
                        HI(ATTUALE(),1)
                        DISPLAY2(msg)
                        HI(ATTUALE(),0)
                     }

                     COMANDO(STRCAT("ELIMINA ",STR(wk_ml[i]) , " //cancello supporto" ))
                  }

                  i = i + 1
               }
            }
         }
      }
   }

   PROCEDURA GestRipiano_SetRadice_30MM
   {
      if( NOME(ATTUALE()) != "Ripiano_30MM"
        & NOME(ATTUALE()) != "RipianoVetro_30MM") { EXITSUB() }

      RADICE_prec = VAR_VAL_STR(ATTUALE(),"RADICE")

      perRADICE = "30RP"
      if( TipoRipianoStr == "MENSOLA"     ) { perRADICE = "30RV" }
      if( TipoRipianoStr == "RIPIANO_TER" ) { perRADICE = "30RT" }
      if( TipoRipianoStr == "RIPIANO_SCH" ) { perRADICE = "30RS" }

      //Luca 25/03/2021
      //mantis 24852: 30MM - Ripiano terminale con doppia lavorazione modular
      if( TipoRipianoStr == "RIPIANO" )
      {
         if( VAR_VAL(ATTUALE(),"FLAG_RipConModular") == 1 ) { perRADICE = "30RT" }
      }

      // [ 23/072021 -------------------------------------------------------------
      FLAG_EtVoila    = VAR_VAL(ATTUALE(), "FLAG_EtVoila")
      FLAG_BinAnta_EV = VAR_VAL(ATTUALE(), "FLAG_BinAnta_EV")

      if( FLAG_EtVoila == 1 & FLAG_BinAnta_EV == 1 )
      {
         perRADICE = "30RPB"
         //I RIPIANI TERMINALI sono gli stessi del LAGOLINEA, se a contatto con il binario,
         // attivare la variante in LAVORAZIONI: SM.-FISSAGGIO BINARIO (valore aggiunto rispetto ai Lagolinea).
         if( TipoRipianoStr == "RIPIANO_TER" ) { perRADICE = "30RT" }
      }
      // ] 23/072021 -------------------------------------------------------------


      //if( NOME(ATTUALE()) == "Ripiano_30MM" )
      //{
      //   menu_z = STRCAT("PrfRip_30MM( 184-450 )")
      //   menu_x = STRCAT("Lar_30MM( 184-2944 )")
      //
      //   if( TipoRipianoStr == "MENSOLA" )
      //   {
      //      menu_z = STRCAT("PrfRip_30MM( 184-450 )")
      //      menu_x = STRCAT("LarMens_30MM( 368-2208 )")
      //   }
      //
      //   if( TipoRipianoStr == "RIPIANO_TER" )
      //   {
      //      menu_z = STRCAT("PrfRip_30MM( 184-450 )")
      //   }
      //
      //   if( TipoRipianoStr == "RIPIANO_SCH" )
      //   {
      //      menu_z = STRCAT("PrfRipS_30MM( 222-358 )")
      //   }
      //   VAR_SET_MENU(ATTUALE(),"Z",menu_z)
      //
      //}

      if( NOME(ATTUALE()) == "RipianoVetro_30MM" )
      {
         menu_z = STRCAT("PrfRipV_30MM( 248-384 )")

         perRADICE = "30RZ"
         if( TipoRipianoStr == "RIPIANO_SCH" )
         {
            perRADICE = "30RZS" menu_z = STRCAT("PrfRipS_30MM( 222-358 )")
         }

         VAR_SET_MENU( ATTUALE(), "Z", menu_z)
      }
   }

   //{ PROCEDURE FIANCHI
   PROCEDURA CtrlFianco_30MM
   {
      if( ACTION()<=0 | ACTION()==2 | COMPONENDO() )  { EXITSUB() }

      GOSUB SettaPosizioneFianco_30MM

      if( $OnLoadOrder == 1 )
      {
         //per gli elementi gią inseriti
         data_ins = ATOI(STRMID(0,6,VAR_VAL_STR(ATTUALE(),"z_ins")))
         if( data_ins < 210302 )
         {
            DEL_VAR_MODIFICATE(ATTUALE(),"M4_FIX_Y")
            DEL_VAR(ATTUALE(),"M4_FIX_Y")
         }
      }

      //Luca 04/03/2021
      GOSUB CtrlVincolaAMuro_30MM

      if( $OnLoadOrder2 )                             { EXITSUB() }

      //rob_pec 11/02/2021
      GOSUB CtrlFianco_TrovaFianco_UpDw_30MM
      GOSUB CtrlFianco_TrovaRipiano_UpDw_30MM
      GOSUB CtrlFianco_TrovaSchiena_SxDx_30MM
      GOSUB CtrlFianco_Trova36e8_UpDw_30MM

      GOSUB CtrlFianco_TrovaTeloEtv_30MM

      //Luca 16/09/2021
      //assegno, quando possibile, il verso al fianco esterno etvoila
      if( FLAG_EtVoila ==2 )
      {
         if( IS_VAR_FIXED(ATTUALE(),"VersoFianco") == 0 )
         {
            VersoFianco = -1

            BOX_MODE(0)
            NEAR_GLOBALE2("wk_items_sx",idx_cnear_sx,1,"Ripiano_30MM")
            NEAR_GLOBALE2("wk_items_dx",idx_cnear_dx,1,"Ripiano_30MM")

            if( wk_items_sx > 0 & wk_items_dx == 0 )  { VersoFianco = 1 }
         }
      }

      //Luca 01/03/2021
      if( base_0.y == 17 )
      {
         offy = -1*base_0.y
         COMANDO(STRCAT("EDITPOS_REL ",STR(ATTUALE()) , " ",STR(0), " ",STR(offy) ," " ,STR(0) , " 0 //FINE CtrlFianco_30MM"))
      }
   }

   PROCEDURA CtrlFianco_TrovaFianco_UpDw_30MM
   {
      idx_fia_up = -1
      idx_fia_dw = -1

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_fia_up",idx_cnear_up,1,"Fianco_30MM")
      NEAR_GLOBALE2("wk_fia_dw",idx_cnear_dw,1,"Fianco_30MM")

      while(wk_fia_up > 0)
      {
         wk_idx_fia_up_temp = wk_fia_up[wk_fia_up]
         if(wk_idx_fia_up_temp != idx_att )
         {
            idx_fia_up = wk_fia_up[wk_fia_up]
         }
         wk_fia_up = wk_fia_up - 1
      }

      while(wk_fia_dw > 0)
      {
         wk_idx_fia_dw_temp = wk_fia_dw[wk_fia_dw]
         if(wk_idx_fia_dw_temp != idx_att )
         {
            idx_fia_dw = wk_fia_dw[wk_fia_dw]
         }
         wk_fia_dw = wk_fia_dw - 1
      }
   }


   PROCEDURA CtrlFianco_TrovaRipiano_UpDw_30MM
   {
      if( ACTION() <=0 | ACTION() == 2 | $OnLoadOrder ==1 )  { EXITSUB() }

      idx_rip_up = -1
      idx_rip_dw = -1

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_rip_up",idx_cnear_up,1,"Ripiano_30MM")
      NEAR_GLOBALE2("wk_rip_dw",idx_cnear_dw,1,"Ripiano_30MM")

      if( wk_rip_up > 0  ) { idx_rip_up = wk_rip_up[1] }
      if( wk_rip_dw > 0  ) { idx_rip_dw = wk_rip_dw[1] }
   }

   PROCEDURA CtrlFianco_TrovaSchiena_SxDx_30MM
   {
      idx_sch_sx = -1
      idx_sch_dx = -1

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_sch_sx",idx_cnear_sx,1,"Schiena_30MM")
      NEAR_GLOBALE2("wk_sch_dx",idx_cnear_dx,1,"Schiena_30MM")

      if( wk_sch_sx > 0  ) { idx_sch_sx = wk_sch_sx[1] }
      if( wk_sch_dx > 0  ) { idx_sch_dx = wk_sch_dx[1] }
   }



   PROCEDURA CtrlFianco_Trova36e8_UpDw_30MM
   {
      idx_368_up = -1
      idx_368_dw = -1

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_368_up",idx_cnear_up,1,"Modulo*368")
      NEAR_GLOBALE2("wk_368_dw",idx_cnear_dw,1,"Modulo*368")

      if( wk_368_up > 0  ) { idx_368_up = wk_368_up[1] }
      if( wk_368_dw > 0  ) { idx_368_dw = wk_368_dw[1] }
   }

   PROCEDURA CtrlFianco_TrovaTeloEtv_30MM
   {
      ConTelo = 0
      idx_telo = -1

      if( FLAG_EtVoila == 0 ) { EXITSUB() }

      BOX_MODE(0)
      NEAR_GLOBALE2("teli",idx_cnear_fr,5,"AntaEtVoila_Arm20")

      ConTelo  = 0
      idx_telo = -1

      if( teli > 0  )
      {
         ConTelo  = 1
         idx_telo = teli[1]
      }
   }

   PROCEDURA Offset_Fianco_30MM
   {
      if( VAR_VAL(-1,"offset_idx") != ATTUALE() )  { EXITSUB() }

      //posizione
      ConPiedini_prec = VAR_VAL(ATTUALE(),"ConPiedini")
      GOSUB SettaPosizioneFianco_30MM
      if( ConPiedini_prec != ConPiedini ) { COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE()) , " no_agganciati //Offset_Fianco_30MM" )) }

      //se aggancio ad un ripiano o ad un modulo 368 centro il fianco in uno dei punti di SNAP
      GOSUB Offset_Fianco_Centra_30MM
   }

   PROCEDURA Offset_Fianco_Centra_30MM
   {
      log = 0
      #ifdef TE
         log = VAR_VAL(-1,"ATTIVA_LOG_DBG")
      #endif

      if( log == 1 ) { COMANDO2(STRCAT("LOGMSG Offset_Fianco_Centra_30MM [",STR(ATTUALE()), "] START")) }

      GOSUB CtrlFianco_TrovaRipiano_UpDw_30MM
      GOSUB CtrlFianco_Trova36e8_UpDw_30MM

      if( IS_IDX(idx_rip_up) == 0 & IS_IDX(idx_rip_dw) == 0
        & IS_IDX(idx_368_up) == 0 & IS_IDX(idx_368_dw) == 0  ) { EXITSUB() }

      Spe_Fia = 30
      Spe_Rip = 30

      wk_agganciando_a = ""

      wk_idx_agg = -1

      if( IS_IDX(idx_rip_up) == 1 & IS_IDX(idx_rip_dw) == 0  ) { wk_idx_agg = idx_rip_up   wk_agganciando_a = "UP" }
      if( IS_IDX(idx_rip_up) == 0 & IS_IDX(idx_rip_dw) == 1  ) { wk_idx_agg = idx_rip_dw   wk_agganciando_a = "DW" }
      if( IS_IDX(idx_368_up) == 1 & IS_IDX(idx_368_dw) == 0  ) { wk_idx_agg = idx_368_up   wk_agganciando_a = "UP" }
      if( IS_IDX(idx_368_up) == 0 & IS_IDX(idx_368_dw) == 1  ) { wk_idx_agg = idx_368_dw   wk_agganciando_a = "DW" }

      if( IS_IDX(wk_idx_agg) == 0 ) { EXITSUB() }

      if( log == 1 ) { COMANDO2(STRCAT("LOGMSG Offset_Fianco_Centra_30MM [",STR(ATTUALE()), "] STO AGGANCIANDO A ", wk_agganciando_a , " DI UN RIPIANO/368")) }

      SET_#(wk_idx_agg)

      offx = 0
      offy = 0

      ang_att = ANG_TOT_NOR(ATTUALE())

      wk_b0_fia = base_0

      wk_bc_fia = base_0
      wk_bc_fia.x = base_0.x + COSENO(ang_att)*(X/2)
      wk_bc_fia.z = base_0.z -   SENO(ang_att)*(X/2)

      wk_ac_fia = wk_bc_fia   wk_ac_fia.y = wk_ac_fia.y + Y

      i = 1
      wk_nome_punto = STRCAT("M4_SNAP_P",STR(i))

      while ( VAR_EXIST(wk_idx_agg,wk_nome_punto) )
      {
         if( log == 1 ) { COMANDO2(STRCAT("LOGMSG Offset_Ripiano_30MM [",STR(ATTUALE()), "] TESTO IL PUNTO ", wk_nome_punto)) }

         EVAL( STRCAT(" wk_psnap = #",wk_nome_punto))

         wk_dx = DistanzaFraPunti(wk_b0_fia, wk_psnap ,ang_att)

         if( ABS(wk_dx) < 1 )    { offx = - Spe_Fia / 2  i = 99 }

         if( ABS(wk_dx) < 31
           & ABS(wk_dx) > 29 )   { offx = Spe_Fia / 2  i = 99 }


         i = i + 1
         wk_nome_punto = STRCAT("M4_SNAP_P",STR(i))
      }

      if( NOME(wk_idx_agg) == "Ripiano_30MM" )
      {
         wk_b0_rip = #base_0
         wk_a0_rip = #alto_0

         if( wk_agganciando_a == "UP" )
         {
            wk_dy = ABS(wk_a0_rip.y - wk_ac_fia.y)
            if( wk_dy == 0  ) { offy = -30 }
         }

         if( wk_agganciando_a == "DW" )
         {
            wk_dy = ABS(wk_b0_rip.y - wk_bc_fia.y)
            if( wk_dy == 0  ) { offy = 30 }
         }
      }

      if( offx != 0 | offy != 0  )
      {
         wk_offx = offx

         offx = COSENO(ang_att)*wk_offx
         offz =   SENO(ang_att)*(-1*wk_offx)

         COMANDO(STRCAT("EDITPOS_REL ",STR(ATTUALE()) , " ",STR(offx), " ",STR(offy) ," " ,STR(offz) , " 0"))
      }
   }
   //} PROCEDURE FIANCHI

   //{ PROCEDURE RIPIANO
   PROCEDURA DecodificaTipoRipiano_30MM
   {
      //if( TipoRipiano == 0 )  { TipoRipianoStr = "MENSOLA"     X_Min = 368    X_Max = 2208   Z_Min = 136  Z_Max = 384  menu_x = "LarMens_30MM"  menu_z = "PrfRip_30MM" }
      //if( TipoRipiano == 1 )  { TipoRipianoStr = "RIPIANO"     X_Min = 184    X_Max = 2944   Z_Min = 136  Z_Max = 384  menu_x = "Lar_30MM"      menu_z = "PrfRip_30MM" }
      //if( TipoRipiano == 2 )  { TipoRipianoStr = "RIPIANO_TER" X_Min = 184    X_Max = 2208   Z_Min = 136  Z_Max = 384  menu_x = "LarMens_30MM"  menu_z = "PrfRip_30MM" }
      //if( TipoRipiano == 3 )  { TipoRipianoStr = "RIPIANO_SCH" X_Min = 184    X_Max = 2208   Z_Min = 222  Z_Max = 358  menu_x = "LarMens_30MM"  menu_z = "PrfRipS_30MM" }

      if( TipoRipiano == 0 )     { TipoRipianoStr = "MENSOLA"     X_Min = 313    X_Max = 2208   Z_Min = 136  Z_Max = 384  menu_x = "LarMens_30MM"  menu_z = "PrfRip_30MM" }
      if( TipoRipiano == 1 )     { TipoRipianoStr = "RIPIANO"     X_Min = 120    X_Max = 2944   Z_Min = 136  Z_Max = 384  menu_x = "Lar_30MM"      menu_z = "PrfRip_30MM" }
      if( TipoRipiano == 1
        & FLAG_BinAnta_EV == 1)  { TipoRipianoStr = "RIPIANO"     X_Min = 120    X_Max = 2209   Z_Min = 136  Z_Max = 384  menu_x = "Lar_30MM"      menu_z = "PrfRip_30MM" }

      if( TipoRipiano == 2 )     { TipoRipianoStr = "RIPIANO_TER" X_Min = 184    X_Max = 2208   Z_Min = 136  Z_Max = 384  menu_x = "LarMens_30MM"  menu_z = "PrfRip_30MM" }
      if( TipoRipiano == 3 )     { TipoRipianoStr = "RIPIANO_SCH" X_Min = 120    X_Max = 2208   Z_Min = 222  Z_Max = 358  menu_x = "LarMens_30MM"  menu_z = "PrfRipS_30MM" }

      if( NOME(ATTUALE()) == "RipianoVetro_30MM" )  { EXITSUB() }

      VAR_SET_MENU(ATTUALE(),"X",STRCAT(menu_x,"( ",STR(X_Min),"-",STR(X_Max), " )"))
      VAR_SET_MENU(ATTUALE(),"Z",STRCAT(menu_z,"( ",STR(Z_Min),"-",STR(Z_Max), " )"))

      EXITSUB()

      X_Min = 184
      X_Max = 2944

      Z_Min = 136
      Z_Max = 384

      menu_x = "Lar_30MM"
      menu_z = "PrfRip_30MM"

      VAR_SET_MENU(ATTUALE(),"X",STRCAT(menu_x,"( ",STR(X_Min),"-",STR(X_Max), " )"))
      VAR_SET_MENU(ATTUALE(),"Z",STRCAT(menu_z,"( ",STR(Z_Min),"-",STR(Z_Max), " )"))
   }

   PROCEDURA CtrlVincolaAMuro_30MM
   {
      if( ACTION()<=0 | ACTION()==2 | COMPONENDO() )  { EXITSUB() }

      if( GetTopLevel(ATTUALE()) != ATTUALE() )       { EXITSUB() }

      //Luca 20/07/2021
      if( VAR_VAL(GetTopLevel(ATTUALE()), "FLAG_Weightless") == 1 )  { EXITSUB() }

      if( TIPO_POS(ATTUALE()) == 1 )  { EXITSUB() }

      wk_dist = QUERY_WALL($M4_DragInfo_Ref,"distance from face R")
      if( wk_dist <= 0 ) { COMANDO(STRCAT("INTERIORS link try ",STR(ATTUALE()))) }
   }

   PROCEDURA CtrlRipiano_30MM
   {
      if( ACTION()<=0 | ACTION()==2 | COMPONENDO() )  { EXITSUB() }

      //Luca 17/02/2021
      GOSUB Ctrl_PresenzaTop_Moduli_368

      //if( $OnLoadOrder2 )                             { EXITSUB() }
      if( $OnLoadOrder )                             { EXITSUB() }

      RipSchienale_prec = VAR_VAL(ATTUALE(),"RipSchienale")

      //Luca 04/03/2021
      GOSUB CtrlVincolaAMuro_30MM

      GOSUB CtrlRipiano_TrovaRipiano_SxDx_30MM
      //Simone 12/06/21
      GOSUB CtrlRipiano_TrovaRipiano_RtFr_30MM

      GOSUB CtrlRipiano_TrovaFianco_SxDx_30MM
      GOSUB CtrlRipiano_Trova36e8_SxDx_30MM
      GOSUB CtrlRipiano_TrovaSchiena_Retro_30MM

      GOSUB CtrlRipiano_TrovaLed_30MM

      GOSUB CtrlRipiano_TrovaTeca_30MM

      GOSUB CtrlFianco_TrovaTeloEtv_30MM

      //Simone 13/05/2022
      GOSUB CtrlRipiano_TrovaPiastraWtl

      //Luca 13/05/2021 mantis 24882: 30MM - Gestione composizione angolare
      if( VAR_EXIST(ATTUALE(),"FLAG_RipConModular") )
      {
         if( IS_VAR_FIXED(ATTUALE(),"FLAG_RipConModular") == 0 )
         {
            FLAG_RipConModular = 0
            //LZ 10/09/2021
            //if( IS_IDX(idx_fia_sx) & IS_IDX(idx_rip_ang_dx)  )  { FLAG_RipConModular = 1 }
            //if( IS_IDX(idx_fia_dx) & IS_IDX(idx_rip_ang_sx)  )  { FLAG_RipConModular = 1 }
            if( IS_IDX(idx_rip_ang_dx) & (IS_IDX(idx_fia_sx) | IS_IDX(idx_368_sx)) )  { FLAG_RipConModular = 1 }
            if( IS_IDX(idx_rip_ang_sx) & (IS_IDX(idx_fia_dx) | IS_IDX(idx_368_dx)) )  { FLAG_RipConModular = 1 }
         }
      }

      //Simone 12/06/21
      if( VAR_EXIST(ATTUALE(), "FLAG_AggTerm") )
      {
         if( IS_VAR_FIXED(ATTUALE(),"FLAG_AggTerm") == 0 )
         {
            FLAG_AggTerm = 0
            if( IS_IDX(idx_rip_fr) )
            {
               //LZ 10/09/2021
               //if( VAR_VAL(idx_rip_fr, "FLAG_RipConModular") == 1 )   { FLAG_AggTerm = 1 }
               if( VAR_VAL(idx_rip_fr, "FLAG_RipConModular") == 1
                 | VAR_VAL(idx_rip_fr, "TipoRipiano") == 2 )          { FLAG_AggTerm = 1 }
            }

            if( IS_IDX(idx_rip_rt) )
            {
               //LZ 10/09/2021
               //if( VAR_VAL(idx_rip_rt, "FLAG_RipConModular") == 1 )   { FLAG_AggTerm = 1 }
               if( VAR_VAL(idx_rip_rt, "FLAG_RipConModular") == 1
                 | VAR_VAL(idx_rip_rt, "TipoRipiano") == 2 )          { FLAG_AggTerm = 1 }
            }
         }
      }

      // 23/07/21
      GOSUB CtrlRipiano_TrovaBinAnta_EV

      //DEFINISCO TIPO RIPIANO
      GOSUB CtrlRipiano_SetTipo_30MM

      GOSUB CtrlRipiano_CollideSchiena_30MM

      //verifico se devono essere inseriti in automatico il supporto o la barra
      ConSupporto = 0
      ConBarraTV = 0
      ConSupportoBinario = 0

      wk_agg_supp_barra = 0

      if( TipoRipianoStr == "RIPIANO" )
      {
         wk_agg_supp_barra = 1
         //Luca 16/12/2021
         if( VAR_VAL(ATTUALE(),"FLAG_RipConModular") == 1 )  { wk_agg_supp_barra = 0 }
      }

      if( TipoRipianoStr == "RIPIANO_SCH"
        & TipoRipianoSch != "VETRO" )   { wk_agg_supp_barra = 1 }

      if( wk_agg_supp_barra == 1  )
      {
         if( X >= 1105 & X <=2208 ) { ConSupporto = 1 }
         if( X > 2208 )             { ConBarraTV = 1 }
      }

      if( FLAG_BinAnta_EV == 1 & X > 1104 )
      {
          ConSupporto = 0
          ConSupportoBinario = 1
      }

      //la barra tv attrezzata esclude la mezzaluna
      COMPONENTI2("barra",ATTUALE(),"BarraRipianoPTV_30MM")
      if( barra > 0 & ConBarraTV == 0 ) { ConSupporto = 0 }

      //Luca 02/03/2021
      //aggiungo punti teche
      if( VAR_EXIST(ATTUALE(),"pnt_cont_30MM_np") )
      {
         COMPONENTI2("wk_teca",ATTUALE(),"Teca_30MM")
         np = pnt_cont_30MM_np
         i = 1
         while ( i <= wk_teca )
         {
            SET_#(wk_teca[i])
            VAR_CREATE_XYZ( ATTUALE() , STRCAT("pnt_cont_30MM_",STR(np)) , #alto_0.x , #alto_0.y + 15 , #alto_0.z , 0 , "" )
            np = np + 1
            VAR_CREATE_XYZ( ATTUALE() , STRCAT("pnt_cont_30MM_",STR(np)) , #alto_3.x , #alto_3.y + 15, #alto_3.z , 0 , "" )
            np = np + 1

            i = i + 1
         }
      }
   }

   PROCEDURA CtrlRipiano_SetTipo_30MM
   {
      if( VAR_VAL(ATTUALE(),"FLAG_Composto") == 1 )  { EXITSUB() }

      if( IS_VAR_FIXED( ATTUALE(), "TipoRipiano") == 0 )
      {
         wk_elemento_sx = 0
         wk_elemento_dx = 0

         if( IS_IDX(idx_fia_sx) == 1 | IS_IDX(idx_368_sx) == 1 | IS_IDX(idx_rip_ang_sx) == 1 ) { wk_elemento_sx = 1 }
         if( IS_IDX(idx_fia_dx) == 1 | IS_IDX(idx_368_dx) == 1 | IS_IDX(idx_rip_ang_dx) == 1 ) { wk_elemento_dx = 1 }

         TipoRipiano = 0
         PosizioneRip = 0

         //RIPIANO
         if( wk_elemento_sx == 1 & wk_elemento_dx == 1 ) { TipoRipiano = 1 }

         //RIPIANO TERMINALE DX
         if( wk_elemento_sx == 1 & wk_elemento_dx == 0 )
         {
            TipoRipiano  = 2
            PosizioneRip = 1
         }

         //RIPIANO TERMINALE SX
         if( wk_elemento_sx == 0 & wk_elemento_dx == 1 )
         {
            TipoRipiano  = 2
            PosizioneRip = -1
         }

         //RIPIANO SCHIENALE
         if( IS_IDX(idx_sch_rt) == 1 ) { TipoRipiano = 3 }
      }

      GOSUB DecodificaTipoRipiano_30MM

      //Luca 25/03/2021
      if( TipoRipianoStr != "RIPIANO"
        & TipoRipianoStr != "RIPIANO_TER"  )
      {
         if( FLAG_RipConModular == 1 )
         {
            DEL_VAR_MODIFICATE(ATTUALE(),"FLAG_RipConModular")
            FLAG_RipConModular = 0
         }
      }
   }

   PROCEDURA CtrlRipiano_CollideSchiena_30MM
   {
      log=1
      #ifndef TE
         log = 0
      #endif

      if( VAR_VAL(ATTUALE(),"OnCancellaSchiena") == 1 )
      {
         RientroZ_RipianoSch = 0

         OnCancellaSchiena = 0
         new_z = VAR_VAL(ATTUALE(),"Z_ori")
         if( new_z == 0 )   { EXITSUB() }

         ang_att = ANG_TOT_NOR(ATTUALE())

         wk_distz = new_z - Z

         offx =   SENO(ang_att)*(-1*wk_distz)
         offy = 0
         offz = COSENO(ang_att)*(-1*wk_distz)

         if( ins2_att == $ins2_posizionato )
         {
            COMANDO(STRCAT("VAR_CHANGE 1 ",STR(ATTUALE()) , " Z=",STR(new_z), " //CtrlRipiano_30MM" ))
            COMANDO(STRCAT("EDITPOS_REL  ",STR(ATTUALE()) , " ",STR(offx), " ",STR(offy) ," " ,STR(offz) , " 0"))
         }

         if( UN_PADRE("Colonna_30MM") )
         {
            COMANDO(STRCAT("RICALCOLA_UNA ",STR(PADRE(ATTUALE(),1)) , " no_agganciati //CtrlRipiano_30MM" ))
         }

         EXITSUB()
      }

      //in caso di schiena stesa, non passo qui finchč non viene completato il notifica
      if( VAR_VAL(ATTUALE(),"steso") == 1 )
      {
         if( VAR_VAL(ATTUALE(),"notificato") == 0 ) { EXITSUB() }
      }

      if( IS_IDX(idx_cnear_rsch) == 0 )  { EXITSUB() }

      BOX_MODE(0)
      NEAR_GLOBALE("wk_sch_rt",idx_cnear_rsch,1,1,"Schiena_30MM")
      //NEAR_GLOBALE2("wk_sch_rt",idx_cnear_rsch,1,"Schiena_30MM")
      if( wk_sch_rt > 0  ) { idx_sch_rt = wk_sch_rt[1] }

      if( IS_IDX(idx_sch_rt) == 0 )  { EXITSUB() }

      ang_att = ANG_TOT_NOR(ATTUALE())
      ang_sch = ANG_TOT_NOR(idx_sch_rt)

      if( ABS(ang_att - ang_sch) < 0.1 )
      {
         wk_b0_rip = base_0      wk_b0_rip.y = 0
         wk_b1_rip = base_1      wk_b1_rip.y = 0

         SET_#(idx_sch_rt)

         wk_b0_sch = #base_0     wk_b0_sch.y = 0
         wk_b1_sch = #base_1     wk_b1_sch.y = 0

         //COMANDO2(STRCAT("LOGMSG IDX_RIP=[",STR(ATTUALE()), "] | wk_b0_rip=[",STR(wk_b0_rip.x),",",STR(wk_b0_rip.y),",",STR(wk_b0_rip.z),"]  wk_b1_rip=[",STR(wk_b1_rip.x),",",STR(wk_b1_rip.y),",",STR(wk_b1_rip.z),"]"))
         //COMANDO2(STRCAT("LOGMSG IDX_RIP=[",STR(ATTUALE()), "] | wk_b0_sch=[",STR(wk_b0_sch.x),",",STR(wk_b0_sch.y),",",STR(wk_b0_sch.z),"]  wk_b1_sch=[",STR(wk_b1_sch.x),",",STR(wk_b1_sch.y),",",STR(wk_b1_sch.z),"]"))
         //COMANDO2(STRCAT("LOGMSG IDX_RIP=[",STR(ATTUALE()), "] | ang_att = ",STR(ang_att) ))

         wk_px = INTERFERISCI(wk_b1_sch,ang_att,wk_b0_rip,wk_b1_rip)

         ScriviSuLog( log , "CtrlRipiano_CollideSchiena_30MM" , STRCAT("[",STR(ATTUALE()),"] wk_px=",Point2String(wk_px)) )

         if( wk_px.x != $ERR_INTERFERISCI
           | wk_px.z != $ERR_INTERFERISCI  )
         {
            ScriviSuLog( log , "CtrlRipiano_CollideSchiena_30MM" , STRCAT("[",STR(ATTUALE()),"] wk_b0_rip=",Point2String(wk_b0_rip)) )

            //wk_distz = DistanzaFraPunti(wk_b0_rip ,wk_b1_sch , ang_att + 90)


            if( NOME(idx_sch_rt) == "SchienaWeightless_30MM" )
            {
               wk_distz = DistanzaFraPunti(wk_b0_rip ,wk_b1_sch , ang_att + 90)

               //Luca 20/04/2022 porto a 1 di distanza mm
               wk_distz = wk_distz + 1
            }
            else
            {
               wk_distz = DistanzaFraPunti(wk_b0_rip ,wk_b0_sch , ang_att + 90)

               ScriviSuLog( log , "CtrlRipiano_CollideSchiena_30MM" , STRCAT("[",STR(ATTUALE()),"] 1 wk_distz=",STR(wk_distz)) )

               //wk_distz = 19.5 - wk_distz
               //wk_distz = 32.5 - wk_distz

               //20 spessore schiena
               if( wk_distz == 19.5  )
               {
                  wk_distz = 0
               }
               else
               {
                  wk_distz = wk_distz + 19.5
               }

            }

            ScriviSuLog( log , "CtrlRipiano_CollideSchiena_30MM" , STRCAT("[",STR(ATTUALE()),"] 2 wk_distz=",STR(wk_distz)) )

            //Luca 20/04/2022 porto a 1 di distanza mm
            //wk_distz = wk_distz + 1

            //if( ABS(wk_distz) > 0.5 )
            if( ABS(wk_distz) > 0 )
            {
               RientroZ_RipianoSch = RientroZ_RipianoSch + wk_distz

               ScriviSuLog( log , "CtrlRipiano_CollideSchiena_30MM" , STRCAT("[",STR(ATTUALE()),"] RientroZ_RipianoSch=",STR(RientroZ_RipianoSch)) )


               new_z = (Z - wk_distz)*10
               new_z = FLOOR(new_z+0.5)/10

               ScriviSuLog( log , "CtrlRipiano_CollideSchiena_30MM" , STRCAT("[",STR(ATTUALE()),"] new_z=",STR(new_z)) )

               offx = SENO(ang_att)*wk_distz
               offy = 0
               offz = COSENO(ang_att)*wk_distz

               Z_ori = VAR_VAL(ATTUALE(),"Z_ori")
               if( Z_ori == 0 ) { Z_ori = Z }

               if( new_z != Z )
               {
                  if( ins2_att == $ins2_posizionato )
                  {
                     Z = new_z
                     COMANDO(STRCAT("EDITPOS_REL  ",STR(ATTUALE()) , " ",STR(offx), " ",STR(offy) ," " ,STR(offz) , " 0 // CtrlRipiano_30MM"))
                     COMANDO(STRCAT("VAR_CHANGE 1 ",STR(ATTUALE()) , " Z=",STR(new_z), " Z_ori=",STR(Z_ori), " //CtrlRipiano_30MM" ))
                     COMANDO(STRCAT("RICALCOLA_UNA ",STR(ATTUALE()) , " no_agganciati //CtrlRipiano_30MM" ))
                  }
               }
            }
         }
      }
   }


   PROCEDURA CtrlRipiano_TrovaRipiano_SxDx_30MM
   {
      if( VAR_EXIST(ATTUALE(),"idx_cnear_sx") == 0 ) { EXITSUB() }
      if( IS_IDX(idx_cnear_sx) == 0 )                { EXITSUB() }

      //ripiano stesso angolo
      idx_rip_sx = -1
      idx_rip_dx = -1

      //ripiano con angolo diverso
      idx_rip_ang_sx = -1
      idx_rip_ang_dx = -1

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_rip_sx",idx_cnear_sx,1,"Ripiano_30MM")
      NEAR_GLOBALE2("wk_rip_dx",idx_cnear_dx,1,"Ripiano_30MM")

      i = 1
      while ( i <= wk_rip_sx )
      {
         if( wk_rip_sx[i] != ATTUALE() )
         {
            if( ABS(ANG_TOT_NOR(wk_rip_sx[i] ) - ANG_TOT_NOR(ATTUALE())) < 0.1  )  { idx_rip_sx     = wk_rip_sx[i] }
            else                                                                   { idx_rip_ang_sx = wk_rip_sx[i] }
         }
         i = i + 1
      }

      i = 1
      while ( i <= wk_rip_dx )
      {
         if( wk_rip_dx[i] != ATTUALE() )
         {
            if( ABS(ANG_TOT_NOR(wk_rip_dx[i] ) - ANG_TOT_NOR(ATTUALE())) < 0.1  )  { idx_rip_dx     = wk_rip_dx[i] }
            else                                                                   { idx_rip_ang_dx = wk_rip_dx[i] }
         }
         i = i + 1
      }
   }

   //Simone
   PROCEDURA CtrlRipiano_TrovaRipiano_RtFr_30MM
   {
      if( VAR_EXIST(ATTUALE(),"idx_cnear_fr") == 0 ) { EXITSUB() }
      if( IS_IDX(idx_cnear_fr) == 0 )                { EXITSUB() }

      idx_rip_fr = -1
      idx_rip_rt = -1

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_rip_fr",idx_cnear_fr,1,"Ripiano_30MM")
      NEAR_GLOBALE2("wk_rip_rt",idx_cnear_rt,1,"Ripiano_30MM")

      i = 1
      while ( i <= wk_rip_fr )
      {
         if( wk_rip_fr[i] != ATTUALE() )   { idx_rip_fr = wk_rip_fr[i] }
         i = i + 1
      }

      i = 1
      while ( i <= wk_rip_rt )
      {
         if( wk_rip_rt[i] != ATTUALE() )   { idx_rip_rt = wk_rip_rt[i] }
         i = i + 1
      }
   }

   PROCEDURA CtrlRipiano_TrovaFianco_SxDx_30MM
   {
      if( VAR_EXIST(ATTUALE(),"idx_cnear_sx") == 0 ) { EXITSUB() }
      if( IS_IDX(idx_cnear_sx) == 0 )                { EXITSUB() }

      idx_fia_sx = -1
      idx_fia_dx = -1

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_fia_sx",idx_cnear_sx,1,"Fianco_30MM")
      NEAR_GLOBALE2("wk_fia_dx",idx_cnear_dx,1,"Fianco_30MM")

      if( wk_fia_sx > 0  ) { idx_fia_sx = wk_fia_sx[1] }
      if( wk_fia_dx > 0  ) { idx_fia_dx = wk_fia_dx[1] }
   }

   PROCEDURA CtrlRipiano_TrovaSchiena_Retro_30MM
   {
      if( VAR_EXIST(ATTUALE(),"idx_cnear_rt") == 0 ) { EXITSUB() }
      if( IS_IDX(idx_cnear_rt) == 0 )                { EXITSUB() }

      idx_sch_rt = -1

      BOX_MODE(0)
      nome_schiena = "Schiena_30MM"
      if( UN_PADRE("Colonna_30MM") )
      {
         if( VAR_VAL(GetTopLevel(ATTUALE()),"FLAG_Weightless")
           | HAS_ALIAS(GetTopLevel(ATTUALE()),"ColonnaTerra_30MM") )  { nome_schiena = "SchienaWeightless_30MM" }
      }

      NEAR_GLOBALE("wk_sch_rt",idx_cnear_rt,1,1,nome_schiena)
      //NEAR_GLOBALE("wk_sch_rt",idx_cnear_rt,1,1,"Schiena_30MM")
      //NEAR_GLOBALE2("wk_sch_rt",idx_cnear_rt,1,"Schiena_30MM")


      if( wk_sch_rt > 0  ) { idx_sch_rt = wk_sch_rt[1] }

      TipoRipianoSch = ""
      if( IS_IDX(idx_sch_rt) ) { TipoRipianoSch = VAR_VAL_STR(idx_sch_rt,"TipoSchienale") }

      //Luca 18/02/2021
      idx_sch_up = -1
      idx_sch_dw = -1

      NEAR_GLOBALE2("wk_sch_up",idx_cnear_ar,10,"Schiena_30MM")
      NEAR_GLOBALE2("wk_sch_dw",idx_cnear_br,10,"Schiena_30MM")

      if( wk_sch_up > 0  ) { idx_sch_up = wk_sch_up[1] }
      if( wk_sch_dw > 0  ) { idx_sch_dw = wk_sch_dw[1] }

      if( IS_IDX(idx_sch_rt) )
      {
         idx_sch_up = -1
         idx_sch_dw = -1
      }
   }

   PROCEDURA CtrlRipiano_TrovaLed_30MM
   {
      if( VAR_EXIST(ATTUALE(),"idx_cnear_up") == 0 ) { EXITSUB() }
      if( IS_IDX(idx_cnear_up) == 0 )                { EXITSUB() }

      idx_led_up = -1
      idx_led_dw = -1

      NEAR_GLOBALE2("wk_led_up",idx_cnear_up,2,"Led_30MM")
      NEAR_GLOBALE2("wk_led_dw",idx_cnear_dw,2,"Led_30MM")

      if( wk_led_up > 0  ) { idx_led_up = wk_led_up[1] }
      if( wk_led_dw > 0  ) { idx_led_dw = wk_led_dw[1] }
   }

   PROCEDURA CtrlRipiano_Trova36e8_SxDx_30MM
   {
      if( VAR_EXIST(ATTUALE(),"idx_cnear_sx") == 0 ) { EXITSUB() }
      if( IS_IDX(idx_cnear_sx) == 0 )                { EXITSUB() }

      idx_368_sx = -1
      idx_368_dx = -1

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_368_sx",idx_cnear_sx,1,"Modulo*368")
      NEAR_GLOBALE2("wk_368_dx",idx_cnear_dx,1,"Modulo*368")

      //LZ 04/11/2021: gestione vicinanza con pensili:
      //               se confino con una cappa o uno scolapiatti, divento terminale solo se
      //               la lavorazione sul pensile č in un'area fattibile (oltre 92mm dal filo sotto del pensile)
      //LZ 09/07/2021: non considero i 368 glass, non possiamo scaricare alcuna lavorazione su questi
      //if( wk_368_sx > 0 ) { idx_368_sx = wk_368_sx[1] }
      //if( wk_368_dx > 0 ) { idx_368_dx = wk_368_dx[1] }

      VT_CF30_368 = 0
      if( wk_368_sx > 0 )
      {
         wk_368_sx_ok  = 1
         wk_368_sx_att = wk_368_sx[1]
         wk_368_sx_att_nome = NOME(wk_368_sx_att)

         if( IS_MATCH( wk_368_sx_att_nome, "Modulo*Glass_368") == 1 )                         { wk_368_sx_ok = 0 }
         if( IS_MATCH( wk_368_sx_att_nome, "ModuloPensileCappa_368") == 1
           | IS_MATCH( wk_368_sx_att_nome, "ModuloPensileScPiatti_368") == 1 )
         {
            //LZ 04/11/2021: cam non coerente, vanno viviste le specifiche con l'UT, per il momento blocco a filo sopra
            //if( VAR_VAL( ATTUALE(), "base_0.y") - VAR_VAL( wk_368_sx_att, "base_0.y") <= 92 ) { wk_368_sx_ok = 0 }
            if( VAR_VAL( ATTUALE(), "alto_0.y") != VAR_VAL( wk_368_sx_att, "alto_0.y"))       { wk_368_sx_ok = 0 }
         }

         if( wk_368_sx_ok == 1 )
         {
            idx_368_sx = wk_368_sx[1]
            VT_CF30_368 = VT_CF30_368 + 1
         }
      }

      if( wk_368_dx > 0 )
      {
         wk_368_dx_ok  = 1
         wk_368_dx_att = wk_368_dx[1]
         wk_368_dx_att_nome = NOME(wk_368_dx_att)

         if( IS_MATCH( wk_368_dx_att_nome, "Modulo*Glass_368") == 1 )                         { wk_368_dx_ok = 0 }
         if( IS_MATCH( wk_368_dx_att_nome, "ModuloPensileCappa_368") == 1
           | IS_MATCH( wk_368_dx_att_nome, "ModuloPensileScPiatti_368") == 1 )
         {
            //LZ 04/11/2021: cam non coerente, vanno viviste le specifiche con l'UT, per il momento blocco a filo sopra
            //if( VAR_VAL( ATTUALE(), "base_0.y") - VAR_VAL( wk_368_dx_att, "base_0.y") <= 92 ) { wk_368_dx_ok = 0 }
            if( VAR_VAL( ATTUALE(), "alto_0.y") != VAR_VAL( wk_368_dx_att, "alto_0.y"))       { wk_368_dx_ok = 0 }
         }

         if( wk_368_dx_ok == 1 )
         {
            idx_368_dx = wk_368_dx[1]
            VT_CF30_368 = VT_CF30_368 + 1
         }
      }
   }

   PROCEDURA CtrlRipiano_TrovaTeca_30MM
   {
      if( VAR_EXIST(ATTUALE(),"idx_cnear_up") == 0 ) { EXITSUB() }
      if( IS_IDX(idx_cnear_up) == 0 )                { EXITSUB() }

      idx_tec_up = -1
      idx_tec_dw = -1

      BOX_MODE(0)
      //NEAR_GLOBALE2("wk_tec_up",idx_cnear_up,2,"Teca_30MM")
      //NEAR_GLOBALE2("wk_tec_dw",idx_cnear_dw,2,"Teca_30MM")
      NEAR_GLOBALE("wk_tec_up",idx_cnear_up,2,1,"Teca_30MM")
      NEAR_GLOBALE("wk_tec_dw",idx_cnear_dw,2,1,"Teca_30MM")

      if( wk_tec_up > 0  ) { idx_tec_up = wk_tec_up[1] }
      if( wk_tec_dw > 0  ) { idx_tec_dw = wk_tec_dw[1] }

      //numero vetri orizzontali teca che interessano il ripiano
      NVetriTeca = 0
      if( IS_IDX(idx_tec_up) ) { NVetriTeca = NVetriTeca + 1 }
      if( IS_IDX(idx_tec_dw) )
      {
         if( VAR_VAL(idx_tec_dw,"TipoTeca")==4 ) { NVetriTeca = NVetriTeca + 1 }
      }

      //Luca 20/07/2021
      //cerco gli schienali vetro
      idx_ripV_up = -1
      idx_ripV_dw = -1

      NEAR_GLOBALE("wk_vet_up",idx_cnear_up,2,1,"SchienaVetroWTL_30MM")
      NEAR_GLOBALE("wk_vet_dw",idx_cnear_dw,2,1,"SchienaVetroWTL_30MM")

      if( wk_vet_up > 0  ) { idx_ripV_up = wk_vet_up[1] }
      if( wk_vet_dw > 0  ) { idx_ripV_dw = wk_vet_dw[1] }

      //Luca 20/04/2022
      idx_schWTL_up = -1
      idx_schWTL_dw = -1

      NEAR_GLOBALE("wk_swtl_up",idx_cnear_up,2,1,"SchienaWeightless_30MM")
      NEAR_GLOBALE("wk_swtl_dw",idx_cnear_dw,2,1,"SchienaWeightless_30MM")

      if( wk_swtl_up > 0 ) { idx_schWTL_up = wk_swtl_up[1] }
      if( wk_swtl_dw > 0 ) { idx_schWTL_dw = wk_swtl_dw[1] }

   }

   PROCEDURA Offset_Ripiano_30MM
   {
      if( VAR_VAL(-1,"offset_idx") != ATTUALE() )  { EXITSUB() }

      //Luca 16/03/2021
      if( $L30_ATTIVA_ALLRIPA == 0 )               { EXITSUB() }

      log = 0
      #ifdef TE
         log = VAR_VAL(-1,"ATTIVA_LOG_DBG")
      #endif

      if( log == 1 ) { COMANDO2(STRCAT("LOGMSG Offset_Ripiano_30MM [",STR(ATTUALE()), "] START")) }

      GOSUB CtrlRipiano_TrovaFianco_SxDx_30MM
      GOSUB CtrlRipiano_Trova36e8_SxDx_30MM

      if( IS_IDX(idx_fia_sx) == 0 & IS_IDX(idx_fia_dx) == 0
        & IS_IDX(idx_368_sx) == 0 & IS_IDX(idx_368_dx) == 0  ) { EXITSUB() }

      Spe_Fia = 30
      Spe_Rip = 30

      wk_agganciando_a = ""

      wk_fianco_a = ""
      wk_368_a = ""

      wk_idx_agg = -1
      if( IS_IDX(idx_fia_sx) == 1 & IS_IDX(idx_fia_dx) == 0  ) { wk_idx_agg = idx_fia_sx   wk_agganciando_a = "DX" wk_fianco_a = "SX" }
      if( IS_IDX(idx_fia_sx) == 0 & IS_IDX(idx_fia_dx) == 1  ) { wk_idx_agg = idx_fia_dx   wk_agganciando_a = "SX" wk_fianco_a = "DX" }
      if( IS_IDX(idx_368_sx) == 1 & IS_IDX(idx_368_dx) == 0  ) { wk_idx_agg = idx_368_sx   wk_agganciando_a = "DX" wk_368_a = "SX" }
      if( IS_IDX(idx_368_sx) == 0 & IS_IDX(idx_368_dx) == 1  ) { wk_idx_agg = idx_368_dx   wk_agganciando_a = "SX" wk_368_a = "DX" }

      if( log == 1 ) { COMANDO2(STRCAT("LOGMSG Offset_Ripiano_30MM [",STR(ATTUALE()), "] STO AGGANCIANDO A ", wk_agganciando_a , " DI UN FIANCO/368")) }

      //if( wk_fianco_a == "" & wk_368_a   == ""  ) { EXITSUB() }
      if( wk_agganciando_a == "" )  { EXITSUB() }

      ////AGGANCIO A TERRA
      //wk_idx_fia = SE_NUM( wk_fianco_a == "SX" , idx_fia_sx, idx_fia_dx )
      //
      ////TRATTO UN MODULO 368 come UN FIANCO
      //if( wk_fianco_a == "" )
      //{
      //   wk_fianco_a = wk_368_a
      //   wk_idx_fia = SE_NUM( wk_368_a == "SX" , idx_368_sx, idx_368_dx )
      //}

      SET_#(wk_idx_agg)

      //if( log == 1 ) { COMANDO2(STRCAT("LOGMSG Offset_Ripiano_30MM [",STR(ATTUALE()), "] IDX_FIANCO = ", STR(wk_idx_fia))) }

      offx = 0
      offy = 0

      ang_att = ANG_TOT_NOR(ATTUALE())

      wk_b0_agg = #base_0     wk_b0_agg_y0 = wk_b0_agg   wk_b0_agg_y0.y = 0
      wk_b3_agg = #base_3     wk_b3_agg_y0 = wk_b3_agg   wk_b3_agg_y0.y = 0

      wk_b0_rip = base_0      wk_b0_rip_y0 = wk_b0_rip   wk_b0_rip_y0.y = 0
      wk_b3_rip = base_3      wk_b3_rip_y0 = wk_b3_rip   wk_b3_rip_y0.y = 0

      wk_bc_rip = base_0      wk_bc_rip.y = base_0.y + Y/2

      //1. VERIFICO AGGANCIO a TERRA: DEVE ESSERE ALZATO DI 17 (altezza piedini)
      //rob_pec 11/02/2021 l'altezza dei piedini dipende dalla variante C088
      if( VAR_VAL(wk_idx_agg,"ConPiedini") == 1 )
      {
         //wk_dist = DISTANZA(wk_b3_agg,wk_b0_rip)
         //if( wk_aggnco_a == "DX"  ) { wk_dist = DISTANZA(wk_b0_agg,wk_b3_rip) }
         //if( ABS(wk_dist) < 0.1  ) { offy = $L30_Alt_Pie }

         wk_dist_a = DISTANZA(wk_b3_agg,wk_b0_rip)
         wk_dist_b = DISTANZA(wk_b0_agg,wk_b3_rip)
         wk_dist_c = DISTANZA(wk_b0_agg,wk_b0_rip)
         wk_dist_d = DISTANZA(wk_b3_agg,wk_b3_rip)

         if( ABS(wk_dist_a) < 0.1  | ABS(wk_dist_b) < 0.1
           | ABS(wk_dist_c) < 0.1  | ABS(wk_dist_d) < 0.1 )
         {
            offy = $L30_Alt_Pie
            if( log == 1 ) { COMANDO2(STRCAT("LOGMSG Offset_Ripiano_30MM [",STR(ATTUALE()), "] AGGANCIATO A TERRA --> offy= ", STR(offy))) }

            //verifico che non sia preso un punto opposto
            wk_dist_a = DISTANZA(wk_b0_agg_y0,wk_b0_rip_y0)
            wk_dist_b = DISTANZA(wk_b3_agg_y0,wk_b3_rip_y0)
            if( ABS(wk_dist_a) < 0.1 ) { offx = Spe_Fia }
            if( ABS(wk_dist_b) < 0.1 ) { offx = -1*Spe_Fia }
         }
      }

      //trovo l'id del punto di snap a cui mi sono agganciato
      //sul fianco i punti dispari sono a sx, quelli pari a dx

      i = 1
      wk_nome_punto = STRCAT("M4_SNAP_P",STR(i))

      while ( VAR_EXIST(wk_idx_agg,wk_nome_punto) )
      {
         if( log == 1 ) { COMANDO2(STRCAT("LOGMSG Offset_Ripiano_30MM [",STR(ATTUALE()), "] TESTO IL PUNTO ", wk_nome_punto)) }

         EVAL( STRCAT(" wk_psnap = #",wk_nome_punto))

         //wk_dist = DISTANZA(wk_psnap,wk_b0_rip)
         //if( wk_aggnco_a == "DX" ) { wk_dist = DISTANZA(wk_psnap,wk_b3_rip) }

         wk_dy = wk_psnap.y - wk_bc_rip.y

         if( ABS(wk_dy) < 16 )
         {

            wk_dx = DistanzaFraPunti(wk_b0_rip, wk_psnap ,ang_att)
            //if( wk_fianco_a == "DX" ) { wk_dx = DistanzaFraPunti(wk_b3_rip,wk_psnap,ang_att) }
            if( wk_agganciando_a == "SX" ) { wk_dx = DistanzaFraPunti(wk_b3_rip,wk_psnap,ang_att) }

            //verifico se il punto preso č sul lato giusto del fianco
            //se sto agganciado a dx il punto deve essere pari, altrimenti dispari
            wk_pari = SE_NUM( MODULO(i,2) == 0 , 1, 0)

            if( ABS(wk_dx) < 1 )
            {
               if( log == 1 ) { COMANDO2(STRCAT("LOGMSG Offset_Ripiano_30MM [",STR(ATTUALE()), "] wk_dx = ", STR(wk_dx) , "wk_dy = ", STR(wk_dy) , " ID POINT = " ,STR(i))) }

               //sto agganciando a DX ma ho preso un punto dispari
               //if( wk_fianco_a == "SX" & wk_pari == 0 )  {  offx = Spe_Fia }
               if( wk_agganciando_a == "DX" & wk_pari == 0 )  {  offx = Spe_Fia }

               //sto agganciando a SX ma ho preso un punto pari
               //if( wk_fianco_a == "DX" & wk_pari == 1 )  {  offx = -1*Spe_Fia }
               if( wk_agganciando_a == "SX" & wk_pari == 1 )  {  offx = -1*Spe_Fia }

               offy = wk_dy
               //trovato il punto corretto --> esco
               i = 99
            }
         }

         i = i + 1
         wk_nome_punto = STRCAT("M4_SNAP_P",STR(i))
      }


      if( offx != 0 | offy != 0  )
      {
         wk_offx = offx

         offx = COSENO(ang_att)*wk_offx
         offz =   SENO(ang_att)*(-1*wk_offx)

         COMANDO(STRCAT("EDITPOS_REL ",STR(ATTUALE()) , " ",STR(offx), " ",STR(offy) ," " ,STR(offz) , " 0"))
      }
   }

   // 23/07/21
   PROCEDURA CtrlRipiano_TrovaBinAnta_EV
   {
      // se non sono per EtVoilą esco...
      if( VAR_VAL(ATTUALE(), "FLAG_EtVoila") == 0 )    { EXITSUB() }

      if( VAR_EXIST(ATTUALE(),"idx_cnear_fr_bin") != 1 )   { EXITSUB() }
      if( IS_IDX(idx_cnear_fr_bin) != 1 )                  { EXITSUB() }

      // solo se nella colonna sono il coperchio o fondo,
      // oppure se sono "UNICO" ovvero posizionato come tl (stand-alone)
//      if( VAR_UsoRipianoStrut != "COPERCHIO-COLONNA"
//        & VAR_UsoRipianoStrut != "FONDO-COLONNA"
//        & VAR_UsoRipianoStrut != "STAND-ALONE"
//        )
//      { EXITSUB() }

      VAR_UsoRipianoStrut = VAR_VAL_STR(ATTUALE(), "VAR_UsoRipianoStrut")

      if( VAR_UsoRipianoStrut == "RIPIANO-CENTRALE-COLONNA" )   { EXITSUB() }

      idx_bin_anta_ev = -1
      FLAG_BinAnta_EV = 0

      BOX_MODE(0)
      NEAR_GLOBALE("wk_bin_anta_ev", idx_cnear_fr_bin, 1, 1, "Binario_EtVoila")

      if( wk_bin_anta_ev > 0 )
      {
         FLAG_BinAnta_EV = 1

         // se serve recupero anche l'idx del binario
         idx_bin_anta_ev = wk_bin_anta_ev[1]
      }
   }

   //Simone 13/05/2022
   PROCEDURA CtrlRipiano_TrovaPiastraWtl
   {
      if( VAR_EXIST(ATTUALE(),"idx_cnear_up") == 0 ) { EXITSUB() }
      if( IS_IDX(idx_cnear_up) == 0 )                { EXITSUB() }

      idx_piastra = -1
      ConPiastraSup = 0

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_piastra",idx_cnear_up,1,"PiastraWeightless_30MM")
      if( wk_piastra > 0 )
      {
         idx_piastra = wk_piastra[1]
         ConPiastraSup = 1
      }
   }
   //} PROCEDURE RIPIANO

   //{ PROCEDURE GESTIONALE
   PROCEDURA Set_Gest_C003_Fianco_30MM
   {
      if( ACTION() <= 0 | ACTION()== 2 ) {  EXITSUB() }

      //solo su TAB_EREDITA per evitare la prima richiesta
      if( ACTION() == 28 )
      {
         C003 = "TE001"
         VarAdd = "C003"   GOSUB Add_TABER_VARSETTATE
      }

      CAT_VM_var = "C003"
      CAT_VM_opz = "TE001;SO001"
      CAT_VM_sel = ""

      CAT_VM_sel = "TE001"
      //rob_pec 11/02/2021 : cambio il controlla da ConPiedini a wk_A_TERRA
      //if( VAR_VAL(ATTUALE(),"ConPiedini") != 1 )  { CAT_VM_sel = "SO001" }
      if( VAR_VAL(ATTUALE(),"wk_A_TERRA") != 1 )  { CAT_VM_sel = "SO001" }

      GOSUB Gest_CAT_VM
   }

   PROCEDURA Set_Gest_C008_Fianco_30MM
   {
      if( ACTION() <= 0 | ACTION()== 2 )            {  EXITSUB() }

      if( VAR_EXIST(ATTUALE(),"GEST_C008")==0 )     {  EXITSUB() }

      if( ACTION()==28 )
      {
         if( IS_VarsUser__(ATTUALE(),"GEST_C008") == 1 )
         {
            DEL_VAR_MODIFICATE(ATTUALE(),"GEST_C008")
            DEL_VARS_USER(ATTUALE(),"GEST_C008")
         }
      }

      CAT_VM_var = "C008"
      CAT_VM_opz = "FF001;FF002;PF017;SM081;SM082"
      CAT_VM_sel = ""

      //if( IS_IDX(idx_fia_up)) { CAT_VM_sel = "FF001" }
      //if( IS_IDX(idx_fia_dw))
      //{
      //   if( CAT_VM_sel=="" ) { CAT_VM_sel = "FF002" }
      //   else                 { CAT_VM_sel = STRCAT(CAT_VM_sel,";FF002") }
      //}
      //
      //if( IS_IDX(idx_sch_sx) | IS_IDX(idx_sch_dx))
      //{
      //   if( CAT_VM_sel=="" ) { CAT_VM_sel = "PF017" }
      //   else                 { CAT_VM_sel = STRCAT(CAT_VM_sel,";PF017") }
      //}

      if( IS_IDX(idx_fia_up) ) { AddVal_CAT_VM_sel( CAT_VM_sel , "FF001" ) }

      if( IS_IDX(idx_fia_dw) ) { AddVal_CAT_VM_sel( CAT_VM_sel , "FF002" ) }

      if( IS_IDX(idx_sch_sx)
        | IS_IDX(idx_sch_dx) ) { AddVal_CAT_VM_sel( CAT_VM_sel , "PF017" ) }

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_rip_sx",idx_cnear_sx,1,"Ripiano_30MM")
      NEAR_GLOBALE2("wk_rip_dx",idx_cnear_dx,1,"Ripiano_30MM")

      if( wk_rip_sx == 0 & wk_rip_dx  > 0 )  { AddVal_CAT_VM_sel( CAT_VM_sel , "SM081" ) }
      if( wk_rip_sx  > 0 & wk_rip_dx == 0 )  { AddVal_CAT_VM_sel( CAT_VM_sel , "SM081" ) }
      if( wk_rip_sx  > 0 & wk_rip_dx  > 0 )  { AddVal_CAT_VM_sel( CAT_VM_sel , "SM082" ) }

      GOSUB Gest_CAT_VM
   }

   PROCEDURA Set_Gest_C087_Fianco_30MM
   {
      if( ACTION() <= 0 | ACTION()== 2 )           {  EXITSUB() }
      if( VAR_EXIST(ATTUALE(),"GEST_C087")==0 )    {  EXITSUB() }
      //Simone 02/05/2022
      //if( IS_VAR_FIXED(ATTUALE(),"GEST_C087")==1 ) {  EXITSUB() }
      if( IS_VAR_FIXED(ATTUALE(),"GEST_C087")==1 ) { DEL_VAR_MODIFICATE(ATTUALE(),"GEST_C087") }

      //Simone 02/05/2022 - Gestione non pił necessaria perchč č stata tolta l'obbligatorietą della categoria
      ////solo su TAB_EREDITA per evitare la prima richiesta
      //if( ACTION() == 28 )
      //{
      //   C087 = "FR004"
      //   VarAdd = "C087"   GOSUB Add_TABER_VARSETTATE
      //   EXITSUB()
      //}

      //Simone 02/05/2022 - Gestione agganci regolabili per binario et voilą
      BOX_MODE(0)
      wk_bin_inf = 0
      NEAR_GLOBALE2("wk_bin",idx_cnear_fr,1,"Binario_EtVoila")
      i = 1
      while( i <= wk_bin & wk_bin_inf == 0 )
      {
         if( VAR_VAL(wk_bin[i],"TipoBinario") == 0 ) { wk_bin_inf = 1 }
         i = i + 1
      }

      wk_rip_sx_ok = 0
      wk_rip_dx_ok = 0
      NEAR_GLOBALE2("wk_rip_sx",idx_cnear_sx,1,"Ripiano_30MM")
      NEAR_GLOBALE2("wk_rip_dx",idx_cnear_dx,1,"Ripiano_30MM")

      if( wk_rip_sx > 0 & wk_rip_dx > 0 )
      {
         i = 1
         while( i <= wk_rip_sx & wk_rip_sx_ok == 0 )
         {
            if( VAR_VAL(wk_rip_sx[i],"FLAG_BinAnta_EV") == 1 ) { wk_rip_sx_ok = 1 }
            i = i + 1
         }

         j = 1
         while( j <= wk_rip_dx & wk_rip_dx_ok == 0 )
         {
            if( VAR_VAL(wk_rip_dx[j],"FLAG_BinAnta_EV") == 1 ) { wk_rip_dx_ok = 1 }
            j = j + 1
         }
      }

      C087 = "FR004"
      if( VAR_VAL(ATTUALE(),"wk_A_PARETE") != 1 )  { C087 = "FR006" }

      //Simone 02/05/2022
      if( wk_bin_inf > 0
        & wk_rip_sx_ok > 0
        & wk_rip_dx_ok > 0
        & VAR_VAL(ATTUALE(),"Y") <= 250 )          { C087 = "FR012" }

      VarAdd = "C087"   GOSUB Add_TABER_VARSETTATE
   }

   PROCEDURA Set_Gest_C003_Ripiano_30MM
   {
      if( ACTION() <= 0 | ACTION() == 2 )           { EXITSUB() }

      if( IS_VarsUser__(ATTUALE(),"GEST_C003") == 1 )
      {
         DEL_VAR_MODIFICATE(ATTUALE(),"GEST_C003")
         DEL_VARS_USER(ATTUALE(),"GEST_C003")
      }

      gest_C003 = "__"
      if( TipoRipiano < 3 )
      {
         gest_C003 = "CS002"
         if( PosizioneRip == -1 ) { gest_C003 = "SX001" }
         if( PosizioneRip ==  1 ) { gest_C003 = "DX001" }
      }

      GEST_C003 = gest_C003
      VarAdd = "GEST_C003"   GOSUB Add_TABER_VARSETTATE
   }

   PROCEDURA Set_Gest_C008_Ripiano_30MM
   {
      if( ACTION() <= 0 | ACTION()== 2 | $OnLoadOrder==1 )           { EXITSUB() }

      #ifndef TEC
      if( IS_VarsUser__(ATTUALE(),"GEST_C008") == 1 )
      {
         DEL_VAR_MODIFICATE(ATTUALE(),"GEST_C008")
         DEL_VARS_USER(ATTUALE(),"GEST_C008")
      }
      #endif

      if( ACTION() == 28 )
      {
         C008 = "__"
         VarAdd = "C008"   GOSUB Add_TABER_VARSETTATE
         EXITSUB()
      }

      //Simone 13/05/2022 - Gestisco nuovi valori per ripiani 30mm weightless
      CAT_VM_var = "C008"
      CAT_VM_opz = "PF016;SM088;SM089;PF015;PF026"
      CAT_VM_sel = ""

      if( VAR_VAL(ATTUALE(),"FLAG_RipConModular") == 1 )  { AddVal_CAT_VM_sel( CAT_VM_sel , "PF016" ) }

      //Simone 12/06/21
      if( VAR_VAL(ATTUALE(),"FLAG_AggTerm") == 1 )        { AddVal_CAT_VM_sel( CAT_VM_sel , "SM088" ) }

      //Luca 14/09/2021
      if( VAR_VAL(ATTUALE(),"FLAG_BinAnta_EV") == 1 )     { AddVal_CAT_VM_sel( CAT_VM_sel , "SM089" ) }

      //COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " | DEBUG ---- CAT_VM_sel=",CAT_VM_sel))

      //Simone 13/05/2022 - Aggancio a pavimento
      if( IS_IDX(idx_fia_dx)
        & IS_IDX(idx_fia_sx))
      {
         if( VAR_VAL(idx_fia_dx,"wk_A_TERRA")==1 & VAR_VAL(idx_fia_dx,"wk_A_PARETE")==0
           & VAR_VAL(idx_fia_sx,"wk_A_TERRA")==1 & VAR_VAL(idx_fia_sx,"wk_A_PARETE")==0
           & VAR_UsoRipianoStrut == "FONDO-COLONNA" )
        {
           AddVal_CAT_VM_sel( CAT_VM_sel , "PF015" )
        }
      }

      //Aggancio a soffitto
      if( ConPiastraSup == 1 )  { AddVal_CAT_VM_sel( CAT_VM_sel , "PF026" ) }

      GOSUB Gest_CAT_VM
   }

   PROCEDURA Set_Gest_C009_Ripiano_30MM
   {
      if( ACTION() <= 0 | ACTION()== 2 | $OnLoadOrder==1 )           { EXITSUB() }

      if( IS_VarsUser__(ATTUALE(),"GEST_C009") == 1 )
      {
         DEL_VAR_MODIFICATE(ATTUALE(),"GEST_C009")
         DEL_VARS_USER(ATTUALE(),"GEST_C009")

         //GEST_C009 = ""
      }

      CAT_VM_var = "C009"
      CAT_VM_opz = "SM003;SM023;SM025;SM026;SM055;SM072"
      CAT_VM_sel = ""

      BOX_MODE(0)
      NEAR_GLOBALE2("pcv",ATTUALE(),1,"Passacavi_368")
      COMPONENTI2("supp",ATTUALE(),"SupportoRipiano_30MM")
      COMPONENTI2("barr",ATTUALE(),"BarraRipianoPTV_30MM")

      //if( pcv  > 0 ) { CAT_VM_sel = SE_STR( CAT_VM_sel == "" , "SM003" , STRCAT( CAT_VM_sel , ";SM003") ) }
      //if( supp > 0 ) { CAT_VM_sel = SE_STR( CAT_VM_sel == "" , "SM072" , STRCAT( CAT_VM_sel , ";SM072") ) }
      //if( barr > 0 ) { CAT_VM_sel = SE_STR( CAT_VM_sel == "" , "SM055" , STRCAT( CAT_VM_sel , ";SM055") ) }
      //
      //if( IS_IDX(idx_led_up) == 1 & IS_IDX(idx_led_dw) == 0 ) { CAT_VM_sel = SE_STR( CAT_VM_sel == "" , "SM023" , STRCAT( CAT_VM_sel , ";SM023" ) ) }
      //if( IS_IDX(idx_led_up) == 0 & IS_IDX(idx_led_dw) == 1 ) { CAT_VM_sel = SE_STR( CAT_VM_sel == "" , "SM025" , STRCAT( CAT_VM_sel , ";SM025" ) ) }
      //if( IS_IDX(idx_led_up) == 1 & IS_IDX(idx_led_dw) == 1 ) { CAT_VM_sel = SE_STR( CAT_VM_sel == "" , "SM026" , STRCAT( CAT_VM_sel , ";SM026" ) ) }

      if( pcv  > 0 ) { AddVal_CAT_VM_sel( CAT_VM_sel , "SM003" ) }
      if( supp > 0 ) { AddVal_CAT_VM_sel( CAT_VM_sel , "SM072" ) }
      if( barr > 0 ) { AddVal_CAT_VM_sel( CAT_VM_sel , "SM055" ) }

      if( IS_IDX(idx_led_up) == 1 & IS_IDX(idx_led_dw) == 0 ) { AddVal_CAT_VM_sel( CAT_VM_sel , "SM023" ) }
      if( IS_IDX(idx_led_up) == 0 & IS_IDX(idx_led_dw) == 1 ) { AddVal_CAT_VM_sel( CAT_VM_sel , "SM025" ) }
      if( IS_IDX(idx_led_up) == 1 & IS_IDX(idx_led_dw) == 1 ) { AddVal_CAT_VM_sel( CAT_VM_sel , "SM026" ) }

      GOSUB Gest_CAT_VM
   }

   PROCEDURA Set_Gest_C009_Teca_30MM
   {
      if( ACTION() <= 0 | ACTION()== 2 | $OnLoadOrder==1 )           { EXITSUB() }

      if( IS_VarsUser__(ATTUALE(),"GEST_C009") == 1 )
      {
         DEL_VAR_MODIFICATE(ATTUALE(),"GEST_C009")
         DEL_VARS_USER(ATTUALE(),"GEST_C009")
      }

      gest_C009 = "__"
      if( ConLedSopra == 1
        | ConLedSotto == 1  ) { gest_C009 = "SM074" }

      if( TipoTeca==3 )
      {
         COMPONENTI2("led",ATTUALE(),"Led_30MM")
         if( led > 0 )  { gest_C009 = "SM074" }
      }

      GEST_C009 = gest_C009
      VarAdd = "GEST_C009"   GOSUB Add_TABER_VARSETTATE
   }

   PROCEDURA Set_Gest_C008_VetroTeca_30MM
   {
      if( ACTION() <= 0 | ACTION()== 2 | $OnLoadOrder ) { EXITSUB() }

      if( IS_VarsUser__( ATTUALE(), "GEST_C008") == 1 )
      {
         DEL_VAR_MODIFICATE( ATTUALE(), "GEST_C008")
         DEL_VARS_USER( ATTUALE(), "GEST_C008")
      }

      CAT_VM_var = "C008"
      CAT_VM_opz = "SM074;SM003"
      CAT_VM_sel = ""

      //Led
      if( VAR_VAL(ATTUALE(),"ConLed") == 1 ) { CAT_VM_sel = "SM074" }

      //Passacavi
      BOX_MODE(0)
      NEAR_GLOBALE2( "wk_pcv", ATTUALE(), 2, "Passacavi_368")
      if( wk_pcv > 0 )
      {
         if( CAT_VM_sel == "" ) { CAT_VM_sel = "SM003" }
         else                   { CAT_VM_sel = STRCAT( CAT_VM_sel, ";SM003") }
      }

      GOSUB Gest_CAT_VM
   }

   PROCEDURA Set_Gest_C008_Schiena_30MM
   {
      if( ACTION() <= 0 | ACTION()== 2 | $OnLoadOrder==1 | $OnLoadOrder2 == 1 )           { EXITSUB() }

      //rivenditori non possono forzare il valore a mano
      #ifndef TEC;AZI
         if( IS_VarsUser__(ATTUALE(),"GEST_C008") == 1 )
         {
            DEL_VAR_MODIFICATE(ATTUALE(),"GEST_C008")
            DEL_VARS_USER(ATTUALE(),"GEST_C008")
         }
      #endif

      #ifdef TEC;AZI
         if( IS_VarsUser__(ATTUALE(),"GEST_C008") == 1 )
         {
            TLED_Lavorazione_USER = 1

            //Luca 26/04/2021  ti chiedo gentilmente di bloccare la modifica da parte dell'utente del menł lavorazioni C008 sulla schiena della teca 3 lati
            if( NOME(ATTUALE()) == "SchienaTeca_30mm" & VAR_VAL(ATTUALE(),"TipoTeca") == 3 )
            {
               TLED_Lavorazione_USER = 0
               DEL_VAR_MODIFICATE(ATTUALE(),"GEST_C008")
               DEL_VARS_USER(ATTUALE(),"GEST_C008")
               DEL_VAR(-1,"wk_cmd_CAT_VM")
            }
            else
            {
               EXITSUB()
            }
         }
      #endif

      CAT_VM_var = "C008"
      CAT_VM_opz = "SM074;SM075;SM076;SM077;SM078;SM079"
      CAT_VM_sel = ""

      if( TLED_Attiva == 1 )
      {
         if( TLED_Tipologia1 == 0
           | TLED_Tipologia1 == 1 ) { CAT_VM_sel = "SM075" }
         if( TLED_Tipologia1 == 2 ) { CAT_VM_sel = "SM076" }
      }
      if( TLED_Attiva == 2 )
      {
         if( TLED_Tipologia1 == 1 & TLED_Tipologia2 == 1 ) { CAT_VM_sel = "SM077" }
         else                                              { CAT_VM_sel = "SM078" }
      }

      //Luca 26/04/2021 č corretto guardare il tipo di lavorazione e non il led
      if( NOME(ATTUALE()) == "SchienaTeca_30mm" )
      {
         if( TLED_TipoLavorazione == 5 ) { CAT_VM_sel = "SM079" }
         if( TLED_TipoLavorazione == 1 ) { CAT_VM_sel = "SM075" }
         if( TLED_TipoLavorazione == 2 ) { CAT_VM_sel = "SM076" }
         if( TLED_TipoLavorazione == 3 ) { CAT_VM_sel = "SM077" }
         if( TLED_TipoLavorazione == 4 ) { CAT_VM_sel = "SM078" }
      }

      //Luca 14/04/2021
      if( VAR_VAL(ATTUALE(),"ConLED")==1 ) { AddVal_CAT_VM_sel( CAT_VM_sel , "SM074" ) }

      GOSUB Gest_CAT_VM
   }
   //}

   //{ PROCEDURE SCHIENA
   PROCEDURA Stendi_Schienale_30MM
   {
      //if( VAR_VAL(ATTUALE(),"steso") == 1 )  { EXITSUB() }

      if( VAR_VAL(ATTUALE(),"steso") == 0 ) { COMANDO2("Show Abilita OFF") }
      steso = 1

      P1   = $stesi_pt_sx
      P2   = $stesi_pt_dx

      ang_y = ANG_2_PUNTI( P1 , P2)

      punto_ins = P1
      if( P1.y > P2.y  ) { punto_ins.y = P2.y }

      base_0 = punto_ins

      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

      if( P1.y>P2.y )  { Y = P1.y - P2.y }
      else             { Y = P2.y - P1.y }
      Y = Y * 10
      Y = FLOOR(Y+0.5)/10

      //devo verificare se le dimensioni sono possibili, altrimenti blocco la stesura
      wk_blocca_stesura = 0
      wk_blocca_stesura_msg = ""

      //Luca 23/11/2020
      if( X < 100 | Y < 100 ) { wk_blocca_stesura = 1 }

      //verifico dimensioni
      if( X > 1104 & Y > 1288 )
      {
         wk_blocca_stesura = 1
         wk_blocca_stesura_msg = MSG(1215)
      }

      if( X > 2944 )
      {
         wk_blocca_stesura = 1
         wk_blocca_stesura_msg = MSG(1215)
      }
      if( Y > 2944 )
      {
         wk_blocca_stesura = 1
         wk_blocca_stesura_msg = MSG(1215)
      }

      if( wk_blocca_stesura>0 )
      {
         delme = 1
         if( wk_blocca_stesura_msg=="" )
         {
            DISPLAY3(MSG(1110),$MB_ICONERROR)
         }
         else
         {
            DISPLAY3(wk_blocca_stesura_msg,$MB_ICONERROR)
         }

         FLAG_RADICE = $NO_RAD
         NO_GEST = 1
      }
   }

   PROCEDURA Notifica_Schiena_30MM
   {
      if( VAR_VAL(ATTUALE(),"delme")==1 )
      {
         COMANDO(STRCAT("DELETE3 ",STR(idx_att)," //Notifica ",NOME(ATTUALE())))
         COMANDO2("Show Abilita ON")
         EXIT()
      }
      COMANDO2("Show Abilita ON")
      COMANDO2(STRCAT("SHOW STRUTTURE IDX ADD ", STR(idx_att)))

      //SE SERVE AGGANCIARLO
      BOX_MODE(0)
      NEAR_GLOBALE2("wk_near",idx_cnear_bsr,5,"Ripiano*30MM")
      //Simone 07/12/21 - Permetto stesura a contatto con 368
      if( wk_near == 0 )
      {
         NEAR_GLOBALE2("wk_near",idx_cnear_bsr,5,"Mod*368")
      }
      //COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " | DEBUG ---- idx_cnear_bsr=",STR(idx_cnear_bsr) , " " , STR(wk_near)))

      if( wk_near == 0 )
      {
         //Simone 14/07/21 - Elimino lo schienale se la stesura non č corretta
         COMANDO(STRCAT("DELETE3 ",STR(idx_att)," //Notifica ",NOME(ATTUALE())))
         EXIT()
      }

      idx_mod = wk_near[1]
      ang_mod = ANG_TOT_NOR(idx_mod)
      //COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " | DEBUG ---- idx_mod=",STR(idx_mod) , " " , STR(ang_mod)))

      //controllo che le basi siano allineate
      NEAR("wk_near_a3",idx_cnear_adr,5,0,"Ripiano_30MM")
      //COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " | DEBUG ---- idx_cnear_adr=",STR(idx_cnear_adr) , " " , "wk_near_a3=", STR(wk_near_a3)))

      if( wk_near_a3 > 0 )
      {
         idx_mod_a3 = wk_near_a3[1]
         ang_mod_a3 = ANG_TOT_NOR(idx_mod_a3)
         //COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " | DEBUG ---- idx_mod_a3=",STR(idx_mod_a3) , " " , STR(ang_mod_a3)))

         if( ABS(ang_mod_a3 - ang_mod) > 0.1  )
         {
            delme = 1
            if( VAR_VAL(ATTUALE(),"delme")==1 )
            {
               COMANDO(STRCAT("DELETE3 ",STR(idx_att)," //Notifica ",NOME(ATTUALE())))
               COMANDO2("Show Abilita ON")
               EXIT()
            }
         }
      }

      COMANDO(STRCAT("SHOW STRUTTURE IDX ADD ", STR(idx_att)))
      COMANDO(STRCAT("VAR_CHANGE 1 ",STR(idx_att)," X=",STR(X)," Y=",STR(Y) ," //Notifica ",NOME(ATTUALE())))

      ang_att = ANG_TOT_NOR(idx_att)

      //if( ABS(ang_att - ang_mod) < 0.1  ) { EXITSUB() }

      // se ruotato allora ho selezionato i punti in modo inverso, porto allo stesso angolo
      if( ABS(ang_att - ang_mod) > 179.9
        & ABS(ang_att - ang_mod) < 180.1   )
      {
         offx = (-1*X)*COSENO(ang_mod)
         offy = 0
         offz = (X)*SENO(ang_mod)

         COMANDO2(STRCAT("EDITPOS_REL ",STR(idx_att) , " ",STR(offx), " ",STR(offy) ," " ,STR(offz) , " 180"))
      }

      //CONTROLLI CHE CI SIANO MODULI SU TUTTI E 4 I LATI??
      GOSUB CtrlSchiena_TrovaElementiVicini_30MM

      COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " | DEBUG ---- idx_ele_sx=",STR(idx_ele_sx)))
      COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " | DEBUG ---- idx_ele_dx=",STR(idx_ele_dx)))
      COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " | DEBUG ---- idx_ele_up=",STR(idx_ele_up)))
      COMANDO2(STRCAT("LOGMSG ATTUALE: ",STR(ATTUALE()), " | DEBUG ---- idx_ele_dw=",STR(idx_ele_dw)))

      if( IS_IDX(idx_ele_sx) == 0
        | IS_IDX(idx_ele_dx) == 0
        | IS_IDX(idx_ele_up) == 0
        | IS_IDX(idx_ele_dw) == 0  )
      {
         msg = STRCAT(MSG(1090),"\n",MSG(1282),"\n",MSG(1283))
         DISPLAY2(msg)
         COMANDO(STRCAT("DELETE3 ",STR(idx_att)," //Notifica ",NOME(ATTUALE())))
         EXIT()
      }

      //Simone 18/02/2022 - Blocco su ripiani p.248
      if( VAR_VAL(idx_ele_sx,"Z") < 248
        | VAR_VAL(idx_ele_dx,"Z") < 248
        | VAR_VAL(idx_ele_up,"Z") < 248
        | VAR_VAL(idx_ele_dw,"Z") < 248 )
      {
         msg = "Non č possibile stendere uno schienale se la profonditą degli elementi č < 248mm"
         HI(ATTUALE(),1)
         DISPLAY2(msg)
         HI(ATTUALE(),0)
         COMANDO(STRCAT("DELETE3 ",STR(idx_att)," //Notifica ",NOME(ATTUALE())))
         EXIT()
      }

      //avanzo di 6.5mm
      offx = (6.5)*SENO(ang_mod)
      offy = 0
      offz = (6.5)*COSENO(ang_mod)

      COMANDO(STRCAT("EDITPOS_REL ",STR(idx_att) , " ",STR(offx), " ",STR(offy) ," " ,STR(offz) , " 0"))

      //RICALCOLARE TUTTI I RIPIANI
      idx_ColonnaRipiano = -1

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_rip_fr",idx_cnear_fr,1,"Ripiano_30MM")
      while( wk_rip_fr > 0 )
      {
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(wk_rip_fr[wk_rip_fr])," no_agganciati //PostGestDllValida ",NOME(ATTUALE())))

         if( UN_PADRE2(wk_rip_fr[wk_rip_fr],"Colonna_30MM")==1 ) { idx_ColonnaRipiano = GetTopLevel(wk_rip_fr[wk_rip_fr]) }
         wk_rip_fr = wk_rip_fr -1
      }

      if( IS_IDX(idx_ColonnaRipiano) )
      {
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_ColonnaRipiano)," no_agganciati //PostGestDllValida ",NOME(ATTUALE())))
      }
   }
   //} PROCEDURE SCHIENA

   PROCEDURA PosaTriade_30MM
   {
      @escluso = 1
      if( NrTri <= NrTriade ) { @escluso = 0 }

      posx = VAR_VAL(idx_att,STRCAT("PosX_Triade",STR(NrTri)))
      @base_0.x = base_0.x + posx - @X/2
      @base_0.y = base_0.y + Y/2 - @Y/2
      @base_0.z = base_0.z
      @Z = Z
   }

   //PROCEDURE STENDI FIANCO/RIPIANO
   PROCEDURA Stendi_Elemento_30MM
   {
      //se la selezione č errata non passo la seconda volta
      if( VAR_VAL(ATTUALE(),"delme")==1 ) { EXIT() }

      if( ACTION()==$stesi_Action )
      {
         if( VAR_VAL($idx_show_point,"M4_VISIBILITY__") != 1 )
         {
            SHOW_POINT($idx_show_point, "pnt_cont_30MM*")
         }
         EXIT()
      }

      steso = 1
      notificato = 0

      Z_idx_ref = -1

      blocca_stesura = 0
      blocca_stesura_msg = ""

      P1   = $stesi_pt_sx
      P2   = $stesi_pt_dx

      ang_y = ANG_2_PUNTI( P1 , P2)

      idx_ref = GetIdxWithPoint( -1, "pnt_cont_30MM_", "", P1)

      if( IS_IDX(idx_ref) )
      {
         inverti_punti = 0

         //se selezionati punti da dx a sx
         if( ABS( ang_y - ANG_TOT_NOR(idx_ref) ) > 179.9
           & ABS( ang_y - ANG_TOT_NOR(idx_ref) ) < 180.1 )  { inverti_punti = 1 }

         ang_y = ANG_TOT_NOR(idx_ref)
         Z_idx_ref = VAR_VAL(idx_ref,"Z")

         SET_#(idx_ref)

         dist_a = DistanzaFraPunti(P1,#base_0,ang_y)
         dist_b = DistanzaFraPunti(P2,#base_0,ang_y)

         if( dist_b < dist_a  ) { inverti_punti = 1 }

         if( inverti_punti )
         {
            P1_save = P1
            P1 = P2
            P2 = P1_save
         }
      }

      if( P1.y > P2.Y )
      {
         P1_save = P1.y
         P1.y = P2.y
         P2.y = P1_save
      }

      base_0 = P1

      //se sto stendendo un fianco i punti devono essere allineati in X
      if( NOME(ATTUALE()) == "Fianco_30MM" )
      {
         dist_x = DistanzaFraPunti(P1,P2,ang_y)
         if( ABS(dist_x) > 0.1 ) { blocca_stesura = 1 }

         if( P1.y>P2.y )  { Y = P1.y - P2.y }
         else             { Y = P2.y - P1.y }
         Y = Y * 10
         Y = FLOOR(Y+0.5)/10

         //sposta_x == 2 centra il fianco
         //sposta_x == 0 non sposta il ripiano    ( filo basso rispetto ai punti)
         //sposta_x == 1 abbassa il ripiano di y  ( filo alto rispetto ai punti)
         sposta_x = 2

         idx_ref_P1 = GetIdxWithPoint( -1, "pnt_cont_30MM_", "", P1)
         if( IS_IDX(idx_ref_P1) )
         {
            if( IS_MATCH(NOME(idx_ref_P1),"Ripiano*30MM") )
            {
               SET_#(idx_ref_P1)
               if( ABS( DISTANZA(P1,#alto_0) ) < 0.1 ) { sposta_x = 1 }
               if( ABS( DISTANZA(P1,#base_0) ) < 0.1 ) { sposta_x = 1 }

               if( ABS( DISTANZA(P1,#alto_3) ) < 0.1 ) { sposta_x = 0 }
               if( ABS( DISTANZA(P1,#base_3) ) < 0.1 ) { sposta_x = 0 }
            }

            //Luca 04/03/2021
            if( NOME(idx_ref_P1) == "Colonna_30MM" )
            {
               SET_#(idx_ref_P1)
               PTEST = P1
               PTEST.y = 0

               if( ABS( DISTANZA(PTEST,[#alto_0.x,0,#alto_0.z]) ) < 0.1 ) { sposta_x = 1 }
               if( ABS( DISTANZA(PTEST,[#base_0.x,0,#base_0.z]) ) < 0.1 ) { sposta_x = 1 }

               if( ABS( DISTANZA(PTEST,[#alto_3.x,0,#alto_3.z]) ) < 0.1 ) { sposta_x = 0 }
               if( ABS( DISTANZA(PTEST,[#base_3.x,0,#base_3.z]) ) < 0.1 ) { sposta_x = 0 }
            }
         }

         if( sposta_x == 2 )
         {
            base_0.x = base_0.x - COSENO(ang_y)*(X/2)
            base_0.z = base_0.z +   SENO(ang_y)*(X/2)
         }
         if( sposta_x == 1 )
         {
            base_0.x = base_0.x - COSENO(ang_y)*X
            base_0.z = base_0.z +   SENO(ang_y)*X
         }
      }

      //se sto stendendo un ripiano i punti devono essere allineati in Y
      if( NOME(ATTUALE()) == "Ripiano_30MM"
        | NOME(ATTUALE()) == "RipianoVetro_30MM"  )
      {
         if( ABS( P2.y - P1.y ) > 0.1 ) { blocca_stesura = 1 }

         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

         if( X > X_Max )
         {
            blocca_stesura = 1
            blocca_stesura_msg = STRCAT(MSG(1090),"\n",MSG(1215))
         }

         idx_ref_P1 = GetIdxWithPoint( -1, "pnt_cont_30MM_", "", P1)
         idx_ref_P2 = GetIdxWithPoint( -1, "pnt_cont_30MM_", "", P2)

         //0 centrale
         //-1 sotto
         //1 sopra
         punto_P1 = 0
         //in larhgezza
         punto_P1_lato = 0

         punto_P2 = 0
         punto_P2_lato = 0

         if( IS_IDX(idx_ref_P1) )
         {
            if( NOME(idx_ref_P1) == "Fianco_30MM" )
            {
               SET_#(idx_ref_P1)

               if( ABS( DISTANZA(P1,#base_0_np) ) < 0.1 ) { punto_P1 = -1  punto_P1_lato = -1 }
               if( ABS( DISTANZA(P1,#base_3_np) ) < 0.1 ) { punto_P1 = -1  punto_P1_lato =  1 }

               if( ABS( DISTANZA(P1,#alto_0) ) < 0.1 ) { punto_P1 = 1   punto_P1_lato = -1 }
               if( ABS( DISTANZA(P1,#alto_3) ) < 0.1 ) { punto_P1 = 1   punto_P1_lato =  1 }
            }
         }
         if( IS_IDX(idx_ref_P2) )
         {
            if( NOME(idx_ref_P2) == "Fianco_30MM" )
            {
               SET_#(idx_ref_P2)

               if( ABS( DISTANZA(P2,#base_0_np) ) < 0.1 ) { punto_P2 = -1  punto_P2_lato = -1 }
               if( ABS( DISTANZA(P2,#base_3_np) ) < 0.1 ) { punto_P2 = -1  punto_P2_lato =  1 }

               if( ABS( DISTANZA(P2,#alto_0) ) < 0.1 ) { punto_P2 =  1  punto_P2_lato = -1 }
               if( ABS( DISTANZA(P2,#alto_3) ) < 0.1 ) { punto_P2 =  1  punto_P2_lato =  1 }
            }
         }

         //sposta_y == 2 centra il ripiano
         //sposta_y == 0 non sposta il ripiano    ( filo basso rispetto ai punti)
         //sposta_y == 1 abbassa il ripiano di y  ( filo alto rispetto ai punti)
         sposta_y = 2
         sposta_caso = ""

         //punto P1 Filo sotto
         if( punto_P1 == -1 )
         {
            sposta_caso = "P1 FILO SOTTO"
            //P2 filo sopra
            if( punto_P2 == 1  )
            {
               sposta_caso = STRCAT(sposta_caso,"| P2 FILO SOPRA")
               if( punto_P1_lato == -1  & punto_P2_lato ==  1 )  { sposta_y = 0 }
               if( punto_P1_lato ==  1  & punto_P2_lato == -1 )  { sposta_y = 1 }
            }

            //P2 filo sotto
            if( punto_P2 == -1  )
            {
               sposta_caso = STRCAT(sposta_caso,"| P2 FILO SOTTO")
               if( punto_P1_lato == 1  & punto_P2_lato == -1 )  { sposta_y = 0 }
               if( punto_P1_lato == -1 & punto_P2_lato ==  1 )  { sposta_y = 1 }
            }

            //P2 filo centro
            if( punto_P2 == 0  )
            {
               sposta_caso = STRCAT(sposta_caso,"| P2 CENTRO")

               if( punto_P1_lato == 1  )  { sposta_y = 0 }
               if( punto_P1_lato == -1 )  { sposta_y = 1 }
            }
         }
         //punto P1 Filo sopra
         if( punto_P1 == 1 )
         {
            sposta_caso = "P1 FILO SOPRA"

            //P2 filo sopra
            if( punto_P2 == 1  )
            {
               sposta_caso = STRCAT(sposta_caso,"| P2 FILO SOPRA")

               if( punto_P1_lato == 1  & punto_P2_lato == -1 )  { sposta_y = 1 }
               if( punto_P1_lato == -1 & punto_P2_lato ==  1 )  { sposta_y = 0 }

               if( punto_P1_lato == 1 & punto_P2_lato == 1 )
               {
                  if( IS_VAR_FIXED(ATTUALE(),"Stendi_PosRipiano") == 0 ) { CHIEDI(ATTUALE(),"Stendi_PosRipiano") }
                  if( Stendi_PosRipiano == -1 )  { sposta_y = 1 }
                  if( Stendi_PosRipiano ==  1 )  { sposta_y = 0 }
               }
            }

            //P2 filo sotto
            if( punto_P2 == -1  )
            {
               sposta_caso = STRCAT(sposta_caso,"| P2 FILO SOTTO")

               if( punto_P1_lato == -1  & punto_P2_lato == -1 )  { sposta_y = 0 }
               if( punto_P1_lato ==  1  & punto_P2_lato ==  1 )  { sposta_y = 1 }
            }

            //P2 filo centro
            if( punto_P2 == 0  )
            {
               sposta_caso = STRCAT(sposta_caso,"| P2 CENTRO")

               if( punto_P1_lato == -1 )  { sposta_y = 0 }
               if( punto_P1_lato ==  1 )  { sposta_y = 1 }
            }
         }
         //punto P1 centro
         if( punto_P1 == 0 )
         {
            sposta_caso = "P1 CENTRO"
            //P2 filo sopra
            if( punto_P2 == 1  )
            {
               sposta_caso = STRCAT(sposta_caso,"| P2 FILO SOPRA")
               if( punto_P2_lato == -1 )  { sposta_y = 1 }
               if( punto_P2_lato ==  1 )  { sposta_y = 0 }
            }

            //P2 filo sotto
            if( punto_P2 == -1  )
            {
               sposta_caso = STRCAT(sposta_caso,"| P2 FILO SOTTO")
               if( punto_P2_lato == -1 )  { sposta_y = 0 }
               if( punto_P2_lato ==  1 )  { sposta_y = 1 }
            }

            //P2 filo centro
            if( punto_P2 == 0  )
            {
               sposta_caso = STRCAT(sposta_caso,"| P2 CENTRO")
               sposta_y = 2
            }
         }

         if( sposta_y == 1 ) { base_0.y = base_0.y - Y }
         if( sposta_y == 2 ) { base_0.y = base_0.y - Y/2 }
      }

      if( blocca_stesura > 0 )
      {
         FLAG_RADICE = $NO_RAD
         if( blocca_stesura_msg != "" ) { DISPLAY2(blocca_stesura_msg) }

         delme = 1
         NO_GEST = 1
         GEST_CODICE = ""

         COMANDO(STRCAT("DELETE3 ",STR(idx_att)," //Notifica ",NOME(ATTUALE())))
      }
   }

   PROCEDURA Notifica_Elemento_30MM
   {
      if( ACTION()!=12 ) { EXITSUB() }

      if( VAR_VAL(ATTUALE(),"delme")==1 )
      {
         COMANDO(STRCAT("DELETE3 ",STR(idx_att)," //Notifica ",NOME(ATTUALE())))
         EXIT()
      }

      auto = 1

      if( VAR_VAL(ATTUALE(),"Z_idx_ref") < 0 ) { CHIEDI(ATTUALE(),"Z") }
      else                                     { Z = Z_idx_ref }

      if( NOME(ATTUALE()) == "Fianco_30MM" )
      {
         COMANDO(STRCAT("VAR_CHANGE 1 ",STR(ATTUALE()) ," Y=",STR(Y) ," Z=",STR(Z) ," auto=",STR(auto) ))

         if( base_0.y == 17 )
         {
            offy = -1*base_0.y
            COMANDO(STRCAT("EDITPOS_REL ",STR(ATTUALE()) , " ",STR(0), " ",STR(offy) ," " ,STR(0) , " 0"))
         }
      }
      if( NOME(ATTUALE()) == "Ripiano_30MM"
        | NOME(ATTUALE()) == "RipianoVetro_30MM" )
      {
         COMANDO(STRCAT("VAR_CHANGE 1 ",STR(ATTUALE()) ," X=",STR(X) ," Z=",STR(Z) ," auto=",STR(auto) ))
         COMANDO(STRCAT("VAR_CHANGE 0 ",STR(ATTUALE()) ," notificato=1"))
      }

      COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx_att)," no_agganciati //Notifica ",NOME(ATTUALE())))
   }

   PROCEDURA CtrlTipoRipiano_Barra_Supporto_30MM
   {
      if( ACTION() <= 0 | ACTION()==2 | $OnLoadOrder == 1 | $OnLoadOrder2==1 )  { EXITSUB() }

      if( ins2_att == $ins2_componente ) { EXITSUB() }

      idx_pdr = PADRE(ATTUALE(),1)

      if( VAR_VAL(ATTUALE(),"Elimina_articolo")==1 ) { EXITSUB() }

      //Luca 19/03/2021 mantis 24805: 30MM - Barra TV su ripiano schienale
      //if( VAR_VAL_STR(idx_pdr,"TipoRipianoStr") == "RIPIANO_SCH"
      //  & VAR_VAL_STR(idx_pdr,"TipoRipianoSch") == "VETRO"  )
      if( VAR_VAL_STR(idx_pdr,"TipoRipianoStr") == "RIPIANO_SCH"
        | VAR_VAL_STR(idx_pdr,"TipoRipianoStr") == "MENSOLA"
        | VAR_VAL_STR(idx_pdr,"TipoRipianoStr") == "RIPIANO_TER" )
      {
         if( $CNP != 1 & $CNP__ != 1 )
         {
            msg = STRCAT(MSG(1090),"\n")
            msg = STRCAT(msg,MSG(1247),"\n")
            if( VAR_VAL_STR(ATTUALE(),"DescEdit__") != "" ) { msg = STRCAT(msg,DescEdit__,"\n") }
            else                                            { msg = STRCAT(msg,NOME(ATTUALE()),"\n") }
            msg = STRCAT(msg,MSG(1248),"\n\n")
            msg = STRCAT(msg,MSG(1249))

            DISPLAY2(msg)
            Elimina_articolo = 1
            COMANDO(STRCAT("ELIMINA ",STR(ATTUALE()) , " //CtrlTipoRipiano_Barra_Supporto_30MM"))
         }
      }
   }

   PROCEDURA CtrlTeca_TrovaPannello_30MM
   {
      if( ACTION() <= 0 | ACTION()==2 | $OnLoadOrder == 1 )  { EXITSUB() }

      idx_pannello = -1

      nome_cerca = "Ripiano_30MM"

      if( NOME(ATTUALE()) == "FiancoTeca_30mm" ) { nome_cerca = "Fianco_30MM" }

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_pan",idx_cnear,2,nome_cerca)
      if( wk_pan > 0 )  { idx_pannello = wk_pan[1] }

      if( IS_IDX(idx_pannello) == 0 )  { EXITSUB() }

      //attivo pannello martire in caso di sostituzione
      AttivaPanMartire = 0
      if( VAR_VAL_STR(-1,"TST_OrdineSostituzione") == "1" )
      {
         if( VAR_VAL_STR(idx_att,"ORD_SOST") == "1" )
         {
            if( IS_IDX(idx_pannello) == 1 )
            {
               if( VAR_VAL_STR(idx_pannello,"ORD_SOST") != "1" ) { AttivaPanMartire = 1 }
            }
            else
            {
               AttivaPanMartire = 1
            }
         }
      }

      SET_#(idx_pannello)

      PanMar_X = #X
      PanMar_Y = #Y
      PanMar_Z = #Z

      PanMar_OffX = DistanzaFraPunti(#base_0,base_0,ANG_TOT_NOR(ATTUALE()))

      PanMar_OffY = base_0.y - #base_0.y
      if( NOME(idx_pannello) == "Fianco_30MM" ) { PanMar_OffY = base_0.y - #base_0_np.y }

   }

   PROCEDURA PosaRipiano_Colonna_30MM
   {
      @escluso = 1
      if( nrip > num_ripiani ) { EXITSUB() }

      @escluso = 0

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

      @VAR_UsoRipianoStrut = "RIPIANO-CENTRALE-COLONNA"

      if( nrip == 1 )
      {
         @VAR_UsoRipianoStrut = "FONDO-COLONNA"

         if( ConFondo == 0  )  { @escluso = 1 }
      }

      if( nrip == num_ripiani )
      {
         @VAR_UsoRipianoStrut = "COPERCHIO-COLONNA"

         @base_0.y = base_0.y + Y - @Y
         if( ConCoperchio == 0  )  { @escluso = 1 }
      }

      if( nrip !=1 & nrip!=num_ripiani ) { @base_0.y = base_0.y + (SpeRip + 308)*(nrip-1) }

      //Luca 25/02/2021
      //if( IS_IDX(@idx_sch_rt) )
      if( @TipoRipianoStr == "RIPIANO_SCH" )
      {
         @base_0.z = base_0.z + @RientroZ_RipianoSch
         @Z = Z - @RientroZ_RipianoSch
      }
   }

   // CONTROLLO FINE ORDINE 30 MM
   PROCEDURA Ctrl_Ripiano_VerificaDim_30MM
   {
      log = 0
      #ifdef TE
         log = VAR_VAL(-1,"ATTIVA_LOG_DBG")
      #endif

      ScriviSuLog( log , "Ctrl_Ripiano_VerificaDim_30MM" , "START" )

      $wk_CG_Nome    = "Ctrl_Ripiano_VerificaDim_30MM"
      $wk_CG_Blocca  = 0
      $wk_CG_Items   = 0
      $wk_CG_Tipo    = "BLOCCO"
      $wk_CG_Msg     = MSG(1243)

      WITH_ALIAS("$wk_rip","Rip30MM")

      $wk_i = 1
      while ( $wk_i <= $wk_rip )
      {
         $wk_idx_test =  $wk_rip[$wk_i]

         SET_#($wk_idx_test)
         if( #X < #X_Min
           | #X > #X_Max ) { AddItem2Array(-1,"wk_CG_Items",$wk_idx_test,"") }

         $wk_i = $wk_i + 1
      }

      if( $wk_CG_Items > 0 ) { $wk_CG_Blocca = 1 }

      ScriviSuLog( log , "Ctrl_Ripiano_VerificaDim_30MM" , "END" )
      GOSUB CG_CFO_FineControllo
   }

   PROCEDURA Ctrl_RipianoVetro_TraFianchi_30MM
   {
      log = 0
      #ifdef TE
         log = VAR_VAL(-1,"ATTIVA_LOG_DBG")
      #endif

      ScriviSuLog( log , "Ctrl_RipianoVetro_TraFianchi_30MM" , "START" )

      WITH_ALIAS("$wk_ript","Rip30MM")

      $wk_rip = 0

      $wk_i = 1
      while ( $wk_i <= $wk_ript )
      {
         if( NOME($wk_ript[$wk_i]) == "RipianoVetro_30MM" ) { AddItem2Array(-1,"wk_rip",$wk_ript[$wk_i],"") }
         $wk_i = $wk_i + 1
      }

      if( $wk_rip == 0 ) { EXITSUB() }

      $wk_CG_Nome    = "Ctrl_RipianoVetro_TraFianchi_30MM"
      $wk_CG_Blocca  = 0
      $wk_CG_Items   = 0
      $wk_CG_Tipo    = "BLOCCO"
      $wk_CG_Msg     = MSG(1250)

      $wk_i = 1
      while ( $wk_i <= $wk_rip )
      {
         $wk_idx_test =  $wk_rip[$wk_i]

         SET_#($wk_idx_test)
         if( IS_IDX(#idx_fia_sx) == 0 | IS_IDX(#idx_fia_dx)==0 ) { AddItem2Array(-1,"wk_CG_Items",$wk_idx_test,"") }

         $wk_i = $wk_i + 1
      }

      if( $wk_CG_Items > 0 ) { $wk_CG_Blocca = 1 }

      ScriviSuLog( log , "Ctrl_RipianoVetro_TraFianchi_30MM" , "END" )
      GOSUB CG_CFO_FineControllo
   }

   PROCEDURA Assegna_TipoCollo_Teca_Led_368_OLD
   {
      log = 0
      #ifdef TE
         log = VAR_VAL(-1,"ATTIVA_LOG_DBG")
      #endif

      ScriviSuLog( log , "Assegna_TipoCollo_Teca_Led_368" , "START" )

      WITH_ALIAS("$wk_teca","Teca_30MM")
      WITH_ALIAS("$wk_led","Led_30MM")

      if( $wk_teca == 0 & $wk_led == 0 )
      {
         ScriviSuLog( log , "Assegna_TipoCollo_Teca_Led_368" , "NO TECHE - NO LED" )
         ScriviSuLog( log , "Assegna_TipoCollo_Teca_Led_368" , "END" )
         EXITSUB()
      }

      // da 001 a 030: elementi verticali teche
      $wk_pre_tp = "0"
      $wk_prg = 1

      Reset_TIPO_COLLO($wk_pre_tp,1,30)

      $wk_i = 1
      while ( $wk_i <= $wk_teca )
      {
         $wk_idx_teca = $wk_teca[$wk_i]
         if( $wk_prg<10 ) { $wk_val_tp = STRCAT($wk_pre_tp,"0",STR($wk_prg)) }
         else             { $wk_val_tp = STRCAT($wk_pre_tp,STR($wk_prg)) }

         //VETRO SX
         SET_#($wk_idx_teca)
         if( IS_IDX(#idx_vetro_fiasx) )
         {
            $wk_idx_vetro = #idx_vetro_fiasx
            GOSUB Assegna_TipoCollo_Teca_VetroSingolo_368
         }

         //VETRO DX
         SET_#($wk_idx_teca)
         if( IS_IDX(#idx_vetro_fiadx) )
         {
            $wk_idx_vetro = #idx_vetro_fiadx
            GOSUB Assegna_TipoCollo_Teca_VetroSingolo_368
         }

         $wk_i = $wk_i + 1
      }


      // da 031 a 060: elementi verticali teche
      $wk_pre_tp = "0"
      Reset_TIPO_COLLO($wk_pre_tp,31,60)
      $wk_prg = 31

      $wk_i = 1
      while ( $wk_i <= $wk_teca )
      {
         $wk_idx_teca = $wk_teca[$wk_i]
         $wk_val_tp = STRCAT($wk_pre_tp,STR($wk_prg))

         //BASE
         SET_#($wk_idx_teca)
         if( IS_IDX(#idx_vetro_base) )
         {
            $wk_idx_vetro = #idx_vetro_base
            GOSUB Assegna_TipoCollo_Teca_VetroSingolo_368
         }

         //COPERCHIO
         SET_#($wk_idx_teca)
         if( IS_IDX(#idx_vetro_cop) & VAR_VAL($wk_idx_teca,"TipoTeca") == 4 )
         {
            $wk_idx_vetro = #idx_vetro_cop
            GOSUB Assegna_TipoCollo_Teca_VetroSingolo_368
         }

         $wk_i = $wk_i + 1
      }

      //da 061 a 090: per fondere i led con l'elemento 30mm
      $wk_pre_tp = "0"
      Reset_TIPO_COLLO($wk_pre_tp,61,90)

      $wk_prg = 61

      $wk_i = 1
      while ( $wk_i <= $wk_led )
      {
         $wk_idx_led = $wk_led[$wk_i]
         $wk_idx_ripiano = PADRE($wk_idx_led,1)

         $wk_ATTIVA_TIPO_COLLO = 1
         if( VAR_VAL_STR(-1,"TST_OrdineSostituzione") == "1" )
         {
            $wk_ATTIVA_TIPO_COLLO = 0
            if( VAR_VAL_STR($wk_idx_vetro,"ORD_SOST") == "1"
              & VAR_VAL_STR($wk_idx_ripiano,"ORD_SOST") == "1") { $wk_ATTIVA_TIPO_COLLO = 1 }
         }

         if( $wk_ATTIVA_TIPO_COLLO == 1  )
         {
            if( VAR_VAL_STR($wk_idx_ripiano,"TIPO_COLLO") == "" )
            {
               VAR_VALUESTR_SET($wk_idx_led, "TIPO_COLLO",$wk_val_tp)
               VAR_VALUESTR_SET($wk_idx_ripiano, "TIPO_COLLO",$wk_val_tp)
               $wk_prg = $wk_prg + 1
               $wk_val_tp = STRCAT($wk_pre_tp,STR($wk_prg))
            }
            else
            {
               VAR_VALUESTR_SET($wk_idx_led, "TIPO_COLLO",VAR_VAL_STR($wk_idx_ripiano,"TIPO_COLLO"))
            }
         }
      }


      ScriviSuLog( log , "Assegna_TipoCollo_Teca_Led_368" , "END" )
   }

   //Luca 30/03/2021 mantis 024848: 30MM - Tipi collo
   //Ciao, a causa di problemi con gli imballi sono stati rivisti i tipi collo. Ti chiedo gentilmente di applicare i seguenti:
   //- da 001 a 020 --> tutti gli elementi verticali
   //- da 021 a 040 --> tutti gli elementi orizzontali delle teche (compreso il led, se presente) che hanno un solo vetro per ripiano
   //- da 041 a 060 --> tutti gli elementi orizzontali delle teche (compreso il led, se presente) che hanno due vetri per singolo ripiano
   //- da 061 a 090 --> led + ripiano senza vetro teca

   PROCEDURA Assegna_TipoCollo_Teca_Led_368
   {
      log = 0
      #ifdef TE
         log = VAR_VAL(-1,"ATTIVA_LOG_DBG")
      #endif

      ScriviSuLog( log , "Assegna_TipoCollo_Teca_Led_368" , "START" )

      WITH_ALIAS("$wk_teca","Teca_30MM")
      WITH_ALIAS("$wk_led","Led_30MM")
      WITH_ALIAS("$wk_barraTV","BarraTV_30MM")
      WITH_ALIAS("$wk_pcv","PCV_368")

      if( $wk_teca == 0 & $wk_led == 0 & $wk_barraTV == 0 & $wk_pcv == 0 )
      {
         ScriviSuLog( log , "Assegna_TipoCollo_Teca_Led_368" , "NO TECHE - NO LED - NO BARRE TV - NO PASSACAVI" )
         ScriviSuLog( log , "Assegna_TipoCollo_Teca_Led_368" , "END" )
         EXITSUB()
      }

      // da 001 a 020: elementi verticali teche
      $wk_pre_tp = "0"
      $wk_prg = 1

      Reset_TIPO_COLLO($wk_pre_tp,1,20)

      $wk_i = 1
      while ( $wk_i <= $wk_teca )
      {
         $wk_idx_teca = $wk_teca[$wk_i]
         if( $wk_prg<10 ) { $wk_val_tp = STRCAT($wk_pre_tp,"0",STR($wk_prg)) }
         else             { $wk_val_tp = STRCAT($wk_pre_tp,STR($wk_prg)) }

         //VETRO SX
         SET_#($wk_idx_teca)
         if( IS_IDX(#idx_vetro_fiasx) )
         {
            $wk_idx_vetro = #idx_vetro_fiasx
            GOSUB Assegna_TipoCollo_Teca_VetroSingolo_368
         }

         //VETRO DX
         SET_#($wk_idx_teca)
         if( IS_IDX(#idx_vetro_fiadx) )
         {
            $wk_idx_vetro = #idx_vetro_fiadx
            GOSUB Assegna_TipoCollo_Teca_VetroSingolo_368
         }

         $wk_i = $wk_i + 1
      }


      //- da 021 a 040 --> tutti gli elementi orizzontali delle teche (compreso il led, se presente) che hanno un solo vetro per ripiano
      //- da 041 a 060 --> tutti gli elementi orizzontali delle teche (compreso il led, se presente) che hanno due vetri per singolo ripiano
      $wk_pre_tp = "0"
      Reset_TIPO_COLLO($wk_pre_tp,21,60)
      $wk_prg1 = 21
      $wk_prg2 = 41

      $wk_i = 1
      while ( $wk_i <= $wk_teca )
      {
         $wk_idx_teca = $wk_teca[$wk_i]

         //BASE
         SET_#($wk_idx_teca)

         $wk_rip_sotto = #idx_rip_dw
         $wk_rip_sotto_nv = VAR_VAL($wk_rip_sotto,"NVetriTeca")

         SET_#($wk_idx_teca)
         if( IS_IDX(#idx_vetro_base) )
         {
            //se il ripiano ho solo un vetro teca
            if( $wk_rip_sotto_nv == 1 )
            {
               $wk_prg = $wk_prg1
               $wk_val_tp = STRCAT($wk_pre_tp,STR($wk_prg))

               $wk_idx_vetro = #idx_vetro_base
               GOSUB Assegna_TipoCollo_Teca_VetroSingolo_368

               $wk_prg1 = $wk_prg
            }

            if( $wk_rip_sotto_nv == 2 )
            {
               $wk_prg = $wk_prg2
               $wk_val_tp = STRCAT($wk_pre_tp,STR($wk_prg))

               $wk_idx_vetro = #idx_vetro_base
               GOSUB Assegna_TipoCollo_Teca_VetroSingolo_368

               $wk_prg2 = $wk_prg
            }
         }

         //coperchio
         if( VAR_VAL($wk_idx_teca,"TipoTeca") == 4 )
         {
            SET_#($wk_idx_teca)
            //se il ripiano ho solo un vetro teca
            if( $wk_rip_sotto_nv == 1 )
            {
               $wk_prg = $wk_prg1
               $wk_val_tp = STRCAT($wk_pre_tp,STR($wk_prg))

               $wk_idx_vetro = #idx_vetro_cop
               GOSUB Assegna_TipoCollo_Teca_VetroSingolo_368

               $wk_prg1 = $wk_prg
            }

            if( $wk_rip_sotto_nv == 2 )
            {
               $wk_prg = $wk_prg2
               $wk_val_tp = STRCAT($wk_pre_tp,STR($wk_prg))

               $wk_idx_vetro = #idx_vetro_cop
               GOSUB Assegna_TipoCollo_Teca_VetroSingolo_368

               $wk_prg2 = $wk_prg
            }
         }

         ////COPERCHIO
         //SET_#($wk_idx_teca)
         //if( IS_IDX(#idx_vetro_cop) & VAR_VAL($wk_idx_teca,"TipoTeca") == 4 )
         //{
         //   $wk_idx_vetro = #idx_vetro_cop
         //   GOSUB Assegna_TipoCollo_Teca_VetroSingolo_368
         //}

         $wk_i = $wk_i + 1
      }

      //da 061 a 090: per fondere i led con l'elemento 30mm
      $wk_pre_tp = "0"
      Reset_TIPO_COLLO($wk_pre_tp,61,90)
      $wk_prg = 61
      $wk_val_tp = STRCAT($wk_pre_tp,STR($wk_prg))

      $wk_i = 1
      while ( $wk_i <= $wk_led )
      {
         $wk_idx_led = $wk_led[$wk_i]
         $wk_idx_ripiano = PADRE($wk_idx_led,1)

         if( NOME($wk_idx_ripiano) == "Ripiano_30MM" )
         {
            $wk_ATTIVA_TIPO_COLLO = Assegna_TIPO_COLLO_CheckSost($wk_idx_led,$wk_idx_ripiano)

            if( $wk_ATTIVA_TIPO_COLLO == 1  )
            {
               if( VAR_VAL_STR($wk_idx_ripiano,"TIPO_COLLO") == "" )
               {
                  VAR_VALUESTR_SET($wk_idx_led, "TIPO_COLLO",$wk_val_tp)
                  VAR_VALUESTR_SET($wk_idx_ripiano, "TIPO_COLLO",$wk_val_tp)
                  $wk_prg = $wk_prg + 1
                  $wk_val_tp = STRCAT($wk_pre_tp,STR($wk_prg))
               }
               else
               {
                  VAR_VALUESTR_SET($wk_idx_led, "TIPO_COLLO",VAR_VAL_STR($wk_idx_ripiano,"TIPO_COLLO"))
               }
            }
         }

         $wk_i = $wk_i + 1
      }


      //Luca 09/04/2021
      //mantis 24959: 30MM - Nuovi tipi collo
      $wk_i = 1
      while ( $wk_i <= $wk_barraTV )
      {
         $wk_idx_barra = $wk_barraTV[$wk_i]
         $wk_idx_ripiano = PADRE($wk_idx_barra,1)

         $wk_ATTIVA_TIPO_COLLO = Assegna_TIPO_COLLO_CheckSost($wk_idx_barra,$wk_idx_ripiano)

         if( $wk_ATTIVA_TIPO_COLLO == 1  )
         {
            if( VAR_VAL_STR($wk_idx_ripiano,"TIPO_COLLO") == "" )
            {
               VAR_VALUESTR_SET($wk_idx_barra, "TIPO_COLLO",$wk_val_tp)
               VAR_VALUESTR_SET($wk_idx_ripiano, "TIPO_COLLO",$wk_val_tp)
               $wk_prg = $wk_prg + 1
               $wk_val_tp = STRCAT($wk_pre_tp,STR($wk_prg))
            }
            else
            {
               VAR_VALUESTR_SET($wk_idx_barra, "TIPO_COLLO",VAR_VAL_STR($wk_idx_ripiano,"TIPO_COLLO"))
            }
         }

         $wk_i = $wk_i + 1
      }

      //LZ 24/01/2022: passacavi 368 su mensola 30mm
      $wk_i = 1
      while ( $wk_i <= $wk_pcv )
      {
         $wk_idx_pcv = $wk_pcv[$wk_i]
         $wk_idx_ripiano = PADRE($wk_idx_pcv,1)

         if( NOME($wk_idx_ripiano) == "Ripiano_30MM" )
         {
            if( VAR_VAL_STR($wk_idx_pcv,"TipoPassacaviStr") == "TER052-ROTONDO"
              | VAR_VAL_STR($wk_idx_pcv,"TipoPassacaviStr") == "TER050-OVALE" )
            {
               if( Assegna_TIPO_COLLO_CheckSost($wk_idx_pcv,$wk_idx_ripiano) == 1 )
               {
                  if( VAR_VAL_STR($wk_idx_ripiano,"TIPO_COLLO") == "" )
                  {
                     VAR_VALUESTR_SET($wk_idx_pcv, "TIPO_COLLO",$wk_val_tp)
                     VAR_VALUESTR_SET($wk_idx_ripiano, "TIPO_COLLO",$wk_val_tp)
                     $wk_prg = $wk_prg + 1
                     $wk_val_tp = STRCAT($wk_pre_tp,STR($wk_prg))
                  }
                  else
                  {
                     VAR_VALUESTR_SET($wk_idx_pcv, "TIPO_COLLO",VAR_VAL_STR($wk_idx_ripiano,"TIPO_COLLO"))
                  }
               }
            }
         }

         $wk_i = $wk_i + 1
      }

      //Luca 09/04/2021
      //mantis 24959: 30MM - Nuovi tipi collo
      // da 091 a 100: schiena della teca 3 lati + led, quando presente:
      $wk_pre_tp = "0"
      $wk_prg = 91
      $wk_val_tp = STRCAT($wk_pre_tp,STR($wk_prg))
      Reset_TIPO_COLLO($wk_pre_tp,91,100)
      $wk_i = 1
      while ( $wk_i <= $wk_teca )
      {
         $wk_idx_teca = $wk_teca[$wk_i]
         SET_#($wk_idx_teca)

         if( VAR_VAL($wk_idx_teca,"TipoTeca") == 3 )
         {
            ScriviSuLog( log , "Assegna_TipoCollo_Teca_Led_368" , STRCAT("TECA 3 LATI ",STR($wk_idx_teca)))

            WITH_VAR_LOCAL($wk_idx_teca,"$wk_led_sup","PosizioneLED",0,1,"1")
            if( $wk_led_sup > 0 )
            {
               $wk_idx_led = $wk_led_sup[1]
               $wk_idx_sch = #idx_schiena_teca

               ScriviSuLog( log , "Assegna_TipoCollo_Teca_Led_368" , STRCAT("TECA 3 LATI ",STR($wk_idx_teca) , " $wk_idx_led=",STR($wk_idx_led)))

               $wk_ATTIVA_TIPO_COLLO = Assegna_TIPO_COLLO_CheckSost($wk_idx_led,$wk_idx_sch)

               if( $wk_ATTIVA_TIPO_COLLO == 1  )
               {
                  VAR_VALUESTR_SET($wk_idx_led, "TIPO_COLLO",$wk_val_tp)
                  VAR_VALUESTR_SET($wk_idx_sch, "TIPO_COLLO",$wk_val_tp)
                  $wk_prg = $wk_prg + 1
                  $wk_val_tp = STRCAT($wk_pre_tp,STR($wk_prg))
               }
            }
         }

         $wk_i = $wk_i + 1
      }

      ScriviSuLog( log , "Assegna_TipoCollo_Teca_Led_368" , "END" )
   }

   PROCEDURA Assegna_TipoCollo_Teca_VetroSingolo_368
   {
      SET_#($wk_idx_vetro)

      if( VAR_VAL_STR(-1,"TST_OrdineSostituzione") == "1" )
      {
         if( VAR_VAL_STR($wk_idx_vetro,"ORD_SOST") == "0" ) { EXITSUB() }
      }

      if( IS_IDX(#idx_pannello) & #AttivaPanMartire == 0 )
      {
         if( VAR_VAL_STR(#idx_pannello,"TIPO_COLLO") == "" )
         {
            VAR_VALUESTR_SET($wk_idx_vetro, "TIPO_COLLO",$wk_val_tp)
            VAR_VALUESTR_SET(#idx_pannello, "TIPO_COLLO",$wk_val_tp)
            $wk_prg = $wk_prg + 1

            if( $wk_prg<10 ) { $wk_val_tp = STRCAT($wk_pre_tp,"0",STR($wk_prg)) }
            else             { $wk_val_tp = STRCAT($wk_pre_tp,STR($wk_prg)) }
         }
         else
         {
            //eredito dal fianco/ripiano
            VAR_VALUESTR_SET($wk_idx_vetro, "TIPO_COLLO",VAR_VAL_STR(#idx_pannello,"TIPO_COLLO"))
         }
      }
   }

   PROCEDURA Set_Dimensioni_Teca_30MM
   {
      if( TipoTeca == 3 )
      {
         Y_Min = 154
         Y_Max = 338
         menu_y = "AltTeca3_30MM"

         EXITSUB()
      }

      Y_Min = 154
      Y_Max = 736

      menu_y = "AltTeca4c_30MM"

      if( X > 1104 )  { Y_Max = 1288 menu_y = "AltTeca4a_30MM" }
      if( X > 2208 )  { Y_Max = 368  menu_y = "AltTeca_30MM" }

      #ifndef AGE;RIV
         Y_Max = 2944
         menu_y = "AltTeca4_30MM"

         if( X > 1104 )  { Y_Max = 1288   menu_y = "AltTeca4a_30MM" }
         if( X > 2208 )  { Y_Max = 1104   menu_y = "AltTeca4b_30MM" }
      #endif
   }

   PROCEDURA Ctrl_Dimensioni_Teca_30MM
   {
      if( Y > Y_Max )
      {
         HI(ATTUALE(),1)
         msg = STRCAT(MSG(1090),"\n", MSG(1252))

         CHIEDI(ATTUALE(),"Y")
         HI(ATTUALE(),0)
      }
   }

   PROCEDURA Ctrl_Teca_VerificaPosDim_30MM
   {
      $wk_CG_Nome    = "Ctrl_Teca_VerificaPosDim_30MM"
      $wk_CG_Blocca  = 0
      $wk_CG_Items   = 0
      $wk_CG_Tipo    = "BLOCCO"
      $wk_CG_Msg     = MSG(1253)

      COMANDO2("Procedura CtrlPosDim_Teca_30MM")

      if( $wk_CG_Items > 0  ) {  $wk_CG_Blocca = 1 }

      GOSUB CG_CFO_FineControllo
   }

   PROCEDURA CtrlPosDim_Teca_30MM
   {
      //controllo che il posizionamento delle teca sia possibile:
      // - 1 il fondo (di 3 e 4 lati) e il coperchio (della 4 lati) non possono interessare pił elementi
      // - 2 tutti gli elementi della teca devono avere la stessa profonditą degli elementi ai quali sono agganciati
      // - rispetto ad un vano definito da fianchi e mensole, una teca non puņ essere parziale in larghezza o altezza
      // - una teca non puņ essere racchiusa tra ripiani (solo mensole)
      //Luca 21/02/2022
      // 5 - le teche 3 lati nel caso in cui uno dei due fianchi sia di altezza diversa rispetto all'altro, o il vetro risulti parziale rispetto al fianco legno.

      ScriviSuLog(0,"CtrlPosDim_Teca_30MM","START")

      if( VAR_VAL(ATTUALE(), "FLAG_Speciale") ==1 )
      {
         ScriviSuLog(0,"CtrlPosDim_Teca_30MM","ESCO, gestione speciale")
         EXITSUB()
      }

      #ifdef TE
         M4_DRAW_MODE__ = 0
      #endif

      BOX_MODE(0)

      Blocca_Teca     = 0
      Blocca_Teca_Str = 0

      wk_fia_sx = 0
      wk_fia_dx = 0
      wk_rip_dw = 0
      wk_rip_up = 0

      NEAR_GLOBALE2("wk_fia_sx",idx_cnear_sx,1,"Fianco_30MM")
      NEAR_GLOBALE2("wk_fia_dx",idx_cnear_dx,1,"Fianco_30MM")
      NEAR_GLOBALE2("wk_rip_dw",idx_cnear_dw,1,"Ripiano_30MM")
      NEAR_GLOBALE2("wk_rip_up",idx_cnear_up,1,"Ripiano_30MM")

      if( TipoTeca == 3 ) { wk_rip_up = 1 }

      if( wk_fia_sx == 0 )  { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"MANCA IL FIANCO SX") }
      if( wk_fia_dx == 0 )  { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"MANCA IL FIANCO DX") }
      if( wk_rip_dw == 0 )  { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"MANCA IL RIPIANO SOTTO") }
      if( wk_rip_up == 0 )  { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"MANCA IL RIPIANO SOPRA") }

      if( wk_fia_sx  > 1 )  { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"LA TECA INTERESSA 2 FIANCHI SX") }
      if( wk_fia_dx  > 1 )  { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"LA TECA INTERESSA 2 FIANCHI DX") }
      if( wk_rip_dw  > 1 )  { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"LA TECA INTERESSA 2 RIPIANI SOTTO") }
      if( wk_rip_up  > 1 )  { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"LA TECA INTERESSA 2 RIPIANI SOPRA") }

      //Luca 21/02/2022
      wk_fiancosx_y = -1
      wk_fiancodx_y = -1

      //verifico che la profonditą della teca sia uguale al fianco/ripiano
      //veirfico che la teca sia contenuta completamente nel fianco(altezza) / ripiano (larghezza)
      if( wk_fia_sx == 1 )
      {
         wk_idx_pan = wk_fia_sx[1]
         if( VAR_VAL(wk_idx_pan,"Z") != Z ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"PROFONDITA FIANCO SX DIVERSA DA TECA") }

         if( VAR_VAL(wk_idx_pan,"Y") <  Y ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"ALTEZZA FIANCO SX MINORE DI ALTEZZA TECA") }

         SET_#(wk_idx_pan)
         wk_b0 = #base_0.y
         wk_a0 = #alto_0.y

         if( wk_b0 > base_0.y | wk_a0 < alto_0.y ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"FIANCO SX NON COMPRE COMPLETAMENTE LA TECA") }

         //Luca 21/02/2022
         wk_fiancosx_y = VAR_VAL(wk_idx_pan,"Y")
         if( TipoTeca==3 )
         {
            if( wk_fiancosx_y > Y + 30 + 5 )       { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"IL VETRO RISULTA PARZIALE RISPETTO AL FIANCO LEGNO") }
         }
      }

      if( wk_fia_dx == 1 )
      {
         wk_idx_pan = wk_fia_dx[1]
         if( VAR_VAL(wk_idx_pan,"Z") != Z ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"PROFONDITA FIANCO DX DIVERSA DA TECA") }

         if( VAR_VAL(wk_idx_pan,"Y") <  Y ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"ALTEZZA FIANCO DX MINORE DI ALTEZZA TECA") }

         SET_#(wk_idx_pan)
         wk_b0 = #base_0.y
         wk_a0 = #alto_0.y

         if( wk_b0 > base_0.y | wk_a0 < alto_0.y ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"FIANCO DX NON COMPRE COMPLETAMENTE LA TECA") }

         //Luca 21/02/2022
         wk_fiancodx_y = VAR_VAL(wk_idx_pan,"Y")
         if( TipoTeca==3 )
         {
            if( wk_fiancodx_y > Y + 30 + 5 )       { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"IL VETRO RISULTA PARZIALE RISPETTO AL FIANCO LEGNO") }
         }
      }

      if( wk_rip_dw == 1 )
      {
         wk_idx_pan = wk_rip_dw[1]
         if( VAR_VAL(wk_idx_pan,"Z") != Z ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"PROFONDITA RIPIANO SOTTO DIVERSA DA TECA") }

         if( VAR_VAL(wk_idx_pan,"X")  < X ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"LARGHEZZA RIPIANO SOTTO MINORE DI LARGHEZZA TECA") }

         if( VAR_VAL_STR(wk_idx_pan,"TipoRipianoStr") != "RIPIANO" ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"TIPO_RIPIANO SOTTO DIVERSO DA 'RIPIANO'") }

         SET_#(wk_idx_pan)
         wk_b0 = #punto_sx_ctrl_teca   wk_b0.y = 0
         wk_b3 = #punto_dx_ctrl_teca   wk_b3.y = 0

         wk_b0_teca = base_0           wk_b0_teca.y = 0
         wk_b3_teca = base_3           wk_b3_teca.y = 0

         wk_px_1 = INTERFERISCI(wk_b0_teca,ANG_TOT_NOR(idx_att)+90,wk_b0,wk_b3)
         wk_px_2 = INTERFERISCI(wk_b3_teca,ANG_TOT_NOR(idx_att)+90,wk_b0,wk_b3)

         if( wk_px_1.x == $ERR_INTERFERISCI
           | wk_px_1.y == $ERR_INTERFERISCI
           | wk_px_1.z == $ERR_INTERFERISCI
           | wk_px_2.x == $ERR_INTERFERISCI
           | wk_px_2.y == $ERR_INTERFERISCI
           | wk_px_2.z == $ERR_INTERFERISCI ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"RIPIANO SOTTO NON COMPRE COMPLETAMENTE LA TECA") }
      }

      if( wk_rip_up == 1 & TipoTeca==4 )
      {
         wk_idx_pan = wk_rip_up[1]
         if( VAR_VAL(wk_idx_pan,"Z") != Z ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"PROFONDITA RIPIANO SOPRA DIVERSA DA TECA") }

         if( VAR_VAL(wk_idx_pan,"X")  < X ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"LARGHEZZA RIPIANO SOPRA MINORE DI LARGHEZZA TECA") }

         if( VAR_VAL_STR(wk_idx_pan,"TipoRipianoStr") != "RIPIANO" ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"TIPO_RIPIANO SOPRA DIVERSO DA 'RIPIANO'") }

         SET_#(wk_idx_pan)
         wk_b0 = #punto_sx_ctrl_teca   wk_b0.y = 0
         wk_b3 = #punto_dx_ctrl_teca   wk_b3.y = 0

         wk_b0_teca = base_0           wk_b0_teca.y = 0
         wk_b3_teca = base_3           wk_b3_teca.y = 0

         wk_px_1 = INTERFERISCI(wk_b0_teca,ANG_TOT_NOR(idx_att)+90,wk_b0,wk_b3)
         wk_px_2 = INTERFERISCI(wk_b3_teca,ANG_TOT_NOR(idx_att)+90,wk_b0,wk_b3)

         if( wk_px_1.x == $ERR_INTERFERISCI
           | wk_px_1.y == $ERR_INTERFERISCI
           | wk_px_1.z == $ERR_INTERFERISCI
           | wk_px_2.x == $ERR_INTERFERISCI
           | wk_px_2.y == $ERR_INTERFERISCI
           | wk_px_2.z == $ERR_INTERFERISCI ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"RIPIANO SOPRA NON COMPRE COMPLETAMENTE LA TECA") }
      }

      //Luca 21/02/2022
      if( TipoTeca ==3 )
      {
         if( wk_fiancosx_y > 0 & wk_fiancodx_y > 0 )
         {
            if( wk_fiancosx_y != wk_fiancodx_y ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,"I FIANCHI 30MM INTERESSATI DALLA TECA DEVONO AVERE UGUALE ALTEZZA") }
         }
      }

      //LZ: Controlli dimensionali, per teche ridimensionate in un secondo momento
      if( X < X_Min ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,STRCAT("LARGHEZZA TECA < ",STR(X_Min))) }
      if( X > X_Max ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,STRCAT("LARGHEZZA TECA > ",STR(X_Max))) }
      if( Y < Y_Min ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,STRCAT("ALTEZZA TECA < ",STR(Y_Min))) }
      if( Y > Y_Max ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,STRCAT("ALTEZZA TECA > ",STR(Y_Max))) }
      if( Z < Z_Min ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,STRCAT("PROFONDITA TECA < ",STR(Z_Min))) }
      if( Z > Z_Max ) { Blocca_Teca = 1   AddItem2Array(idx_att,"Blocca_Teca_Str",0,STRCAT("PROFONDITA TECA > ",STR(Z_Max))) }

      if( Blocca_Teca == 1 )
      {
         #ifdef TE
            M4_DRAW_MODE__ = 4
         #endif
         ScriviSuLog(0,"CtrlPosDim_Teca_30MM",STRCAT("[",STR(idx_att),"] TECA NON FATTIBILE"))

         i = 1
         while ( i <= Blocca_Teca_Str )
         {
            ScriviSuLog(0,"CtrlPosDim_Teca_30MM",STRCAT("[",STR(idx_att),"] " ,STR(i),". ",Blocca_Teca_Str[i]))
            i = i + 1
         }

         if( VAR_VAL(-1,"wk_OnControlli_Globali")==1
           | VAR_VAL(-1,"wk_OnControlli_FineOrdine")==1 ) { AddItem2Array(-1,"wk_CG_Items",idx_att,"") }
      }

      ScriviSuLog(0,"CtrlPosDim_Teca_30MM","END")
   }

   PROCEDURA Trova_Led_Schienale_30MM
   {
      wk_arr_LED = 0

      //recupero ripiani sopra
      BOX_MODE(0)
      NEAR_GLOBALE2("wk_rip_up",idx_cnear_up,1,"Ripiano_30MM")
      NEAR_GLOBALE2("wk_rip_dw",idx_cnear_dw,1,"Ripiano_30MM")

      i = 1
      while ( i <= wk_rip_up )
      {
         COMPONENTI2("led",wk_rip_up[i],"Led_30MM")
         j = 1
         while ( j <= led )
         {
            add_led = 1
            //solo se il ripiano superiore non ha teca/schienale sopra
            if( VAR_VAL(led[j],"PosizioneLED") == 1  )
            {
               add_led = 0
               SET_#(wk_rip_up[i])
               if( IS_IDX(#idx_sch_up) == 0
                 & IS_IDX(#idx_tec_up) == 0  ) { add_led = 1 }

            }
            if( add_led ) { AddItem2Array(ATTUALE(),"wk_arr_LED",led[j],"") }

            j = j + 1
         }

         i = i + 1
      }

      i = 1
      while ( i <= wk_rip_dw )
      {
         COMPONENTI2("led",wk_rip_dw[i],"Led_30MM")
         j = 1
         while ( j <= led )
         {
            add_led = 1
            //solo se il ripiano inferiore non ha teca/schienale sotto
            if( VAR_VAL(led[j],"PosizioneLED") == 2 )
            {
               add_led = 0
               SET_#(wk_rip_dw[i])
               if( IS_IDX(#idx_sch_dw) == 0
                 & IS_IDX(#idx_tec_dw) == 0  ) { add_led = 1 }

            }
            if( add_led ) { AddItem2Array(ATTUALE(),"wk_arr_LED",led[j],"") }
            j = j + 1
         }
         i = i + 1
      }

      if( NOME(ATTUALE()) == "SchienaTeca_30mm"
        & VAR_VAL(ATTUALE(),"TipoTeca") == 3 )
      {
         ConLED = 0
         //COMPONENTI2("led",ATTUALE(),"Led_30MM")
         COMPONENTI2("led",PADRE(ATTUALE(),1),"Led_30MM")
         if( led > 0 )
         {
            ConLED = 1

            add = 1
            i = 1
            while ( i <= wk_arr_LED & add == 1 )
            {
               if( wk_arr_LED[i]==led[1] ) { add = 0 }
               i = i + 1
            }
            if( add == 1 )  { AddItem2Array(ATTUALE(),"wk_arr_LED",led[1],"") }
         }
      }

      //Luca 06/05/2021
      //Mantis 025394: 30MM - Calcolo alimentatore Led errato
      //verifico che non ci siano elementi duplicati nell'array
      SORT_ARRAY(ATTUALE(),"wk_arr_LED")

      //filtro
      k = 2
      while ( k <= wk_arr_LED )
      {
         if( wk_arr_LED[k] == wk_arr_LED[k-1] )
         {
            DEL_ARRAY_ITEM(ATTUALE(),"wk_arr_LED",k)
            k = k - 1
         }
         k = k + 1
      }
   }

   PROCEDURA Cancella_Schienale_30MM
   {
      if( $StartingDel__!=ATTUALE()
        & $StartingDel__!=PADRE(ATTUALE(),1)  ) { EXITSUB() }

      //Luca 03/03/2021
      //verifico l'array dei led di questo schienale
      #ifndef AGE;RIV
         EXITSUB()
      #endif

      //aggiorno array led
      GOSUB Trova_Led_Schienale_30MM

      idx_sch = ATTUALE()
      if( NOME(ATTUALE()) == "Teca_30MM" ) { idx_sch = idx_schiena_teca }

      if( VAR_VAL(idx_sch,"wk_arr_LED")>0 )
      {
         msg = STRCAT(MSG(1090),"\n",MSG(1254))
         DISPLAY2(msg)

         SET_#(idx_sch)

         i = 1
         while ( i <= #wk_arr_LED )
         {
            COMANDO(STRCAT("ELIMINA ",STR(#wk_arr_LED[i]),"  //cancella ",NOME(ATTUALE())))
            i = i + 1
         }
      }
   }

   //Luca 03/03/2021
   PROCEDURA TLED_CalcolaTrasformatore_30MM
   {
      //if( ACTION() <= 0 | ACTION() == 2 | $OnLoadOrder==1 | $OnLoadOrder2==1  ) { EXITSUB() }
      if( ACTION() <= 0 | ACTION() == 2 | $OnLoadOrder==1  ) { EXITSUB() }

      if( VAR_VAL(-1,"OnRigenera_AttivaPCV") == 1 ) { EXITSUB() }

      ScriviSuLog( 0 , "TLED_CalcolaTrasformatore_30MM" , STRCAT("IDX [",STR(ATTUALE()),"] [ START" ))

      TLED_Lavorazione     = 0
      TLED_TipoLavorazione = 0

      TLED_Attiva          = 0
      TLED_Tipologia1      = 0
      TLED_Tipologia2      = 0
      TLED_Watt            = 0

      GOSUB Trova_Led_Schienale_30MM

      if( TLED_Lavorazione_USER == 1 )
      {
         if( VAR_VAL_STR(ATTUALE(),"GEST_C008") == "SM075" ) { TLED_Attiva = 1   TLED_Tipologia1 = 1 }
         if( VAR_VAL_STR(ATTUALE(),"GEST_C008") == "SM076" ) { TLED_Attiva = 1   TLED_Tipologia1 = 2 }
         if( VAR_VAL_STR(ATTUALE(),"GEST_C008") == "SM077" ) { TLED_Attiva = 2   TLED_Tipologia1 = 1 TLED_Tipologia2 = 1 }
         if( VAR_VAL_STR(ATTUALE(),"GEST_C008") == "SM078" ) { TLED_Attiva = 2   TLED_Tipologia1 = 2 TLED_Tipologia2 = 2 }
         if( VAR_VAL_STR(ATTUALE(),"GEST_C008") == "SM079" ) { TLED_Attiva = 1   TLED_Tipologia1 = 0 }

         if( TLED_Attiva > 0 )
         {
            TLED_Lavorazione = 1
            if( TLED_Attiva == 1 & TLED_Tipologia1 == 0 )  { TLED_TipoLavorazione = 5 }
            if( TLED_Attiva == 1 & TLED_Tipologia1 == 1 )  { TLED_TipoLavorazione = 1 }
            if( TLED_Attiva == 1 & TLED_Tipologia1 == 2 )  { TLED_TipoLavorazione = 2 }
            if( TLED_Attiva == 2 )
            {
               if( TLED_Tipologia1 == 1 & TLED_Tipologia2 ==1 ) { TLED_TipoLavorazione = 3 }
               else                                             { TLED_TipoLavorazione = 4 }
            }
         }

         if( NOME(ATTUALE()) == "SchienaTeca_30mm" )
         {
            TLED_Attiva = 0
            if( VAR_VAL_STR(ATTUALE(),"GEST_C008") == "SM075" ) { TLED_TipoLavorazione = 1 }
            if( VAR_VAL_STR(ATTUALE(),"GEST_C008") == "SM076" ) { TLED_TipoLavorazione = 2 }
            if( VAR_VAL_STR(ATTUALE(),"GEST_C008") == "SM077" ) { TLED_TipoLavorazione = 3 }
            if( VAR_VAL_STR(ATTUALE(),"GEST_C008") == "SM078" ) { TLED_TipoLavorazione = 4 }
            if( VAR_VAL_STR(ATTUALE(),"GEST_C008") == "SM079" ) { TLED_TipoLavorazione = 5 }
            //if( VAR_VAL_STR(ATTUALE(),"GEST_C008") == "SM077" ) TLED_TipoLavorazione = 2{ TLED_Attiva = 2   TLED_Tipologia1 = 1 }
            //if( VAR_VAL_STR(ATTUALE(),"GEST_C008") == "SM078" ) { TLED_Attiva = 2   TLED_Tipologia1 = 2 }
         }

         //EXITSUB()
      }

      if( wk_arr_LED == 0 )
      {
         ScriviSuLog( 0 , "TLED_CalcolaTrasformatore_30MM" , STRCAT("IDX [",STR(ATTUALE()),"] ] END | NO-LED " ))

         EXITSUB()
      }

      ScriviSuLog( 0 , "TLED_CalcolaTrasformatore_30MM" , STRCAT("IDX [",STR(ATTUALE()),"] NrLed=",STR(wk_arr_LED) ))

      //verifico la potenza totale
      wk_watt_tot = 0
      i = 1
      while ( i <= wk_arr_LED )
      {
         wk_watt_tot = wk_watt_tot + VAR_VAL(wk_arr_LED[i],"LED_Watt")
         i = i + 1
      }

      wk_nr_trasf = 1
      if( wk_watt_tot > 100 | wk_arr_LED > 4 ) { wk_nr_trasf = 2 }

      TLED_Attiva = wk_nr_trasf
      if( wk_nr_trasf == 1 )
      {
         //Simone 07/12/2022 - Introdotto alimentatore da 15W
         //TLED_Tipologia1 = 1
         TLED_Tipologia1 = 0

         //Simone 07/12/2022 - Sposto sotto
         //Luca 26/04/2021
         //if( NOME(ATTUALE()) == "SchienaTeca_30mm" & VAR_VAL(ATTUALE(),"TipoTeca") == 3 )
         //{
         //   if( X <= 482 & Y <= 236.5 ) { TLED_Tipologia1 = 0 }
         //}

         if( wk_watt_tot > 15 ) { TLED_Tipologia1 = 1 }

         if( wk_watt_tot > 30 )  { TLED_Tipologia1 = 2 }
      }

      if( wk_nr_trasf == 2 )
      {
         TLED_Tipologia1 = 1
         TLED_Tipologia2 = 1
         if( wk_watt_tot > 60  ) { TLED_Tipologia1 = 2 }
         if( wk_watt_tot > 130 ) { TLED_Tipologia2 = 2 }
      }

      //le lavorazioni gestita manualmente, ma i trasformatori a parte
      if( TLED_Lavorazione_USER == 1 ) { EXITSUB() }

      if( TLED_Attiva > 0 )
      {
         TLED_Lavorazione = 1
         //Simone 07/12/2022
         if( TLED_Attiva == 1 & TLED_Tipologia1 == 0 )
         {
            TLED_TipoLavorazione = 1
            if( NOME(ATTUALE()) == "SchienaTeca_30mm" & VAR_VAL(ATTUALE(),"TipoTeca") == 3 )
            {
               if( X <= 482 & Y <= 236.5 )  { TLED_TipoLavorazione = 5 }
            }
         }
         if( TLED_Attiva == 1 & TLED_Tipologia1 == 1 )  { TLED_TipoLavorazione = 1 }
         if( TLED_Attiva == 1 & TLED_Tipologia1 == 2 )  { TLED_TipoLavorazione = 2 }
         if( TLED_Attiva == 2 )
         {
            if( TLED_Tipologia1 == 1 & TLED_Tipologia2 ==1 ) { TLED_TipoLavorazione = 3 }
            else                                             { TLED_TipoLavorazione = 4 }
         }

         //Luca 26/04/2021
         //- i casi dimensionali individuati negli "allegato 2" e "allegato 2.1" sono gli unici in cui lo scasso da graficare č quello per l'alimentatore da 30W
         //- in tutti gli altri casi ti chiedo di graficare sempre lo scasso dell'alimentatore da 100W, anche quando il calcolo dei led vada a prevedere un alimentatore da 30W
         if( NOME(ATTUALE()) == "SchienaTeca_30mm" )
         {
            if( TLED_TipoLavorazione == 1 )
            {
               wk_TLED_TipoLavorazione = TLED_TipoLavorazione

               if( VAR_VAL(ATTUALE(),"TipoTeca") == 3 )
               {
                  TLED_TipoLavorazione = 2
                  if( X >= 362 & X <= 400 )
                  {
                     if( Y >= 237 & Y <= 354 ) { TLED_TipoLavorazione = wk_TLED_TipoLavorazione }
                  }

                  if( X >= 482.5 & X <= 552 )
                  {
                     if( Y >= 140 & Y <= 236.5 ) { TLED_TipoLavorazione = wk_TLED_TipoLavorazione }
                  }
               }
               if( VAR_VAL(ATTUALE(),"TipoTeca") == 4 )
               {
                  TLED_TipoLavorazione = 2
                  if( X >= 362 & X <= 400 )
                  {
                     if( Y >= 120 & Y <= 420 ) { TLED_TipoLavorazione = wk_TLED_TipoLavorazione }
                  }
               }
            }
         }
      }

      ScriviSuLog( 0 , "TLED_CalcolaTrasformatore_30MM" , STRCAT("IDX [",STR(ATTUALE()),"] | wk_watt_tot=",STR(wk_watt_tot) , " | wk_nr_trasf=",STR(wk_nr_trasf) ))

      ScriviSuLog( 0 , "TLED_CalcolaTrasformatore_30MM" , STRCAT("IDX [",STR(ATTUALE()),"] ] END" ))
   }

   PROCEDURA posa_lavorazione_trasformatore_30MM
   {
      @escluso = 1
      if( TLED_Lavorazione > 0 ) { @escluso = 0 }

      lavx   = 300
      lavy   =  80
      lavz   =  10
      pos_sx = 0

      trasf_vert = 0

      if( TLED_TipoLavorazione == 2 ) { lavx = 370 }

      if( TLED_TipoLavorazione == 3 ) { lavx = 300 lavy = 160  }

      if( TLED_TipoLavorazione == 4 ) { lavx = 370 lavy = 160 }

      if( NOME(idx_att) == "SchienaTeca_30mm" )
      {
         //if( TLED_TipoLavorazione == 3 )
         if( TLED_TipoLavorazione == 2 )
         {
            lavx = 370
            lavy = 80
         }
      }

      if( TLED_TipoLavorazione == 5 )
      {
         lavx = 180
         lavy = 100
      }

      //verticale
      if( X <= 420 & Y >= 421 )
      {
         lavx_save = lavx
         lavx = lavy
         lavy = lavx_save

         pos_sx = 1

         trasf_vert = 1
      }

      if( X >= 571 ) { pos_sx = 1 }

      @X = lavx
      @Y = lavy
      @Z = lavz

      posx = X/2 - @X/2
      posy = Y/2 - @Y/2

      if( NOME(idx_att) == "SchienaTeca_30mm"  & VAR_VAL(idx_att,"TipoTeca") == 3 )
      {
         y_pan = Y - 14
         posy = y_pan/2 - @Y/2

         pos_sx = 0
         if( TLED_TipoLavorazione == 1 )
         {
            if( y_pan <= 197 ) { posy = y_pan - 25 - lavy }
         }
         if( TLED_TipoLavorazione == 2 )
         {
            if( y_pan <= 197 )           { posy = y_pan - 45 - lavy }
            if( y_pan > 197 & y_pan <= 354 ) { posy = y_pan - 137 - lavy }
         }

         if( TLED_TipoLavorazione == 3  )
         {
            if( y_pan <= 197 )
            {
               posy = y_pan - 45 - lavy

               if( X > 1833.5 ) { posy = 426 }
               if( X > 2569.5 ) { posy = 1100 }
            }

            if( y_pan > 197 & y_pan <= 354 ) { posy = y_pan - 137 - lavy }
         }

         //Luca 26/04/2021
         if( TLED_TipoLavorazione == 5 ) { posy = y_pan - 25 - lavy }

         posy = posy + 0.25

         //Luca 31/03/2022
         //revisione mantis 26415: Pannelli teche: modifica posizione trasformatore
         if( TLED_TipoLavorazione == 5 )
         {
            posy = y_pan - lavy/2 - 74.5
         }

         if( TLED_TipoLavorazione == 1
           | TLED_TipoLavorazione == 2 )
         {
            Y_Teca = Y + 0.5
            //Simone 05/04/2022
            X_Teca = X + 1
            posy = y_pan - lavy/2 - 176.5

            if( Y_Teca >= 154 & Y_Teca <= 250.5 )
            {
               posy = y_pan - lavy/2 - 84.5

               if( X_Teca >= 1839.5 & X_Teca <= 2575 ) { posx = X - lavx/2 - 614 + 0.5 }
            }
         }
      }

      //Luca 31/03/2022
      //revisione mantis 26415: Pannelli teche: modifica posizione trasformatore
      if( NOME(idx_att) == "SchienaTeca_30mm"  & VAR_VAL(idx_att,"TipoTeca") == 4 )
      {
         y_pan = Y

         pos_sx = 0

         //ripristino eventuali verticali
         if( trasf_vert == 1 )
         {
            lavx_save = lavx
            lavx = lavy
            lavy = lavx_save
         }

         //Simone 05/04/2022
         //X_Teca = X + 2
         //Y_Teca = Y + 0.5
         X_Teca = X + 1
         Y_Teca = Y + 4
         if( TLED_TipoLavorazione == 2 )
         {
            if( X_Teca >= 474 & X_Teca <= 2944 )
            {
               if( Y_Teca >= 184 & Y_Teca <= 2884 )
               {
                  posx = 238 - lavx/2 - 0.5
                  posy = y_pan - lavy/2 - 92 + 2
               }
            }

            //verticale
            if( X_Teca >= 368 & X_Teca <= 425.5 )
            {
               if( Y_Teca >= 475 & Y_Teca <= 2884 )
               {
                  posnew = 2
                  lavx_save = lavx
                  lavx = lavy
                  lavy = lavx_save

                  //pos_sx = 1

                  trasf_vert = 1

                  posx = 93 -  lavx/2 - 0.5
                  posy = y_pan - lavy/2 - 237 + 2
               }
            }
         }
      }

      if( TLED_Lavorazione == 0 ) { EXITSUB() }

      if( pos_sx == 1 ) { posx = 100 }

      @base_0.x = base_0.x + posx
      @base_0.y = base_0.y + posy
      @base_0.z = base_0.z - 0.5
   }

   PROCEDURA posa_trasformatore_30MM
   {
      @escluso = 1
      if( ntrasf == 1 & TLED_Attiva > 0 ) { @escluso = 0 }
      if( ntrasf == 2 & TLED_Attiva > 1 ) { @escluso = 0 }

      if( ntrasf == 1 )
      {
         //per aver subito la posizione corretta
         @X = 100
         if( TLED_Tipologia1 > 0 ) { @X = 247 }
         @TLED_Tipologia = TLED_Tipologia1

         if( TLED_Attiva > 1 ) { posy = posy - @Y }
      }

      if( ntrasf == 2 )
      {
         //per aver subito la posizione corretta
         @X = 100
         if( TLED_Tipologia2 > 0 ) { @X = 247 }
         @TLED_Tipologia = TLED_Tipologia2

         if( TLED_Attiva > 1 ) { posy = posy + 2*@Y }
      }

      //uso posizione e dimensioni calcolate nel posizionamento della lavorazione
      @base_0.x = base_0.x + posx + lavx/2 - @X/2
      @base_0.y = base_0.y + posy + lavy/2 - @Y/2
      @base_0.z = base_0.z - 6

      @ang_z = 0

      if( trasf_vert == 1 )
      {
         @ang_z = 90

         @base_0.x = base_0.x + posx + lavx/2 + @Y/2
         @base_0.y = base_0.y + posy + lavy/2 - @X/2
      }
      //@TLED_Watt      = TLED_Watt

      //Simone 18/11/21
      @VT_ALI = 1
   }

   PROCEDURA PostAction2_30MM
   {
      if( VAR_VAL(ATTUALE(),"DELETE_ME")==1 )
      {

         if( VAR_VAL_STR(ATTUALE(),"DELETE_ME_msg") != "" )
         {
            HI(ATTUALE(),1)
            DISPLAY2(DELETE_ME_msg)
            HI(ATTUALE(),0)
         }

         GEST_CODICE = ""
         RADICE = ""
         FLAG_RADICE = $NO_RAD

         COMANDO(STRCAT("DELETE ",STR(ATTUALE()) , " //PostAction2_Lib_AIR"))

         EXITSUB()
      }
   }

   //Luca 20/04/2022
   PROCEDURA CtrlDimensioneSchiena_WTL_30MM
   {
      if( ACTION() <= 0 | ACTION() == 2 | $OnLoadOrder==1 ) { EXITSUB() }

      x_max = 736
      y_max = 2576
      if( VAR_VAL(idx_ref,"X") > 368 ) { y_max = 1840 }
      if( VAR_VAL(idx_ref,"X") > 552 ) { y_max = 1472 }

      //Simone 09/05/2022 - Per colonne a centro stanza
      if( VAR_VAL(idx_ref,"FLAG_Weightless") == 0 )
      {
         x_max = 920
      }

      if( NOME(ATTUALE()) == "SchienaVetroWTL_30MM" ) { y_max = 736 }

      //misure nominali
      x_max = x_max + 27

      if( X > x_max
        | Y > y_max )
      {
         DELETE_ME = 1
         DELETE_ME_msg = STRCAT(MSG(1090),"\n",MSG(1243))

         GOSUB PostAction2_30MM
      }
   }

   //PROCEDURA PostAction2_FiancoWeightless_30MM
   PROCEDURA CtrlPosizione_FiancoColWeightless_30MM
   {
      if( ACTION()<= 0 | ACTION() == 2 )   { EXITSUB() }

      if( $OnLoadOrder == 1 )  { EXITSUB() }

      if( FLAG_Weightless == 0 ) { EXITSUB() }

      //Luca 20/07/2021
      idx_piastra = -1
      ConPiastraSup = 0
      BOX_MODE(0)
      NEAR_GLOBALE2("wk_pia_up",idx_cnear_up,1,"PiastraWeightless_30MM")
      if( wk_pia_up > 0 )
      {
         idx_piastra = wk_pia_up[1]
         ConPiastraSup = 1
      }

      idx_agg = AGGANCIATA(ATTUALE(),"*")
      if( IS_IDX(idx_agg) )  { EXITSUB() }

      //#ifdef TE
      //   COMANDO2(STRCAT("LOGMSG PostAction2_FiancoWeightless_30MM [",STR(ATTUALE()), "] "))
      //#endif

      hds = H_DA_SOFFITTO(ATTUALE(),"")
      hs = H_SOFFITTO(ATTUALE(),"")

      ScriviSuLog(0,"CtrlPosizione_FiancoColWeightless_30MM",STRCAT(STR(ATTUALE())," | hds=",STR(hds) , " | hs=",STR(hs), " | Y=",STR(Y)))

      if( hs < Y )
      {
         //sposto solo il primo giro (poi resta filo soffitto)
         if( hds < Y & hds < hs )
         {
            offy = -1*(Y - hds)
            COMANDO2(STRCAT("EDITPOS_REL ",STR(ATTUALE()) , " ",STR(0), " ",STR(offy) ," " ,STR(0) , " 0 //CtrlPosizione_FiancoColWeightless_30MM 1") )
         }
         EXITSUB()
      }

      //devo abbassare
      if( hds < Y )
      {
         offy = -1*(Y - hds)
         COMANDO(STRCAT("EDITPOS_REL ",STR(ATTUALE()) , " ",STR(0), " ",STR(offy) ," " ,STR(0) , " 0 //CtrlPosizione_FiancoColWeightless_30MM 2"))
      }

      if( VAR_VAL(ATTUALE(),"ConPiastraSup")  )
      {
         ScriviSuLog(0,"CtrlPosizione_FiancoColWeightless_30MM",STRCAT(STR(ATTUALE())," | ConPiastraSup[1] hds=",STR(hds) , " Y=",STR(Y)))

         if( hds == Y  )
         {
            offy = -20
            COMANDO(STRCAT("EDITPOS_REL ",STR(ATTUALE()) , " ",STR(0), " ",STR(offy) ," " ,STR(0) , " 0 //CtrlPosizione_FiancoColWeightless_30MM 3"))
         }
      }
      else
      {
         ScriviSuLog(0,"CtrlPosizione_FiancoColWeightless_30MM",STRCAT(STR(ATTUALE())," | ConPiastraSup[0] hds=",STR(hds) , " Y=",STR(Y)))

         if( hds == Y  + 20 )
         {
            offy = 20
            COMANDO(STRCAT("EDITPOS_REL ",STR(ATTUALE()) , " ",STR(0), " ",STR(offy) ," " ,STR(0) , " 0 //CtrlPosizione_FiancoColWeightless_30MM 4"))
         }
      }
   }

   PROCEDURA Attiva_Griglia_30MM
   {
      if( $L30_ATTIVA_GRIGLIA == 1  )
      {
         DISPLAY2("30MM: Disattivata griglia")
         $L30_ATTIVA_GRIGLIA = 0
      }
      else
      {
         DISPLAY2("30MM: Attivata griglia")
         $L30_ATTIVA_GRIGLIA = 1
      }

      COMANDO("RIGENERA //Attiva_Griglia_30MM")
   }

   PROCEDURA Attiva_SnapAggiuntivi_30MM
   {
      if( $L30_ATTIVA_SNAPAGG == 1  )
      {
         DISPLAY2("30MM: Disattivati punti SNAP AGGIUNTIVI")
         $L30_ATTIVA_SNAPAGG = 0
      }
      else
      {
         DISPLAY2("30MM: Attivati punti SNAP AGGIUNTIVI")
         $L30_ATTIVA_SNAPAGG = 1
      }

      COMANDO("RIGENERA //Attiva_SnapAggiuntivi_30MM")
   }

   PROCEDURA Attiva_AllineaRipiano_30MM
   {
      if( $L30_ATTIVA_ALLRIPA == 1  )
      {
         DISPLAY2("30MM: Disattivato allineamento ripiani auto")
         $L30_ATTIVA_ALLRIPA = 0
      }
      else
      {
         DISPLAY2("30MM: Attivato allineamento ripiani auto")
         $L30_ATTIVA_ALLRIPA = 1
      }
   }

   PROCEDURA Exit_BdmCollision
   {
      exit_collision = 0

      if( VAR_EXIST(-1,"query_p2") != 1 )                 { exit_collision=1 EXITSUB() EXIT() }
      if( $query_p2 != ATTUALE() )                        { exit_collision=2 EXITSUB() EXIT() }
      if( VAR_EXIST(-1,"query_p1_##1") != 1 )             { exit_collision=3 EXITSUB() EXIT() }

      $idx_query_p1  = $query_p1[1]
      if( IS_IDX($idx_query_p1) != 1 )                    { exit_collision=4 EXITSUB() EXIT() }

      if( $idx_query_p1 == ATTUALE() )                    { exit_collision=5 EXITSUB() EXIT() }
      if( IS_IDX($idx_query_p1) !=1 )                     { exit_collision=6 EXITSUB() EXIT() }

      // FT 29/03/18
      if( VAR_VAL($idx_query_p1, "NO_CFG_DA_PCF") == 1 )  { exit_collision=7 EXITSUB() EXIT() }
      if( VAR_VAL(-1, "OnBubble") == 1 )                  { exit_collision=8 EXITSUB() EXIT() }
   }

   //procedura riportata da Metron/Freeway
   //da correggere e gestire correttamente tutti gil angolo
   PROCEDURA BdmCollision_30MM
   {
      BdmCollision_Local_Result = 0

      GOSUB Exit_BdmCollision
      if( exit_collision ==1  )  { EXITSUB() }
      //if( $exit==1 )                   { EXITSUB() }

      $wk_idx_a_sx = -1
      $wk_idx_a_dx = -1
      $wk_base_0_abs = 0
      $wk_base_3_abs = 0

      $wk_vado_a = "XXX"

      //Luca 23/04/2021
      if( NOME(ATTUALE()) == "Modulo_368" )
      {
         $wk_i = 1
         while ( $wk_i <= $query_p1 )
         {
            if( NOME($query_p1[$wk_i]) == "Colonna_30MM" ) { BdmCollision_Local_Result = 1 }
            $wk_i = $wk_i + 1
         }

         if( BdmCollision_Local_Result == 1 ) { EXITSUB() }
      }

      $wk_i = 1
      while ( $wk_i <= $query_p1 )
      {
         if( NOME($query_p1[$wk_i]) == "Colonna_30MM" )
         {
            DelFromArray(-1,"query_p1",0,$query_p1[$wk_i],"")
            $wk_i = $wk_i - 1
         }

         $wk_i = $wk_i + 1
      }

      if( $query_p1>1 )
      {
         $wk_i = 1

         while ( $wk_i <= $query_p1 )
         {
            $wk_idx_temp = $query_p1[$wk_i]

            SET_#($wk_idx_temp)

            $wk_base_0 = #base_0.x
            $wk_base_3 = #base_3.x

            if( $wk_i==1 )
            {
               $wk_base_0_abs = $wk_base_0
               $wk_base_3_abs = $wk_base_3

               $wk_idx_a_sx = $wk_idx_temp
               $wk_idx_a_dx = $wk_idx_temp
            }

            if( $wk_base_0 < $wk_base_0_abs )  {  $wk_base_0_abs=$wk_base_0  $wk_idx_a_sx=$wk_idx_temp }
            if( $wk_base_3 > $wk_base_3_abs )  {  $wk_base_3_abs=$wk_base_3  $wk_idx_a_dx=$wk_idx_temp }

            //DEBUG
            //DISPLAY2(STRCAT("Idx = ",STR(idx_att),"\nCollido con:",NOME($wk_idx_temp),"\nbase_0_abs=",STR($wk_base_0_abs),"\nbase_3_abs=",STR($wk_base_3_abs)))
            $wk_i = $wk_i + 1

         }

         $wk_diff_x1  = ABS(base_0.x-$wk_base_3_abs)
         $wk_diff_x2  = ABS(base_3.x-$wk_base_0_abs)

         if( $wk_diff_x1 > $wk_diff_x2 )
         {
            //devo andare a sx
            $idx_query_p1 = $wk_idx_a_sx
            $wk_vado_a = "SX"
         }
         else
         {
            //devo andare a dx
            $idx_query_p1 = $wk_idx_a_dx
            $wk_vado_a = "DX"
         }

       // DEBUG
       // DISPLAY2(STRCAT("base_0_abs=",STR($wk_base_0_abs),"\nbase_3_abs=",STR($wk_base_3_abs),"\n$wk_vado_a=",$wk_vado_a,"\n$idx_query_p1=",NOME($idx_query_p1),"[",STR($idx_query_p1),"]"))

      }
      else
      {
         if( $query_p1>0 )  { $idx_query_p1 = $query_p1[1] }
         else               { EXITSUB() }
      }

      if( IS_IDX($idx_query_p1)!=1 )    { EXITSUB() }

      ok = 0

      nome_idx_query_p1 = NOME($idx_query_p1)
      nome_att          = NOME(idx_att)
      if( nome_idx_query_p1 == "Fianco_30MM" )
      {
         if( IS_MATCH( nome_att,"Ripiano*30MM*")==1 )   { ok=1 }
      }

      if( IS_MATCH( nome_idx_query_p1,"Ripiano*30MM")==1 )
      {
         if( IS_MATCH( nome_att,"Fianco_30MM")==1 )   { ok=1 }
      }

      if( IS_MATCH( nome_att,"Modulo*368")==1 )
      {
         if( IS_MATCH( nome_idx_query_p1,"Fianco_30MM")==1 )   { ok=1 }
      }

      $wk_diff_x = 0
      $wk_diff_y = 0
      if ( ok > 0 & exit_collision == 0)
      {
         SET_#($idx_query_p1)

         if( $query_p1 > 1 )
         {
           if( STRCMP($wk_vado_a,"SX")==0 )
           {
               $wk_snap_x = #base_0.x - X
               $wk_sono_andato_a = "SX"
           }
           else
           {
               $wk_snap_x = #base_3.x
               $wk_sono_andato_a = "DX"
           }
         }
         else
         {
            // Eugenio 11.12.15 Se arrivo qui la collisione c'č e va gestita a seconda della parete
            if(ABS(base_3.x-base_0.x) > ABS(base_3.z-base_0.z) & ABS(base_3.z-base_0.z)<1 )
            {
               if(base_3.x>base_0.x)
               {
                  $wk_diff_x1  = ABS(base_0.x-#base_3.x)
                  $wk_diff_x2  = ABS(base_3.x-#base_0.x)
               }
               if(base_0.x>base_3.x)
               {
                  $wk_diff_x1  = ABS(base_3.x-#base_0.x)
                  $wk_diff_x2  = ABS(base_0.x-#base_3.x)
               }

               if( $wk_diff_x1 > $wk_diff_x2 )
               {
                  // caso in cui vado a sx
                  $wk_snap_x = #base_0.x - X
                  $wk_sono_andato_a = "SX"
                  $wk_diff_x = -$wk_diff_x2
               }
               else
               {
                  // caso in cui vado a dx
                  $wk_snap_x = #base_3.x
                  $wk_sono_andato_a = "DX"
                  $wk_diff_x = $wk_diff_x1
               }

               $wk_snap_y   = base_0.y
               $wk_snap_z   = base_0.z
               $wk_snap_ang = ANG_TOT2(idx_att)
               COMANDO2(STRCAT("EDITPOS_REL ",STR(idx_att),
                              " ",STR($wk_diff_x),
                              " ",STR(0),
                              " ",STR(0),
                              " ",STR(0)))
               //$exit=1
               BdmCollision_Local_Result = 1
            }
            else
            {
               if(ABS(base_3.z-base_0.z) > ABS(base_3.x-base_0.x) & ABS(base_3.x-base_0.x)<1 )
               {
                  $wk_diff_z1 = 0
                  $wk_diff_z2 = 0

                  if(base_3.z>base_0.z)
                  {
                     $wk_diff_z1  = ABS(base_0.z-#base_3.z)
                     $wk_diff_z2  = ABS(base_3.z-#base_0.z)
                  }
                  if(base_0.x>base_3.x)
                  {
                     $wk_diff_z1  = ABS(base_3.z-#base_0.z)
                     $wk_diff_z2  = ABS(base_0.z-#base_3.z)
                  }

                  if( $wk_diff_z1 > $wk_diff_z2 )
                  {
                     // caso in cui vado a sx
                     $wk_snap_z = #base_0.z - X
                     $wk_sono_andato_a = "SX"
                     $wk_diff_z = -$wk_diff_z2
                  }
                  else
                  {
                     // caso in cui vado a dx
                     $wk_snap_z = #base_3.z
                     $wk_sono_andato_a = "DX"
                     $wk_diff_z = $wk_diff_z1
                  }

                  $wk_snap_x   = base_0.x
                  $wk_snap_y   = base_0.y
                  $wk_snap_ang = ANG_TOT2(idx_att)
                  COMANDO2(STRCAT("EDITPOS_REL ",STR(idx_att),
                                 " ",STR(0),
                                 " ",STR(0),
                                 " ",STR($wk_diff_z),
                                 " ",STR(0)))
                  //$exit=1
                  BdmCollision_Local_Result = 1
               }
               else
               {
                  // non so come spostarlo (sono su una parete con angolo diverso da 90 gradi segnalo collisione!
                  ok = 0
               }
            }

         }
      }
   }

   PROCEDURA OnChangedVar_Prof_30MM
   {
      if( $ChangedIdx!=ATTUALE() ) { EXITSUB() }

      if( VAR_VAL_STR(ATTUALE(),"TipoRipianoStr") == "RIPIANO_SCH" ) { EXITSUB() }

      if( $ChangedVar == "Z" )     { $L30_PROFONDITA = Z }
   }

   PROCEDURA CtrlSchiena_TrovaElementiVicini_30MM
   {
      if( ACTION()<=0 | ACTION()==2 | COMPONENDO() )  { EXITSUB() }

      if( $OnLoadOrder )                             { EXITSUB() }

      idx_ele_sx = -1      nome_ele_sx = ""
      idx_ele_dx = -1      nome_ele_dx = ""
      idx_ele_up = -1      nome_ele_up = ""
      idx_ele_dw = -1      nome_ele_dw = ""

      BOX_MODE(0)
      NEAR_GLOBALE2("wk_ele_up",idx_cnear_up,1,"*")
      NEAR_GLOBALE2("wk_ele_dw",idx_cnear_dw,1,"*")
      NEAR_GLOBALE2("wk_ele_sx",idx_cnear_sx,1,"*")
      NEAR_GLOBALE2("wk_ele_dx",idx_cnear_dx,1,"*")

      i = 1
      while ( i <= wk_ele_up )
      {
         if( NOME(wk_ele_up[i]) == "Fianco_30MM"
           | NOME(wk_ele_up[i]) == "Ripiano_30MM"
           | NOME(wk_ele_up[i]) == "RipianoVetro_30MM"
           | NOME(wk_ele_up[i]) == "Modulo_368"
           | NOME(wk_ele_up[i]) == "ModuloGiorno_368" ) { idx_ele_up = wk_ele_up[i] }
         i = i + 1
      }

      i = 1
      while ( i <= wk_ele_dw )
      {
         if( NOME(wk_ele_dw[i]) == "Fianco_30MM"
           | NOME(wk_ele_dw[i]) == "Ripiano_30MM"
           | NOME(wk_ele_dw[i]) == "RipianoVetro_30MM"
           | NOME(wk_ele_dw[i]) == "Modulo_368"
           | NOME(wk_ele_dw[i]) == "ModuloGiorno_368" ) { idx_ele_dw = wk_ele_dw[i] }
         i = i + 1
      }

      i = 1
      while ( i <= wk_ele_sx )
      {
         if( NOME(wk_ele_sx[i]) == "Fianco_30MM"
           | NOME(wk_ele_sx[i]) == "Ripiano_30MM"
           | NOME(wk_ele_sx[i]) == "Modulo_368"
           | NOME(wk_ele_sx[i]) == "ModuloGiorno_368" ) { idx_ele_sx = wk_ele_sx[i] }
         i = i + 1
      }

      i = 1
      while ( i <= wk_ele_dx )
      {
         if( NOME(wk_ele_dx[i]) == "Fianco_30MM"
           | NOME(wk_ele_dx[i]) == "Ripiano_30MM"
           | NOME(wk_ele_dx[i]) == "Modulo_368"
           | NOME(wk_ele_dx[i]) == "ModuloGiorno_368" ) { idx_ele_dx = wk_ele_dx[i] }
         i = i + 1
      }

      if( IS_IDX(idx_ele_sx) ) { nome_ele_sx = NOME(idx_ele_sx) }
      if( IS_IDX(idx_ele_dx) ) { nome_ele_dx = NOME(idx_ele_dx) }
      if( IS_IDX(idx_ele_up) ) { nome_ele_up = NOME(idx_ele_up) }
      if( IS_IDX(idx_ele_dw) ) { nome_ele_dw = NOME(idx_ele_dw) }
   }

   //Luca 18/03/2021 0024743: 30MM - Schienale vano
   //PROCEDURA Ctrl_Schiena_VerificaPosizione_30MM
   //{
   //   ScriviSuLog( 0 , "Ctrl_Schiena_VerificaPosDim_30MM" , "START" )
   //
   //   WITH_ALIAS("$wk_sch","Schiena30MM")
   //
   //   if( $wk_sch == 0 ) { EXITSUB() }
   //
   //   $wk_CG_Blocca  = 0
   //   $wk_CG_Items   = 0
   //   $wk_CG_Tipo    = "BLOCCO"
   //   $wk_CG_Msg     = MSG(1260)
   //   $wk_CG_Info    = STRCAT(">> ", MSG(1261),"\n\n>> ", MSG(1262))
   //
   //   $wk_i = 1
   //   while ( $wk_i <= $wk_sch )
   //   {
   //      $wk_idx_test =  $wk_sch[$wk_i]
   //
   //      //- se la larghezza nominale dello schienale č <1472, questo dev'essere contenuto tra due fianchi 30 mm e sopra e/o sotto puņ avere un contenitore 368
   //      //- se la larghezza nominale dello schienale č >=1472 deve obbligatoriamente essere contenuto tra 4 elementi 30mm
   //
   //      SET_#($wk_idx_test)
   //
   //      $wk_blocca_sch = 0
   //
   //      if( VAR_VAL($wk_idx_test,"X") < 1472 )
   //      {
   //         $wk_blocca_sch = 1
   //         if( IS_IDX(#idx_ele_sx) == 1 & IS_IDX(#idx_ele_dx) )
   //         {
   //            if( NOME(#idx_ele_sx) == "Fianco_30MM"
   //              & NOME(#idx_ele_dx) == "Fianco_30MM" ) { $wk_blocca_sch = 0 }
   //         }
   //      }
   //      else
   //      {
   //         $wk_blocca_sch = 1
   //         if( IS_IDX(#idx_ele_sx) == 1 & IS_IDX(#idx_ele_dx) == 1
   //           & IS_IDX(#idx_ele_up) == 1 & IS_IDX(#idx_ele_dw) == 1  )
   //         {
   //            if( NOME(#idx_ele_sx) == "Fianco_30MM"
   //              | NOME(#idx_ele_sx) == "Ripiano_30MM" )
   //            {
   //               if( NOME(#idx_ele_dx) == "Fianco_30MM"
   //                 | NOME(#idx_ele_dx) == "Ripiano_30MM" )
   //               {
   //                  if( NOME(#idx_ele_up) == "Fianco_30MM"
   //                    | NOME(#idx_ele_up) == "Ripiano_30MM" )
   //                  {
   //                     if( NOME(#idx_ele_dw) == "Fianco_30MM"
   //                       | NOME(#idx_ele_dw) == "Ripiano_30MM" ) { $wk_blocca_sch = 0 }
   //                  }
   //               }
   //            }
   //         }
   //      }
   //
   //      if( $wk_blocca_sch ) { AddItem2Array(-1,"wk_CG_Items",$wk_idx_test,"") }
   //
   //      $wk_i = $wk_i + 1
   //   }
   //
   //   if( $wk_CG_Items > 0 ) { $wk_CG_Blocca = 1 }
   //
   //   ScriviSuLog( log , "Ctrl_Schiena_VerificaPosDim_30MM" , "END" )
   //   GOSUB CG_CFO_FineControllo
   //}

   //Luca 13/05/2021 controllo che i ripiani non sporgano dai fianchi (mantis 24980)
   PROCEDURA Ctrl_Ripiani_Allineamento_30MM
   {
      ScriviSuLog( 0 , "Ctrl_Ripiani_Allineamento_30MM" , "START" )

      $wk_CG_Nome    = "Ctrl_Ripiani_Allineamento_30MM"
      $wk_CG_Blocca  = 0
      $wk_CG_Items   = 0
      $wk_CG_Tipo    = "BLOCCO"
      //$wk_CG_Msg     = MSG(1280)
      $wk_CG_Msg     = MSG(1312)
      $wk_CG_Info    = ""

      WITH_ALIAS("$wk_rip","Rip30MM")

      $wk_i = 1
      while ( $wk_i <= $wk_rip )
      {
         $wk_idx_rip = $wk_rip[$wk_i]

         //Simone 24/10/2022
         if( VAR_VAL($wk_idx_rip,"FLAG_Speciale") == 1 ) { $wk_CG_Tipo = "NO_BLOCCO" }

         $wk_idx_fia_sx = -1
         $wk_idx_fia_dx = -1

         if( IsIdx($wk_idx_rip,"idx_fia_sx")  ) { $wk_idx_fia_sx = VAR_VAL($wk_idx_rip,"idx_fia_sx") }
         if( IsIdx($wk_idx_rip,"idx_fia_dx")  ) { $wk_idx_fia_dx = VAR_VAL($wk_idx_rip,"idx_fia_dx") }

         ScriviSuLog( 0 , "Ctrl_Ripiani_Allineamento_30MM" , STRCAT("$wk_idx_rip =",STR($wk_idx_rip), " $wk_idx_fia_sx=",STR($wk_idx_fia_sx) , " $wk_idx_fia_dx=",STR($wk_idx_fia_dx) ))

         SET_#($wk_idx_rip)
         $wk_b0 = #base_0  $wk_b0.y = 0
         $wk_b1 = #base_1  $wk_b1.y = 0

         //Luca 31/03/2022
         $wk_RIP_B0 = #base_0
         $wk_RIP_A0 = #alto_0

         $wk_ang_rip = ANG_TOT_NOR($wk_idx_rip)

         //verifico lato SX
         $wk_idx_fia_test = $wk_idx_fia_sx
         $wk_lato = "SX"
         GOSUB Sub_Ctrl_Ripiani_Allineamento_30MM

         //verifico lato DX
         $wk_idx_fia_test = $wk_idx_fia_dx
         $wk_lato = "DX"
         GOSUB Sub_Ctrl_Ripiani_Allineamento_30MM

         $wk_i = $wk_i + 1
      }

      ScriviSuLog( 0 , "Ctrl_Ripiani_Allineamento_30MM" , "END" )

      if( $wk_CG_Items > 0 ) { $wk_CG_Blocca = 1 }
      GOSUB CG_CFO_FineControllo
   }

   PROCEDURA Sub_Ctrl_Ripiani_Allineamento_30MM
   {
      if( IS_IDX($wk_idx_fia_test) != 1 ) { EXITSUB() }

      SET_#($wk_idx_fia_test)
      $wk_fb0 = #base_0  $wk_fb0.y = 0
      $wk_fb1 = #base_1  $wk_fb1.y = 0

      if( VAR_EXIST($wk_idx_fia_test,"base_0_ctrl") )
      {
         $wk_fb0 = #base_0_ctrl  $wk_fb0.y = 0
         $wk_fb1 = #base_1_ctrl  $wk_fb1.y = 0
      }

      //Luca 04/04/2022
      if( VAR_EXIST($wk_idx_fia_test,"base_0_np") )
      {
         $wk_FIA_B0.y = #base_0_np.y
         $wk_FIA_A0.y = #base_0_np.y
      }

      $wk_px1 = INTERFERISCI( $wk_b0 , $wk_ang_rip , $wk_fb0 , $wk_fb1 )
      $wk_px2 = INTERFERISCI( $wk_b1 , $wk_ang_rip , $wk_fb0 , $wk_fb1 )

      ScriviSuLog( 0 , "Ctrl_Ripiani_Allineamento_30MM" , STRCAT("$wk_idx_rip =",STR($wk_idx_rip)," $wk_px1 = ",STR($wk_px1.x)  ," $wk_px2 = ",STR($wk_px2.x) ))

      $wk_rip_sporge = 0

      if( $wk_px1.x == $ERR_INTERFERISCI
        | $wk_px1.y == $ERR_INTERFERISCI
        | $wk_px1.z == $ERR_INTERFERISCI  ) { $wk_rip_sporge = 1 }

      if( $wk_px2.x == $ERR_INTERFERISCI
        | $wk_px2.y == $ERR_INTERFERISCI
        | $wk_px2.z == $ERR_INTERFERISCI  ) { $wk_rip_sporge = 1 }

      if( $wk_rip_sporge )   { AddItem2Array(-1,"wk_CG_Items",$wk_idx_rip,"") }

      //Luca 31/03/2022
      //aggiungo controllo limiti inserimenti
      //SOPRA:
      //    - filo alto fianco/ripiano
      //    - se non a filo DEVONO esserci almeno 80 mm dall'alto del fianco
      //SOTTO:
      //    - filo basso fianco/ripiano
      //    - se non a filo DEVONO esserci almeno 35 mm dal basso del fianco
      $wk_ok_sopra = 1
      $wk_ok_sotto = 1

      $wk_FIA_B0 = #base_0
      $wk_FIA_A0 = #alto_0

      //Luca 04/04/2022
      if( VAR_EXIST($wk_idx_fia_test,"base_0_np") )
      {
         $wk_FIA_B0.y = #base_0_np.y
         $wk_FIA_A0.y = #base_0_np.y
      }

      //CONTROLLO SOPRA
      if( $wk_RIP_A0.y <= $wk_FIA_A0.y  )
      {
         if( ABS($wk_RIP_A0.y - $wk_FIA_A0.y) > 0.1
           & ABS($wk_RIP_A0.y - $wk_FIA_A0.y) < 80   ) { $wk_ok_sopra = 0 }
      }

      //CONTROLLO SOTTO
      if( $wk_RIP_B0.y >= $wk_FIA_B0.y  )
      {
         if( ABS($wk_RIP_B0.y - $wk_FIA_B0.y) > 0.1
           & ABS($wk_RIP_B0.y - $wk_FIA_B0.y) < 35   ) { $wk_ok_sotto = 0 }
      }

      if( $wk_ok_sotto == 0
        | $wk_ok_sopra == 0 )   { AddItem2Array(-1,"wk_CG_Items",$wk_idx_rip,"") }


      ScriviSuLog( 0 , "Ctrl_Ripiani_Allineamento_30MM" , STRCAT("$wk_idx_rip =",STR($wk_idx_rip)," " ,$wk_lato,  " sporge = ",STR($wk_rip_sporge) ))
   }

   //Luca 13/05/2021 controllo collisioni tra elementi 30MM (mantis 24980)
   PROCEDURA Ctrl_Collisioni_30MM
   {
      ScriviSuLog( 0 , "Ctrl_Collisioni_30MM" , "START" )

      $wk_CG_Nome    = "Ctrl_Collisioni_30MM"
      $wk_CG_Blocca  = 0
      $wk_CG_Items   = 0
      $wk_CG_Tipo    = "NO_BLOCCO"
      $wk_CG_Msg     = MSG(1281)

      $wk_str = 0
      STRUTTURE("$wk_str_tmp")

      $wk_i = 1
      while ( $wk_i <= $wk_str_tmp )
      {
         if( NOME($wk_str_tmp[$wk_i]) == "Fianco_30MM"
           | NOME($wk_str_tmp[$wk_i]) == "Schiena_30MM"
           | NOME($wk_str_tmp[$wk_i]) == "Ripiano_30MM"
           | NOME($wk_str_tmp[$wk_i]) == "RipianoVetro_30MM" ) { AddItem2Array(-1,"wk_str",$wk_str_tmp[$wk_i],"") }

         $wk_i = $wk_i + 1
      }

      $wk_CG_Collision = 1


      $wk_jj = 1
      while ( $wk_jj <= $wk_str )
      {
         $wk_idx_str = $wk_str[$wk_jj]

         $wk_collision_result = -1
         COMANDO2(STRCAT("M4_COLLISION ",STR($wk_idx_str)))

         //eccezioni
         if( $wk_collision_result > 0 )
         {
            if( NOME($wk_idx_str) == "Schiena_30MM"
              & VAR_VAL_STR($wk_collision_result,"TipoRipianoStr") == "RIPIANO_SCH" ) { $wk_collision_result = -1 }

            if( NOME($wk_collision_result) == "Schiena_30MM"
              & VAR_VAL_STR($wk_idx_str,"TipoRipianoStr") == "RIPIANO_SCH" )          { $wk_collision_result = -1  }
         }

         if( $wk_collision_result > 0 )
         {
             AddItem2Array(-1,"wk_CG_Items",$wk_idx_str,"")

             //HI($wk_idx_str,1)
             //DISPLAY2(STRCAT( "COLLIDE CON $wk_collision_result=",STR($wk_collision_result)))
             //HI($wk_idx_str,0)
         }

         $wk_jj = $wk_jj + 1
      }

      $wk_CG_Collision = 0

      ScriviSuLog( 0 , "Ctrl_Collisioni_30MM" , "END" )

      if( $wk_CG_Items > 0 ) { $wk_CG_Blocca = 1 }

      GOSUB CG_CFO_FineControllo
   }

   //LZ 18/06/2021: controllo la fattiblitą del led
   PROCEDURA Ctrl_Led_Fatt_30MM
   {
      ScriviSuLog( 0 , "Ctrl_Led_Fatt_30MM" , "START" )

      $wk_CG_Nome    = "Ctrl_Led_Fatt_30MM_1"
      $wk_CG_Blocca  = 0
      $wk_CG_Items   = 0
      $wk_CG_Tipo    = "BLOCCO"
      $wk_CG_Msg     = MSG(1211)

      WITH_ALIAS("$wk_led","Led_30MM")

      //Controllo tipo mensola
      $wk_i = 1
      while ( $wk_i <= $wk_led )
      {
         $wk_idx_led = $wk_led[$wk_i]

         $wk_idx_rip = PADRE($wk_idx_led,1)

         if( NOME($wk_idx_rip) == "Ripiano_30MM"
           & VAR_VAL_STR( $wk_idx_rip, "TipoRipianoStr") != "RIPIANO" ) { AddItem2Array(-1,"wk_CG_Items",$wk_idx_rip,"") }

         $wk_i = $wk_i + 1
      }

      if( $wk_CG_Items > 0 ) { $wk_CG_Blocca = 1 }
      GOSUB CG_CFO_FineControllo

   #ifdef AGE;RIV
      //Controllo dimensioni
      $wk_CG_Nome    = "Ctrl_Led_Fatt_30MM_2"
      $wk_CG_Blocca  = 0
      $wk_CG_Items   = 0
      $wk_CG_Tipo    = "BLOCCO"
      $wk_CG_Msg     = MSG(1243)

      $wk_i = 1
      while ( $wk_i <= $wk_led )
      {
         $wk_idx_led = $wk_led[$wk_i]

         $wk_idx_rip = PADRE($wk_idx_led,1)

         SET_#($wk_idx_led)
         if( #X < #X_Min | #X > #X_Max  ) { AddItem2Array(-1,"wk_CG_Items",$wk_idx_rip,"") }

         $wk_i = $wk_i + 1
      }

      ScriviSuLog( 0 , "Ctrl_Led_Fatt_30MM" , "END" )

      if( $wk_CG_Items > 0 ) { $wk_CG_Blocca = 1 }
      GOSUB CG_CFO_FineControllo
   #endif
   }

   //Luca 13/05/2021
   //Inoltre ti chiederei di inserire anche a fine ordine il messaggio che avverte che ci sono dei led senza schienale per alloggiamento del trasformatore
   PROCEDURA Ctrl_Led_SenzaTrasf_30MM
   {
      ScriviSuLog( 0 , "Ctrl_Led_ST_30MM" , "START" )

      #ifdef AGE;RIV
         EXITSUB()
      #endif

      $wk_CG_Nome    = "Ctrl_Led_SenzaTrasf_30MM"
      $wk_CG_Blocca  = 0
      $wk_CG_Items   = 0
      $wk_CG_Tipo    = "NO_BLOCCO"
      $wk_CG_Msg     = MSG(1255)

      WITH_ALIAS("$wk_led","Led_30MM")

      $wk_i = 1
      while ( $wk_i <= $wk_led )
      {
         $wk_idx_led = $wk_led[$wk_i]

         $wk_idx_rip = PADRE($wk_idx_led,1)

         if( NOME($wk_idx_rip) == "Ripiano_30MM" )
         {
            SET_#($wk_idx_rip)

            if( IS_IDX(#idx_sch_dw) == 0
              & IS_IDX(#idx_sch_up) == 0
              & IS_IDX(#idx_tec_up) == 0
              & IS_IDX(#idx_tec_dw) == 0  )
            {
               AddItem2Array(-1,"wk_CG_Items",$wk_idx_led,"")
               //msg = STRCAT(MSG(1090),"\n",MSG(1255))
               //DISPLAY2(msg)
            }
         }

         $wk_i = $wk_i + 1
      }

      ScriviSuLog( 0 , "Ctrl_Led_ST_30MM" , "END" )

      if( $wk_CG_Items > 0 ) { $wk_CG_Blocca = 1 }
      GOSUB CG_CFO_FineControllo
   }

   PROCEDURA punti_DiagoLinea
   {
      if( VAR_NrSupporti == 0 )
      {
         base_0 = [0, 0, 0]    alto_0 = [0, Y, 0]
         base_1 = [0, 0, Z]    alto_1 = [0, Y, Z]
         base_2 = [X, 0, Z]    alto_2 = [X, Y, Z]
         base_3 = [X, 0, 0]    alto_3 = [X, Y, 0]
      }
      else
      {
         Alfa = VAR_Angolo
         //supporto a DX
         if( VAR_PosSupporto == 1 & VAR_NrSupporti ==1 ) {  Alfa = -1*VAR_Angolo  }

         base_0 = [0, 0, 0]
         base_1 = [0, 0, Z]
         base_2 = [X*COSENO(Alfa), X*SENO(Alfa), Z]
         base_3 = [base_2.x, base_2.y, 0]

         alto_0 = [-1*Y*SENO(Alfa), Y*COSENO(Alfa), 0]
         alto_1 = [-1*Y*SENO(Alfa), Y*COSENO(Alfa), Z]
         alto_2 = [alto_0.x + X*COSENO(Alfa), alto_0.y + X*SENO(Alfa), Z]
         alto_3 = [alto_2.x, alto_2.y , 0]
      }
   }

   PROCEDURA Ctrl_ColonnaTerra_30MM
   {
      ScriviSuLog( log , "Ctrl_ColonnaTerra_30MM" , "START" )

      WITH_ALIAS("$wk_col","ColonnaTerra_30MM")

      if( $wk_col == 0 ) { EXITSUB() }

      $wk_CG_Nome    = "Ctrl_ColonnaTerra_30MM_1"
      $wk_CG_Blocca  = 0
      $wk_CG_Items   = 0
      $wk_CG_Tipo    = "BLOCCO"
      $wk_CG_Msg     = MSG(1334)
      $wk_CG_Info    = ""

      //1. Le colonne a terra devono avere le schiene!
      //"Schienali necessari per la verticalitą dei fianchi"

      $wk_i = 1
      while ( $wk_i <= $wk_col )
      {
         $wk_idx_col  = $wk_col[$wk_i]
         $wk_idx_test = $wk_idx_col

         ScriviSuLog( log , "Ctrl_ColonnaTerra_30MM" , STRCAT("--> TESTO COLONNA ",STR($wk_idx_col) ))

         COMPONENTI2("$wk_sch",$wk_idx_col,"SchienaWeightless_30MM")

         SET_#($wk_idx_col)

         $wk_blocca = 0

         if( $wk_sch == 0 ) { $wk_blocca = 1 }

         if( $wk_sch > 0 )
         {
            if( VAR_VAL($wk_sch[1],"Y") < VAR_VAL($wk_idx_col,"Y") )  { $wk_blocca = 1 }
         }

         if( $wk_blocca
           & VAR_VAL($wk_idx_col,"FLAG_Speciale") == 0 ) { AddItem2Array(-1,"wk_CG_Items",$wk_idx_test,"") }

         $wk_i = $wk_i + 1
      }

      if( $wk_CG_Items > 0 ) { $wk_CG_Blocca = 1 }

      ScriviSuLog( log , "Ctrl_ColonnaTerra_30MM" , "END" )

      GOSUB CG_CFO_FineControllo

      //aggiungo avviso non bloccante per colonne a terra (sempre)
      $wk_CG_Nome    = "Ctrl_ColonnaTerra_30MM_2"
      $wk_CG_Blocca  = 1
      $wk_CG_Items   = 0
      $wk_CG_Tipo    = "NO_BLOCCO"
      $wk_CG_Msg     = MSG(1338)
      $wk_CG_Info    = ""

      //$wk_i = 1
      //while ( $wk_i <= $wk_col )
      //{
      //   $wk_idx_col  = $wk_col[$wk_i]
      //   $wk_idx_test = $wk_idx_col
      //
      //   if( VAR_VAL($wk_idx_test,"Z") <= 248 ) { AddItem2Array(-1,"wk_CG_Items",$wk_idx_test,"") }
      //
      //   $wk_i = $wk_i + 1
      //}
      //if( $wk_CG_Items > 0 ) { $wk_CG_Blocca = 1 }

      r = ArrayCopy(-1 ,"wk_col", STRCAT("wk_CG_Items"))

      GOSUB CG_CFO_FineControllo
   }

   PROCEDURA Ctrl_ColonnaWeightless_30MM
   {
      ScriviSuLog( log , "Ctrl_ColonnaWeightless_30MM" , "START" )

      WITH_ALIAS("wk_col_tmp","ColonnaWTL_30MM")

      //Simone 06/06/2022
      if( wk_col_tmp == 0 ) { EXITSUB() }

      $wk_col = 0
      wk_i = 1
      while ( wk_i<=wk_col_tmp )
      {
         wk_id = wk_col_tmp[wk_i]
         if( VAR_VAL(wk_id,"FLAG_Speciale") == 0 )
         {
            wk_ne = $wk_col + 1
            $wk_col = wk_ne
            $wk_col[wk_ne] = wk_id
         }

         wk_i = wk_i + 1
      }

      if( $wk_col == 0 ) { EXITSUB() }

      $wk_CG_Nome    = "Ctrl_ColonnaWeightless_30MM"
      $wk_CG_Blocca  = 0
      $wk_CG_Items   = 0
      $wk_CG_Tipo    = "BLOCCO"
      $wk_CG_Msg     = MSG(1286)
      $wk_CG_Info    = ""

      $wk_msg1 = 0
      $wk_msg2 = 0
      $wk_msg3 = 0
      $wk_msg4 = 0
      $wk_msg5 = 0
      $wk_msg7 = 0

      $wk_msg8 = 0
      $wk_msg9 = 0
      $wk_msg10 = 0

      $wk_i = 1
      while ( $wk_i <= $wk_col )
      {
         //1. NON POSSONO ESSERE PRESENTI COLONNE SINGOLE X <= 184
         //2. COLONNE CON Y <= 552 NON NECESSITANO DI SCHIENE
         //3. COLONNE CON Y > 552  & Y <= 1288 DEVONO AVERE ALMENO UNA SCHIENA Y >= 368
         //4. COLONNE CON Y > 1288 & Y <= 1472 DEVONO AVERE ALMENO DUE SCHIENE Y >= 368 OPPURE 1 DA Y >= 552
         //5. COLONNE CON Y > 1472 DEVONO AVERE ALMENO DUE SCHIENE Y >= 368
         //6. COLONNE SENZA PIASTRA
         //7. SCHIENE x VANO > 1288 CONTROLLO PRESENZA RIPIANI
         //8. COLONNE DI LARGHEZZA 368mm POSSONO ESSERE ALTE MASSIMO 2576mm
         //9. COLONNE DI LARGHEZZA 552mm POSSONO ESSERE ALTE MASSIMO 1840mm
         //10. COLONNE DI LARGHEZZA 736mm POSSONO ESSERE ALTE MASSIMO 1472mm

         $wk_idx_col  = $wk_col[$wk_i]
         $wk_idx_test = $wk_idx_col

         ScriviSuLog( log , "Ctrl_ColonnaWeightless_30MM" , STRCAT("--> TESTO COLONNA ",STR($wk_idx_col) ))

         SET_#($wk_idx_col)

         //TEST 1
         //1. NON POSSONO ESSERE PRESENTI COLONNE SINGOLE X <= 184
         if( #X <= 184 )
         {
            //verifico se ho schiena a sx e a dx
            BOX_MODE(0)
            NEAR("$wk_sx",#idx_cnear_sx,2,0,"Colonna_30MM")
            NEAR("$wk_dx",#idx_cnear_dx,2,0,"Colonna_30MM")

            $wk_col_sx = -1
            while( $wk_sx > 0)
            {
               if( $wk_sx[$wk_sx] != $wk_idx_col )  { $wk_col_sx = $wk_sx[$wk_sx] }
               $wk_sx = $wk_sx - 1
            }
            $wk_col_dx = -1
            while( $wk_dx > 0)
            {
               if( $wk_dx[$wk_dx] != $wk_idx_col )  { $wk_col_dx = $wk_dx[$wk_dx] }
               $wk_dx = $wk_dx - 1
            }

            if( $wk_col_sx <0 & $wk_col_dx < 0 )
            {
               AddItem2Array(-1,"wk_CG_Items",$wk_idx_test,"")
               //aggiungo solo una volta
               if( $wk_msg1 == 0  )
               {
                  $wk_CG_Info = STRCAT($wk_CG_Info,">> ", MSG(1287),"\n\n")
                  $wk_msg1 = 1
               }
            }

            ScriviSuLog( log , "Ctrl_ColonnaWeightless_30MM" , STRCAT("    $wk_col_sx=",STR($wk_col_sx) , " $wk_col_dx=",STR($wk_col_dx)   ))
         }

         COMPONENTI2("$wk_sch_tmp",$wk_idx_col,"Schiena*30MM")
         $wk_sch = 0

         $wk_j = 1
         while ( $wk_j <= $wk_sch_tmp )
         {
            if( NOME($wk_sch_tmp[$wk_j]) == "SchienaWeightless_30MM"
              | NOME($wk_sch_tmp[$wk_j]) == "SchienaVetroWTL_30MM"  ) { AddItem2Array(-1,"wk_sch",$wk_sch_tmp[$wk_j],"") }
            $wk_j = $wk_j + 1
         }

         ScriviSuLog( log , "Ctrl_ColonnaWeightless_30MM" , STRCAT("    SCHIENE=",STR($wk_sch) ))

         //TEST 3
         //3. COLONNE CON Y > 552  & Y <= 1288 DEVONO AVERE ALMENO UNA SCHIENA Y >= 368
         if( #Y > 552 & #Y <= 1288 )
         {
            $wk_sch368 = 0

            $wk_j = 1
            while ( $wk_j <= $wk_sch )
            {
               if( VAR_VAL($wk_sch[$wk_j],"Yt") >= 368 ) { $wk_sch368 = $wk_sch368 + 1 }
               $wk_j = $wk_j + 1
            }

            ScriviSuLog( log , "Ctrl_ColonnaWeightless_30MM" , STRCAT("    Y > 552 &  Y <= 1288 -- $wk_sch368=",STR($wk_sch368)))

            if( $wk_sch368 < 1 )
            {
               AddItem2Array(-1,"wk_CG_Items",$wk_idx_test,"")
               //aggiungo solo una volta
               if( $wk_msg2 == 0  )
               {
                  $wk_CG_Info = STRCAT($wk_CG_Info,">> ", MSG(1288),"\n\n")
                  $wk_msg2 = 1
               }
            }
         }

         //TEST 4
         //4. COLONNE CON Y > 1288 & Y <= 1472 DEVONO AVERE ALMENO DUE SCHIENE Y >= 368 OPPURE 1 DA Y >= 552
         if( #Y > 1288 & #Y <= 1472 )
         {
            $wk_sch368 = 0
            $wk_sch552 = 0

            $wk_j = 1
            while ( $wk_j <= $wk_sch )
            {
               if( VAR_VAL($wk_sch[$wk_j],"Yt") >= 368
                 & VAR_VAL($wk_sch[$wk_j],"Yt")  < 552 ) { $wk_sch368 = $wk_sch368 + 1 }

               if( VAR_VAL($wk_sch[$wk_j],"Yt") >= 552 ) { $wk_sch552 = $wk_sch552 + 1 }
               $wk_j = $wk_j + 1
            }

            ScriviSuLog( log , "Ctrl_ColonnaWeightless_30MM" , STRCAT("    Y > 1288 & Y <= 1472 -- $wk_sch368=",STR($wk_sch368) , "  $wk_sch552=",STR($wk_sch552)))

            if( $wk_sch368 < 2 & $wk_sch552 < 1 )
            {
               AddItem2Array(-1,"wk_CG_Items",$wk_idx_test,"")
               //aggiungo solo una volta
               if( $wk_msg3 == 0  )
               {
                  $wk_CG_Info = STRCAT($wk_CG_Info,">> ", MSG(1289),"\n\n")
                  $wk_msg3 = 1
               }
            }
         }

         //TEST 5
         //5. COLONNE CON Y > 1472 DEVONO AVERE ALMENO DUE SCHIENE Y >= 368
         if( #Y > 1472 )
         {
            $wk_sch368 = 0

            $wk_j = 1
            while ( $wk_j <= $wk_sch )
            {
               if( VAR_VAL($wk_sch[$wk_j],"Yt") >= 368 ) { $wk_sch368 = $wk_sch368 + 1 }
               $wk_j = $wk_j + 1
            }

            ScriviSuLog( log , "Ctrl_ColonnaWeightless_30MM" , STRCAT("    Y > 1104 -- $wk_sch368=",STR($wk_sch368) ))

            if( $wk_sch368 < 2 )
            {
               AddItem2Array(-1,"wk_CG_Items",$wk_idx_test,"")
               //aggiungo solo una volta
               if( $wk_msg4 == 0 )
               {
                  $wk_CG_Info = STRCAT($wk_CG_Info,">> ", MSG(1290),"\n\n")
                  $wk_msg4 = 1
               }
            }
         }

         //TEST 6
         //COLONNE SENZA PIASTRA
         if( VAR_VAL($wk_idx_col,"ConPiastraSup") == 0 )
         {
            AddItem2Array(-1,"wk_CG_Items",$wk_idx_test,"")
            //aggiungo solo una volta
            if( $wk_msg5 == 0  )
            {
               $wk_CG_Info = STRCAT($wk_CG_Info,">> ", MSG(1291),"\n\n")
               $wk_msg5 = 1
            }
         }

         //TEST 7
         //7. COLONNE x VANO >= 1288
         //devono avere almeno un ripiano
         $wk_j = 1
         while ( $wk_j <= $wk_sch )
         {
            if( VAR_VAL($wk_sch[$wk_j],"Y") >= 1288 )
            {

               $wk_idx_sch = $wk_sch[$wk_j]
               SET_#($wk_idx_sch)
               //controllo che ci siano davanti dei ripiani per x schienali
               NEAR_GLOBALE("$wk_rip",#idx_cnear,5,1,"Ripiano_30MM")

               //non devono esserci vani (tra ripiano e ripiano) > 1104
               SORT_POINT(#base_0,"$wk_rip","base_0")

               ScriviSuLog( log , "Ctrl_ColonnaWeightless_30MM" , STRCAT("TEST 7 - $wk_idx_sch=",STR($wk_idx_sch), " Y=",STR(VAR_VAL($wk_idx_sch,"Y")), " | - $wk_rip=",STR($wk_rip) ))

               //blocco
               $wk_ctrl_rip = 0

               if( $wk_rip < 3 )
               {
                  AddItem2Array(-1,"wk_CG_Items",$wk_idx_sch,"")
                  $wk_msg7 = 1
               }
               else
               {
                  $wk_ir = 2
                  while( $wk_ir <= $wk_rip )
                  {
                     $wk_idx_rip_pre = $wk_rip[$wk_ir - 1]
                     $wk_idx_rip_suc = $wk_rip[$wk_ir]

                     $wk_vano = VAR_VAL($wk_idx_rip_suc,"base_0.y") - VAR_VAL($wk_idx_rip_pre,"alto_0.y")

                     //ScriviSuLog( log , "Ctrl_ColonnaWeightless_30MM" , STRCAT("TEST 7 - $wk_idx_sch=",STR($wk_idx_sch), " RIP_PRE=",STR($wk_idx_rip_pre), " | RIP_SUC=",STR($wk_idx_rip_suc) ))

                     //if( $wk_vano < 368
                     //  | $wk_vano >= 1104 )
                     if( $wk_vano > 1104 )
                     {
                        AddItem2Array(-1,"wk_CG_Items",$wk_idx_sch,"")
                        $wk_ctrl_rip = 1

                        if( $wk_msg7 == 0 )
                        {
                           $wk_CG_Info = STRCAT($wk_CG_Info,">> ", MSG(1333),"\n\n")
                           $wk_msg7 = 1
                        }

                        $wk_ir = $wk_rip
                     }

                     $wk_ir = $wk_ir + 1
                  }
               }
            }
            $wk_j = $wk_j + 1
         }

         //8. COLONNE DI LARGHEZZA 368mm POSSONO ESSERE ALTE MASSIMO 2576mm
         //9. COLONNE DI LARGHEZZA 552mm POSSONO ESSERE ALTE MASSIMO 1840mm
         //10. COLONNE DI LARGHEZZA 736mm POSSONO ESSERE ALTE MASSIMO 1472mm
         if( #X == 368 & #Y > 2576 )
         {
            AddItem2Array(-1,"wk_CG_Items",$wk_idx_test,"")
            //aggiungo solo una volta
            if( $wk_msg8 == 0  )
            {
               $wk_CG_Info = STRCAT($wk_CG_Info,">> ", MSG(1335),"\n\n")
               $wk_msg8 = 1
            }
         }

         if( #X == 552 & #Y > 1840 )
         {
            AddItem2Array(-1,"wk_CG_Items",$wk_idx_test,"")
            //aggiungo solo una volta
            if( $wk_msg9 == 0  )
            {
               $wk_CG_Info = STRCAT($wk_CG_Info,">> ", MSG(1336),"\n\n")
               $wk_msg9 = 1
            }
         }

         if( #X == 736 & #Y > 1472 )
         {
            AddItem2Array(-1,"wk_CG_Items",$wk_idx_test,"")
            //aggiungo solo una volta
            if( $wk_msg10 == 0  )
            {
               $wk_CG_Info = STRCAT($wk_CG_Info,">> ", MSG(1337),"\n\n")
               $wk_msg10 = 1
            }
         }

         $wk_i = $wk_i + 1
      }

      if( $wk_CG_Items > 0 ) { $wk_CG_Blocca = 1 }


      ScriviSuLog( log , "Ctrl_ColonnaWeightless_30MM" , "END" )

      GOSUB CG_CFO_FineControllo
   }

   PROCEDURA Ctrl_RipianiXBinarioEtVoila_30MM
   {
      ScriviSuLog( 0 , "Ctrl_RipianiXBinarioEtVoila_30MM" , "START" )

      WITH_VAR("$wk_rip_tmp","FLAG_BinAnta_EV",$num_con_figli,1,"1")

      if( $wk_rip_tmp == 0 )
      {
         ScriviSuLog( 0 , "Ctrl_RipianiXBinarioEtVoila_30MM" , "END" )
         EXITSUB()
      }

      $wk_rip = 0

      $wk_i = 1
      while ( $wk_i <= $wk_rip_tmp )
      {
         if( NOME($wk_rip_tmp[$wk_i]) == "Ripiano_30MM" ) { AddItem2Array(-1,"wk_rip",$wk_rip_tmp[$wk_i],"") }

         $wk_i = $wk_i + 1
      }

      if( $wk_rip == 0 )
      {
         ScriviSuLog( 0 , "Ctrl_RipianiXBinarioEtVoila_30MM" , "END" )
         EXITSUB()
      }

      $wk_CG_Nome    = "Ctrl_RipianiXBinarioEtVoila_30MM"
      $wk_CG_Blocca  = 0
      $wk_CG_Items   = 0
      $wk_CG_Tipo    = "BLOCCO"
      $wk_CG_Msg     = MSG(1296)
      $wk_CG_CodDBG  = "480"

      $wk_i = 1
      while ( $wk_i <= $wk_rip )
      {
         $wk_idx_rip  = $wk_rip[$wk_i]
         $wk_idx_test = $wk_idx_rip

         ScriviSuLog( log , "Ctrl_RipianiXBinarioEtVoila_30MM" , STRCAT("--> TESTO RIPIANO ",STR($wk_idx_rip) ))

         SET_#($wk_idx_rip)

         $wk_con_top = 0
         if( IsIdx($wk_idx_rip,"idx_top") )  { $wk_con_top = 1 }

         $wk_con_bin_inferiore = 0
         $wk_con_bin_carter = 0
         BOX_MODE(0)
         NEAR_GLOBALE("$wk_bin_anta_ev", #idx_cnear_fr_bin, 1, 1, "Binario_EtVoila")
         $wk_j = 1
         while ( $wk_j <= $wk_bin_anta_ev )
         {
            $wk_idx_binario = $wk_bin_anta_ev[$wk_j]

            if( VAR_VAL($wk_idx_binario,"TipoBinario") == 0 )      { $wk_con_bin_inferiore   = 1 }
            if( VAR_VAL($wk_idx_binario,"BinarioSupCarter") == 1 ) { $wk_con_bin_carter   = 1 }

            $wk_j = $wk_j + 1
         }

         //controllo la presenza di top e/o binario
         //se ripiani < 1840 DEVONO avere o top o binario con carter

         if( #alto_0.y <= 1840 & $wk_con_bin_inferiore == 0 )
         {
            if( $wk_con_top == 0 & $wk_con_bin_carter == 0 )
            {
               AddItem2Array(-1,"wk_CG_Items",$wk_idx_test,"")
               ScriviSuLog( 0 , "Ctrl_RipianiXBinarioEtVoila_30MM" , "NO TOP")
            }
         }

         ////verifico il tipo di binario
         //if( IsIdx($wk_idx_rip,"idx_bin_anta_ev") )
         //{
         //   $wk_idx_binario = VAR_VAL($wk_idx_rip,"idx_bin_anta_ev")
         //
         //   if( VAR_VAL($wk_idx_binario,"TipoBinario") == 1
         //     | VAR_VAL($wk_idx_binario,"TipoBinario") == 2 )
         //   {
         //      if( VAR_VAL($wk_idx_binario,"BinarioSupCarter") == 0 )
         //      {
         //         if( #alto_0.y <= 1840 )
         //         {
         //            $wk_idx_topv = VAR_VAL($wk_idx_rip,"idx_top")
         //            if( IS_IDX($wk_idx_topv) == 0
         //              | VAR_EXIST($wk_idx_rip,"idx_top")==0  )
         //            {
         //               AddItem2Array(-1,"wk_CG_Items",$wk_idx_test,"")
         //               ScriviSuLog( 0 , "Ctrl_RipianiXBinarioEtVoila_30MM" , "NO TOP")
         //            }
         //         }
         //      }
         //   }
         //}

         $wk_i = $wk_i + 1
      }

      if( $wk_CG_Items > 0 ) { $wk_CG_Blocca = 1 }

      ScriviSuLog( 0 , "Ctrl_RipianiXBinarioEtVoila_30MM" , "END" )

      GOSUB CG_CFO_FineControllo
   }

   PROCEDURA Ctrl_Fianco_Int_EtVoila_30MM
   {
      //cerco i fianchi 30MM
      WITH_ALIAS("$wk_fia_30MM","Fia30MM")
      if( $wk_fia_30MM == 0 ) { EXITSUB() }

      $wk_cg_fia_int_err = 0

      j = 1
      while( j <= $wk_fia_30MM )
      {
         $wk_fia_att = $wk_fia_30MM[j]
         SET_#($wk_fia_att)

         //cerco il binario superiore
         wk_bin_sup = 0

         BOX_MODE(0)
         NEAR_GLOBALE2("wk_bin",#idx_cnear_fr,1,"Binario_EtVoila")
         i = 1
         while( i <= wk_bin & wk_bin_sup == 0 )
         {
            if( VAR_VAL(wk_bin[i],"TipoBinario") == 1 ) { wk_bin_sup = 1 }
            i = i + 1
         }

         //valuto i ripiani 30MM vicini
         wk_rip_sx_ok = 0
         wk_rip_dx_ok = 0

         NEAR_GLOBALE2("wk_rip_sx",#idx_cnear_sx,1,"Ripiano_30MM")
         NEAR_GLOBALE2("wk_rip_dx",#idx_cnear_dx,1,"Ripiano_30MM")

         if( wk_rip_sx > 0 & wk_rip_dx > 0 )
         {
            i = 1
            while( i <= wk_rip_sx & wk_rip_sx_ok == 0 )
            {
               if( VAR_VAL(wk_rip_sx[i],"FLAG_BinAnta_EV") == 1 ) { wk_rip_sx_ok = 1 }
               i = i + 1
            }

            i = 1
            while( i <= wk_rip_dx & wk_rip_dx_ok == 0 )
            {
               if( VAR_VAL(wk_rip_dx[i],"FLAG_BinAnta_EV") == 1 ) { wk_rip_dx_ok = 1 }
               i = i + 1
            }
         }

         if( wk_bin_sup   == 1
           & wk_rip_sx_ok == 1
           & wk_rip_dx_ok == 1 )
         {
            if(#Y < 368 )
            {
               $wk_cg_fia_int_err = $wk_cg_fia_int_err + 1
               VAR_VALUE_SET(-1, STRCAT("wk_cg_fia_int_err_##",STR($wk_cg_fia_int_err)), $wk_fia_att)
            }
         }

        j = j + 1
      }

      if( $wk_cg_fia_int_err > 0 )
      {
         $wk_CG_Ctrl_Count = VAR_VAL(-1,"wk_CG_Ctrl_Count") + 1

         VAR_VALUE_SET(-1,STRCAT("wk_CG_Ctrl_BLO_",STR($wk_CG_Ctrl_Count)), 1)
         VAR_VALUESTR_SET(-1,STRCAT("wk_CG_Ctrl_TIP_",STR($wk_CG_Ctrl_Count)), "BLOCCO")
         VAR_VALUESTR_SET(-1,STRCAT("wk_CG_Ctrl_MSG_",STR($wk_CG_Ctrl_Count)), MSG(1339))
         r = ArrayCopy(-1 ,"wk_cg_fia_int_err", STRCAT("wk_CG_Ctrl_ARR_",STR($wk_CG_Ctrl_Count)))
      }
   }

   PROCEDURA Ctrl_30MM_Posizionamento
   {
      WITH_ALIAS( "$wk_fia_30mm", "Fia30MM")
      if( $wk_fia_30mm == 0 ) { EXITSUB() }

      $wk_CG_Nome    = "Ctrl_30MM_Posizionamento"
      $wk_CG_Blocca  = 0
      $wk_CG_Items   = 0
      $wk_CG_Tipo    = "BLOCCO"
      $wk_CG_Msg     = "Elemento 30MM non posizionato correttamente."
      $wk_CG_Info    = ""

      $wk_fia_30mm_num = 1
      while( $wk_fia_30mm_num <= $wk_fia_30mm )
      {
         $wk_fia_30mm_att = $wk_fia_30mm[$wk_fia_30mm_num]
         $wk_fia_30mm_att_ang = ANG_TOT_NOR($wk_fia_30mm_att)
         $wk_fia_30mm_att_terra    = VAR_VAL( $wk_fia_30mm_att, "wk_A_TERRA")
         $wk_fia_30mm_att_parete   = VAR_VAL( $wk_fia_30mm_att, "wk_A_PARETE")
         $wk_fia_30mm_att_soffitto = VAR_VAL( $wk_fia_30mm_att, "FLAG_Weightless")

         $wk_fia_30mm_att_near_sx = $wk_fia_30mm_att
         if( IsIdx( $wk_fia_30mm_att, "idx_cnear_sx")) { $wk_fia_30mm_att_near_sx = VAR_VAL( $wk_fia_30mm_att, "idx_cnear_sx") }

         $wk_fia_30mm_att_near_dx = $wk_fia_30mm_att
         if( IsIdx( $wk_fia_30mm_att, "idx_cnear_dx")) { $wk_fia_30mm_att_near_dx = VAR_VAL( $wk_fia_30mm_att, "idx_cnear_dx") }


         $wk_fia_30mm_blocco = -2
         if( $wk_fia_30mm_att_terra != 1
           & $wk_fia_30mm_att_parete != 1
           & $wk_fia_30mm_att_soffitto != 1 )
         {
            AddItem2Array_IfNotExist( -1, "wk_CG_Items", $wk_fia_30mm_att, "")
            $wk_CG_Info = STRCAT( $wk_CG_Info, "- Il fianco ", APICI(), "[", STR($wk_fia_30mm_att), "] - ", VAR_VAL_STR( $wk_fia_30mm_att, "DescEdit__"), APICI(), " non č fissato a muro e non appoggia a terra.\n\n")
         }

         BOX_MODE(0)
         NEAR_GLOBALE2( "$wk_fia_30mm_att_rip", $wk_fia_30mm_att_near_sx, 1, "Ripiano_30MM")
         NEAR_GLOBALE2( "$wk_fia_30mm_att_rip_dx", $wk_fia_30mm_att_near_dx, 1, "Ripiano_30MM")
         MergeArray2Array( -1, "wk_fia_30mm_att_rip_dx", "wk_fia_30mm_att_rip")

         $wk_fia_30mm_att_rip_num = 1
         while( $wk_fia_30mm_att_rip_num <= $wk_fia_30mm_att_rip )
         {
            $wk_fia_30mm_att_rip_att = $wk_fia_30mm_att_rip[$wk_fia_30mm_att_rip_num]
            $wk_fia_30mm_att_rip_att_ang = ANG_TOT_NOR($wk_fia_30mm_att_rip_att)

            if( ABS($wk_fia_30mm_att_rip_att_ang - $wk_fia_30mm_att_ang) > 0.1)
            {
               AddItem2Array_IfNotExist( -1, "wk_CG_Items", $wk_fia_30mm_att, "")
               AddItem2Array_IfNotExist( -1, "wk_CG_Items", $wk_fia_30mm_att_rip_att, "")
               $wk_CG_Info = STRCAT( $wk_CG_Info, "- Il fianco ", APICI(), "[", STR($wk_fia_30mm_att), "] - ", VAR_VAL_STR( $wk_fia_30mm_att, "DescEdit__"), APICI(),
                                                   " e il ripiano ", APICI(), "[", STR($wk_fia_30mm_att_rip_att), "] - ", VAR_VAL_STR( $wk_fia_30mm_att_rip_att, "DescEdit__"), APICI(), " sono orientati in modo errato l'uno rispetto all'altro.\n\n")
            }

            $wk_fia_30mm_att_rip_num = $wk_fia_30mm_att_rip_num + 1
         }

         $wk_fia_30mm_num = $wk_fia_30mm_num + 1
      }

      if( $wk_CG_Items > 0 ) { $wk_CG_Blocca = 1 }

      GOSUB CG_CFO_FineControllo
   }

   PROCEDURA SchienaVetWTL_TrovaLivelli
   {
      liv2add = 0
      COMPONENTI2("rip",idx_ref,"Ripiano_30MM")
      col_b0 = VAR_VAL(idx_ref,"base_0.y")

      SET_#(idx_ref)
      SORT_POINT(#base_0,"rip","base_0")

      //elimino sempre gli ultimi 2 (non possibile su ultimo vano)
      i = 1
      while ( i <= rip - 2 )
      {
         SET_#(rip[i])
         liv_new =  #base_0.y - col_b0 + #Y/2

         ok_rip = 1

         if( VAR_VAL_STR(rip[i],"TipoRipianoStr") == "RIPIANO_SCH" ) { ok_rip = 0 }

         //se sopra o sotto ho una schiena vetro, non considero il ripiano
         if( IsIdx(rip[i],"idx_ripV_up")
           | IsIdx(rip[i],"idx_ripV_dw") ) { ok_rip = 0 }

         if( IsIdx(rip[i],"idx_schWTL_up")
           | IsIdx(rip[i],"idx_schWTL_dw") ) { ok_rip = 0 }

         //verifico il ripiano sucessivo
         if( i != rip )
         {
           if( IsIdx(rip[i+1],"idx_ripV_up") ) { ok_rip = 0 }

           if( IsIdx(rip[i+1],"idx_schWTL_up") ) { ok_rip = 0 }

            if( VAR_VAL_STR(rip[i+1],"TipoRipianoStr") == "RIPIANO_SCH" ) { ok_rip = 0 }
         }

         if( ok_rip ) { AddItem2Array(ATTUALE(),"liv2add",liv_new,"") }

         ////no su ripiano gią per schienal
         //if( VAR_VAL_STR(rip[i],"TipoRipianoStr") != "RIPIANO_SCH"
         //  & IsIdx(rip[i],"idx_ripV_up")==0
         //  & IsIdx(rip[i],"idx_ripV_dw")==0  )
         //{
         //   AddItem2Array(ATTUALE(),"liv2add",liv_new,"")
         //}

         i = i + 1
      }
   }

   PROCEDURA SchienaWTL_TrovaLivelli
   {
      liv2add = 0
      COMPONENTI2("rip",idx_ref,"Ripiano_30MM")
      col_b0 = VAR_VAL(idx_ref,"base_0.y")

      SET_#(idx_ref)
      SORT_POINT(#base_0,"rip","base_0")

      i = 1
      while ( i <= rip )
      {
         SET_#(rip[i])
         liv_new =  #base_0.y - col_b0 + #Y/2

         ok_rip = 1

         if( VAR_VAL_STR(rip[i],"TipoRipianoStr") == "RIPIANO_SCH" ) { ok_rip = 0 }

         //se sopra o sotto ho una schiena vetro, non considero il ripiano
         if( IsIdx(rip[i],"idx_ripV_up")
           | IsIdx(rip[i],"idx_ripV_dw") ) { ok_rip = 0 }

         if( IsIdx(rip[i],"idx_schWTL_up")
           | IsIdx(rip[i],"idx_schWTL_dw") ) { ok_rip = 0 }

         //verifico il ripiano sucessivo
         if( i != rip )
         {
           if( IsIdx(rip[i+1],"idx_ripV_up") ) { ok_rip = 0 }

           if( IsIdx(rip[i+1],"idx_schWTL_up") ) { ok_rip = 0 }
         }

         if( i == rip & i > 1  )
         {
            if( IsIdx(rip[rip-1],"idx_ripV_dw") ) { ok_rip = 0 }
            if( IsIdx(rip[rip-1],"idx_schWTL_dw") ) { ok_rip = 0 }

            if( VAR_VAL_STR(rip[rip-1],"TipoRipianoStr") == "RIPIANO_SCH" ) { ok_rip = 0 }
         }


         if( ok_rip ) { AddItem2Array(ATTUALE(),"liv2add",liv_new,"") }

         ////no su ripiano gią per schienale
         //if( VAR_VAL_STR(rip[i],"TipoRipianoStr") != "RIPIANO_SCH"
         ////no su ultimo ripiano
         //  //& liv_new < VAR_VAL(idx_ref,"Y") - 20  )
         //  )
         //{
         //   AddItem2Array(ATTUALE(),"liv2add",liv_new,"")
         //}

         i = i + 1
      }
   }
}

Funzioni
{
   void ChiediMisureInserimento ( number idx )
   {
      if( ACTION() != 2 | $OnLoadOrder != 0 | VAR_EXIST(idx,"copied__")==1 ) { EXITSUB() }

      if( $CNP__ == 1 | $CNP ==1  )                                          { EXITSUB() }

      if( VAR_VAL(idx,"NoChiediMisureOnInsert") ==1 )  { EXITSUB() }

      //Luca 20/07/2021
      if( VAR_VAL(idx,"DELETE_ME") ==1 )  { EXITSUB() }

      if( VAR_VAL(idx,"steso") == 1 )  { EXITSUB() }

      terna = "XYZ"

      if( NOME(idx) == "Fianco_30MM" )       { terna = "YZX" }
      if( NOME(idx) == "Ripiano_30MM" )      { terna = "XZY" }
      if( NOME(idx) == "RipianoVetro_30MM" ) { terna = "XZY" }

      if( NOME(idx) == "Contenitore_30MM" )  { terna = "YZX" }

      //Luca 20/07/2021
      if( NOME(idx) == "Colonna_30MM"     )  { terna = "YZX" }

      if( NOME(idx) == "Teca_30MM" )         { terna = "XYZ" }

      if( NOME(idx) == "MensolaLib_AIR" )    { terna = "XZY" }

      DlgGetDimensioni(idx,terna,"Inserimento")
   }

   void DlgGetDimensioni ( number idx , string misure , string chiamata_da )
   {
      dim1 = LEFT( misure , 1 )
      dim2 = STRMID( 1 ,1 , misure )
      dim3 = RIGHT( misure , 1 )

      $wk_idx = idx

      $wk_titolo = "Configurazione misure"

      $wk_dlg_img = STRCAT($path_bdm,"bmp\Dialog\SM_Fianco30MM.png")

      if( NOME(idx) == "Ripiano_30MM" | NOME(idx) == "RipianoVetro_30MM" )
      {
         $wk_dlg_img = STRCAT($path_bdm,"bmp\Dialog\SM_Ripiano30MM.png")
      }

      if( NOME(idx) == "MensolaLib_AIR" )
      {
         $wk_dlg_img = STRCAT($path_bdm,"bmp\Dialog\SM_Ripiano30MM.png")
      }

      $wk_dim1 = VAR_VAL(idx,dim1)
      $wk_dim2 = VAR_VAL(idx,dim2)
      $wk_dim3 = VAR_VAL(idx,dim3)

      //COPIO VARIABILI E MODO
      $SM_DIM1 = VAR_VAL(idx,dim1)
      $SM_DIM2 = VAR_VAL(idx,dim2)
      $SM_DIM3 = VAR_VAL(idx,dim3)

      if( IS_MATCH(NOME(idx),"*30MM") == 1 )
      {
         if( $L30_PROFONDITA > 0 )
         {
            if( VAR_VAL(idx,"Z_Max") > 0 )
            {
               if( $L30_PROFONDITA <= VAR_VAL(idx,"Z_Max") )
               {
                  if( dim1 == "Z" ) { $SM_DIM1 = $L30_PROFONDITA }
                  if( dim2 == "Z" ) { $SM_DIM2 = $L30_PROFONDITA }
                  if( dim3 == "Z" ) { $SM_DIM3 = $L30_PROFONDITA }
               }
            }
            else
            {
               if( dim1 == "Z" ) { $SM_DIM1 = $L30_PROFONDITA }
               if( dim2 == "Z" ) { $SM_DIM2 = $L30_PROFONDITA }
               if( dim3 == "Z" ) { $SM_DIM3 = $L30_PROFONDITA }
            }
         }

         if( VAR_VAL(idx,"FLAG_EtVoila") ==2  )
         {
            $SM_DIM2 = 435
            if( $L30_PROFONDITA == 299 ) { $SM_DIM2 = $L30_PROFONDITA }
         }
      }

      $wk_dim1_val = STR($SM_DIM1)
      $wk_dim2_val = STR($SM_DIM2)
      $wk_dim3_val = STR($SM_DIM3)

      $wk_dim1_mode = VAR_MODE(idx,dim1)
      $wk_dim2_mode = VAR_MODE(idx,dim2)
      $wk_dim3_mode = VAR_MODE(idx,dim3)

      $wk_dim1_menu = VAR_MENU(idx,dim1)
      $wk_dim2_menu = VAR_MENU(idx,dim2)
      $wk_dim3_menu = VAR_MENU(idx,dim3)

      VAR_SET_MODE(-1,"SM_DIM1",$wk_dim1_mode)
      VAR_SET_MODE(-1,"SM_DIM2",$wk_dim2_mode)
      VAR_SET_MODE(-1,"SM_DIM3",$wk_dim3_mode)

      VAR_SET_MENU(-1,"SM_DIM1",$wk_dim1_menu)
      VAR_SET_MENU(-1,"SM_DIM2",$wk_dim2_menu)
      VAR_SET_MENU(-1,"SM_DIM3",$wk_dim3_menu)

      //VERIFIO SE SONO EDITABILI
      $wk_dlg_dim1_edit = 1
      if( $wk_dim1_mode == $MODE_NONE
        | $wk_dim1_mode == $MODE_SHOWALWAYS ) { $wk_dlg_dim1_edit = 0 }

      $wk_dlg_dim2_edit = 1
      if( $wk_dim2_mode == $MODE_NONE
        | $wk_dim2_mode == $MODE_SHOWALWAYS ) { $wk_dlg_dim2_edit = 0 }

      $wk_dlg_dim3_edit = 1
      if( $wk_dim3_mode == $MODE_NONE
        | $wk_dim3_mode == $MODE_SHOWALWAYS ) { $wk_dlg_dim3_edit = 0 }

      //POSIZONE BOTTONI
      $wk_dlg_dim1_bpx = 100
      $wk_dlg_dim1_bpy = 190

      $wk_dlg_dim2_bpx = 230
      $wk_dlg_dim2_bpy = 70

      $wk_dlg_dim3_bpx = 210
      $wk_dlg_dim3_bpy = 365

      if( NOME(idx) == "Ripiano_30MM" | NOME(idx) == "RipianoVetro_30MM"
        | NOME(idx) == "MensolaLib_AIR"  )
      {
         $wk_dlg_dim1_bpx = 145
         $wk_dlg_dim1_bpy = 130

         $wk_dlg_dim2_bpx = 70
         $wk_dlg_dim2_bpy = 220

         $wk_dlg_dim3_bpx = 345
         $wk_dlg_dim3_bpy = 237
      }

      COMANDO2(STRCAT("run_dll_cmd bdmdialog MakeDialog ",APICI(),$path_bdm,"Dialog.txt|Misure3",APICI()))

      if( $DlgResult__ == 0 )
      {
         if( chiamata_da == "Inserimento" )
         {
            VAR_VALUE_SET(idx,"DELETE_ME",1)
            VAR_VALUE_SET(idx,"NO_GEST",1)
         }
         EXITSUB()
      }

      val_dim1 = VAR_VAL(idx,dim1)
      val_dim2 = VAR_VAL(idx,dim2)
      val_dim3 = VAR_VAL(idx,dim3)

      cmd = ""

      if( val_dim1 != $SM_DIM1 ) { cmd = STRCAT(cmd , " " , dim1 , "=" , STR($SM_DIM1)) }
      if( val_dim2 != $SM_DIM2 ) { cmd = STRCAT(cmd , " " , dim2 , "=" , STR($SM_DIM2)) }
      if( val_dim3 != $SM_DIM3 ) { cmd = STRCAT(cmd , " " , dim3 , "=" , STR($SM_DIM3)) }

      if( cmd != "" )
      {
         cmd = STRCAT("VAR_CHANGE 1 ",STR(idx) , cmd)
         COMANDO(cmd)
         COMANDO(STRCAT("RICALCOLA_UNA ",STR(idx), " no_agganciati //DlgGetDimensioni"))

         if( dim1 == "Z" ) { $L30_PROFONDITA = $SM_DIM1 }
         if( dim2 == "Z" ) { $L30_PROFONDITA = $SM_DIM2 }
         if( dim3 == "Z" ) { $L30_PROFONDITA = $SM_DIM3 }
      }

      DEL_VAR(-1,"SM_DIM1")
      DEL_VAR(-1,"SM_DIM2")
      DEL_VAR(-1,"SM_DIM3")
   }
}

Macro
{
   //#ifdef TEC;AZI
   //   Griglia30MM      "30MM: Attiva/Disattiva griglia"                     interattiva Attiva_Griglia_30MM
   //
   //   PuntiSnap30MM    "30MM: Attiva/Disattiva punti SNAP AGGIUNTIVI"       interattiva Attiva_SnapAggiuntivi_30MM
   //
   //   AllineaRip30MM   "30MM: Attiva/Disattiva allineamento ripiani auto"   interattiva Attiva_AllineaRipiano_30MM
   //#endif
}
