// ************************************************************************************
//
//  File Standard per la Gestione dei Meccanismi da Frontali
//  Gestisce Cerniere Battenti, Cerniere Ribalta-Vasistas braccetti, Paracolpi, Ferramente Generiche...
//  sia dal punto di vista CAM che dal punto di vista grafico con o senza sat (MdF_Sat.inc)
//
//  Questo file esiste da settembre 2011, se non l' hai modificato fin' ora perche' vuoi farlo oggi?
//
//  Se non ti chiami Raffaele Gasparini NON MODIFICARLO!, contatta il responsabile di questo file,
//  nonche' responsabile di tutto il CAM di Tesy da giugno 2007 (in Tesy da luglio 2003).
//  e responsabile grafica sat CerBat e Meccanismi Vas/Rib che rende Virtuo piu emozionale.
//
//  File Standard significa gestione uguale per tutti gli Ambienti, per qualsiasi Ambiente,
//  quindi distante da modifica puntuale per il caso specifico per un cliente-Ambiente specifico.
//  Eventualmente richiedi il manuale di oltre 90 pagine (e) un corso di 2 giorni a TV.
//
//  La modifica che intendi fare puo' essere che vada bene, quindi ben venga, ma per gestire un file
//  Standard la modifica stessa va condivisa con chi gestisce questo file da sempre per n-Ambienti.
//  In linea di massima se dal 2011 non hai mai visto questo file e non conosci il Cam-Standard
//  e' un po' difficile comprendere appieno questo file.
//  Su questo file passano almeno 200.000 ordini all' anno! gestiti tutti allo stesso modo!
//
//  Se non vuoi che il Bdm entri in questo file, quindi ignorare quello che fa questo file basta
//  che all' inizio dell' OnLoadOrder imposti la variabile Globale $MDFSys_Exit_Always = 1
//
// ************************************************************************************

// RICORDA SEMPRE: il Cam-Standard dalle versioni 2020 e' da ritenersi infallibile, perché da fine 2011
// ha girato tra i 18 e 23 milioni di pannelli all' anno,
// pertanto eventuali errori sono probabilmente da ricercare
// o nella Configurazione delle tabelle CAM
// o verifica se nel trace ci sono RICALCOLI da Bdm o dll non coerenti
// o potrebbe essere la versione M4 come successo con la 229 o la 11.325
// RICORDA SEMPRE: Il Cam-Standard non e' lento, e' il Bdm che potrebbe richiamare piu volte la MdF_ADD_Reg_Interat
// anche se ormai e' limitata dalla MdF_Ctrl_var_gest e MdF_Ctrl_var_gest_MdF, quindi la lentezza e' per forza da ricercare nei flussi Bdm
// e dll Gestionale
// Se un ordine supera i 15.000 idx dovrebbe essere ritenuto errato a priori.
// Un ordine con piu di 15.000 idx e' lento per antonomasia
// INSISTO: Questo file esiste da fine 2011 e dal 2021 e' in oltre 30 Ambienti tutti funzionanti, quindi se qualcosa
// non va, come sopra, verificare trace, versioniM4, modifiche utente fantasiose, eccetera.
// PER I POSTERI: prova ad impostare MdF_Load_COMANDO2=0 prima della GOSUB MdF_ADD_Reg_Interat e vedrai che non si blocca
// piu, il che non vuol dire che va bene MdF_Load_COMANDO2=0, vuol dire che e' sbagliato il flusso Bdm/dll/Metron che
// costringe a impostare MdF_Load_COMANDO2=0

Globali
  {
   VAR_Versione_MdF             "Versione file MdF"     "250526A"   NoSave

   VAR_Versione_MdF_New_Order   "versione MdF in creazione ordine"  ""
   VAR_Versione_MdF_Last_Save   "versione MdF ultimo salvataggio"   ""
   VAR_Versione_MdF_Last_Term   "versione MdF fine ordine"          ""

   MdF_TABLE_Var_DTP         ""  -1  NoSave
   MdF_TABLE_Var             ""  -1  NoSave
   MdF_TABLE_KeyFamRegFacc   ""  -1  NoSave
   MdF_TABLE_RegFacc         ""  -1  NoSave
   MdF_Sub_TabM4_Var         "Nome Sub dinamico da tabelle cam\Tab"  ""  NoSave

   MdF_CntEntry_TABLE_Var      ""  0  NoSave
   MdF_CntEntry_TABLE_Var_DTP  ""  0  NoSave
   MdF_CntEntry_TABLE_RegFacc  ""  0  NoSave
   MdF_CntEntry_TABLE_KeyFam   ""  0  NoSave

   MdF_AttrezzaRegFacc       "=1 Se M4 e' entrato in MdF_AttrezzaRegFacc"         -1    NoSave
   MdF_Load_att              "momento in cui sono aggiunti gli elementi MdF_"     ""    NoSave
   MdF_Visualize             "Visualizza grafica elementi MdF_ da cam.ini"        ""    NoSave
   MdF_display_err           "errori di parser su TabM4 intercettabili a Bdm"      0    NoSave
   MdF_Utente                "Visualizza MdF_ e li salva nel RIT ->da cam.ini"    "-1"  NoSave
   MdF_path_camini           ""                                                   ""    NoSave
   mdF_path_camini_exist     ""                                                   0     NoSave
   path_CAMTABMDF            ""                                                   ""    NoSave
   path_file_sat_MdF         ""                                                   ""    NoSave
  // 12.03.2024 Il vecchio non e' piu supportato da anni quindi sara sempre 1
   //MDFSys_NewRTA             "lettura NewRTA da ini"                              "-1"  NoSave
   MDFSys_NewRTA             "lettura NewRTA da ini"                              "1"  NoSave

   MdF_Load_pers             "Caricamento OnLoadedOrder MdF_ personalibile"       ""    NoSave
   MdF_Load_pers_CMD         "COMANDO o COMANDO2 OnLoadedOrder MdF_ pers"         -1    NoSave

   MDFSys_Load_ini           "Evento per aggiungere gli MdF_"                     ""    NoSave
   MDFSys_Load_Var_ini       "Sottochiave variabili da caricare subito"           ""    NoSave

   MDFSys_Exit_Always        "=1 non esegue nessuna operazione MdF_"              -1    NoSave

   mdf_path_DDP_gr           ""   ""                                                    NoSave
   // Se non si vogliono i trace da impostare a 1 su OnLaodOrder, eventualmente anche solo per ifdef RIV;AGE
   MdF_NO_LOGMSG             "Non scrive nel trace i LOGMSG di questo file"        0    NoSave

   MdF_LoadOrder             "18.01.2021 per svincolarsi da OnLoadOrder e o VAR_LOAD_ORDER"   -2    NoSave

  // Se serve al Bdm impostarla a 0 nel Bdm-cliente e alla fine della gestione rimetterla a 1
   // perche serve se l' elemento e' inserito da Listino
   MdF_Esegui_Show_Abilita      "Abilita/Disabilita Show Abilita On/Off"              1    NoSave
  // Di default ora la imposto di non farlo perche dipende se MdF_Load_COMANDO2=0 che vuol dire che già di per se il flusso ha qualcosa non standard
   MdF_Esegui_Show_Abilita_Act  "Abilita/Disabilita Show Abilita On/Off"             -1.1  NoSave

   OnChangedVar_CerniereBasette_proc "procedura personalizzata x CernBas"          "" NoSave
  }

Macro
{
   MDF_Load_MdFrontali    "Add Manual elements MdF_"     interattiva  MdF_CamMdFrontali_daMacro
}

Elemento MdF_CerniereBattenti
{
   Descrizione = "Contenitore grafica Cerniere"
   Code        = GRANT
   Gruppo      = "TMP"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   Alias         MdF_CAM;MdF_CerBat

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22
      HIDE  ""  1

      MdF_Apertura           "Apertura SX-DX"                      ""

      px_CerBat1             "Rientro in X della Cerniera"          0
      px_CerBat2             "Rientro in X della Cerniera"          0
      px_CerBat3             "Rientro in X della Cerniera"          0
      px_CerBat4             "Rientro in X della Cerniera"          0
      px_CerBat5             "Rientro in X della Cerniera"          0
      px_CerBat6             "Rientro in X della Cerniera"          0
      px_CerBat7             "Rientro in X della Cerniera"          0
      px_CerBat8             "Rientro in X della Cerniera"          0

      py_CerBat1             "Quota Y cerniera 1"                   0
      py_CerBat2             "Quota Y cerniera 2"                   0
      py_CerBat3             "Quota Y cerniera 3"                   0
      py_CerBat4             "Quota Y cerniera 4"                   0
      py_CerBat5             "Quota Y cerniera 5"                   0
      py_CerBat6             "Quota Y cerniera 6"                   0

      py_CerBat7             "Quota Y cerniera 7"                   0
      py_CerBat8             "Quota Y cerniera 8"                   0

      Battuta_X              "battuta in X rispetto al fianco"      0
      Battuta_Z              "battuta in Z rispetto al fianco"      0
      KeyFamRegFacc          "tipo posizionamento cerniere"        ""

      MdF_Utente             "Gestione cerniere da utente"         "-1"  NoSave

      // 19.06.2019 - mi dicono che serve per Virtuo
      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      GOSUB MdF_SetStato_NoGEST

      cam_KeyRegMdF = "CerBat"
      GOSUB MdF_Ctrl_save_prec
     // 23.05.2022
      if (MdF_Utente == "-1")  { MdF_Utente = $MdF_Utente }

      mdf_no_Save = 0
      // Se chiamo una ipotetica procedura MdF_noAUTO non passa quando escluso=1
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          if ( STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) == -1
             & STR_INDEX_OF(MdF_Utente, 0, "-1") == -1
             )
             { mdf_no_Save = 1 }

          if (VAR_EXIST(idx_att, "posY_Utente") != 1)  { mdf_no_Save = 2 }

          if (mdf_no_Save > 0)
             {
              MdF_comandoOnAUTO = 1
              COMANDO(STRCAT("NO_AUTO ", STR(idx_att), " SET"))
             }
         }

      if ( mdf_save_prec == 1
         | VAR_EXIST(idx_att, "posY_Utente") == 1
         )
         {
          MdF_comandoOnAUTO = -1
          // 25.11.2020
          if (VAR_VAL(PADRE(idx_att, 1), "MdF_Load_COMANDO2") == 1)
             { COMANDO2(STRCAT("NO_AUTO ", STR(idx_att))) }
          else
             { COMANDO(STRCAT("NO_AUTO ", STR(idx_att))) }
         }

      if (STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) > -1)  { HIDE = 3 }
   }

   Attrezza
   {
      base_0 = @base_0
      base_0.z = @base_0.z
      X = @X
      Y = @Y
      Z = @Z
   }

   Controlli
   {
      idx_att = ATTUALE()
      idx_CamMdF = PADRE(idx_att, 1)
      nome_CamMdF = NOME(idx_CamMdF)

      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")
      Z = VAR_VAL(idx_CamMdF, "Z")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      GOSUB MdF_Ctrl_Dim

      escluso = 0
      // Casi strani di Load_pers e Interat con COMANDO al posto di COMANDO2. 54196
      // Provvisorio per sicurezza. Comunque è un comando veloce
      COMPONENTI3("mdf_gia_inserito", idx_CamMdF, NOME(idx_att))
      if (mdf_gia_inserito > 1)
         {
          // 07.08.2024
          mdf_ins_utente = 0
          mdf_altro_padre = 0
          iu=1
          while (iu <= mdf_gia_inserito)
             {
              if (IS_MATCH(NOME(PADRE(mdf_gia_inserito[iu], 1)), "MECCANISM*_UTENTE*") )
                 { mdf_ins_utente = mdf_ins_utente+1 }
              else
                 {
                  // 03.12.2024
                  if (PADRE(mdf_gia_inserito[iu], 1) != PADRE(idx_att, 1) )
                     { mdf_altro_padre = mdf_altro_padre+1 }
                 }
              iu = iu+1
             }
          if (mdf_gia_inserito-mdf_ins_utente-mdf_altro_padre > 1)
             {
              // 17.10.2018
              if (VAR_VAL(idx_att, "mdf_rel_ADD_bas0y_Error") == 2 & VAR_VAL(idx_att, "mdf_rel_ADD_bas0y_LoadARF_Error") == 1)
                 { escluso = 1 }
              else
                 { COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // MdF_CerniereBattenti mdf_gia_inserito")) }
              EXITSUB()
             }
         }

      tLav = "CerBat"
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
      KeyFamRegFacc_CerBat = KeyFamRegFacc
      if (STRLEN(KeyFamRegFacc) <= 1)
         {
          // Se per un cambio variante o VarBdm le cerniere vanno escluse ma le ho gia inserite
          if (VAR_VAL(PADRE(idx_att, 1), "mdf_Load_save_prec") < 0)
             {
              if (ACTION() == 1  |  ACTION() == 3)
                 {
                  cmd_keyFamVuota = CMD()
                  if (CMD() == 0)  { escluso = 1 }
                 // 13.06.2022 A070966
                  if (CMD() == 1)  { escluso = 1 }
                 }
             }
          // 21.05.2024 006800 Strano non funzionasse, escluso non era a 1 anche se cmd_keyFamVuota valesse 1
          // Non dipende dalle ottimizzazioni aprile, maggio su questo file
          if (KeyFamRegFacc == "")
             {
              px_CerBat1 = 0
              py_CerBat1 = 0
              py_CerBat2 = 0
              py_CerBat3 = 0
              py_CerBat4 = 0
              py_CerBat5 = 0
              py_CerBat6 = 0
              py_CerBat7 = 0
              py_CerBat8 = 0
             }

          EXITSUB()
         }

      //COMANDO(STRCAT("LOGMSG Controlli MdF_CerniereBattenti idx=", STR(idx_att), " ACTION", STR(ACTION()), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))

      // Se il padre mi ha inserito non puo essere MdF_Apertura vuota. Puo succedere solo
      // se sono salvato nel rit e sull' OnLoadedOrder vengono lanciati dei VAR_CHANGE che
      // sputtano il flusso
      mdf_prosegui_action1 = 0
      if ( VAR_EXIST(idx_att, "MdF_Apertura") == 1
         & STRLEN(VAR_VAL_STR(idx_att, "MdF_Apertura")) < 1
         )
         { mdf_prosegui_action1 = 1 }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
     // 02.05.2024 Ottimizzazioni
      GOSUB MdF_Ctrl_var_cam_Init
      GOSUB MdF_ctrl_Change_Var_CAM

      if (mdf_ctrl_Change_Var_CAM > 0)
         {
          GOSUB MdF_VariabiliDaTipoPadri
          CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "keyGenericaMdF"
          GOSUB MdF_Variabili
          // 26.06.2024 Per compatibilità se prendo MdfSys_SbordoYInf,Sup da CerBat invece di usarli direttamente su RegFacc
          if (VAR_VAL(idx_att, "mdf_ctrl_Change_SbordoY") > 0)  { GOSUB MdF_Battuta_X }

          CHIAVE_TABVAR_MDF = "CerBat"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
          GOSUB MdF_Variabili
         }

      if ( IS_MATCH(MdF_Apertura, "SX*") != 1
         & IS_MATCH(MdF_Apertura, "DX*") != 1
         )
         { escluso = 1 }

      GOSUB MdF_Battuta_X

     // 05.10.2016
      GOSUB MdF_Ctrl_SbordoY_padre

     // 06.05.2024 Vedi mdf_ctrl_Change_Var_CAM <= 0
     // 20.05.2024 Per problemi 1023022113 CO80CASSINT2023 MdF_basy_CassInt1
      if (mdf_ctrl_Change_Var_CAM > 0)  { GOSUB Reg_pos_CerBat }
      else                              { GOSUB Reg_pos_CerBat_parziale }

      GOSUB Reg_CerBat_att

      GOSUB MdF_Sort_MCB_Ute_spostaCer

      GOSUB MdF_Battuta_X_After_RegFacc

      GOSUB MdF_Ctrl_limCerVic

      //COMANDO(STRCAT("LOGMSG Controlli MdF_CerniereBattenti-FINE idx=", STR(idx_att), " ACTION", STR(ACTION()), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))

      // RE_Control significa che l'ho ricalcolato almeno una volta quindi nella Macro CAM
      // non voglio fare la MdF_Ctrl_Cambiamenti
      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_ADD_when"), "first_OnMacroMdF") )
         { MdF_ADD_when = "RE_Control" }

      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)
         {
          MdF_ADD_when = "RE_Control"
          mdf_ricalc_Post_READD = 0
         // 03.11.2017
          DEL_VAR(idx_att, "mdf_ricalcola_daCerVic")
         }

     // 15.05.2017
      if (VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR") == 1)
         {
          DEL_VAR(idx_att, "ang_y")
          if (IS_MATCH(MdF_Apertura, "DX*") )
             { ang_y = -90 }
         }
      if (ABS(VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR")) > 1)
         {
          //DEL_VAR(idx_att, "ang_y")
          ang_y = -VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR")
          if (IS_MATCH(MdF_Apertura, "DX*") )
             {
              ang_y = VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR")
              if (Battuta_X == 0)  { Battuta_X = VAR_VAL(PADRE(idx_att, 1), "MdF_Battuta_X") }
             }
         }
     // 23.05.2022 Se arriva da VariabiliMdF.txt
      HIDE = 1
      if (STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) > -1)  { HIDE = 3 }

      mdf_LivSpostaCerUte = VAR_VAL(PADRE(idx_att, 1), "MdfSys_LivSpostaCerUte")-1
      mdf_CER_base0y_SpostataUtente1 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(1)))
      mdf_CER_base0y_SpostataUtente2 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(2)))
      mdf_CER_base0y_SpostataUtente3 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(3)))
      mdf_CER_base0y_SpostataUtente4 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(4)))
      mdf_CER_base0y_SpostataUtente5 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(5)))
      mdf_CER_base0y_SpostataUtente6 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(6)))
      mdf_CER_base0y_SpostataUtente7 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(7)))
      mdf_CER_base0y_SpostataUtente8 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(8)))
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_CernieraBasetta_Batt  cer1
   {
      @escluso = 1
      if (py_CerBat1 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      @base_0.y = base_0.y + py_CerBat1 + VAR_VAL(idx_att, "MdfSys_collY_sposta1") + VAR_VAL(idx_att, "MCB_Ute_spostaCer1")
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat1-Battuta_X
      @id_Cer = 1
      // 23.10.2018
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer2
   {
      @escluso = 1
      if (py_CerBat2 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      @base_0.y = base_0.y + py_CerBat2 + VAR_VAL(idx_att, "MdfSys_collY_sposta2") + VAR_VAL(idx_att, "MCB_Ute_spostaCer2")
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat2-Battuta_X
      @id_Cer = 2
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer3
   {
      @escluso = 1
      if (py_CerBat3 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat3 + VAR_VAL(idx_att, "MdfSys_collY_sposta3") + VAR_VAL(idx_att, "MCB_Ute_spostaCer3")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat3-Battuta_X
      @id_Cer = 3
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer4
   {
      @escluso = 1
      if (py_CerBat4 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat4 + VAR_VAL(idx_att, "MdfSys_collY_sposta4") + VAR_VAL(idx_att, "MCB_Ute_spostaCer4")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat4-Battuta_X
      @id_Cer = 4
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer5
   {
      @escluso = 1
      if (py_CerBat5 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat5 + VAR_VAL(idx_att, "MdfSys_collY_sposta5") + VAR_VAL(idx_att, "MCB_Ute_spostaCer5")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat5-Battuta_X
      @id_Cer = 5
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer6
   {
      @escluso = 1
      if (py_CerBat6 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat6 + VAR_VAL(idx_att, "MdfSys_collY_sposta6") + VAR_VAL(idx_att, "MCB_Ute_spostaCer6")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat6-Battuta_X
      @id_Cer = 6
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer7
   {
      @escluso = 1
      if (py_CerBat7 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat7 + VAR_VAL(idx_att, "MdfSys_collY_sposta7") + VAR_VAL(idx_att, "MCB_Ute_spostaCer7")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat7-Battuta_X
      @id_Cer = 7
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

  // 25.02.2020
   Posiziona MdF_CernieraBasetta_Batt  cer8
   {
      @escluso = 1
      if (py_CerBat8 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat8 + VAR_VAL(idx_att, "MdfSys_collY_sposta8") + VAR_VAL(idx_att, "MCB_Ute_spostaCer8")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat8-Battuta_X
      @id_Cer = 8
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Procedura MdF_noAUTO
   {
      cam_KeyRegMdF = "CerBat"
      if ( VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1
         & STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) == -1
         & mdf_save_prec == 0
         )
         {
          MdF_comandoOnAUTO = 2
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Procedura MdF_Ctrl_Post_RELATIVE_ADD
   {
     // 07.08.2024
      if (UN_PADRE("MECCANISM*_UTENTE*") )  { EXITSUB() }
      GOSUB MdF_Ctrl_Post_RELATIVE_ADD
   }

   Procedura MdF_Ctrl_ADD_TooEarly
   {
     // 07.08.2024
      if (UN_PADRE("MECCANISM*_UTENTE*") )  { EXITSUB() }
      GOSUB MdF_Ctrl_ADD_TooEarly
   }

   Procedura MdF_Ctrl_Cambiamenti
   {
      if (IS_IDX(idx_att) != 1)            { EXITSUB() }
      if (IS_IDX(PADRE(idx_att, 1)) != 1)  { EXITSUB() }

     // 07.08.2024
      if (UN_PADRE("MECCANISM*_UTENTE*") )  { EXITSUB() }

      if (VAR_EXIST(idx_att, "KeyFamRegFacc_att") != 1)
         {
          if ($MdF_NO_LOGMSG == 0)
             {
              COMANDO2(STRCAT("LOGMSG MdF_Ctrl_Cambiamenti senza KeyFamRegFacc_att ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
             }
          EXITSUB()
         }

      // Faccio comunque il test collisioni
      GOSUB MdF_CerBat_Collision

      if (VAR_EXIST(idx_att, "MdF_Cambiato") != 1)
         {
          // 03.02.2020 A784154 anche se dipende dal Bdm che calcola troppo tardi i punti notevoli Fianchi Ctrl_SxDx_Fianco 3
          // EXITSUB()
          GOSUB MdF_Battuta_X
          if (Battuta_X_att == Battuta_X)
             {
              // 24.02.2025
              // { EXITSUB() }
              // In caso ottimizza anche con | mdf_ctrl_Change_Var_CAM <= 0
              if (VAR_VAL(idx_att, "mdf_ricalc_from_Collision_Post") != 3)  { EXITSUB() }
             }
         }

      if (VAR_VAL(-1, "CAM_Visualize") > 99)
         { COMANDO2(STRCAT("LOGMSG { MdF_Ctrl_Cambiamenti MdF_Cambiato=", VAR_VAL_STR(idx_att, "MdF_Cambiato"), " su ", NOME(idx_att), " idx_att=", STR(idx_att), " ", DATA(0))) }

      //DISPLAY2(STRCAT("MdF_Cambiato=", MdF_Cambiato, " su ", NOME(idx_att), " idx_att=", STR(idx_att)))
      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
     // 20.05.2024 Ottimizzazioni
      GOSUB MdF_ctrl_Change_Var_CAM
      if (mdf_ctrl_Change_Var_CAM > 0)
         {
          GOSUB MdF_VariabiliDaTipoPadri
          CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "keyGenericaMdF"
         }
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili

      GOSUB MdF_Battuta_X
      GOSUB Reg_pos_CerBat
      GOSUB MdF_Battuta_X_After_RegFacc

      MdF_Cambiato_att = VAR_VAL_STR(idx_att, "MdF_Cambiato")
      bas0_att = base_0.y
      alt0_att = alto_0.y
      bas0_CamMdF = VAR_VAL(idx_CamMdF, "base_0.y")
      alt0_CamMdF = VAR_VAL(idx_CamMdF, "alto_0.y")

      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "MdF_CamMdFrontali") != 1)
         {
          GOSUB MdF_Cam_Elimina
         }

      if ( bas0_att == bas0_CamMdF  &  alt0_att == alt0_CamMdF
         & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "Dim*") != 1
         )
         { DEL_VAR(idx_att, "MdF_Cambiato") }

      if ( STRCMP(KeyFamRegFacc_att, KeyFamRegFacc) != 0
         | STRCMP(MdF_Aper_att, MdF_Apertura) != 0
         | X_att != X
         | Y_att != Y
         | px_CerBat1_att != px_CerBat1
         | py_CerBat1_att != py_CerBat1
         | py_CerBat2_att != py_CerBat2
         | py_CerBat3_att != py_CerBat3
         | py_CerBat4_att != py_CerBat4
         | py_CerBat5_att != py_CerBat5
         | py_CerBat6_att != py_CerBat6
         | py_CerBat7_att != py_CerBat7
         | py_CerBat8_att != py_CerBat8
         | Battuta_X_att != Battuta_X
         )
         {
          WITH_VAR_LOCAL(idx_att, "mdf_Visgraf", "escl_Grafica", 2, 1, "0")

          if (mdf_Visgraf <= 0)
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " x MdF_Ctrl_Cambiamenti ", MdF_Cambiato_att)) }
          else
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_Ctrl_Cambiamenti ", MdF_Cambiato_att)) }
          MdF_Cambiato_att = STRCAT(MdF_Cambiato_att, " , Ricalcolato")
         }

      if (VAR_VAL(-1, "CAM_Visualize") > 99)
         { COMANDO2(STRCAT("LOGMSG } MdF_Ctrl_Cambiamenti ", NOME(idx_att), " idx_att=", STR(idx_att), " ", DATA(0))) }
   }

   Procedura MdF_Ctrl_Cer_ChangeUte
   {
      if (IS_IDX(idx_att) != 1)            { EXITSUB() }
      if (IS_IDX(PADRE(idx_att, 1)) != 1)  { EXITSUB() }

     // 07.08.2024
      if (UN_PADRE("MECCANISM*_UTENTE*") )  { EXITSUB() }

      if (VAR_EXIST(idx_att, "KeyFamRegFacc_att") != 1)
         {
          if ($MdF_NO_LOGMSG == 0)
             {
              COMANDO2(STRCAT("LOGMSG MdF_Ctrl_Cer_ChangeUte senza KeyFamRegFacc_att ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
             }
          EXITSUB()
         }

      // Se l'utente cambia variabili di componenti sensibili devo per forza rileggere le tabelle
      // Basta richiamre questa procedura solo appunto al cambio di determinate situazioni
      // PEr un Gruppo Cerniere il tempo è comunque impercettibile
      mdf_prosegui_action1 = 2

      MdF_Ctrl_Cer_ChangeUte = 1

      GOSUB mdfsys_Collision_att

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
     // 24.05.2024 Ottimizzazioni. Per ora non la chiamo. Avrà senso chiamarla quando avrò testato piu ordini
     // GOSUB MdF_ctrl_Change_Var_CAM
     // 20.05.2024 Ottimizzazioni
      if (VAR_VAL(idx_att, "mdf_ctrl_Change_Var_CAM") > 0)
         {
          GOSUB MdF_VariabiliDaTipoPadri
          CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
          GOSUB MdF_Variabili
         }
      // 24.05.2024 Per ora rimangono fuori dall' if finchè non avrò testato altri ordini
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili

      //if (PADRE(idx_att, 1) == 79336)  { DISPLAY2(STRCAT("MdF_Ctrl_Cer_ChangeUte ", STR(VAR_VAL(idx_att, "mdf_ctrl_Change_Var_CAM")))) }

      GOSUB MdF_Battuta_X
      GOSUB Reg_pos_CerBat
      GOSUB MdF_Battuta_X_After_RegFacc

      GOSUB MdF_CerBat_Collision

      mdf_prosegui_action1 = 0
      MdF_Ctrl_Cer_ChangeUte = 0

      //COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_Ctrl_CollisionCer"))

      mdf_collisionCer_Change = 0
      iM=1
      while (VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(iM))) == 1)
         {
          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_att")) )
             {
              mdf_collisionCer_Change = 1
             }
         // 18.05.2021
          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM), "_y_mm")) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_y_mm_att")) )
             {
              mdf_collisionCer_Change = 2
             }
         // 13.03.2025 EM 05540
          if (VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_collY_sposta", STR(iM), "_att")) )
             {
              mdf_collisionCer_Change = 4
             }
          iM = iM+1
         }

     // 20.05.2024 Controllo se comunque cambia anche qualcosaltro. per 1023022113 CO80CASSINT2023 MdF_basy_CassInt1 post Ottimizzazioni
      if ( STRCMP(KeyFamRegFacc_att, KeyFamRegFacc) != 0
         | STRCMP(MdF_Aper_att, MdF_Apertura) != 0
         | X_att != X
         | Y_att != Y
         | px_CerBat1_att != px_CerBat1
         | py_CerBat1_att != py_CerBat1
         | py_CerBat2_att != py_CerBat2
         | py_CerBat3_att != py_CerBat3
         | py_CerBat4_att != py_CerBat4
         | py_CerBat5_att != py_CerBat5
         | py_CerBat6_att != py_CerBat6
         | py_CerBat7_att != py_CerBat7
         | py_CerBat8_att != py_CerBat8
         | Battuta_X_att != Battuta_X
         )
         { mdf_collisionCer_Change = 3 }

      if (mdf_collisionCer_Change > 0)
         { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x mdf_collisionCer MdF_Ctrl_Cer_ChangeUte")) }
   }
  // 10.05.2017
   Procedura MdF_CerBat_Collision_Post
   {
      if (IS_IDX(idx_att) != 1)            { EXITSUB() }
      if (IS_IDX(PADRE(idx_att, 1)) != 1)  { EXITSUB() }
     // 07.08.2024
      if (UN_PADRE("MECCANISM*_UTENTE*") )  { EXITSUB() }

      if (VAR_EXIST(idx_att, "KeyFamRegFacc_att") != 1)
         {
          if ($MdF_NO_LOGMSG == 0)
             {
              COMANDO2(STRCAT("LOGMSG MdF_CerBat_Collision_Post senza KeyFamRegFacc_att ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
             }
          EXITSUB()
         }

     // 03.02.2020 A784154 anche se dipende dal Bdm che calcola troppo tardi i punti notevoli Fianchi Ctrl_SxDx_Fianco 3
      GOSUB MdF_Battuta_X

      GOSUB mdfsys_Collision_att

     // 24.02.2025 NC MdF_nCestoInt
      GOSUB MdF_ctrl_Change_Var_CAM

     // 19.12.2023 A145055 MCB_ IngombroVasca
      idx_MdF_Var = idx_att
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili

      GOSUB MdF_CerBat_Collision

      mdf_collisionCer_Post = 0
      iM=1
      while (VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(iM))) == 1)
         {
          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_att")) )
             {
              mdf_collisionCer_Post = 1
             }

          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM), "_y_mm")) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_y_mm_att")) )
             {
              mdf_collisionCer_Post = 2
             }

         // 13.03.2025 come MdF_Ctrl_Cer_ChangeUte
          if (VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_collY_sposta", STR(iM), "_att")) )
             {
              mdf_collisionCer_Post = 4
             }

          iM = iM+1
         }

      mdf_ricalc_from_Collision_Post = 0
     // 03.02.2020 A784154 anche se dipende dal Bdm che calcola troppo tardi i punti notevoli Fianchi Ctrl_SxDx_Fianco 3
      if ( mdf_collisionCer_Post <= 0
         & Battuta_X_att != Battuta_X
         )
         {
          mdf_ricalc_from_Collision_Post = 1
          COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x Battuta_X punti notevoli Fianchi corretti troppo tardi MdF_CerBat_Collision_Post"))
         }

      if (mdf_collisionCer_Post > 0)
         {
          mdf_ricalc_from_Collision_Post = 2
          COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_CerBat_Collision_Post"))
         }

     // 24.02.2025 Se la KeyFamRegFacc rimane uguale ma dovevano cambiare solo le RegFacc uscirebbe
      if (mdf_ricalc_from_Collision_Post <= 0)
         {
          mdf_ricalc_from_Collision_Post = 3
          if (mdf_ctrl_Change_Var_CAM > 0  &  mdf_ctrl_Change_Var_CAM < 1)
             { COMANDO(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(idx_att), " // ", NOME(idx_att), " x mdf_ricalc_from_Collision_Post mdf_ctrl_Change_Var_CAM=", STR(mdf_ctrl_Change_Var_CAM))) }
          else
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x mdf_ricalc_from_Collision_Post mdf_ctrl_Change_Var_CAM=", STR(mdf_ctrl_Change_Var_CAM))) }
         }
   }

   // 06.10.2020
   Procedura MdF_CerBat_Msg_Collision
   {
     // 07.08.2024
      if (UN_PADRE("MECCANISM*_UTENTE*") )  { EXITSUB() }
      GOSUB MdF_CerBat_Msg_Collision
   }
}

//08.02.2024
Elemento MdF_CerniereBattVY1
{
   Descrizione = "Contenitore grafica Cerniere"
   Code        = GRANT
   Gruppo      = "TMP"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   Alias         MdF_CAM;MdF_CerBat

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22
      HIDE  ""  1

      MdF_Apertura           "Apertura SX-DX"                      ""

      px_CerBat1             "Rientro in X della Cerniera"          0
      px_CerBat2             "Rientro in X della Cerniera"          0
      px_CerBat3             "Rientro in X della Cerniera"          0
      px_CerBat4             "Rientro in X della Cerniera"          0
      px_CerBat5             "Rientro in X della Cerniera"          0
      px_CerBat6             "Rientro in X della Cerniera"          0
      px_CerBat7             "Rientro in X della Cerniera"          0
      px_CerBat8             "Rientro in X della Cerniera"          0

      py_CerBat1             "Quota Y cerniera 1"                   0
      py_CerBat2             "Quota Y cerniera 2"                   0
      py_CerBat3             "Quota Y cerniera 3"                   0
      py_CerBat4             "Quota Y cerniera 4"                   0
      py_CerBat5             "Quota Y cerniera 5"                   0
      py_CerBat6             "Quota Y cerniera 6"                   0

      py_CerBat7             "Quota Y cerniera 7"                   0
      py_CerBat8             "Quota Y cerniera 8"                   0

      Battuta_X              "battuta in X rispetto al fianco"      0
      Battuta_Z              "battuta in Z rispetto al fianco"      0
      KeyFamRegFacc          "tipo posizionamento cerniere"        ""

      MdF_Utente             "Gestione cerniere da utente"         "-1"  NoSave

      MdF_numVanoY           "Num vano in Y"                       1  NoSave

      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      GOSUB MdF_SetStato_NoGEST

      // 11.12.2024 spostata sopra
      cam_KeyRegMdF = "CerBat"
      GOSUB MdF_Ctrl_save_prec

      if (MdF_Utente == "-1")  { MdF_Utente = $MdF_Utente }

      mdf_no_Save = 0
      // Se chiamo una ipotetica procedura MdF_noAUTO non passa quando escluso=1
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          if ( STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) == -1
             & STR_INDEX_OF(MdF_Utente, 0, "-1") == -1
             )
             { mdf_no_Save = 1 }

          if (VAR_EXIST(idx_att, "posY_Utente") != 1)  { mdf_no_Save = 2 }

          if (mdf_no_Save > 0)
             {
              MdF_comandoOnAUTO = 1
              COMANDO(STRCAT("NO_AUTO ", STR(idx_att), " SET"))
             }
         }

      if ( mdf_save_prec == 1
         | VAR_EXIST(idx_att, "posY_Utente") == 1
         )
         {
          MdF_comandoOnAUTO = -1
          if (VAR_VAL(PADRE(idx_att, 1), "MdF_Load_COMANDO2") == 1)
             { COMANDO2(STRCAT("NO_AUTO ", STR(idx_att))) }
          else
             { COMANDO(STRCAT("NO_AUTO ", STR(idx_att))) }
         }

      if (STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) > -1)  { HIDE = 3 }
   }

   Attrezza
   {
      base_0 = @base_0
      base_0.z = @base_0.z
      X = @X
      Y = @Y
      Z = @Z
   }

   Controlli
   {
      idx_att = ATTUALE()
      idx_CamMdF = PADRE(idx_att, 1)
      nome_CamMdF = NOME(idx_CamMdF)

      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "MdF_VanoY1")
      Z = VAR_VAL(idx_CamMdF, "Z")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      //if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      GOSUB MdF_Ctrl_Dim

      escluso = 0
      COMPONENTI3("mdf_gia_inserito", idx_CamMdF, NOME(idx_att))
      if (mdf_gia_inserito > 1)
         {
          // 17.10.2018
          if (VAR_VAL(idx_att, "mdf_rel_ADD_bas0y_Error") == 2 & VAR_VAL(idx_att, "mdf_rel_ADD_bas0y_LoadARF_Error") == 1)
             { escluso = 1 }
          else
             { COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // MdF_CerniereBattVY mdf_gia_inserito")) }
          EXITSUB()
         }

      tLav = "CerBat"
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
     // 19.03.2024
      KeyFamRegFacc_VY = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_VY", STR(MdF_numVanoY), "_", tLav))
      if (STRLEN(KeyFamRegFacc_VY) > 1)  { KeyFamRegFacc = KeyFamRegFacc_VY }

      if (STRLEN(KeyFamRegFacc) <= 1)
         {
          // Se per un cambio variante o VarBdm le cerniere vanno escluse ma le ho gia inserite
          if (VAR_VAL(PADRE(idx_att, 1), "mdf_Load_save_prec") < 0)
             {
              if (ACTION() == 1  |  ACTION() == 3)
                 {
                  cmd_keyFamVuota = CMD()
                  if (CMD() == 0)  { escluso = 1 }
                  if (CMD() == 1)  { escluso = 1 }
                 }
             }
          EXITSUB()
         }

      //COMANDO(STRCAT("LOGMSG Controlli MdF_CerniereBattVY idx=", STR(idx_att), " ACTION", STR(ACTION()), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))

      // Se il padre mi ha inserito non puo essere MdF_Apertura vuota. Puo succedere solo
      // se sono salvato nel rit e sull' OnLoadedOrder vengono lanciati dei VAR_CHANGE che
      // sputtano il flusso
      mdf_prosegui_action1 = 0
      if ( VAR_EXIST(idx_att, "MdF_Apertura") == 1
         & STRLEN(VAR_VAL_STR(idx_att, "MdF_Apertura")) < 1
         )
         { mdf_prosegui_action1 = 1 }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili

      if ( IS_MATCH(MdF_Apertura, "SX*") != 1
         & IS_MATCH(MdF_Apertura, "DX*") != 1
         )
         { escluso = 1 }

      GOSUB MdF_Battuta_X

      //GOSUB MdF_Ctrl_SbordoY_padre
      MdfSys_SbordoYSup = 0

      GOSUB Reg_pos_CerBat
      GOSUB Reg_CerBat_att
      GOSUB MdF_Sort_MCB_Ute_spostaCer

      GOSUB MdF_Battuta_X_After_RegFacc

      GOSUB MdF_Ctrl_limCerVic

      //COMANDO(STRCAT("LOGMSG Controlli MdF_CerniereBattVY-FINE idx=", STR(idx_att), " ACTION", STR(ACTION()), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))

      // RE_Control significa che l'ho ricalcolato almeno una volta quindi nella Macro CAM
      // non voglio fare la MdF_Ctrl_Cambiamenti
      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_ADD_when"), "first_OnMacroMdF") )
         { MdF_ADD_when = "RE_Control" }

      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)
         {
          MdF_ADD_when = "RE_Control"
          mdf_ricalc_Post_READD = 0
          DEL_VAR(idx_att, "mdf_ricalcola_daCerVic")
         }

      if (VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR") == 1)
         {
          DEL_VAR(idx_att, "ang_y")
          if (IS_MATCH(MdF_Apertura, "DX*") )
             { ang_y = -90 }
         }
      if (ABS(VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR")) > 1)
         {
          ang_y = -VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR")
          if (IS_MATCH(MdF_Apertura, "DX*") )
             {
              ang_y = VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR")
              if (Battuta_X == 0)  { Battuta_X = VAR_VAL(PADRE(idx_att, 1), "MdF_Battuta_X") }
             }
         }
      HIDE = 1
      if (STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) > -1)  { HIDE = 3 }

      mdf_LivSpostaCerUte = VAR_VAL(PADRE(idx_att, 1), "MdfSys_LivSpostaCerUte")-1
      mdf_CER_base0y_SpostataUtente1 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(1)))
      mdf_CER_base0y_SpostataUtente2 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(2)))
      mdf_CER_base0y_SpostataUtente3 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(3)))
      mdf_CER_base0y_SpostataUtente4 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(4)))
      mdf_CER_base0y_SpostataUtente5 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(5)))
      mdf_CER_base0y_SpostataUtente6 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(6)))
      mdf_CER_base0y_SpostataUtente7 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(7)))
      mdf_CER_base0y_SpostataUtente8 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(8)))
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_CernieraBasetta_Batt  cer1
   {
      @escluso = 1
      if (py_CerBat1 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      @base_0.y = base_0.y + py_CerBat1 + VAR_VAL(idx_att, "MdfSys_collY_sposta1") + VAR_VAL(idx_att, "MCB_Ute_spostaCer1")
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat1-Battuta_X
      @id_Cer = 1

      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer2
   {
      @escluso = 1
      if (py_CerBat2 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      @base_0.y = base_0.y + py_CerBat2 + VAR_VAL(idx_att, "MdfSys_collY_sposta2") + VAR_VAL(idx_att, "MCB_Ute_spostaCer2")
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat2-Battuta_X
      @id_Cer = 2
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer3
   {
      @escluso = 1
      if (py_CerBat3 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat3 + VAR_VAL(idx_att, "MdfSys_collY_sposta3") + VAR_VAL(idx_att, "MCB_Ute_spostaCer3")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat3-Battuta_X
      @id_Cer = 3
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer4
   {
      @escluso = 1
      if (py_CerBat4 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat4 + VAR_VAL(idx_att, "MdfSys_collY_sposta4") + VAR_VAL(idx_att, "MCB_Ute_spostaCer4")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat4-Battuta_X
      @id_Cer = 4
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer5
   {
      @escluso = 1
      if (py_CerBat5 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat5 + VAR_VAL(idx_att, "MdfSys_collY_sposta5") + VAR_VAL(idx_att, "MCB_Ute_spostaCer5")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat5-Battuta_X
      @id_Cer = 5
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer6
   {
      @escluso = 1
      if (py_CerBat6 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat6 + VAR_VAL(idx_att, "MdfSys_collY_sposta6") + VAR_VAL(idx_att, "MCB_Ute_spostaCer6")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat6-Battuta_X
      @id_Cer = 6
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer7
   {
      @escluso = 1
      if (py_CerBat7 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat7 + VAR_VAL(idx_att, "MdfSys_collY_sposta7") + VAR_VAL(idx_att, "MCB_Ute_spostaCer7")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat7-Battuta_X
      @id_Cer = 7
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer8
   {
      @escluso = 1
      if (py_CerBat8 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat8 + VAR_VAL(idx_att, "MdfSys_collY_sposta8") + VAR_VAL(idx_att, "MCB_Ute_spostaCer8")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat8-Battuta_X
      @id_Cer = 8
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Procedura MdF_noAUTO
   {
      cam_KeyRegMdF = "CerBat"
      if ( VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1
         & STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) == -1
         & mdf_save_prec == 0
         )
         {
          MdF_comandoOnAUTO = 2
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Procedura MdF_Ctrl_Post_RELATIVE_ADD
   {
      GOSUB MdF_Ctrl_Post_RELATIVE_ADD
   }

   Procedura MdF_Ctrl_ADD_TooEarly
   {
      GOSUB MdF_Ctrl_ADD_TooEarly
   }

   Procedura MdF_Ctrl_Cambiamenti
   {
      if (IS_IDX(idx_att) != 1)            { EXITSUB() }
      if (IS_IDX(PADRE(idx_att, 1)) != 1)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "KeyFamRegFacc_att") != 1)
         {
          if ($MdF_NO_LOGMSG == 0)
             {
              COMANDO2(STRCAT("LOGMSG MdF_Ctrl_Cambiamenti senza KeyFamRegFacc_att ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
             }
          EXITSUB()
         }

      // Faccio comunque il test collisioni
      GOSUB MdF_CerBat_Collision

      if (VAR_EXIST(idx_att, "MdF_Cambiato") != 1)
         {
          GOSUB MdF_Battuta_X
          if (Battuta_X_att == Battuta_X)
             {
              // 14.03.2025 Come std
              //{ EXITSUB() }
              if (VAR_VAL(idx_att, "mdf_ricalc_from_Collision_Post") != 3)  { EXITSUB() }
             }
         }

      if (VAR_VAL(-1, "CAM_Visualize") > 99)
         { COMANDO2(STRCAT("LOGMSG { MdF_Ctrl_Cambiamenti MdF_Cambiato=", VAR_VAL_STR(idx_att, "MdF_Cambiato"), " su ", NOME(idx_att), " idx_att=", STR(idx_att), " ", DATA(0))) }

      //DISPLAY2(STRCAT("MdF_Cambiato=", MdF_Cambiato, " su ", NOME(idx_att), " idx_att=", STR(idx_att)))
      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "MdF_VanoY1")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      //if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili

      GOSUB MdF_Battuta_X
      GOSUB Reg_pos_CerBat
      GOSUB MdF_Battuta_X_After_RegFacc

      MdF_Cambiato_att = VAR_VAL_STR(idx_att, "MdF_Cambiato")
      bas0_att = base_0.y
      alt0_att = alto_0.y
      bas0_CamMdF = VAR_VAL(idx_CamMdF, "base_0.y")
      alt0_CamMdF = VAR_VAL(idx_CamMdF, "alto_0.y")

      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "MdF_CamMdFrontali") != 1)
         {
          GOSUB MdF_Cam_Elimina
         }

      if ( bas0_att == bas0_CamMdF  &  alt0_att == alt0_CamMdF
         & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "Dim*") != 1
         )
         { DEL_VAR(idx_att, "MdF_Cambiato") }

      if ( STRCMP(KeyFamRegFacc_att, KeyFamRegFacc) != 0
         | STRCMP(MdF_Aper_att, MdF_Apertura) != 0
         | X_att != X
         | Y_att != Y
         | px_CerBat1_att != px_CerBat1
         | py_CerBat1_att != py_CerBat1
         | py_CerBat2_att != py_CerBat2
         | py_CerBat3_att != py_CerBat3
         | py_CerBat4_att != py_CerBat4
         | py_CerBat5_att != py_CerBat5
         | py_CerBat6_att != py_CerBat6
         | py_CerBat7_att != py_CerBat7
         | py_CerBat8_att != py_CerBat8
         | Battuta_X_att != Battuta_X
         )
         {
          WITH_VAR_LOCAL(idx_att, "mdf_Visgraf", "escl_Grafica", 2, 1, "0")

          if (mdf_Visgraf <= 0)
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " x MdF_Ctrl_Cambiamenti ", MdF_Cambiato_att)) }
          else
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_Ctrl_Cambiamenti ", MdF_Cambiato_att)) }
          MdF_Cambiato_att = STRCAT(MdF_Cambiato_att, " , Ricalcolato")
         }

      if (VAR_VAL(-1, "CAM_Visualize") > 99)
         { COMANDO2(STRCAT("LOGMSG } MdF_Ctrl_Cambiamenti ", NOME(idx_att), " idx_att=", STR(idx_att), " ", DATA(0))) }
   }

   Procedura MdF_Ctrl_Cer_ChangeUte
   {
      if (IS_IDX(idx_att) != 1)            { EXITSUB() }
      if (IS_IDX(PADRE(idx_att, 1)) != 1)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "KeyFamRegFacc_att") != 1)
         {
          if ($MdF_NO_LOGMSG == 0)
             {
              COMANDO2(STRCAT("LOGMSG MdF_Ctrl_Cer_ChangeUte senza KeyFamRegFacc_att ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
             }
          EXITSUB()
         }

      // Se l'utente cambia variabili di componenti sensibili devo per forza rileggere le tabelle
      // Basta richiamre questa procedura solo appunto al cambio di determinate situazioni
      // PEr un Gruppo Cerniere il tempo è comunque impercettibile
      mdf_prosegui_action1 = 2

      MdF_Ctrl_Cer_ChangeUte = 1

      mdfsys_Collision1_att = VAR_VAL(idx_att, "MdfSys_Collision1")
      mdfsys_Collision2_att = VAR_VAL(idx_att, "MdfSys_Collision2")
      mdfsys_Collision3_att = VAR_VAL(idx_att, "MdfSys_Collision3")
      mdfsys_Collision4_att = VAR_VAL(idx_att, "MdfSys_Collision4")
      mdfsys_Collision5_att = VAR_VAL(idx_att, "MdfSys_Collision5")
      mdfsys_Collision6_att = VAR_VAL(idx_att, "MdfSys_Collision6")
      mdfsys_Collision7_att = VAR_VAL(idx_att, "MdfSys_Collision7")
      mdfsys_Collision8_att = VAR_VAL(idx_att, "MdfSys_Collision8")
      // Come MdF_CerBat_Collision_Post.
      // Se MdF_Ctrl_Cer_ChangeUte eseguito a fine caricamento ordine e cambia la Y dell' elemento in collisione, si sistema lo sposta e il CAM,
      // ma graficamente non si spostano le cerniere senza un ricalcola
      mdfsys_Collision1_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision1_y_mm")
      mdfsys_Collision2_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision2_y_mm")
      mdfsys_Collision3_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision3_y_mm")
      mdfsys_Collision4_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision4_y_mm")
      mdfsys_Collision5_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision5_y_mm")
      mdfsys_Collision6_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision6_y_mm")
      mdfsys_Collision7_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision7_y_mm")
      mdfsys_Collision8_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision8_y_mm")

      mdfsys_collY_sposta1_att = VAR_VAL(idx_att, "MdfSys_collY_sposta1")
      mdfsys_collY_sposta2_att = VAR_VAL(idx_att, "MdfSys_collY_sposta2")
      mdfsys_collY_sposta3_att = VAR_VAL(idx_att, "MdfSys_collY_sposta3")
      mdfsys_collY_sposta4_att = VAR_VAL(idx_att, "MdfSys_collY_sposta4")
      mdfsys_collY_sposta5_att = VAR_VAL(idx_att, "MdfSys_collY_sposta5")
      mdfsys_collY_sposta6_att = VAR_VAL(idx_att, "MdfSys_collY_sposta6")
      mdfsys_collY_sposta7_att = VAR_VAL(idx_att, "MdfSys_collY_sposta7")
      mdfsys_collY_sposta8_att = VAR_VAL(idx_att, "MdfSys_collY_sposta8")

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili

      GOSUB MdF_Battuta_X
      GOSUB Reg_pos_CerBat
      GOSUB MdF_Battuta_X_After_RegFacc

      GOSUB MdF_CerBat_Collision

      mdf_prosegui_action1 = 0
      MdF_Ctrl_Cer_ChangeUte = 0

      //COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_Ctrl_CollisionCer"))

      mdf_collisionCer_Change = 0
      iM=1
      while (VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(iM))) == 1)
         {
          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_att")) )
             {
              mdf_collisionCer_Change = 1
             }
         // 18.05.2021
          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM), "_y_mm")) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_y_mm_att")) )
             {
              mdf_collisionCer_Change = 2
             }
          if (VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_collY_sposta", STR(iM), "_att")) )
             {
              mdf_collisionCer_Change = 4
             }
          iM = iM+1
         }
      if (mdf_collisionCer_Change > 0)
         { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x mdf_collisionCer_Change")) }
   }

   Procedura MdF_CerBat_Collision_Post
   {
      if (IS_IDX(idx_att) != 1)            { EXITSUB() }
      if (IS_IDX(PADRE(idx_att, 1)) != 1)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "KeyFamRegFacc_att") != 1)
         {
          if ($MdF_NO_LOGMSG == 0)
             {
              COMANDO2(STRCAT("LOGMSG MdF_CerBat_Collision_Post senza KeyFamRegFacc_att ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
             }
          EXITSUB()
         }

      GOSUB MdF_Battuta_X

      GOSUB mdfsys_Collision_att

      idx_MdF_Var = idx_att
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili

      GOSUB MdF_CerBat_Collision

      mdf_collisionCer_Post = 0
      iM=1
      while (VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(iM))) == 1)
         {
          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_att")) )
             {
              mdf_collisionCer_Post = 1
             }

          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM), "_y_mm")) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_y_mm_att")) )
             {
              mdf_collisionCer_Post = 2
             }
          if (VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_collY_sposta", STR(iM), "_att")) )
             {
              mdf_collisionCer_Post = 4
             }

          iM = iM+1
         }

      mdf_ricalc_from_Collision_Post = 0
      if ( mdf_collisionCer_Post <= 0
         & Battuta_X_att != Battuta_X
         )
         {
          mdf_ricalc_from_Collision_Post = 1
          COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x Battuta_X punti notevoli Fianchi corretti troppo tardi MdF_CerBat_Collision_Post"))
         }

      if (mdf_collisionCer_Post > 0)
         {
          mdf_ricalc_from_Collision_Post = 2
          COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_CerBat_Collision_Post"))
         }

      if (mdf_ricalc_from_Collision_Post <= 0)
         {
          mdf_ricalc_from_Collision_Post = 3
          if (mdf_ctrl_Change_Var_CAM > 0  &  mdf_ctrl_Change_Var_CAM < 1)
             { COMANDO(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(idx_att), " // ", NOME(idx_att), " x mdf_ricalc_from_Collision_Post mdf_ctrl_Change_Var_CAM=", STR(mdf_ctrl_Change_Var_CAM))) }
          else
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x mdf_ricalc_from_Collision_Post mdf_ctrl_Change_Var_CAM=", STR(mdf_ctrl_Change_Var_CAM))) }
         }
   }

   Procedura MdF_CerBat_Msg_Collision
   {
      GOSUB MdF_CerBat_Msg_Collision
   }
}

Elemento MdF_CerniereBattVY2
{
   Descrizione = "Contenitore grafica Cerniere"
   Code        = GRANT
   Gruppo      = "TMP"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   Alias         MdF_CAM;MdF_CerBat

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22
      HIDE  ""  1

      MdF_Apertura           "Apertura SX-DX"                      ""

      px_CerBat1             "Rientro in X della Cerniera"          0
      px_CerBat2             "Rientro in X della Cerniera"          0
      px_CerBat3             "Rientro in X della Cerniera"          0
      px_CerBat4             "Rientro in X della Cerniera"          0
      px_CerBat5             "Rientro in X della Cerniera"          0
      px_CerBat6             "Rientro in X della Cerniera"          0
      px_CerBat7             "Rientro in X della Cerniera"          0
      px_CerBat8             "Rientro in X della Cerniera"          0

      py_CerBat1             "Quota Y cerniera 1"                   0
      py_CerBat2             "Quota Y cerniera 2"                   0
      py_CerBat3             "Quota Y cerniera 3"                   0
      py_CerBat4             "Quota Y cerniera 4"                   0
      py_CerBat5             "Quota Y cerniera 5"                   0
      py_CerBat6             "Quota Y cerniera 6"                   0

      py_CerBat7             "Quota Y cerniera 7"                   0
      py_CerBat8             "Quota Y cerniera 8"                   0

      Battuta_X              "battuta in X rispetto al fianco"      0
      Battuta_Z              "battuta in Z rispetto al fianco"      0
      KeyFamRegFacc          "tipo posizionamento cerniere"        ""

      MdF_Utente             "Gestione cerniere da utente"         "-1"  NoSave

      MdF_numVanoY           "Num vano in Y"                       2  NoSave

      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      GOSUB MdF_SetStato_NoGEST

      // 11.12.2024 spostata sopra
      cam_KeyRegMdF = "CerBat"
      GOSUB MdF_Ctrl_save_prec

      if (MdF_Utente == "-1")  { MdF_Utente = $MdF_Utente }

      mdf_no_Save = 0
      // Se chiamo una ipotetica procedura MdF_noAUTO non passa quando escluso=1
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          if ( STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) == -1
             & STR_INDEX_OF(MdF_Utente, 0, "-1") == -1
             )
             { mdf_no_Save = 1 }

          if (VAR_EXIST(idx_att, "posY_Utente") != 1)  { mdf_no_Save = 2 }

          if (mdf_no_Save > 0)
             {
              MdF_comandoOnAUTO = 1
              COMANDO(STRCAT("NO_AUTO ", STR(idx_att), " SET"))
             }
         }

      if ( mdf_save_prec == 1
         | VAR_EXIST(idx_att, "posY_Utente") == 1
         )
         {
          MdF_comandoOnAUTO = -1
          if (VAR_VAL(PADRE(idx_att, 1), "MdF_Load_COMANDO2") == 1)
             { COMANDO2(STRCAT("NO_AUTO ", STR(idx_att))) }
          else
             { COMANDO(STRCAT("NO_AUTO ", STR(idx_att))) }
         }

      if (STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) > -1)  { HIDE = 3 }
   }

   Attrezza
   {
      base_0 = @base_0
      base_0.z = @base_0.z
      X = @X
      Y = @Y
      Z = @Z
   }

   Controlli
   {
      idx_att = ATTUALE()
      idx_CamMdF = PADRE(idx_att, 1)
      nome_CamMdF = NOME(idx_CamMdF)

      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "MdF_VanoY2")
      Z = VAR_VAL(idx_CamMdF, "Z")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      //if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      GOSUB MdF_Ctrl_Dim

      escluso = 0
      COMPONENTI3("mdf_gia_inserito", idx_CamMdF, NOME(idx_att))
      if (mdf_gia_inserito > 1)
         {
          // 17.10.2018
          if (VAR_VAL(idx_att, "mdf_rel_ADD_bas0y_Error") == 2 & VAR_VAL(idx_att, "mdf_rel_ADD_bas0y_LoadARF_Error") == 1)
             { escluso = 1 }
          else
             { COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // MdF_CerniereBattVY mdf_gia_inserito")) }
          EXITSUB()
         }

      tLav = "CerBat"
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
     // 19.03.2024
      KeyFamRegFacc_VY = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_VY", STR(MdF_numVanoY), "_", tLav))
      if (STRLEN(KeyFamRegFacc_VY) > 1)  { KeyFamRegFacc = KeyFamRegFacc_VY }

      if (STRLEN(KeyFamRegFacc) <= 1)
         {
          // Se per un cambio variante o VarBdm le cerniere vanno escluse ma le ho gia inserite
          if (VAR_VAL(PADRE(idx_att, 1), "mdf_Load_save_prec") < 0)
             {
              if (ACTION() == 1  |  ACTION() == 3)
                 {
                  cmd_keyFamVuota = CMD()
                  if (CMD() == 0)  { escluso = 1 }
                  if (CMD() == 1)  { escluso = 1 }
                 }
             }
          EXITSUB()
         }

      //COMANDO(STRCAT("LOGMSG Controlli MdF_CerniereBattVY idx=", STR(idx_att), " ACTION", STR(ACTION()), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))

      // Se il padre mi ha inserito non puo essere MdF_Apertura vuota. Puo succedere solo
      // se sono salvato nel rit e sull' OnLoadedOrder vengono lanciati dei VAR_CHANGE che
      // sputtano il flusso
      mdf_prosegui_action1 = 0
      if ( VAR_EXIST(idx_att, "MdF_Apertura") == 1
         & STRLEN(VAR_VAL_STR(idx_att, "MdF_Apertura")) < 1
         )
         { mdf_prosegui_action1 = 1 }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili

      if ( IS_MATCH(MdF_Apertura, "SX*") != 1
         & IS_MATCH(MdF_Apertura, "DX*") != 1
         )
         { escluso = 1 }

      GOSUB MdF_Battuta_X

      //GOSUB MdF_Ctrl_SbordoY_padre
      MdfSys_SbordoYInf = 0

      GOSUB Reg_pos_CerBat
      GOSUB Reg_CerBat_att
      GOSUB MdF_Sort_MCB_Ute_spostaCer

      GOSUB MdF_Battuta_X_After_RegFacc

      GOSUB MdF_Ctrl_limCerVic

      //COMANDO(STRCAT("LOGMSG Controlli MdF_CerniereBattVY-FINE idx=", STR(idx_att), " ACTION", STR(ACTION()), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))

      // RE_Control significa che l'ho ricalcolato almeno una volta quindi nella Macro CAM
      // non voglio fare la MdF_Ctrl_Cambiamenti
      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_ADD_when"), "first_OnMacroMdF") )
         { MdF_ADD_when = "RE_Control" }

      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)
         {
          MdF_ADD_when = "RE_Control"
          mdf_ricalc_Post_READD = 0
          DEL_VAR(idx_att, "mdf_ricalcola_daCerVic")
         }

      if (VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR") == 1)
         {
          DEL_VAR(idx_att, "ang_y")
          if (IS_MATCH(MdF_Apertura, "DX*") )
             { ang_y = -90 }
         }
      if (ABS(VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR")) > 1)
         {
          ang_y = -VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR")
          if (IS_MATCH(MdF_Apertura, "DX*") )
             {
              ang_y = VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR")
              if (Battuta_X == 0)  { Battuta_X = VAR_VAL(PADRE(idx_att, 1), "MdF_Battuta_X") }
             }
         }
      HIDE = 1
      if (STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) > -1)  { HIDE = 3 }

      mdf_LivSpostaCerUte = VAR_VAL(PADRE(idx_att, 1), "MdfSys_LivSpostaCerUte")-1
      mdf_CER_base0y_SpostataUtente1 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(1)))
      mdf_CER_base0y_SpostataUtente2 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(2)))
      mdf_CER_base0y_SpostataUtente3 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(3)))
      mdf_CER_base0y_SpostataUtente4 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(4)))
      mdf_CER_base0y_SpostataUtente5 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(5)))
      mdf_CER_base0y_SpostataUtente6 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(6)))
      mdf_CER_base0y_SpostataUtente7 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(7)))
      mdf_CER_base0y_SpostataUtente8 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(8)))
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_CernieraBasetta_Batt  cer1
   {
      @escluso = 1
      if (py_CerBat1 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      @base_0.y = base_0.y + py_CerBat1 + VAR_VAL(idx_att, "MdfSys_collY_sposta1") + VAR_VAL(idx_att, "MCB_Ute_spostaCer1")
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat1-Battuta_X
      @id_Cer = 1

      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer2
   {
      @escluso = 1
      if (py_CerBat2 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      @base_0.y = base_0.y + py_CerBat2 + VAR_VAL(idx_att, "MdfSys_collY_sposta2") + VAR_VAL(idx_att, "MCB_Ute_spostaCer2")
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat2-Battuta_X
      @id_Cer = 2
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer3
   {
      @escluso = 1
      if (py_CerBat3 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat3 + VAR_VAL(idx_att, "MdfSys_collY_sposta3") + VAR_VAL(idx_att, "MCB_Ute_spostaCer3")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat3-Battuta_X
      @id_Cer = 3
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer4
   {
      @escluso = 1
      if (py_CerBat4 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat4 + VAR_VAL(idx_att, "MdfSys_collY_sposta4") + VAR_VAL(idx_att, "MCB_Ute_spostaCer4")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat4-Battuta_X
      @id_Cer = 4
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer5
   {
      @escluso = 1
      if (py_CerBat5 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat5 + VAR_VAL(idx_att, "MdfSys_collY_sposta5") + VAR_VAL(idx_att, "MCB_Ute_spostaCer5")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat5-Battuta_X
      @id_Cer = 5
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer6
   {
      @escluso = 1
      if (py_CerBat6 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat6 + VAR_VAL(idx_att, "MdfSys_collY_sposta6") + VAR_VAL(idx_att, "MCB_Ute_spostaCer6")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat6-Battuta_X
      @id_Cer = 6
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer7
   {
      @escluso = 1
      if (py_CerBat7 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat7 + VAR_VAL(idx_att, "MdfSys_collY_sposta7") + VAR_VAL(idx_att, "MCB_Ute_spostaCer7")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat7-Battuta_X
      @id_Cer = 7
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer8
   {
      @escluso = 1
      if (py_CerBat8 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat8 + VAR_VAL(idx_att, "MdfSys_collY_sposta8") + VAR_VAL(idx_att, "MCB_Ute_spostaCer8")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat8-Battuta_X
      @id_Cer = 8
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Procedura MdF_noAUTO
   {
      cam_KeyRegMdF = "CerBat"
      if ( VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1
         & STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) == -1
         & mdf_save_prec == 0
         )
         {
          MdF_comandoOnAUTO = 2
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Procedura MdF_Ctrl_Post_RELATIVE_ADD
   {
      GOSUB MdF_Ctrl_Post_RELATIVE_ADD
   }

   Procedura MdF_Ctrl_ADD_TooEarly
   {
      GOSUB MdF_Ctrl_ADD_TooEarly
   }

   Procedura MdF_Ctrl_Cambiamenti
   {
      if (IS_IDX(idx_att) != 1)            { EXITSUB() }
      if (IS_IDX(PADRE(idx_att, 1)) != 1)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "KeyFamRegFacc_att") != 1)
         {
          if ($MdF_NO_LOGMSG == 0)
             {
              COMANDO2(STRCAT("LOGMSG MdF_Ctrl_Cambiamenti senza KeyFamRegFacc_att ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
             }
          EXITSUB()
         }

      // Faccio comunque il test collisioni
      GOSUB MdF_CerBat_Collision

      if (VAR_EXIST(idx_att, "MdF_Cambiato") != 1)
         {
          GOSUB MdF_Battuta_X
          if (Battuta_X_att == Battuta_X)
             { EXITSUB() }
         }

      if (VAR_VAL(-1, "CAM_Visualize") > 99)
         { COMANDO2(STRCAT("LOGMSG { MdF_Ctrl_Cambiamenti MdF_Cambiato=", VAR_VAL_STR(idx_att, "MdF_Cambiato"), " su ", NOME(idx_att), " idx_att=", STR(idx_att), " ", DATA(0))) }

      //DISPLAY2(STRCAT("MdF_Cambiato=", MdF_Cambiato, " su ", NOME(idx_att), " idx_att=", STR(idx_att)))
      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "MdF_VanoY2")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      //if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili

      GOSUB MdF_Battuta_X
      GOSUB Reg_pos_CerBat
      GOSUB MdF_Battuta_X_After_RegFacc

      MdF_Cambiato_att = VAR_VAL_STR(idx_att, "MdF_Cambiato")
      bas0_att = base_0.y
      alt0_att = alto_0.y
      bas0_CamMdF = VAR_VAL(idx_CamMdF, "base_0.y")
      alt0_CamMdF = VAR_VAL(idx_CamMdF, "alto_0.y")

      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "MdF_CamMdFrontali") != 1)
         {
          GOSUB MdF_Cam_Elimina
         }

      if ( bas0_att == bas0_CamMdF  &  alt0_att == alt0_CamMdF
         & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "Dim*") != 1
         )
         { DEL_VAR(idx_att, "MdF_Cambiato") }

      if ( STRCMP(KeyFamRegFacc_att, KeyFamRegFacc) != 0
         | STRCMP(MdF_Aper_att, MdF_Apertura) != 0
         | X_att != X
         | Y_att != Y
         | px_CerBat1_att != px_CerBat1
         | py_CerBat1_att != py_CerBat1
         | py_CerBat2_att != py_CerBat2
         | py_CerBat3_att != py_CerBat3
         | py_CerBat4_att != py_CerBat4
         | py_CerBat5_att != py_CerBat5
         | py_CerBat6_att != py_CerBat6
         | py_CerBat7_att != py_CerBat7
         | py_CerBat8_att != py_CerBat8
         | Battuta_X_att != Battuta_X
         )
         {
          WITH_VAR_LOCAL(idx_att, "mdf_Visgraf", "escl_Grafica", 2, 1, "0")

          if (mdf_Visgraf <= 0)
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " x MdF_Ctrl_Cambiamenti ", MdF_Cambiato_att)) }
          else
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_Ctrl_Cambiamenti ", MdF_Cambiato_att)) }
          MdF_Cambiato_att = STRCAT(MdF_Cambiato_att, " , Ricalcolato")
         }

      if (VAR_VAL(-1, "CAM_Visualize") > 99)
         { COMANDO2(STRCAT("LOGMSG } MdF_Ctrl_Cambiamenti ", NOME(idx_att), " idx_att=", STR(idx_att), " ", DATA(0))) }
   }

   Procedura MdF_Ctrl_Cer_ChangeUte
   {
      if (IS_IDX(idx_att) != 1)            { EXITSUB() }
      if (IS_IDX(PADRE(idx_att, 1)) != 1)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "KeyFamRegFacc_att") != 1)
         {
          if ($MdF_NO_LOGMSG == 0)
             {
              COMANDO2(STRCAT("LOGMSG MdF_Ctrl_Cer_ChangeUte senza KeyFamRegFacc_att ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
             }
          EXITSUB()
         }

      // Se l'utente cambia variabili di componenti sensibili devo per forza rileggere le tabelle
      // Basta richiamre questa procedura solo appunto al cambio di determinate situazioni
      // PEr un Gruppo Cerniere il tempo è comunque impercettibile
      mdf_prosegui_action1 = 2

      MdF_Ctrl_Cer_ChangeUte = 1

      mdfsys_Collision1_att = VAR_VAL(idx_att, "MdfSys_Collision1")
      mdfsys_Collision2_att = VAR_VAL(idx_att, "MdfSys_Collision2")
      mdfsys_Collision3_att = VAR_VAL(idx_att, "MdfSys_Collision3")
      mdfsys_Collision4_att = VAR_VAL(idx_att, "MdfSys_Collision4")
      mdfsys_Collision5_att = VAR_VAL(idx_att, "MdfSys_Collision5")
      mdfsys_Collision6_att = VAR_VAL(idx_att, "MdfSys_Collision6")
      mdfsys_Collision7_att = VAR_VAL(idx_att, "MdfSys_Collision7")
      mdfsys_Collision8_att = VAR_VAL(idx_att, "MdfSys_Collision8")
      // Come MdF_CerBat_Collision_Post.
      // Se MdF_Ctrl_Cer_ChangeUte eseguito a fine caricamento ordine e cambia la Y dell' elemento in collisione, si sistema lo sposta e il CAM,
      // ma graficamente non si spostano le cerniere senza un ricalcola
      mdfsys_Collision1_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision1_y_mm")
      mdfsys_Collision2_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision2_y_mm")
      mdfsys_Collision3_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision3_y_mm")
      mdfsys_Collision4_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision4_y_mm")
      mdfsys_Collision5_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision5_y_mm")
      mdfsys_Collision6_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision6_y_mm")
      mdfsys_Collision7_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision7_y_mm")
      mdfsys_Collision8_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision8_y_mm")

      mdfsys_collY_sposta1_att = VAR_VAL(idx_att, "MdfSys_collY_sposta1")
      mdfsys_collY_sposta2_att = VAR_VAL(idx_att, "MdfSys_collY_sposta2")
      mdfsys_collY_sposta3_att = VAR_VAL(idx_att, "MdfSys_collY_sposta3")
      mdfsys_collY_sposta4_att = VAR_VAL(idx_att, "MdfSys_collY_sposta4")
      mdfsys_collY_sposta5_att = VAR_VAL(idx_att, "MdfSys_collY_sposta5")
      mdfsys_collY_sposta6_att = VAR_VAL(idx_att, "MdfSys_collY_sposta6")
      mdfsys_collY_sposta7_att = VAR_VAL(idx_att, "MdfSys_collY_sposta7")
      mdfsys_collY_sposta8_att = VAR_VAL(idx_att, "MdfSys_collY_sposta8")

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili

      GOSUB MdF_Battuta_X
      GOSUB Reg_pos_CerBat
      GOSUB MdF_Battuta_X_After_RegFacc

      GOSUB MdF_CerBat_Collision

      mdf_prosegui_action1 = 0
      MdF_Ctrl_Cer_ChangeUte = 0

      //COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_Ctrl_CollisionCer"))

      mdf_collisionCer_Change = 0
      iM=1
      while (VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(iM))) == 1)
         {
          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_att")) )
             {
              mdf_collisionCer_Change = 1
             }
         // 18.05.2021
          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM), "_y_mm")) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_y_mm_att")) )
             {
              mdf_collisionCer_Change = 2
             }
          if (VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_collY_sposta", STR(iM), "_att")) )
             {
              mdf_collisionCer_Change = 4
             }
          iM = iM+1
         }
      if (mdf_collisionCer_Change > 0)
         { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x mdf_collisionCer_Change")) }
   }

   Procedura MdF_CerBat_Collision_Post
   {
      if (IS_IDX(idx_att) != 1)            { EXITSUB() }
      if (IS_IDX(PADRE(idx_att, 1)) != 1)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "KeyFamRegFacc_att") != 1)
         {
          if ($MdF_NO_LOGMSG == 0)
             {
              COMANDO2(STRCAT("LOGMSG MdF_CerBat_Collision_Post senza KeyFamRegFacc_att ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
             }
          EXITSUB()
         }

      GOSUB MdF_Battuta_X

      GOSUB mdfsys_Collision_att

      idx_MdF_Var = idx_att
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili

      GOSUB MdF_CerBat_Collision

      mdf_collisionCer_Post = 0
      iM=1
      while (VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(iM))) == 1)
         {
          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_att")) )
             {
              mdf_collisionCer_Post = 1
             }

          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM), "_y_mm")) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_y_mm_att")) )
             {
              mdf_collisionCer_Post = 2
             }
          if (VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_collY_sposta", STR(iM), "_att")) )
             {
              mdf_collisionCer_Post = 4
             }

          iM = iM+1
         }

      mdf_ricalc_from_Collision_Post = 0
      if ( mdf_collisionCer_Post <= 0
         & Battuta_X_att != Battuta_X
         )
         {
          mdf_ricalc_from_Collision_Post = 1
          COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x Battuta_X punti notevoli Fianchi corretti troppo tardi MdF_CerBat_Collision_Post"))
         }

      if (mdf_collisionCer_Post > 0)
         {
          mdf_ricalc_from_Collision_Post = 2
          COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_CerBat_Collision_Post"))
         }

      if (mdf_ricalc_from_Collision_Post <= 0)
         {
          mdf_ricalc_from_Collision_Post = 3
          if (mdf_ctrl_Change_Var_CAM > 0  &  mdf_ctrl_Change_Var_CAM < 1)
             { COMANDO(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(idx_att), " // ", NOME(idx_att), " x mdf_ricalc_from_Collision_Post mdf_ctrl_Change_Var_CAM=", STR(mdf_ctrl_Change_Var_CAM))) }
          else
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x mdf_ricalc_from_Collision_Post mdf_ctrl_Change_Var_CAM=", STR(mdf_ctrl_Change_Var_CAM))) }
         }
   }

   Procedura MdF_CerBat_Msg_Collision
   {
      GOSUB MdF_CerBat_Msg_Collision
   }
}

Elemento MdF_CerniereBattVY3
{
   Descrizione = "Contenitore grafica Cerniere"
   Code        = GRANT
   Gruppo      = "TMP"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   Alias         MdF_CAM;MdF_CerBat

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22
      HIDE  ""  1

      MdF_Apertura           "Apertura SX-DX"                      ""

      px_CerBat1             "Rientro in X della Cerniera"          0
      px_CerBat2             "Rientro in X della Cerniera"          0
      px_CerBat3             "Rientro in X della Cerniera"          0
      px_CerBat4             "Rientro in X della Cerniera"          0
      px_CerBat5             "Rientro in X della Cerniera"          0
      px_CerBat6             "Rientro in X della Cerniera"          0
      px_CerBat7             "Rientro in X della Cerniera"          0
      px_CerBat8             "Rientro in X della Cerniera"          0

      py_CerBat1             "Quota Y cerniera 1"                   0
      py_CerBat2             "Quota Y cerniera 2"                   0
      py_CerBat3             "Quota Y cerniera 3"                   0
      py_CerBat4             "Quota Y cerniera 4"                   0
      py_CerBat5             "Quota Y cerniera 5"                   0
      py_CerBat6             "Quota Y cerniera 6"                   0

      py_CerBat7             "Quota Y cerniera 7"                   0
      py_CerBat8             "Quota Y cerniera 8"                   0

      Battuta_X              "battuta in X rispetto al fianco"      0
      Battuta_Z              "battuta in Z rispetto al fianco"      0
      KeyFamRegFacc          "tipo posizionamento cerniere"        ""

      MdF_Utente             "Gestione cerniere da utente"         "-1"  NoSave

      MdF_numVanoY           "Num vano in Y"                       3  NoSave

      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      GOSUB MdF_SetStato_NoGEST

      cam_KeyRegMdF = "CerBat"
      GOSUB MdF_Ctrl_save_prec

      if (MdF_Utente == "-1")  { MdF_Utente = $MdF_Utente }

      mdf_no_Save = 0
      // Se chiamo una ipotetica procedura MdF_noAUTO non passa quando escluso=1
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          if ( STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) == -1
             & STR_INDEX_OF(MdF_Utente, 0, "-1") == -1
             )
             { mdf_no_Save = 1 }

          if (VAR_EXIST(idx_att, "posY_Utente") != 1)  { mdf_no_Save = 2 }

          if (mdf_no_Save > 0)
             {
              MdF_comandoOnAUTO = 1
              COMANDO(STRCAT("NO_AUTO ", STR(idx_att), " SET"))
             }
         }

      if ( mdf_save_prec == 1
         | VAR_EXIST(idx_att, "posY_Utente") == 1
         )
         {
          MdF_comandoOnAUTO = -1
          if (VAR_VAL(PADRE(idx_att, 1), "MdF_Load_COMANDO2") == 1)
             { COMANDO2(STRCAT("NO_AUTO ", STR(idx_att))) }
          else
             { COMANDO(STRCAT("NO_AUTO ", STR(idx_att))) }
         }

      if (STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) > -1)  { HIDE = 3 }
   }

   Attrezza
   {
      base_0 = @base_0
      base_0.z = @base_0.z
      X = @X
      Y = @Y
      Z = @Z
   }

   Controlli
   {
      idx_att = ATTUALE()
      idx_CamMdF = PADRE(idx_att, 1)
      nome_CamMdF = NOME(idx_CamMdF)

      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "MdF_VanoY3")
      Z = VAR_VAL(idx_CamMdF, "Z")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      //if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      GOSUB MdF_Ctrl_Dim

      escluso = 0
      COMPONENTI3("mdf_gia_inserito", idx_CamMdF, NOME(idx_att))
      if (mdf_gia_inserito > 1)
         {
          // 17.10.2018
          if (VAR_VAL(idx_att, "mdf_rel_ADD_bas0y_Error") == 2 & VAR_VAL(idx_att, "mdf_rel_ADD_bas0y_LoadARF_Error") == 1)
             { escluso = 1 }
          else
             { COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // MdF_CerniereBattVY mdf_gia_inserito")) }
          EXITSUB()
         }

      tLav = "CerBat"
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
     // 19.03.2024
      KeyFamRegFacc_VY = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_VY", STR(MdF_numVanoY), "_", tLav))
      if (STRLEN(KeyFamRegFacc_VY) > 1)  { KeyFamRegFacc = KeyFamRegFacc_VY }

      if (STRLEN(KeyFamRegFacc) <= 1)
         {
          // Se per un cambio variante o VarBdm le cerniere vanno escluse ma le ho gia inserite
          if (VAR_VAL(PADRE(idx_att, 1), "mdf_Load_save_prec") < 0)
             {
              if (ACTION() == 1  |  ACTION() == 3)
                 {
                  cmd_keyFamVuota = CMD()
                  if (CMD() == 0)  { escluso = 1 }
                  if (CMD() == 1)  { escluso = 1 }
                 }
             }
          EXITSUB()
         }

      //COMANDO(STRCAT("LOGMSG Controlli MdF_CerniereBattVY idx=", STR(idx_att), " ACTION", STR(ACTION()), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))

      // Se il padre mi ha inserito non puo essere MdF_Apertura vuota. Puo succedere solo
      // se sono salvato nel rit e sull' OnLoadedOrder vengono lanciati dei VAR_CHANGE che
      // sputtano il flusso
      mdf_prosegui_action1 = 0
      if ( VAR_EXIST(idx_att, "MdF_Apertura") == 1
         & STRLEN(VAR_VAL_STR(idx_att, "MdF_Apertura")) < 1
         )
         { mdf_prosegui_action1 = 1 }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili

      if ( IS_MATCH(MdF_Apertura, "SX*") != 1
         & IS_MATCH(MdF_Apertura, "DX*") != 1
         )
         { escluso = 1 }

      GOSUB MdF_Battuta_X

      //GOSUB MdF_Ctrl_SbordoY_padre
      MdfSys_SbordoYInf = 0

      GOSUB Reg_pos_CerBat
      GOSUB Reg_CerBat_att
      GOSUB MdF_Sort_MCB_Ute_spostaCer

      GOSUB MdF_Battuta_X_After_RegFacc

      GOSUB MdF_Ctrl_limCerVic

      //COMANDO(STRCAT("LOGMSG Controlli MdF_CerniereBattVY-FINE idx=", STR(idx_att), " ACTION", STR(ACTION()), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))

      // RE_Control significa che l'ho ricalcolato almeno una volta quindi nella Macro CAM
      // non voglio fare la MdF_Ctrl_Cambiamenti
      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_ADD_when"), "first_OnMacroMdF") )
         { MdF_ADD_when = "RE_Control" }

      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)
         {
          MdF_ADD_when = "RE_Control"
          mdf_ricalc_Post_READD = 0
          DEL_VAR(idx_att, "mdf_ricalcola_daCerVic")
         }

      if (VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR") == 1)
         {
          DEL_VAR(idx_att, "ang_y")
          if (IS_MATCH(MdF_Apertura, "DX*") )
             { ang_y = -90 }
         }
      if (ABS(VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR")) > 1)
         {
          ang_y = -VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR")
          if (IS_MATCH(MdF_Apertura, "DX*") )
             {
              ang_y = VAR_VAL(PADRE(idx_att, 1), "MdFSys_ANGCUR")
              if (Battuta_X == 0)  { Battuta_X = VAR_VAL(PADRE(idx_att, 1), "MdF_Battuta_X") }
             }
         }
      HIDE = 1
      if (STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) > -1)  { HIDE = 3 }

      mdf_LivSpostaCerUte = VAR_VAL(PADRE(idx_att, 1), "MdfSys_LivSpostaCerUte")-1
      mdf_CER_base0y_SpostataUtente1 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(1)))
      mdf_CER_base0y_SpostataUtente2 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(2)))
      mdf_CER_base0y_SpostataUtente3 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(3)))
      mdf_CER_base0y_SpostataUtente4 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(4)))
      mdf_CER_base0y_SpostataUtente5 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(5)))
      mdf_CER_base0y_SpostataUtente6 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(6)))
      mdf_CER_base0y_SpostataUtente7 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(7)))
      mdf_CER_base0y_SpostataUtente8 = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(8)))
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_CernieraBasetta_Batt  cer1
   {
      @escluso = 1
      if (py_CerBat1 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      @base_0.y = base_0.y + py_CerBat1 + VAR_VAL(idx_att, "MdfSys_collY_sposta1") + VAR_VAL(idx_att, "MCB_Ute_spostaCer1")
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat1-Battuta_X
      @id_Cer = 1

      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer2
   {
      @escluso = 1
      if (py_CerBat2 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      @base_0.y = base_0.y + py_CerBat2 + VAR_VAL(idx_att, "MdfSys_collY_sposta2") + VAR_VAL(idx_att, "MCB_Ute_spostaCer2")
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat2-Battuta_X
      @id_Cer = 2
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer3
   {
      @escluso = 1
      if (py_CerBat3 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat3 + VAR_VAL(idx_att, "MdfSys_collY_sposta3") + VAR_VAL(idx_att, "MCB_Ute_spostaCer3")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat3-Battuta_X
      @id_Cer = 3
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer4
   {
      @escluso = 1
      if (py_CerBat4 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat4 + VAR_VAL(idx_att, "MdfSys_collY_sposta4") + VAR_VAL(idx_att, "MCB_Ute_spostaCer4")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat4-Battuta_X
      @id_Cer = 4
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer5
   {
      @escluso = 1
      if (py_CerBat5 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat5 + VAR_VAL(idx_att, "MdfSys_collY_sposta5") + VAR_VAL(idx_att, "MCB_Ute_spostaCer5")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat5-Battuta_X
      @id_Cer = 5
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer6
   {
      @escluso = 1
      if (py_CerBat6 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat6 + VAR_VAL(idx_att, "MdfSys_collY_sposta6") + VAR_VAL(idx_att, "MCB_Ute_spostaCer6")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat6-Battuta_X
      @id_Cer = 6
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer7
   {
      @escluso = 1
      if (py_CerBat7 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat7 + VAR_VAL(idx_att, "MdfSys_collY_sposta7") + VAR_VAL(idx_att, "MCB_Ute_spostaCer7")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat7-Battuta_X
      @id_Cer = 7
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Posiziona MdF_CernieraBasetta_Batt  cer8
   {
      @escluso = 1
      if (py_CerBat8 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }

      @base_0.y = base_0.y + py_CerBat8 + VAR_VAL(idx_att, "MdfSys_collY_sposta8") + VAR_VAL(idx_att, "MCB_Ute_spostaCer8")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerBat8-Battuta_X
      @id_Cer = 8
      if (VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(@id_Cer))) != 0)  { @escluso = 1 }
   }

   Procedura MdF_noAUTO
   {
      cam_KeyRegMdF = "CerBat"
      if ( VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1
         & STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) == -1
         & mdf_save_prec == 0
         )
         {
          MdF_comandoOnAUTO = 2
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Procedura MdF_Ctrl_Post_RELATIVE_ADD
   {
      GOSUB MdF_Ctrl_Post_RELATIVE_ADD
   }

   Procedura MdF_Ctrl_ADD_TooEarly
   {
      GOSUB MdF_Ctrl_ADD_TooEarly
   }

   Procedura MdF_Ctrl_Cambiamenti
   {
      if (IS_IDX(idx_att) != 1)            { EXITSUB() }
      if (IS_IDX(PADRE(idx_att, 1)) != 1)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "KeyFamRegFacc_att") != 1)
         {
          if ($MdF_NO_LOGMSG == 0)
             {
              COMANDO2(STRCAT("LOGMSG MdF_Ctrl_Cambiamenti senza KeyFamRegFacc_att ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
             }
          EXITSUB()
         }

      // Faccio comunque il test collisioni
      GOSUB MdF_CerBat_Collision

      if (VAR_EXIST(idx_att, "MdF_Cambiato") != 1)
         {
          GOSUB MdF_Battuta_X
          if (Battuta_X_att == Battuta_X)
             { EXITSUB() }
         }

      if (VAR_VAL(-1, "CAM_Visualize") > 99)
         { COMANDO2(STRCAT("LOGMSG { MdF_Ctrl_Cambiamenti MdF_Cambiato=", VAR_VAL_STR(idx_att, "MdF_Cambiato"), " su ", NOME(idx_att), " idx_att=", STR(idx_att), " ", DATA(0))) }

      //DISPLAY2(STRCAT("MdF_Cambiato=", MdF_Cambiato, " su ", NOME(idx_att), " idx_att=", STR(idx_att)))
      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "MdF_VanoY3")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      //if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili

      GOSUB MdF_Battuta_X
      GOSUB Reg_pos_CerBat
      GOSUB MdF_Battuta_X_After_RegFacc

      MdF_Cambiato_att = VAR_VAL_STR(idx_att, "MdF_Cambiato")
      bas0_att = base_0.y
      alt0_att = alto_0.y
      bas0_CamMdF = VAR_VAL(idx_CamMdF, "base_0.y")
      alt0_CamMdF = VAR_VAL(idx_CamMdF, "alto_0.y")

      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "MdF_CamMdFrontali") != 1)
         {
          GOSUB MdF_Cam_Elimina
         }

      if ( bas0_att == bas0_CamMdF  &  alt0_att == alt0_CamMdF
         & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "Dim*") != 1
         )
         { DEL_VAR(idx_att, "MdF_Cambiato") }

      if ( STRCMP(KeyFamRegFacc_att, KeyFamRegFacc) != 0
         | STRCMP(MdF_Aper_att, MdF_Apertura) != 0
         | X_att != X
         | Y_att != Y
         | px_CerBat1_att != px_CerBat1
         | py_CerBat1_att != py_CerBat1
         | py_CerBat2_att != py_CerBat2
         | py_CerBat3_att != py_CerBat3
         | py_CerBat4_att != py_CerBat4
         | py_CerBat5_att != py_CerBat5
         | py_CerBat6_att != py_CerBat6
         | py_CerBat7_att != py_CerBat7
         | py_CerBat8_att != py_CerBat8
         | Battuta_X_att != Battuta_X
         )
         {
          WITH_VAR_LOCAL(idx_att, "mdf_Visgraf", "escl_Grafica", 2, 1, "0")

          if (mdf_Visgraf <= 0)
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " x MdF_Ctrl_Cambiamenti ", MdF_Cambiato_att)) }
          else
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_Ctrl_Cambiamenti ", MdF_Cambiato_att)) }
          MdF_Cambiato_att = STRCAT(MdF_Cambiato_att, " , Ricalcolato")
         }

      if (VAR_VAL(-1, "CAM_Visualize") > 99)
         { COMANDO2(STRCAT("LOGMSG } MdF_Ctrl_Cambiamenti ", NOME(idx_att), " idx_att=", STR(idx_att), " ", DATA(0))) }
   }

   Procedura MdF_Ctrl_Cer_ChangeUte
   {
      if (IS_IDX(idx_att) != 1)            { EXITSUB() }
      if (IS_IDX(PADRE(idx_att, 1)) != 1)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "KeyFamRegFacc_att") != 1)
         {
          if ($MdF_NO_LOGMSG == 0)
             {
              COMANDO2(STRCAT("LOGMSG MdF_Ctrl_Cer_ChangeUte senza KeyFamRegFacc_att ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
             }
          EXITSUB()
         }

      // Se l'utente cambia variabili di componenti sensibili devo per forza rileggere le tabelle
      // Basta richiamre questa procedura solo appunto al cambio di determinate situazioni
      // PEr un Gruppo Cerniere il tempo è comunque impercettibile
      mdf_prosegui_action1 = 2

      MdF_Ctrl_Cer_ChangeUte = 1

      mdfsys_Collision1_att = VAR_VAL(idx_att, "MdfSys_Collision1")
      mdfsys_Collision2_att = VAR_VAL(idx_att, "MdfSys_Collision2")
      mdfsys_Collision3_att = VAR_VAL(idx_att, "MdfSys_Collision3")
      mdfsys_Collision4_att = VAR_VAL(idx_att, "MdfSys_Collision4")
      mdfsys_Collision5_att = VAR_VAL(idx_att, "MdfSys_Collision5")
      mdfsys_Collision6_att = VAR_VAL(idx_att, "MdfSys_Collision6")
      mdfsys_Collision7_att = VAR_VAL(idx_att, "MdfSys_Collision7")
      mdfsys_Collision8_att = VAR_VAL(idx_att, "MdfSys_Collision8")
      // Come MdF_CerBat_Collision_Post.
      // Se MdF_Ctrl_Cer_ChangeUte eseguito a fine caricamento ordine e cambia la Y dell' elemento in collisione, si sistema lo sposta e il CAM,
      // ma graficamente non si spostano le cerniere senza un ricalcola
      mdfsys_Collision1_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision1_y_mm")
      mdfsys_Collision2_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision2_y_mm")
      mdfsys_Collision3_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision3_y_mm")
      mdfsys_Collision4_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision4_y_mm")
      mdfsys_Collision5_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision5_y_mm")
      mdfsys_Collision6_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision6_y_mm")
      mdfsys_Collision7_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision7_y_mm")
      mdfsys_Collision8_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision8_y_mm")

      mdfsys_collY_sposta1_att = VAR_VAL(idx_att, "MdfSys_collY_sposta1")
      mdfsys_collY_sposta2_att = VAR_VAL(idx_att, "MdfSys_collY_sposta2")
      mdfsys_collY_sposta3_att = VAR_VAL(idx_att, "MdfSys_collY_sposta3")
      mdfsys_collY_sposta4_att = VAR_VAL(idx_att, "MdfSys_collY_sposta4")
      mdfsys_collY_sposta5_att = VAR_VAL(idx_att, "MdfSys_collY_sposta5")
      mdfsys_collY_sposta6_att = VAR_VAL(idx_att, "MdfSys_collY_sposta6")
      mdfsys_collY_sposta7_att = VAR_VAL(idx_att, "MdfSys_collY_sposta7")
      mdfsys_collY_sposta8_att = VAR_VAL(idx_att, "MdfSys_collY_sposta8")

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili

      GOSUB MdF_Battuta_X
      GOSUB Reg_pos_CerBat
      GOSUB MdF_Battuta_X_After_RegFacc

      GOSUB MdF_CerBat_Collision

      mdf_prosegui_action1 = 0
      MdF_Ctrl_Cer_ChangeUte = 0

      //COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_Ctrl_CollisionCer"))

      mdf_collisionCer_Change = 0
      iM=1
      while (VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(iM))) == 1)
         {
          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_att")) )
             {
              mdf_collisionCer_Change = 1
             }
         // 18.05.2021
          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM), "_y_mm")) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_y_mm_att")) )
             {
              mdf_collisionCer_Change = 2
             }
          if (VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_collY_sposta", STR(iM), "_att")) )
             {
              mdf_collisionCer_Change = 4
             }
          iM = iM+1
         }
      if (mdf_collisionCer_Change > 0)
         { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x mdf_collisionCer_Change")) }
   }

   Procedura MdF_CerBat_Collision_Post
   {
      if (IS_IDX(idx_att) != 1)            { EXITSUB() }
      if (IS_IDX(PADRE(idx_att, 1)) != 1)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "KeyFamRegFacc_att") != 1)
         {
          if ($MdF_NO_LOGMSG == 0)
             {
              COMANDO2(STRCAT("LOGMSG MdF_CerBat_Collision_Post senza KeyFamRegFacc_att ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
             }
          EXITSUB()
         }

      GOSUB MdF_Battuta_X

      GOSUB mdfsys_Collision_att

      idx_MdF_Var = idx_att
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili

      GOSUB MdF_CerBat_Collision

      mdf_collisionCer_Post = 0
      iM=1
      while (VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(iM))) == 1)
         {
          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_att")) )
             {
              mdf_collisionCer_Post = 1
             }

          if (VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(iM), "_y_mm")) != VAR_VAL(idx_att, STRCAT("mdfsys_Collision", STR(iM), "_y_mm_att")) )
             {
              mdf_collisionCer_Post = 2
             }
          if (VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(iM))) != VAR_VAL(idx_att, STRCAT("mdfsys_collY_sposta", STR(iM), "_att")) )
             {
              mdf_collisionCer_Post = 4
             }

          iM = iM+1
         }

      if ( mdf_collisionCer_Post <= 0
         & Battuta_X_att != Battuta_X
         )
         { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x Battuta_X punti notevoli Fianchi corretti troppo tardi MdF_CerBat_Collision_Post")) }

      if (mdf_collisionCer_Post > 0)
         { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_CerBat_Collision_Post")) }
   }

   Procedura MdF_CerBat_Msg_Collision
   {
      GOSUB MdF_CerBat_Msg_Collision
   }
}

Elemento MdF_CernieraBasetta_Batt
{
   Descrizione = "CERNIERA_Basetta battente per ddp grezzo"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       OnChangedVar

   Variabili
   {
      X  "X Cern"            42
      Y  "Spess. Cerniera"   58
      Z  "Alt. Cerniera"     50
      HIDE  ""  1

      PosizioneCerniera    "Posizione Cerniera"                   "SX"
      KeyFamRegFacc        "Famiglia Lavorazione"                 ""
      id_Cer               "identificativo per CHIAVE_TAB_CAM"    0

      escl_Grafica         "visualizza grafica"     1

      X_BasFia       "Largh basetta"            10
      Y_BasFia       "Altezza basetta"          40
      Z_BasFia       "Prof.   basetta"          39

      X_eleFro       "Largh cerniera"           35
      Y_eleFro       "Altezza cerniera"         50
      Z_eleFro       "Prof.   cerniera"          8

      pos_X_cerAnta  "pos in x lav su anta"      5
      pz_CerBat      "pos in z lav su Fianco"   30
      Battuta_Z      "Battuta in Z"              0

     // 12.09.2024 menu con valore negativo funziona dalla 11.303
      posY_Utente    "Spostamento Y da Utente"   0 ShowAlways
      //posY_Utente    "Spostamento Y da Utente"   0 Utente ( ) <min=-32;max=32>

      mdf_modif_Ute  "modifiche da Utente"       0
      MdF_Utente     "Gestione cer da utente"    "-1"  NoSave

      spazioEdit1    " "                          "" ShowAlways
      spazioEdit2    " "                          "" ShowAlways

      posY_attualeReg  "-- Pos Y da RegolaCAM --"  0 ShowAlways
      posY_New         ">  Pos Y Nuova Utente  <"  0 ShowAlways

     // 19.01.2021
      escluso        "escl Cerniera"             0
      cerCancellata  "Elimina Cerniera"          0 Boolean

      // 19.06.2019 - serve per Virtuo
      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      // Compatibilità 2013 campo Visualizza RegFacc 0 o 1
      if (VAR_EXIST(PADRE(idx_att, 1), STRCAT("Visualizza_CerBat",STR(id_Cer))) )
         { escl_Grafica = 1-VAR_VAL(PADRE(idx_att, 1), STRCAT("Visualizza_CerBat",STR(id_Cer)) ) }

      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("Visualizza_CerBat",STR(id_Cer)) )
      GOSUB mdf_Visualize

      if (VAR_EXIST(PADRE(idx_att, 1), STRCAT("X_CerBat", STR(id_Cer))) == 1)
         {
          X_eleFro = VAR_VAL(PADRE(idx_att, 1), STRCAT("X_CerBat", STR(id_Cer)))
          Y_eleFro = VAR_VAL(PADRE(idx_att, 1), STRCAT("Y_CerBat", STR(id_Cer)))
          Y_BasFia = VAR_VAL(PADRE(idx_att, 1), STRCAT("Y_CerBat", STR(id_Cer)))
          Z_BasFia = VAR_VAL(PADRE(idx_att, 1), STRCAT("Z_CerBat", STR(id_Cer)))
          X = X_eleFro
          Y = Y_eleFro
          Z = Z_BasFia
          if (VAR_VAL(PADRE(idx_att, 1), STRCAT("pz_CerBat", STR(id_Cer)) ) > 0)
             { pz_CerBat = VAR_VAL(PADRE(idx_att, 1), STRCAT("pz_CerBat", STR(id_Cer)) ) }
         }
      else
         {
          iC=1
          while (iC <= 8)
             {
              if (VAR_EXIST(PADRE(idx_att, 1), STRCAT("X_CerBat", STR(iC))) == 1)
                 {
                  X_eleFro = VAR_VAL(PADRE(idx_att, 1), STRCAT("X_CerBat", STR(iC)))
                  Y_eleFro = VAR_VAL(PADRE(idx_att, 1), STRCAT("Y_CerBat", STR(iC)))
                  Y_BasFia = VAR_VAL(PADRE(idx_att, 1), STRCAT("Y_CerBat", STR(iC)))
                  Z_BasFia = VAR_VAL(PADRE(idx_att, 1), STRCAT("Z_CerBat", STR(iC)))
                  X = X_eleFro
                  Y = Y_eleFro
                  Z = Z_BasFia
                  if (VAR_VAL(PADRE(idx_att, 1), STRCAT("pz_CerBat", STR(iC)) ) > 0)
                     { pz_CerBat = VAR_VAL(PADRE(idx_att, 1), STRCAT("pz_CerBat", STR(iC)) ) }

                  iC = iC+100
                 }
              iC = iC+1
             }
         }
      if (VAR_VAL(PADRE(idx_att, 1), "Battuta_Z") > 0)
         { Battuta_Z = VAR_VAL(PADRE(idx_att, 1), "Battuta_Z") }

     // 29.05.2017
      if (Y_BasFia > 34)
         {
          if (STRLEN(VAR_VAL_STR(idx_att, "mdf_Visualize_sat")) < 1)  { Y_BasFia = 22 }
         }

      DescEdit__ = STRCAT("Cerniera_", STR(id_Cer), "_", KeyFamRegFacc)
      HIDE = 1
      if (VAR_VAL(PADRE(idx_att, 1), "HIDE") == 3)  { HIDE = 2 }
   }

   Controlli
   {
      if (ACTION() <= 0)  { EXITSUB() }

      MdF_Utente = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Utente")
      chiave_tabvar_mdf = "CerBat"
      GOSUB MdF_GEST

      posY_attualeReg = VAR_VAL(PADRE(idx_att, 1), STRCAT("py_CerBat",STR(id_Cer)) )
      // 15.01.2025
      posY_attualeRegAss = posY_attualeReg

      if (UN_PADRE("MdF_CerniereBattVY*") )
         {
          mdf_basy_VY = VAR_VAL(PADRE(idx_att, 1), "base_0.y")
          mdf_basy_FroPdr = VAR_VAL(PADRE(idx_att, 2), "base_0.y")

          mdf_diff_basy_Pdr = mdf_basy_VY-mdf_basy_FroPdr

          // Nel caso dei VaniCer si vuole il riferimento dall' anta padre. Forse teoricamente e' più corretto quindi per ora lo cambio
          posY_attualeReg = posY_attualeReg+mdf_diff_basy_Pdr
         }

     // 04.08.2022
      mdf_LivSpostaCerUte = VAR_VAL(PADRE(idx_att, 2), "MdfSys_LivSpostaCerUte")
      if (mdf_LivSpostaCerUte > 2)  { HIDE_ON_EDIT(idx_att, "posY_Utente", 1) }

      mdf_CER_base0y_SpostataUtente = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(id_Cer)))
      mdf_save_modif_Ute = -1
      if (VAR_EXIST(idx_att, "mdf_gia_iniz_bas0off") != 1)
         {
          if ( VAR_EXIST(idx_att, "base_0_offset") != 1
             & mdf_CER_base0y_SpostataUtente != 0
             )
             {
              mdf_modif_Ute = -1
              base_0_offset = [0, mdf_CER_base0y_SpostataUtente, 0]
              mdf_gia_iniz_bas0off = 1
             }
         // 07.08.2023 Se l' MdF_Utente ha fatto la modifica, ma il ServerCam non è abilitato la cerniera è in posizione sbagliata,
          // ma anche se un altro utente non abilitato apre l' ordine la vedrebbe sbagliata
          // Dato che per la gestione mdf_LivSpostaCerUte>=3 e' stata fatta la modifica qui sopra, la riporto anche qui
          // che comunque va fatta anche se non e' utente abilitato
          if (mdf_LivSpostaCerUte < 3)
             {
              mdf_gestStd_posYUte = 1
              if ( VAR_VAL(-1, "MdF_Gestione_Utente_Std") < 1
                 & VAR_EXIST(idx_att, "mdf_gia_iniz_bas0off") != 1
                 )
                 { mdf_gestStd_posYUte = 0 }

              // 13.11.2024
              if ( VAR_VAL(PADRE(idx_att, 1), "mdf_save_prec") > 0
                 // 11.12.2024 PK49446
                 //& STR_INDEX_OF(MdF_Utente, 0, chiave_tabvar_mdf) == -1
                 // 07.02.2025 VD 2024OVC856925_bug_base_0_off
                 // Un anno fa entrava diretta qui, altrimenti non trova base_0_offset.y qui sotto
                 | mdf_gestStd_posYUte == 0
                 )
                 {
                  // 11.12.2024
                  mdf_save_modif_Ute = 0.1
                  if ( VAR_EXIST(idx_att, "base_0_offset") != 1
                     & posY_Utente != 0
                     )
                     {
                      // 13.11.2024
                      //mdf_modif_Ute = -1
                      base_0_offset = [0, posY_Utente, 0]
                      mdf_gia_iniz_bas0off = 2
                     // 10.09.2024
                      if (VAR_VAL(-1, "MdF_Gestione_Utente_Std") >= 1)
                         {
                          mdf_save_modif_Ute = 1
                          // 13.11.2024 in teoria con l' if mdf_save_prec non serve piu perchè lo fa già il padre, ma comunque si può lasciare
                          COMANDO2(STRCAT("NO_AUTO ", STR(PADRE(idx_att, 1))))
                         // 17.02.2025 Devo sistemare i punti notevoli
                          // Occhio a cam.ini se ha MdF_Utente="CerBat" passava sotto
                          mdf_modif_Ute_caricOrd = 1.1
                          COMANDO2(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_ da RIT posY_Utente=", STR(posY_Utente)))
                         // PK 2024_POK15_AG100_00364 Se per caso serve all' AntaSingola sapere dello spostamento CerBat e devo gestire anche le collisioniCerBat post modifica quota utente
                          COMANDO2(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 2)), " no_agganciati", " // ", NOME(idx_att), " x MdF_Utente CerBat CaricaOrd posY_Utente=", STR(posY_Utente)))
                         }
                     }
                 }
             }
         }

     // 23.05.2022 MdF_Utente dal padre che puo essere modificato da VariabiliMdF.txt
      if ( STR_INDEX_OF(MdF_Utente, 0, chiave_tabvar_mdf) > -1
         // 17.02.2025 Se cam.ini ha MdF_Utente="CerBat" passava comunque. Ma devo passare sopra correttamente se ricarico l' ordine
         )
         {
          if (VAR_EXIST(idx_att, "mdf_Utente_entry") != 1)  { mdf_Utente_entry = MdF_Utente }

          CAM_loadOrder = 0
          if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
          if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }

          if (mdf_LivSpostaCerUte < 3)
             {
              // 11.09.2024
              if (VAR_VAL(-1, "MdF_Gestione_Utente_Std") < 1)
                 {
                  if (VAR_VAL(idx_att, "base_0_offset.y") != posY_Utente)
                     {
                      posY_Utente = VAR_VAL(idx_att, "base_0_offset.y")
                      COMANDO2(STRCAT("VAR_CHANGE 1 ", STR(idx_att), " posY_Utente=", STR(base_0_offset.y)))
                      // 26.11.2020
                      VAR_VALUE_SET(PADRE(idx_att, 1), "posY_Utente", posY_Utente)
                      COMANDO2(STRCAT("NO_AUTO ", STR(PADRE(idx_att, 1))))
                      if (mdf_modif_Ute == 0)
                         {
                          mdf_modif_Ute = 1
                          COMANDO2(STRCAT("VAR_CHANGE 1 ", STR(idx_att), " mdf_modif_Ute=", STR(mdf_modif_Ute)))
                         }
                     }
                 }
             // 11.09.2024
              if ( VAR_VAL(idx_att, "base_0_offset.y") != posY_Utente
                 & VAR_VAL(-1, "MdF_Gestione_Utente_Std") >= 1
                 )
                 {
                  base_0_offset = [0, posY_Utente, 0]
                  VAR_VALUE_SET(PADRE(idx_att, 1), "posY_Utente", posY_Utente)
                  COMANDO2(STRCAT("NO_AUTO ", STR(PADRE(idx_att, 1))))
                  mdf_save_modif_Ute = 2
                  // Se rimodifico con un altro valore deve entrare comunque
                  //if (mdf_modif_Ute == 0)
                  if (ACTION() != 2)
                     {
                      if (VAR_VAL(idx_att, "mdf_modif_Ute") < 0)  { mdf_modif_Ute = 0 }
                      mdf_modif_Ute = VAR_VAL(idx_att, "mdf_modif_Ute") + 1
                      COMANDO2(STRCAT("VAR_CHANGE 1 ", STR(idx_att), " mdf_modif_Ute=", STR(mdf_modif_Ute)))
                      if (VAR_EXIST(idx_att, "VAR_Versione_CAM_inc") != 1)
                         { COMANDO2(STRCAT("VAR_CHANGE 1 ", STR(idx_att), " VAR_Versione_CAM_inc=", APICI(), VAR_VAL_STR(-1, "VAR_Versione_CAM_inc"), APICI() )) }
                     // 14.11.2024 per sistemare Punti Notevoli base_0.y se appena dopo viene fatto VAR_VAL(idx, "base_0.y")
                      COMANDO2(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_Utente CerBat posY_Utente=", STR(posY_Utente)))

                     // Se per caso serve all' AntaSingola sapere dello spostamento CerBat e devo gestire anche le collisioniCerBat post modifica quota utente
                      // 04.04.2025 PK652421 Aggiunto controllo ma in realtà sistemata MdF_Ctrl_Dim
                      mdf_ricalc_posy = 1
                      if (IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "Dim*") )
                         {
                          mdf_ricalc_posy_deb = 1
                          mdf_ricalc_posy = 0
                         }
                      if (mdf_ricalc_posy > 0)
                         {
                          COMANDO2(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 2)), " no_agganciati", " // ", NOME(idx_att), " x MdF_Utente CerBat posY_Utente=", STR(posY_Utente)))
                         }
                     }
                 }
             // 16.01.2025 altrimenti salva lo stesso
              // VAR_CHANGE 3 \459\@a7\an0\@RA3\cer2 VarsUser__="posY_Utente"
              if (posY_Utente == 0)
                 {
                  VarsUser_click = VAR_VAL_STR(idx_att, "VarsUser__")
                  if (VarsUser_click == "posY_Utente")
                     {
                      // Non sembra funzionare
                      DEL_VAR_MODIFICATE(idx_att, "posY_Utente")
                      DEL_VAR_MODIFICATE(idx_att, "VarsUser__")
                      DEL_VAR(idx_att, "VarsUser__")
                     }
                 }
             }
          else
             {
              if (VAR_VAL(idx_att, "base_0_offset.y") != mdf_CER_base0y_SpostataUtente)
                 {
                  COMANDO2(STRCAT("VAR_CHANGE 1 ", STR(PADRE(idx_att, mdf_LivSpostaCerUte)), " MDF_CER_base0y_SpostataUtente", STR(id_Cer), "=", STR(VAR_VAL(idx_att, "base_0_offset.y"))))
                  if (mdf_modif_Ute == 0)  { mdf_modif_Ute = 1 }
                 }
             }
         }
      else
         {
          // Se sono un utente non abilitato e apro un ordine con cerniera spostata deve controllare mdf_CER_base0y_SpostataUtente = a base_0_offset.y
          if (mdf_LivSpostaCerUte <= 2)
             {
              mdf_deb_basoffsety = VAR_VAL(idx_att, "base_0_offset.y")
              mdf_debposY_Utente = posY_Utente
             // 23.05.2022
              if ( VAR_VAL(idx_att, "base_0_offset.y") != posY_Utente
                 // 07.08.2023 error
                 //& VAR_EXIST(idx_att, "base_0_offset.y")
                 & VAR_EXIST(idx_att, "base_0_offset")
                 )
                 {
                  DISPLAY2(STRCAT("Frontale ", STR(idx_att), " ", NOME(PADRE(idx_att, -1)), " non abilitato allo spostamento Cerniere manuale. MdF_Utente=", MdF_Utente, ". Contattare uff.Tecnico"))
                  DEL_VAR(idx_att, "base_0_offset")
                 // 07.08.2023
                  DEL_VAR(idx_att, "mdf_gia_iniz_bas0off")
                  COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_agganciati", " // ", NOME(idx_att), " x MdF_Utente CerBat non abilitato"))
                 }
             }
          else
             {
              // Se sono un utente non abilitato e apro un ordine con cerniera spostata deve controllare mdf_CER_base0y_SpostataUtente = a base_0_offset.y
              if (mdf_CER_base0y_SpostataUtente != VAR_VAL(idx_att, "base_0_offset.y") )
                 {
                 // 23.05.2022
                  if ( VAR_VAL(idx_att, "base_0_offset.y") != mdf_CER_base0y_SpostataUtente
                     // 07.08.2023 il VAR_EXIST dev' essere su base_0_offset
                     //& VAR_EXIST(idx_att, "base_0_offset.y")
                     & VAR_EXIST(idx_att, "base_0_offset")
                     )
                     {
                      DISPLAY2(STRCAT("Frontale ", STR(idx_att), " ", NOME(PADRE(idx_att, -1)), " non abilitato allo spostamento Cerniere manuale. MdF_Utente=", MdF_Utente, ". Contattare uff.Tecnico"))
                      if (mdf_CER_base0y_SpostataUtente == 0)  { DEL_VAR(idx_att, "base_0_offset") }
                     // 07.08.2023
                      DEL_VAR(idx_att, "mdf_gia_iniz_bas0off")
                      COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_agganciati", " // ", NOME(idx_att), " x MdF_Utente CerBat non abilitato"))
                     }
                 // 07.08.2023 Come sopra. In ogni caso doveva essere temporaneo
                 }
             }
         }

     // 09.02.2018
      // solo una volta. Per esempio in caricamento ordine dato che gli MdF vengono aggiunti per ultimi
      if (VAR_VAL(PADRE(idx_att, 2), "MCB_Bdm_Ctrl_se_collide") == 1)
         {
          if (VAR_EXIST(idx_att, "mcb_Ricalcolato_se_collide") != 1)
             {
              mcb_Ricalcolato_se_collide = 1
              WITH_VAR_LOCAL(PADRE(idx_att, 4), "mdf_ctrl_collis", "MCB_Bdm_Ricalcola_se_collide", 2, 1, "1")
              // 16.02.2018
              mir=1
              while (mir <= mdf_ctrl_collis)
                 {
                  mdf_nome_arc_collis = NOME(mdf_ctrl_collis[mir])
                  BOX_MODE(0)
                  NEAR_GLOBALE("mdf_ctrl_collide", idx_att, 16, 1, mdf_nome_arc_collis)
                  if (mdf_ctrl_collide > 0)
                     {
                      if (mdf_ctrl_collide[1] == mdf_ctrl_collis[mir])
                         {
                          COMANDO(STRCAT("RICALCOLA_UNA ", STR(mdf_ctrl_collis[mir]), " no_agganciati", " // ", NOME(idx_att), " x MCB_Bdm_Ricalcola_se_collide"))
                         }
                     }
                  mir = mir+1
                 }
             }
         }
     // 08.03.2022
      mdfliv_makedelcer = VAR_VAL(PADRE(idx_att, 2), "MdfSys_MakeDelCer")
     // 03.08.2022
      if (mdfliv_makedelcer > 2)
         {
          HIDE_ON_EDIT(idx_att, "cerCancellata", 1)
         // 14.10.2022
         // 18.10.2022
          VarsUser = VAR_VAL_STR(idx_att, "VarsUser__")
          if ( cerCancellata == 1
             & VarsUser == "cerCancellata"
             )
             {
              DISPLAY2("Non è questa la procedura per eliminare una Cerniera. Posizionati sulla cerniera destraMouse ed elimina")
              cerCancellata = 0
              DEL_VAR_MODIFICATE(idx_att, "cerCancellata")
              DEL_VAR_MODIFICATE(idx_att, "VarsUser__")
              if (VarsUser == "cerCancellata")
                 {
                  DEL_VAR(idx_att, "VarsUser__")
                 }
             }
         }

     // 19.01.2021
      if (VAR_VAL(idx_att, "cerCancellata") == 1)
         {
          escluso = 2
          escl_Grafica = 1
          cam_KeyRegMdF = "CerBat"
          if ( STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) > -1
             & VAR_EXIST(idx_att, "cerEliminata") != 1
             )
             {
              if (VAR_VAL(PADRE(idx_att, 2), "MdfSys_MakeDelCer") <= 0)
                 {
                  if (VAR_VAL(idx_att, "cerCancellata") == 1)
                     {
                     // Devo salvare che l'ho eliminata
                      COMANDO2(STRCAT("NO_AUTO ", STR(PADRE(idx_att, 1))))
                      COMANDO(STRCAT("VAR_CHANGE 3 ", STR(idx_att), " cerCancellata=1"))
                     // 08.03.2022
                      //COMANDO(STRCAT("VAR_CHANGE 3 ", STR(PADRE(idx_att, 1)), " cerCancellataUtente=1"))
                     // Se il padre è il Frontale Vestito dovrei salvare anche lui. Per ora faccio con MdfSys_MakeDelCer
                      //COMANDO2(STRCAT("NO_AUTO ", STR(PADRE(idx_att, 2))))
                      //COMANDO(STRCAT("VAR_CHANGE 3 ", STR(PADRE(idx_att, 2)), " MDF_cerCancellataUtente", STR(id_Cer), "=1"))
                     }
                  cerEliminata = 1
                  COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_agganciati", " // ", NOME(idx_att), " x Elimina CER da Utente"))
                 }
              else
                 {
                  cerEliminata = 1
                  escluso = 2
                  COMANDO(STRCAT("VAR_CHANGE 3 ", STR(PADRE(idx_att, mdfliv_makedelcer)), " MDF_cerCancellataUtente", STR(id_Cer), "=1"))
                  COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_agganciati", " // ", NOME(idx_att), " x MDF_cerCancellataUtente"))

                 // 13.11.2023 per MCB_ SoloForo_FIANCO
                  if (VAR_VAL(PADRE(idx_att, 2), "MdF_sat_Basetta_Attrezzata") > 0)
                     {
                      if (VAR_EXIST(PADRE(idx_att, 2), "exitBattuta_SX") )
                         {
                          mdf_idx_Batt_SX = VAR_VAL(PADRE(idx_att, 2), "exitBattuta_SX")
                          if ( IS_IDX(mdf_idx_Batt_SX)
                             & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura"), "SX*")
                             )
                             {
                              COMANDO(STRCAT("RICALCOLA_UNA ", STR(mdf_idx_Batt_SX), " no_agganciati", " // ", NOME(idx_att), " BasFiaSX x MDF_cerCancellataUtente"))
                             }
                         }
                      if (VAR_EXIST(PADRE(idx_att, 2), "exitBattuta_DX") )
                         {
                          mdf_idx_Batt_DX = VAR_VAL(PADRE(idx_att, 2), "exitBattuta_DX")
                          if ( IS_IDX(mdf_idx_Batt_DX)
                             & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura"), "DX*")
                             )
                             {
                              COMANDO(STRCAT("RICALCOLA_UNA ", STR(mdf_idx_Batt_DX), " no_agganciati", " // ", NOME(idx_att), " BasFiaDX x MDF_cerCancellataUtente"))
                             }
                         }
                     }
                 }
             }

          if ( VAR_EXIST(idx_att, "cerEliminata") != 1
             & UN_PADRE("MECC*UTENTE*")
             )
             {
              if (VAR_VAL(PADRE(idx_att, 2), "MdfSys_MakeDelCer") <= 0)
                 {
                  // Sono gia UTENTE quindi non serve fare altro
                  cerEliminata = 1
                  COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_agganciati", " // ", NOME(idx_att), " x Elimina CER da Utente"))
                 }
             }
         }
     // 08.03.2022
      mdf_var_canc = STRCAT("MDF_cerCancellataUtente", STR(id_Cer))
      if (VAR_VAL(PADRE(idx_att, mdfliv_makedelcer), mdf_var_canc) == 1)
         { escluso = 2 }

      HIDE_ON_EDIT(idx_att, "posY_New", 1)
      if (UN_PADRE("MECC*UTENTE*") )
         {
          HIDE = 1
          HIDE_ON_EDIT(idx_att, "posY_Utente", 1)
          py_ute = VAR_VAL(PADRE(idx_att, 1), "py_CerBat1")
          DescEdit__ = STRCAT("Cerniera_UTE_", KeyFamRegFacc, "_py", STR(py_ute))
         // 02.09.2024
          HIDE_ON_EDIT(idx_att, "posY_attualeReg", 1)
         }

     // 06.09.2024
      posY_New = posY_attualeReg + posY_Utente
      if (VAR_VAL(-1, "MdF_Gestione_Utente_Std") >= 1)
         {
          DescEdit__ = STRCAT("Cerniera_", STR(id_Cer), "_", KeyFamRegFacc)
          M4_NO_OFFS = 1
          HIDE_ON_EDIT(idx_att, "cerCancellata", 1)
          // 16.01.2025
          //str_min_Y = posY_attualeRegAss-40
          str_min_Y = posY_attualeReg-40

         // 12.09.2024
          y_TCtrl = VAR_VAL(PADRE(idx_att, 2), "Y")
          if (VAR_EXIST(PADRE(idx_att, 2), "MdF_Pan_Y") )  { y_TCtrl = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }

          //str_max_Y = y_TCtrl-posY_attualeRegAss-40
          str_max_Y = y_TCtrl-posY_attualeReg-40
          if (UN_PADRE("MECC*UTENTE*") != 1)
             {
              chiave_tabvar_mdf = "CerBat"
              if (STR_INDEX_OF(MdF_Utente, 0, chiave_tabvar_mdf) > -1)
                 {
                  // menu con valore negativo funziona dalla 11.303
                  //VAR_SET_MODE(idx_att, "posY_Utente", $MODE_USER)
                  //VAR_SET_MENU(idx_att, "posY_Utente", STRCAT("( ", "-", str_max_Y, " )"))
                  VAR_SET_MODE(idx_att, "posY_Utente", 1048577)
                  VAR_SET_MENU(idx_att,"posY_Utente",STRCAT("( <min=-",STR(str_min_Y),";max=",STR(str_max_Y),"> )"))
                 }
              HIDE_ON_EDIT(idx_att, "posY_attualeReg", 0)
              HIDE_ON_EDIT(idx_att, "posY_New", 0)
             }
         }
     // 01.04.2025 Sc1057672
      if ( VAR_VAL(-1, "MdF_Gestione_Utente_Std") < 1
         & UN_PADRE("MECC*UTENTE*") != 1
         )
         {
          if ( posY_New == posY_attualeReg
             & VAR_VAL(idx_att, "base_0_offset.y") != 0
             )
             {
              posY_New = posY_attualeReg + VAR_VAL(idx_att, "base_0_offset.y")
              HIDE_ON_EDIT(idx_att, "posY_New", 0)
             }
         }
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Procedura OnChangedVar
   {
     // 01.04.2025 Sc1057672
      if ( VAR_VAL(-1, "MdF_Gestione_Utente_Std") < 1
         & UN_PADRE("MECC*UTENTE*") != 1
         )
         {
          if (posY_New != posY_attualeReg)
             {
              if (VAR_VAL(PADRE(idx_att, 2), "MdF_sat_Basetta_Attrezzata") > 0)
                 {
                  if ( VAR_EXIST(idx_att, "mdf_idx_Basetta")
                     & IS_IDX(VAR_VAL(idx_att, "mdf_idx_Basetta") )
                     )
                     {
                      WITH_VAR("mdf_search_sat", "idx_MdFgraf", 0, 1, STR(mdf_idx_Basetta))
                      mis = 1
                      while (mis <= mdf_search_sat)
                         {
                          COMANDO(STRCAT("RICALCOLA_UNA ", STR(mdf_search_sat[mis]), " no_ridisegna no_agganciati", " // da=", NOME(idx_att), " ", STR(idx_att)))
                          mis = mis+1
                         }
                     }
                 }
             }
         }

      GOSUB "@$OnChangedVar_CerniereBasette_proc"
   }

  // 06.02.2025 Se clicco senza cambiare valore
   // Prima di versione M4 DlgVar del 6.02.2025
   Procedura CtrlVarUserNoChange
   {
      VarsUser_click = VAR_VAL_STR(idx_att, "VarsUser__")
      mdf_LivSpostaCerUte = VAR_VAL(PADRE(idx_att, 2), "MdfSys_LivSpostaCerUte")
      if (mdf_LivSpostaCerUte <= 2)
         {
          if ( VAR_VAL(idx_att, "posY_Utente") == 0
             & VAR_EXIST(idx_att, "base_0_offset") != 1
             )
             {
              // VarsUser__ è ancora vuota se non faccio RIGENERA sia che modifico il valore sia che faccia ANNULLA o ESC
              // ma in ogni caso la resetto se non è cambiato niente
              mdf_ctrl_VarsUser = VarsUser_click
              DEL_VAR_MODIFICATE(idx_att, "*sposta_*Utente")
              DEL_VAR_MODIFICATE(idx_att, "VarsUser__")
             }
         }
   }

   Posiziona MdF_CernieraBatt  cern
   {
      @base_0 = base_0
      @X = X_eleFro
      @Y = Y_eleFro
      @Z = Z_eleFro
      @base_0.x = base_0.x
      @base_0.y = base_0.y - @Y/2
      @base_0.z = base_1.z - @Z
      @pos_X_cerAnta = pos_X_cerAnta
      if (IS_MATCH(PosizioneCerniera, "DX*") )
         {
          @base_0.x = base_3.x - @X
          @pos_X_cerAnta = @X - pos_X_cerAnta
         }

      @PosizioneCerniera = PosizioneCerniera
      @id_Cer = id_Cer
   }

   Posiziona MdF_BasettaSXDX  base
   {
      @base_0 = base_0
      @X = X_BasFia
      @Y = Y_BasFia
      @Z = Z_BasFia
      @base_0.y = base_0.y - @Y/2
      @base_0.z = base_1.z - @Z
      @pz_CerFia = pz_CerBat
      if (IS_MATCH(PosizioneCerniera, "DX*") )
         { @base_0.x = base_3.x - @X }
      @PosizioneCerniera = PosizioneCerniera
      @id_Cer = id_Cer

      if (VAR_EXIST(PADRE(idx_att, 1), "CAM_angoloBas") )
         {
          @ang_y = -1*VAR_VAL(PADRE(idx_att, 1), "CAM_angoloBas")
          // Il +- COSENO(@ang_y) in x,z è perché non mi viene perfetto, non ho capito bene perché,
          // dato che lo spigolo cerniera è perfettamente allineato, ma non ha gran
          // importanza dato che i posizionamenti si possono correggere sulle tab-fix
          // Sul destro invece mi esce perrfetto. Bo
          @base_0.x = base_0.x - @Z*SENO(@ang_y) + COSENO(@ang_y)
          @base_0.z = base_0.z - VAR_VAL(PADRE(idx_att, 1),"Battuta_X")*COSENO(@ang_y) - COSENO(@ang_y) + @Z*SENO(@ang_y) - @Z*COSENO(@ang_y)
          if (IS_MATCH(PosizioneCerniera, "DX*") )
             {
              @base_0.x = base_3.x - @X*COSENO(@ang_y) - @X*(1-ABS(SENO(@ang_y))) - @Z*SENO(@ang_y)
              @base_0.z = base_3.z + @X*SENO(@ang_y) - VAR_VAL(PADRE(idx_att, 1), "Battuta_X")*COSENO(@ang_y) - @Z*SENO(@ang_y) - @Z*COSENO(@ang_y)
             }
         }
     // 21.05.2021 PC04392 Se erroneamente c'è GEST_TipoCer AngPan95 e poi la cambio, posso azzerare MdF_angoloBas su VariabiliMdF
      // ma non mi azzera ang_y e offset x,z. Anmche se poi salvando e riaprendo nel Server in realtà il problema nel CAM non si presenterebbe
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_angoloBas") )
         {
          if (VAR_VAL(PADRE(idx_att, 1), "MdF_angoloBas") == 0)
             {
              @ang_y = 0
              @CAM_Lav_offx_Ang = 0
              @CAM_Lav_offz_Ang = 0
             }
         }

      if (VAR_VAL(PADRE(idx_att, 1), "MdF_angoloBas") != 0)
         {
          @ang_y = -1*VAR_VAL(PADRE(idx_att, 1), "MdF_angoloBas")
          @CAM_Lav_offx_Ang = -@Z*SENO(@ang_y)
          @CAM_Lav_offz_Ang = -@X*COSENO(@ang_y)
          if (ABS(@ang_y) >= 90)
             { @CAM_Lav_offz_Ang = -ABS(@Z*SENO(@ang_y)) }
          // Pens Ang45
          if (IS_MATCH(PosizioneCerniera, "DX*") )
             {
              @base_0.x = base_3.x
              @base_0.z = base_2.z - @Z
              if (VAR_VAL(PADRE(idx_att, 1), "MdF_angoloBas") < 0)
                 { @ang_y = VAR_VAL(PADRE(idx_att, 1), "MdF_angoloBas") }

             // 05.05.2022 per girare verso l' interno le cerALLVet DX con ang 90
              if (VAR_VAL(PADRE(idx_att, 1), "MdF_angoloBasDX") != 0)
                 { @ang_y = VAR_VAL(PADRE(idx_att, 1), "MdF_angoloBasDX") }

              @CAM_Lav_offx_Ang = -@Z*SENO(@ang_y) - @X
             }
          // 06.11.2024 da Al 2024OES000718 cliente 29.07.2024 ANP con FroFisso indentro di 1mm
          if (VAR_EXIST(PADRE(idx_att, 1), "MCB_offz_Bas") )  { @base_0.z = @base_0.z + VAR_VAL(PADRE(idx_att, 1), "MCB_offz_Bas") }
         }
      if (VAR_VAL(PADRE(idx_att, 1), "MdF_CerAng") == 1)
         {
          @base_0.x = base_0.x - VAR_VAL(PADRE(idx_att, 1), "MdF_BattutaXAng") - @X
          @base_0.z = base_0.z + @Z + VAR_VAL(PADRE(idx_att, 1), "MdF_BattutaXAng")
          if (IS_MATCH(PosizioneCerniera, "DX*") )
             {
              @base_0.x = base_3.x + VAR_VAL(PADRE(idx_att, 1), "MdF_BattutaXAng")
              @base_0.z = base_0.z + @Z + VAR_VAL(PADRE(idx_att, 1), "MdF_BattutaXAng")
             }
         }
      mdf_idx_Basetta = ATTUALE()
   }
  // 19.01.2021
   Procedura cancella
   {
      if ($StartingDel__ == ATTUALE())
         {
         // 02.09.2024
          if (UN_PADRE("MECC*UTENTE*") )
             {
              cerCancellata = 1
              $no_cancel = 1
             // Ridisegno, escludo i sat
              COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x Elimina CER da Utente"))
              COMANDO(STRCAT("VAR_SET$ $no_cancel=0"))
              EXITSUB()
             }

         // 08.03.2022
          cam_KeyRegMdF = "CerBat"
          if (STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) > -1)
             {
              cerCancellata = 1
              $no_cancel = 1
             // Ridisegno, escludo i sat
              COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x Elimina CER da Utente"))
              COMANDO(STRCAT("VAR_SET$ $no_cancel=0"))
             }
          else
             {
              $no_cancel = 1
              DISPLAY2("Utente non abilitato alla cancellazione cerniere manuale. Contattare uff.Tecnico")
              COMANDO(STRCAT("VAR_SET$ $no_cancel=0"))
             }
         }
   }

  // 30.11.2023 Sc1055382
   Procedura OffsetLocale
   {
      BOX_MODE(0)
      NEAR_GLOBALE("mdf_search_satBas", idx_att, 50, 1, "MdF_Sat_Bas*")
      // In teoria ne dovrebbe trovare una sola, ma anche se ne trova 2 o 3 non cambia molto
      mis = 1
      while (mis <= mdf_search_satBas)
         {
          COMANDO2(STRCAT("RICALCOLA_UNA ", STR(mdf_search_satBas[mis]), " no_agganciati", " // ", NOME(idx_att), " OffsetLocale x possibile cambio py_CerBat"))
          mis = mis+1
         }
   }
}

Elemento MdF_CernieraBatt
{
   Descrizione = "Grafica Cerniera su Anta"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  10
      Y  ""  10
      Z  ""  12

      tipoIncidenza        "X,Y,Z"                                 "Z"
      PosizioneCerniera    "Posizione Cerniera"                    "SX"
      escl_Grafica         "visualizza grafica"                     1
      pos_X_cerAnta        "pos in x lav su anta"                   5
      id_Cer               "identificativo per CHIAVE_TAB_CAM"      0

      mdf_nomeFile_sat     "nome file sat da graficare"             ""
      mdf_path_file_sat    "path file sat da graficare"             ""

      // per Virtuo
      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      CHIAVE_TAB_CAM = NOME(idx_att)
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att)) }

      nome_var_chiave = "CHIAVE_TAB_CAM_CerBat1"
      if (STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), nome_var_chiave)) > 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 2), nome_var_chiave) }

      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_CerBat", STR(id_Cer))
      if (STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), nome_var_chiave)) > 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 2), nome_var_chiave) }

      // Compatibilità 2013 campo Visualizza RegFacc 0 o 1
      if (VAR_EXIST(PADRE(idx_att, 2), STRCAT("Visualizza_CerBat",STR(id_Cer))) )
         { escl_Grafica = 1-VAR_VAL(PADRE(idx_att, 2), STRCAT("Visualizza_CerBat",STR(id_Cer)) ) }

      if (VAR_EXIST(PADRE(idx_att, 2), STRCAT("MdfSys_collY_sposta",STR(id_Cer))) )
         {
          MdfSys_collY_sposta = VAR_VAL(PADRE(idx_att, 2), STRCAT("MdfSys_collY_sposta",STR(id_Cer)))
         }

      id_Reg = VAR_VAL(PADRE(idx_att, 2), STRCAT("id_Reg_CerBat", STR(id_Cer)))

      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_att, 2), "Visualizza_CerBat1")
      GOSUB mdf_Visualize

      if (STRCMP($MdF_Visualize, "Always") != 0)
         {
          idx_CerBas = PADRE(idx_att, 1)
         // 19.05.2017
          if (VAR_EXIST(PADRE(idx_CerBas, 2), "MCB_Vis_CerBat") )
             { escl_Grafica = 1-VAR_VAL(PADRE(idx_CerBas, 2), "MCB_Vis_CerBat") }

          if (VAR_EXIST(PADRE(idx_CerBas, 1), "MCB_Vis_CerBat") )
             { escl_Grafica = 1-VAR_VAL(PADRE(idx_CerBas, 1), "MCB_Vis_CerBat") }
         }
   }

   Controlli
   {
      idx_MdF = PADRE(idx_att, 2)
      yMdF = VAR_VAL(idx_MdF, "Y")
      basy_MdF = VAR_VAL(idx_MdF, "base_0.y")

      MCB_offY_CerSup = VAR_VAL(idx_MdF, "MCB_offY_CerSup")
      MCB_offY_CerInf = VAR_VAL(idx_MdF, "MCB_offY_CerInf")

      if (ACTION() <= 0)
         {
          // 02.10.2019 AOVG745256 strano che solo in questo cli entra per ACTION 0
          cam_action = ACTION()
          // 05.10.2022 AOVG950863 prima era tutto a 0
          CAM_Lav_X = X-pos_X_cerAnta
          CAM_Lav_Y = Y/2
          CAM_Lav_Z = Z

          CAM_Lav_offx = pos_X_cerAnta
          CAM_Lav_offy = Y/2
          CAM_Lav_offz = 0

          //VAR_VALUE_SET(PADRE(idx_att, 2), "mdf_CerBat_Action0", 1)
          EXITSUB()
         }

      mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("img_sat_F1_CerBat", STR(id_Cer)))

      if (VAR_EXIST(PADRE(idx_MdF, 1), "MCB_img_sat_F1_CerBat") )
         { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MCB_img_sat_F1_CerBat") }

      if (VAR_EXIST(idx_MdF, "MCB_img_sat_F1_CerBat") )
         { mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, "MCB_img_sat_F1_CerBat") }

      // 21.11.2024
      mdf_indexof_sat_change = STR_INDEX_OF(VAR_VAL_STR(idx_att, "mdf_import_EXIST"), 0, mdf_nomeFile_sat)

      mdF_sat_offx = VAR_VAL(idx_MdF, "MCB_sat_F1_offx")
      mdF_sat_offy = VAR_VAL(idx_MdF, "MCB_sat_F1_offy")
      mdF_sat_offz = VAR_VAL(idx_MdF, "MCB_sat_F1_offz")
      mdF_sat_angz = VAR_VAL(idx_MdF, "MCB_sat_F1_angz")

     // 23.10.2023
      if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_F1_CerBat", STR(id_Cer))) )
         {
          mdfstr_input = VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_F1_CerBat", STR(id_Cer)))
          GOSUB MdF_EstraiStringhe
          // 20.05.2025 per permettere gestioni intermedie
          if (STRLEN(VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_F1_CerBat", STR(id_Cer))) ) > 3)
             {
              mdF_sat_offx = ATOI(mdf_array_Stringhe[1])
              mdF_sat_offy = ATOI(mdf_array_Stringhe[2])
              mdF_sat_offz = ATOI(mdf_array_Stringhe[3])
              mdF_sat_angz = ATOI(mdf_array_Stringhe[4])
             }
          if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*") )
             {
              if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##5") )
                 {
                  mdF_sat_offx = ATOI(mdf_array_Stringhe[5])
                  mdF_sat_offy = ATOI(mdf_array_Stringhe[6])
                  mdF_sat_offz = ATOI(mdf_array_Stringhe[7])
                  mdF_sat_angz = ATOI(mdf_array_Stringhe[8])
                 }
             }
         // 31.07.2024
          if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##9") )
             {
              mdF_sat_offx_2 = ATOI(mdf_array_Stringhe[9])
              mdF_sat_offy_2 = ATOI(mdf_array_Stringhe[10])
              mdF_sat_offz_2 = ATOI(mdf_array_Stringhe[11])
              mdF_sat_angz_2 = ATOI(mdf_array_Stringhe[12])
              if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*") )
                 {
                  if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##13") )
                     {
                      mdF_sat_offx_2 = ATOI(mdf_array_Stringhe[13])
                      mdF_sat_offy_2 = ATOI(mdf_array_Stringhe[14])
                      mdF_sat_offz_2 = ATOI(mdf_array_Stringhe[15])
                      mdF_sat_angz_2 = ATOI(mdf_array_Stringhe[16])
                     }
                 }
             }
          if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##17") )
             {
              mdF_sat_offx_3 = ATOI(mdf_array_Stringhe[17])
              mdF_sat_offy_3 = ATOI(mdf_array_Stringhe[18])
              mdF_sat_offz_3 = ATOI(mdf_array_Stringhe[19])
              mdF_sat_angz_3 = ATOI(mdf_array_Stringhe[20])
              if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*") )
                 {
                  if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##21") )
                     {
                      mdF_sat_offx_3 = ATOI(mdf_array_Stringhe[21])
                      mdF_sat_offy_3 = ATOI(mdf_array_Stringhe[22])
                      mdF_sat_offz_3 = ATOI(mdf_array_Stringhe[23])
                      mdF_sat_angz_3 = ATOI(mdf_array_Stringhe[24])
                     }
                 }
             }
          if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##25") )
             {
              mdF_sat_offx_4 = ATOI(mdf_array_Stringhe[25])
              mdF_sat_offy_4 = ATOI(mdf_array_Stringhe[26])
              mdF_sat_offz_4 = ATOI(mdf_array_Stringhe[27])
              mdF_sat_angz_4 = ATOI(mdf_array_Stringhe[28])
              if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*") )
                 {
                  if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##29") )
                     {
                      mdF_sat_offx_4 = ATOI(mdf_array_Stringhe[29])
                      mdF_sat_offy_4 = ATOI(mdf_array_Stringhe[30])
                      mdF_sat_offz_4 = ATOI(mdf_array_Stringhe[31])
                      mdF_sat_angz_4 = ATOI(mdf_array_Stringhe[32])
                     }
                 }
             }
          if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##33") )
             {
              mdF_sat_offx_5 = ATOI(mdf_array_Stringhe[33])
              mdF_sat_offy_5 = ATOI(mdf_array_Stringhe[34])
              mdF_sat_offz_5 = ATOI(mdf_array_Stringhe[35])
              mdF_sat_angz_5 = ATOI(mdf_array_Stringhe[36])
              if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*") )
                 {
                  if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##37") )
                     {
                      mdF_sat_offx_5 = ATOI(mdf_array_Stringhe[37])
                      mdF_sat_offy_5 = ATOI(mdf_array_Stringhe[38])
                      mdF_sat_offz_5 = ATOI(mdf_array_Stringhe[39])
                      mdF_sat_angz_5 = ATOI(mdf_array_Stringhe[40])
                     }
                 }
             }
         }

     // 07.05.2024 Ottimizzazioni
      if ( VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") > 0
         | STRLEN(mdf_nomeFile_sat) < 4
         // 06.09.2024
         | UN_PADRE("MdF_*VY*")
         // 21.11.2024
         | mdf_indexof_sat_change < 0
         )
         { GOSUB mdf_ADD_sat }

      if (VAR_EXIST(idx_att, "py_CerBat_prec") != 1)
         { py_CerBat_prec = VAR_VAL(PADRE(idx_att, 2), "py_CerBat1") }

     // 09.09.2024
      if (STRLEN(mdf_nomeFile_sat) >= 4)
         {
          if (UN_PADRE("MECC*UTE*") )
             {
              if (py_CerBat_prec != VAR_VAL(PADRE(idx_att, 2), "py_CerBat1"))
                 {
                  py_CerBat_prec = VAR_VAL(PADRE(idx_att, 2), "py_CerBat1")
                  // Se padre di 3 basta sulla cerniera e non serve anche sulla Basetta
                  COMANDO2(STRCAT("SHOW Strutture idx add ", STR(PADRE(idx_att, 3)), "  // py_CerBat1 change da idx=", STR(idx_att), " ", NOME(idx_att)))
                 }
             }
         }

      CAM_Lav_X = X-pos_X_cerAnta
      CAM_Lav_Y = Y/2
      CAM_Lav_Z = Z

      CAM_Lav_offx = pos_X_cerAnta
      CAM_Lav_offy = Y/2
      CAM_Lav_offz = 0

      CAM_DIM_X_reale = X
      CAM_DIM_Y_reale = Y
      CAM_DIM_Z_reale = Z

      if (VAR_EXIST(idx_att, "pos_X_cerAnta_prec") != 1)
         { pos_X_cerAnta_prec = pos_X_cerAnta }

      // VAR_VAL(idx_MdF, "MdF_AngAnta") != 0
      if ( IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*")
         & VAR_VAL(idx_MdF, "Battuta_X") <= 0
         )
         {
          Battuta_X = VAR_VAL(idx_MdF, "Battuta_X")
          CAM_Lav_X = X-pos_X_cerAnta - ABS(Battuta_X)
         }
   }

   PuntiNotevoli
   {
      idx_att = ATTUALE()
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_CilindroZ  cz
   {
      @escluso = escl_Grafica
     // 24.04.2018
      //if (VAR_VAL(idx_att, "mdf_vis_sat_da_var") > 0)  { @escluso = 1 }
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         )
         { @escluso = 1 }

      @base_0 = base_0
     // 20.02.2017
      //@base_0.x = base_0.x - (VAR_VAL(idx_MdF, "Battuta_X") - pos_X_cerAnta)
      mdf_gra_off_cil = X/2-9.1
      @base_0.x = base_0.x - X/2 + mdf_gra_off_cil
      if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*") )
         {
          @base_0.x = base_0.x + X/2 - mdf_gra_off_cil
         }
      @X = X
      @Y = Y
      @Z = Z
     // 23.04.2018
      if (VAR_VAL(PADRE(idx_MdF, 1), "MCB_Vis_CerBat") == 1)
         {
          @Z = 2
          @base_0.z = base_1.z - @Z/2
         }

     // 22-24.03.2021
      if (Y != X)  { @base_0.y = base_0.y + (Y-X)/2 }

      @c_rivestimento = [128, 128, 128]
   }

   Posiziona MdF_CilindroZ  cmod
   {
      @escluso = 1
      if ( escl_Grafica == 0  &  VAR_VAL(PADRE(idx_att, 1), "posY_Utente") != 0
         // 12.09.2024
         & VAR_VAL(-1, "MdF_Gestione_Utente_Std") != 1
         )
         { @escluso = 0 }
      @base_0 = base_0
      @base_0.x = base_0.x + Y/4
      @base_0.y = base_0.y + Y/4
      @X = Y/2
      @Y = Y/2
      @Z = Z
      @c_rivestimento = [200, 100, 10]
   }

   Posiziona Blocco  bmod
   {
      @escluso = 1
      if ( escl_Grafica == 0  &  VAR_VAL(PADRE(idx_att, 1), "posY_Utente") != 0
         // 12.09.2024
         & VAR_VAL(-1, "MdF_Gestione_Utente_Std") != 1
         )
         { @escluso = 0 }
      @base_0 = base_0
      @base_0.x = base_0.x + Y/4
      @base_0.y = base_0.y + Y/4
      @X = Y/2
      @Y = Y/2
      @Z = Z
      @c_rivestimento = [250, 120, 30]
   }

   Posiziona MdF_LavorazioneCAM  cam
   {
      @escluso = 1
      if ( VAR_VAL(PADRE(idx_att, 3), "MdF_CerBat_DDPPannello") == 1
         | VAR_VAL(PADRE(idx_att, 4), "MdF_CerBat_DDPPannello") == 1
         )
         { @escluso = 0 }

      if ( VAR_VAL(PADRE(idx_att, 3), "MdF_CerBat_Std2020") >= 1
         | VAR_VAL(PADRE(idx_att, 4), "MdF_CerBat_Std2020") >= 1
         )
         { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + CAM_Lav_offx
      @base_0.y = base_0.y + CAM_Lav_offy
      @base_0.z = base_0.z + Z - @Z + CAM_Lav_offz
      @X = CAM_Lav_X
      @Y = CAM_Lav_Y
      @Z = 4
      @direzione = 1

      @tipoIncidenza = "Z"
      @CHIAVE_TAB_CAM = NOME(idx_att)
      if (VAR_EXIST(idx_att, "CHIAVE_TAB_CAM") )
         { @CHIAVE_TAB_CAM = VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM") }
      @X_pdr = X
   }

  // 08.03.2022
   Procedura cancella
   {
      if ($StartingDel__ == ATTUALE())
         {
          $no_cancel = 1
          cam_KeyRegMdF = "CerBat"
          if (STR_INDEX_OF($MdF_Utente, 0, cam_KeyRegMdF) > -1)
             { DISPLAY2("Non e' possibile cancellare la cerniera a questo livello. Va fatto al livello superiore se utente abilitato") }
          else
             { DISPLAY2("Utente non abilitato alla cancellazione cerniere manuale. Contattare uff.Tecnico") }

          COMANDO(STRCAT("VAR_SET$ $no_cancel=0"))
         }
   }
}

Elemento MdF_BasettaSXDX
{
   Descrizione = "Grafica Basetta su Fianchi"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  10
      Y  ""  40
      Z  ""  65

      tipoIncidenza        "X,Y,Z"                                "X"
      PosizioneCerniera   "Posizione Cerniera"                    "SX"
      escl_Grafica        "visualizza grafica"                     1
      pz_CerFia           "pos in z lav su fianco"                30
      id_Cer              "identificativo per CHIAVE_TAB_CAM"      0

      CAM_Lav_offx_Ang    ""  0
      CAM_Lav_offz_Ang    ""  0

      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      CHIAVE_TAB_CAM = NOME(idx_att)

      idx_CerBas = PADRE(idx_att, 1)

      KeyFamRegFacc = VAR_VAL_STR(idx_CerBas, "KeyFamRegFacc")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att)) }

      nome_var_chiave = "CHIAVE_TAB_CAM_CerBat1"
      if (STRLEN(VAR_VAL_STR(PADRE(idx_CerBas, 1), nome_var_chiave)) > 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_CerBas, 1), nome_var_chiave) }
      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_CerBat", STR(id_Cer))
      if (STRLEN(VAR_VAL_STR(PADRE(idx_CerBas, 1), nome_var_chiave)) > 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_CerBas, 1), nome_var_chiave) }

      // Compatibilità 2013 campo Visualizza RegFacc 0 o 1
      if (VAR_EXIST(PADRE(idx_CerBas, 1), "Visualizza_CerBat1") )
         { escl_Grafica = 1-VAR_VAL(PADRE(idx_CerBas, 1), "Visualizza_CerBat1") }

      if (VAR_EXIST(PADRE(idx_CerBas, 2), "MdF_escl_graf_CerFia") == 1)
         { escl_Grafica = VAR_VAL(PADRE(idx_CerBas, 2), "MdF_escl_graf_CerFia") }

      if (VAR_EXIST(PADRE(idx_att, 2), STRCAT("MdfSys_collY_sposta",STR(id_Cer))) )
         {
          MdfSys_collY_sposta = VAR_VAL(PADRE(idx_att, 2), STRCAT("MdfSys_collY_sposta",STR(id_Cer)))
         }

      id_Reg = VAR_VAL(PADRE(idx_att, 2), STRCAT("id_Reg_CerBat", STR(id_Cer)))

      azione_locked=1
      // 05.05.2020
      // forse e' piu corretto che sia sempre a 0, ma intanto mantengo la distinzione
      if (VAR_VAL(-1, "MdF_azione_mag20") == 1)  { azione_locked=0 }

      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_CerBas, 1), "Visualizza_CerBat1")
      GOSUB mdf_Visualize

      if (STRCMP($MdF_Visualize, "Always") != 0)
         {
          idx_CerBas = PADRE(idx_att, 1)
          if (VAR_EXIST(PADRE(idx_CerBas, 2), "MCB_Vis_BasBat") )
             { escl_Grafica = 1-VAR_VAL(PADRE(idx_CerBas, 2), "MCB_Vis_BasBat") }

          if (VAR_EXIST(PADRE(idx_CerBas, 1), "MCB_Vis_BasBat") )
             { escl_Grafica = 1-VAR_VAL(PADRE(idx_CerBas, 1), "MCB_Vis_BasBat") }
         }
   }

   Controlli
   {
      idx_MdF = PADRE(idx_att, 2)

      if (ACTION() <= 0)
         {
          // 02.10.2019 AOVG745256 strano che solo in questo cli entra per ACTION 0
          cam_action = ACTION()
          // 05.10.2022 AOVG950863 prima era tutto a 0
          CAM_Lav_X = X
          CAM_Lav_Y = Y/2
          CAM_Lav_Z = pz_CerFia

          CAM_Lav_offx = CAM_Lav_offx_Ang
          CAM_Lav_offy = Y/2
          CAM_Lav_offz = Z-pz_CerFia + CAM_Lav_offz_Ang

          //VAR_VALUE_SET(PADRE(idx_att, 2), "mdf_CerBat_Action0", 1)

          EXITSUB()
         }

      mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_att, 2), STRCAT("img_sat_E2_CerBat", STR(id_Cer)))

      if (VAR_EXIST(PADRE(idx_MdF, 1), "MCB_img_sat_E2_CerBat") )
         { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MCB_img_sat_E2_CerBat")  }

      if (VAR_EXIST(idx_MdF, "MCB_img_sat_E2_CerBat") )
         { mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, "MCB_img_sat_E2_CerBat") }

      // 21.11.2024
      mdf_indexof_sat_change = STR_INDEX_OF(VAR_VAL_STR(idx_att, "mdf_import_EXIST"), 0, mdf_nomeFile_sat)

      mdF_sat_offx = VAR_VAL(idx_MdF, "MCB_sat_E2_offx")
      mdF_sat_offy = VAR_VAL(idx_MdF, "MCB_sat_E2_offy")
      mdF_sat_offz = VAR_VAL(idx_MdF, "MCB_sat_E2_offz")
      mdF_sat_angz = VAR_VAL(idx_MdF, "MCB_sat_E2_angz")

     // 23.10.2023
      if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_E2_CerBat", STR(id_Cer))) )
         {
          mdfstr_input = VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_E2_CerBat", STR(id_Cer)))
          GOSUB MdF_EstraiStringhe
          // 20.05.2025 per permettere gestioni intermedie
          if (STRLEN(VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_E2_CerBat", STR(id_Cer))) ) > 3)
             {
              mdF_sat_offx = ATOI(mdf_array_Stringhe[1])
              mdF_sat_offy = ATOI(mdf_array_Stringhe[2])
              mdF_sat_offz = ATOI(mdf_array_Stringhe[3])
              mdF_sat_angz = ATOI(mdf_array_Stringhe[4])
             }
          if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*") )
             {
              if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##5") )
                 {
                  mdF_sat_offx = ATOI(mdf_array_Stringhe[5])
                  mdF_sat_offy = ATOI(mdf_array_Stringhe[6])
                  mdF_sat_offz = ATOI(mdf_array_Stringhe[7])
                  mdF_sat_angz = ATOI(mdf_array_Stringhe[8])
                 }
             }
         // 31.07.2024
          if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##9") )
             {
              mdF_sat_offx_2 = ATOI(mdf_array_Stringhe[9])
              mdF_sat_offy_2 = ATOI(mdf_array_Stringhe[10])
              mdF_sat_offz_2 = ATOI(mdf_array_Stringhe[11])
              mdF_sat_angz_2 = ATOI(mdf_array_Stringhe[12])
              if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*") )
                 {
                  if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##13") )
                     {
                      mdF_sat_offx_2 = ATOI(mdf_array_Stringhe[13])
                      mdF_sat_offy_2 = ATOI(mdf_array_Stringhe[14])
                      mdF_sat_offz_2 = ATOI(mdf_array_Stringhe[15])
                      mdF_sat_angz_2 = ATOI(mdf_array_Stringhe[16])
                     }
                 }
             }
          if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##17") )
             {
              mdF_sat_offx_3 = ATOI(mdf_array_Stringhe[17])
              mdF_sat_offy_3 = ATOI(mdf_array_Stringhe[18])
              mdF_sat_offz_3 = ATOI(mdf_array_Stringhe[19])
              mdF_sat_angz_3 = ATOI(mdf_array_Stringhe[20])
              if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*") )
                 {
                  if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##21") )
                     {
                      mdF_sat_offx_3 = ATOI(mdf_array_Stringhe[21])
                      mdF_sat_offy_3 = ATOI(mdf_array_Stringhe[22])
                      mdF_sat_offz_3 = ATOI(mdf_array_Stringhe[23])
                      mdF_sat_angz_3 = ATOI(mdf_array_Stringhe[24])
                     }
                 }
             }
          if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##25") )
             {
              mdF_sat_offx_4 = ATOI(mdf_array_Stringhe[25])
              mdF_sat_offy_4 = ATOI(mdf_array_Stringhe[26])
              mdF_sat_offz_4 = ATOI(mdf_array_Stringhe[27])
              mdF_sat_angz_4 = ATOI(mdf_array_Stringhe[28])
              if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*") )
                 {
                  if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##29") )
                     {
                      mdF_sat_offx_4 = ATOI(mdf_array_Stringhe[29])
                      mdF_sat_offy_4 = ATOI(mdf_array_Stringhe[30])
                      mdF_sat_offz_4 = ATOI(mdf_array_Stringhe[31])
                      mdF_sat_angz_4 = ATOI(mdf_array_Stringhe[32])
                     }
                 }
             }
          if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##33") )
             {
              mdF_sat_offx_5 = ATOI(mdf_array_Stringhe[33])
              mdF_sat_offy_5 = ATOI(mdf_array_Stringhe[34])
              mdF_sat_offz_5 = ATOI(mdf_array_Stringhe[35])
              mdF_sat_angz_5 = ATOI(mdf_array_Stringhe[36])
              if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*") )
                 {
                  if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##37") )
                     {
                      mdF_sat_offx_5 = ATOI(mdf_array_Stringhe[37])
                      mdF_sat_offy_5 = ATOI(mdf_array_Stringhe[38])
                      mdF_sat_offz_5 = ATOI(mdf_array_Stringhe[39])
                      mdF_sat_angz_5 = ATOI(mdf_array_Stringhe[40])
                     }
                 }
             }
         }

     // 22.05.2025 A OCL081382
      mdf_rictrl_idx_sat = 0
      if (VAR_VAL(PADRE(idx_MdF, 1), "MdF_sat_Basetta_Attrezzata") > 0)
         {
          if (ABS(VAR_VAL(idx_MdF, "MdF_angoloBas")) > 80  &  ABS(VAR_VAL(idx_MdF, "MdF_angoloBas")) < 100)
             {
              if (VAR_VAL(idx_att, "idx_To_ReAdd") == PADRE(idx_att, 3) )
                 {
                  mdf_rictrl_idx_sat_entry = 1
                  mdf_rictrl_idx_sat = 1
                 }
             }
         }

     // 07.05.2024 Ottimizzazioni
      if ( VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") > 0
         | STRLEN(mdf_nomeFile_sat) < 4
         // 06.09.2024
         | UN_PADRE("MdF_*VY*")
         // 21.11.2024
         | mdf_indexof_sat_change < 0
         // 22.05.2025
         | mdf_rictrl_idx_sat > 0
         )
         { GOSUB mdf_ADD_sat }

     // 01.04.2020
      if (VAR_VAL(-1, "CAM_Visualize") <= 0)
         {
          if (VAR_VAL(idx_att, "mdf_add_sat_now") > 0)  { escl_Grafica = 1 }
         // 08.04.2021 Trovato caso che attivando il movimento Apertura-Frontali visualizzava il Blocco Basetta
          if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
             & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
             )
             {
              if (STRLEN(VAR_VAL_STR(idx_att, "mdf_import")) > 10)
                 {
                  // 05.05.2021 St Se sono CNP e non ho la cartella path_file_sat_MdF ..\Bdm\cam\sat\ volutamente perche'
                  // non voglio appesantire Metron con i sat però se esiste MdF_Visualize_sat probabilmenmte voglio
                  // comunque visualizzare l' impronta basetta in modo che esca nelle stampe/bindelle.
                  // Forse sarebbe stato piu corretto che nel Bdm ci fosse if ($CNP__ == 1) -> MdF_Visualize_sat=""
                  // 29.04.2024 Ottimizzazioni FILE_EXIST per la rete
                  if (mdf_import != VAR_VAL_STR(idx_att, "mdf_import_prec") )
                     {
                      if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)  { import_sat_exist = 1 }
                      else                                              { import_sat_exist = 0 }
                      mdf_import_prec = mdf_import
                     }
                  if (VAR_VAL(idx_att, "import_sat_exist") > 0)  { escl_Grafica = 1 }
                 }
             }
         }
     // 20.07.2021 riposiziona sat-basetta dopo sposta
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         )
         {
          if ( VAR_EXIST(PADRE(idx_att, 2), STRCAT("MCB_Ute_spostaCer", STR(id_Cer)))
             & VAR_EXIST(idx_att, "idx_To_ReAdd")
             )
             {
              if (IS_IDX(idx_To_ReAdd) )
                 {
                  mcb_Ute_spostaCer_att = VAR_VAL(PADRE(idx_att, 2), STRCAT("MCB_Ute_spostaCer", STR(id_Cer)))
                  if (mcb_Ute_spostaCer_att != VAR_VAL(idx_att, STRCAT("MCB_Ute_spostaCer", STR(id_Cer), "_prec")) )
                     {
                      VAR_CREATE_NUM(idx_att, STRCAT("MCB_Ute_spostaCer", STR(id_Cer), "_prec"), mcb_Ute_spostaCer_att, 0, "")
                      COMANDO2(STRCAT("RICALCOLA_UNA ", STR(idx_To_ReAdd), " no_agganciati", " // MdF_BasettaSXDX per MCB_Ute_spostaCer"))
                     }
                 }
             }
         }

      CAM_Lav_X = X
      CAM_Lav_Y = Y/2
      CAM_Lav_Z = pz_CerFia


      CAM_Lav_offx = CAM_Lav_offx_Ang
      CAM_Lav_offy = Y/2
      CAM_Lav_offz = Z-pz_CerFia + CAM_Lav_offz_Ang

      CAM_DIM_X_reale = X
      CAM_DIM_Y_reale = Y
      CAM_DIM_Z_reale = Z
   }

   PuntiNotevoli
   {
      idx_att = ATTUALE()
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona Blocco bl
   {
      @escluso = escl_Grafica
      @base_0 = base_0

      @base_0.x = base_0.x + CAM_Lav_offx_Ang
      @base_0.z = base_0.z + CAM_Lav_offz_Ang

      @X = X
      @Y = Y
      @Z = Z
      @c_rivestimento = [128,128,128]
      @f_rivestimento = STR(100*0.005)
   }

   Posiziona MdF_LavorazioneCAM  cam
   {
      @escluso = 1
      if ( VAR_VAL(PADRE(idx_att, 3), "MdF_CerBat_DDPPannello") == 1
         | VAR_VAL(PADRE(idx_att, 4), "MdF_CerBat_DDPPannello") == 1
         )
         { @escluso = 0 }

      if ( VAR_VAL(PADRE(idx_att, 3), "MdF_CerBat_Std2020") >= 1
         | VAR_VAL(PADRE(idx_att, 4), "MdF_CerBat_Std2020") >= 1
         )
         { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + CAM_Lav_offx
      @base_0.y = base_0.y + CAM_Lav_offy
      @base_0.z = base_0.z + CAM_Lav_offz
      @X = 4
      @Y = CAM_Lav_Y
      @Z = CAM_Lav_Z
      @direzione = -1
     // 30.03.2020 S901987 ANP nel caso Anta e Frontale di fissaggio basetta non siano allineati in Z, quando il Frontale
      // di Fissaggio e' piu indietro, piu verso il Fianco
      if ( IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura"), "SX*")
         & VAR_VAL(PADRE(idx_att, 2), "MdF_angoloBas") == -90
         )
         {
          // 03.05.2021 S21912390 Se non ho Fianchi probabilmente Battuta_Z rimane 0
          if ( VAR_VAL(PADRE(idx_att, 2), "Battuta_Z") >= 0
             & VAR_VAL(PADRE(idx_att, 2), "Battuta_Z") <= 4
             )
             {
              // 03.05.2021
              // Essendo la Battuta_Z relativa all' Anta, non so se potrebbe esserci il caso in cui il FroFisso sia
              // piu avanti. E' però improbabile che la differenza tra i 2 Frontali sia maggiore di 4-Battuta_Z, dove
              // 4 e' la Profondita vettore, nonchè @X, quindi imposto @X=8 ProfonditaVett 8 per partire da piu indietro e finire piu avanti
              @X = 8
              @ProfonditaVett = 8
              @base_0.x = base_0.x + @X/2 + CAM_Lav_offx + VAR_VAL(PADRE(idx_att, 2), "Battuta_Z")/2
             }
         }

      if (IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura"), "DX*") )
         {
          @base_0.x = base_0.x + X - @X + CAM_Lav_offx
          @direzione = 1
         // 19.04.2021 S1046619
          if (VAR_VAL(PADRE(idx_att, 2), "MdF_angoloBas") == 90)
             {
              if ( VAR_VAL(PADRE(idx_att, 2), "Battuta_Z") >= 0
                 & VAR_VAL(PADRE(idx_att, 2), "Battuta_Z") <= 4
                 )
                 {
                  // Essendo la Battuta_Z relativa all' Anta, non so se potrebbe esserci il caso in cui il FroFisso sia
                  // piu indietro. Per comprendere tutti i casi faccio @X/2 e imposto @X a 8.
                  // A differenza della Basetta con CamIncidente questa parte dall' interno, mentre da CamIncidente dall' esterno
                  // Quindi partendo dall' interno se il FrontaleFisso e' un po' piu avanti in z rischia di non sentirlo, mentre
                  // partendo dall' esterno, se il FrontaleFisso e' un po' piu indietro in z, con il CamIncidente, allo stesso modo,
                  // rischia di non sentirlo se il vettore parte troppo internamente al pannello.
                  @X = 8
                  @ProfonditaVett = 8
                  @base_0.x = base_0.x + X - @X/2 + CAM_Lav_offx + VAR_VAL(PADRE(idx_att, 2), "Battuta_Z")/2
                 }
             }
         }

      @tipoIncidenza = "X"
      @CHIAVE_TAB_CAM = NOME(idx_att)
      if (VAR_EXIST(idx_att, "CHIAVE_TAB_CAM") )
         { @CHIAVE_TAB_CAM = VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM") }
      @X_pdr = X
   }

  // 08.03.2022
   Procedura cancella
   {
      if ($StartingDel__ == ATTUALE())
         {
          $no_cancel = 1
          cam_KeyRegMdF = "CerBat"
          if (STR_INDEX_OF($MdF_Utente, 0, cam_KeyRegMdF) > -1)
             { DISPLAY2("Non e' possibile cancellare la basetta a questo livello. Va fatto al livello superiore se utente abilitato") }
          else
             { DISPLAY2("Utente non abilitato alla cancellazione cerniere manuale. Contattare uff.Tecnico") }

          COMANDO(STRCAT("VAR_SET$ $no_cancel=0"))
         }
   }

  // DA NON FARE QUI. Segue il padre, oppure da gestire su MdF_Sat.inc
   //Procedura azione
   //{
   //}
}

Elemento MdF_CerniereSoffietto
{
   Descrizione = "Contenitore grafica Cerniere"
   Code        = GRANT
   Gruppo      = "TMP"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   Alias         MdF_CAM;MdF_CerSof

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22
      HIDE  ""  1

      MdF_Apertura        "Apertura SXSOF-DXSOF"                      ""

      px_CerSof1          "Rientro in X della Cerniera"               0
      px_CerSof2          "Rientro in X della Cerniera"               0
      px_CerSof3          "Rientro in X della Cerniera"               0
      px_CerSof4          "Rientro in X della Cerniera"               0
      px_CerSof5          "Rientro in X della Cerniera"               0
      px_CerSof6          "Rientro in X della Cerniera"               0
      px_CerSof7          "Rientro in X della Cerniera"               0

      py_CerSof1          "Quota Y cerniera 1"                        0
      py_CerSof2          "Quota Y cerniera 2"                        0
      py_CerSof3          "Quota Y cerniera 3"                        0
      py_CerSof4          "Quota Y cerniera 4"                        0
      py_CerSof5          "Quota Y cerniera 5"                        0
      py_CerSof6          "Quota Y cerniera 6"                        0
      py_CerSof7          "Quota Y cerniera 7"                        0

      Battuta_X           "battuta in X rispetto al fianco"           0
      Battuta_X_Sof       "battuta in X rispetto all altro Frontale"  0
      KeyFamRegFacc       "tipo posizionamento cerniere"              ""

      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      GOSUB MdF_SetStato_NoGEST

      cam_KeyRegMdF = "CerSof"
      GOSUB MdF_Ctrl_save_prec

      // Se chiamo una ipotetica procedura MdF_noAUTO non passa quando escluso=1
      if ( VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1
         & STR_INDEX_OF($MdF_Utente, 0, cam_KeyRegMdF) == -1
         & STR_INDEX_OF($MdF_Utente, 0, "-1") == -1
         )
         {
          MdF_comandoOnAUTO = 1
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
      if (mdf_save_prec == 1)
         {
          MdF_comandoOnAUTO = -1
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att)))
         }

      if (STR_INDEX_OF($MdF_Utente, 0, cam_KeyRegMdF) > -1)  { HIDE = 3 }
   }

   Attrezza
   {
      base_0 = @base_0
      base_0.z = @base_0.z
      X = @X
      Y = @Y
      Z = @Z
   }

   Controlli
   {
      idx_att = ATTUALE()
      idx_CamMdF = PADRE(idx_att, 1)
      nome_CamMdF = NOME(idx_CamMdF)

      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")
      Z = VAR_VAL(idx_CamMdF, "Z")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      GOSUB MdF_Ctrl_Dim

      escluso = 0
      idx_MdF_Var = idx_att

      COMPONENTI3("mdf_gia_inserito", idx_CamMdF, NOME(idx_att))
      if (mdf_gia_inserito > 1)
         {
          COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // MdF_CerniereSoffietto mdf_gia_inserito"))
          EXITSUB()
         }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerSof"
      GOSUB MdF_Variabili

      if ( IS_MATCH(MdF_Apertura, "SX*SOF*") != 1
         & IS_MATCH(MdF_Apertura, "DX*SOF*") != 1
         )
         { escluso = 1 }

      GOSUB MdF_Battuta_X

      Battuta_X_Sof = 1.5
      mdf_idxFro_Battuta_Sof = -1
      BOX_MODE(0)
      NEAR_GLOBALE("mdf_Fro_vic", idx_att, 10, 1, NOME(PADRE(idx_att, 1)))
      iF=1
      while (iF <= mdf_Fro_vic)
         {
         // 14.02.2020
         // 31.10.2023
          //if (PADRE(mdf_Fro_vic[iF], 1) != PADRE(idx_att, 1) )
          if (mdf_Fro_vic[iF] != PADRE(idx_att, 1) )
             {
              mdf_idx_ToCtrl_Batt = mdf_Fro_vic[iF]
              SET_#(mdf_idx_ToCtrl_Batt)

              Ba0_att = [base_0.x, 0, base_0.z]
              Ba3_att = [base_3.x, 0, base_3.z]
              Ba0_fro = [#base_0.x, 0, #base_0.z]
              Ba1_fro = [#base_1.x, 0, #base_1.z]
              Ba2_fro = [#base_2.x, 0, #base_2.z]
              Ba3_fro = [#base_3.x, 0, #base_3.z]

              mdf_s_dist_30 = DISTANZA(Ba3_att, Ba0_fro)
              mdf_s_dist_03 = DISTANZA(Ba0_att, Ba3_fro)

              if ( mdf_s_dist_30 < mdf_s_dist_03
                 & mdf_s_dist_30 < X/4
                 )
                 {
                  Battuta_X_Sof = mdf_s_dist_30
                  mdf_idxFro_Battuta_Sof = mdf_idx_ToCtrl_Batt
                 }
              if ( mdf_s_dist_03 < mdf_s_dist_30
                 & mdf_s_dist_03 < X/4
                 )
                 {
                  Battuta_X_Sof = mdf_s_dist_03
                  mdf_idxFro_Battuta_Sof = mdf_idx_ToCtrl_Batt
                 }
             }
          iF = iF+1
         }
     // 31.10.2023 Sc21029810 nome padre di 1 diversi
      if (mdf_idxFro_Battuta_Sof == -1)
         {
          mdf_nomeToSearch = STRCAT(STRMID(0,4,NOME(PADRE(idx_att, 1))), "*")
          NEAR_GLOBALE("mdf_Fro_vic", idx_att, 10, 1, mdf_nomeToSearch)
          iF=1
          while (iF <= mdf_Fro_vic)
             {
              if (PADRE(mdf_Fro_vic[iF], 1) != PADRE(idx_att, 2) )
                 {
                  mdf_idx_ToCtrl_Batt = mdf_Fro_vic[iF]

                  basy_fro = VAR_VAL(mdf_idx_ToCtrl_Batt, "base_0.y")
                  alty_fro = VAR_VAL(mdf_idx_ToCtrl_Batt, "alto_0.y")

                  mdf_Ant_filo_b = 0
                  mdf_Ant_filo_a = 0
                  if (basy_fro-5 < base_0.y  &  basy_fro+5 > base_0.y)  { mdf_Ant_filo_b = 1 }
                  if (alty_fro-5 < alto_0.y  &  alty_fro+5 > alto_0.y)  { mdf_Ant_filo_a = 1 }

                  // potrebbe trovare Ant_ di cassetti sotto o ante sopracolonna sopra
                  if (mdf_Ant_filo_b > 0  |  mdf_Ant_filo_a > 0)
                     {
                      SET_#(mdf_idx_ToCtrl_Batt)

                      Ba0_att = [base_0.x, 0, base_0.z]
                      Ba3_att = [base_3.x, 0, base_3.z]
                      Ba0_fro = [#base_0.x, 0, #base_0.z]
                      Ba1_fro = [#base_1.x, 0, #base_1.z]
                      Ba2_fro = [#base_2.x, 0, #base_2.z]
                      Ba3_fro = [#base_3.x, 0, #base_3.z]

                      mdf_s_dist_30 = DISTANZA(Ba3_att, Ba0_fro)
                      mdf_s_dist_03 = DISTANZA(Ba0_att, Ba3_fro)

                      if ( mdf_s_dist_30 < mdf_s_dist_03
                         & mdf_s_dist_30 < X/4
                         & mdf_s_dist_30 < 5
                         & mdf_s_dist_30 > Battuta_X_Sof
                         )
                         {
                          Battuta_X_Sof = mdf_s_dist_30
                          mdf_idxFro_Battuta_Sof = mdf_idx_ToCtrl_Batt
                         }
                      if ( mdf_s_dist_03 < mdf_s_dist_30
                         & mdf_s_dist_03 < X/4
                         & mdf_s_dist_03 < 5
                         & mdf_s_dist_03 > Battuta_X_Sof
                         )
                         {
                          Battuta_X_Sof = mdf_s_dist_03
                          mdf_idxFro_Battuta_Sof = mdf_idx_ToCtrl_Batt
                         }
                     }
                 }
              iF = iF+1
             }
         }
     // 14.02.2020
      if (Battuta_X_Sof > 50)  { Battuta_X_Sof = 3.999 }

      if (VAR_EXIST(PADRE(idx_att, 1), "MCS_Battuta_X") == 1)
         { Battuta_X_Sof = VAR_VAL(PADRE(idx_att, 1), "MCS_Battuta_X") }

      GOSUB Reg_pos_CerSof
      GOSUB Reg_CerSof_att
      GOSUB MdF_Battuta_X_After_RegFacc

      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_ADD_when"), "first_OnMacroMdF") )
         { MdF_ADD_when = "RE_Control" }

      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)
         {
          MdF_ADD_when = "RE_Control"
          mdf_ricalc_Post_READD = 0
         }
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_CernieraBasetta_Soff  cer1
   {
      @escluso = 1
      if (py_CerSof1 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x - Battuta_X_Sof
      @base_0.y = base_0.y + py_CerSof1 + VAR_VAL(idx_att, "MdfSys_collY_sposta1")
      if (IS_MATCH(MdF_Apertura, "SX*") == 1)
         { @base_0.x = base_3.x + Battuta_X_Sof - @X }
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerSof1+Battuta_X_Sof
      @id_Cer = 1
   }

   Posiziona MdF_CernieraBasetta_Soff  cer2
   {
      @escluso = 1
      if (py_CerSof2 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x - Battuta_X_Sof
      @base_0.y = base_0.y + py_CerSof2 + VAR_VAL(idx_att, "MdfSys_collY_sposta2")
      if (IS_MATCH(MdF_Apertura, "SX*") == 1)
         { @base_0.x = base_3.x + Battuta_X_Sof - @X }
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerSof2+Battuta_X_Sof
      @id_Cer = 2
   }

   Posiziona MdF_CernieraBasetta_Soff  cer3
   {
      @escluso = 1
      if (py_CerSof3 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x - Battuta_X_Sof
      if (IS_MATCH(MdF_Apertura, "SX*") == 1)
         { @base_0.x = base_3.x + Battuta_X_Sof - @X }

      @base_0.y = base_0.y + py_CerSof3 + VAR_VAL(idx_att, "MdfSys_collY_sposta3")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerSof3+Battuta_X_Sof
      @id_Cer = 3
   }

   Posiziona MdF_CernieraBasetta_Soff  cer4
   {
      @escluso = 1
      if (py_CerSof4 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x - Battuta_X_Sof
      if (IS_MATCH(MdF_Apertura, "SX*") == 1)
         { @base_0.x = base_3.x + Battuta_X_Sof - @X }

      @base_0.y = base_0.y + py_CerSof4 + VAR_VAL(idx_att, "MdfSys_collY_sposta4")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerSof4+Battuta_X_Sof
      @id_Cer = 4
   }

   Posiziona MdF_CernieraBasetta_Soff  cer5
   {
      @escluso = 1
      if (py_CerSof5 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x - Battuta_X_Sof
      if (IS_MATCH(MdF_Apertura, "SX*") == 1)
         { @base_0.x = base_3.x + Battuta_X_Sof - @X }

      @base_0.y = base_0.y + py_CerSof5 + VAR_VAL(idx_att, "MdfSys_collY_sposta5")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerSof5+Battuta_X_Sof
      @id_Cer = 5
   }

   Posiziona MdF_CernieraBasetta_Soff  cer6
   {
      @escluso = 1
      if (py_CerSof6 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x - Battuta_X_Sof
      if (IS_MATCH(MdF_Apertura, "SX*") == 1)
         { @base_0.x = base_3.x + Battuta_X_Sof - @X }

      @base_0.y = base_0.y + py_CerSof6 + VAR_VAL(idx_att, "MdfSys_collY_sposta6")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerSof6+Battuta_X_Sof
      @id_Cer = 6
   }

   Posiziona MdF_CernieraBasetta_Soff  cer7
   {
      @escluso = 1
      if (py_CerSof7 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x - Battuta_X_Sof
      if (IS_MATCH(MdF_Apertura, "SX*") == 1)
         { @base_0.x = base_3.x + Battuta_X_Sof - @X }

      @base_0.y = base_0.y + py_CerSof7 + VAR_VAL(idx_att, "MdfSys_collY_sposta7")
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @pos_X_cerAnta = px_CerSof7+Battuta_X_Sof
      @id_Cer = 7
   }

   Procedura MdF_noAUTO
   {
      cam_KeyRegMdF = "CerSof"
      if ( VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1
         & STR_INDEX_OF($MdF_Utente, 0, cam_KeyRegMdF) == -1
         & mdf_save_prec == 0
         )
         {
          MdF_comandoOnAUTO = 2
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Procedura MdF_Ctrl_Post_RELATIVE_ADD
   {
      GOSUB MdF_Ctrl_Post_RELATIVE_ADD
   }

   Procedura MdF_Ctrl_ADD_TooEarly
   {
      GOSUB MdF_Ctrl_ADD_TooEarly
   }

   Procedura MdF_Ctrl_Cambiamenti
   {
      if (IS_IDX(idx_att) != 1)            { EXITSUB() }
      if (IS_IDX(PADRE(idx_att, 1)) != 1)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "MdF_Cambiato") != 1)
         {
         // 14.02.2020
          GOSUB MdF_Battuta_X
          if (Battuta_X_att == Battuta_X)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerSof"
      GOSUB MdF_Variabili

      GOSUB MdF_Battuta_X
      GOSUB Reg_pos_CerSof
      GOSUB MdF_Battuta_X_After_RegFacc

      MdF_Cambiato_att = VAR_VAL_STR(idx_att, "MdF_Cambiato")
      bas0_att = base_0.y
      alt0_att = alto_0.y
      bas0_CamMdF = VAR_VAL(idx_CamMdF, "base_0.y")
      alt0_CamMdF = VAR_VAL(idx_CamMdF, "alto_0.y")

      if ( bas0_att == bas0_CamMdF  &  alt0_att == alt0_CamMdF
         & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "Dim*") != 1
         )
         { DEL_VAR(idx_att, "MdF_Cambiato") }

      if ( STRCMP(KeyFamRegFacc_att, KeyFamRegFacc) != 0
         | STRCMP(MdF_Aper_att, MdF_Apertura) != 0
         | X_att != X
         | Y_att != Y
         | px_CerSof1_att != px_CerSof1
         | py_CerSof1_att != py_CerSof1
         | py_CerSof2_att != py_CerSof2
         | py_CerSof3_att != py_CerSof3
         | py_CerSof4_att != py_CerSof4
         | py_CerSof5_att != py_CerSof5
         | py_CerSof6_att != py_CerSof6
         | py_CerSof7_att != py_CerSof7
         | Battuta_X_att != Battuta_X
         )
         {
          WITH_VAR_LOCAL(idx_att, "mdf_Visgraf", "escl_Grafica", 2, 1, "0")

          if (mdf_Visgraf <= 0)
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          else
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          MdF_Cambiato_att = STRCAT(MdF_Cambiato_att, " , Ricalcolato")
         }
   }
}

Elemento MdF_CernieraBasetta_Soff
{
   Descrizione = "CERNIERA_Basetta Soffietto per ddp grezzo"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      X  "X Cern"            42
      Y  "Spess. Cerniera"   58
      Z  "Alt. Cerniera"     50
      HIDE  ""  1

      PosizioneCerniera    "Posizione Cerniera"    "SX"
      KeyFamRegFacc        "Famiglia Lavorazione"   ""
      id_Cer               "identificativo per CHIAVE_TAB_CAM"         0

      escl_Grafica         "visualizza grafica"                        1

      X_Basett             "Largh basetta"                            10
      Y_Basett             "Altezza basetta"                          40
      Z_Basett             "Prof.   basetta"                          42

      X_eleFro             "Largh cerniera"                           35
      Y_eleFro             "Altezza cerniera"                         50
      Z_eleFro             "Prof.   cerniera"                          8

      pos_X_cerAnta        "pos in x lav su anta"                      5
      pz_CerSof            "pos in z lav su altro Fro"                30

      posY_Utente          "pos Y modifica da Utente"                  0 ShowAlways
      mdf_modif_Ute        "modifiche da Utente"                       0

      mdf_angoloBas        "angolo Basetta"                          -90
      //MdF_BattutaXAng      "spostamento X Basetta"                   10

      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      // Compatibilità 2013 campo Visualizza RegFacc 0 o 1
      if (VAR_EXIST(PADRE(idx_att, 1), STRCAT("Visualizza_CerSof",STR(id_Cer))) )
         { escl_Grafica = 1-VAR_VAL(PADRE(idx_att, 1), STRCAT("Visualizza_CerSof",STR(id_Cer)) ) }

      //if ($MdF_Visualize > -1)    { escl_Grafica = 1-$MdF_Visualize }
      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("Visualizza_CerSof",STR(id_Cer)) )
      GOSUB mdf_Visualize

      if (VAR_EXIST(PADRE(idx_att, 1), STRCAT("X_CerSof", STR(id_Cer))) == 1)
         {
          X_eleFro = VAR_VAL(PADRE(idx_att, 1), STRCAT("X_CerSof", STR(id_Cer)))
          Y_eleFro = VAR_VAL(PADRE(idx_att, 1), STRCAT("Y_CerSof", STR(id_Cer)))
          if (X_eleFro > Y_eleFro  &  X_eleFro/2 > pos_X_cerAnta)
             { X_eleFro = Y_eleFro }
          if (Y_eleFro > X_eleFro  &  Y_eleFro/2 > pos_X_cerAnta)
             { Y_eleFro = X_eleFro }

          //X_Basett = VAR_VAL(PADRE(idx_att, 1), STRCAT("X_CerSof", STR(id_Cer)))
          Y_Basett = CEIL(3*VAR_VAL(PADRE(idx_att, 1), STRCAT("Y_CerSof", STR(id_Cer)))/5)
          Z_Basett = VAR_VAL(PADRE(idx_att, 1), STRCAT("Z_CerSof", STR(id_Cer)))
          X = X_eleFro+Z_Basett
          Y = Y_eleFro
          Z = Z_Basett

          pz_CerSof = 30
          if (VAR_VAL(PADRE(idx_att, 1), STRCAT("pz_CerSof", STR(id_Cer)) ) > 0)
             { pz_CerSof = VAR_VAL(PADRE(idx_att, 1), STRCAT("pz_CerSof", STR(id_Cer)) ) }

          pz_CerSof = pz_CerSof + VAR_VAL(PADRE(idx_att, 1), "Battuta_X_Sof")
         }

      DescEdit__ = STRCAT("CernieraSoff_", STR(id_Cer), "_", KeyFamRegFacc)
      HIDE = 1
      if (VAR_VAL(PADRE(idx_att, 1), "HIDE") == 3)  { HIDE = 2 }
   }

   Controlli
   {
      if (ACTION() <= 0)  { EXITSUB() }

      MdF_angoloBas = -90
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_angoloBas") )
         { MdF_angoloBas = VAR_VAL(PADRE(idx_att, 1), "MdF_angoloBas") }
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_BattutaXAng") )
         { MdF_BattutaXAng = VAR_VAL(PADRE(idx_att, 1), "MdF_BattutaXAng") }

      mdf_angoloBas = MdF_angoloBas
      if (IS_MATCH(PosizioneCerniera, "DX*") )
         { mdf_angoloBas = -1*MdF_angoloBas }

      if ( VAR_EXIST(idx_att, "base_0_offset") != 1
         & posY_Utente != 0
         )
         {
          mdf_modif_Ute = -1
          base_0_offset = [0, posY_Utente, 0]
         }

      if (VAR_VAL(idx_att, "base_0_offset.y") != posY_Utente)
         {
          posY_Utente = VAR_VAL(idx_att, "base_0_offset.y")
          COMANDO2(STRCAT("VAR_CHANGE 1 ",STR(idx_att), " posY_Utente=", STR(base_0_offset.y)))
          if (mdf_modif_Ute == 0)
             {
              mdf_modif_Ute = 1
              COMANDO2(STRCAT("VAR_CHANGE 1 ",STR(idx_att), " mdf_modif_Ute=", STR(mdf_modif_Ute)))
             }
         }
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_CernieraSoff  cern
   {
      @base_0 = base_0
      @X = X_eleFro
      @Y = Y_eleFro
      @Z = Z_eleFro
      @base_0.x = base_0.x
      @base_0.y = base_0.y - @Y/2
      @base_0.z = base_1.z - @Z
      @pos_X_cerAnta = pos_X_cerAnta
      if (IS_MATCH(PosizioneCerniera, "SX*") )
         {
          @base_0.x = base_3.x - @X
          @pos_X_cerAnta = @X - pos_X_cerAnta
         }

      @PosizioneCerniera = PosizioneCerniera
      @id_Cer = id_Cer
   }

   Posiziona MdF_BasettaSoff  base
   {
      @base_0 = base_0
      @X = X_Basett
      @Y = Y_Basett
      @Z = Z_Basett
      @base_0.y = base_0.y - @Y/2
      @base_0.z = base_1.z - @Z
      if (IS_MATCH(PosizioneCerniera, "SX*") )
         { @base_0.x = base_3.x }
      //@pos_X_cerAnta = pos_X_cerAnta
      @pos_X_cerAnta = pz_CerSof
      @PosizioneCerniera = PosizioneCerniera
      @id_Cer = id_Cer

      @ang_y = mdf_angoloBas

      @base_0.x = base_0.x - @Z*SENO(@ang_y)
      @base_0.z = base_1.z - @Z*COSENO(@ang_y)

      if (IS_MATCH(PosizioneCerniera, "SX*") )
         {
          @base_0.x = base_3.x - @Z*SENO(@ang_y) - @X*COSENO(@ang_y)
          @base_0.z = base_1.z + @X*SENO(@ang_y) - @Z*COSENO(@ang_y)
         }
   }
}

Elemento MdF_CernieraSoff
{
   Descrizione = "Grafica Cerniera su Anta"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  10
      Y  ""  10
      Z  ""  12

      tipoIncidenza        "X,Y,Z"                                 "Z"
      PosizioneCerniera    "Posizione Cerniera"                    "SX"
      escl_Grafica         "visualizza grafica"                     1
      pos_X_cerAnta        "pos in x lav su anta"                   5
      id_Cer               "identificativo per CHIAVE_TAB_CAM"      0

      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      CHIAVE_TAB_CAM = NOME(idx_att)
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att)) }

      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_CerSof", STR(id_Cer))
      if (STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), nome_var_chiave)) > 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 2), nome_var_chiave) }

      id_Reg = VAR_VAL(PADRE(idx_att, 2), STRCAT("id_Reg_CerSof", STR(id_Cer)))

      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_att, 2), STRCAT("Visualizza_CerSof", STR(id_Cer)))
      GOSUB mdf_Visualize
      if (STRCMP($MdF_Visualize, "Always") != 0)
         {
          if (VAR_EXIST(PADRE(idx_att, 2), "MCB_Vis_CerSof") )
             { escl_Grafica = 1-VAR_VAL(PADRE(idx_att, 2), "MCB_Vis_CerSof") }
         }
   }

   Controlli
   {
      idx_MdF = PADRE(idx_att, 2)
      yMdF = VAR_VAL(idx_MdF, "Y")

      if (ACTION() <= 0)  { EXITSUB() }

      CAM_Lav_X = X-pos_X_cerAnta
      CAM_Lav_Y = Y/2
      CAM_Lav_Z = Z

      CAM_Lav_offx = pos_X_cerAnta
      CAM_Lav_offy = Y/2
      CAM_Lav_offz = 0

      CAM_DIM_X_reale = X
      CAM_DIM_Y_reale = Y
      CAM_DIM_Z_reale = Z

      if (VAR_EXIST(idx_att, "pos_X_cerAnta_prec") != 1)
         { pos_X_cerAnta_prec = pos_X_cerAnta }
   }

   PuntiNotevoli
   {
      idx_att = ATTUALE()
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   //Posiziona Blocco bl
   Posiziona MdF_CilindroZ  cz
   {
      @escluso = escl_Grafica
      @base_0 = base_0
      @X = X
      @Y = Y
      @Z = Z

      @c_rivestimento = [128,128,128]
     // @f_rivestimento = STR(100*0.005)
   }

   Posiziona MdF_CilindroZ  cmod
   {
      @escluso = 1
      if (escl_Grafica == 0  &  VAR_VAL(PADRE(idx_att, 1), "posY_Utente") != 0)
         { @escluso = 0 }
      @base_0 = base_0
      @base_0.x = base_0.x + Y/4
      @base_0.y = base_0.y + Y/4
      @X = Y/2
      @Y = Y/2
      @Z = Z
      @c_rivestimento = [200, 100, 10]
   }

   Posiziona Blocco  bmod
   {
      @escluso = 1
      if (escl_Grafica == 0  &  VAR_VAL(PADRE(idx_att, 1), "posY_Utente") != 0)
         { @escluso = 0 }
      @base_0 = base_0
      @base_0.x = base_0.x + Y/4
      @base_0.y = base_0.y + Y/4
      @X = Y/2
      @Y = Y/2
      @Z = Z
      @c_rivestimento = [250, 120, 30]
   }
}

Elemento MdF_BasettaSoff
{
   Descrizione = "Grafica Basetta Soff"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  10
      Y  ""  40
      Z  ""  65

      tipoIncidenza       "X,Y,Z"                                  "X"
      PosizioneCerniera   "Posizione Cerniera"                     "SX"
      escl_Grafica        "visualizza grafica"                     1
      pos_X_cerAnta       "pos in x lav su anta"                   5
      id_Cer              "identificativo per CHIAVE_TAB_CAM"      0
      Battuta_X_Sof       "battuta in X rispetto all altro Frontale"  0

      CAM_Lav_offx_Ang    ""  0
      CAM_Lav_offz_Ang    ""  0

      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      CHIAVE_TAB_CAM = NOME(idx_att)

      idx_CerBas = PADRE(idx_att, 1)

      KeyFamRegFacc = VAR_VAL_STR(idx_CerBas, "KeyFamRegFacc")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att)) }

      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_CerSof", STR(id_Cer))
      if (STRLEN(VAR_VAL_STR(PADRE(idx_CerBas, 1), nome_var_chiave)) > 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_CerBas, 1), nome_var_chiave) }

      if (VAR_EXIST(PADRE(idx_CerBas, 2), "MdF_escl_graf_BasSof") == 1)
         { escl_Grafica = VAR_VAL(PADRE(idx_CerBas, 2), "MdF_escl_graf_BasSof") }

      id_Reg = VAR_VAL(PADRE(idx_att, 2), STRCAT("id_Reg_CerSof", STR(id_Cer)))

      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_CerBas, 1), "Visualizza_CerSof1")
      GOSUB mdf_Visualize
      if (STRCMP($MdF_Visualize, "Always") != 0)
         {
          if (VAR_EXIST(PADRE(idx_CerBas, 1), "MCB_Vis_BasSof") )
             { escl_Grafica = 1-VAR_VAL(PADRE(idx_CerBas, 1), "MCB_Vis_BasSof") }
         }
   }

   Controlli
   {
      Battuta_X_Sof = VAR_VAL(PADRE(idx_att, 2), "Battuta_X_Sof")
      CAM_Lav_X = X
      CAM_Lav_Y = Y/2
      CAM_Lav_Z = pos_X_cerAnta-Battuta_X_Sof

      CAM_Lav_offx = CAM_Lav_offx_Ang
      CAM_Lav_offy = Y/2
      CAM_Lav_offz = Z-(pos_X_cerAnta-Battuta_X_Sof)

      CAM_DIM_X_reale = X
      CAM_DIM_Y_reale = Y
      CAM_DIM_Z_reale = Z
   }

   PuntiNotevoli
   {
      idx_att = ATTUALE()
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona Blocco bl
   {
      @escluso = escl_Grafica
      @base_0 = base_0

      @base_0.x = base_0.x + CAM_Lav_offx_Ang
      @base_0.z = base_0.z + CAM_Lav_offz_Ang

      @X = X
      @Y = Y
      @Z = Z
      @c_rivestimento = [128,128,128]
      @f_rivestimento = STR(100*0.005)
   }
}

Elemento MdF_CerniereAngLibro
{
   Descrizione = "Contenitore grafica Cerniera AngLibro su anta"
   Code        = GRANT
   Gruppo      = "TMP"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   Alias         MdF_CAM;MdF_FerGen

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22
      HIDE  ""  1

      MdF_Apertura      "Apertura"        ""

      px_CerAngLib1     "Rientro in X Ferramenta Gen 1 rispetto Frontale"      -999
      py_CerAngLib1     "Rientro in Y Ferramenta Gen 1 rispetto Frontale"      -999
      pz_CerAngLib1     "Rientro in Z Ferramenta Gen 1 rispetto Frontale"      -999
      X_CerAngLib1      "Dim X Ferramenta Gen 1"                               5
      Y_CerAngLib1      "Dim Y Ferramenta Gen 1"                               5
      Z_CerAngLib1      "Dim Z Ferramenta Gen 1"                               5

      px_CerAngLib2     "Rientro in X Ferramenta Gen 2 rispetto Frontale"      -999
      py_CerAngLib2     "Rientro in Y Ferramenta Gen 2 rispetto Frontale"      -999
      pz_CerAngLib2     "Rientro in Z Ferramenta Gen 2 rispetto Frontale"      -999
      X_CerAngLib2      "Dim X Ferramenta Gen 2"                               5
      Y_CerAngLib2      "Dim Y Ferramenta Gen 2"                               5
      Z_CerAngLib2      "Dim Z Ferramenta Gen 2"                               5

      px_CerAngLib3     "Rientro in X Ferramenta Gen 3 rispetto Frontale"      -999
      py_CerAngLib3     "Rientro in Y Ferramenta Gen 3 rispetto Frontale"      -999
      pz_CerAngLib3     "Rientro in Z Ferramenta Gen 3 rispetto Frontale"      -999
      X_CerAngLib3      "Dim X Ferramenta Gen 3"                               5
      Y_CerAngLib3      "Dim Y Ferramenta Gen 3"                               5
      Z_CerAngLib3      "Dim Z Ferramenta Gen 3"                               5

      px_CerAngLib4     "Rientro in X Ferramenta Gen 4 rispetto Frontale"      -999
      py_CerAngLib4     "Rientro in Y Ferramenta Gen 4 rispetto Frontale"      -999
      pz_CerAngLib4     "Rientro in Z Ferramenta Gen 4 rispetto Frontale"      -999
      X_CerAngLib4      "Dim X Ferramenta Gen 4"                               5
      Y_CerAngLib4      "Dim Y Ferramenta Gen 4"                               5
      Z_CerAngLib4      "Dim Z Ferramenta Gen 4"                               5

      KeyFamRegFacc     "Macro Regola di posizionamento"                       ""

      Battuta_X         "battuta in X rispetto al fianco"      0
      Battuta_Z         "battuta in Z rispetto al fianco"      0

      ang_Sco           ""     0
      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      GOSUB MdF_SetStato_NoGEST
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          MdF_comandoOnAUTO = 1
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
      ang_Sco = VAR_VAL(PADRE(idx_att, -1), "angolo")
   }

   Attrezza
   {
      base_0 = @base_0
      base_0.z = @base_0.z
      X = @X
      Y = @Y
      Z = @Z
   }

   Controlli
   {
      idx_att = ATTUALE()
      idx_CamMdF = PADRE(idx_att, 1)
      nome_CamMdF = NOME(idx_CamMdF)
      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")
      Z = VAR_VAL(idx_CamMdF, "Z")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      GOSUB MdF_Ctrl_Dim
     // 22.03.2018
      escluso = 0
      // Casi strani di Load_pers e Interat con COMANDO al posto di COMANDO2. 54196
      // Provvisorio per sicurezza. Comunque è un comando veloce
      COMPONENTI3("mdf_gia_inserito", idx_CamMdF, NOME(idx_att))
      if (mdf_gia_inserito > 1)
         {
          COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // MdF_CerniereAngLibro mdf_gia_inserito"))
          EXITSUB()
         }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      // Per il momento non uso key CerAngLib, dovrebbe bastare la CerBat
      CHIAVE_TABVAR_MDF = "CerBat"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
      GOSUB MdF_Variabili
      //CHIAVE_TABVAR_MDF = "CerAngLib"
      //GOSUB MdF_Variabili
      //CHIAVE_TABVAR_MDF = "CerAngLibMdF"
      //GOSUB MdF_Variabili

     // 11.05.2018 simile al fratello MdF_CerniereBattenti
      if ( IS_MATCH(MdF_Apertura, "SX*CER*") != 1
         & IS_MATCH(MdF_Apertura, "DX*CER*") != 1
         & IS_MATCH(MdF_Apertura, "SX*MAN*") != 1
         & IS_MATCH(MdF_Apertura, "DX*MAN*") != 1
         )
         { escluso = 1 }

      GOSUB MdF_Battuta_X

      GOSUB Reg_pos_CerAngLib
      GOSUB Reg_CerAngLib_att
      GOSUB MdF_Battuta_X_After_RegFacc

      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_ADD_when"), "first_OnMacroMdF") )
         { MdF_ADD_when = "RE_Control" }

      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)
         {
          MdF_ADD_when = "RE_Control"
          mdf_ricalc_Post_READD = 0
         }
      if (VAR_EXIST(idx_att, "MCA_ElementoBdm_CerAngLib") != 1)  { MCA_ElementoBdm_CerAngLib = "MdF_Sat_CerAngLib" }
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_CerBasAngLib  cer1
   {
      @escluso = 1
      if (px_CerAngLib1 != -999  |  py_CerAngLib1 != -999  |  pz_CerAngLib1 != -999)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_CerAngLib1
      @base_0.y = base_0.y + py_CerAngLib1
      @base_0.z = base_0.z + pz_CerAngLib1

     // 16.10.2024 Sc1056784 Essendo il primo caso da sempre, anche se si tratta solo di 0.3 di tolleranza
      // e in z che nella CerAng conta meno limito il caso
      if (ABS(ang_Sco) >= 0.5  &  ABS(ang_Sco) != 90  &  ABS(ang_Sco) != 180  &  ABS(ang_Sco) != 360)
         {
          if (X_CerAngLib1 < 30)
             { @base_0.z = base_0.z + pz_CerAngLib1 - 0.3 }
         }

      @X = 1
      @Y = 1
      @Z = 1
      if (VAR_VAL(idx_att, "X_CerAngLib1") > 0)  { @X = X_CerAngLib1 }
      if (VAR_VAL(idx_att, "Y_CerAngLib1") > 0)  { @Y = Y_CerAngLib1 }
      if (VAR_VAL(idx_att, "Z_CerAngLib1") > 0)  { @Z = Z_CerAngLib1 }
      @px_CerAngLib = px_CerAngLib1
      @py_CerAngLib = py_CerAngLib1
      @pz_CerAngLib = pz_CerAngLib1

      @id_Fer = 1
   }

   Posiziona MdF_CerBasAngLib  cer2
   {
      @escluso = 1
      if (px_CerAngLib2 != -999  |  py_CerAngLib2 != -999  |  pz_CerAngLib2 != -999)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_CerAngLib2
      @base_0.y = base_0.y + py_CerAngLib2
      @base_0.z = base_0.z + pz_CerAngLib2

     // 16.10.2024 Sc1056784 Essendo il primo caso da sempre, anche se si tratta solo di 0.3 di tolleranza
      // e in z che nella CerAng conta meno limito il caso
      if (ABS(ang_Sco) >= 0.5  &  ABS(ang_Sco) != 90  &  ABS(ang_Sco) != 180  &  ABS(ang_Sco) != 360)
         {
          if (X_CerAngLib2 < 30)
             { @base_0.z = base_0.z + pz_CerAngLib2 - 0.3 }
         }

      @X = 1
      @Y = 1
      @Z = 1
      if (VAR_VAL(idx_att, "X_CerAngLib2") > 0)  { @X = X_CerAngLib2 }
      if (VAR_VAL(idx_att, "Y_CerAngLib2") > 0)  { @Y = Y_CerAngLib2 }
      if (VAR_VAL(idx_att, "Z_CerAngLib2") > 0)  { @Z = Z_CerAngLib2 }
      @px_CerAngLib = px_CerAngLib2
      @py_CerAngLib = py_CerAngLib2
      @pz_CerAngLib = pz_CerAngLib2

      @id_Fer = 2
   }

   Posiziona MdF_CerBasAngLib  cer3
   {
      @escluso = 1
      if (px_CerAngLib3 != -999  |  py_CerAngLib3 != -999  |  pz_CerAngLib3 != -999)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_CerAngLib3
      @base_0.y = base_0.y + py_CerAngLib3
      @base_0.z = base_0.z + pz_CerAngLib3

     // 16.10.2024 Sc1056784 Essendo il primo caso da sempre, anche se si tratta solo di 0.3 di tolleranza
      // e in z che nella CerAng conta meno limito il caso
      if (ABS(ang_Sco) >= 0.5  &  ABS(ang_Sco) != 90  &  ABS(ang_Sco) != 180  &  ABS(ang_Sco) != 360)
         {
          if (X_CerAngLib3 < 30)
             { @base_0.z = base_0.z + pz_CerAngLib3 - 0.3 }
         }

      @X = 1
      @Y = 1
      @Z = 1
      if (VAR_VAL(idx_att, "X_CerAngLib3") > 0)  { @X = X_CerAngLib3 }
      if (VAR_VAL(idx_att, "Y_CerAngLib3") > 0)  { @Y = Y_CerAngLib3 }
      if (VAR_VAL(idx_att, "Z_CerAngLib3") > 0)  { @Z = Z_CerAngLib3 }
      @px_CerAngLib = px_CerAngLib3
      @py_CerAngLib = py_CerAngLib3
      @pz_CerAngLib = pz_CerAngLib3

      @id_Fer = 3
   }

   Posiziona MdF_CerBasAngLib  cer4
   {
      @escluso = 1
      if (px_CerAngLib4 != -999  |  py_CerAngLib4 != -999  |  pz_CerAngLib4 != -999)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_CerAngLib4
      @base_0.y = base_0.y + py_CerAngLib4
      @base_0.z = base_0.z + pz_CerAngLib4

     // 16.10.2024 Sc1056784 Essendo il primo caso da sempre, anche se si tratta solo di 0.3 di tolleranza
      // e in z che nella CerAng conta meno limito il caso
      if (ABS(ang_Sco) >= 0.5  &  ABS(ang_Sco) != 90  &  ABS(ang_Sco) != 180  &  ABS(ang_Sco) != 360)
         {
          if (X_CerAngLib4 < 30)
             { @base_0.z = base_0.z + pz_CerAngLib4 - 0.3 }
         }

      @X = 1
      @Y = 1
      @Z = 1
      if (X_CerAngLib4 > 0)  { @X = X_CerAngLib4 }
      if (Y_CerAngLib4 > 0)  { @Y = Y_CerAngLib4 }
      if (Z_CerAngLib4 > 0)  { @Z = Z_CerAngLib4 }
      @px_CerAngLib = px_CerAngLib4
      @py_CerAngLib = py_CerAngLib4
      @pz_CerAngLib = pz_CerAngLib4

      @id_Fer = 4
   }

   Procedura MdF_noAUTO
   {
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          MdF_comandoOnAUTO = 2
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Procedura MdF_Ctrl_Post_RELATIVE_ADD
   {
      GOSUB MdF_Ctrl_Post_RELATIVE_ADD
   }

   Procedura MdF_Ctrl_ADD_TooEarly
   {
      GOSUB MdF_Ctrl_ADD_TooEarly
   }

   Procedura MdF_Ctrl_Cambiamenti
   {
      if (VAR_EXIST(idx_att, "MdF_Cambiato") != 1)  { EXITSUB() }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerAngLib"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerAngLibMdF"
      GOSUB MdF_Variabili

      GOSUB Reg_pos_CerAngLib

      MdF_Cambiato_att = VAR_VAL_STR(idx_att, "MdF_Cambiato")
      bas0_att = base_0.y
      alt0_att = alto_0.y
      bas0_CamMdF = VAR_VAL(idx_CamMdF, "base_0.y")
      alt0_CamMdF = VAR_VAL(idx_CamMdF, "alto_0.y")

      if (IS_MATCH(MdF_Cambiato, "MdF_CamMdFrontali") != 1)
         {
          GOSUB MdF_Cam_Elimina
         }

      if ( bas0_att == bas0_CamMdF  &  alt0_att == alt0_CamMdF
         & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "Dim*") != 1
         )
         { DEL_VAR(idx_att, "MdF_Cambiato") }

      if ( STRCMP(KeyFamRegFacc_att, KeyFamRegFacc) != 0
         | STRCMP(MdF_Aper_att, MdF_Apertura) != 0
         | X_att != X
         | Y_att != Y
         | px_CerAngLib1_att != px_CerAngLib1
         | px_CerAngLib2_att != px_CerAngLib2
         | px_CerAngLib3_att != px_CerAngLib3
         | px_CerAngLib4_att != px_CerAngLib4
         | py_CerAngLib1_att != py_CerAngLib1
         | py_CerAngLib2_att != py_CerAngLib2
         | py_CerAngLib3_att != py_CerAngLib3
         | py_CerAngLib4_att != py_CerAngLib4
         | pz_CerAngLib1_att != pz_CerAngLib1
         | pz_CerAngLib2_att != pz_CerAngLib2
         | pz_CerAngLib3_att != pz_CerAngLib3
         | pz_CerAngLib4_att != pz_CerAngLib4
         )
         {
          WITH_VAR_LOCAL(idx_att, "mdf_Visgraf", "escl_Grafica", 2, 1, "0")

          if (mdf_Visgraf <= 0)
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          else
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          MdF_Cambiato_att = STRCAT(MdF_Cambiato_att, " , Ricalcolato")
         }
   }
}

Elemento MdF_CerBasAngLib
{
   Descrizione = "Grafica Cerniera Ang Libro"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  5
      Y  ""  5
      Z  ""  5

      tipoIncidenza        "X,Y,Z"                                 "Z"
      escl_Grafica         "visualizza grafica"                     1
      id_Fer               "identificativo per CHIAVE_TAB_CAM"      0

      px_CerAngLib         "pos x rispetto frontale"                0
      py_CerAngLib         "pos y rispetto frontale"                0
      pz_CerAngLib         "pos z rispetto frontale"                0

      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      CHIAVE_TAB_CAM = NOME(idx_att)
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_CerAngLib")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att)) }

      nome_var_chiave = "CHIAVE_TAB_CAM_CerAngLib1"
      if (VAR_EXIST(PADRE(idx_att, 1), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 1), nome_var_chiave) }
      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_CerAngLib", STR(id_Fer))
      if (VAR_EXIST(PADRE(idx_att, 1), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 1), nome_var_chiave) }

      id_Reg = VAR_VAL(PADRE(idx_att, 1), STRCAT("id_Reg_CerAngLib", STR(id_Fer)))

      nome_var_Vis = STRCAT("Visualizza_CerAngLib", STR(id_Fer))
      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_att, 1), nome_var_Vis)
      GOSUB mdf_Visualize
   }

   Controlli
   {
      idx_MdF = PADRE(idx_att, 1)
      if (ACTION() <= 0)  { EXITSUB() }

      chiave_tabvar_mdf = "CerAngLib"
      GOSUB MdF_GEST

      mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("img_sat_F1_CerAngLib", STR(id_Fer)))

      if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("MCA_img_sat_F1_CerAngLib", STR(id_Fer))) )
         { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), STRCAT("MCA_img_sat_F1_CerAngLib", STR(id_Fer)))  }

      if (VAR_EXIST(idx_MdF, STRCAT("MCA_img_sat_F1_CerAngLib", STR(id_Fer))) )
         { mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("MCA_img_sat_F1_CerAngLib", STR(id_Fer))) }

      mdF_sat_offx = VAR_VAL(PADRE(idx_MdF, 1), "MCA_sat_F1_offx")
      mdF_sat_offy = VAR_VAL(PADRE(idx_MdF, 1), "MCA_sat_F1_offy")
      mdF_sat_offz = VAR_VAL(PADRE(idx_MdF, 1), "MCA_sat_F1_offz")
      mdF_sat_angz = VAR_VAL(PADRE(idx_MdF, 1), "MCA_sat_F1_angz")

      if (VAR_EXIST(idx_MdF, "MCA_sat_F1_offx") )  { mdF_sat_offx = VAR_VAL(idx_MdF, "MCA_sat_F1_offx") }
      if (VAR_EXIST(idx_MdF, "MCA_sat_F1_offy") )  { mdF_sat_offy = VAR_VAL(idx_MdF, "MCA_sat_F1_offy") }
      if (VAR_EXIST(idx_MdF, "MCA_sat_F1_offz") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MCA_sat_F1_offz") }
      if (VAR_EXIST(idx_MdF, "MCA_sat_F1_angz") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MCA_sat_F1_angz") }

     // 29.11.2023
      if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_F1_CerAngLib", STR(id_Fer))) )
         {
          mdfstr_input = VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_F1_CerAngLib", STR(id_Fer)))
          GOSUB MdF_EstraiStringhe
          mdF_sat_offx = ATOI(mdf_array_Stringhe[1])
          mdF_sat_offy = ATOI(mdf_array_Stringhe[2])
          mdF_sat_offz = ATOI(mdf_array_Stringhe[3])
          mdF_sat_angz = ATOI(mdf_array_Stringhe[4])
          if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*") )
             {
              if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##5") )
                 {
                  mdF_sat_offx = ATOI(mdf_array_Stringhe[5])
                  mdF_sat_offy = ATOI(mdf_array_Stringhe[6])
                  mdF_sat_offz = ATOI(mdf_array_Stringhe[7])
                  mdF_sat_angz = ATOI(mdf_array_Stringhe[8])
                 }
             }
         }

      GOSUB mdf_ADD_sat
   }

   PuntiNotevoli
   {
      idx_att = ATTUALE()
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
     // per MdF_Sat
      vano_0_0 = [0,0,0]
      vano_l_0 = X
      vano_p_0 = Z
      vano_hide_0 = 1
   }

   Posiziona MdF_CilindroZ  cz
   {
      @escluso = escl_Grafica
      @X = X
      @Y = Y
      @Z = Z

      @base_0 = base_0
      @base_0.y = base_0.y - @Y/2
      mdf_gra_off_cil = X/2-9.1
      @base_0.x = base_0.x - X/2 + mdf_gra_off_cil
      if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*") )
         {
          @base_0.x = base_0.x + X/2 - mdf_gra_off_cil
         }

      if (VAR_VAL(PADRE(idx_MdF, 1), "MCB_Vis_CerBat") == 1)
         {
          @escluso = 0
          @Z = 2
          @base_0.z = base_1.z - @Z/2
         }
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         )
         { @escluso = 1 }


      @c_rivestimento = [128, 128, 128]
   }

   Posiziona Blocco bl
   {
      @escluso = escl_Grafica
      @X = X
      @Y = 22
      @Z = Z
      @base_0 = base_0
      @base_0.x = base_0.x
      @base_0.y = base_0.y - @Y/2
      @base_0.z = base_0.z - (Z-ABS(pz_CerAngLib))/2

      if (px_CerAngLib < X/2)  { @base_0.x = base_0.x - px_CerAngLib }

      xmdf = VAR_VAL(PADRE(idx_att, 2), "X")
      ymdf = VAR_VAL(PADRE(idx_att, 2), "Y")
      zmdf = VAR_VAL(PADRE(idx_att, 2), "Z")
      if (px_CerAngLib > xmdf+X/2)    { @base_0.x = base_0.x - @X + (xmdf-px_CerAngLib) }
      if (px_CerAngLib > xmdf+0.1)    { @base_0.x = base_0.x - @X + (xmdf-px_CerAngLib) }
      if (px_CerAngLib > xmdf-X/2)    { @base_0.x = base_0.x }
      if (px_CerAngLib < 0)           { @base_0.x = base_0.x }
      if (py_CerAngLib > ymdf+Y/2)    { @base_0.y = base_0.y - @Y + (ymdf-py_CerAngLib) }
      if (py_CerAngLib > ymdf+0.1)    { @base_0.y = base_0.y - @Y + (ymdf-py_CerAngLib) }
      if (py_CerAngLib > ymdf-Y/2)    { @base_0.y = base_0.y }
      if (py_CerAngLib < 0)           { @base_0.y = base_0.y }

      if (px_CerAngLib+X+0.1 >= xmdf & px_CerAngLib+X-0.1 <= xmdf)  { @base_0.x = base_0.x }

      if (ABS(pz_CerAngLib)*2 < Z  &  Z+1 < zmdf)  { @base_0.z = base_0.z - pz_CerAngLib/2 }
      // Attaccaglie da Schiena per lav su Fianco
      if (ABS(pz_CerAngLib) < Z  &  Z-1 > zmdf)    { @base_0.z = base_0.z - ABS(pz_CerAngLib) - (Z-ABS(pz_CerAngLib))/2 }
      if (ABS(pz_CerAngLib) > Z)                   { @base_0.z = base_0.z }

      @c_rivestimento = [255,255,120]
      @f_rivestimento = STR(100*0.005)
   }
}

Elemento MdF_CernierePistoneVasRib
{
   Descrizione = "Contenitore grafica Cerniere Pisotne Vasistas Ribalta"
   Code        = GRANT
   Gruppo      = "TMP"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   Alias         MdF_CAM;MdF_CerVasRib

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22
      HIDE  ""  1

      MdF_Apertura      "Apertura VA-RI"                            ""

      py_CerRib1        "Rientro in Y della Cerniera"                0
      px_CerRib1        "Quota X cerniera 1"                         0
      px_CerRib2        "Quota X cerniera 2"                         0
      px_CerRib3        "Quota X cerniera 3"                         0
      px_CerRib4        "Quota X cerniera 4"                         0
      px_CerRib5        "Quota X cerniera 5"                         0
      px_CerRib6        "Quota X cerniera 6"                         0

      px_CerRib7        "Quota X cerniera 7"                         0
      px_CerRib8        "Quota X cerniera 8"                         0
      px_CerRib9        "Quota X cerniera 9"                         0

      pz_CerRib1        "Quota Z cerniera 1"                         0

      px_PisAnta1       "Rientro in X del Pistone"                   0
      py_PisAnta1       "Rientro in Y del Pistone su anta"           0
      py_PisFia1        "Rientro in Y del Pistone su verticale"      0

      px_PisAntaCn1     "pos X del Pistone"                          0
      py_PisAntaCn1     "pos Y del Pistone su Frontale"              0
      px_PisFiaCn1      "pos X del Pistone su verticale"             0
      py_PisFiaCn1      "pos Y del Pistone su verticale"             0
      px_PisAntaCn2     "pos X del Pistone"                          0
      py_PisAntaCn2     "pos Y del Pistone su Frontale"              0
      px_PisFiaCn2      "pos X del Pistone su verticale"             0
      py_PisFiaCn2      "pos Y del Pistone su verticale"             0
     // 01.03.2019
      px_PisAntaCn3     "pos X del Pistone Cn3"                      0
      py_PisAntaCn3     "pos Y del Pistone su Frontale Cn3"          0
      px_PisFiaCn3      "pos X del Pistone su verticale Cn3"         0
      py_PisFiaCn3      "pos Y del Pistone su verticale Cn3"         0
      px_PisAntaCn4     "pos X del Pistone Cn4"                      0
      py_PisAntaCn4     "pos Y del Pistone su Frontale Cn4"          0
      px_PisFiaCn4      "pos X del Pistone su verticale Cn4"         0
      py_PisFiaCn4      "pos Y del Pistone su verticale Cn4"         0
     // 21.01.2021
      px_PisAntaCn5     "pos X del Pistone Cn5"                      0
      py_PisAntaCn5     "pos Y del Pistone su Frontale Cn5"          0
      px_PisFiaCn5      "pos X del Pistone su verticale Cn5"         0
      py_PisFiaCn5      "pos Y del Pistone su verticale Cn5"         0
      px_PisAntaCn6     "pos X del Pistone Cn6"                      0
      py_PisAntaCn6     "pos Y del Pistone su Frontale Cn6"          0
      px_PisFiaCn6      "pos X del Pistone su verticale Cn6"         0
      py_PisFiaCn6      "pos Y del Pistone su verticale Cn6"         0

      Battuta_X_Sx      "battuta Sx su Fia di aggancio"              0
      Battuta_X_Dx      "battuta Dx su Fia di aggancio"              0
      Battuta_Y         "battuta in Y su Pia di aggancio"            0
      Battuta_Z         "battuta in Z su Fia,Pia"                    0
      KeyFamRegFacc     "Famiglia Lavorazione"                       ""

      MdF_Utente             "Gestione cerniere da utente"         "-1"  NoSave

      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      GOSUB MdF_SetStato_NoGEST

      cam_KeyRegMdF = "CerRib"
      GOSUB MdF_Ctrl_save_prec
     // 23.12.2022
      if (MdF_Utente == "-1")  { MdF_Utente = $MdF_Utente }

      // Se chiamo una ipotetica procedura MdF_noAUTO non passa quando escluso=1
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          mdf_no_Save = 0
          if ( STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) == -1
             & STR_INDEX_OF(MdF_Utente, 0, "-1") == -1
             )
             { mdf_no_Save = 1 }

         // 01.06.2023 Sc1020093137, 1020113636
          // cam.ini MdF_Utente="CerBat;CerRib" quindi STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) fallisce, ma non devo salvare
          // nel rit l' MdF_ se l' MdF_ e' figlio di un VESTI
          mdf_LivSpostaCerUte = VAR_VAL(PADRE(idx_att, 1), "MdfSys_LivSpostaCerUte")
          if (mdf_LivSpostaCerUte > 2)  { mdf_no_Save = 1 }

          if (mdf_no_Save > 0)
             {
              MdF_comandoOnAUTO = 1
              COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
             }
         }
      if (mdf_save_prec == 1)
         {
          MdF_comandoOnAUTO = -1
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att)))
         }

      if (STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) > -1)  { HIDE = 3 }
   }

   Attrezza
   {
      base_0 = @base_0
      base_0.z = @base_0.z
      X = @X
      Y = @Y
      Z = @Z
   }

   Controlli
   {
      idx_att = ATTUALE()
      idx_CamMdF = PADRE(idx_att, 1)
      nome_CamMdF = NOME(idx_CamMdF)
      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")
      Z = VAR_VAL(idx_CamMdF, "Z")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      GOSUB MdF_Ctrl_Dim

      escluso = 0
      idx_MdF_Var = idx_att

      COMPONENTI3("mdf_gia_inserito", idx_CamMdF, NOME(idx_att))
      if (mdf_gia_inserito > 1)
         {
          // 07.08.2024
          mdf_ins_utente = 0
          iu=1
          while (iu <= mdf_gia_inserito)
             {
              if (IS_MATCH(NOME(PADRE(mdf_gia_inserito[iu], 1)), "MECCANISM*_UTENTE*") )
                 { mdf_ins_utente = mdf_ins_utente+1 }
              iu = iu+1
             }
          if (mdf_gia_inserito-mdf_ins_utente > 1)
             {
              COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // MdF_CernierePistoneVasRib mdf_gia_inserito"))
              EXITSUB()
             }
         }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

     // 02.05.2024 Ottimizzazioni
      GOSUB MdF_Ctrl_var_cam_Init
      GOSUB MdF_ctrl_Change_Var_CAM
      if (mdf_ctrl_Change_Var_CAM > 0)
         {
          GOSUB MdF_VariabiliDaTipoPadri
          CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "keyGenericaMdF"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "CerRib"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "CerRibMdF"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "PisAnta"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "PisAntaMdF"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "PisFia"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "PisFiaMdF"
          GOSUB MdF_Variabili
         }

     // 10.09.2024
      if (STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) > -1)
         {
          mdf_LivSpostaCerUte = VAR_VAL(PADRE(idx_att, 1), "MdfSys_LivSpostaCerUte")
          if (mdf_LivSpostaCerUte <= 2)
             {
              if (VAR_VAL(idx_att, "MdF_comandoOnAUTO") >= 1)
                 {
                  COMPONENTI2("mdf_CerBasVR", idx_att, "MdF_CernieraBasetta_VasRib")
                  ivr = 1
                  mdf_found_modif = 0
                  while (ivr <= mdf_CerBasVR)
                     {
                      VarsUser_click = VAR_VAL_STR(mdf_FerFFP[ivr], "VarsUser__")
                      if ( VAR_VAL(mdf_CerBasVR[ivr], "sposta_X_Utente") != 0
                         | IS_VAR_FIXED(mdf_CerBasVR[ivr], "sposta_X_Utente")
                         )
                         {
                          mdf_found_modif = 1
                         }
                      else
                         {
                         // 06.02.2025 Se clicco senza cambiare valore
                          if ( VAR_VAL(mdf_CerBasVR[ivr], "sposta_X_Utente") == 0
                             & IS_MATCH(VarsUser_click, "*sposta*")
                             )
                             {
                              DEL_VAR_MODIFICATE(mdf_CerBasVR[ivr], "sposta_*Utente")
                              DEL_VAR_MODIFICATE(mdf_CerBasVR[ivr], "VarsUser__")
                              DEL_VAR(mdf_CerBasVR[ivr], "VarsUser__")
                              mdf_found_modif = -1
                             }
                         }
                     ivr = ivr+1
                     }
                  if (mdf_found_modif > 0)
                     {
                      MdF_comandoOnAUTO = -2
                      COMANDO(STRCAT("NO_AUTO ", STR(idx_att)))
                     }
                 }
             }
         }

      if ( IS_MATCH(MdF_Apertura, "VA*") != 1
         & IS_MATCH(MdF_Apertura, "RI*") != 1
         )
         { escluso = 1 }

      GOSUB MdF_Battuta_X
      GOSUB MdF_Battuta_Y

     // 06.05.2024 Vedi mdf_ctrl_Change_Var_CAM <= 0
      GOSUB Reg_pos_CerRib

      GOSUB Reg_CerRib_att
      GOSUB MdF_Battuta_X_After_RegFacc

      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_ADD_when"), "first_OnMacroMdF") )
         { MdF_ADD_when = "RE_Control" }

      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)
         {
          MdF_ADD_when = "RE_Control"
          mdf_ricalc_Post_READD = 0
         }
     // 23.12.2022 Se arriva da VariabiliMdF.txt
      HIDE = 1
      if (STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) > -1)  { HIDE = 3 }

      if (VAR_EXIST(idx_att, "MCR_ElementoBdm_CerRib") != 1)       { MCR_ElementoBdm_CerRib = "MdF_Sat_CerRib" }
      if (VAR_EXIST(idx_att, "MCR_ElementoBdm_CerRibVAPI") != 1)   { MCR_ElementoBdm_CerRibVAPI = "MdF_Sat_CerRibVAPI" }
      if (VAR_EXIST(idx_att, "MCR_ElementoBdm_BasRib") != 1)       { MCR_ElementoBdm_BasRib = "MdF_Sat_BasRib" }
      if (VAR_EXIST(idx_att, "MCR_ElementoBdm_BasRibVAPI") != 1)   { MCR_ElementoBdm_BasRibVAPI = "MdF_Sat_BasRibVAPI" }
      if (VAR_EXIST(idx_att, "MPA_ElementoBdm_PisAnta") != 1)      { MPA_ElementoBdm_PisAnta = "MdF_Sat_PisAnta" }
      if (VAR_EXIST(idx_att, "MPF_ElementoBdm_PisFia") != 1)       { MPF_ElementoBdm_PisFia = "MdF_Sat_PisFia" }
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_CernieraBasetta_VasRib  cer1
   {
      @escluso = 1
      if (px_CerRib1 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_CerRib1
      @base_0.y = base_0.y + Battuta_Y
      if (IS_MATCH(MdF_Apertura, "VA*") == 1)
         { @base_0.y = alto_0.y - Battuta_Y - @Y }
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      // 30.01.2024 corretto baco, ma non cambiava niente
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerRib")
      @pos_Y_cerAnta = py_CerRib1-Battuta_Y
      //@Y = @Y_eleFro+@pos_Y_cerAnta+0.5
      @id_Cer = 1
   }

   Posiziona MdF_CernieraBasetta_VasRib  cer2
   {
      @escluso = 1
      if (px_CerRib2 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_CerRib2
      @base_0.y = base_0.y + Battuta_Y
      if (IS_MATCH(MdF_Apertura, "VA*") == 1)
         { @base_0.y = alto_0.y - Battuta_Y - @Y }
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerRib")
      @pos_Y_cerAnta = py_CerRib1-Battuta_Y
      @id_Cer = 2
   }

   Posiziona MdF_CernieraBasetta_VasRib  cer3
   {
      @escluso = 1
      if (px_CerRib3 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_CerRib3
      @base_0.y = base_0.y + Battuta_Y
      if (IS_MATCH(MdF_Apertura, "VA*") == 1)
         { @base_0.y = alto_0.y - Battuta_Y - @Y }

      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerRib")
      @pos_Y_cerAnta = py_CerRib1-Battuta_Y
      @id_Cer = 3
   }

   Posiziona MdF_CernieraBasetta_VasRib  cer4
   {
      @escluso = 1
      if (px_CerRib4 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_CerRib4
      @base_0.y = base_0.y + Battuta_Y
      if (IS_MATCH(MdF_Apertura, "VA*") == 1)
         { @base_0.y = alto_0.y - Battuta_Y - @Y }

      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerRib")
      @pos_Y_cerAnta = py_CerRib1-Battuta_Y
      @id_Cer = 4
   }

   Posiziona MdF_CernieraBasetta_VasRib  cer5
   {
      @escluso = 1
      if (px_CerRib5 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_CerRib5
      @base_0.y = base_0.y + Battuta_Y
      if (IS_MATCH(MdF_Apertura, "VA*") == 1)
         { @base_0.y = alto_0.y - Battuta_Y - @Y }

      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerRib")
      @pos_Y_cerAnta = py_CerRib1-Battuta_Y
      @id_Cer = 5
   }

   Posiziona MdF_CernieraBasetta_VasRib  cer6
   {
      @escluso = 1
      if (px_CerRib6 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_CerRib6
      @base_0.y = base_0.y + Battuta_Y
      if (IS_MATCH(MdF_Apertura, "VA*") == 1)
         { @base_0.y = alto_0.y - Battuta_Y - @Y }

      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerRib")
      @pos_Y_cerAnta = py_CerRib1-Battuta_Y
      @id_Cer = 6
   }

  // 24.04.2024
   Posiziona MdF_CernieraBasetta_VasRib  cer7
   {
      @escluso = 1
      if (px_CerRib7 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_CerRib7
      @base_0.y = base_0.y + Battuta_Y
      if (IS_MATCH(MdF_Apertura, "VA*") == 1)
         { @base_0.y = alto_0.y - Battuta_Y - @Y }

      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerRib")
      @pos_Y_cerAnta = py_CerRib1-Battuta_Y
      @id_Cer = 7
   }

   Posiziona MdF_CernieraBasetta_VasRib  cer8
   {
      @escluso = 1
      if (px_CerRib8 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_CerRib8
      @base_0.y = base_0.y + Battuta_Y
      if (IS_MATCH(MdF_Apertura, "VA*") == 1)
         { @base_0.y = alto_0.y - Battuta_Y - @Y }

      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerRib")
      @pos_Y_cerAnta = py_CerRib1-Battuta_Y
      @id_Cer = 8
   }

   Posiziona MdF_CernieraBasetta_VasRib  cer9
   {
      @escluso = 1
      if (px_CerRib9 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_CerRib9
      @base_0.y = base_0.y + Battuta_Y
      if (IS_MATCH(MdF_Apertura, "VA*") == 1)
         { @base_0.y = alto_0.y - Battuta_Y - @Y }

      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerRib")
      @pos_Y_cerAnta = py_CerRib1-Battuta_Y
      @id_Cer = 9
   }

   Posiziona MdF_Pistone_VasRib  pisSx
   {
      @escluso = 1
      if (py_PisAnta1 > 0)  { @escluso = 0 }

      // Se la chiave contiene DX significa che voglio solo quello di destra
      if ( STR_INDEX_OF(UPPER(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM_PisAnta1")), 0, "DX") > -1
         & STR_INDEX_OF(UPPER(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM_PisAnta1")), 0, "SXDX") == -1
         )
         { @escluso = 1 }

      if ( STR_INDEX_OF(UPPER(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM_PisFia1")), 0, "DX") > -1
         & STR_INDEX_OF(UPPER(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM_PisFia1")), 0, "SXDX") == -1
         )
         { @escluso = 1 }

      // 16.01.2025
       if ( STR_INDEX_OF(UPPER(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM_PisAnta1")), 0, "ESCL") > -1
          | STR_INDEX_OF(UPPER(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM_PisFia1")), 0, "ESCL") > -1
          )
          { @escluso = 1 }

     // 08.01.2024 Diciamo che non dovrebbe mai esserci questa situazione perchè sarebbe un errore di configurazione
      // o non va bene avere MdF_Pan_X o non va bene ricercare i Fianchi con MdF_ distNearBatFia > 50
      // Si può usare MdfSys_Battuta_SX_Cn e MdF_Pan_X oppure MdF_ distNearBatFia quanto basta per trovare i Fianchi
      // Entrambe le soluzioni possono andar bene, forse è più corretta la prima con MdfSys_Battuta_SX_Cn & MdF_Pan_X
      @mdf_add_posx = 0
      if (Battuta_X_Sx > 50)
         {
          if ( VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X") > 50
             & VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD") > 50
             )
             {
              mdf_diffX = VAR_VAL(PADRE(idx_att, 1), "X") - VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X")
              if ( Battuta_X_Sx >= mdf_diffX
                 & Battuta_X_Sx-30 < mdf_diffX
                 )
                 {
                  @mdf_add_posx = mdf_diffX
                 }
             }
         }

      @id_Pis = 1
      @Z = VAR_VAL(idx_att, STRCAT("Z_PisFia", STR(@id_Pis)))
      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X_Sx-@mdf_add_posx
      @base_0.y = base_0.y + py_PisAnta1
      @base_0.z = base_0.z - @Z
      @PosizionePistone = "SX"
      // 30.01.2024
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta")
      @KeyFamRegFacc_PisFia = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia")
      @pos_X_pisAnta = px_PisAnta1-Battuta_X_Sx-@mdf_add_posx
      @diff_Y_pisFia = py_PisAnta1-py_PisFia1
      @Y = ABS(@diff_Y_pisFia)+@Y_eleFro +16
      // 07.08.2018
      //if (py_PisAnta1+@Y > Y)
      if (py_PisAnta1+@Y-5.5 > Y)
         {
          @Y = VAR_VAL(idx_att, STRCAT("Y_PisFia", STR(@id_Pis)))
         }
      @py_PisFia = py_PisFia1
      @py_PisAnta = py_PisAnta1
   }

   Posiziona MdF_Pistone_VasRib  pisDx
   {
      @escluso = 1
      if (py_PisAnta1 > 0)  { @escluso = 0 }

      // Se la chiave contiene SX significa che voglio solo quello di sinistra
      if ( STR_INDEX_OF(UPPER(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM_PisAnta1")), 0, "SX") > -1
         & STR_INDEX_OF(UPPER(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM_PisAnta1")), 0, "SXDX") == -1
         )
         { @escluso = 1 }

      if ( STR_INDEX_OF(UPPER(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM_PisFia1")), 0, "SX") > -1
         & STR_INDEX_OF(UPPER(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM_PisFia1")), 0, "SXDX") == -1
         )
         { @escluso = 1 }

     // 08.01.2024 Sn19224 Diciamo che non dovrebbe mai esserci questa situazione perchè sarebbe un errore di configurazione
      // o non va bene avere MdF_Pan_X o non va bene ricercare i Fianchi con MdF_ distNearBatFia > 50
      // Si può usare MdfSys_Battuta_DX_Cn e MdF_Pan_X oppure MdF_ distNearBatFia quanto basta per trovare i Fianchi
      // Entrambe le soluzioni possono andar bene, forse è più corretta la prima con MdfSys_Battuta_DX_Cn & MdF_Pan_X
      @mdf_add_posx = 0
      if (Battuta_X_Dx > 50)
         {
          if (VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X") > 50)
             {
              mdf_diffX = VAR_VAL(PADRE(idx_att, 1), "X") - VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X")
              if ( Battuta_X_Dx >= mdf_diffX
                 & Battuta_X_Dx-30 < mdf_diffX
                 )
                 {
                  @mdf_add_posx = mdf_diffX
                 }
             }
         }
      @id_Pis = 1
      @Z = VAR_VAL(idx_att, STRCAT("Z_PisFia", STR(@id_Pis)))
      @base_0 = base_0
      @base_0.x = base_3.x - Battuta_X_Dx+@mdf_add_posx - @X
      @base_0.y = base_0.y + py_PisAnta1
      @base_0.z = base_0.z - @Z
      @PosizionePistone = "DX"
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta")
      @KeyFamRegFacc_PisFia = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia")
      @pos_X_pisAnta = px_PisAnta1-Battuta_X_Dx+@mdf_add_posx
      @diff_Y_pisFia = py_PisAnta1-py_PisFia1
      @Y = ABS(@diff_Y_pisFia)+@Y_eleFro +16
      // 07.08.2018
      //if (py_PisAnta1+@Y > Y)
      if (py_PisAnta1+@Y-5.5 > Y)
         {
          @Y = VAR_VAL(idx_att, STRCAT("Y_PisFia", STR(@id_Pis)))
         }

      @py_PisFia = py_PisFia1
      @py_PisAnta = py_PisAnta1
      if (VAR_EXIST(idx_att, "py_PisAnta2") )
         {
          @escluso = 1
          if (py_PisAnta2 > 0)  { @escluso = 0 }

         // 16.01.2025
          if ( STR_INDEX_OF(UPPER(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM_PisAnta2")), 0, "ESCL") > -1
             | STR_INDEX_OF(UPPER(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM_PisFia2")), 0, "ESCL") > -1
             )
             { @escluso = 1 }

          @id_Pis = 2
          @base_0 = base_0
          @base_0.x = base_3.x - Battuta_X_Dx+@mdf_add_posx - @X
          @base_0.y = base_0.y + py_PisAnta2
          @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta")
          @KeyFamRegFacc_PisFia = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia")
          @pos_X_pisAnta = X-px_PisAnta2-Battuta_X_Dx+@mdf_add_posx
          @diff_Y_pisFia = py_PisAnta2-py_PisFia2
          @Y = ABS(@diff_Y_pisFia)+@Y_eleFro +16
          if (py_PisAnta2+@Y-5.5 > Y)
             {
              @Y = VAR_VAL(idx_att, STRCAT("Y_PisFia", STR(@id_Pis)))
             }
          @Z = VAR_VAL(idx_att, STRCAT("Z_PisFia", STR(@id_Pis)))
          @base_0.z = base_0.z - @Z
          @py_PisFia = py_PisFia2
          @py_PisAnta = py_PisAnta2
         }
   }

   Posiziona MdF_Pistone_VasRib  pisCnSx
   {
      @escluso = 1
      if (py_PisAntaCn1 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_PisFiaCn1 - @X
      @base_0.y = base_0.y + py_PisAntaCn1
      @base_0.z = base_0.z - @Z
      @PosizionePistone = "CNSX"
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta")
      @KeyFamRegFacc_PisFia = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia")
      @pos_X_pisAnta = px_PisFiaCn1-px_PisAntaCn1
      @diff_Y_pisFia = py_PisAntaCn1-py_PisFiaCn1
      @Y = ABS(@diff_Y_pisFia)+@Y_eleFro +16
      @id_Pis = 1
      // 07.08.2018
      //if (py_PisAntaCn1+@Y > Y)
      if (py_PisAntaCn1+@Y-5.5 > Y)
         {
          @Y = VAR_VAL(idx_att, STRCAT("Y_PisFiaCn", STR(@id_Pis)))
         }
      @Z = VAR_VAL(idx_att, STRCAT("Z_PisFiaCn", STR(@id_Pis)))
      @py_PisFia = py_PisFiaCn1
      @py_PisAnta = py_PisAntaCn1
   }

   Posiziona MdF_Pistone_VasRib  pisCnDx
   {
      @escluso = 1
      if (py_PisAntaCn2 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_PisFiaCn2
      @base_0.y = base_0.y + py_PisAntaCn2
      @base_0.z = base_0.z - @Z
      @PosizionePistone = "CNDX"
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta")
      @KeyFamRegFacc_PisFia = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia")
      @pos_X_pisAnta = px_PisAntaCn2-px_PisFiaCn2
      @diff_Y_pisFia = py_PisAntaCn2-py_PisFiaCn2
      @Y = ABS(@diff_Y_pisFia)+@Y_eleFro +16
      @id_Pis = 2
      // 07.08.2018
      //if (py_PisAntaCn2+@Y > Y)
      if (py_PisAntaCn2+@Y-5.5 > Y)
         {
          @Y = VAR_VAL(idx_att, STRCAT("Y_PisFiaCn", STR(@id_Pis)))
         }
      @Z = VAR_VAL(idx_att, STRCAT("Z_PisFiaCn", STR(@id_Pis)))
     // 29.01.2020
      @py_PisFia = py_PisFiaCn2
      @py_PisAnta = py_PisAntaCn2
   }

  // 01.03.2019
   Posiziona MdF_Pistone_VasRib  pisCnS2
   {
      @escluso = 1
      if (py_PisAntaCn3 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_PisFiaCn3 - @X
      @base_0.y = base_0.y + py_PisAntaCn3
      @base_0.z = base_0.z - @Z
      @PosizionePistone = "CNSX"
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta")
      @KeyFamRegFacc_PisFia = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia")
      @pos_X_pisAnta = px_PisFiaCn3-px_PisAntaCn3
      @diff_Y_pisFia = py_PisAntaCn3-py_PisFiaCn3
      @Y = ABS(@diff_Y_pisFia)+@Y_eleFro +16
      @id_Pis = 3
      if (py_PisAntaCn3+@Y-5.5 > Y)
         {
          @Y = VAR_VAL(idx_att, STRCAT("Y_PisFiaCn", STR(@id_Pis)))
         }
      @Z = VAR_VAL(idx_att, STRCAT("Z_PisFiaCn", STR(@id_Pis)))
      @py_PisFia = py_PisFiaCn3
      @py_PisAnta = py_PisAntaCn3
   }

   Posiziona MdF_Pistone_VasRib  pisCnD2
   {
      @escluso = 1
      if (py_PisAntaCn4 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_PisFiaCn4
      @base_0.y = base_0.y + py_PisAntaCn4
      @base_0.z = base_0.z - @Z
      @PosizionePistone = "CNDX"
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta")
      @KeyFamRegFacc_PisFia = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia")
      @pos_X_pisAnta = px_PisAntaCn4-px_PisFiaCn4
      @diff_Y_pisFia = py_PisAntaCn4-py_PisFiaCn4
      @Y = ABS(@diff_Y_pisFia)+@Y_eleFro +16
      @id_Pis = 4
      if (py_PisAntaCn4+@Y-5.5 > Y)
         {
          @Y = VAR_VAL(idx_att, STRCAT("Y_PisFiaCn", STR(@id_Pis)))
         }
      @Z = VAR_VAL(idx_att, STRCAT("Z_PisFiaCn", STR(@id_Pis)))
      @py_PisFia = py_PisFiaCn4
      @py_PisAnta = py_PisAntaCn4
   }

  // 21.01.2021
   Posiziona MdF_Pistone_VasRib  pisCnS3
   {
      @escluso = 1
      if (py_PisAntaCn5 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_PisFiaCn5 - @X
      @base_0.y = base_0.y + py_PisAntaCn5
      @base_0.z = base_0.z - @Z
      @PosizionePistone = "CNSX"
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta")
      @KeyFamRegFacc_PisFia = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia")
      @pos_X_pisAnta = px_PisFiaCn5-px_PisAntaCn5
      @diff_Y_pisFia = py_PisAntaCn5-py_PisFiaCn5
      @Y = ABS(@diff_Y_pisFia)+@Y_eleFro +16
      @id_Pis = 5
      if (py_PisAntaCn5+@Y-5.5 > Y)
         {
          @Y = VAR_VAL(idx_att, STRCAT("Y_PisFiaCn", STR(@id_Pis)))
         }
      @Z = VAR_VAL(idx_att, STRCAT("Z_PisFiaCn", STR(@id_Pis)))
      @py_PisFia = py_PisFiaCn5
      @py_PisAnta = py_PisAntaCn5
   }

   Posiziona MdF_Pistone_VasRib  pisCnD3
   {
      @escluso = 1
      if (py_PisAntaCn6 > 0)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_PisFiaCn6
      @base_0.y = base_0.y + py_PisAntaCn6
      @base_0.z = base_0.z - @Z
      @PosizionePistone = "CNDX"
      @KeyFamRegFacc = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta")
      @KeyFamRegFacc_PisFia = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia")
      @pos_X_pisAnta = px_PisAntaCn6-px_PisFiaCn6
      @diff_Y_pisFia = py_PisAntaCn6-py_PisFiaCn6
      @Y = ABS(@diff_Y_pisFia)+@Y_eleFro +16
      @id_Pis = 4
      if (py_PisAntaCn6+@Y-5.5 > Y)
         {
          @Y = VAR_VAL(idx_att, STRCAT("Y_PisFiaCn", STR(@id_Pis)))
         }
      @Z = VAR_VAL(idx_att, STRCAT("Z_PisFiaCn", STR(@id_Pis)))
      @py_PisFia = py_PisFiaCn6
      @py_PisAnta = py_PisAntaCn6
   }

   Procedura MdF_noAUTO
   {
     // 07.08.2024
      if (UN_PADRE("MECCANISM*_UTENTE*") )  { EXITSUB() }

      cam_KeyRegMdF = "CerRib"
      if ( VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1
         // 23.12.2022
         //& STR_INDEX_OF($MdF_Utente, 0, cam_KeyRegMdF) == -1
         & STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) == -1
         & mdf_save_prec == 0
         )
         {
          MdF_comandoOnAUTO = 2
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
      if (STR_INDEX_OF($MdF_Utente, 0, cam_KeyRegMdF) > -1)  { HIDE = 3 }
   }

   Procedura MdF_Ctrl_Post_RELATIVE_ADD
   {
      GOSUB MdF_Ctrl_Post_RELATIVE_ADD
   }

   Procedura MdF_Ctrl_ADD_TooEarly
   {
      GOSUB MdF_Ctrl_ADD_TooEarly
   }

   Procedura MdF_Ctrl_Cambiamenti
   {
      if (VAR_EXIST(idx_att, "MdF_Cambiato") != 1)  { EXITSUB() }
     // 07.08.2024
      if (UN_PADRE("MECCANISM*_UTENTE*") )  { EXITSUB() }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerRib"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "CerRibMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "PisAnta"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "PisAntaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "PisFia"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "PisFiaMdF"
      GOSUB MdF_Variabili

      GOSUB MdF_Battuta_X
      GOSUB MdF_Battuta_Y

      GOSUB Reg_pos_CerRib
      GOSUB MdF_Battuta_X_After_RegFacc

      MdF_Cambiato_att = VAR_VAL_STR(idx_att, "MdF_Cambiato")
      bas0_att = base_0.y
      alt0_att = alto_0.y
      bas0_CamMdF = VAR_VAL(idx_CamMdF, "base_0.y")
      alt0_CamMdF = VAR_VAL(idx_CamMdF, "alto_0.y")
      if ( bas0_att == bas0_CamMdF  &  alt0_att == alt0_CamMdF
         & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "Dim*") != 1
         )
         { DEL_VAR(idx_att, "MdF_Cambiato") }

      if ( STRCMP(KeyFamRegFacc_CerRib_att, KeyFamRegFacc_CerRib) != 0
         | STRCMP(KeyFamRegFacc_PisAnta_att, KeyFamRegFacc_PisAnta) != 0
         | STRCMP(KeyFamRegFacc_PisFia_att, KeyFamRegFacc_PisFia) != 0
         | STRCMP(MdF_Aper_att, MdF_Apertura) != 0
         | X_att != X
         | Y_att != Y
         | py_CerRib1_att != py_CerRib1
         | px_CerRib1_att != px_CerRib1
         | px_CerRib2_att != px_CerRib2
         | px_CerRib3_att != px_CerRib3
         | px_CerRib4_att != px_CerRib4
         | px_CerRib5_att != px_CerRib5
         | px_CerRib6_att != px_CerRib6
         // 24.04.2024
         | px_CerRib7_att != px_CerRib7
         | px_CerRib8_att != px_CerRib8
         | px_CerRib9_att != px_CerRib9
         | pz_CerRib1_att != pz_CerRib1
         | px_PisAnta1_att != px_PisAnta1
         | py_PisAnta1_att != py_PisAnta1
         | py_PisFia1_att != py_PisFia1
         // Pis Cn
         | px_PisAntaCn1_att != px_PisAntaCn1
         | py_PisAntaCn1_att != py_PisAntaCn1
         | px_PisFiaCn1_att  != px_PisFiaCn1
         | py_PisFiaCn1_att  != py_PisFiaCn1
         | px_PisAntaCn2_att != px_PisAntaCn2
         | py_PisAntaCn2_att != py_PisAntaCn2
         | px_PisFiaCn2_att  != px_PisFiaCn2
         | py_PisFiaCn2_att  != py_PisFiaCn2
         // Pis Cn 3,4
         | px_PisAntaCn3_att != px_PisAntaCn3
         | py_PisAntaCn3_att != py_PisAntaCn3
         | px_PisFiaCn3_att  != px_PisFiaCn3
         | py_PisFiaCn3_att  != py_PisFiaCn3
         | px_PisAntaCn4_att != px_PisAntaCn4
         | py_PisAntaCn4_att != py_PisAntaCn4
         | px_PisFiaCn4_att  != px_PisFiaCn4
         | py_PisFiaCn4_att  != py_PisFiaCn4
         // Pis Cn 5,6
         | px_PisAntaCn5_att != px_PisAntaCn5
         | py_PisAntaCn5_att != py_PisAntaCn5
         | px_PisFiaCn5_att  != px_PisFiaCn5
         | py_PisFiaCn5_att  != py_PisFiaCn5
         | px_PisAntaCn6_att != px_PisAntaCn6
         | py_PisAntaCn6_att != py_PisAntaCn6
         | px_PisFiaCn6_att  != px_PisFiaCn6
         | py_PisFiaCn6_att  != py_PisFiaCn6
         // Batt
         | Battuta_X_Sx_att != Battuta_X_Sx
         | Battuta_X_Dx_att != Battuta_X_Dx
         | Battuta_Y_att != Battuta_Y
         | Battuta_Z_att != Battuta_Z
         )
         {
          WITH_VAR_LOCAL(idx_att, "mdf_Visgraf", "escl_Grafica", 2, 1, "0")

          //if (mdf_Visgraf <= 0  |  $CAM_Visualize == 1)
          if (mdf_Visgraf <= 0)
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          else
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          MdF_Cambiato_att = STRCAT(MdF_Cambiato_att, " , Ricalcolato")
         }
   }
}

Elemento MdF_CernieraBasetta_VasRib
{
   Descrizione = "CERNIERA_Basetta Vasistas Ribalta per ddp grezzo"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      X  "X Cern"            58
      Y  "Spess. Cerniera"   42
      Z  "Alt. Cerniera"     50

     // 14.11.2023 in Sc2023008922 si trovava
      //VAR_CHANGE 3 \7271\@V1\anSup\@v1\@RA1\cer4 PosizioneCerniera="VAPIESUP" VarsUser__="PosizioneCerniera"
      // che di fatto è impossibile, quindi tolgo Utente ( ), che forse era per test ma c'è dalla versione 1,
      // perchè probabilmente qualcosa fa scattare il fatto che questa variabile sia cambiata e Metron la interpreta da Utente
      //PosizioneCerniera    "Posizione Cerniera"     "VA"  Utente ( )
      PosizioneCerniera    "Posizione Cerniera"     "VA"
      KeyFamRegFacc        "Famiglia Lavorazione"   ""
      id_Cer               "identificativo per CHIAVE_TAB_CAM"         0

      escl_Grafica           "visualizza grafica"     1

      X_BasPia       "Largh basetta"          32
      Y_BasPia       "Altezza basetta"        16
      Z_BasPia       "Prof.   basetta"        39

      X_eleFro       "Largh cerniera"         52
      Y_eleFro       "Altezza cerniera"       42
      Z_eleFro       "Prof.   cerniera"       12

      pos_Y_cerAnta  "pos in y lav su anta"     5
      pz_CerRib      "pos in z lav su piano"   30
      Battuta_Z      "Battuta in Z"             0

      mdf_import_CernieraVasRib  ""  ""
      mdf_import_BasettaVasRib   ""  ""
      mcr_TipoGestioneCollis     ""  0

     // 23.01.2022
      sposta_X_Utente  "Spostamento X da Utente"   0 ShowAlways
      mdf_modif_Ute    "modifiche da Utente"       0
      MdF_Utente       "Gestione cer da utente"    "-1"  NoSave

      spazioEdit1    " "                          "" ShowAlways
      spazioEdit2    " "                          "" ShowAlways

      posX_attualeReg  "-- Pos X da RegolaCAM --"  0 ShowAlways
      posX_New         ">  Pos X Nuova Utente  <"  0 ShowAlways

      escluso        "escl Cerniera"             0
      cerCancellata  "Elimina Cerniera"          0 Boolean

      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1

     // Qui faccio solo gestione da var, no da Sezione Posizione!
      M4_NO_OFFS ""  1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      idx_MdF = PADRE(idx_att, 1)
      // Compatibilità 2013 campo Visualizza RegFacc 0 o 1
      if (VAR_EXIST(PADRE(idx_att, 1), "Visualizza_CerRib1") )
         { escl_Grafica = 1-VAR_VAL(PADRE(idx_att, 1), "Visualizza_CerRib1") }

      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_att, 1), "Visualizza_CerRib1")
      GOSUB mdf_Visualize
     // 24.05.2017
      if (STRCMP($MdF_Visualize, "Always") != 0)
         {
          idx_CR = PADRE(idx_att, 1)
          if (VAR_EXIST(PADRE(idx_CR, 2), "MCRV_Vis_CerBas") )
             { escl_Grafica = 1-VAR_VAL(PADRE(idx_CR, 2), "MCRV_Vis_CerBas") }

          if (VAR_EXIST(PADRE(idx_CR, 1), "MCRV_Vis_CerBas") )
             { escl_Grafica = 1-VAR_VAL(PADRE(idx_CR, 1), "MCRV_Vis_CerBas") }

          if (VAR_EXIST(idx_CR, "MCRV_Vis_CerBas") )
             { escl_Grafica = 1-VAR_VAL(idx_CR, "MCRV_Vis_CerBas") }
         }

      if (VAR_VAL(PADRE(idx_att, 1), "X_CerRib1") > 0)
         {
          X_eleFro = VAR_VAL(PADRE(idx_att, 1), "X_CerRib1")
          Y_eleFro = VAR_VAL(PADRE(idx_att, 1), "Y_CerRib1")
          X_BasPia = VAR_VAL(PADRE(idx_att, 1), "X_CerRib1")
          Z_BasPia = VAR_VAL(PADRE(idx_att, 1), "Z_CerRib1")
         }
      if (VAR_VAL(PADRE(idx_att, 1), "pz_CerRib1") > 0)
         { pz_CerRib = VAR_VAL(PADRE(idx_att, 1), "pz_CerRib1") }
      if (VAR_VAL(PADRE(idx_att, 1), "Battuta_Z") > 0)
         { Battuta_Z = VAR_VAL(PADRE(idx_att, 1), "Battuta_Z") }

      DescEdit__ = STRCAT("CernieraVR_", STR(id_Cer), "_", KeyFamRegFacc)
      HIDE = 1
      if (VAR_VAL(PADRE(idx_att, 1), "HIDE") == 3)  { HIDE = 2 }
   }

   Controlli
   {
      mcr_TipoGestioneCollis = VAR_VAL(PADRE(idx_att, 1), "MCR_TipoGestioneCollis")
      if (ACTION() <= 0)  { EXITSUB() }

      chiave_tabvar_mdf = "CerRib"
      GOSUB MdF_GEST

      posX_attualeReg = VAR_VAL(PADRE(idx_att, 1), STRCAT("px_CerRib",STR(id_Cer)) )

     // 15.07.2021 AOVG871830 spostato su PuntiNotevoli altrimenti non va
     // 28.01.2022 Sc1052205
     // 18.03.2022 VD839133
      mcr_TipoGestioneCollis = 1
      if (mcr_TipoGestioneCollis > 0)  { GOSUB MdF_CerRibVas_Collision_Find }

     // 23.12.2022
      MdF_Utente = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Utente")
      mdfliv_makedelcer = VAR_VAL(PADRE(idx_att, 2), "MdfSys_MakeDelCer")
      if (mdfliv_makedelcer > 2)
         {
          HIDE_ON_EDIT(idx_att, "cerCancellata", 1)
          VarsUser = VAR_VAL_STR(idx_att, "VarsUser__")
          if ( cerCancellata == 1
             & VarsUser == "cerCancellata"
             )
             {
              DISPLAY2("Non è questa la procedura per eliminare una Cerniera. Posizionati sulla cerniera destraMouse ed elimina")
              cerCancellata = 0
              DEL_VAR_MODIFICATE(idx_att, "cerCancellata")
              DEL_VAR_MODIFICATE(idx_att, "VarsUser__")
              if (VarsUser == "cerCancellata")
                 {
                  DEL_VAR(idx_att, "VarsUser__")
                 }
             }
         }

      if (VAR_VAL(idx_att, "cerCancellata") == 1)
         {
          escluso = 2
          escl_Grafica = 1
          cam_KeyRegMdF = "CerRib"
          if ( STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) > -1
             & VAR_EXIST(idx_att, "cerEliminata") != 1
             )
             {
              if (VAR_VAL(PADRE(idx_att, 2), "MdfSys_MakeDelCer") <= 0)
                 {
                  if (VAR_VAL(idx_att, "cerCancellata") == 1)
                     {
                     // Devo salvare che l'ho eliminata
                      COMANDO2(STRCAT("NO_AUTO ", STR(PADRE(idx_att, 1))))
                      COMANDO(STRCAT("VAR_CHANGE 3 ", STR(idx_att), " cerCancellata=1"))
                     }
                  cerEliminata = 1
                  COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_agganciati", " // ", NOME(idx_att), " x Elimina CER da Utente"))
                 }
              else
                 {
                  cerEliminata = 1
                  escluso = 2
                  // Con COMANDO se salvo subito non me lo salva, ma se faccio qualcos altro e salvo mi ritrovo il RELATIVE_ADD
                  // Non so come mai le CerBat funzionino lo stesso
                  COMANDO2(STRCAT("NO_AUTO ", STR(PADRE(idx_att, 1)), " SET"))

                  COMANDO(STRCAT("VAR_CHANGE 3 ", STR(PADRE(idx_att, mdfliv_makedelcer)), " MDF_cerCancellataUtente", STR(id_Cer), "=1"))
                  COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_agganciati", " // ", NOME(idx_att), " x MDF_cerCancellataUtente"))
                 }
             }
         }

      mdf_var_canc = STRCAT("MDF_cerCancellataUtente", STR(id_Cer))
      if (VAR_VAL(PADRE(idx_att, mdfliv_makedelcer), mdf_var_canc) == 1)
         { escluso = 2 }

     // 10.09.2024 Diverso da CerBat perchè così è meglio
      str_max_X = STR(VAR_VAL(PADRE(idx_att, 2), "X")/2)
      mdf_LivSpostaCerUte = VAR_VAL(PADRE(idx_att, 2), "MdfSys_LivSpostaCerUte")
      mdf_CER_posX_SpostataUtente = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_posX_SpostataUtente", STR(id_Cer)))
      if (mdf_LivSpostaCerUte > 2)
         {
          chiave_tabvar_mdf = "CerRib"
          if (STR_INDEX_OF(MdF_Utente, 0, chiave_tabvar_mdf) > -1)
             {
              VAR_SET_MODE(idx_att, "sposta_X_Utente", $MODE_USER)
              VAR_SET_MENU(idx_att, "sposta_X_Utente", STRCAT("( -", str_max_X, " )"))
             }

          if (sposta_X_Utente == 0)
             {
              if (sposta_X_Utente == 0)
                 { sposta_X_Utente = mdf_CER_posX_SpostataUtente }
             }
          if (VAR_VAL(idx_att, "sposta_X_Utente") != mdf_CER_posX_SpostataUtente)
             {
              COMANDO2(STRCAT("VAR_CHANGE 1 ", STR(PADRE(idx_att, mdf_LivSpostaCerUte)), " MDF_CER_posX_SpostataUtente", STR(id_Cer), "=", STR(sposta_X_Utente)))
              if (mdf_modif_Ute == 0)  { mdf_modif_Ute = 1 }
             }
          // Perchè salvo MDF_CER_posX_SpostataUtente sul padre mdf_LivSpostaCerUte altrimenti Caricamento Ordine con Errori
          DEL_VAR_MODIFICATE(idx_att, "sposta_X_Utente")
         }

     // 10.09.2024
      if (UN_PADRE("MECC*UTENTE*") )
         {
          HIDE = 1
          HIDE_ON_EDIT(idx_att, "sposta_X_Utente", 1)
          HIDE_ON_EDIT(idx_att, "posX_New", 1)
          HIDE_ON_EDIT(idx_att, "posX_attualeReg", 1)
          px_ute = VAR_VAL(PADRE(idx_att, 1), "px_CerRib1")
          DescEdit__ = STRCAT("CernieraVR_UTE_", KeyFamRegFacc, "_px", STR(px_ute))
         }
      posX_New = posX_attualeReg + sposta_X_Utente
      if (VAR_VAL(-1, "MdF_Gestione_Utente_Std") >= 1)
         {
          HIDE_ON_EDIT(idx_att, "cerCancellata", 1)
          if (UN_PADRE("MECC*UTENTE*") != 1)
             {
              chiave_tabvar_mdf = "CerRib"
              if (STR_INDEX_OF(MdF_Utente, 0, chiave_tabvar_mdf) > -1)
                 {
                  VAR_SET_MODE(idx_att, "sposta_X_Utente", $MODE_USER)
                  VAR_SET_MENU(idx_att, "sposta_X_Utente", STRCAT("( -", str_max_X, " )"))
                 }
              HIDE_ON_EDIT(idx_att, "posX_attualeReg", 0)
              HIDE_ON_EDIT(idx_att, "posX_New", 0)
             }
         }

      if (VAR_EXIST(idx_att, "sposta_X_Utente_prec") != 1)
         { sposta_X_Utente_prec = sposta_X_Utente }

      if (VAR_VAL(idx_att, "sposta_X_Utente_prec") != sposta_X_Utente)
         {
          sposta_X_Utente_prec = sposta_X_Utente
          if (VAR_VAL(PADRE(idx_att, 1), "MdF_comandoOnAUTO") > 0)
             {
              COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " x sposta_X_Utente"))
             }
         }
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]

     // 15.07.2021 AOVG871830
     // 18.03.2022 VD839133
      //if (mcr_TipoGestioneCollis == 0)  { GOSUB MdF_CerRibVas_Collision_Find }
   }

   Posiziona MdF_CernieraVasRib  cern
   {
      @base_0 = base_0
      if (mcr_TipoGestioneCollis > 0)  { @base_0.x = @base_0.x + VAR_VAL(idx_att, "mcr_distX_minToFound") }
      if (sposta_X_Utente != 0)        { @base_0.x = @base_0.x + VAR_VAL(idx_att, "sposta_X_Utente") }
      @base_0.y = base_0.y + pos_Y_cerAnta
      @base_0.z = base_1.z - @Z
      @X = X_eleFro
      @Y = Y_eleFro
      @Z = Z_eleFro
      if (IS_MATCH(PosizioneCerniera, "VA*") )
         { @base_0.y = alto_0.y - pos_Y_cerAnta }

      @PosizioneCerniera = PosizioneCerniera
      @pos_Y_cerAnta = pos_Y_cerAnta
      @id_Cer = id_Cer
      mdf_import_CernieraVasRib = VAR_VAL_STR(ATTUALE(), "mdf_import")
      if ( UN_PADRE("MECC*UTENTE*")
         & STRLEN(VAR_VAL_STR(PADRE(idx_att, 1), "img_sat_F1_CerRib1")) > 1
         )
         {
          mdf_import_CernieraVasRib = STRCAT($path_file_sat_MdF, VAR_VAL_STR(PADRE(idx_att, 1), "img_sat_F1_CerRib1"))
         }
      @mcr_TipoGestioneCollis = mcr_TipoGestioneCollis
   }

   Posiziona MdF_BasettaVasRib  base
   {
      @escluso = VAR_VAL(PADRE(idx_att, 1), "MCR_Escl_Bas")

      @base_0 = base_0
      if (mcr_TipoGestioneCollis > 0)  { @base_0.x = @base_0.x + VAR_VAL(idx_att, "mcr_distX_minToFound") }
      if (sposta_X_Utente != 0)        { @base_0.x = @base_0.x + VAR_VAL(idx_att, "sposta_X_Utente") }
      // Non devo passare la Battuta_Z perché se su un fianco ho Battuta_Z=1 e su Tramezzo
      // Battuta_Z=2 è corretto che dall'anta mi devo spostare senza la Battuta ma con il pz
      //@base_0.z = base_1.z - Battuta_Z - pz_CerRib
      @base_0.z = base_1.z - pz_CerRib
      @X = X_BasPia
      @Y = Y_BasPia
      @Z = Z_BasPia
      if (IS_MATCH(PosizioneCerniera, "VA*") )
         { @base_0.y = alto_0.y - @Y }

      if (VAR_VAL(PADRE(idx_att, 1), "MCR_angoloBas") != 0)
         {
          @X = X_eleFro
          @Y = Y_eleFro
          @Z = Z_eleFro
          @tipoIncidenza = "Z"
          @base_0.z = base_1.z - @Z
         }

      // 0.1mm è per staccarle dall' anta portante, in modo che tocchi solo l'anta sup
      if (VAR_VAL(PADRE(idx_att, 1), "MCR_angoloBas") == 90)   { @base_0.y = alto_0.y + pos_Y_cerAnta + 0.1 }
      if (VAR_VAL(PADRE(idx_att, 1), "MCR_angoloBas") == -90)  { @base_0.y = base_0.y - pos_Y_cerAnta - 0.1 - @Y }
      @PosizioneCerniera = PosizioneCerniera
      @id_Cer = id_Cer
      mdf_import_BasettaVasRib = VAR_VAL_STR(ATTUALE(), "mdf_import")
      if ( UN_PADRE("MECC*UTENTE*")
         & STRLEN(VAR_VAL_STR(PADRE(idx_att, 1), "img_sat_E2_CerRib1")) > 1
         )
         {
          mdf_import_BasettaVasRib = STRCAT($path_file_sat_MdF, VAR_VAL_STR(PADRE(idx_att, 1), "img_sat_E2_CerRib1"))
         }
      @mcr_TipoGestioneCollis = mcr_TipoGestioneCollis

     // 11.03.2022
      if (VAR_VAL(PADRE(idx_att, 1), "MCR_BasettaFianco") == 1)
         {
          @base_0 = base_0
          @X = Y_BasPia
          @Y = X_BasPia
          @base_0.x = base_0.x - VAR_VAL(PADRE(idx_att, 1), "px_CerRib1") + VAR_VAL(PADRE(idx_att, 1), "Battuta_X_Sx")
          @base_0.y = base_0.y
          @base_0.z = base_1.z - @Z
          @pz_CerFia = pz_CerRib
          @tipoIncidenza = "X"
          @PosizioneCerniera = "SX"
          if ( VAR_VAL(PADRE(idx_att, 1), "px_CerRib2") > VAR_VAL(PADRE(idx_att, 1), "X")-100
             & id_Cer == 2
             )
             {
              @base_0.x = base_0.x + VAR_VAL(PADRE(idx_att, 1), "px_CerRib1") - VAR_VAL(PADRE(idx_att, 1), "Battuta_X_Dx") - @X
              @PosizioneCerniera = "DX"
             }
         }
   }

   Posiziona MdF_CilindroZ  grCer
   {
      @escluso = escl_Grafica
      if (STRLEN(mdf_import_CernieraVasRib) > 10)
         {
         // 30.06.2021
          if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
             & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
             )
             {
              // 30.04.2024 Ottimizzazioni FILE_EXIST per la rete
              if (mdf_import_CernieraVasRib != VAR_VAL_STR(idx_att, "mdf_import_CernieraVasRib_prec") )
                 {
                  if (FILE_EXIST(STRCAT(mdf_import_CernieraVasRib, ".sat")) )  { import_CVR_sat_exist = 1 }
                  else                                                         { import_CVR_sat_exist = 0 }
                  mdf_import_CernieraVasRib_prec = mdf_import_CernieraVasRib
                 }
              if (VAR_VAL(idx_att, "import_CVR_sat_exist") > 0)  { @escluso = 1 }
             }
         }
      @X = X_eleFro
      @Y = Y_eleFro
      @Z = Z_eleFro
      @base_0 = base_0
      @base_0.x = base_0.x - @X/2
      if (mcr_TipoGestioneCollis > 0)  { @base_0.x = @base_0.x + VAR_VAL(idx_att, "mcr_distX_minToFound") }
      @base_0.y = base_0.y
      @base_0.z = base_1.z - @Z
      if (IS_MATCH(PosizioneCerniera, "VA*") )
         { @base_0.y = alto_0.y - @Y }

      if (@Y != @X)  { @base_0.y = @base_0.y + (@Y-@X)/2 }

      @c_rivestimento = [128,128,128]
      @f_rivestimento = STR(100*0.005)
   }

   Posiziona Blocco grBas
   {
      @escluso = escl_Grafica
      if (STRLEN(mdf_import_BasettaVasRib) > 10)
         {
         // 30.06.2021
          if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
             & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
             )
             {
              // 30.04.2024 Ottimizzazioni FILE_EXIST per la rete
              if (mdf_import_BasettaVasRib != VAR_VAL_STR(idx_att, "mdf_import_BasettaVasRib_prec") )
                 {
                  if (FILE_EXIST(STRCAT(mdf_import_BasettaVasRib, ".sat")) )  { import_BVR_sat_exist = 1 }
                  else                                                        { import_BVR_sat_exist = 0 }
                  mdf_import_BasettaVasRib_prec = mdf_import_BasettaVasRib
                 }
              if (VAR_VAL(idx_att, "import_BVR_sat_exist") > 0)  { @escluso = 1 }
             }
         }
     // 11.03.2022
      if (VAR_VAL(PADRE(idx_att, 1), "MCR_BasettaFianco") == 1)  { @escluso = 1 }
      @X = X_BasPia
      @Y = Y_BasPia
      @Z = Z_BasPia
      @base_0 = base_0
      @base_0.x = base_0.x - @X/2
      if (mcr_TipoGestioneCollis > 0)  { @base_0.x = @base_0.x + VAR_VAL(idx_att, "mcr_distX_minToFound") }
      @base_0.y = base_0.y
      @base_0.z = base_1.z - @Z
      if (IS_MATCH(PosizioneCerniera, "VA*") )
         { @base_0.y = alto_0.y - @Y }

      if (VAR_VAL(PADRE(idx_att, 1), "MCR_angoloBas") != 0)
         {
          @X = X_eleFro
          @Y = Y_eleFro
          @Z = Z_eleFro
          @base_0.y = alto_0.y + 0.1
          if (VAR_VAL(PADRE(idx_att, 1), "MCR_angoloBas") < 0)
             {
              @base_0.y = base_0.y - @Y - 0.1
             }
         }

      @c_rivestimento = [128,128,128]
      @f_rivestimento = STR(100*0.005)
     // 04.05.2021
      @azione_locked=1
   }

  // 19.01.2021 anche se eseguono la stessa procedura sono richiamate in momenti diversi
   Procedura MdF_Ctrl_Post_RELATIVE_ADD
   {
      GOSUB MdF_CerRibVas_Collision_Find

      if (VAR_VAL(idx_att, "mcr_distX_minToFound_prec") != VAR_VAL(idx_att, "mcr_distX_minToFound") )
         {
          mcr_distX_minToFound_prec = VAR_VAL(idx_att, "mcr_distX_minToFound")
          COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_Ctrl_Post_RELATIVE_ADD ", STR(mcr_distX_minToFound)))
         }
   }

   Procedura MdF_Ctrl_Cambiamenti
   {
      GOSUB MdF_CerRibVas_Collision_Find
      if (VAR_VAL(idx_att, "mcr_distX_minToFound_prec") != VAR_VAL(idx_att, "mcr_distX_minToFound") )
         {
          mcr_distX_minToFound_prec = VAR_VAL(idx_att, "mcr_distX_minToFound")
          COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_Ctrl_Cambiamenti ", STR(mcr_distX_minToFound)))
         }
   }

  // perche' e' già usta nell' OnLoadOrder in modo generico cosi non devo aggiungere un altro comando
   Procedura MdF_CerBat_Collision_Post
   {
     // 15.07.2021
      GOSUB MdF_CerRibVas_Collision_Find

      if (VAR_VAL(idx_att, "mcr_distX_minToFound_prec") != VAR_VAL(idx_att, "mcr_distX_minToFound") )
         {
          mcr_distX_minToFound_prec = VAR_VAL(idx_att, "mcr_distX_minToFound")
          COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_CerBat_Collision_Post ", STR(mcr_distX_minToFound)))
         }
   }
  // se serve solo per collisioni Cer Rib Vas
   Procedura MdF_CerRib_Collision_Post
   {
      GOSUB MdF_CerRibVas_Collision_Find

      if (VAR_VAL(idx_att, "mcr_distX_minToFound_prec") != VAR_VAL(idx_att, "mcr_distX_minToFound") )
         {
          mcr_distX_minToFound_prec = VAR_VAL(idx_att, "mcr_distX_minToFound")
          COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_CerRib_Collision_Post ", STR(mcr_distX_minToFound)))
         }
   }

  // 06.02.2025 Se clicco senza cambiare valore
   // Prima di versione M4 DlgVar del 6.02.2025
   Procedura CtrlVarUserNoChange
   {
      mdf_LivSpostaCerUte = VAR_VAL(PADRE(idx_att, 1), "MdfSys_LivSpostaCerUte")
      if (mdf_LivSpostaCerUte <= 2)
         {
          VarsUser_click = VAR_VAL_STR(idx_att, "VarsUser__")
          if (VAR_VAL(idx_att, "sposta_X_Utente") == 0)
             {
              // VarsUser__ è ancora vuota se non faccio RIGENERA sia che modifico il valore sia che faccia ANNULLA o ESC
              // ma in ogni caso la resetto se non è cambiato niente
              mdf_ctrl_VarsUser = VarsUser_click
              DEL_VAR_MODIFICATE(idx_att, "*sposta_*Utente")
              DEL_VAR_MODIFICATE(idx_att, "VarsUser__")
             }
         }
   }

  // 23.12.2022
   Procedura cancella
   {
      if ($StartingDel__ == ATTUALE())
         {
         // 08.03.2022
          cam_KeyRegMdF = "CerRib"
          if (STR_INDEX_OF(MdF_Utente, 0, cam_KeyRegMdF) > -1)
             {
              cerCancellata = 1
              $no_cancel = 1
             // Ridisegno, escludo i sat
              COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x Elimina CER-Rib da Utente"))
              COMANDO(STRCAT("VAR_SET$ $no_cancel=0"))
             }
          else
             {
              $no_cancel = 1
              DISPLAY2("Utente non abilitato alla cancellazione cerniere manuale. Contattare uff.Tecnico")
              COMANDO(STRCAT("VAR_SET$ $no_cancel=0"))
             }
         }
   }
}

Elemento MdF_CernieraVasRib
{
   Descrizione = "Grafica Cerniera su Anta"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  55
      Y  ""  55
      Z  ""  12

      tipoIncidenza        "X,Y,Z"                                "Z"
      PosizioneCerniera    "Posizione Cerniera"                   ""
      escl_Grafica         "visualizza grafica"                   1
      pos_Y_cerAnta        "pos in y lav su anta"                 5
      id_Cer               "identificativo per CHIAVE_TAB_CAM"    0

      mcr_TipoGestioneCollis     ""  0

      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      CHIAVE_TAB_CAM = NOME(idx_att)
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att)) }

      nome_var_chiave = "CHIAVE_TAB_CAM_CerRib1"
      if (VAR_EXIST(PADRE(idx_att, 2), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 2), nome_var_chiave) }
      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_CerRib", STR(id_Cer))
      if (VAR_EXIST(PADRE(idx_att, 2), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 2), nome_var_chiave) }

      id_Reg = VAR_VAL(PADRE(idx_att, 2), STRCAT("id_Reg_CerRib", STR(id_Cer)))

      idx_CerBas = PADRE(idx_att, 1)
      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_CerBas, 1), STRCAT("Visualizza_CerRib", STR(id_Cer)))
      GOSUB mdf_Visualize

      if (VAR_TYPE(-1, "CAM_Visualize") == 0)
         {
          if (VAR_VAL(-1, "CAM_Visualize") > -1)  { escl_Grafica = 1-$CAM_Visualize }
         }
   }

   Controlli
   {
      CAM_Lav_X = X/2
      CAM_Lav_Y = Y/2
      CAM_Lav_Z = Z
      if (IS_MATCH(PosizioneCerniera, "VA*") )
         { CAM_Lav_Y = pos_Y_cerAnta  }

      idx_MdF = PADRE(idx_att, 2)
      if (ACTION() <= 0)  { EXITSUB() }

      mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_att, 2), STRCAT("img_sat_F1_CerRib", STR(id_Cer)))

      if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("MPF_img_sat_F1_CerRib", STR(id_Cer))) )
         { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), STRCAT("MPF_img_sat_F1_CerRib", STR(id_Cer)))  }

      if (VAR_EXIST(idx_MdF, STRCAT("MPF_img_sat_F1_CerRib", STR(id_Cer))) )
         { mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("MPF_img_sat_F1_CerRib", STR(id_Cer))) }

      // 21.11.2024
      mdf_indexof_sat_change = STR_INDEX_OF(VAR_VAL_STR(idx_att, "mdf_import_EXIST"), 0, mdf_nomeFile_sat)

      mdF_sat_offx = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_F1_offx")
      mdF_sat_offy = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_F1_offy")
      mdF_sat_offz = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_F1_offz")
      mdF_sat_angz = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_F1_angz")

      if (VAR_EXIST(idx_MdF, "MCR_sat_F1_offx") )  { mdF_sat_offx = VAR_VAL(idx_MdF, "MCR_sat_F1_offx") }
      if (VAR_EXIST(idx_MdF, "MCR_sat_F1_offy") )  { mdF_sat_offy = VAR_VAL(idx_MdF, "MCR_sat_F1_offy") }
      if (VAR_EXIST(idx_MdF, "MCR_sat_F1_offz") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MCR_sat_F1_offz") }
      if (VAR_EXIST(idx_MdF, "MCR_sat_F1_angz") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MCR_sat_F1_angz") }

     // 24.11.2021 aperture storiche fuori standard
      mdf_aperSUPINF = 0
      if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "VAPIE*SUP*") )  { mdf_aperSUPINF = 1 }
      if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "VAPIE*INF*") )  { mdf_aperSUPINF = -1 }

      if ( IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "VAPI*")
         & mdf_aperSUPINF != 1
         )
         {
          mdF_sat_offx = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_F1_offx_VAPI")
          mdF_sat_offy = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_F1_offy_VAPI")
          mdF_sat_offz = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_F1_offz_VAPI")
          mdF_sat_angz = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_F1_angz_VAPI")

          if (VAR_EXIST(idx_MdF, "MCR_sat_F1_offx_VAPI") )  { mdF_sat_offx = VAR_VAL(idx_MdF, "MCR_sat_F1_offx_VAPI") }
          if (VAR_EXIST(idx_MdF, "MCR_sat_F1_offy_VAPI") )  { mdF_sat_offy = VAR_VAL(idx_MdF, "MCR_sat_F1_offy_VAPI") }
          if (VAR_EXIST(idx_MdF, "MCR_sat_F1_offz_VAPI") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MCR_sat_F1_offz_VAPI") }
          if (VAR_EXIST(idx_MdF, "MCR_sat_F1_angz_VAPI") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MCR_sat_F1_angz_VAPI") }
         }
      if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "RI*") )
         {
          mdF_sat_offx = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_F1_offx_RI")
          mdF_sat_offy = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_F1_offy_RI")
          mdF_sat_offz = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_F1_offz_RI")
          mdF_sat_angz = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_F1_angz_RI")

          if (VAR_EXIST(idx_MdF, "MCR_sat_F1_offx_RI") )  { mdF_sat_offx = VAR_VAL(idx_MdF, "MCR_sat_F1_offx_RI") }
          if (VAR_EXIST(idx_MdF, "MCR_sat_F1_offy_RI") )  { mdF_sat_offy = VAR_VAL(idx_MdF, "MCR_sat_F1_offy_RI") }
          if (VAR_EXIST(idx_MdF, "MCR_sat_F1_offz_RI") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MCR_sat_F1_offz_RI") }
          if (VAR_EXIST(idx_MdF, "MCR_sat_F1_angz_RI") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MCR_sat_F1_angz_RI") }
         }

     // 29.11.2023
      if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_F1_CerRib", STR(id_Cer))) )
         {
          mdfstr_input = VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_F1_CerRib", STR(id_Cer)))
          GOSUB MdF_EstraiStringhe
          mdF_sat_offx = ATOI(mdf_array_Stringhe[1])
          mdF_sat_offy = ATOI(mdf_array_Stringhe[2])
          mdF_sat_offz = ATOI(mdf_array_Stringhe[3])
          mdF_sat_angz = ATOI(mdf_array_Stringhe[4])

          // Per l' eventuale secondo sat
          if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##5") )
             {
              mdF_sat_offx_2 = ATOI(mdf_array_Stringhe[5])
              mdF_sat_offy_2 = ATOI(mdf_array_Stringhe[6])
              mdF_sat_offz_2 = ATOI(mdf_array_Stringhe[7])
              mdF_sat_angz_2 = ATOI(mdf_array_Stringhe[8])
             }

          // Non dovrebbe servire perchè in genere le RegFacc sono divise tra RI e VA
          //if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "VA*") )
          //   {
          //    if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##5") )
          //       {
          //        mdF_sat_offx = ATOI(mdf_array_Stringhe[5])
          //        mdF_sat_offy = ATOI(mdf_array_Stringhe[6])
          //        mdF_sat_offz = ATOI(mdf_array_Stringhe[7])
          //        mdF_sat_angz = ATOI(mdf_array_Stringhe[8])
          //       }
          //   }
         }

     // 20.09.2024
      ricalc_nome_sat = 0
      if ( UN_PADRE("MECC*UTE*")
         & VAR_EXIST(idx_att, "idx_To_ReAdd")
         & STRLEN(mdf_nomeFile_sat) >= 4
         )
         {
          if (VAR_EXIST(idx_att, "MdF_Apertura_Utente_prec") != 1)
             { MdF_Apertura_Utente_prec = VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura_Utente") }

          if (VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura_Utente_prec") != VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura_Utente"))
             {
              MdF_Apertura_Utente_prec = VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura_Utente")
              mcb_ElementoBdm = VAR_VAL_STR(idx_MdF, "MCR_ElementoBdm_CerRib")
              if (IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura_Utente"), "VAPI*") )
                 {
                  mcb_ElementoBdm = VAR_VAL_STR(idx_MdF, "MCR_ElementoBdm_CerRibVAPI")
                 }
              COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm)
              if (mdf_elementoBdm > 0)
                 {
                  COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[1]), " // MdF_CernieraVasRib UTENTE"))
                  ricalc_nome_sat = 1
                 }
             }
         }

     // 07.05.2024 Ottimizzazioni
      if ( VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") > 0
         | STRLEN(mdf_nomeFile_sat) < 4
         | ricalc_nome_sat > 0
         // 21.11.2024
         | mdf_indexof_sat_change < 0
         )
         { GOSUB mdf_ADD_sat }

      if (VAR_EXIST(idx_att, "px_CerRib_prec") != 1)
         { px_CerRib_prec = VAR_VAL(PADRE(idx_att, 2), "px_CerRib1") }

     // 09.09.2024
      if (STRLEN(mdf_nomeFile_sat) >= 4)
         {
          if (UN_PADRE("MECC*UTE*") )
             {
              if (px_CerRib_prec != VAR_VAL(PADRE(idx_att, 2), "px_CerRib1"))
                 {
                  px_CerRib_prec = VAR_VAL(PADRE(idx_att, 2), "px_CerRib1")
                  // Se padre di 3 basta sulla cerniera e non serve anche sulla Basetta
                  COMANDO2(STRCAT("SHOW Strutture idx add ", STR(PADRE(idx_att, 3)), "  // px_CerRib1 change da idx=", STR(idx_att), " ", NOME(idx_att)))
                 }
             }
         }
   }

   PuntiNotevoli
   {
      idx_att = ATTUALE()
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona Blocco bl
   {
      @escluso = escl_Grafica
      @base_0 = base_0
      @X = CAM_Lav_X
      @Y = CAM_Lav_Y
      @Z = CAM_Lav_Z

      @c_rivestimento = [115, 30, 90]
      @f_rivestimento = STR(100*0.005)
   }
}

Elemento MdF_BasettaVasRib
{
   Descrizione = "Grafica Basetta su Piani"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  10
      Y  ""  40
      Z  ""  65

      tipoIncidenza       "X,Y,Z"                                 "Y"
      PosizioneCerniera   "Posizione Cerniera"                    "SX"
      id_Cer              "identificativo per CHIAVE_TAB_CAM"      0
      escl_Grafica        "visualizza grafica"                     1

      mcr_TipoGestioneCollis     ""  0

      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      CHIAVE_TAB_CAM = NOME(idx_att)
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att)) }

      nome_var_chiave = "CHIAVE_TAB_CAM_CerRib1"
      if (VAR_EXIST(PADRE(idx_att, 2), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 2), nome_var_chiave) }
      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_CerRib", STR(id_Cer))
      if (VAR_EXIST(PADRE(idx_att, 2), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 2), nome_var_chiave) }

      id_Reg = VAR_VAL(PADRE(idx_att, 2), STRCAT("id_Reg_CerRib", STR(id_Cer)))

      azione_locked=1

      idx_CerBas = PADRE(idx_att, 1)
      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_CerBas, 1), STRCAT("Visualizza_CerRib", STR(id_Cer)))
      GOSUB mdf_Visualize

      if (VAR_TYPE(-1, "CAM_Visualize") == 0)
         {
          if (VAR_VAL(-1, "CAM_Visualize") > -1)  { escl_Grafica = 1-$CAM_Visualize }
         }
   }

   Controlli
   {
      idx_MdF = PADRE(idx_att, 2)
      if (ACTION() <= 0)  { EXITSUB() }

      mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_att, 2), STRCAT("img_sat_E2_CerRib", STR(id_Cer)))

      if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("MPF_img_sat_E2_CerRib", STR(id_Cer))) )
         { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), STRCAT("MPF_img_sat_E2_CerRib", STR(id_Cer)))  }

      if (VAR_EXIST(idx_MdF, STRCAT("MPF_img_sat_E2_CerRib", STR(id_Cer))) )
         { mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("MPF_img_sat_E2_CerRib", STR(id_Cer))) }

      // 21.11.2024
      mdf_indexof_sat_change = STR_INDEX_OF(VAR_VAL_STR(idx_att, "mdf_import_EXIST"), 0, mdf_nomeFile_sat)

      mdF_sat_offx = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_E2_offx")
      mdF_sat_offy = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_E2_offy")
      mdF_sat_offz = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_E2_offz")
      mdF_sat_angz = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_E2_angz")

      if (VAR_EXIST(idx_MdF, "MCR_sat_E2_offx") )  { mdF_sat_offx = VAR_VAL(idx_MdF, "MCR_sat_E2_offx") }
      if (VAR_EXIST(idx_MdF, "MCR_sat_E2_offy") )  { mdF_sat_offy = VAR_VAL(idx_MdF, "MCR_sat_E2_offy") }
      if (VAR_EXIST(idx_MdF, "MCR_sat_E2_offz") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MCR_sat_E2_offz") }
      if (VAR_EXIST(idx_MdF, "MCR_sat_E2_angz") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MCR_sat_E2_angz") }

     // 24.11.2021 aperture storiche fuori standard
      mdf_aperSUPINF = 0
      if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "VAPIE*SUP*") )  { mdf_aperSUPINF = 1 }
      if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "VAPIE*INF*") )  { mdf_aperSUPINF = -1 }

      if ( IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "VAPI*")
         & mdf_aperSUPINF != 1
         )
         {
          mdF_sat_offx = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_E2_offx_VAPI")
          mdF_sat_offy = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_E2_offy_VAPI")
          mdF_sat_offz = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_E2_offz_VAPI")
          mdF_sat_angz = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_E2_angz_VAPI")

          if (VAR_EXIST(idx_MdF, "MCR_sat_E2_offx_VAPI") )  { mdF_sat_offx = VAR_VAL(idx_MdF, "MCR_sat_E2_offx_VAPI") }
          if (VAR_EXIST(idx_MdF, "MCR_sat_E2_offy_VAPI") )  { mdF_sat_offy = VAR_VAL(idx_MdF, "MCR_sat_E2_offy_VAPI") }
          if (VAR_EXIST(idx_MdF, "MCR_sat_E2_offz_VAPI") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MCR_sat_E2_offz_VAPI") }
          if (VAR_EXIST(idx_MdF, "MCR_sat_E2_angz_VAPI") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MCR_sat_E2_angz_VAPI") }
         }
      if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "RI*") )
         {
          mdF_sat_offx = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_E2_offx_RI")
          mdF_sat_offy = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_E2_offy_RI")
          mdF_sat_offz = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_E2_offz_RI")
          mdF_sat_angz = VAR_VAL(PADRE(idx_MdF, 1), "MCR_sat_E2_angz_RI")

          if (VAR_EXIST(idx_MdF, "MCR_sat_E2_offx_RI") )  { mdF_sat_offx = VAR_VAL(idx_MdF, "MCR_sat_E2_offx_RI") }
          if (VAR_EXIST(idx_MdF, "MCR_sat_E2_offy_RI") )  { mdF_sat_offy = VAR_VAL(idx_MdF, "MCR_sat_E2_offy_RI") }
          if (VAR_EXIST(idx_MdF, "MCR_sat_E2_offz_RI") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MCR_sat_E2_offz_RI") }
          if (VAR_EXIST(idx_MdF, "MCR_sat_E2_angz_RI") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MCR_sat_E2_angz_RI") }
         }

     // 29.11.2023
      if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_E2_CerRib", STR(id_Cer))) )
         {
          mdfstr_input = VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_E2_CerRib", STR(id_Cer)))
          GOSUB MdF_EstraiStringhe
          mdF_sat_offx = ATOI(mdf_array_Stringhe[1])
          mdF_sat_offy = ATOI(mdf_array_Stringhe[2])
          mdF_sat_offz = ATOI(mdf_array_Stringhe[3])
          mdF_sat_angz = ATOI(mdf_array_Stringhe[4])
          // Non dovrebbe servire perchè in genere le RegFacc sono divise tra RI e VA
          //if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "VA*") )
          //   {
          //    if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##5") )
          //       {
          //        mdF_sat_offx = ATOI(mdf_array_Stringhe[5])
          //        mdF_sat_offy = ATOI(mdf_array_Stringhe[6])
          //        mdF_sat_offz = ATOI(mdf_array_Stringhe[7])
          //        mdF_sat_angz = ATOI(mdf_array_Stringhe[8])
          //       }
          //   }
         }

     // 20.09.2024
      ricalc_nome_sat = 0
      if ( UN_PADRE("MECC*UTE*")
         & VAR_EXIST(idx_att, "idx_To_ReAdd")
         & STRLEN(mdf_nomeFile_sat) >= 4
         )
         {
          ricalc_nome_sat = 1
          DEL_VAR(idx_att, "mdf_import_EXIST")
         }

     // 07.05.2024 Ottimizzazioni
      if ( VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") > 0
         | STRLEN(mdf_nomeFile_sat) < 4
         // 20.09.2024
         | ricalc_nome_sat > 0
         // 21.11.2024
         | mdf_indexof_sat_change < 0
         )
         { GOSUB mdf_ADD_sat }
   }

   PuntiNotevoli
   {
      idx_att = ATTUALE()

      CAM_Lav_X = X/2
      CAM_Lav_Y = Y
      CAM_Lav_Z = Z/2

      if (IS_MATCH(tipoIncidenza, "Z") )
         {
          CAM_Lav_X = X/2
          CAM_Lav_Y = Y/2
          CAM_Lav_Z = Z
         }
     // 11.03.2022
      if (IS_MATCH(tipoIncidenza, "X") )
         {
          CAM_Lav_X = X
          CAM_Lav_Y = Y/2
          CAM_Lav_Z = VAR_VAL(ATTUALE(), "pz_CerFia")
          CAM_Lav_offz = Z-pz_CerFia
         }

      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona Blocco bl
   {
      @escluso = escl_Grafica
      @base_0 = base_0
      @X = CAM_Lav_X
      @Y = CAM_Lav_Y
      @Z = CAM_Lav_Z
      @c_rivestimento = [115, 30, 90]
      @f_rivestimento = STR(100*0.005)
   }
}

Elemento MdF_Pistone_VasRib
{
   Descrizione = "Pistone Vasistas Ribalta per ddp grezzo"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""

   Variabili
   {
      X  "X Pistone"         50
      Y  "Spess. Pistone"    58
      Z  "Alt. Pistone"      53

      PosizionePistone   "Posizione Pistone"                  "SX"
      KeyFamRegFacc      "Famiglia Lavorazione"               ""
      id_Pis             "identificativo per CHIAVE_TAB_CAM"   0
      escl_Grafica       "visualizza grafica"                  1

      X_eleVer        "Largh attacco su fianco"               16
      Y_eleVer        "Altezza attacco su fianco"             32
      Z_eleVer        "Prof.   attacco su fianco"             39

      X_eleFro        "Largh attacco su anta"                 24
      Y_eleFro        "Altezza attacco su anta"               52
      Z_eleFro        "Prof.   attacco su anta"               12

      pos_X_pisAnta   "pos in x lav su anta"                   5
      diff_Y_pisFia   "pos in y lav su fianco"                 0
      pz_PisFia       "posizione in z Fianco punto appl"      38
      Battuta_Z      "Battuta in Z"             0

      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }


   Assegnazioni
   {
      idx_att = ATTUALE()
      idx_MdF = PADRE(idx_att, 1)

      str_var = ""
      if (IS_MATCH(PosizionePistone, "CN*") )  { str_var = "Cn" }
      // Compatibilità 2013 campo Visualizza RegFacc 0 o 1
      if (VAR_EXIST(PADRE(idx_att, 1), STRCAT("Visualizza_PisAnta", str_var, STR(id_Pis))) )
         { escl_Grafica = 1-VAR_VAL(PADRE(idx_att, 1), STRCAT("Visualizza_PisAnta", str_var, STR(id_Pis))) }

      py_PisAnta = VAR_VAL(PADRE(idx_att, 1), STRCAT("py_PisAnta", str_var, STR(id_Pis)))
      yMdF = VAR_VAL(PADRE(idx_att, 2), "Y")

      //if ($MdF_Visualize > -1)    { escl_Grafica = 1-$MdF_Visualize }
      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("Visualizza_PisAnta", str_var, STR(id_Pis)))
      GOSUB mdf_Visualize

      if (STRCMP($MdF_Visualize, "Always") != 0)
         {
          idx_CR = PADRE(idx_att, 1)
          if (VAR_EXIST(PADRE(idx_CR, 2), "MPRV_Vis_Pis") )
             { escl_Grafica = 1-VAR_VAL(PADRE(idx_CR, 2), "MPRV_Vis_Pis") }

          if (VAR_EXIST(PADRE(idx_CR, 1), "MPRV_Vis_Pis") )
             { escl_Grafica = 1-VAR_VAL(PADRE(idx_CR, 1), "MPRV_Vis_Pis") }
         }

      if (VAR_VAL(PADRE(idx_att, 1), STRCAT("X_PisAnta", str_var, STR(id_Pis))) > 0)
         {
          X_eleFro = VAR_VAL(PADRE(idx_att, 1), STRCAT("X_PisAnta", str_var, STR(id_Pis)))
          Y_eleFro = VAR_VAL(PADRE(idx_att, 1), STRCAT("Y_PisAnta", str_var, STR(id_Pis)))
          Z_eleFro = VAR_VAL(PADRE(idx_att, 1), STRCAT("Z_PisAnta", str_var, STR(id_Pis)))
         }
      if (VAR_VAL(PADRE(idx_att, 1), STRCAT("X_PisFia", str_var, STR(id_Pis))) > 0)
         {
          X_eleVer = VAR_VAL(PADRE(idx_att, 1), STRCAT("X_PisFia", str_var, STR(id_Pis)))
          Y_eleVer = VAR_VAL(PADRE(idx_att, 1), STRCAT("Y_PisFia", str_var, STR(id_Pis)))
         }
      if (VAR_VAL(PADRE(idx_att, 1), STRCAT("pz_PisFia", str_var, STR(id_Pis))) > 0)
         { pz_PisFia = VAR_VAL(PADRE(idx_att, 1), STRCAT("pz_PisFia", str_var, STR(id_Pis))) }
     // 29.11.2023 baco per Cn 3,4,5,6. Mi son accorto solo con l' aggiunta sat
      //if (VAR_VAL(PADRE(idx_att, 1), STRCAT("Z_PisFia", STR(id_Pis))) > 0)
      if (VAR_VAL(PADRE(idx_att, 1), STRCAT("Z_PisFia", str_var, STR(id_Pis))) > 0)
         { Z_eleVer = VAR_VAL(PADRE(idx_att, 1), STRCAT("Z_PisFia", str_var, STR(id_Pis))) }

      HIDE = 1
      if (VAR_VAL(PADRE(idx_att, 1), "HIDE") == 3)  { HIDE = 2 }
   }

   Controlli
   {
      if (ACTION() <= 0)  { EXITSUB() }

      if (VAR_VAL(PADRE(idx_att, 1), STRCAT("X_PisAnta", str_var, STR(id_Pis))) > 0)
         {
          X_eleFro = VAR_VAL(PADRE(idx_att, 1), STRCAT("X_PisAnta", str_var, STR(id_Pis)))
          Y_eleFro = VAR_VAL(PADRE(idx_att, 1), STRCAT("Y_PisAnta", str_var, STR(id_Pis)))
          Z_eleFro = VAR_VAL(PADRE(idx_att, 1), STRCAT("Z_PisAnta", str_var, STR(id_Pis)))
         }
      if (VAR_VAL(PADRE(idx_att, 1), STRCAT("X_PisFia", str_var, STR(id_Pis))) > 0)
         {
          X_eleVer = VAR_VAL(PADRE(idx_att, 1), STRCAT("X_PisFia", str_var, STR(id_Pis)))
          Y_eleVer = VAR_VAL(PADRE(idx_att, 1), STRCAT("Y_PisFia", str_var, STR(id_Pis)))
         }
      if (VAR_VAL(PADRE(idx_att, 1), STRCAT("pz_PisFia", str_var, STR(id_Pis))) > 0)
         { pz_PisFia = VAR_VAL(PADRE(idx_att, 1), STRCAT("pz_PisFia", str_var, STR(id_Pis))) }
     // 29.11.2023 baco per Cn 3,4,5,6. Mi son accorto solo con l' aggiunta sat
      if (VAR_VAL(PADRE(idx_att, 1), STRCAT("Z_PisFia", str_var, STR(id_Pis))) > 0)
         { Z_eleVer = VAR_VAL(PADRE(idx_att, 1), STRCAT("Z_PisFia", str_var, STR(id_Pis))) }

      chiave_tabvar_mdf = "PisAnta"
      GOSUB MdF_GEST
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
      vano_0_0 = [0,0,0]
      vano_l_0 = X
      vano_p_0 = Z
   }

   Posiziona MdF_PistoneSuAnta  suanta
   {
      @base_0 = base_0
      @base_0.x = base_0.x + pos_X_pisAnta
      @base_0.y = base_0.y
      //@base_0.z = base_1.z
      @base_0.z = base_1.z - @Z
      @X = X_eleFro
      @Y = Y_eleFro
      @Z = Z_eleFro
      if ( IS_MATCH(PosizionePistone, "DX")
         | IS_MATCH(PosizionePistone, "CNSX")
         )
         { @base_0.x = base_3.x - pos_X_pisAnta }

      @Posizione = PosizionePistone
      @pos_X_pisAnta = pos_X_pisAnta
      @id_Pis = id_Pis
      @py_PisFia = py_PisFia
      @py_PisAnta = py_PisAnta
   }

   Posiziona MdF_PistoneSuFianco  suFia
   {
      @base_0 = base_0
      @base_0.y = base_0.y - diff_Y_pisFia
     // test 25.09.2017
     // 01.08.2022 abilito per gestione sat, altrimenti trova anche fianchi sopra
      // Per ora solo per VA
      // Effettivamente posizionerebbe il Pistone fuori dall' anta verso l' alto
      if (IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Apertura"), "VA*") == 1)
         {
          py_PisAnta_att = VAR_VAL(PADRE(idx_att, 1), STRCAT("py_PisAnta", STR(id_Pis)) )
          // rispetto al test 2017 aggiunto se negativo e in effetti l' avevo aggiunto anche sul Blocco grafico grSF
          if (diff_Y_pisFia < 0)
             {
              @mdfcamPis_diff = 0
              if (ABS(diff_Y_pisFia)+py_PisAnta_att+Y > yMdF)
                 {
                  @mdfcamPis_diff = (ABS(diff_Y_pisFia)+py_PisAnta_att)+Y -yMdF+18.5
                  @base_0.y = base_0.y - diff_Y_pisFia - @mdfcamPis_diff
                 }
             }
         }
      // Non devo passare la Battuta_Z perché se su un fianco ho Battuta_Z=1 e su Tramezzo
      // Battuta_Z=2 è corretto che dall'anta mi devo spostare senza la Battuta ma con il pz
      //@base_0.z = base_1.z - Battuta_Z - pz_PisFia
      @base_0.z = base_1.z - pz_PisFia
      @X = X_eleVer
      @Y = Y_eleVer
      @Z = Z_eleVer
      if ( IS_MATCH(PosizionePistone, "DX")
         | IS_MATCH(PosizionePistone, "CNSX")
         )
         { @base_0.x = base_0.x + X - @X }
      @Posizione = PosizionePistone
      @CAM_DIM_Y_ANTA = VAR_VAL(PADRE(idx_att, 1), "Y")
      @id_Pis = id_Pis
      @py_PisFia = py_PisFia
      @py_PisAnta = py_PisAnta
   }

   Posiziona Blocco grSA
   {
      @escluso = escl_Grafica
      // 10.05.2018
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         // 23.02.2023 per compatibilita. Ho solo il sat Paracolpo, ma non ho ancora i sat Vas/Rib
         & STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "Par") != 0
         )
         { @escluso = 1 }
      @base_0 = base_0
      @base_0.x = base_0.x + pos_X_pisAnta - @X/2
      @base_0.y = base_0.y - @Y/2
      @base_0.z = base_1.z - @Z
      @X = X_eleFro
      @Y = Y_eleFro
      @Z = Z_eleFro
      if ( IS_MATCH(PosizionePistone, "DX")
         | IS_MATCH(PosizionePistone, "CNSX")
         )
         { @base_0.x = base_3.x - pos_X_pisAnta - @X/2 }

      if (py_PisAnta < @Y/2)       { @base_0.y = base_0.y }
      if (py_PisAnta+@Y/2 > yMdF)  { @base_0.y = base_0.y - @Y }

      @c_rivestimento = [128,128,128]
      @f_rivestimento = STR(100*0.005)
   }

   Posiziona Blocco grSF
   {
      @escluso = escl_Grafica
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         // 23.02.2023 per compatibilita. Ho solo il sat Paracolpo, ma non ho ancora i sat Vas/Rib
         & STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "Par") != 0
         )
         { @escluso = 1 }
      @base_0 = base_0
      @X = X_eleVer
      @Y = Y_eleVer
      @Z = Z_eleVer
      @base_0.x = base_0.x
      @base_0.y = base_0.y - diff_Y_pisFia - @Y/2
      @base_0.z = base_1.z - @Z
      if (ABS(pz_PisFia) > ABS(@Z))  { @base_0.z = base_1.z - pz_PisFia - @Z/2 }
      if ( IS_MATCH(PosizionePistone, "DX")
         | IS_MATCH(PosizionePistone, "CNSX")
         )
         { @base_0.x = base_3.x - @X }

      if (py_PisAnta < @Y/2)       { @base_0.y = base_0.y - diff_Y_pisFia }
      if (py_PisAnta+@Y/2 > yMdF)  { @base_0.y = base_0.y - diff_Y_pisFia - @Y }

      py_PisAnta_att = VAR_VAL(PADRE(idx_att, 1), STRCAT("py_PisAnta", STR(id_Pis)) )
      mdfPis_diff = 0
      if ( ABS(diff_Y_pisFia)+py_PisAnta_att+Y > yMdF
        // 18.10.2017
         & diff_Y_pisFia < 0
         )
         {
          mdfPis_diff = (ABS(diff_Y_pisFia)+py_PisAnta_att)+Y -yMdF + 18.5
          @base_0.y = base_0.y - diff_Y_pisFia - mdfPis_diff
         }

      @c_rivestimento = [128,128,128]
      @f_rivestimento = STR(100*0.005)
   }
}

Elemento MdF_PistoneSuAnta
{
   Descrizione = "Grafica pistone su Anta"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  55
      Y  ""  55
      Z  ""  12

      tipoIncidenza        "X,Y,Z"                                "Z"
      Posizione            "Posizione Lavorazione"                "SX"
      id_Pis               "identificativo per CHIAVE_TAB_CAM"     0
      escl_Grafica         "visualizza grafica"                    1
      pos_X_cerAnta        "pos in x lav su anta"                  5

      mdf_nomeFile_sat     "nome file sat da graficare"             ""
      mdf_path_file_sat    "path file sat da graficare"             ""

      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      CHIAVE_TAB_CAM = NOME(idx_att)
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 3), "KeyFamRegFacc_PisAnta")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att)) }

      nome_var_chiave = "CHIAVE_TAB_CAM_PisAnta1"
      if (VAR_EXIST(PADRE(idx_att, 2), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 2), nome_var_chiave) }

      str_var = ""
      if (IS_MATCH(Posizione, "CN*") )  { str_var = "Cn" }
      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_PisAnta", str_var, STR(id_Pis))
      if (VAR_EXIST(PADRE(idx_att, 2), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 2), nome_var_chiave) }

      //id_Reg = VAR_VAL(PADRE(idx_att, 2), STRCAT("id_Reg_PisAnta", STR(id_Pis)))
      id_Reg = VAR_VAL(PADRE(idx_att, 2), STRCAT("id_Reg_PisAnta", str_var, STR(id_Pis)))

      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_att, 2), "Visualizza_PisAnta1")
      GOSUB mdf_Visualize
      if (VAR_TYPE(-1, "CAM_Visualize") == 0)
         {
          if (VAR_VAL(-1, "CAM_Visualize") > -1)  { escl_Grafica = 1-$CAM_Visualize }
         }
   }

   Controlli
   {
      idx_MdF = PADRE(idx_att, 2)
      yMdF = VAR_VAL(idx_MdF, "Y")
      basy_MdF = VAR_VAL(idx_MdF, "base_0.y")

      if (ACTION() <= 0)  { EXITSUB() }

      mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("img_sat_F1_PisAnta", STR(id_Pis)))

      if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("MPA_img_sat_F1_PisAnta", STR(id_Pis))) )
         { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), STRCAT("MPA_img_sat_F1_PisAnta", STR(id_Pis))) }

      if (VAR_EXIST(idx_MdF, STRCAT("MPA_img_sat_F1_PisAnta", STR(id_Pis))) )
         { mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("MPA_img_sat_F1_PisAnta", STR(id_Pis))) }

     // 10.05.2018
      // Se per caso c'è una sola regola RegFacc ma escono 2 Pistoni/braccetti
      if (IS_MATCH(Posizione, "DX")  &  id_Pis == 1)
         {
          if (VAR_EXIST(PADRE(idx_MdF, 1), "MPA_img_sat_F1_PisAnta2") )
             { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MPA_img_sat_F1_PisAnta2") }

          if (VAR_EXIST(idx_MdF, STRCAT("MPA_img_sat_F1_PisAnta2")) )
             { mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, "MPA_img_sat_F1_PisAnta2") }
         }

     // 24.04.2024 Ce000166
      if (IS_MATCH(Posizione, "CNSX")  &  id_Pis == 3)
         {
          if (VAR_EXIST(PADRE(idx_MdF, 1), "MPA_img_sat_F1_PisAnta2") )
             { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MPA_img_sat_F1_PisAnta2") }

          if (VAR_EXIST(idx_MdF, STRCAT("MPA_img_sat_F1_PisAnta2")) )
             { mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, "MPA_img_sat_F1_PisAnta2") }
         }
      if (IS_MATCH(Posizione, "CNDX")  &  id_Pis == 4)
         {
          if (VAR_EXIST(PADRE(idx_MdF, 1), "MPA_img_sat_F1_PisAnta1") )
             { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MPA_img_sat_F1_PisAnta1") }

          if (VAR_EXIST(idx_MdF, STRCAT("MPA_img_sat_F1_PisAnta1")) )
             { mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, "MPA_img_sat_F1_PisAnta1") }
         }

      mdF_sat_offx = VAR_VAL(PADRE(idx_MdF, 1), "MPA_sat_F1_offx")
      mdF_sat_offy = VAR_VAL(PADRE(idx_MdF, 1), "MPA_sat_F1_offy")
      mdF_sat_offz = VAR_VAL(PADRE(idx_MdF, 1), "MPA_sat_F1_offz")
      mdF_sat_angz = VAR_VAL(PADRE(idx_MdF, 1), "MPA_sat_F1_angz")

      if (VAR_EXIST(idx_MdF, "MPA_sat_F1_offx") )  { mdF_sat_offx = VAR_VAL(idx_MdF, "MPA_sat_F1_offx") }
      if (VAR_EXIST(idx_MdF, "MPA_sat_F1_offy") )  { mdF_sat_offy = VAR_VAL(idx_MdF, "MPA_sat_F1_offy") }
      if (VAR_EXIST(idx_MdF, "MPA_sat_F1_offz") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MPA_sat_F1_offz") }
      if (VAR_EXIST(idx_MdF, "MPA_sat_F1_angz") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MPA_sat_F1_angz") }

     // 30.11.2023
      str_var = ""
      if (IS_MATCH(Posizione, "CN*") )  { str_var = "Cn" }
      if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_F1_PisAnta", str_var, STR(id_Pis))) )
         {
          mdfstr_input = VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_F1_PisAnta", str_var, STR(id_Pis)))
          GOSUB MdF_EstraiStringhe
          mdF_sat_offx = ATOI(mdf_array_Stringhe[1])
          mdF_sat_offy = ATOI(mdf_array_Stringhe[2])
          mdF_sat_offz = ATOI(mdf_array_Stringhe[3])
          mdF_sat_angz = ATOI(mdf_array_Stringhe[4])

          if (VAR_EXIST(idx_MdF, STRCAT("img_sat_F1_PisAnta", str_var, STR(id_Pis))) )
             { mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("img_sat_F1_PisAnta", str_var, STR(id_Pis))) }

          if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##5") )
             {
              mdF_sat_offx_2 = ATOI(mdf_array_Stringhe[5])
              mdF_sat_offy_2 = ATOI(mdf_array_Stringhe[6])
              mdF_sat_offz_2 = ATOI(mdf_array_Stringhe[7])
              mdF_sat_angz_2 = ATOI(mdf_array_Stringhe[8])
              //mdf_nomeFile_sat_2 = STRCAT(mdf_nomeFile_sat, "_2")
             }
          if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##9") )
             {
              mdF_sat_offx_3 = ATOI(mdf_array_Stringhe[9])
              mdF_sat_offy_3 = ATOI(mdf_array_Stringhe[10])
              mdF_sat_offz_3 = ATOI(mdf_array_Stringhe[11])
              mdF_sat_angz_3 = ATOI(mdf_array_Stringhe[12])
             }
         }
      else
         {
         // 18.01.2024
          if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##5") )
             { DEL_VAR(idx_att, "mdF_sat_off*_*") }
         }

     // 07.05.2024 Ottimizzazioni
      if ( VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") > 0
         | STRLEN(mdf_nomeFile_sat) < 4
         )
         { GOSUB mdf_ADD_sat }
   }

   PuntiNotevoli
   {
      CAM_Lav_X = X/2
      CAM_Lav_Y = Y/2
      CAM_Lav_Z = Z

      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona Blocco bl
   {
      @escluso = escl_Grafica
      @base_0 = base_0
      @X = CAM_Lav_X
      @Y = CAM_Lav_Y
      @Z = CAM_Lav_Z

      @c_rivestimento = [255,255,120]
      @f_rivestimento = STR(100*0.005)
   }
}

Elemento MdF_PistoneSuFianco
{
   Descrizione = "Grafica Pistone su Fianchi"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  10
      Y  ""  40
      Z  ""  65

      tipoIncidenza       "X,Y,Z"                                "X"
      Posizione           "Posizione Lavorazione"                "SX"
      id_Pis              "identificativo per CHIAVE_TAB_CAM"     0
      escl_Grafica        "visualizza grafica"                    1

      mdf_nomeFile_sat     "nome file sat da graficare"             ""
      mdf_path_file_sat    "path file sat da graficare"             ""

      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      CHIAVE_TAB_CAM = NOME(idx_att)
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 3), "KeyFamRegFacc_PisFia")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att)) }

      nome_var_chiave = "CHIAVE_TAB_CAM_PisFia1"
      if (VAR_EXIST(PADRE(idx_att, 2), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 2), nome_var_chiave) }

      str_var = ""
      if (IS_MATCH(Posizione, "CN*") )  { str_var = "Cn" }
      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_PisFia", str_var, STR(id_Pis))
      if (VAR_EXIST(PADRE(idx_att, 2), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 2), nome_var_chiave) }

      //id_Reg = VAR_VAL(PADRE(idx_att, 2), STRCAT("id_Reg_PisFia", STR(id_Pis)))
      id_Reg = VAR_VAL(PADRE(idx_att, 2), STRCAT("id_Reg_PisFia", str_var, STR(id_Pis)))

      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_att, 2), "Visualizza_PisFia1")
      GOSUB mdf_Visualize
      if (VAR_TYPE(-1, "CAM_Visualize") == 0)
         {
          if (VAR_VAL(-1, "CAM_Visualize") > -1)  { escl_Grafica = 1-$CAM_Visualize }
         }
   }

   Controlli
   {
      idx_MdF = PADRE(idx_att, 2)
      if (ACTION() <= 0)  { EXITSUB() }

      mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_att, 2), STRCAT("img_sat_E2_PisFia", STR(id_Pis)))

      if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("MPF_img_sat_E2_PisFia", STR(id_Pis))) )
         { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), STRCAT("MPF_img_sat_E2_PisFia", STR(id_Pis)))  }

     // 17.01.2018
      if (IS_MATCH(Posizione, "CN*") )
         {
          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("MPF_img_sat_E2_PisFiaCn", STR(id_Pis))) )
             { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), STRCAT("MPF_img_sat_E2_PisFiaCn", STR(id_Pis)))  }
         }

      if (VAR_EXIST(idx_MdF, STRCAT("MPF_img_sat_E2_PisFia", STR(id_Pis))) )
         { mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("MPF_img_sat_E2_PisFia", STR(id_Pis))) }

     // 10.05.2018
      // Se per caso c'è una sola regola RegFacc ma escono 2 Pistoni/braccetti
      if (IS_MATCH(Posizione, "DX")  &  id_Pis == 1)
         {
          if (VAR_EXIST(PADRE(idx_MdF, 1), "MPF_img_sat_E2_PisFia2") )
             { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MPF_img_sat_E2_PisFia2") }

          if (VAR_EXIST(idx_MdF, STRCAT("MPF_img_sat_E2_PisFia2")) )
             { mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, "MPF_img_sat_E2_PisFia2") }
         }

     // 24.04.2024 Ce000166
      if (IS_MATCH(Posizione, "CNSX")  &  id_Pis == 3)
         {
          if (VAR_EXIST(PADRE(idx_MdF, 1), "MPF_img_sat_E2_PisFia2") )
             { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MPF_img_sat_E2_PisFia2") }

          if (VAR_EXIST(idx_MdF, STRCAT("MPF_img_sat_E2_PisFia2")) )
             { mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, "MPF_img_sat_E2_PisFia2") }
         }
      if (IS_MATCH(Posizione, "CNDX")  &  id_Pis == 4)
         {
          if (VAR_EXIST(PADRE(idx_MdF, 1), "MPF_img_sat_E2_PisFia1") )
             { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MPF_img_sat_E2_PisFia1") }

          if (VAR_EXIST(idx_MdF, STRCAT("MPF_img_sat_E2_PisFia1")) )
             { mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, "MPF_img_sat_E2_PisFia1") }
         }

      mdF_sat_offx = VAR_VAL(PADRE(idx_MdF, 1), "MPF_sat_E2_offx")
      mdF_sat_offy = VAR_VAL(PADRE(idx_MdF, 1), "MPF_sat_E2_offy")
      mdF_sat_offz = VAR_VAL(PADRE(idx_MdF, 1), "MPF_sat_E2_offz")
      mdF_sat_angz = VAR_VAL(PADRE(idx_MdF, 1), "MPF_sat_E2_angz")

      if (VAR_EXIST(idx_MdF, "MPF_sat_E2_offx") )  { mdF_sat_offx = VAR_VAL(idx_MdF, "MPF_sat_E2_offx") }
      if (VAR_EXIST(idx_MdF, "MPF_sat_E2_offy") )  { mdF_sat_offy = VAR_VAL(idx_MdF, "MPF_sat_E2_offy") }
      if (VAR_EXIST(idx_MdF, "MPF_sat_E2_offz") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MPF_sat_E2_offz") }
      if (VAR_EXIST(idx_MdF, "MPF_sat_E2_angz") )  { mdF_sat_offz = VAR_VAL(idx_MdF, "MPF_sat_E2_angz") }

     // 30.11.2023
      str_var = ""
      if (IS_MATCH(Posizione, "CN*") )  { str_var = "Cn" }
      if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_E2_PisFia", str_var, STR(id_Pis))) )
         {
          mdfstr_input = VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_E2_PisFia", str_var, STR(id_Pis)))
          GOSUB MdF_EstraiStringhe
          mdF_sat_offx = ATOI(mdf_array_Stringhe[1])
          mdF_sat_offy = ATOI(mdf_array_Stringhe[2])
          mdF_sat_offz = ATOI(mdf_array_Stringhe[3])
          mdF_sat_angz = ATOI(mdf_array_Stringhe[4])

          if (VAR_EXIST(idx_MdF, STRCAT("img_sat_E2_PisFia", str_var, STR(id_Pis))) )
             { mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("img_sat_E2_PisFia", str_var, STR(id_Pis))) }

          if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##5") )
             {
              mdF_sat_offx_2 = ATOI(mdf_array_Stringhe[5])
              mdF_sat_offy_2 = ATOI(mdf_array_Stringhe[6])
              mdF_sat_offz_2 = ATOI(mdf_array_Stringhe[7])
              mdF_sat_angz_2 = ATOI(mdf_array_Stringhe[8])
             }
          if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##9") )
             {
              mdF_sat_offx_3 = ATOI(mdf_array_Stringhe[9])
              mdF_sat_offy_3 = ATOI(mdf_array_Stringhe[10])
              mdF_sat_offz_3 = ATOI(mdf_array_Stringhe[11])
              mdF_sat_angz_3 = ATOI(mdf_array_Stringhe[12])
             }
         }
      else
         {
         // 18.01.2024
          if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##5") )
             { DEL_VAR(idx_att, "mdF_sat_off*_*") }
         }

     // 07.05.2024 Ottimizzazioni
     // 18.06.2024 A2024OCL062601 L' Anta si grafica prima del resto dei pensili quindi inizialmente i Pis Cn non trovano il fianco corretto
      mdf_ctrl_sat = 0
      if ( VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") > 0
         | STRLEN(mdf_nomeFile_sat) < 4
         )
         { mdf_ctrl_sat = 1 }

      if (IS_MATCH(Posizione, "*CN*") )
         {
          if ( VAR_VAL(idx_att, "idx_To_ReAdd") == VAR_VAL(PADRE(idx_MdF, 1), "exitBattuta_SX")
             | VAR_VAL(idx_att, "idx_To_ReAdd") == VAR_VAL(PADRE(idx_MdF, 1), "exitBattuta_DX")
             )
             {
              mdf_ctrl_sat = 2
              // Prima elimino i sat dal Fianco sbagliato
              if (IS_IDX(VAR_VAL(idx_att, "idx_To_ReAdd")) )
                 {
                  mcb_ElementoBdm = VAR_VAL_STR(idx_MdF, "MPF_ElementoBdm_PisFia")
                  COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, STRCAT(mcb_ElementoBdm, "*"))
                  mEi = 1
                  while(mEi <= mdf_elementoBdm)
                     {
                      if (VAR_VAL(mdf_elementoBdm[mEi], "idx_Pis") == idx_att)
                         {
                          COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[mEi]), " // MPF_ElementoBdm_PisFia"))
                         }
                      mEi = mEi+1
                     }
                 }
             }
         }

      if (mdf_ctrl_sat > 0)  { GOSUB mdf_ADD_sat }
   }

   PuntiNotevoli
   {
     // Sulle Assegnazioni potrebbe essere troppo tardi
      CAM_Lav_X = X
      CAM_Lav_Y = Y/2
      CAM_Lav_Z = Z/2
      idx_MdF = PADRE(idx_att, 2)
     // 07.08.2018
      if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "RI") == 1)
         {
          if (py_PisFia+Y > VAR_VAL(idx_MdF, "Y") )
             {
              yMdF = VAR_VAL(idx_MdF, "Y")
              if (py_PisFia > yMdF/2)
                 { CAM_Lav_Y = yMdF-py_PisFia-18 }
             }
         }

     // test 25.09.2017
     // 01.08.2022 abilito per gestione sat idx_To_ReAdd, altrimenti trova anche fianchi sopra
     // 25.05.2023 St Se ho un if su py RegFacc e il valore pyFianco cambia in caricamento ordine ma ho impostato mdfcamPis_diff allora anche
      // se mdfcamPis_diff torna 0, CAM_Lav_offy rimaneva
      if ( VAR_EXIST(idx_att, "mdfcamPis_diff")
         & VAR_VAL(idx_att, "mdfcamPis_diff") == 0
         )
         {
          DEL_VAR(idx_att, "CAM_Lav_offy")
         }
      if (VAR_VAL(idx_att, "mdfcamPis_diff") > 0)
         {
      //    CAM_Lav_Y = Y
          CAM_Lav_offy = VAR_VAL(idx_att, "mdfcamPis_diff")
         }

      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

//DEBUG   Posiziona Blocco Debug
//DEBUG   {
//DEBUG      @base_0 = base_0
//DEBUG      @X = X
//DEBUG      @Y = Y
//DEBUG      @Z = Z
//DEBUG      @c_rivestimento = [255, 0, 0]
//DEBUG      @f_rivestimento = "1"
//DEBUG   }

   Posiziona Blocco bl
   {
      @escluso = escl_Grafica
      @base_0 = base_0
      @X = CAM_Lav_X
      @Y = CAM_Lav_Y
      @Z = CAM_Lav_Z
      @c_rivestimento = [255,255,120]
      @f_rivestimento = STR(100*0.005)
   }

  // 18.06.2024 A2024OCL062601 L' Anta si grafica prima del resto dei pensili quindi inizialmente i Pis Cn non trovano il fianco corretto se non rientra in mdf_ADD_sat
  // In realta non serve perchè il problema era far rientrare in mdf_ADD_sat MdF_PistoneSuFianco
   //Procedura MdF_Ctrl_idx_To_ReAdd
   //{
   //   if (IS_MATCH(Posizione, "*CN*") )
   //      {
   //       if ( VAR_VAL(idx_att, "idx_To_ReAdd") == VAR_VAL(PADRE(idx_MdF, 1), "exitBattuta_SX")
   //          | VAR_VAL(idx_att, "idx_To_ReAdd") == VAR_VAL(PADRE(idx_MdF, 1), "exitBattuta_DX")
   //          )
   //          {
   //           COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x mdf_crtl_idxFiaToReadd idx_MdFPdr=", STR(PADRE(idx_MdF, 1))))
   //          }
   //      }
   //}

  // 23.04.2018
   Procedura cancella
   {
     // 08.02.2022 M80756
      //COMPONENTI2("mdf_search_sat", PADRE(idx_att, -1), "MdF_Sat*PisFia")
      // Alb 29.11.2024
      // ho sostituito NEAR_GLOBALE con WITH_VAR per evitare che in alcuni casi non venivano trovati tutti i sat
      // Nelle pieghevoli e' l' anta sotto a comandare e potrebbe non trovare i sat che si trovano piu in alto
      // Va bene perche in cancella poi viene appunto cancellato e non c'è rischio di array grandi
      WITH_VAR("mdf_search_sat", "idx_Pistone", 0, 1, STR(idx_att))
      mis = 1
      while (mis <= mdf_search_sat)
         {
          // 05.04.2024 Se cancello il padre non serve. Però non è così scontato che il sat PisFia sia nel Fianco dello stesso padre
          // infatti avevo cambiato il COMPONENTI2 con NEAR_GLOBALE apposta
          mdf_deleting_Padre = 0
          //if ($StartingDel__ == PADRE(ATTUALE(), -1))
          if (PADRE(mdf_search_sat[mis], -1) == $StartingDel__)
             { mdf_deleting_Padre = 1 }

          if (mdf_deleting_Padre == 0)
             {
              // Lascio COMANDO dato che fin' ora e' sempre stato COMANDO, eventualmente controllare MdF_Load_COMANDO2 di padre di 3
              COMANDO(STRCAT("CANCELLA ", STR(mdf_search_sat[mis]), " // da MdF_PistoneSuFianco ", STR(idx_att), " di=", STR(PADRE(idx_att, 3))))
             }
          mis = mis+1
         }
   }
}

Elemento MdF_ContParacolpi
{
   Descrizione = "Contenitore grafica Paracolpi"
   Code        = GRANT
   Gruppo      = "TMP"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   Alias         MdF_CAM;MdF_Par

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22
      HIDE  ""  1

      MdF_Apertura      "Apertura"        ""

      px_Par1           "Quota X paracolpo 1"                  0
      px_Par2           "Quota X paracolpo 2"                  0
      px_Par3           "Quota X paracolpo 3"                  0
      px_Par4           "Quota X paracolpo 4"                  0
      px_Par5           "Quota X paracolpo 4"                  -1
      px_Par6           "Quota X paracolpo 4"                  -1
      px_Par7           "Quota X paracolpo 4"                  -1
      px_Par8           "Quota X paracolpo 4"                  -1
      py_Par1           "Quota Y paracolpo 1"                  0
      py_Par2           "Quota Y paracolpo 2"                  0
      py_Par3           "Quota Y paracolpo 3"                  0
      py_Par4           "Quota Y paracolpo 4"                  0
      py_Par5           "Quota Y paracolpo 5"                  -1
      py_Par6           "Quota Y paracolpo 6"                  -1
      py_Par7           "Quota Y paracolpo 7"                  -1
      py_Par8           "Quota Y paracolpo 8"                  -1

      KeyFamRegFacc     "tipo posizionamento cerniere"        ""

      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      GOSUB MdF_SetStato_NoGEST
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          MdF_comandoOnAUTO = 1
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Attrezza
   {
      base_0 = @base_0
      base_0.z = @base_0.z
      X = @X
      Y = @Y
      Z = @Z
   }

   Controlli
   {
      idx_att = ATTUALE()
      idx_CamMdF = PADRE(idx_att, 1)
      nome_CamMdF = NOME(idx_CamMdF)
      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")
      Z = VAR_VAL(idx_CamMdF, "Z")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      GOSUB MdF_Ctrl_Dim

     // 12.07.2024 A072599 PensAngL Dipende da MdF_Load_COMANDO2 = 0 che dovrebbe invece essere sempre a 1 ma per problemi di flussoBdm viene messo a 0
      COMPONENTI3("mdf_gia_inserito", idx_CamMdF, NOME(idx_att))
      if (mdf_gia_inserito > 1)
         {
          // 07.08.2024
          mdf_ins_utente = 0
          mdf_altro_padre = 0
          iu=1
          while (iu <= mdf_gia_inserito)
             {
              if (IS_MATCH(NOME(PADRE(mdf_gia_inserito[iu], 1)), "MECCANISM*_UTENTE*") )
                 { mdf_ins_utente = mdf_ins_utente+1 }
              else
                 {
                 // 08.10.2024 Versione 11.325
                  if (PADRE(mdf_gia_inserito[iu], 1) != PADRE(idx_att, 1) )
                     { mdf_altro_padre = mdf_altro_padre+1 }
                 }
              iu = iu+1
             }
          if (mdf_gia_inserito-mdf_ins_utente-mdf_altro_padre > 1)
             {
              if (VAR_VAL(idx_att, "mdf_rel_ADD_bas0y_Error") == 2 & VAR_VAL(idx_att, "mdf_rel_ADD_bas0y_LoadARF_Error") == 1)
                 { escluso = 1 }
              else
                 { COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // MdF_ContParacolpi mdf_gia_inserito")) }
              EXITSUB()
             }
         }

     // 29.09.2017
      MdfSys_SbordoYSup = VAR_VAL(idx_CamMdF, "MdfSys_SbordoYSup")
      MdfSys_SbordoYInf = VAR_VAL(idx_CamMdF, "MdfSys_SbordoYInf")
     // 24.04.2025
      MdfSys_SbordoYSup_DaCop = VAR_VAL(idx_CamMdF, "MdfSys_SbordoYSup_DaCop")
      MdfSys_SbordoYInf_DaFon = VAR_VAL(idx_CamMdF, "MdfSys_SbordoYInf_DaFon")

     // 09.04.2020 AVG783007 Problema Battuta_X_Sx per MdF_Apertura DX
      if (STRLEN(MdF_Apertura) == 0)  { MdF_Apertura = VAR_VAL_STR(idx_CamMdF, "MdF_Apertura") }
     // 27.09.2018
      GOSUB MdF_Battuta_X_byFather

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
     // 17.05.2024 Ottimizzazioni
      GOSUB MdF_Ctrl_var_cam_Init
      GOSUB MdF_ctrl_Change_Var_CAM
      if (mdf_ctrl_Change_Var_CAM > 0)
         {
          GOSUB MdF_VariabiliDaTipoPadri
          CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "keyGenericaMdF"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "Par"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "ParMdF"
          GOSUB MdF_Variabili
         }

      GOSUB Reg_pos_Paracolpi
      GOSUB Reg_Paracolpi_att

      if (px_Par1 == 0  &  py_Par1 == 0)
         {
          if (STRLEN(KeyFamRegFacc) > 0)
             {
              if ( px_Par2 == 0  &  py_Par2 == 0
                 & px_Par3 == 0  &  py_Par3 == 0
                 & px_Par4 == 0  &  py_Par4 == 0
                 )
                 {
                  COMANDO(STRCAT("LOGMSG Aggiunto un ", NOME(idx_att), " con KeyFamRegFacc=", KeyFamRegFacc, " ma non ci sono regole in RegFacc ",
                          "Controlla se serve la Regola KeyFamRegFacc.txt: ", VAR_VAL_STR(PADRE(idx_att, 1), "CHIAVE_TAB_REG"), "_Par=", KeyFamRegFacc)
                         )
                 }
             }
         }

      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_ADD_when"), "first_OnMacroMdF") )
         { MdF_ADD_when = "RE_Control" }

      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)
         {
          MdF_ADD_when = "RE_Control"
          mdf_ricalc_Post_READD = 0
         }

      GOSUB MdF_Par_Collision
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_Paracolpo  par1
   {
      @escluso = 1
      if (py_Par1 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_Par1") > 0)  { @X = X_Par1 }
      if (VAR_VAL(idx_att, "Y_Par1") > 0)  { @Y = Y_Par1 }
      if (VAR_VAL(idx_att, "Z_Par1") > 0)  { @Z = Z_Par1 }

      @base_0 = base_0
     // 05.06.2023
      @base_0.x = base_0.x + px_Par1 + VAR_VAL(idx_att, "MdfSys_CollisionX1")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX1")
      @base_0.y = base_0.y + py_Par1 + VAR_VAL(idx_att, "MdfSys_CollisionY1")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY1")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @id_Par = 1

     // 05.06.2023
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi1") )  { @escluso=1 }
   }

   Posiziona MdF_Paracolpo  par2
   {
      @escluso = 1
      if (py_Par2 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_Par2") > 0)  { @X = X_Par2 }
      if (VAR_VAL(idx_att, "Y_Par2") > 0)  { @Y = Y_Par2 }
      if (VAR_VAL(idx_att, "Z_Par2") > 0)  { @Z = Z_Par2 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_Par2 + VAR_VAL(idx_att, "MdfSys_CollisionX2")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX2")
      @base_0.y = base_0.y + py_Par2 + VAR_VAL(idx_att, "MdfSys_CollisionY2")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY2")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @id_Par = 2
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi2") )  { @escluso=1 }
   }

   Posiziona MdF_Paracolpo  par3
   {
      @escluso = 1
      if (py_Par3 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_Par3") > 0)  { @X = X_Par3 }
      if (VAR_VAL(idx_att, "Y_Par3") > 0)  { @Y = Y_Par3 }
      if (VAR_VAL(idx_att, "Z_Par3") > 0)  { @Z = Z_Par3 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_Par3 + VAR_VAL(idx_att, "MdfSys_CollisionX3")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX3")
      @base_0.y = base_0.y + py_Par3 + VAR_VAL(idx_att, "MdfSys_CollisionY3")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY3")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Par = 3
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi3") )  { @escluso=1 }
   }

   Posiziona MdF_Paracolpo  par4
   {
      @escluso = 1
      if (py_Par4 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_Par4") > 0)  { @X = X_Par4 }
      if (VAR_VAL(idx_att, "Y_Par4") > 0)  { @Y = Y_Par4 }
      if (VAR_VAL(idx_att, "Z_Par4") > 0)  { @Z = Z_Par4 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_Par4 + VAR_VAL(idx_att, "MdfSys_CollisionX4")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX4")
      @base_0.y = base_0.y + py_Par4 + VAR_VAL(idx_att, "MdfSys_CollisionY4")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY4")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Par = 4
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi4") )  { @escluso=1 }
   }
  //  06.05.2019
   Posiziona MdF_Paracolpo  par5
   {
      @escluso = 1
      if (py_Par5 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_Par5") > 0)  { @X = X_Par5 }
      if (VAR_VAL(idx_att, "Y_Par5") > 0)  { @Y = Y_Par5 }
      if (VAR_VAL(idx_att, "Z_Par5") > 0)  { @Z = Z_Par5 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_Par5 + VAR_VAL(idx_att, "MdfSys_CollisionX5")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX5")
      @base_0.y = base_0.y + py_Par5 + VAR_VAL(idx_att, "MdfSys_CollisionY5")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY5")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Par = 5
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi5") )  { @escluso=1 }
   }

   Posiziona MdF_Paracolpo  par6
   {
      @escluso = 1
      if (py_Par6 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_Par6") > 0)  { @X = X_Par6 }
      if (VAR_VAL(idx_att, "Y_Par6") > 0)  { @Y = Y_Par6 }
      if (VAR_VAL(idx_att, "Z_Par6") > 0)  { @Z = Z_Par6 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_Par6 + VAR_VAL(idx_att, "MdfSys_CollisionX6")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX6")
      @base_0.y = base_0.y + py_Par6 + VAR_VAL(idx_att, "MdfSys_CollisionY6")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY6")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Par = 6
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi6") )  { @escluso=1 }
   }

   Posiziona MdF_Paracolpo  par7
   {
      @escluso = 1
      if (py_Par7 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_Par7") > 0)  { @X = X_Par7 }
      if (VAR_VAL(idx_att, "Y_Par7") > 0)  { @Y = Y_Par7 }
      if (VAR_VAL(idx_att, "Z_Par7") > 0)  { @Z = Z_Par7 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_Par7 + VAR_VAL(idx_att, "MdfSys_CollisionX7")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX7")
      @base_0.y = base_0.y + py_Par7 + VAR_VAL(idx_att, "MdfSys_CollisionY7")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY7")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Par = 7
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi7") )  { @escluso=1 }
   }

   Posiziona MdF_Paracolpo  par8
   {
      @escluso = 1
      if (py_Par8 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_Par8") > 0)  { @X = X_Par8 }
      if (VAR_VAL(idx_att, "Y_Par8") > 0)  { @Y = Y_Par8 }
      if (VAR_VAL(idx_att, "Z_Par8") > 0)  { @Z = Z_Par8 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_Par8 + VAR_VAL(idx_att, "MdfSys_CollisionX8")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX8")
      @base_0.y = base_0.y + py_Par8 + VAR_VAL(idx_att, "MdfSys_CollisionY8")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY8")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Par = 8
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi8") )  { @escluso=1 }
   }

   Procedura MdF_noAUTO
   {
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          MdF_comandoOnAUTO = 2
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Procedura MdF_Ctrl_Post_RELATIVE_ADD
   {
      GOSUB MdF_Ctrl_Post_RELATIVE_ADD
   }

   Procedura MdF_Ctrl_ADD_TooEarly
   {
      GOSUB MdF_Ctrl_ADD_TooEarly
   }

   Procedura MdF_Ctrl_Cambiamenti
   {
      if (IS_IDX(idx_att) != 1)            { EXITSUB() }
      if (IS_IDX(PADRE(idx_att, 1)) != 1)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "MdF_Cambiato") != 1)  { EXITSUB() }

      if (VAR_VAL(-1, "CAM_Visualize") > 99)
         { COMANDO2(STRCAT("LOGMSG { MdF_Ctrl_Cambiamenti MdF_Cambiato=", MdF_Cambiato, " su ", NOME(idx_att), " idx_att=", STR(idx_att), " ", DATA(0))) }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "Par"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "ParMdF"
      GOSUB MdF_Variabili

      GOSUB Reg_pos_Paracolpi

      MdF_Cambiato_att = VAR_VAL_STR(idx_att, "MdF_Cambiato")
      bas0_att = base_0.y
      alt0_att = alto_0.y
      bas0_CamMdF = VAR_VAL(idx_CamMdF, "base_0.y")
      alt0_CamMdF = VAR_VAL(idx_CamMdF, "alto_0.y")

      if (IS_MATCH(MdF_Cambiato, "MdF_CamMdFrontali") != 1)
         {
          GOSUB MdF_Cam_Elimina
         }

      if ( bas0_att == bas0_CamMdF  &  alt0_att == alt0_CamMdF
         & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "Dim*") != 1
         )
         { DEL_VAR(idx_att, "MdF_Cambiato") }

      if ( STRCMP(KeyFamRegFacc_att, KeyFamRegFacc) != 0
         | STRCMP(MdF_Aper_att, MdF_Apertura) != 0
         | X_att != X
         | Y_att != Y
         | px_Par1_att != px_Par1
         | px_Par2_att != px_Par2
         | px_Par3_att != px_Par3
         | px_Par4_att != px_Par4
         | py_Par1_att != py_Par1
         | py_Par2_att != py_Par2
         | py_Par3_att != py_Par3
         | py_Par4_att != py_Par4
         | py_Par5_att != py_Par5
         | py_Par6_att != py_Par6
         | py_Par7_att != py_Par7
         | py_Par8_att != py_Par8
         )
         {
          WITH_VAR_LOCAL(idx_att, "mdf_Visgraf", "escl_Grafica", 2, 1, "0")

          //if (mdf_Visgraf <= 0  |  $CAM_Visualize == 1)
          if (mdf_Visgraf <= 0)
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          else
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          MdF_Cambiato_att = STRCAT(MdF_Cambiato_att, " , Ricalcolato")
         }

      if (VAR_VAL(-1, "CAM_Visualize") > 99)
         { COMANDO2(STRCAT("LOGMSG } MdF_Ctrl_Cambiamenti ", NOME(idx_att), " idx_att=", STR(idx_att), " ", DATA(0))) }
   }
}
// 07.03.2024
Elemento MdF_ContParacolpiInt
{
   Descrizione = "Contenitore grafica Paracolpi Interni"
   Code        = GRANT
   Gruppo      = "TMP"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   Alias         MdF_CAM;MdF_Par

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22
      HIDE  ""  1

      MdF_Apertura      "Apertura"        ""

      px_ParInt1        "Quota X paracolpo 1"                  0
      px_ParInt2        "Quota X paracolpo 2"                  0
      px_ParInt3        "Quota X paracolpo 3"                  0
      px_ParInt4        "Quota X paracolpo 4"                  0
      px_ParInt5        "Quota X paracolpo 4"                  -1
      px_ParInt6        "Quota X paracolpo 4"                  -1
      px_ParInt7        "Quota X paracolpo 4"                  -1
      px_ParInt8        "Quota X paracolpo 4"                  -1
      py_ParInt1        "Quota Y paracolpo 1"                  0
      py_ParInt2        "Quota Y paracolpo 2"                  0
      py_ParInt3        "Quota Y paracolpo 3"                  0
      py_ParInt4        "Quota Y paracolpo 4"                  0
      py_ParInt5        "Quota Y paracolpo 5"                  -1
      py_ParInt6        "Quota Y paracolpo 6"                  -1
      py_ParInt7        "Quota Y paracolpo 7"                  -1
      py_ParInt8        "Quota Y paracolpo 8"                  -1

      KeyFamRegFacc     "tipo posizionamento cerniere"        ""

      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      GOSUB MdF_SetStato_NoGEST
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          MdF_comandoOnAUTO = 1
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Attrezza
   {
      base_0 = @base_0
      base_0.z = @base_0.z
      X = @X
      Y = @Y
      Z = @Z
   }

   Controlli
   {
      idx_att = ATTUALE()
      idx_CamMdF = PADRE(idx_att, 1)
      nome_CamMdF = NOME(idx_CamMdF)
      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")
      Z = VAR_VAL(idx_CamMdF, "Z")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      GOSUB MdF_Ctrl_Dim

     // 29.09.2017
      MdfSys_SbordoYSup = VAR_VAL(idx_CamMdF, "MdfSys_SbordoYSup")
      MdfSys_SbordoYInf = VAR_VAL(idx_CamMdF, "MdfSys_SbordoYInf")
     // 24.04.2025
      MdfSys_SbordoYSup_DaCop = VAR_VAL(idx_CamMdF, "MdfSys_SbordoYSup_DaCop")
      MdfSys_SbordoYInf_DaFon = VAR_VAL(idx_CamMdF, "MdfSys_SbordoYInf_DaFon")

     // 09.04.2020 AVG783007 Problema Battuta_X_Sx per MdF_Apertura DX
      if (STRLEN(MdF_Apertura) == 0)  { MdF_Apertura = VAR_VAL_STR(idx_CamMdF, "MdF_Apertura") }
     // 27.09.2018
      GOSUB MdF_Battuta_X_byFather

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "ParInt"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "ParIntMdF"
      GOSUB MdF_Variabili

      GOSUB Reg_pos_ParacolpiInt
      GOSUB Reg_ParacolpiInt_att

      if (px_ParInt1 == 0  &  py_ParInt1 == 0)
         {
          if (STRLEN(KeyFamRegFacc) > 0)
             {
              if ( px_ParInt2 == 0  &  py_ParInt2 == 0
                 & px_ParInt3 == 0  &  py_ParInt3 == 0
                 & px_ParInt4 == 0  &  py_ParInt4 == 0
                 )
                 {
                  COMANDO(STRCAT("LOGMSG Aggiunto un ", NOME(idx_att), " con KeyFamRegFacc=", KeyFamRegFacc, " ma non ci sono regole in RegFacc ",
                          "Controlla se serve la Regola KeyFamRegFacc.txt: ", VAR_VAL_STR(PADRE(idx_att, 1), "CHIAVE_TAB_REG"), "_ParInt=", KeyFamRegFacc)
                         )
                 }
             }
         }

      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_ADD_when"), "first_OnMacroMdF") )
         { MdF_ADD_when = "RE_Control" }

      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)
         {
          MdF_ADD_when = "RE_Control"
          mdf_ricalc_Post_READD = 0
         }

      // In teoria non serve per Interni perchè dovrebbe esser fatto con consapevolezza, altrimenti fare MdF_ParInt_Collision
      //GOSUB MdF_Par_Collision
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_ParacolpoInt  par1
   {
      @escluso = 1
      if (py_ParInt1 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_ParInt1") > 0)  { @X = X_ParInt1 }
      if (VAR_VAL(idx_att, "Y_ParInt1") > 0)  { @Y = Y_ParInt1 }
      if (VAR_VAL(idx_att, "Z_ParInt1") > 0)  { @Z = Z_ParInt1 }

      @base_0 = base_0
     // 05.06.2023
      @base_0.x = base_0.x + px_ParInt1 + VAR_VAL(idx_att, "MdfSys_CollisionX1")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX1")
      @base_0.y = base_0.y + py_ParInt1 + VAR_VAL(idx_att, "MdfSys_CollisionY1")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY1")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @id_Par = 1

     // 05.06.2023
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi1") )  { @escluso=1 }
   }

   Posiziona MdF_ParacolpoInt  par2
   {
      @escluso = 1
      if (py_ParInt2 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_ParInt2") > 0)  { @X = X_ParInt2 }
      if (VAR_VAL(idx_att, "Y_ParInt2") > 0)  { @Y = Y_ParInt2 }
      if (VAR_VAL(idx_att, "Z_ParInt2") > 0)  { @Z = Z_ParInt2 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_ParInt2 + VAR_VAL(idx_att, "MdfSys_CollisionX2")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX2")
      @base_0.y = base_0.y + py_ParInt2 + VAR_VAL(idx_att, "MdfSys_CollisionY2")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY2")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @id_Par = 2
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi2") )  { @escluso=1 }
   }

   Posiziona MdF_ParacolpoInt  par3
   {
      @escluso = 1
      if (py_ParInt3 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_ParInt3") > 0)  { @X = X_ParInt3 }
      if (VAR_VAL(idx_att, "Y_ParInt3") > 0)  { @Y = Y_ParInt3 }
      if (VAR_VAL(idx_att, "Z_ParInt3") > 0)  { @Z = Z_ParInt3 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_ParInt3 + VAR_VAL(idx_att, "MdfSys_CollisionX3")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX3")
      @base_0.y = base_0.y + py_ParInt3 + VAR_VAL(idx_att, "MdfSys_CollisionY3")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY3")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Par = 3
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi3") )  { @escluso=1 }
   }

   Posiziona MdF_ParacolpoInt  par4
   {
      @escluso = 1
      if (py_ParInt4 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_Par4") > 0)  { @X = X_ParInt4 }
      if (VAR_VAL(idx_att, "Y_Par4") > 0)  { @Y = Y_ParInt4 }
      if (VAR_VAL(idx_att, "Z_Par4") > 0)  { @Z = Z_ParInt4 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_ParInt4 + VAR_VAL(idx_att, "MdfSys_CollisionX4")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX4")
      @base_0.y = base_0.y + py_ParInt4 + VAR_VAL(idx_att, "MdfSys_CollisionY4")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY4")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Par = 4
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi4") )  { @escluso=1 }
   }

   Posiziona MdF_ParacolpoInt  par5
   {
      @escluso = 1
      if (py_ParInt5 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_ParInt5") > 0)  { @X = X_ParInt5 }
      if (VAR_VAL(idx_att, "Y_ParInt5") > 0)  { @Y = Y_ParInt5 }
      if (VAR_VAL(idx_att, "Z_ParInt5") > 0)  { @Z = Z_ParInt5 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_ParInt5 + VAR_VAL(idx_att, "MdfSys_CollisionX5")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX5")
      @base_0.y = base_0.y + py_ParInt5 + VAR_VAL(idx_att, "MdfSys_CollisionY5")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY5")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Par = 5
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi5") )  { @escluso=1 }
   }

   Posiziona MdF_ParacolpoInt  par6
   {
      @escluso = 1
      if (py_ParInt6 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_ParInt6") > 0)  { @X = X_ParInt6 }
      if (VAR_VAL(idx_att, "Y_ParInt6") > 0)  { @Y = Y_ParInt6 }
      if (VAR_VAL(idx_att, "Z_ParInt6") > 0)  { @Z = Z_ParInt6 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_ParInt6 + VAR_VAL(idx_att, "MdfSys_CollisionX6")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX6")
      @base_0.y = base_0.y + py_ParInt6 + VAR_VAL(idx_att, "MdfSys_CollisionY6")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY6")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Par = 6
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi6") )  { @escluso=1 }
   }

   Posiziona MdF_ParacolpoInt  par7
   {
      @escluso = 1
      if (py_ParInt7 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_ParInt7") > 0)  { @X = X_ParInt7 }
      if (VAR_VAL(idx_att, "Y_ParInt7") > 0)  { @Y = Y_ParInt7 }
      if (VAR_VAL(idx_att, "Z_ParInt7") > 0)  { @Z = Z_ParInt7 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_ParInt7 + VAR_VAL(idx_att, "MdfSys_CollisionX7")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX7")
      @base_0.y = base_0.y + py_ParInt7 + VAR_VAL(idx_att, "MdfSys_CollisionY7")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY7")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Par = 7
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi7") )  { @escluso=1 }
   }

   Posiziona MdF_ParacolpoInt  par8
   {
      @escluso = 1
      if (py_ParInt8 > 0)  { @escluso = 0 }

      if (VAR_VAL(idx_att, "X_ParInt8") > 0)  { @X = X_Par8 }
      if (VAR_VAL(idx_att, "Y_ParInt8") > 0)  { @Y = Y_Par8 }
      if (VAR_VAL(idx_att, "Z_ParInt8") > 0)  { @Z = Z_Par8 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_ParInt8 + VAR_VAL(idx_att, "MdfSys_CollisionX8")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaX8")
      @base_0.y = base_0.y + py_ParInt8 + VAR_VAL(idx_att, "MdfSys_CollisionY8")*VAR_VAL(idx_att, "MdfSys_CollisionSpostaY8")
      @base_0.z = base_0.z - @Z

      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Par = 8
      if (VAR_VAL(idx_att, "MdfSys_CollisionEscludi8") )  { @escluso=1 }
   }

   Procedura MdF_noAUTO
   {
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          MdF_comandoOnAUTO = 2
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Procedura MdF_Ctrl_Post_RELATIVE_ADD
   {
      GOSUB MdF_Ctrl_Post_RELATIVE_ADD
   }

   Procedura MdF_Ctrl_ADD_TooEarly
   {
      GOSUB MdF_Ctrl_ADD_TooEarly
   }

   Procedura MdF_Ctrl_Cambiamenti
   {
      if (IS_IDX(idx_att) != 1)            { EXITSUB() }
      if (IS_IDX(PADRE(idx_att, 1)) != 1)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "MdF_Cambiato") != 1)  { EXITSUB() }

      if (VAR_VAL(-1, "CAM_Visualize") > 99)
         { COMANDO2(STRCAT("LOGMSG { MdF_Ctrl_Cambiamenti MdF_Cambiato=", MdF_Cambiato, " su ", NOME(idx_att), " idx_att=", STR(idx_att), " ", DATA(0))) }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "ParInt"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "ParIntMdF"
      GOSUB MdF_Variabili

      GOSUB Reg_pos_ParacolpiInt

      MdF_Cambiato_att = VAR_VAL_STR(idx_att, "MdF_Cambiato")
      bas0_att = base_0.y
      alt0_att = alto_0.y
      bas0_CamMdF = VAR_VAL(idx_CamMdF, "base_0.y")
      alt0_CamMdF = VAR_VAL(idx_CamMdF, "alto_0.y")

      if (IS_MATCH(MdF_Cambiato, "MdF_CamMdFrontali") != 1)
         {
          GOSUB MdF_Cam_Elimina
         }

      if ( bas0_att == bas0_CamMdF  &  alt0_att == alt0_CamMdF
         & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "Dim*") != 1
         )
         { DEL_VAR(idx_att, "MdF_Cambiato") }

      if ( STRCMP(KeyFamRegFacc_att, KeyFamRegFacc) != 0
         | STRCMP(MdF_Aper_att, MdF_Apertura) != 0
         | X_att != X
         | Y_att != Y
         | px_ParInt1_att != px_ParInt1
         | px_ParInt2_att != px_ParInt2
         | px_ParInt3_att != px_ParInt3
         | px_ParInt4_att != px_ParInt4
         | py_ParInt1_att != py_ParInt1
         | py_ParInt2_att != py_ParInt2
         | py_ParInt3_att != py_ParInt3
         | py_ParInt4_att != py_ParInt4
         | py_ParInt5_att != py_ParInt5
         | py_ParInt6_att != py_ParInt6
         | py_ParInt7_att != py_ParInt7
         | py_ParInt8_att != py_ParInt8
         )
         {
          WITH_VAR_LOCAL(idx_att, "mdf_Visgraf", "escl_Grafica", 2, 1, "0")

          //if (mdf_Visgraf <= 0  |  $CAM_Visualize == 1)
          if (mdf_Visgraf <= 0)
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          else
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          MdF_Cambiato_att = STRCAT(MdF_Cambiato_att, " , Ricalcolato")
         }

      if (VAR_VAL(-1, "CAM_Visualize") > 99)
         { COMANDO2(STRCAT("LOGMSG } MdF_Ctrl_Cambiamenti ", NOME(idx_att), " idx_att=", STR(idx_att), " ", DATA(0))) }
   }
}

Elemento MdF_Paracolpo
{
   Descrizione = "Grafica Paracolpo"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  5
      Y  ""  5
      Z  ""  5

      tipoIncidenza        "X,Y,Z"                                 "Z"
      escl_Grafica         "visualizza grafica"                     1
      id_Par               "identificativo per CHIAVE_TAB_CAM"      0

      import               ""                                       ""
      mdf_offx_Par         ""                                       0
      mdf_offy_Par         ""                                       0
      mdf_offz_Par         ""                                       0
      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      CHIAVE_TAB_CAM = NOME(idx_att)
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_Par")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att)) }

      nome_var_chiave = "CHIAVE_TAB_CAM_Par1"
      if (VAR_EXIST(PADRE(idx_att, 1), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 1), nome_var_chiave) }
      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_Par", STR(id_Par))
      if (VAR_EXIST(PADRE(idx_att, 1), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 1), nome_var_chiave) }

      id_Reg = VAR_VAL(PADRE(idx_att, 1), STRCAT("id_Reg_Par", STR(id_Par)))

      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("Visualizza_Par", STR(id_Par)))
      GOSUB mdf_Visualize
   }

   Controlli
   {
      idx_MdF = PADRE(idx_att, 1)
      if (ACTION() <= 0)  { EXITSUB() }

      chiave_tabvar_mdf = "Par"
      GOSUB MdF_GEST

      import = VAR_VAL_STR(PADRE(idx_MdF, 1), "mdf_import_Par")
     // 09.10.2023 PK
      mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("img_sat_F1_Par", STR(id_Par)))
     // 29.04.2024 Ottimizzazioni FILE_EXIST per la rete
      if (STRLEN(mdf_nomeFile_sat) > 10)
         {
          if (mdf_nomeFile_sat != VAR_VAL_STR(idx_att, "mdf_nomeFile_sat_prec") )
             {
              if (FILE_EXIST(STRCAT($path_bdm, "Cam\Sat\", mdf_nomeFile_sat, ".sat")) == 1)  { nomeFilesat_exist = 1 }
              else                                                                           { nomeFilesat_exist = 0 }
              mdf_nomeFile_sat_prec = mdf_nomeFile_sat
             }
          if (VAR_VAL(idx_att, "nomeFilesat_exist") > 0)  { import = STRCAT($path_bdm, "Cam\Sat\", mdf_nomeFile_sat) }
         }

      mdf_import = import

      mdf_offx_Par = VAR_VAL(PADRE(idx_MdF, 1), "mdf_offx_Par")
      mdf_offy_Par = VAR_VAL(PADRE(idx_MdF, 1), "mdf_offy_Par")
      mdf_offz_Par = VAR_VAL(PADRE(idx_MdF, 1), "mdf_offz_Par")
     // 29.11.2023
      if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_F1_Par", STR(id_Par))) )
         {
          mdfstr_input = VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_F1_Par", STR(id_Par)))
          GOSUB MdF_EstraiStringhe
          mdf_offx_Par = ATOI(mdf_array_Stringhe[1])
          mdf_offy_Par = ATOI(mdf_array_Stringhe[2])
          mdf_offz_Par = ATOI(mdf_array_Stringhe[3])
          // angolo non c'è e non ha senso differenziare tra Sx,Dx perchè la riga RegFacc e per uno
          //mdF_sat_angz = ATOI(mdf_array_Stringhe[4])
          //if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*") )
          //   {
          //    if (VAR_EXIST(idx_att, "mdf_array_Stringhe_##5") )
          //       {
          //        mdf_offx_Par = ATOI(mdf_array_Stringhe[5])
          //        mdf_offy_Par = ATOI(mdf_array_Stringhe[6])
          //        mdf_offz_Par = ATOI(mdf_array_Stringhe[7])
          //        mdF_sat_angz = ATOI(mdf_array_Stringhe[8])
          //       }
          //   }
         }

      if (VAR_VAL(-1, "CAM_Visualize") <= 0)
         {
          if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
             & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
             & STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat_Par"), "No") != 0
             )
             {
              if (STRLEN(VAR_VAL_STR(idx_att, "import")) > 10)
                 {
                  // 29.04.2024 Ottimizzazioni FILE_EXIST per la rete
                  if (import != VAR_VAL_STR(idx_att, "import_prec") )
                     {
                      if (FILE_EXIST(STRCAT(import, ".sat")) == 1)  { import_sat_exist = 1 }
                      else                                          { import_sat_exist = 0 }
                      import_prec = import
                     }
                  if (VAR_VAL(idx_att, "import_sat_exist") > 0)  { escl_Grafica = 1 }
                 }
             }
         }

     // 25.07.2023 Solo provvisorio, da non usare mai in modo sistematico perchè deve essere corretta la regola
      if (VAR_VAL(idx_att, "id_Reg") > 0)
         {
          // 05.06.2023
          if (VAR_EXIST(PADRE(idx_MdF, 1), "MPa_Battuta_archetipi") )
             {
              mpa_Battuta_Found = 0
              mpa_Battuta_archetipi = VAR_VAL_STR(PADRE(idx_MdF, 1), "MPa_Battuta_archetipi")
              mdfstr_input = mpa_Battuta_archetipi
              GOSUB MdF_EStr_var
              BOX_MODE(0)
              dist_Coll = 2.5
              // 26.07.2023
              if (VAR_EXIST(PADRE(idx_MdF, 1), "MPa_distBattuta") )
                 { dist_Coll = VAR_VAL(PADRE(idx_MdF, 1), "MPa_distBattuta") }

              NEAR_GLOBALE("mdf_collY", idx_att, dist_Coll, 1, "*")
              iPa = 1
              while (iPa <= mdf_collY)
                 {
                  idx_troCol = mdf_collY[iPa]
                  micv = 1
                  while (micv <= mdf_array_var)
                     {
                      if (IS_MATCH(NOME(idx_troCol), mdf_array_var[micv]) == 1)
                         {
                          mpa_Battuta_Found = 1
                          mpa_Battuta_idx = idx_troCol
                         }
                      micv = micv+1
                     }
                  iPa = iPa+1
                 }
              if (mpa_Battuta_Found == 0)
                 {
                  VAR_VALUE_SET(PADRE(idx_MdF, 1), "MdF_ParacolpiToCtrl", 1)
                  if (VAR_VAL(PADRE(idx_MdF, 1), "Msg_BattutaParac") > 0)
                     {
                      HI(PADRE(idx_MdF, 1),1)
                      DISPLAY2("ATTENZIONE! paracolpo posizionato in modo errato.\ncontattare ufficio tecnino.\nGrazie")
                      DISPLAY2(STRCAT("IdxFro: ", STR(PADRE(idx_MdF, 1)), " Regola ", VAR_VAL_STR(idx_att, "KeyFamRegFacc"), " id_Reg=", STR(id_Reg), " idxPar=", STR(idx_att)))
                      HI(PADRE(idx_MdF, 1),0)
                     }
                  else
                     { escluso = 1 }
                 }
             }

         // 13.11.2023 PK andrebbe usata solo per test, altrimenti per ogni MdF_Paracolpo Metron fa continui NEAR_GLOBALE.
          // L' errore è voler fare dei controlli invece di sistemare le regole. Il cliente non vuol capire
          if (VAR_EXIST(PADRE(idx_MdF, 1), "MPa_Battuta_Funz") )
             {
              $CAM_Sub_Parc = VAR_VAL_STR(PADRE(idx_MdF, 1), "MPa_Battuta_Funz")
              GOSUB $CAM_Sub_Parc
             }
         }
   }

   PuntiNotevoli
   {
      idx_att = ATTUALE()
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona Blocco bl
   {
      @escluso = escl_Grafica
     // 23.06.2023 Se in RegFacc imposto ParESCL o comunque *ESCL* per togliere la regola perchè non voglio il cam, tolgo anhce la grafica
      if (IS_MATCH(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM"), "*ESCL*") == 1)
         { @escluso = 1 }

      @base_0 = base_0
      @base_0.x = base_0.x - X/2
      @base_0.y = base_0.y - Y/2
      @X = X
      @Y = Y
      @Z = Z
      @c_rivestimento = [255,255,120]
      @f_rivestimento = STR(100*0.005)
   }

  // Uso quello interno altrimenti chi non ha MdF_Sat.inc va in errore
   Posiziona MdF_ImportSatGenerico  sat
   {
      @escluso = 1
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         )
         { @escluso = 0 }

     // 23.06.2023 Se in RegFacc imposto ParESCL o comunque *ESCL* per togliere la regola perchè non voglio il cam, tolgo anhce la grafica
      if (IS_MATCH(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM"), "*ESCL*") == 1)
         { @escluso = 1 }

      @MdF_Visualize_sat_Par = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat_Par")

      @base_0 = base_0
      @base_0.x = base_0.x + mdf_offx_Par
      @base_0.y = base_0.y + mdf_offy_Par
      @base_0.z = base_0.z + mdf_offz_Par
      @X = X
      @Y = Y
      @Z = Z
      @c_rivestimento = [192,192,192]
   }
}

Elemento MdF_ParacolpoInt
{
   Descrizione = "Grafica Paracolpo Int"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  5
      Y  ""  5
      Z  ""  5

      tipoIncidenza        "X,Y,Z"                                 "Z"
      escl_Grafica         "visualizza grafica"                     1
      id_Par               "identificativo per CHIAVE_TAB_CAM"      0

      import               ""                                       ""
      mdf_offx_Par         ""                                       0
      mdf_offy_Par         ""                                       0
      mdf_offz_Par         ""                                       0
      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      CHIAVE_TAB_CAM = NOME(idx_att)
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_Par")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att)) }

      nome_var_chiave = "CHIAVE_TAB_CAM_Par1"
      if (VAR_EXIST(PADRE(idx_att, 1), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 1), nome_var_chiave) }
      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_Par", STR(id_Par))
      if (VAR_EXIST(PADRE(idx_att, 1), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 1), nome_var_chiave) }

      id_Reg = VAR_VAL(PADRE(idx_att, 1), STRCAT("id_Reg_Par", STR(id_Par)))

      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("Visualizza_Par", STR(id_Par)))
      GOSUB mdf_Visualize
   }

   Controlli
   {
      idx_MdF = PADRE(idx_att, 1)
      if (ACTION() <= 0)  { EXITSUB() }

      chiave_tabvar_mdf = "ParInt"
      GOSUB MdF_GEST

      import = VAR_VAL_STR(PADRE(idx_MdF, 1), "mdf_import_ParInt")

      mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("img_sat_F1_ParInt", STR(id_Par)))
     // 29.04.2024 Ottimizzazioni FILE_EXIST per la rete
      if (STRLEN(mdf_nomeFile_sat) > 10)
         {
          if (mdf_nomeFile_sat != VAR_VAL_STR(idx_att, "mdf_nomeFile_sat_prec") )
             {
              if (FILE_EXIST(STRCAT($path_bdm, "Cam\Sat\", mdf_nomeFile_sat, ".sat")) == 1)  { nomeFilesat_exist = 1 }
              else                                                                           { nomeFilesat_exist = 0 }
              mdf_nomeFile_sat_prec = mdf_nomeFile_sat
             }
          if (VAR_VAL(idx_att, "nomeFilesat_exist") > 0)  { import = STRCAT($path_bdm, "Cam\Sat\", mdf_nomeFile_sat) }
         }

      mdf_import = import

      mdf_offx_Par = VAR_VAL(PADRE(idx_MdF, 1), "mdf_offx_ParInt")
      mdf_offy_Par = VAR_VAL(PADRE(idx_MdF, 1), "mdf_offy_ParInt")
      mdf_offz_Par = VAR_VAL(PADRE(idx_MdF, 1), "mdf_offz_ParInt")

      if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_F1_ParInt", STR(id_Par))) )
         {
          mdfstr_input = VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_F1_ParInt", STR(id_Par)))
          GOSUB MdF_EstraiStringhe
          mdf_offx_Par = ATOI(mdf_array_Stringhe[1])
          mdf_offy_Par = ATOI(mdf_array_Stringhe[2])
          mdf_offz_Par = ATOI(mdf_array_Stringhe[3])
         }

      if (VAR_VAL(-1, "CAM_Visualize") <= 0)
         {
          if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
             & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
             & STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat_Par"), "No") != 0
             )
             {
              if (STRLEN(VAR_VAL_STR(idx_att, "import")) > 10)
                 {
                  // 29.04.2024 Ottimizzazioni FILE_EXIST per la rete
                  if (import != VAR_VAL_STR(idx_att, "import_prec") )
                     {
                      if (FILE_EXIST(STRCAT(import, ".sat")) == 1)  { import_sat_exist = 1 }
                      else                                          { import_sat_exist = 0 }
                      import_prec = import
                     }
                  if (VAR_VAL(idx_att, "import_sat_exist") > 0)  { escl_Grafica = 1 }
                 }
             }
         }

     // da non usare mai in modo sistematico perchè deve essere corretta la regola
      if (VAR_VAL(idx_att, "id_Reg") > 0)
         {
         // PK andrebbe usata solo per test, altrimenti per ogni MdF_Paracolpo Metron fa continui NEAR_GLOBALE.
          // L' errore è voler fare dei controlli invece di sistemare le regole. Il cliente non vuol capire
          if (VAR_EXIST(PADRE(idx_MdF, 1), "MPa_Battuta_Funz") )
             {
              $CAM_Sub_Parc = VAR_VAL_STR(PADRE(idx_MdF, 1), "MPa_Battuta_Funz")
              GOSUB $CAM_Sub_Parc
             }
         }
   }

   PuntiNotevoli
   {
      idx_att = ATTUALE()
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona Blocco bl
   {
      @escluso = escl_Grafica
     // 23.06.2023 Se in RegFacc imposto ParESCL o comunque *ESCL* per togliere la regola perchè non voglio il cam, tolgo anhce la grafica
      if (IS_MATCH(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM"), "*ESCL*") == 1)
         { @escluso = 1 }

      @base_0 = base_0
      @base_0.x = base_0.x - X/2
      @base_0.y = base_0.y - Y/2
      @X = X
      @Y = Y
      @Z = Z
      @c_rivestimento = [255,255,120]
      @f_rivestimento = STR(100*0.005)
   }

  // Uso quello interno altrimenti chi non ha MdF_Sat.inc va in errore
   Posiziona MdF_ImportSatGenerico  sat
   {
      @escluso = 1
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         )
         { @escluso = 0 }

     // 23.06.2023 Se in RegFacc imposto ParESCL o comunque *ESCL* per togliere la regola perchè non voglio il cam, tolgo anhce la grafica
      if (IS_MATCH(VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM"), "*ESCL*") == 1)
         { @escluso = 1 }

      @MdF_Visualize_sat_Par = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat_Par")

      @base_0 = base_0
      @base_0.x = base_0.x + mdf_offx_Par
      @base_0.y = base_0.y + mdf_offy_Par
      @base_0.z = base_0.z + mdf_offz_Par
      @X = X
      @Y = Y
      @Z = Z
      @c_rivestimento = [192,192,192]
   }
}

Elemento MdF_Ferramente_4Reg
{
   Descrizione = "Contenitore grafica Ferramente"
   Code        = GRANT
   Gruppo      = "TMP"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   Alias         MdF_CAM;MdF_Fer4Reg

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22
      HIDE  ""  1

      MdF_Apertura            "Apertura"        ""

      px_FerFro1              "Rientro Ferramenta 1 in X su Frontale"     -999
      py_FerFro1              "Rientro Ferramenta 1 in Y su Frontale"     -999
      pz_FerFro1              "Rientro Ferramenta 1 in Z su Frontale"     -999
      px_FerFia1              "Rientro Ferramenta 1 in X su Verticale"    -999
      py_FerFia1              "Rientro Ferramenta 1 in Y su Verticale"    -999
      pz_FerFia1              "Rientro Ferramenta 1 in Z su Verticale"    38
      px_FerPia1              "Rientro Ferramenta 1 in X su Piano"        -999
      py_FerPia1              "Rientro Ferramenta 1 in Y su Piano"        -999
      pz_FerPia1              "Rientro Ferramenta 1 in Z su Piano"        38

      X_FerFro1               "Dim X 1 Frontale"                          60
      Y_FerFro1               "Dim Y 1 Frontale"                          40
      Z_FerFro1               "Dim Z 1 Frontale"                          12
      X_FerFia1               "Dim X 1 Verticale"                         20
      Y_FerFia1               "Dim Y 1 Verticale"                         40
      Z_FerFia1               "Dim Z 1 Verticale"                         60
      X_FerPia1               "Dim X 1 Piano"                             60
      Y_FerPia1               "Dim Y 1 Piano"                             12
      Z_FerPia1               "Dim X 1 Piano"                              0

      px_FerFro2              "Rientro Ferramenta 2 in X su Frontale"     -999
      py_FerFro2              "Rientro Ferramenta 2 in Y su Frontale"     -999
      pz_FerFro2              "Rientro Ferramenta 2 in Z su Frontale"     -999
      px_FerFia2              "Rientro Ferramenta 2 in X su Verticale"    -999
      py_FerFia2              "Rientro Ferramenta 2 in Y su Verticale"    -999
      pz_FerFia2              "Rientro Ferramenta 2 in Z su Verticale"    38
      px_FerPia2              "Rientro Ferramenta 2 in X su Piano"        -999
      py_FerPia2              "Rientro Ferramenta 2 in Y su Piano"        -999
      pz_FerPia2              "Rientro Ferramenta 2 in Z su Piano"        38

      X_FerFro2               "Dim X 2 Frontale"                          60
      Y_FerFro2               "Dim Y 2 Frontale"                          40
      Z_FerFro2               "Dim Z 2 Frontale"                          12
      X_FerFia2               "Dim X 2 Verticale"                         20
      Y_FerFia2               "Dim Y 2 Verticale"                         40
      Z_FerFia2               "Dim Z 2 Verticale"                         60
      X_FerPia2               "Dim X 2 Piano"                             60
      Y_FerPia2               "Dim Y 2 Piano"                             12
      Z_FerPia2               "Dim X 2 Piano"                              0

      Battuta_X_Sx            "battuta Sx su Fia di aggancio"              0
      Battuta_X_Dx            "battuta Dx su Fia di aggancio"              0
      Battuta_Y               "battuta in Y su Pia"                        0
      Battuta_Z               "battuta in Z su Fia,Pia"                    0
     // 20.07.2023
      Battuta_Z_Sx      "battuta in Z su Fia Sx"                           0
      Battuta_Z_Dx      "battuta in Z su Fia Dx"                           0

      KeyFamRegFacc           "Regola Fer"                                ""
      KeyFamRegFacc_FerFro    "Regola Ferramenta Frontale"                ""
      KeyFamRegFacc_FerFia    "Regola Ferramenta Verticale"               ""
      KeyFamRegFacc_FerPia    "Regola Ferramenta Orizzontale"             ""

      px_FerFro3              "Rientro Ferramenta 3 in X su Frontale"     -999
      py_FerFro3              "Rientro Ferramenta 3 in Y su Frontale"     -999
      pz_FerFro3              "Rientro Ferramenta 3 in Z su Frontale"     -999
      px_FerFia3              "Rientro Ferramenta 3 in X su Verticale"    -999
      py_FerFia3              "Rientro Ferramenta 3 in Y su Verticale"    -999
      pz_FerFia3              "Rientro Ferramenta 3 in Z su Verticale"    38
      px_FerPia3              "Rientro Ferramenta 3 in X su Piano"        -999
      py_FerPia3              "Rientro Ferramenta 3 in Y su Piano"        -999
      pz_FerPia3              "Rientro Ferramenta 3 in Z su Piano"        38

      X_FerFro3               "Dim X 3 Frontale"                          60
      Y_FerFro3               "Dim Y 3 Frontale"                          40
      Z_FerFro3               "Dim Z 3 Frontale"                          12
      X_FerFia3               "Dim X 3 Verticale"                         20
      Y_FerFia3               "Dim Y 3 Verticale"                         40
      Z_FerFia3               "Dim Z 3 Verticale"                         60
      X_FerPia3               "Dim X 3 Piano"                             60
      Y_FerPia3               "Dim Y 3 Piano"                             12
      Z_FerPia3               "Dim X 3 Piano"                              0

      px_FerFro4              "Rientro Ferramenta 4 in X su Frontale"     -999
      py_FerFro4              "Rientro Ferramenta 4 in Y su Frontale"     -999
      pz_FerFro4              "Rientro Ferramenta 4 in Z su Frontale"     -999
      px_FerFia4              "Rientro Ferramenta 4 in X su Verticale"    -999
      py_FerFia4              "Rientro Ferramenta 4 in Y su Verticale"    -999
      pz_FerFia4              "Rientro Ferramenta 4 in Z su Verticale"    38
      px_FerPia4              "Rientro Ferramenta 4 in X su Piano"        -999
      py_FerPia4              "Rientro Ferramenta 4 in Y su Piano"        -999
      pz_FerPia4              "Rientro Ferramenta 4 in Z su Piano"        38

      X_FerFro4               "Dim X 4 Frontale"                          60
      Y_FerFro4               "Dim Y 4 Frontale"                          40
      Z_FerFro4               "Dim Z 4 Frontale"                          12
      X_FerFia4               "Dim X 4 Verticale"                         20
      Y_FerFia4               "Dim Y 4 Verticale"                         40
      Z_FerFia4               "Dim Z 4 Verticale"                         60
      X_FerPia4               "Dim X 4 Piano"                             60
      Y_FerPia4               "Dim Y 4 Piano"                             12
      Z_FerPia4               "Dim X 4 Piano"                              0

      MdF_Utente              "Gestione da utente"                      "-1"  NoSave
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      GOSUB MdF_SetStato_NoGEST
     // 10.09.2024
      cam_KeyRegMdF = "FerFro;FerFia;FerPia"
      GOSUB MdF_Ctrl_save_prec

      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          MdF_comandoOnAUTO = 1
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Attrezza
   {
      base_0 = @base_0
      base_0.z = @base_0.z
      X = @X
      Y = @Y
      Z = @Z
   }

   Controlli
   {
      idx_att = ATTUALE()
      idx_CamMdF = PADRE(idx_att, 1)
      nome_CamMdF = NOME(idx_CamMdF)
      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")
      Z = VAR_VAL(idx_CamMdF, "Z")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      GOSUB MdF_Ctrl_Dim

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili

      GOSUB MdF_Battuta_X
      GOSUB MdF_Battuta_Y

      GOSUB Reg_pos_Ferramente
      GOSUB Reg_Ferramente_att
      GOSUB MdF_Battuta_X_After_RegFacc

     // 10.09.2024
      if ( STR_INDEX_OF(MdF_Utente, 0, "FerFro") > -1
         | STR_INDEX_OF(MdF_Utente, 0, "FerFia") > -1
         | STR_INDEX_OF(MdF_Utente, 0, "FerPia") > -1
         )
         {
          HIDE = 3

          mdf_LivSpostaCerUte = VAR_VAL(PADRE(idx_att, 1), "MdfSys_LivSpostaCerUte")
          if (mdf_LivSpostaCerUte <= 2)
             {
              if (VAR_VAL(idx_att, "MdF_comandoOnAUTO") >= 1)
                 {
                  COMPONENTI2("mdf_FerFFP", idx_att, "MdF_FerramenteXYZ")
                  ivr = 1
                  mdf_found_modif = 0
                  while (ivr <= mdf_FerFFP)
                     {
                      VarsUser_click = VAR_VAL_STR(mdf_FerFFP[ivr], "VarsUser__")
                      if ( VAR_VAL(mdf_FerFFP[ivr], "sposta_X_Fro_Utente") != 0
                         | VAR_VAL(mdf_FerFFP[ivr], "sposta_Y_Fro_Utente") != 0
                         | VAR_VAL(mdf_FerFFP[ivr], "sposta_Z_Fro_Utente") != 0
                         | VAR_VAL(mdf_FerFFP[ivr], "sposta_X_Fia_Utente") != 0
                         | VAR_VAL(mdf_FerFFP[ivr], "sposta_Y_Fia_Utente") != 0
                         | VAR_VAL(mdf_FerFFP[ivr], "sposta_Z_Fia_Utente") != 0
                         | VAR_VAL(mdf_FerFFP[ivr], "sposta_X_Pia_Utente") != 0
                         | VAR_VAL(mdf_FerFFP[ivr], "sposta_Y_Pia_Utente") != 0
                         | VAR_VAL(mdf_FerFFP[ivr], "sposta_Z_Pia_Utente") != 0
                         | IS_VAR_FIXED(mdf_FerFFP[ivr], "sposta_X_Fro_Utente")
                         | IS_VAR_FIXED(mdf_FerFFP[ivr], "sposta_Y_Fro_Utente")
                         | IS_VAR_FIXED(mdf_FerFFP[ivr], "sposta_Z_Fro_Utente")
                         | IS_VAR_FIXED(mdf_FerFFP[ivr], "sposta_X_Fia_Utente")
                         | IS_VAR_FIXED(mdf_FerFFP[ivr], "sposta_Y_Fia_Utente")
                         | IS_VAR_FIXED(mdf_FerFFP[ivr], "sposta_Z_Fia_Utente")
                         | IS_VAR_FIXED(mdf_FerFFP[ivr], "sposta_X_Pia_Utente")
                         | IS_VAR_FIXED(mdf_FerFFP[ivr], "sposta_Y_Pia_Utente")
                         | IS_VAR_FIXED(mdf_FerFFP[ivr], "sposta_Z_Pia_Utente")
                         )
                         {
                          mdf_found_modif = 1
                         }
                      else
                         {
                         // 06.02.2025 Se clicco senza cambiare valore
                          if ( VAR_VAL(mdf_FerFFP[ivr], "sposta_X_Fro_Utente") == 0
                             & VAR_VAL(mdf_FerFFP[ivr], "sposta_Y_Fro_Utente") == 0
                             & VAR_VAL(mdf_FerFFP[ivr], "sposta_Z_Fro_Utente") == 0
                             & VAR_VAL(mdf_FerFFP[ivr], "sposta_X_Fia_Utente") == 0
                             & VAR_VAL(mdf_FerFFP[ivr], "sposta_Y_Fia_Utente") == 0
                             & VAR_VAL(mdf_FerFFP[ivr], "sposta_Z_Fia_Utente") == 0
                             & VAR_VAL(mdf_FerFFP[ivr], "sposta_X_Pia_Utente") == 0
                             & VAR_VAL(mdf_FerFFP[ivr], "sposta_Y_Pia_Utente") == 0
                             & VAR_VAL(mdf_FerFFP[ivr], "sposta_Z_Pia_Utente") == 0
                             & IS_MATCH(VarsUser_click, "sposta*")
                             )
                             {
                              DEL_VAR_MODIFICATE(mdf_FerFFP[ivr], "*sposta_*Utente")
                              DEL_VAR_MODIFICATE(mdf_FerFFP[ivr], "VarsUser__")
                              DEL_VAR(mdf_FerFFP[ivr], "VarsUser__")
                              mdf_found_modif = -1
                             }
                         }
                     ivr = ivr+1
                     }
                  if (mdf_found_modif > 0)
                     {
                      COMANDO2(STRCAT("VAR_CHANGE 1 ", STR(idx_att), " indice_riga=", STR(VAR_VAL(idx_att, "indice_riga"))))
                      MdF_comandoOnAUTO = -2
                      COMANDO(STRCAT("NO_AUTO ", STR(idx_att)))
                     }
                 }
             }
         }

      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_ADD_when"), "first_OnMacroMdF") )
         { MdF_ADD_when = "RE_Control" }

      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)
         {
          MdF_ADD_when = "RE_Control"
          mdf_ricalc_Post_READD = 0
         }
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_FerramenteXYZ  fer1
   {
      @escluso = 1
      if (px_FerFro1 != -999  |  py_FerFro1 != -999  |  pz_FerFro1 != -999)  { @escluso = 0 }
      if (px_FerFia1 != -999  |  py_FerFia1 != -999  |  pz_FerFia1 != -999)  { @escluso = 0 }
      if (px_FerPia1 != -999  |  py_FerPia1 != -999  |  pz_FerPia1 != -999)  { @escluso = 0 }

      @base_0 = base_0

      @X = X
      @Y = Y
      @Z = Z
      @px_FerFro = px_FerFro1
      @py_FerFro = py_FerFro1
      @pz_FerFro = pz_FerFro1
      @px_FerFia = px_FerFia1
      @py_FerFia = py_FerFia1
      @pz_FerFia = pz_FerFia1
      @px_FerPia = px_FerPia1
      @py_FerPia = py_FerPia1
      @pz_FerPia = pz_FerPia1
      @X_FerFro = X_FerFro1
      @Y_FerFro = Y_FerFro1
      @Z_FerFro = Z_FerFro1
      @X_FerFia = X_FerFia1
      @Y_FerFia = Y_FerFia1
      @Z_FerFia = Z_FerFia1
      @X_FerPia = X_FerPia1
      @Y_FerPia = Y_FerPia1
      @Z_FerPia = Z_FerPia1
      @Battuta_X_Sx = Battuta_X_Sx
      @Battuta_X_Dx = Battuta_X_Dx
      @Battuta_Y = Battuta_Y
      @Battuta_Z = Battuta_Z
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Fer = VAR_VAL(idx_att, "indice_riga")
   }

   Posiziona MdF_FerramenteXYZ  fer2
   {
      @escluso = 1
      if (px_FerFro2 != -999  |  py_FerFro2 != -999  |  pz_FerFro2 != -999)  { @escluso = 0 }
      if (px_FerFia2 != -999  |  py_FerFia2 != -999  |  pz_FerFia2 != -999)  { @escluso = 0 }
      if (px_FerPia2 != -999  |  py_FerPia2 != -999  |  pz_FerPia2 != -999)  { @escluso = 0 }

      @base_0 = base_0

      @X = X
      @Y = Y
      @Z = Z
      @px_FerFro = px_FerFro2
      @py_FerFro = py_FerFro2
      @pz_FerFro = pz_FerFro2
      @px_FerFia = px_FerFia2
      @py_FerFia = py_FerFia2
      @pz_FerFia = pz_FerFia2
      @px_FerPia = px_FerPia2
      @py_FerPia = py_FerPia2
      @pz_FerPia = pz_FerPia2
      @X_FerFro = X_FerFro2
      @Y_FerFro = Y_FerFro2
      @Z_FerFro = Z_FerFro2
      @X_FerFia = X_FerFia2
      @Y_FerFia = Y_FerFia2
      @Z_FerFia = Z_FerFia2
      @X_FerPia = X_FerPia2
      @Y_FerPia = Y_FerPia2
      @Z_FerPia = Z_FerPia2
      @Battuta_X_Sx = Battuta_X_Sx
      @Battuta_X_Dx = Battuta_X_Dx
      @Battuta_Y = Battuta_Y
      @Battuta_Z = Battuta_Z
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Fer = VAR_VAL(idx_att, "indice_riga")+1
   }

   Posiziona MdF_FerramenteXYZ  fer3
   {
      @escluso = 1
      if (px_FerFro3 != -999  |  py_FerFro3 != -999  |  pz_FerFro3 != -999)  { @escluso = 0 }
      if (px_FerFia3 != -999  |  py_FerFia3 != -999  |  pz_FerFia3 != -999)  { @escluso = 0 }
      if (px_FerPia3 != -999  |  py_FerPia3 != -999  |  pz_FerPia3 != -999)  { @escluso = 0 }

      @base_0 = base_0

      @X = X
      @Y = Y
      @Z = Z
      @px_FerFro = px_FerFro3
      @py_FerFro = py_FerFro3
      @pz_FerFro = pz_FerFro3
      @px_FerFia = px_FerFia3
      @py_FerFia = py_FerFia3
      @pz_FerFia = pz_FerFia3
      @px_FerPia = px_FerPia3
      @py_FerPia = py_FerPia3
      @pz_FerPia = pz_FerPia3
      @X_FerFro = X_FerFro3
      @Y_FerFro = Y_FerFro3
      @Z_FerFro = Z_FerFro3
      @X_FerFia = X_FerFia3
      @Y_FerFia = Y_FerFia3
      @Z_FerFia = Z_FerFia3
      @X_FerPia = X_FerPia3
      @Y_FerPia = Y_FerPia3
      @Z_FerPia = Z_FerPia3
      @Battuta_X_Sx = Battuta_X_Sx
      @Battuta_X_Dx = Battuta_X_Dx
      @Battuta_Y = Battuta_Y
      @Battuta_Z = Battuta_Z
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Fer = VAR_VAL(idx_att, "indice_riga")+2
   }

   Posiziona MdF_FerramenteXYZ  fer4
   {
      @escluso = 1
      if (px_FerFro4 != -999  |  py_FerFro4 != -999  |  pz_FerFro4 != -999)  { @escluso = 0 }
      if (px_FerFia4 != -999  |  py_FerFia4 != -999  |  pz_FerFia4 != -999)  { @escluso = 0 }
      if (px_FerPia4 != -999  |  py_FerPia4 != -999  |  pz_FerPia4 != -999)  { @escluso = 0 }

      @base_0 = base_0

      @X = X
      @Y = Y
      @Z = Z
      @px_FerFro = px_FerFro4
      @py_FerFro = py_FerFro4
      @pz_FerFro = pz_FerFro4
      @px_FerFia = px_FerFia4
      @py_FerFia = py_FerFia4
      @pz_FerFia = pz_FerFia4
      @px_FerPia = px_FerPia4
      @py_FerPia = py_FerPia4
      @pz_FerPia = pz_FerPia4
      @X_FerFro = X_FerFro4
      @Y_FerFro = Y_FerFro4
      @Z_FerFro = Z_FerFro4
      @X_FerFia = X_FerFia4
      @Y_FerFia = Y_FerFia4
      @Z_FerFia = Z_FerFia4
      @X_FerPia = X_FerPia4
      @Y_FerPia = Y_FerPia4
      @Z_FerPia = Z_FerPia4
      @Battuta_X_Sx = Battuta_X_Sx
      @Battuta_X_Dx = Battuta_X_Dx
      @Battuta_Y = Battuta_Y
      @Battuta_Z = Battuta_Z
      @KeyFamRegFacc = KeyFamRegFacc
      @id_Fer = VAR_VAL(idx_att, "indice_riga")+3
   }

   Procedura MdF_noAUTO
   {
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          MdF_comandoOnAUTO = 2
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Procedura MdF_Ctrl_Post_RELATIVE_ADD
   {
      GOSUB MdF_Ctrl_Post_RELATIVE_ADD
   }

   Procedura MdF_Ctrl_ADD_TooEarly
   {
      GOSUB MdF_Ctrl_ADD_TooEarly
   }

   Procedura MdF_Ctrl_Cambiamenti
   {
      if (VAR_EXIST(idx_att, "MdF_Cambiato") != 1)  { EXITSUB() }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "FerFro"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "FerFia"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "FerPia"
      GOSUB MdF_Variabili

      GOSUB MdF_Battuta_X
      GOSUB Reg_pos_Ferramente
      GOSUB MdF_Battuta_X_After_RegFacc

      MdF_Cambiato_att = VAR_VAL_STR(idx_att, "MdF_Cambiato")
      bas0_att = base_0.y
      alt0_att = alto_0.y
      bas0_CamMdF = VAR_VAL(idx_CamMdF, "base_0.y")
      alt0_CamMdF = VAR_VAL(idx_CamMdF, "alto_0.y")
      if ( bas0_att == bas0_CamMdF  &  alt0_att == alt0_CamMdF
         & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "Dim*") != 1
         )
         { DEL_VAR(idx_att, "MdF_Cambiato") }

      if ( STRCMP(KeyFamRegFacc_FerFro_att, KeyFamRegFacc_FerFro) != 0
         | STRCMP(KeyFamRegFacc_FerFia_att, KeyFamRegFacc_FerFia) != 0
         | STRCMP(KeyFamRegFacc_FerPia_att, KeyFamRegFacc_FerPia) != 0
         | STRCMP(MdF_Aper_att, MdF_Apertura) != 0
         | X_att != X
         | Y_att != Y
         | px_FerFro1_att != px_FerFro1
         | py_FerFro1_att != py_FerFro1
         | pz_FerFro1_att != pz_FerFro1
         | px_FerFro2_att != px_FerFro2
         | py_FerFro2_att != py_FerFro2
         | pz_FerFro2_att != pz_FerFro2
         | px_FerFia1_att != px_FerFia1
         | py_FerFia1_att != py_FerFia1
         | pz_FerFia1_att != pz_FerFia1
         | px_FerFia2_att != px_FerFia2
         | py_FerFia2_att != py_FerFia2
         | pz_FerFia2_att != pz_FerFia2
         | px_FerPia1_att != px_FerPia1
         | py_FerPia1_att != py_FerPia1
         | pz_FerPia1_att != pz_FerPia1
         | px_FerPia2_att != px_FerPia2
         | py_FerPia2_att != py_FerPia2
         | pz_FerPia2_att != pz_FerPia2
         | px_FerFro3_att != px_FerFro3
         | py_FerFro3_att != py_FerFro3
         | pz_FerFro3_att != pz_FerFro3
         | px_FerFro4_att != px_FerFro4
         | py_FerFro4_att != py_FerFro4
         | pz_FerFro4_att != pz_FerFro4
         | px_FerFia3_att != px_FerFia3
         | py_FerFia3_att != py_FerFia3
         | pz_FerFia3_att != pz_FerFia3
         | px_FerFia4_att != px_FerFia4
         | py_FerFia4_att != py_FerFia4
         | pz_FerFia4_att != pz_FerFia4
         | px_FerPia3_att != px_FerPia3
         | py_FerPia3_att != py_FerPia3
         | pz_FerPia3_att != pz_FerPia3
         | px_FerPia4_att != px_FerPia4
         | py_FerPia4_att != py_FerPia4
         | pz_FerPia4_att != pz_FerPia4
         )
         {
          WITH_VAR_LOCAL(idx_att, "mdf_Visgraf", "escl_Grafica", 2, 1, "0")

          if (mdf_Visgraf <= 0)
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          else
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          MdF_Cambiato_att = STRCAT(MdF_Cambiato_att, " , Ricalcolato")
         }
   }

  // 31.01.2025 ScBgn1057149 Cricchetto Pensile spostato a terra deve andare in alto. Lo fa solo ricaricando l' ordine
   Procedura OffsetLocale
   {
      if (VAR_VAL(PADRE(idx_att, 1), "base_0.y") != VAR_VAL(PADRE(idx_att, 1), "mdf_Ctrl_base0y_prec") )
         {
          COMANDO2(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_agganciati", " // ", NOME(idx_att), " OffsetLocale x cambio base_0.y"))
         }
   }
}

Elemento MdF_FerramenteXYZ
{
   Descrizione = "Contenitore grafica Ferramente"
   Code        = GRANT
   Gruppo      = "TMP"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   Alias       OnChangedVar

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22
      HIDE  ""  1

      px_FerFro         "Rientro Ferramenta in X su Frontale"       -999
      py_FerFro         "Rientro Ferramenta in Y su Frontale"       -999
      pz_FerFro         "Rientro Ferramenta in Z su Frontale"       -999
      px_FerFia         "Rientro Ferramenta in X su Verticale"      -999
      py_FerFia         "Rientro Ferramenta in Y su Verticale"      -999
      pz_FerFia         "Rientro Ferramenta in Z su Verticale"      -999
      px_FerPia         "Rientro Ferramenta in X su Piano"          -999
      py_FerPia         "Rientro Ferramenta in Y su Piano"          -999
      pz_FerPia         "Rientro Ferramenta in Z su Piano"          -999

      X_FerFro          "Dim X Frontale"                            0
      Y_FerFro          "Dim Y Frontale"                            0
      Z_FerFro          "Dim Z Frontale"                            0
      X_FerFia          "Dim X Verticale"                           0
      Y_FerFia          "Dim Y Verticale"                           0
      Z_FerFia          "Dim Z Verticale"                           0
      X_FerPia          "Dim X Piano"                               0
      Y_FerPia          "Dim Y Piano"                               0
      Z_FerPia          "Dim Z Piano"                               0

      Battuta_X_Sx      "battuta Sx su Fia di aggancio"             0
      Battuta_X_Dx      "battuta Dx su Fia di aggancio"             0
      Battuta_Y         "battuta in Y su Pia di aggancio"           0
      Battuta_Z         "battuta in Z su Fia,Pia"                   0

      id_Fer            "identificativo per CHIAVE_TAB_CAM"         0

      KeyFamRegFacc     "tipo posizionamento cerniere"             ""

      M4_NO_OFFS        "Sezione Posizone Disabilitata"            1

     // 10.09.2024
      sposta_X_Fro_Utente  "Spostamento X Fro da Utente"   0 ShowAlways
      sposta_Y_Fro_Utente  "Spostamento Y Fro da Utente"   0 ShowAlways
      sposta_Z_Fro_Utente  "Spostamento Z Fro da Utente"   0 ShowAlways
      sposta_X_Fia_Utente  "Spostamento X Fia da Utente"   0 ShowAlways
      sposta_Y_Fia_Utente  "Spostamento Y Fia da Utente"   0 ShowAlways
      sposta_Z_Fia_Utente  "Spostamento Z Fia da Utente"   0 ShowAlways
      sposta_X_Pia_Utente  "Spostamento X Pia da Utente"   0 ShowAlways
      sposta_Y_Pia_Utente  "Spostamento Y Pia da Utente"   0 ShowAlways
      sposta_Z_Pia_Utente  "Spostamento Z Pia da Utente"   0 ShowAlways

      mdf_modif_Ute    "modifiche da Utente"       0
      MdF_Utente       "Gestione cer da utente"    "-1"  NoSave

      spazioEdit1      " "                          "" ShowAlways
      spazioEdit2      " "                          "" ShowAlways

      posX_Fro_attualeReg  "-- Pos X Fro da RegolaCAM --"  0 ShowAlways
      posY_Fro_attualeReg  "-- Pos Y Fro da RegolaCAM --"  0 ShowAlways
      posZ_Fro_attualeReg  "-- Pos Z Fro da RegolaCAM --"  0 ShowAlways
      posX_Fro_New         ">  Pos X Fro Nuova Utente  <"  0 ShowAlways
      posY_Fro_New         ">  Pos Y Fro Nuova Utente  <"  0 ShowAlways
      posZ_Fro_New         ">  Pos Z Fro Nuova Utente  <"  0 ShowAlways

      spazioEdit3          " "                             "" ShowAlways
      posX_Fia_attualeReg  "-- Pos X Fia da RegolaCAM --"  0 ShowAlways
      posY_Fia_attualeReg  "-- Pos Y Fia da RegolaCAM --"  0 ShowAlways
      posZ_Fia_attualeReg  "-- Pos Z Fia da RegolaCAM --"  0 ShowAlways
      posX_Fia_New         ">  Pos X Fia Nuova Utente  <"  0 ShowAlways
      posY_Fia_New         ">  Pos Y Fia Nuova Utente  <"  0 ShowAlways
      posZ_Fia_New         ">  Pos Z Fia Nuova Utente  <"  0 ShowAlways

      spazioEdit4          " "                             "" ShowAlways
      posX_Pia_attualeReg  "-- Pos X Pia da RegolaCAM --"  0 ShowAlways
      posY_Pia_attualeReg  "-- Pos Y Pia da RegolaCAM --"  0 ShowAlways
      posZ_Pia_attualeReg  "-- Pos Z Pia da RegolaCAM --"  0 ShowAlways
      posX_Pia_New         ">  Pos X Pia Nuova Utente  <"  0 ShowAlways
      posY_Pia_New         ">  Pos Y Pia Nuova Utente  <"  0 ShowAlways
      posZ_Pia_New         ">  Pos Z Pia Nuova Utente  <"  0 ShowAlways
   }

   Controlli
   {
      if (ACTION() <= 0)  { EXITSUB() }

      HIDE = 1
      if (VAR_VAL(PADRE(idx_att, 1), "HIDE") == 3)  { HIDE = 2 }

      MdF_Utente = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Utente")

      //posX_Fro_attualeReg = px_FerFro
      //posY_Fro_attualeReg = py_FerFro
      //posZ_Fro_attualeReg = pz_FerFro
      //
      //posX_Fia_attualeReg = px_FerFia
      //posY_Fia_attualeReg = py_FerFia
      //posZ_Fia_attualeReg = pz_FerFia
      //
      //posX_Pia_attualeReg = px_FerPia
      //posY_Pia_attualeReg = py_FerPia
      //posZ_Pia_attualeReg = pz_FerPia

      posX_Fro_attualeReg = VAR_VAL(PADRE(idx_att, 1), STRCAT("px_FerFro",STR(id_Fer)) )
      posY_Fro_attualeReg = VAR_VAL(PADRE(idx_att, 1), STRCAT("py_FerFro",STR(id_Fer)) )
      posZ_Fro_attualeReg = VAR_VAL(PADRE(idx_att, 1), STRCAT("pz_FerFro",STR(id_Fer)) )

      posX_Fia_attualeReg = VAR_VAL(PADRE(idx_att, 1), STRCAT("px_FerFia",STR(id_Fer)) )
      posY_Fia_attualeReg = VAR_VAL(PADRE(idx_att, 1), STRCAT("py_FerFia",STR(id_Fer)) )
      posZ_Fia_attualeReg = VAR_VAL(PADRE(idx_att, 1), STRCAT("pz_FerFia",STR(id_Fer)) )

      posX_Pia_attualeReg = VAR_VAL(PADRE(idx_att, 1), STRCAT("px_FerPia",STR(id_Fer)) )
      posY_Pia_attualeReg = VAR_VAL(PADRE(idx_att, 1), STRCAT("py_FerPia",STR(id_Fer)) )
      posZ_Pia_attualeReg = VAR_VAL(PADRE(idx_att, 1), STRCAT("pz_FerPia",STR(id_Fer)) )

      px_FerFro = px_FerFro + sposta_X_Fro_Utente
      py_FerFro = py_FerFro + sposta_Y_Fro_Utente
      pz_FerFro = pz_FerFro + sposta_Z_Fro_Utente

      px_FerFia = px_FerFia + sposta_X_Fia_Utente
      py_FerFia = py_FerFia + sposta_Y_Fia_Utente
      pz_FerFia = pz_FerFia + sposta_Z_Fia_Utente

      px_FerPia = px_FerPia + sposta_X_Pia_Utente
      py_FerPia = py_FerPia + sposta_Y_Pia_Utente
      pz_FerPia = pz_FerPia + sposta_Z_Pia_Utente

     // 10.09.2024
      mdf_LivSpostaCerUte = VAR_VAL(PADRE(idx_att, 2), "MdfSys_LivSpostaCerUte")
      mdf_CER_posX_Fro_SpostataUtente = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_posX_Fro_SpostataUtente", STR(id_Fer)))
      if (mdf_LivSpostaCerUte > 2)
         {
          if (sposta_X_Fro_Utente == 0)
             {
              if (sposta_X_Fro_Utente == 0)
                 { sposta_X_Fro_Utente = mdf_CER_posX_Fro_SpostataUtente }
             }
          if (VAR_VAL(idx_att, "sposta_X_Fro_Utente") != mdf_CER_posX_Fro_SpostataUtente)
             {
              COMANDO2(STRCAT("VAR_CHANGE 1 ", STR(PADRE(idx_att, mdf_LivSpostaCerUte)), " MDF_CER_posX_Fro_SpostataUtente", STR(id_Fer), "=", STR(sposta_X_Utente)))
              if (mdf_modif_Ute == 0)  { mdf_modif_Ute = 1 }
             }
          // Perchè salvo MDF_CER_posX_SpostataUtente sul padre mdf_LivSpostaCerUte altrimenti Caricamento Ordine con Errori
          DEL_VAR_MODIFICATE(idx_att, "sposta_X_Fro_Utente")
         }

     // 10.09.2024
      HIDE_ON_EDIT(idx_att, "sposta_X_Fro_Utente", 1)
      HIDE_ON_EDIT(idx_att, "sposta_Y_Fro_Utente", 1)
      HIDE_ON_EDIT(idx_att, "sposta_Z_Fro_Utente", 1)
      HIDE_ON_EDIT(idx_att, "posX_Fro_New", 1)
      HIDE_ON_EDIT(idx_att, "posY_Fro_New", 1)
      HIDE_ON_EDIT(idx_att, "posZ_Fro_New", 1)
      HIDE_ON_EDIT(idx_att, "posX_Fro_attualeReg", 1)
      HIDE_ON_EDIT(idx_att, "posY_Fro_attualeReg", 1)
      HIDE_ON_EDIT(idx_att, "posZ_Fro_attualeReg", 1)

      HIDE_ON_EDIT(idx_att, "sposta_X_Fia_Utente", 1)
      HIDE_ON_EDIT(idx_att, "sposta_Y_Fia_Utente", 1)
      HIDE_ON_EDIT(idx_att, "sposta_Z_Fia_Utente", 1)
      HIDE_ON_EDIT(idx_att, "posX_Fia_New", 1)
      HIDE_ON_EDIT(idx_att, "posY_Fia_New", 1)
      HIDE_ON_EDIT(idx_att, "posZ_Fia_New", 1)
      HIDE_ON_EDIT(idx_att, "posX_Fia_attualeReg", 1)
      HIDE_ON_EDIT(idx_att, "posY_Fia_attualeReg", 1)
      HIDE_ON_EDIT(idx_att, "posZ_Fia_attualeReg", 1)

      HIDE_ON_EDIT(idx_att, "sposta_X_Pia_Utente", 1)
      HIDE_ON_EDIT(idx_att, "sposta_Y_Pia_Utente", 1)
      HIDE_ON_EDIT(idx_att, "sposta_Z_Pia_Utente", 1)
      HIDE_ON_EDIT(idx_att, "posX_Pia_New", 1)
      HIDE_ON_EDIT(idx_att, "posY_Pia_New", 1)
      HIDE_ON_EDIT(idx_att, "posZ_Pia_New", 1)
      HIDE_ON_EDIT(idx_att, "posX_Pia_attualeReg", 1)
      HIDE_ON_EDIT(idx_att, "posY_Pia_attualeReg", 1)
      HIDE_ON_EDIT(idx_att, "posZ_Pia_attualeReg", 1)

      DescEdit__ = STRCAT("Ferramenta_FroFiaPia_", STR(id_Fer))
      if ( STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerFro")) > 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerFia")) < 1
         & STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerPia")) < 1
         )
         {
          DescEdit__ = STRCAT("Ferramenta_Fro_", STR(id_Fer), "_", VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerFro"))
         }
      if ( STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerFro")) < 1
         & STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerFia")) > 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerPia")) < 1
         )
         {
          DescEdit__ = STRCAT("Ferramenta_Fia_", STR(id_Fer), "_", VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerFia"))
         }
      if ( STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerFro")) < 1
         & STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerFia")) < 1
         & STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerPia")) > 0
         )
         {
          DescEdit__ = STRCAT("Ferramenta_Pia_", STR(id_Fer), "_", VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerPia"))
         }

      if (UN_PADRE("MECC*UTENTE*") )
         {
          HIDE = 1
          DescEdit__ = STRCAT("Ferramenta_FroFiaPia_UTE")
         }
      posX_Fro_New = posX_Fro_attualeReg + sposta_X_Fro_Utente
      posY_Fro_New = posY_Fro_attualeReg + sposta_Y_Fro_Utente
      posZ_Fro_New = posZ_Fro_attualeReg + sposta_Z_Fro_Utente

      posX_Fia_New = posX_Fia_attualeReg + sposta_X_Fia_Utente
      posY_Fia_New = posY_Fia_attualeReg + sposta_Y_Fia_Utente
      posZ_Fia_New = posZ_Fia_attualeReg + sposta_Z_Fia_Utente

      posX_Pia_New = posX_Pia_attualeReg + sposta_X_Pia_Utente
      posY_Pia_New = posY_Pia_attualeReg + sposta_Y_Pia_Utente
      posZ_Pia_New = posZ_Pia_attualeReg + sposta_Z_Pia_Utente

      if (UN_PADRE("MECC*UTENTE*") != 1)
         {
          str_max_X = STR(VAR_VAL(PADRE(idx_att, 2), "X")/2)
          str_max_Y = STR(VAR_VAL(PADRE(idx_att, 2), "Y")/2)
          str_max_Z = STR(VAR_VAL(PADRE(idx_att, 2), "Z")+5 )

          if (STR_INDEX_OF(MdF_Utente, 0, "FerFro") > -1)
             {
              if (STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerFro")) > 1)
                 {
                  VAR_SET_MODE(idx_att, "sposta_X_Fro_Utente", $MODE_USER)
                  VAR_SET_MENU(idx_att, "sposta_X_Fro_Utente", STRCAT("( -", str_max_X, " )"))
                  VAR_SET_MODE(idx_att, "sposta_Y_Fro_Utente", $MODE_USER)
                  VAR_SET_MENU(idx_att, "sposta_Y_Fro_Utente", STRCAT("( -", str_max_Y, " )"))
                  VAR_SET_MODE(idx_att, "sposta_Z_Fro_Utente", $MODE_USER)
                  VAR_SET_MENU(idx_att, "sposta_Z_Fro_Utente", STRCAT("( -", str_max_Z, " )"))

                  HIDE_ON_EDIT(idx_att, "posX_Fro_attualeReg", 0)
                  HIDE_ON_EDIT(idx_att, "posY_Fro_attualeReg", 0)
                  HIDE_ON_EDIT(idx_att, "posZ_Fro_attualeReg", 0)
                  HIDE_ON_EDIT(idx_att, "posX_Fro_New", 0)
                  HIDE_ON_EDIT(idx_att, "posY_Fro_New", 0)
                  HIDE_ON_EDIT(idx_att, "posZ_Fro_New", 0)
                 }
             }
          if (STR_INDEX_OF(MdF_Utente, 0, "FerFia") > -1)
             {
              if (STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerFia")) > 1)
                 {
                  VAR_SET_MODE(idx_att, "sposta_X_Fia_Utente", $MODE_USER)
                  VAR_SET_MENU(idx_att, "sposta_X_Fia_Utente", STRCAT("( -", str_max_X, " )"))
                  VAR_SET_MODE(idx_att, "sposta_Y_Fia_Utente", $MODE_USER)
                  VAR_SET_MENU(idx_att, "sposta_Y_Fia_Utente", STRCAT("( -", str_max_Y, " )"))
                  VAR_SET_MODE(idx_att, "sposta_Z_Fia_Utente", $MODE_USER)
                  VAR_SET_MENU(idx_att, "sposta_Z_Fia_Utente", STRCAT("( -", str_max_Z, " )"))

                  HIDE_ON_EDIT(idx_att, "posX_Fia_attualeReg", 0)
                  HIDE_ON_EDIT(idx_att, "posY_Fia_attualeReg", 0)
                  HIDE_ON_EDIT(idx_att, "posZ_Fia_attualeReg", 0)
                  HIDE_ON_EDIT(idx_att, "posX_Fia_New", 0)
                  HIDE_ON_EDIT(idx_att, "posY_Fia_New", 0)
                  HIDE_ON_EDIT(idx_att, "posZ_Fia_New", 0)
                 }
             }
          if (STR_INDEX_OF(MdF_Utente, 0, "FerPia") > -1)
             {
              if (STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerPia")) > 1)
                 {
                  VAR_SET_MODE(idx_att, "sposta_X_Pia_Utente", $MODE_USER)
                  VAR_SET_MENU(idx_att, "sposta_X_Pia_Utente", STRCAT("( -", str_max_X, " )"))
                  VAR_SET_MODE(idx_att, "sposta_Y_Pia_Utente", $MODE_USER)
                  VAR_SET_MENU(idx_att, "sposta_Y_Pia_Utente", STRCAT("( -", str_max_Y, " )"))
                  VAR_SET_MODE(idx_att, "sposta_Z_Pia_Utente", $MODE_USER)
                  VAR_SET_MENU(idx_att, "sposta_Z_Pia_Utente", STRCAT("( -", str_max_Z, " )"))
                  HIDE_ON_EDIT(idx_att, "posX_Pia_attualeReg", 0)
                  HIDE_ON_EDIT(idx_att, "posY_Pia_attualeReg", 0)
                  HIDE_ON_EDIT(idx_att, "posZ_Pia_attualeReg", 0)
                  HIDE_ON_EDIT(idx_att, "posX_Pia_New", 0)
                  HIDE_ON_EDIT(idx_att, "posY_Pia_New", 0)
                  HIDE_ON_EDIT(idx_att, "posZ_Pia_New", 0)
                 }
             }
         }

      if (VAR_EXIST(idx_att, "sposta_X_Fro_Utente_prec") != 1)
         {
          sposta_X_Fro_Utente_prec = sposta_X_Fro_Utente
          sposta_Y_Fro_Utente_prec = sposta_Y_Fro_Utente
          sposta_Z_Fro_Utente_prec = sposta_Z_Fro_Utente
          sposta_X_Fia_Utente_prec = sposta_X_Fia_Utente
          sposta_Y_Fia_Utente_prec = sposta_Y_Fia_Utente
          sposta_Z_Fia_Utente_prec = sposta_Z_Fia_Utente
          sposta_X_Pia_Utente_prec = sposta_X_Pia_Utente
          sposta_Y_Pia_Utente_prec = sposta_Y_Pia_Utente
          sposta_Z_Pia_Utente_prec = sposta_Z_Pia_Utente
         }

      if ( VAR_VAL(idx_att, "sposta_X_Fro_Utente_prec") != sposta_X_Fro_Utente
         | VAR_VAL(idx_att, "sposta_Y_Fro_Utente_prec") != sposta_Y_Fro_Utente
         | VAR_VAL(idx_att, "sposta_Z_Fro_Utente_prec") != sposta_Z_Fro_Utente
         | VAR_VAL(idx_att, "sposta_X_Fia_Utente_prec") != sposta_X_Fia_Utente
         | VAR_VAL(idx_att, "sposta_Y_Fia_Utente_prec") != sposta_Y_Fia_Utente
         | VAR_VAL(idx_att, "sposta_Z_Fia_Utente_prec") != sposta_Z_Fia_Utente
         | VAR_VAL(idx_att, "sposta_X_Pia_Utente_prec") != sposta_X_Pia_Utente
         | VAR_VAL(idx_att, "sposta_Y_Pia_Utente_prec") != sposta_Y_Pia_Utente
         | VAR_VAL(idx_att, "sposta_Z_Pia_Utente_prec") != sposta_Z_Pia_Utente
         )
         {
          sposta_X_Fro_Utente_prec = sposta_X_Fro_Utente
          sposta_Y_Fro_Utente_prec = sposta_Y_Fro_Utente
          sposta_Z_Fro_Utente_prec = sposta_Z_Fro_Utente
          sposta_X_Fia_Utente_prec = sposta_X_Fia_Utente
          sposta_Y_Fia_Utente_prec = sposta_Y_Fia_Utente
          sposta_Z_Fia_Utente_prec = sposta_Z_Fia_Utente
          sposta_X_Pia_Utente_prec = sposta_X_Pia_Utente
          sposta_Y_Pia_Utente_prec = sposta_Y_Pia_Utente
          sposta_Z_Pia_Utente_prec = sposta_Z_Pia_Utente
          if ( STR_INDEX_OF(MdF_Utente, 0, "FerFro") > -1
             | STR_INDEX_OF(MdF_Utente, 0, "FerFia") > -1
             | STR_INDEX_OF(MdF_Utente, 0, "FerPia") > -1
             )
             {
              if (mdf_LivSpostaCerUte <= 2)
                 {
                  COMANDO2(STRCAT("VAR_CHANGE 1 ", STR(PADRE(idx_att, 1)), " indice_riga=", STR(VAR_VAL(PADRE(idx_att, 1), "indice_riga"))))
                  if (VAR_VAL(PADRE(idx_att, 1), "MdF_comandoOnAUTO") > 0)
                     {
                      COMANDO2(STRCAT("NO_AUTO ", STR(PADRE(idx_att, 1))))

                      //COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " x modifiche_Utente"))
                     }
                 }
             }
         }
   }

   PuntiNotevoli
   {
      idx_att = ATTUALE()
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_FerramentaSuAnta ferA
   {
      @escluso = 1
      if (px_FerFro != -999)  { @escluso = 0 }
      if (py_FerFro != -999)  { @escluso = 0 }
      if (pz_FerFro != -999)  { @escluso = 0 }

      @X = X_FerFro
      @Y = Y_FerFro
      @Z = Z_FerFro

      //@Off_X_Fer = (X-X_FerFro)/2
      //if (X_FerFro < X/2  |  px_FerFro > X/2)               { @Off_X_Fer = X_FerFro/2 }
      //if (px_FerFro-X_FerFro/2 < 0)                         { @Off_X_Fer = px_FerFro }
      //if (px_FerFro+X_FerFro > X  &  px_FerFro > X_FerFro)  { @Off_X_Fer = X-px_FerFro+X_FerFro/2 }
      //if (px_FerFro+X_FerFro > X  &  X_FerFro > px_FerFro)  { @Off_X_Fer = px_FerFro }
      //
      //@Off_Y_Fer = (Y-Y_FerFro)/2
      //if (Y_FerFro < Y/2  |  py_FerFro > Y/2)               { @Off_Y_Fer = Y_FerFro/2 }
      //if (py_FerFro-Y_FerFro/2 < 0)                         { @Off_Y_Fer = py_FerFro }
      //if (py_FerFro+Y_FerFro > Y  &  py_FerFro > Y_FerFro)  { @Off_Y_Fer = Y-py_FerFro+Y_FerFro/2 }
      //if (py_FerFro+Y_FerFro > Y  &  Y_FerFro > py_FerFro)  { @Off_Y_Fer = py_FerFro }

      @base_0 = base_0
      //@base_0.x = base_0.x + px_FerFro - @Off_X_Fer
      //@base_0.y = base_0.y + py_FerFro - @Off_Y_Fer
      @base_0.x = base_0.x + px_FerFro
      @base_0.y = base_0.y + py_FerFro
      @base_0.z = base_0.z - @Z
      if (pz_FerFro != 0)  { @base_0.z = base_0.z - pz_FerFro }

      //@Off_X_Fer = Lav_offx_FerFro
      //@Off_Y_Fer = Lav_offy_FerFro
      @id_Fer = id_Fer
   }

   Posiziona MdF_FerramentaSuFianco  ferF
   {
      @escluso = 1
      if (px_FerFia != -999)  { @escluso = 0 }
      if (py_FerFia != -999)  { @escluso = 0 }
      if (pz_FerFia != -999)  { @escluso = 0 }

      @X = X_FerFia
      @Y = Y_FerFia
      @Z = Z_FerFia
      //@Y_Fer = Y_FerFia
      //@Z_Fer = Z_FerFia

      @Off_Y_Fer = (Y-Y_FerFia)/2
      if (Y_FerFia < Y/2  |  py_FerFia > Y/2)               { @Off_Y_Fer = Y_FerFia/2 }
      if (py_FerFia-Y_FerFia/2 < 0)                         { @Off_Y_Fer = py_FerFia }
      if (py_FerFia+Y_FerFia > Y  &  py_FerFia > Y_FerFia)  { @Off_Y_Fer = Y-py_FerFia+Y_FerFia/2 }
      if (py_FerFia+Y_FerFia > Y  &  Y_FerFia > py_FerFia)  { @Off_Y_Fer = py_FerFia }

      @Off_Z_Fer = (Z-Z_FerFia)/2
      if (Z_FerFia < Z/2  |  pz_FerFia > Z/2)               { @Off_Z_Fer = Z_FerFia/2 }
      if (pz_FerFia-Z_FerFia/2 < 0)                         { @Off_Z_Fer = pz_FerFia }
      if (pz_FerFia+Z_FerFia > Z  &  pz_FerFia > Z_FerFia)  { @Off_Z_Fer = Z-pz_FerFia+Z_FerFia/2 }
      if (pz_FerFia+Z_FerFia > Z  &  Z_FerFia > pz_FerFia)  { @Off_Z_Fer = pz_FerFia }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X_Sx
      //@base_0.y = base_0.y + py_FerFia - @Off_Y_Fer
      //@base_0.z = base_0.z - pz_FerFia - @Off_Z_Fer
      @base_0.y = base_0.y + py_FerFia
      @base_0.z = base_0.z - @Z
      if (px_FerFro > X/2)
         { @base_0.x = base_3.x - Battuta_X_Dx - @X }

      if (px_FerFia != 0)     { @base_0.x = base_0.x + px_FerFia }
      if (px_FerFia == 9999)  { @base_0.x = base_3.x - Battuta_X_Dx - @X }

      @id_Fer = id_Fer
      @pz_FerFia = pz_FerFia

     // 27.07
      if (VAR_VAL(PADRE(idx_att, 1), "MdF_angoloBas") != 0)
         {
          @ang_y = -1*VAR_VAL(PADRE(idx_att, 1), "MdF_angoloBas")
          @CAM_Lav_offx_Ang = -@Z*SENO(@ang_y)
          @CAM_Lav_offz_Ang = -@X*COSENO(@ang_y)
          if (ABS(@ang_y) >= 90)
             { @CAM_Lav_offz_Ang = -ABS(@Z*SENO(@ang_y)) }
          // Pens Ang45
          if (px_FerFro > X/2)
             {
              @base_0.x = base_3.x - Battuta_X_Dx - @X
              //@base_0.z = base_2.z - @Z
              @base_0.z = base_0.z - @Z
              if (VAR_VAL(PADRE(idx_att, 1), "MdF_angoloBas") < 0)
                 { @ang_y = VAR_VAL(PADRE(idx_att, 1), "MdF_angoloBas") }
              //@CAM_Lav_offx_Ang = -@Z*SENO(@ang_y) - @X
             }
         }
   }

   Posiziona MdF_FerramentaSuPiano  ferP
   {
      @escluso = 1
      if (px_FerPia != -999)  { @escluso = 0 }
      if (py_FerPia != -999)  { @escluso = 0 }
      if (pz_FerPia != -999)  { @escluso = 0 }

      @X = X_FerPia
      @Y = Y_FerPia
      @Z = Z_FerPia
      //@X_Fer = X_FerPia
      //@Z_Fer = Z_FerPia

      @Off_X_Fer = (X-X_FerPia)/2
      if (X_FerPia < X/2  |  px_FerPia > X/2)               { @Off_X_Fer = X_FerPia/2 }
      if (px_FerPia-X_FerPia/2 < 0)                         { @Off_X_Fer = px_FerPia }
      if (px_FerPia+X_FerPia > X  &  px_FerPia > X_FerPia)  { @Off_X_Fer = X-px_FerPia+X_FerPia/2 }
      if (px_FerPia+X_FerPia > X  &  X_FerPia > px_FerPia)  { @Off_X_Fer = px_FerPia }

      //@Off_Z_Fer = (Z-Z_FerPia)/2
      //if (Z_FerPia < Z/2  |  pz_FerPia > Z/2)               { @Off_Z_Fer = Z_FerPia/2 }
      //if (pz_FerPia-Z_FerPia/2 < 0)                         { @Off_Z_Fer = pz_FerPia }
      //if (pz_FerPia+Z_FerPia > Z  &  pz_FerPia > Z_FerPia)  { @Off_Z_Fer = Z-pz_FerPia+Z_FerPia/2 }
      //if (pz_FerPia+Z_FerPia > Z  &  Z_FerPia > pz_FerPia)  { @Off_Z_Fer = pz_FerPia }

      @base_0 = base_0
      //@base_0.x = base_0.x + px_FerPia - @Off_X_Fer
      @base_0.x = base_0.x + px_FerPia
      @base_0.y = base_0.y + Battuta_Y
      //@base_0.z = base_0.z - pz_FerPia - @Off_Z_Fer
      @base_0.z = base_0.z - @Z
      if (py_FerFro > Y/2)
         { @base_0.y = alto_0.y - Battuta_Y - @Y }

      if (py_FerPia != 0)     { @base_0.y = base_0.y + py_FerPia }
      if (py_FerPia == 9999)  { @base_0.y = alto_0.y - Battuta_Y - @Y }

      @id_Fer = id_Fer
      @pz_FerPia = pz_FerPia
   }

  // Tengo per promemoria
   Procedura OnChangedVar
   {
      //if($ChangedVar!="posY_Utente")  { EXITSUB() }
      //VarsUser_click = VAR_VAL_STR(idx_att, "VarsUser__")
      //if (IS_MATCH(VarsUser_click, "*sposta*Utente") )
   }

  // 06.02.2025 Se clicco senza cambiare valore
   // Prima di versione M4 DlgVar del 6.02.2025
   Procedura CtrlVarUserNoChange
   {
      VarsUser_click = VAR_VAL_STR(idx_att, "VarsUser__")
      if ( VAR_VAL(idx_att, "sposta_X_Fro_Utente") == 0
         & VAR_VAL(idx_att, "sposta_Y_Fro_Utente") == 0
         & VAR_VAL(idx_att, "sposta_Z_Fro_Utente") == 0
         & VAR_VAL(idx_att, "sposta_X_Fia_Utente") == 0
         & VAR_VAL(idx_att, "sposta_Y_Fia_Utente") == 0
         & VAR_VAL(idx_att, "sposta_Z_Fia_Utente") == 0
         & VAR_VAL(idx_att, "sposta_X_Pia_Utente") == 0
         & VAR_VAL(idx_att, "sposta_Y_Pia_Utente") == 0
         & VAR_VAL(idx_att, "sposta_Z_Pia_Utente") == 0
         )
         {
          // VarsUser__ è ancora vuota se non faccio RIGENERA sia che modifico il valore sia che faccia ANNULLA o ESC
          // ma in ogni caso la resetto se non è cambiato niente
          //if (IS_MATCH(VarsUser_click, "*sposta*Utente") )
          //   {
              mdf_ctrl_VarsUser=VarsUser_click
              DEL_VAR_MODIFICATE(idx_att, "*sposta_*Utente")
              DEL_VAR_MODIFICATE(idx_att, "VarsUser__")
          //   }
         }
   }
}

Elemento MdF_FerramentaSuAnta
{
   Descrizione = "Grafica Ferramenta su Anta"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  55
      Y  ""  55
      Z  ""  12

      tipoIncidenza    "X,Y,Z"                                   "Z"
      id_Fer           "identificativo per CHIAVE_TAB_CAM"        0

      Off_X_Fer        "offset Lsvorazione in X"                  0
      Off_Y_Fer        "offset Lsvorazione in Y"                  0

      escl_Grafica     "visualizza grafica"                       1

      mdf_nomeFile_sat     "nome file sat da graficare"           "Vedi-img_sat_F1-RegFacc"
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      idx_MdF = PADRE(idx_att, 2)
      CHIAVE_TAB_CAM = STRCAT(NOME(idx_att), "_", STR(id_Fer))
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 3), "KeyFamRegFacc_FerFro")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att), "_", STR(id_Fer)) }
   }

   Controlli
   {
      idx_MdF_reladd = PADRE(idx_att, 2)
      indice_riga = 1
      if (VAR_EXIST(idx_MdF_reladd, "indice_riga") == 1)
         { indice_riga = VAR_VAL(idx_MdF_reladd, "indice_riga") }

      // Devo farlo sui Controlli e non sulle Assegnazioni perché se non ho i dati al primo
      // giro e serve fare un ricalcola allora passa nei Controlli ma non nelle Assegnazioni
      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_FerFro", STR(id_Fer-indice_riga+1))
      if (VAR_EXIST(idx_MdF_reladd, nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(idx_MdF_reladd, nome_var_chiave) }

      // Compatibilità 2013 campo Visualizza RegFacc 0 o 1
      if (VAR_EXIST(idx_MdF_reladd, "Visualizza_FerFro1") )
         { escl_Grafica = 1-VAR_VAL(idx_MdF_reladd, "Visualizza_FerFro1") }

      id_Reg = VAR_VAL(idx_MdF_reladd, STRCAT("id_Reg_FerFro", STR(id_Fer-indice_riga+1)))

      RegFacc_Visualizza = VAR_VAL_STR(idx_MdF_reladd, "Visualizza_FerFro1")
      GOSUB mdf_Visualize

     // 21.02.2024
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         )
         {
          idx_CamMdF = PADRE(idx_att, 3)
          mdF_sat_offx = VAR_VAL(idx_CamMdF, "mdF_sat_FerFro_offx")
          mdF_sat_offy = VAR_VAL(idx_CamMdF, "mdF_sat_FerFro_offy")
          mdF_sat_offz = VAR_VAL(idx_CamMdF, "mdF_sat_FerFro_offz")
          mdF_sat_angz = VAR_VAL(idx_CamMdF, "mdF_sat_FerFro_angz")
          mdf_prosegui_add_sat = 1
          if (UN_PADRE("MECC*UTENTE*") )
             {
              if (Y < 1)  { mdf_prosegui_add_sat = -1 }
             }

          if (mdf_prosegui_add_sat > 0)  { GOSUB mdf_ADD_sat }

         // 09.09.2024
          if (VAR_EXIST(idx_att, "px_FerFro_prec") != 1)
             {
              px_FerFro_prec = VAR_VAL(PADRE(idx_att, 2), "px_FerFro1")
              py_FerFro_prec = VAR_VAL(PADRE(idx_att, 2), "py_FerFro1")
              pz_FerFro_prec = VAR_VAL(PADRE(idx_att, 2), "pz_FerFro1")
             }

          if (STRLEN(mdf_nomeFile_sat) >= 4)
             {
              if (UN_PADRE("MECC*UTE*") )
                 {
                  if ( px_FerFro_prec != VAR_VAL(PADRE(idx_att, 2), "px_FerFro1")
                     | py_FerFro_prec != VAR_VAL(PADRE(idx_att, 2), "py_FerFro1")
                     | pz_FerFro_prec != VAR_VAL(PADRE(idx_att, 2), "pz_FerFro1")
                     )
                     {
                      px_FerFro_prec = VAR_VAL(PADRE(idx_att, 2), "px_FerFro1")
                      py_FerFro_prec = VAR_VAL(PADRE(idx_att, 2), "py_FerFro1")
                      pz_FerFro_prec = VAR_VAL(PADRE(idx_att, 2), "pz_FerFro1")
                      COMANDO2(STRCAT("SHOW Strutture idx add ", STR(PADRE(idx_att, 3)), "  // p_FerFro1 change da idx=", STR(idx_att), " ", NOME(idx_att)))
                     }
                 }
             }
         }
   }

   PuntiNotevoli
   {
      idx_att = ATTUALE()
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona Blocco bl
   {
      @escluso = escl_Grafica
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         )
         {
          if (VAR_EXIST(idx_att, "mdf_import") == 1)
             {
              // 30.04.2024 Ottimizzazioni FILE_EXIST per la rete
              if (mdf_import != VAR_VAL_STR(idx_att, "mdf_import_prec") )
                 {
                  if (FILE_EXIST(STRCAT(mdf_import, ".sat")) )  { import_sat_exist = 1 }
                  else                                          { import_sat_exist = 0 }
                  mdf_import_prec = mdf_import
                 }
              if (VAR_VAL(idx_att, "import_sat_exist") > 0)  { @escluso = 1 }
             }
         }
      @base_0 = base_0
      @X = X
      @Y = Y
      @Z = Z

      @c_rivestimento = [128,128,128]
   }
}

Elemento MdF_FerramentaSuFianco
{
   Descrizione = "Grafica Ferramenta su Fianchi"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  10
      Y  ""  40
      Z  ""  65

      tipoIncidenza    "X,Y,Z"                                   "XZ"
      id_Fer           "identificativo per CHIAVE_TAB_CAM"        0
      pz_FerFia        "pos in z lav su fianco"                  30

      Off_Y_Fer        "offset Lsvorazione in Y"                  0
      Off_Z_Fer        "offset Lsvorazione in Z"                  0

      escl_Grafica     "visualizza grafica"                       1

      CAM_Lav_offx_Ang    ""  0
      CAM_Lav_offz_Ang    ""  0

      mdf_nomeFile_sat     "nome file sat da graficare"             ""
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      idx_MdF = PADRE(idx_att, 2)
      CHIAVE_TAB_CAM = STRCAT(NOME(idx_att), "_", STR(id_Fer))
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 3), "KeyFamRegFacc_FerFia")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att), "_", STR(id_Fer)) }
   }

   Controlli
   {
      if (ACTION() <= 0)  { EXITSUB() }

      idx_MdF_reladd = PADRE(idx_att, 2)
      indice_riga = 1
      if (VAR_EXIST(idx_MdF_reladd, "indice_riga") == 1)
         { indice_riga = VAR_VAL(idx_MdF_reladd, "indice_riga") }

      // Devo farlo sui Controlli e non sulle Assegnazioni perché se non ho i dati al primo
      // giro e serve fare un ricalcola allora passa nei Controlli ma non nelle Assegnazioni
      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_FerFia", STR(id_Fer-indice_riga+1))
      if (VAR_EXIST(idx_MdF_reladd, nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(idx_MdF_reladd, nome_var_chiave) }

      id_nF = id_Fer
      if (id_nF == 0)  { id_nF = 1 }
      // Compatibilità 2013 campo Visualizza RegFacc 0 o 1
      if (VAR_EXIST(idx_MdF_reladd, STRCAT("Visualizza_FerFia", STR(id_nF))) )
         { escl_Grafica = 1-VAR_VAL(idx_MdF_reladd, STRCAT("Visualizza_FerFia", STR(id_nF))) }

      id_Reg = VAR_VAL(idx_MdF_reladd, STRCAT("id_Reg_FerFia", STR(id_Fer-indice_riga+1)))

      RegFacc_Visualizza = VAR_VAL_STR(idx_MdF_reladd, STRCAT("Visualizza_FerFia", STR(id_nF)))
      GOSUB mdf_Visualize

      //CAM_DIM_Z_reale = Z+pz_FerFia

      CAM_Lav_offx = CAM_Lav_offx_Ang

      CAM_Lav_Z = pz_FerFia
      CAM_Lav_offz = Z-pz_FerFia + CAM_Lav_offz_Ang
      CAM_DIM_Z_reale = Z

     // 27.12.2022
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         )
         {
          idx_CamMdF = PADRE(idx_att, 3)
          mdF_sat_offx = VAR_VAL(idx_CamMdF, "mdF_sat_FerFia_offx")
          px_FerFia_att = VAR_VAL(PADRE(idx_att, 1), "px_FerFia")
          if (px_FerFia_att > VAR_VAL(idx_MdF, "X")/2)
             {
              if (VAR_EXIST(idx_CamMdF, "mdF_sat_FerFia_offx_DX") )
                 { mdF_sat_offx = VAR_VAL(idx_CamMdF, "mdF_sat_FerFia_offx_DX") }
             }

          mdF_sat_offy = VAR_VAL(idx_CamMdF, "mdF_sat_FerFia_offy")
          mdF_sat_offz = VAR_VAL(idx_CamMdF, "mdF_sat_FerFia_offz")
          mdF_sat_angz = VAR_VAL(idx_CamMdF, "mdF_sat_FerFia_angz")

          mdf_prosegui_add_sat = 1
          if (UN_PADRE("MECC*UTENTE*") )
             {
              if (Y < 1)  { mdf_prosegui_add_sat = -1 }
             }

          if (mdf_prosegui_add_sat > 0)  { GOSUB mdf_ADD_sat }

         // 09.09.2024
          if (VAR_EXIST(idx_att, "px_FerFia_prec") != 1)
             {
              px_FerFia_prec = VAR_VAL(PADRE(idx_att, 2), "px_FerFia1")
              py_FerFia_prec = VAR_VAL(PADRE(idx_att, 2), "py_FerFia1")
              pz_FerFia_prec = VAR_VAL(PADRE(idx_att, 2), "pz_FerFia1")
             }

          if (STRLEN(mdf_nomeFile_sat) >= 4)
             {
              if (UN_PADRE("MECC*UTE*") )
                 {
                  if ( px_FerFia_prec != VAR_VAL(PADRE(idx_att, 2), "px_FerFia1")
                     | py_FerFia_prec != VAR_VAL(PADRE(idx_att, 2), "py_FerFia1")
                     | pz_FerFia_prec != VAR_VAL(PADRE(idx_att, 2), "pz_FerFia1")
                     )
                     {
                      px_FerFia_prec = VAR_VAL(PADRE(idx_att, 2), "px_FerFia1")
                      py_FerFia_prec = VAR_VAL(PADRE(idx_att, 2), "py_FerFia1")
                      pz_FerFia_prec = VAR_VAL(PADRE(idx_att, 2), "pz_FerFia1")
                      COMANDO2(STRCAT("SHOW Strutture idx add ", STR(PADRE(idx_att, 3)), "  // p_FerFia1 change da idx=", STR(idx_att), " ", NOME(idx_att)))
                     }
                 }
             }
         }
   }

   PuntiNotevoli
   {
      idx_att = ATTUALE()
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona Blocco bl
   {
      @escluso = escl_Grafica
     // 27.12.2022
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         )
         { @escluso = 1 }

      @base_0 = base_0

      if (pz_FerFia < 0  & Z > 0)
         { @base_0.z = base_0.z + Z }

      zmdf = VAR_VAL(PADRE(idx_att, 2), "Z")

      @X = X
      @Y = Y
      @Z = Z
      @c_rivestimento = [128,128,128]
   }
}

Elemento MdF_FerramentaSuPiano
{
   Descrizione = "Grafica Ferramenta su Piani"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  10
      Y  ""  40
      Z  ""  65

      tipoIncidenza    "X,Y,Z"                                   "YZ"
      id_Fer           "identificativo per CHIAVE_TAB_CAM"        0
      pz_FerPia        "pos in z lav su fianco"                  30

      mdf_nomeFile_sat     "nome file sat da graficare"             ""
      mdf_path_file_sat    "path file sat da graficare"             ""

      escl_Grafica     "visualizza grafica"                       1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      idx_MdF = PADRE(idx_att, 2)
      CHIAVE_TAB_CAM = STRCAT(NOME(idx_att), "_", STR(id_Fer))
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 3), "KeyFamRegFacc_FerPia")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att), "_", STR(id_Fer)) }
   }

   Controlli
   {
      idx_MdF_reladd = PADRE(idx_att, 2)
      indice_riga = 1
      if (VAR_EXIST(idx_MdF_reladd, "indice_riga") == 1)
         { indice_riga = VAR_VAL(idx_MdF_reladd, "indice_riga") }

      // Devo farlo sui Controlli e non sulle Assegnazioni perché se non ho i dati al primo
      // giro e serve fare un ricalcola allora passa nei Controlli ma non nelle Assegnazioni
      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_FerPia", STR(id_Fer-indice_riga+1))
      if (VAR_EXIST(idx_MdF_reladd, nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(idx_MdF_reladd, nome_var_chiave) }

      id_nF = id_Fer
      if (id_nF == 0)  { id_nF = 1 }
      // Compatibilità 2013 campo Visualizza RegFacc 0 o 1
      if (VAR_EXIST(idx_MdF_reladd, "Visualizza_FerPia1") )
         { escl_Grafica = 1-VAR_VAL(idx_MdF_reladd, "Visualizza_FerPia1") }

      id_Reg = VAR_VAL(idx_MdF_reladd, STRCAT("id_Reg_FerPia", STR(id_Fer-indice_riga+1)))

      RegFacc_Visualizza = VAR_VAL_STR(idx_MdF_reladd, STRCAT("Visualizza_FerPia", STR(id_nF)))
      GOSUB mdf_Visualize

      //CAM_DIM_Z_reale = Z+pz_FerPia
      CAM_Lav_Z = pz_FerPia
     // 28.06.2017
      // Se voglio usarla come lav retro tipoIncidenza Z anzichè come Y sopra-sotto
      // Esempio cricchetto frontale con aria 0.3 pz_FerPia=0 poi Prondita è sempre minimo 0.5 funzionava
      // Stesso cricchetto frontale con aria 1.7 pz_FerPia=0 anche impostando Z > 1 avevo sempre Profondita 0.5
      // non sentiva il piano
      // oppure avrei dovuto cambiare pz nel caso specifico
      if (CAM_Lav_Z < 0.01)
         {
          // Per protezione non faccio con piu di 5
          if (Z < 5)  { CAM_Lav_Z = Z }
          // Minimo 2.5 di ProfonditaVett non dovrebbe dare fastidio a nessuno, in piu è solo su faccia R
          MdF_Lav_R_ProfonditaVett = 2.5
         }
      CAM_Lav_offz = Z-pz_FerPia
      CAM_DIM_Z_reale = Z

     // 03.01.2023
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         )
         {
          idx_CamMdF = PADRE(idx_att, 3)
          mdF_sat_offx = VAR_VAL(idx_CamMdF, "mdF_sat_FerPia_offx")
          px_FerPia_att = VAR_VAL(PADRE(idx_att, 1), "px_FerPia")
          if (px_FerPia_att > VAR_VAL(idx_MdF, "X")/2)
             {
              if (VAR_EXIST(idx_CamMdF, "mdF_sat_FerPia_offx_DX") )
                 { mdF_sat_offx = VAR_VAL(idx_CamMdF, "mdF_sat_FerPia_offx_DX") }
             }

          mdF_sat_offy = VAR_VAL(idx_CamMdF, "mdF_sat_FerPia_offy")
          py_FerPia_att = VAR_VAL(PADRE(idx_att, 1), "py_FerPia")
          if (py_FerPia_att > VAR_VAL(idx_MdF, "Y")/2)
             {
              if (VAR_EXIST(idx_CamMdF, "mdF_sat_FerPia_offy_UP") )
                 { mdF_sat_offy = VAR_VAL(idx_CamMdF, "mdF_sat_FerPia_offy_UP") }
             }
          mdF_sat_offz = VAR_VAL(idx_CamMdF, "mdF_sat_FerPia_offz")
          mdF_sat_angz = VAR_VAL(idx_CamMdF, "mdF_sat_FerPia_angz")

          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("MdF_nomeFile_sat_FerPia_", CHIAVE_TAB_CAM, "_DW")) )
             {
              if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdF_sat_FerPia_offx_", CHIAVE_TAB_CAM, "_DW")) )
                 {
                  mdF_sat_offx = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdF_sat_FerPia_offx_", CHIAVE_TAB_CAM, "_DW"))
                 }
              if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdF_sat_FerPia_offy_", CHIAVE_TAB_CAM, "_DW")) )
                 {
                  mdF_sat_offy = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdF_sat_FerPia_offy_", CHIAVE_TAB_CAM, "_DW"))
                 }
              if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdF_sat_FerPia_offz_", CHIAVE_TAB_CAM, "_DW")) )
                 {
                  mdF_sat_offz = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdF_sat_FerPia_offz_", CHIAVE_TAB_CAM, "_DW"))
                 }
             }
          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("MdF_nomeFile_sat_FerPia_", CHIAVE_TAB_CAM, "_UP")) )
             {
              if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdF_sat_FerPia_offx_", CHIAVE_TAB_CAM, "_UP")) )
                 {
                  mdF_sat_offx = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdF_sat_FerPia_offx_", CHIAVE_TAB_CAM, "_UP"))
                 }
              if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdF_sat_FerPia_offy_", CHIAVE_TAB_CAM, "_UP")) )
                 {
                  mdF_sat_offy = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdF_sat_FerPia_offy_", CHIAVE_TAB_CAM, "_UP"))
                 }
              if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdF_sat_FerPia_offz_", CHIAVE_TAB_CAM, "_UP")) )
                 {
                  mdF_sat_offz = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdF_sat_FerPia_offz_", CHIAVE_TAB_CAM, "_UP"))
                 }
             }

          mdf_prosegui_add_sat = 1
          if (UN_PADRE("MECC*UTENTE*") )
             {
              if (Y < 1)  { mdf_prosegui_add_sat = -1 }
             }

          if (mdf_prosegui_add_sat > 0)  { GOSUB mdf_ADD_sat }

         // 09.09.2024
          if (VAR_EXIST(idx_att, "px_FerPia_prec") != 1)
             {
              px_FerPia_prec = VAR_VAL(PADRE(idx_att, 2), "px_FerPia1")
              py_FerPia_prec = VAR_VAL(PADRE(idx_att, 2), "py_FerPia1")
              pz_FerPia_prec = VAR_VAL(PADRE(idx_att, 2), "pz_FerPia1")
             }

          if (STRLEN(mdf_nomeFile_sat) >= 4)
             {
              if (UN_PADRE("MECC*UTE*") )
                 {
                  if ( px_FerPia_prec != VAR_VAL(PADRE(idx_att, 2), "px_FerPia1")
                     | py_FerPia_prec != VAR_VAL(PADRE(idx_att, 2), "py_FerPia1")
                     | pz_FerPia_prec != VAR_VAL(PADRE(idx_att, 2), "pz_FerPia1")
                     )
                     {
                      px_FerPia_prec = VAR_VAL(PADRE(idx_att, 2), "px_FerPia1")
                      py_FerPia_prec = VAR_VAL(PADRE(idx_att, 2), "py_FerPia1")
                      pz_FerPia_prec = VAR_VAL(PADRE(idx_att, 2), "pz_FerPia1")
                      COMANDO2(STRCAT("SHOW Strutture idx add ", STR(PADRE(idx_att, 3)), "  // p_FerPia1 change da idx=", STR(idx_att), " ", NOME(idx_att)))
                     }
                 }
             }
         }
   }

   PuntiNotevoli
   {
      idx_att = ATTUALE()
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona Blocco bl
   {
      @escluso = escl_Grafica
     // 03.01.2023
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         )
         { @escluso = 1 }
      @base_0 = base_0
      @X = X
      @Y = Y
      @Z = Z
      @c_rivestimento = [128,128,128]
   }
}

Elemento MdF_FerramenteGeneriche
{
   Descrizione = "Contenitore grafica Ferramente generiche"
   Code        = GRANT
   Gruppo      = "TMP"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   Alias         MdF_CAM;MdF_FerGen

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22
      HIDE  ""  1

      MdF_Apertura      "Apertura"        ""
      // Per non essere importato in T_REND e Virtuo
      TPRN_IMPORT       ""                "NO"

      px_FerGen1        "Rientro in X Ferramenta Gen 1 rispetto Frontale"      -999
      py_FerGen1        "Rientro in Y Ferramenta Gen 1 rispetto Frontale"      -999
      pz_FerGen1        "Rientro in Z Ferramenta Gen 1 rispetto Frontale"      -999
      X_FerGen1         "Dim X Ferramenta Gen 1"                               5
      Y_FerGen1         "Dim Y Ferramenta Gen 1"                               5
      Z_FerGen1         "Dim Z Ferramenta Gen 1"                               5

      px_FerGen2        "Rientro in X Ferramenta Gen 2 rispetto Frontale"      -999
      py_FerGen2        "Rientro in Y Ferramenta Gen 2 rispetto Frontale"      -999
      pz_FerGen2        "Rientro in Z Ferramenta Gen 2 rispetto Frontale"      -999
      X_FerGen2         "Dim X Ferramenta Gen 2"                               5
      Y_FerGen2         "Dim Y Ferramenta Gen 2"                               5
      Z_FerGen2         "Dim Z Ferramenta Gen 2"                               5

      px_FerGen3        "Rientro in X Ferramenta Gen 3 rispetto Frontale"      -999
      py_FerGen3        "Rientro in Y Ferramenta Gen 3 rispetto Frontale"      -999
      pz_FerGen3        "Rientro in Z Ferramenta Gen 3 rispetto Frontale"      -999
      X_FerGen3         "Dim X Ferramenta Gen 3"                               5
      Y_FerGen3         "Dim Y Ferramenta Gen 3"                               5
      Z_FerGen3         "Dim Z Ferramenta Gen 3"                               5

      px_FerGen4        "Rientro in X Ferramenta Gen 4 rispetto Frontale"      -999
      py_FerGen4        "Rientro in Y Ferramenta Gen 4 rispetto Frontale"      -999
      pz_FerGen4        "Rientro in Z Ferramenta Gen 4 rispetto Frontale"      -999
      X_FerGen4         "Dim X Ferramenta Gen 4"                               5
      Y_FerGen4         "Dim Y Ferramenta Gen 4"                               5
      Z_FerGen4         "Dim Z Ferramenta Gen 4"                               5

      px_FerGen5        "Rientro in X Ferramenta Gen 5 rispetto Frontale"      -999
      py_FerGen5        "Rientro in Y Ferramenta Gen 5 rispetto Frontale"      -999
      pz_FerGen5        "Rientro in Z Ferramenta Gen 5 rispetto Frontale"      -999
      X_FerGen5         "Dim X Ferramenta Gen 5"                               5
      Y_FerGen5         "Dim Y Ferramenta Gen 5"                               5
      Z_FerGen5         "Dim Z Ferramenta Gen 5"                               5

      px_FerGen6        "Rientro in X Ferramenta Gen 6 rispetto Frontale"      -999
      py_FerGen6        "Rientro in Y Ferramenta Gen 6 rispetto Frontale"      -999
      pz_FerGen6        "Rientro in Z Ferramenta Gen 6 rispetto Frontale"      -999
      X_FerGen6         "Dim X Ferramenta Gen 6"                               5
      Y_FerGen6         "Dim Y Ferramenta Gen 6"                               5
      Z_FerGen6         "Dim Z Ferramenta Gen 6"                               5

      px_FerGen7        "Rientro in X Ferramenta Gen 7 rispetto Frontale"      -999
      py_FerGen7        "Rientro in Y Ferramenta Gen 7 rispetto Frontale"      -999
      pz_FerGen7        "Rientro in Z Ferramenta Gen 7 rispetto Frontale"      -999
      X_FerGen7         "Dim X Ferramenta Gen 7"                               5
      Y_FerGen7         "Dim Y Ferramenta Gen 7"                               5
      Z_FerGen7         "Dim Z Ferramenta Gen 7"                               5

      px_FerGen8        "Rientro in X Ferramenta Gen 8 rispetto Frontale"      -999
      py_FerGen8        "Rientro in Y Ferramenta Gen 8 rispetto Frontale"      -999
      pz_FerGen8        "Rientro in Z Ferramenta Gen 8 rispetto Frontale"      -999
      X_FerGen8         "Dim X Ferramenta Gen 8"                               5
      Y_FerGen8         "Dim Y Ferramenta Gen 8"                               5
      Z_FerGen8         "Dim Z Ferramenta Gen 8"                               5

      Battuta_X_Sx      "battuta Sx su Fia di aggancio"                        0
      Battuta_X_Dx      "battuta Dx su Fia di aggancio"                        0
      Battuta_Y         "battuta in Y su Pia di aggancio"                      0
      Battuta_Z         "battuta in Z su Fia,Pia"                              0
     // 20.07.2023
      Battuta_Z_Sx      "battuta in Z su Fia Sx"                               0
      Battuta_Z_Dx      "battuta in Z su Fia Dx"                               0

      KeyFamRegFacc     "Macro Regola di posizionamento"                       ""
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      GOSUB MdF_SetStato_NoGEST
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          MdF_comandoOnAUTO = 1
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Attrezza
   {
      base_0 = @base_0
      base_0.z = @base_0.z
      X = @X
      Y = @Y
      Z = @Z
   }

   Controlli
   {
      idx_att = ATTUALE()
      idx_CamMdF = PADRE(idx_att, 1)
      nome_CamMdF = NOME(idx_CamMdF)
      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")
      Z = VAR_VAL(idx_CamMdF, "Z")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      GOSUB MdF_Ctrl_Dim

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "FerGen"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "FerGenMdF"
      GOSUB MdF_Variabili

      GOSUB MdF_Battuta_X
      GOSUB MdF_Battuta_Y

      GOSUB Reg_pos_FerramenteGen
      GOSUB Reg_FerGen_att
      GOSUB MdF_Battuta_X_After_RegFacc

      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_ADD_when"), "first_OnMacroMdF") )
         { MdF_ADD_when = "RE_Control" }

      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)
         {
          MdF_ADD_when = "RE_Control"
          mdf_ricalc_Post_READD = 0
         }
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_FerramentaGen  fer1
   {
      @escluso = 1
      if (px_FerGen1 != -999  |  py_FerGen1 != -999  |  pz_FerGen1 != -999)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_FerGen1
      @base_0.y = base_0.y + py_FerGen1
      @base_0.z = base_0.z + pz_FerGen1

      @X = 1
      @Y = 1
      @Z = 1
      if (VAR_VAL(idx_att, "X_FerGen1") > 0)  { @X = X_FerGen1 }
      if (VAR_VAL(idx_att, "Y_FerGen1") > 0)  { @Y = Y_FerGen1 }
      if (VAR_VAL(idx_att, "Z_FerGen1") > 0)  { @Z = Z_FerGen1 }
      @px_FerGen = px_FerGen1
      @py_FerGen = py_FerGen1
      @pz_FerGen = pz_FerGen1

      @id_Fer = 1
   }

   Posiziona MdF_FerramentaGen  fer2
   {
      @escluso = 1
      if (px_FerGen2 != -999  |  py_FerGen2 != -999  |  pz_FerGen2 != -999)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_FerGen2
      @base_0.y = base_0.y + py_FerGen2
      @base_0.z = base_0.z + pz_FerGen2

      @X = 1
      @Y = 1
      @Z = 1
      if (VAR_VAL(idx_att, "X_FerGen2") > 0)  { @X = X_FerGen2 }
      if (VAR_VAL(idx_att, "Y_FerGen2") > 0)  { @Y = Y_FerGen2 }
      if (VAR_VAL(idx_att, "Z_FerGen2") > 0)  { @Z = Z_FerGen2 }
      @px_FerGen = px_FerGen2
      @py_FerGen = py_FerGen2
      @pz_FerGen = pz_FerGen2

      @id_Fer = 2
   }

   Posiziona MdF_FerramentaGen  fer3
   {
      @escluso = 1
      if (px_FerGen3 != -999  |  py_FerGen3 != -999  |  pz_FerGen3 != -999)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_FerGen3
      @base_0.y = base_0.y + py_FerGen3
      @base_0.z = base_0.z + pz_FerGen3

      @X = 1
      @Y = 1
      @Z = 1
      if (VAR_VAL(idx_att, "X_FerGen3") > 0)  { @X = X_FerGen3 }
      if (VAR_VAL(idx_att, "Y_FerGen3") > 0)  { @Y = Y_FerGen3 }
      if (VAR_VAL(idx_att, "Z_FerGen3") > 0)  { @Z = Z_FerGen3 }
      @px_FerGen = px_FerGen3
      @py_FerGen = py_FerGen3
      @pz_FerGen = pz_FerGen3

      @id_Fer = 3
   }

   Posiziona MdF_FerramentaGen  fer4
   {
      @escluso = 1
      if (px_FerGen4 != -999  |  py_FerGen4 != -999  |  pz_FerGen4 != -999)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_FerGen4
      @base_0.y = base_0.y + py_FerGen4
      @base_0.z = base_0.z + pz_FerGen4

      @X = 1
      @Y = 1
      @Z = 1
      if (VAR_VAL(idx_att, "X_FerGen4") > 0)  { @X = X_FerGen4 }
      if (VAR_VAL(idx_att, "Y_FerGen4") > 0)  { @Y = Y_FerGen4 }
      if (VAR_VAL(idx_att, "Z_FerGen4") > 0)  { @Z = Z_FerGen4 }
      @px_FerGen = px_FerGen4
      @py_FerGen = py_FerGen4
      @pz_FerGen = pz_FerGen4

      @id_Fer = 4
   }

   Posiziona MdF_FerramentaGen  fer5
   {
      @escluso = 1
      if (px_FerGen5 != -999  |  py_FerGen5 != -999  |  pz_FerGen5 != -999)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_FerGen5
      @base_0.y = base_0.y + py_FerGen5
      @base_0.z = base_0.z + pz_FerGen5

      @X = 1
      @Y = 1
      @Z = 1
      if (VAR_VAL(idx_att, "X_FerGen5") > 0)  { @X = X_FerGen5 }
      if (VAR_VAL(idx_att, "Y_FerGen5") > 0)  { @Y = Y_FerGen5 }
      if (VAR_VAL(idx_att, "Z_FerGen5") > 0)  { @Z = Z_FerGen5 }
      @px_FerGen = px_FerGen5
      @py_FerGen = py_FerGen5
      @pz_FerGen = pz_FerGen5

      @id_Fer = 5
   }

   Posiziona MdF_FerramentaGen  fer6
   {
      @escluso = 1
      if (px_FerGen6 != -999  |  py_FerGen6 != -999  |  pz_FerGen6 != -999)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_FerGen6
      @base_0.y = base_0.y + py_FerGen6
      @base_0.z = base_0.z + pz_FerGen6

      @X = 1
      @Y = 1
      @Z = 1
      if (VAR_VAL(idx_att, "X_FerGen6") > 0)  { @X = X_FerGen6 }
      if (VAR_VAL(idx_att, "Y_FerGen6") > 0)  { @Y = Y_FerGen6 }
      if (VAR_VAL(idx_att, "Z_FerGen6") > 0)  { @Z = Z_FerGen6 }
      @px_FerGen = px_FerGen6
      @py_FerGen = py_FerGen6
      @pz_FerGen = pz_FerGen6

      @id_Fer = 6
   }

   Posiziona MdF_FerramentaGen  fer7
   {
      @escluso = 1
      if (px_FerGen7 != -999  |  py_FerGen7 != -999  |  pz_FerGen7 != -999)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_FerGen7
      @base_0.y = base_0.y + py_FerGen7
      @base_0.z = base_0.z + pz_FerGen7

      @X = 1
      @Y = 1
      @Z = 1
      if (VAR_VAL(idx_att, "X_FerGen7") > 0)  { @X = X_FerGen7 }
      if (VAR_VAL(idx_att, "Y_FerGen7") > 0)  { @Y = Y_FerGen7 }
      if (VAR_VAL(idx_att, "Z_FerGen7") > 0)  { @Z = Z_FerGen7 }
      @px_FerGen = px_FerGen7
      @py_FerGen = py_FerGen7
      @pz_FerGen = pz_FerGen7

      @id_Fer = 7
   }

   Posiziona MdF_FerramentaGen  fer8
   {
      @escluso = 1
      if (px_FerGen8 != -999  |  py_FerGen8 != -999  |  pz_FerGen8 != -999)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_FerGen8
      @base_0.y = base_0.y + py_FerGen8
      @base_0.z = base_0.z + pz_FerGen8

      @X = 1
      @Y = 1
      @Z = 1
      if (VAR_VAL(idx_att, "X_FerGen8") > 0)  { @X = X_FerGen8 }
      if (VAR_VAL(idx_att, "Y_FerGen8") > 0)  { @Y = Y_FerGen8 }
      if (VAR_VAL(idx_att, "Z_FerGen8") > 0)  { @Z = Z_FerGen8 }
      @px_FerGen = px_FerGen8
      @py_FerGen = py_FerGen8
      @pz_FerGen = pz_FerGen8

      @id_Fer = 8
   }

   Procedura MdF_noAUTO
   {
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          MdF_comandoOnAUTO = 2
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Procedura MdF_Ctrl_Post_RELATIVE_ADD
   {
      GOSUB MdF_Ctrl_Post_RELATIVE_ADD
   }

   Procedura MdF_Ctrl_ADD_TooEarly
   {
      GOSUB MdF_Ctrl_ADD_TooEarly
   }

   Procedura MdF_Ctrl_Cambiamenti
   {
      if (VAR_EXIST(idx_att, "MdF_Cambiato") != 1)  { EXITSUB() }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaMdF"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "FerGen"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "FerGenMdF"
      GOSUB MdF_Variabili

      GOSUB Reg_pos_FerramenteGen

      MdF_Cambiato_att = VAR_VAL_STR(idx_att, "MdF_Cambiato")
      bas0_att = base_0.y
      alt0_att = alto_0.y
      bas0_CamMdF = VAR_VAL(idx_CamMdF, "base_0.y")
      alt0_CamMdF = VAR_VAL(idx_CamMdF, "alto_0.y")

      if (IS_MATCH(MdF_Cambiato, "MdF_CamMdFrontali") != 1)
         {
          GOSUB MdF_Cam_Elimina
         }

      if ( bas0_att == bas0_CamMdF  &  alt0_att == alt0_CamMdF
         & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "Dim*") != 1
         )
         { DEL_VAR(idx_att, "MdF_Cambiato") }

      if ( STRCMP(KeyFamRegFacc_att, KeyFamRegFacc) != 0
         | STRCMP(MdF_Aper_att, MdF_Apertura) != 0
         | X_att != X
         | Y_att != Y
         | px_FerGen1_att != px_FerGen1
         | px_FerGen2_att != px_FerGen2
         | px_FerGen3_att != px_FerGen3
         | px_FerGen4_att != px_FerGen4
         | px_FerGen5_att != px_FerGen5
         | px_FerGen6_att != px_FerGen6
         | px_FerGen7_att != px_FerGen7
         | px_FerGen8_att != px_FerGen8
         | py_FerGen1_att != py_FerGen1
         | py_FerGen2_att != py_FerGen2
         | py_FerGen3_att != py_FerGen3
         | py_FerGen4_att != py_FerGen4
         | py_FerGen5_att != py_FerGen5
         | py_FerGen6_att != py_FerGen6
         | py_FerGen7_att != py_FerGen7
         | py_FerGen8_att != py_FerGen8
         | pz_FerGen1_att != pz_FerGen1
         | pz_FerGen2_att != pz_FerGen2
         | pz_FerGen3_att != pz_FerGen3
         | pz_FerGen4_att != pz_FerGen4
         | pz_FerGen5_att != pz_FerGen5
         | pz_FerGen6_att != pz_FerGen6
         | pz_FerGen7_att != pz_FerGen7
         | pz_FerGen8_att != pz_FerGen8
         )
         {
          WITH_VAR_LOCAL(idx_att, "mdf_Visgraf", "escl_Grafica", 2, 1, "0")

          if (mdf_Visgraf <= 0)
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          else
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          MdF_Cambiato_att = STRCAT(MdF_Cambiato_att, " , Ricalcolato")
         }
   }
}

Elemento MdF_FerramentaGen
{
   Descrizione = "Grafica Ferramenta Generica"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  5
      Y  ""  5
      Z  ""  5

      escl_Grafica         "visualizza grafica"                     1
      id_Fer               "identificativo per CHIAVE_TAB_CAM"      0

      px_FerGen            "pos x rispetto frontale"                0
      py_FerGen            "pos y rispetto frontale"                0
      pz_FerGen            "pos z rispetto frontale"                0

      mdf_nomeFile_sat     "nome file sat da graficare"             ""
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      idx_MdF = PADRE(idx_att, 1)
      CHIAVE_TAB_CAM = NOME(idx_att)
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerGen")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att)) }

      nome_var_chiave = "CHIAVE_TAB_CAM_FerGen1"
      if (VAR_EXIST(PADRE(idx_att, 1), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 1), nome_var_chiave) }
      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_FerGen", STR(id_Fer))
      if (VAR_EXIST(PADRE(idx_att, 1), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 1), nome_var_chiave) }

      id_Reg = VAR_VAL(PADRE(idx_att, 1), STRCAT("id_Reg_FerGen", STR(id_Fer)))

      // Compatibilità 2013 campo Visualizza RegFacc 0 o 1
      nome_var_Vis = STRCAT("Visualizza_FerGen", STR(id_Fer))
      if (VAR_EXIST(PADRE(idx_att, 1), nome_var_Vis) )
         { escl_Grafica = 1-VAR_VAL(PADRE(idx_att, 1), nome_var_Vis) }

      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("Visualizza_FerGen", STR(id_Fer)))
      GOSUB mdf_Visualize
   }

   Controlli
   {
      if (ACTION() <= 0)  { EXITSUB() }

      chiave_tabvar_mdf = "FerGen"
      GOSUB MdF_GEST

     // 27.12.2022
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         )
         {
          idx_CamMdF = PADRE(idx_att, 2)
          mdF_sat_offx = VAR_VAL(idx_CamMdF, "mdF_sat_FerGen_offx")
          if (px_FerGen > VAR_VAL(idx_MdF, "X")/2)
             {
              if (VAR_EXIST(idx_CamMdF, "mdF_sat_FerGen_offx_DX") )
                 { mdF_sat_offx = VAR_VAL(idx_CamMdF, "mdF_sat_FerGen_offx_DX") }
             }
          mdF_sat_offy = VAR_VAL(idx_CamMdF, "mdF_sat_FerGen_offy")
          mdF_sat_offz = VAR_VAL(idx_CamMdF, "mdF_sat_FerGen_offz")
          mdF_sat_angz = VAR_VAL(idx_CamMdF, "mdF_sat_FerGen_angz")
          GOSUB mdf_ADD_sat
         }
   }

   PuntiNotevoli
   {
      idx_att = ATTUALE()
      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]
   }

   Posiziona Blocco bl
   {
      @escluso = escl_Grafica
     // 27.12.2022
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         )
         {
          // 20.02.2023 Per compatibilita
          if (VAR_EXIST(idx_att, "mdf_import") == 1)
             {
              if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
                 { @escluso = 1 }
             }
         }

      @base_0 = base_0
      @base_0.x = base_0.x
      @base_0.y = base_0.y
      // Attaccaglie da Schiena per lav su Fianco
      // Ferramenta per Anta Libro
      @base_0.z = base_0.z - (Z-ABS(pz_FerGen))/2

      if (px_FerGen < X/2)  { @base_0.x = base_0.x - px_FerGen }
      //if (py_FerGen < Y/2)  { @base_0.y = base_0.y - py_FerGen }

      xmdf = VAR_VAL(PADRE(idx_att, 2), "X")
      ymdf = VAR_VAL(PADRE(idx_att, 2), "Y")
      zmdf = VAR_VAL(PADRE(idx_att, 2), "Z")
      if (px_FerGen > xmdf+X/2)    { @base_0.x = base_0.x - @X + (xmdf-px_FerGen) }
      if (px_FerGen > xmdf+0.1)    { @base_0.x = base_0.x - @X + (xmdf-px_FerGen) }
      if (px_FerGen > xmdf-X/2)    { @base_0.x = base_0.x }
      if (px_FerGen < 0)           { @base_0.x = base_0.x }
      if (py_FerGen > ymdf+Y/2)    { @base_0.y = base_0.y - @Y + (ymdf-py_FerGen) }
      if (py_FerGen > ymdf+0.1)    { @base_0.y = base_0.y - @Y + (ymdf-py_FerGen) }
      if (py_FerGen > ymdf-Y/2)    { @base_0.y = base_0.y }
      if (py_FerGen < 0)           { @base_0.y = base_0.y }

      if (px_FerGen+X+0.1 >= xmdf & px_FerGen+X-0.1 <= xmdf)  { @base_0.x = base_0.x }

      if (ABS(pz_FerGen)*2 < Z  &  Z+1 < zmdf)  { @base_0.z = base_0.z - pz_FerGen/2 }
      // Attaccaglie da Schiena per lav su Fianco
      if (ABS(pz_FerGen) < Z  &  Z-1 > zmdf)    { @base_0.z = base_0.z - ABS(pz_FerGen) - (Z-ABS(pz_FerGen))/2 }
      if (ABS(pz_FerGen) > Z)                   { @base_0.z = base_0.z }

      @X = X
      @Y = Y
      @Z = Z
      @c_rivestimento = [255,255,120]
      @f_rivestimento = STR(100*0.005)
   }
}

// 06.03.2024
Elemento MdF_FerramenteGenCri
{
   Descrizione = "Contenitore grafica Ferramente generiche cricchetto"
   Code        = GRANT
   Gruppo      = "TMP"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   Alias         MdF_CAM;MdF_FerGen

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22
      HIDE  ""  1

      MdF_Apertura      "Apertura"        ""
      // Per non essere importato in T_REND e Virtuo
      TPRN_IMPORT       ""                "NO"

      px_FerCri1        "Rientro in X Ferramenta Gen 1 rispetto Frontale"      -999
      py_FerCri1        "Rientro in Y Ferramenta Gen 1 rispetto Frontale"      -999
      pz_FerCri1        "Rientro in Z Ferramenta Gen 1 rispetto Frontale"      -999
      X_FerCri1         "Dim X Ferramenta Gen 1"                               5
      Y_FerCri1         "Dim Y Ferramenta Gen 1"                               5
      Z_FerCri1         "Dim Z Ferramenta Gen 1"                               5

      px_FerCri2        "Rientro in X Ferramenta Gen 2 rispetto Frontale"      -999
      py_FerCri2        "Rientro in Y Ferramenta Gen 2 rispetto Frontale"      -999
      pz_FerCri2        "Rientro in Z Ferramenta Gen 2 rispetto Frontale"      -999
      X_FerCri2         "Dim X Ferramenta Gen 2"                               5
      Y_FerCri2         "Dim Y Ferramenta Gen 2"                               5
      Z_FerCri2         "Dim Z Ferramenta Gen 2"                               5

      Battuta_X_Sx      "battuta Sx su Fia di aggancio"                        0
      Battuta_X_Dx      "battuta Dx su Fia di aggancio"                        0
      Battuta_Y         "battuta in Y su Pia di aggancio"                      0
      Battuta_Z         "battuta in Z su Fia,Pia"                              0

      Battuta_Z_Sx      "battuta in Z su Fia Sx"                               0
      Battuta_Z_Dx      "battuta in Z su Fia Dx"                               0

      KeyFamRegFacc     "Macro Regola di posizionamento"                       ""
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      GOSUB MdF_SetStato_NoGEST
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          MdF_comandoOnAUTO = 1
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Attrezza
   {
      base_0 = @base_0
      base_0.z = @base_0.z
      X = @X
      Y = @Y
      Z = @Z
   }

   Controlli
   {
      idx_att = ATTUALE()
      idx_CamMdF = PADRE(idx_att, 1)
      nome_CamMdF = NOME(idx_CamMdF)
      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")
      Z = VAR_VAL(idx_CamMdF, "Z")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      GOSUB MdF_Ctrl_Dim

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
     // 17.05.2024 Ottimizzazioni
      GOSUB MdF_Ctrl_var_cam_Init
      GOSUB MdF_ctrl_Change_Var_CAM
      if (mdf_ctrl_Change_Var_CAM > 0)
         {
          GOSUB MdF_VariabiliDaTipoPadri
          CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "keyGenericaMdF"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "FerCri"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "FerCriMdF"
          GOSUB MdF_Variabili
         }

      GOSUB MdF_Battuta_X
      GOSUB MdF_Battuta_Y

      GOSUB Reg_pos_FerGenCri
      GOSUB Reg_FerCri_att
      GOSUB MdF_Battuta_X_After_RegFacc

      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_ADD_when"), "first_OnMacroMdF") )
         { MdF_ADD_when = "RE_Control" }

      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)
         {
          MdF_ADD_when = "RE_Control"
          mdf_ricalc_Post_READD = 0
         }
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_FerGenCri  fer1
   {
      @escluso = 1
      if (px_FerCri1 != -999  |  py_FerCri1 != -999  |  pz_FerCri1 != -999)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_FerCri1
      @base_0.y = base_0.y + py_FerCri1
      @base_0.z = base_0.z + pz_FerCri1

      @X = 1
      @Y = 1
      @Z = 1
      if (VAR_VAL(idx_att, "X_FerCri1") > 0)  { @X = X_FerCri1 }
      if (VAR_VAL(idx_att, "Y_FerCri1") > 0)  { @Y = Y_FerCri1 }
      if (VAR_VAL(idx_att, "Z_FerCri1") > 0)  { @Z = Z_FerCri1 }
      @px_FerCri = px_FerCri1
      @py_FerCri = py_FerCri1
      @pz_FerCri = pz_FerCri1

      @id_Fer = 1
   }

   Posiziona MdF_FerGenCri  fer2
   {
      @escluso = 1
      if (px_FerCri2 != -999  |  py_FerCri2 != -999  |  pz_FerCri2 != -999)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + px_FerCri2
      @base_0.y = base_0.y + py_FerCri2
      @base_0.z = base_0.z + pz_FerCri2

      @X = 1
      @Y = 1
      @Z = 1
      if (VAR_VAL(idx_att, "X_FerCri2") > 0)  { @X = X_FerCri2 }
      if (VAR_VAL(idx_att, "Y_FerCri2") > 0)  { @Y = Y_FerCri2 }
      if (VAR_VAL(idx_att, "Z_FerCri2") > 0)  { @Z = Z_FerCri2 }
      @px_FerCri = px_FerCri2
      @py_FerCri = py_FerCri2
      @pz_FerCri = pz_FerCri2

      @id_Fer = 2
   }

   Procedura MdF_noAUTO
   {
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          MdF_comandoOnAUTO = 2
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Procedura MdF_Ctrl_Post_RELATIVE_ADD
   {
      GOSUB MdF_Ctrl_Post_RELATIVE_ADD
   }

   Procedura MdF_Ctrl_ADD_TooEarly
   {
      GOSUB MdF_Ctrl_ADD_TooEarly
   }

   Procedura MdF_Ctrl_Cambiamenti
   {
      if (VAR_EXIST(idx_att, "MdF_Cambiato") != 1)  { EXITSUB() }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

      idx_MdF_Var = idx_att
     // 29.07.2024 Ottimizzazioni
      GOSUB MdF_ctrl_Change_Var_CAM
      if (mdf_ctrl_Change_Var_CAM > 0)
         {
          GOSUB MdF_VariabiliDaTipoPadri
          CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "keyGenericaMdF"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "FerCri"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "FerCriMdF"
          GOSUB MdF_Variabili
         }

      GOSUB Reg_pos_FerGenCri

      MdF_Cambiato_att = VAR_VAL_STR(idx_att, "MdF_Cambiato")
      bas0_att = base_0.y
      alt0_att = alto_0.y
      bas0_CamMdF = VAR_VAL(idx_CamMdF, "base_0.y")
      alt0_CamMdF = VAR_VAL(idx_CamMdF, "alto_0.y")

      if (IS_MATCH(MdF_Cambiato, "MdF_CamMdFrontali") != 1)
         {
          GOSUB MdF_Cam_Elimina
         }

      if ( bas0_att == bas0_CamMdF  &  alt0_att == alt0_CamMdF
         & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "Dim*") != 1
         )
         { DEL_VAR(idx_att, "MdF_Cambiato") }

      if ( STRCMP(KeyFamRegFacc_att, KeyFamRegFacc) != 0
         | STRCMP(MdF_Aper_att, MdF_Apertura) != 0
         | X_att != X
         | Y_att != Y
         | px_FerCri1_att != px_FerCri1
         | px_FerCri2_att != px_FerCri2
         // 29.07.2024
         | py_FerCri1_att != py_FerCri1
         | py_FerCri2_att != py_FerCri2
         | pz_FerCri1_att != pz_FerCri1
         | pz_FerCri2_att != pz_FerCri2
         )
         {
          WITH_VAR_LOCAL(idx_att, "mdf_Visgraf", "escl_Grafica", 2, 1, "0")

          if (mdf_Visgraf <= 0)
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          else
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x ", MdF_Cambiato_att)) }
          MdF_Cambiato_att = STRCAT(MdF_Cambiato_att, " , Ricalcolato")
         }
   }
}

Elemento MdF_FerGenCri
{
   Descrizione = "Grafica Ferramenta Generica cricchetto"
   Code        = SPN
   Gruppo      = "FERRAMENTA"
   Tipo        = Contenitore
   Forma       = ""
   Alias       CamIncidente

   Variabili
   {
      X  ""  5
      Y  ""  5
      Z  ""  5

      escl_Grafica         "visualizza grafica"                     1
      id_Fer               "identificativo per CHIAVE_TAB_CAM"      0

      px_FerCri            "pos x rispetto frontale"                0
      py_FerCri            "pos y rispetto frontale"                0
      pz_FerCri            "pos z rispetto frontale"                0

      mdf_nomeFile_sat     "nome file sat da graficare"             ""

     // In questo caso imposto gia un default piu basso di 5 per cercare di non toccare frontali/elementi vicini
      // Su CAM_Lavorazioni.inc vengono presi per MdF_Fer*
      Cam_Cont_Lav_S_ProfonditaVett   ""                            1.8
      Cam_Cont_Lav_D_ProfonditaVett   ""                            1.8
      // 28.01.2025
      //Cam_Cont_Lav_F_ProfonditaVett   ""                            2.6
      //Cam_Cont_Lav_R_ProfonditaVett   ""                            2.6
      Cam_Cont_Lav_F_ProfonditaVett   ""                            2.7
      Cam_Cont_Lav_R_ProfonditaVett   ""                            2.7
      Cam_Cont_Lav_A_ProfonditaVett   ""                            1.8
      Cam_Cont_Lav_B_ProfonditaVett   ""                            1.8
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      idx_MdF = PADRE(idx_att, 1)
      CHIAVE_TAB_CAM = NOME(idx_att)
      KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc_FerCri")
      if (STRLEN(KeyFamRegFacc) > 0)
         { CHIAVE_TAB_CAM = STRCAT(KeyFamRegFacc, "_", NOME(idx_att)) }

      nome_var_chiave = "CHIAVE_TAB_CAM_FerCri1"
      if (VAR_EXIST(PADRE(idx_att, 1), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 1), nome_var_chiave) }
      nome_var_chiave = STRCAT("CHIAVE_TAB_CAM_FerCri", STR(id_Fer))
      if (VAR_EXIST(PADRE(idx_att, 1), nome_var_chiave) == 1)
         { CHIAVE_TAB_CAM = VAR_VAL_STR(PADRE(idx_att, 1), nome_var_chiave) }

      id_Reg = VAR_VAL(PADRE(idx_att, 1), STRCAT("id_Reg_FerCri", STR(id_Fer)))

      // Compatibilità 2013 campo Visualizza RegFacc 0 o 1
      nome_var_Vis = STRCAT("Visualizza_FerCri", STR(id_Fer))
      if (VAR_EXIST(PADRE(idx_att, 1), nome_var_Vis) )
         { escl_Grafica = 1-VAR_VAL(PADRE(idx_att, 1), nome_var_Vis) }

      RegFacc_Visualizza = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("Visualizza_FerCri", STR(id_Fer)))
      GOSUB mdf_Visualize
   }

   Controlli
   {
      if (ACTION() <= 0)  { EXITSUB() }

      chiave_tabvar_mdf = "FerCri"
      GOSUB MdF_GEST

     // 27.12.2022
      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         )
         {
          idx_CamMdF = PADRE(idx_att, 2)
          mdF_sat_offx = VAR_VAL(idx_CamMdF, "mdF_sat_FerCri_offx")
          if (px_FerCri > VAR_VAL(idx_MdF, "X")/2)
             {
              if (VAR_EXIST(idx_CamMdF, "mdF_sat_FerCri_offx_DX") )
                 { mdF_sat_offx = VAR_VAL(idx_CamMdF, "mdF_sat_FerCri_offx_DX") }
             }
          mdF_sat_offy = VAR_VAL(idx_CamMdF, "mdF_sat_FerCri_offy")
          mdF_sat_offz = VAR_VAL(idx_CamMdF, "mdF_sat_FerCri_offz")
          mdF_sat_angz = VAR_VAL(idx_CamMdF, "mdF_sat_FerCri_angz")
          GOSUB mdf_ADD_sat
         }
   }

   PuntiNotevoli
   {
      idx_att = ATTUALE()
      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]
   }

   Posiziona Blocco bl
   {
      @escluso = escl_Grafica

      if ( STRCMP(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat"), "No") != 0
         & STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_Visualize_sat")) > 0
         )
         {
          if (VAR_EXIST(idx_att, "mdf_import") == 1)
             {
              if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
                 { @escluso = 1 }
             }
         }

      @base_0 = base_0
      // 22.03.2024 in RegFacc posiziono il cricchetto grafico, poi nel cam adatto +X/2 +Y/2
      //@base_0.x = base_0.x - X/2
      //@base_0.y = base_0.y - Y/2
      @base_0.x = base_0.x
      @base_0.y = base_0.y
      @base_0.z = base_0.z - (Z-ABS(pz_FerCri))/2


      xmdf = VAR_VAL(PADRE(idx_att, 2), "X")
      ymdf = VAR_VAL(PADRE(idx_att, 2), "Y")
      zmdf = VAR_VAL(PADRE(idx_att, 2), "Z")

      @X = X
      @Y = Y
      @Z = Z
      @c_rivestimento = [255,255,120]
      @f_rivestimento = STR(100*0.005)
   }
}

// Gestioni BDMCAM con ang_z
Elemento MdF_BDM_Verticale
{
   Descrizione = "Elemento con orientamento da Verticale"
   Code        = NUL
   Gruppo      = "CAM"
   Tipo        = Contenitore
   Forma       = ""
   Alias         MdF_BDM

   Variabili
   {
      X  "Spessore"     1
      Y  "Altezza"      1
      Z  "Profondità"   1

      HIDE  "non visibile in Edit"  1

      //CHIAVE_TAB_CAM            "chiave per tabelle-M4 dal padre"  ""
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      idx_pdr = PADRE(ATTUALE(), 1)

      if (idx_pdr == idx_att)  { EXITSUB() }

      X = VAR_VAL(idx_pdr, "X")
      Y = VAR_VAL(idx_pdr, "Y")
      Z = VAR_VAL(idx_pdr, "Z")

      //CHIAVE_TAB_CAM = NOME(idx_pdr)
      //if (VAR_EXIST(idx_pdr, "CHIAVE_TAB_CAM") )
      //   { CHIAVE_TAB_CAM = VAR_VAL_STR(idx_pdr, "CHIAVE_TAB_CAM") }

      if (VAR_EXIST(idx_pdr, "MdF_Bdm_X"))  { X = VAR_VAL(idx_pdr, "MdF_Bdm_X") }
      if (VAR_EXIST(idx_pdr, "MdF_Bdm_Y"))  { Y = VAR_VAL(idx_pdr, "MdF_Bdm_Y") }
      if (VAR_EXIST(idx_pdr, "MdF_Bdm_Z"))  { Z = VAR_VAL(idx_pdr, "MdF_Bdm_Z") }

      SET_GEST_STATO(ATTUALE(),7,1)
      SET_GEST_STATO(ATTUALE(),8,1)
   }

   PuntiNotevoli
   {
      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]
   }

   Controlli
   {
      if (ACTION() > 0)  { COMANDO(STRCAT("NO_AUTO ", STR(ATTUALE()), " SET")) }
   }

   Posiziona Blocco ved
   {
      @escluso = 1
      if (VAR_EXIST(-1, "MdF_Visualize") == 1)
         {
          if (VAR_TYPE(-1, "MdF_Visualize") == 0)
             {
              if ($MdF_Visualize > -1)  { @escluso = 1-$MdF_Visualize }
             }

          if (STRCMP(VAR_VAL_STR(-1, "MdF_Visualize"), "Always") == 0)  { escl_Grafica = 0 }
         }
      @base_0 = base_0
      @X = X
      @Y = Y
      @Z = Z
   }

   Procedura MdF_noAUTO
   {
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          MdF_comandoOnAUTO = 2
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }
}

Elemento MdF_CilindroZ
{
   Descrizione = "Cilindro x Grafica MdF_"
   Code        = CIL
   Gruppo      = "TMP"
   Tipo        = ""
   Forma       = ZCilindro

   Variabili
   {
      X  ""   10
      Y  ""   10
      Z  ""   12

      HIDE  "non visibile in Edit"  1

      c_rivestimento  ""  [155, 155, 155]
   }

   PuntiNotevoli
   {
      // Meglio lasciare X come dal padre, altrimenti la cerniera destra sembra fuori frontale
      //X=Y
      Y=X
      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]

      SET_GEST_STATO(ATTUALE(),7,1)
      SET_GEST_STATO(ATTUALE(),8,1)
   }
}

Elemento MdF_ImportSatGenerico
{
   Descrizione = "Sat Generico"
   Code        = SAT
   Gruppo      = "TMP"
   Tipo        = ""
   Forma       = Import
   Alias       MdF_ImportSat

   Variabili
   {
      X  ""  100
      Y  ""  100
      Z  ""  100

      HIDE  "non visibile in Edit"  1
      c_rivestimento  ""  [155, 155, 155]

      escluso ""  0
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      SET_GEST_STATO(idx_att, 7, 1)
      SET_GEST_STATO(idx_att, 8, 1)
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          MdF_comandoOnAUTO = 1
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

   Controlli
   {
      if (ACTION() <= 0)  { EXITSUB() }

      idx_CamMdF = PADRE(idx_att, 4)
      escluso = 0
      if (IS_MATCH(VAR_VAL_STR(idx_CamMdF, "MdF_Visualize_sat"), "No") )   { escluso = 1 }
      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Visualize_sat_Par"), "No") )  { escluso = 1 }
     // 23.06.2023
      if (IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "CHIAVE_TAB_CAM"), "*ESCL*") == 1)  { escluso = 1 }
   }

   PuntiNotevoli
   {
      import = STRCAT(VAR_VAL_STR(PADRE(idx_att, 1), "mdf_import"), ".sat")
      __Firma = import

      //if (VAR_EXIST(PADRE(idx_att, 1), "mdF_sat_angz") )
      //   { ang_z = VAR_VAL(PADRE(idx_att, 1), "mdF_sat_angz") }

      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]
   }

   Procedura MdF_noAUTO
   {
      if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
         {
          MdF_comandoOnAUTO = 2
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }
}

Elemento MdF_Blocco
{
   Descrizione = "Blocco"
   Code        = AA
   Gruppo      = "TMP"
   Tipo        = ""
   Forma       = Blocco

   Variabili
   {
      X  ""   25
      Y  ""   25
      Z  ""   25
      c_rivestimento ""  [255, 255, 255]
   }

   PuntiNotevoli
   {
      // 06.12.2017
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

  // 14.11.2023 Ord Sc 2023_zv0000283789_04_t_30880.rit
  // CANCELLA 71658 479\@v1\an0\@v5\@RA1\cer3\base\cam\pntAppl
   // E' impossibile, eppure...
   Procedura cancella
   {
      if ($StartingDel__ == ATTUALE())
         {
          $no_cancel = 1
          COMANDO(STRCAT("LOGMSG MdF_Blocco. Non so come sia possibile che qualcuno abbia cercato di eliminare questo elemento", NOME($StartingDel__), " idx_PadreDi1=", STR(PADRE($StartingDel__, 1)), " padre di 6= ", NOME(PADRE($StartingDel__, 6)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
          COMANDO(STRCAT("VAR_SET$ $no_cancel=0"))
         }
   }
}

Elemento MdF_LavorazioneCAM
{
   Descrizione = "Lav sottoprogramma CAM"
   Code        = CAM
   Gruppo      = "TMP"
   Tipo        = Contenitore
   Forma       = ""
   Alias Lavorazione;Label;DsmIncidenteSD;DsmIncidenteFR

   Variabili
   {
      X  "Larghezza"    2
      Y  "Altezza"      2
      Z  "Profondità"   2

      X_pdr "" 0
      Y_pdr "" 0
      Z_pdr "" 0

      c_rivestimento  ""  [90, 90, 90]
      HIDE     ""  1
      escluso  ""  0

      // Variabili Standard su Controlli CAM
      CAM_ESCLUDI      "esclusione pannello in macchina"      0
      direzione        "direzione vettore"                    -1
      tipoIncidenza    "X,Y,Z"                                ""
      CHIAVE_TAB_CAM   "chiave per tabelle formato T_Pan"     ""
      // Gestendo una profondita maggiore di 2 mi disinteresso delle varie Arie perchè
      // con il CamCabinet non ci sono piu problemi di ambiguità
      Profondita       "prof lavorazione"                     5
      POSIZIONI_LAV    "abilita il vettore di incisione faccia"     ""
      PASSO_LAV        "passo per lavorazione con multi vettori"    0
      BIDIREZIONALE    "sì=abilita entrambe le direzioni rispetto al tipoIncidenza"  "no"
      escl_Lav         ""   0
      escl_Grafica     "visualizza grafica"     1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()

      CAM_NOME = "SOTTOPROG_GENERICO"
      CAM_NOTA = STRCAT("Lav. sottoprogramma da ", NOME(PADRE(idx_att, 1)))

      if (VAR_EXIST(idx_att, "ref_Bidirezionale") == 1)
         { COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET")) }
   }

   Controlli
   {
      if (ACTION() <= 0)  { EXITSUB() }
     // 16.02.2022
      if (ACTION() > 0)
         {
          if (VAR_EXIST(idx_att, "ref_Reverse") == 1)
             {
              if (VAR_EXIST(idx_att, "MdF_comandoOnAUTO") != 1)
                 {
                  MdF_comandoOnAUTO = 1
                  COMANDO(STRCAT("NO_AUTO ", STR(idx_att), " SET"))
                 }
             }
         }

      CAM_CHIAVE_TAB_LAV = CHIAVE_TAB_CAM

      // Se salvo nel cic
      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      if (STRLEN(VAR_VAL_STR(PADRE(idx_att, 1), "POSIZIONI_LAV")) > 0)  { POSIZIONI_LAV = VAR_VAL_STR(PADRE(idx_att, 1), "POSIZIONI_LAV") }
      if (STRLEN(VAR_VAL_STR(PADRE(idx_att, 1), "BIDIREZIONALE")) > 0)  { BIDIREZIONALE = VAR_VAL_STR(PADRE(idx_att, 1), "BIDIREZIONALE") }

     // 12.02.2022
      if (UN_PADRE("MdF_BasettaSXDX") )
         {
          idx_MdF = PADRE(idx_att, 3)
          // L' MdF_LavorazioneCAM relative aggiunto qui non entra mai
          if ( VAR_VAL(idx_MdF, "MCB_BasBat_Revers") == 1
             & VAR_EXIST(idx_att, "ref_Reverse") != 1
             & STRLEN(VAR_VAL_STR(idx_att, "tipoIncidenza")) > 0
             )
             {
              idx_ContLav = PADRE(idx_att, 1)
              if (VAR_VAL(idx_att, "add_ref_revers") == 0)
                 {
                  battuta_Sx = VAR_VAL(idx_MdF, "Battuta_SX")
                  battuta_Dx = VAR_VAL(idx_MdF, "Battuta_DX")
                  Cam_LavRev_offx = -VAR_VAL(idx_MdF, "X") + battuta_Sx + battuta_Dx + VAR_VAL(PADRE(idx_att, 1), "X")
                  if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "SX*") )
                     {
                      Cam_LavRev_offx = VAR_VAL(idx_MdF, "X") - battuta_Sx - battuta_Dx
                     }
                  Cam_LavRev_offy = -Y
                  Cam_LavRev_offz = VAR_VAL(PADRE(idx_att, 1), "CAM_Lav_offz")
                  Cam_LavRev_Ang = 0
                  add_ref_revers = 1
                  COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_ContLav), " ", NOME(idx_att), " A ", STR(Cam_LavRev_offx), " ", STR(Cam_LavRev_offy), " ", STR(Cam_LavRev_offz) , " ", STR(Cam_LavRev_Ang)))
                 }
              if (VAR_VAL(idx_att, "add_ref_revers") > 0)
                 {
                  COMPONENTI2("cam_sprog", idx_ContLav, NOME(idx_att))
                  iS=1
                  while (iS <= cam_sprog)
                     {
                      if (STRLEN(VAR_VAL_STR(cam_sprog[iS], "tipoIncidenza")) == 0)
                         {
                          SET_#(cam_sprog[iS])
                          #tipoIncidenza = tipoIncidenza
                          #direzione = -1*direzione
                          #ref_Reverse = idx_att
                          #CHIAVE_TAB_CAM = CHIAVE_TAB_CAM
                          #X = X
                          #Y = Y
                          #Z = Z
                          if (VAR_VAL(idx_att, "X_pdr") > 0)  { #X_pdr = VAR_VAL(idx_att, "X_pdr") }
                          if (VAR_VAL(idx_att, "Y_pdr") > 0)  { #Y_pdr = VAR_VAL(idx_att, "Y_pdr") }
                          if (VAR_VAL(idx_att, "Z_pdr") > 0)  { #Z_pdr = VAR_VAL(idx_att, "Z_pdr") }
                          // per debug su DDP_gr
                          #CAM_Lav_Reverse = idx_att
                         }
                      iS = iS+1
                     }
                 }
             }
         }
   }

   PuntiNotevoli
   {
      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]

      // Nicola mi dice di metterli sui Controlli e farlo una volta e basta
      // ma sui Controlli non ho il punto relativo e poi qua ci passa una volta sola
      // perchè l'oggetto è inserito solo con la Macro CAM
      // In piu qua ci passa prima dei Controlli

      // Se salvo nel cic
      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      // Qui è posizionato, quindi devo farlo altrimenti i Vettori non sono corretti, infatti vedevo i PuntiNotevoli corretti, ma i vettori no
      //if (CAM_loadOrder == 1)
      //   {
      //    if (ACTION() != 2)  { EXITSUB() }
      //   }
      if (escluso == 0)
         {
          if (VAR_VAL(PADRE(idx_att, 1), "PASSO_LAV") > 0)  { PASSO_LAV = VAR_VAL(PADRE(idx_att, 1), "PASSO_LAV") }

          Profondita = 5
          if (STRCMP(tipoIncidenza, "X") == 0)
             {
              // Evita collisioni-CAM di basette su ante angolate
              if (UN_PADRE("MdF_BasettaSXDX") )
                 {
                  cam_mdf_angoloBas = VAR_VAL(PADRE(idx_att, 3), "MdF_angoloBas")
                  if (cam_mdf_angoloBas != 0  &  ABS(cam_mdf_angoloBas) != 90)
                     {
                      Z = VAR_VAL(PADRE(idx_att, 1), "Z") - 3
                     }
                 }

              if (Profondita > X)  { Profondita = X }
             }
          if (STRCMP(tipoIncidenza, "Y") == 0)
             {
              if (Profondita > Y)  { Profondita = Y }
             }
          if (STRCMP(tipoIncidenza, "Z") == 0)
             {
              if (Profondita > Z)
                 {
                  cam_AngoloGr = ANG_TOT2(PADRE(idx_att, 1))
                  // caso cricchetti Z=1.2 angolo significativo 174.66
                  if ( Z < 2
                     & cam_AngoloGr != 0  &  ABS(cam_AngoloGr) != 90  &  ABS(cam_AngoloGr) != 180
                     )
                     { Profondita = Z+0.3 }
                  else
                     { Profondita = Z }

                  // MdF_CernieraBatt
                  Profondita = 2*Z
                 }
             }
          if (Profondita < 0.5)  { Profondita = 0.5 }

          if (VAR_VAL(PADRE(idx_att, 1), "CAM_ProfonditaVett") > 0)  { Profondita = VAR_VAL(PADRE(idx_att, 1), "CAM_ProfonditaVett") }
          if (VAR_VAL(idx_att, "ProfonditaVett") > 0)                { Profondita = VAR_VAL(idx_att, "ProfonditaVett") }
         }

      // 03.08.2016
      // Problema lavorazioni SD tipoIncidenza X con stanze angolate rischia di sentire la faccia F al posto della S,D
      camProt_off_z = 0.005
      cam_angLav = ABS(FLOOR(ANG_TOT(PADRE(idx_att, 1))*100)/100)
      if (cam_angLav != 90  &  cam_angLav > 85  &  cam_angLav < 95)
         { camProt_off_z = 0.005 + ABS(90-cam_angLav)*0.005 }

      // incidenza in X - sx/dx
      __CamHit_s1 = [0,                    Y/2, Z/2]
      __CamHit_e1 = [Profondita*direzione, Y/2, Z/2]

      __CamHit_s2 = [0,                    0.005, 0.005]
      __CamHit_e2 = [Profondita*direzione, 0.005, 0.005]
      __CamHit_s3 = [0,                    Y-0.005, Z-camProt_off_z]
      __CamHit_e3 = [Profondita*direzione, Y-0.005, Z-camProt_off_z]

      // incidenza in Y - sopra/sotto
      if (STRCMP(tipoIncidenza, "Y") == 0)
         {
          __CamHit_s1 = [X/2, 0,                    Z/2]
          __CamHit_e1 = [X/2, Profondita*direzione, Z/2]

          __CamHit_s2 = [0.005, 0,                    0.005]
          __CamHit_e2 = [0.005, Profondita*direzione, 0.005]
          __CamHit_s3 = [X-0.005, 0,                    Z-0.005]
          __CamHit_e3 = [X-0.005, Profondita*direzione, Z-0.005]
         }

      // incidenza in Z - davanti/dietro
      if (STRCMP(tipoIncidenza, "Z") == 0)
         {
          __CamHit_s1 = [X/2, Y/2, 0]
          __CamHit_e1 = [X/2, Y/2, Profondita*direzione]

          __CamHit_s2 = [0.005, 0.005, 0                   ]
          __CamHit_e2 = [0.005, 0.005, Profondita*direzione]
          __CamHit_s3 = [X-0.005, Y-0.005, 0                   ]
          __CamHit_e3 = [X-0.005, Y-0.005, Profondita*direzione]
         }

      iVar = 4

      if (VAR_EXIST(idx_att, "Passo_VettoreLav") )  { PASSO_LAV = Passo_VettoreLav }

      if (PASSO_LAV > 0)
         {
          if (escluso == 0)
             {
              // Come da LOGMSG entra una sola volta
              //COMANDO2(STRCAT("LOGMSG { PASSO_LAV puntiNotevoli ", STR(idx_att), " ", DATA(1)))

              // incidenza in X - sx/dx
              if (STRCMP(tipoIncidenza, "X") == 0)
                 {
                  qntZ = CEIL(Z/PASSO_LAV)
                  qntY = CEIL(Y/PASSO_LAV)
                 // 04.07.2019 L008807
                  // CEIL(-13/180) = CEIL(-0.072) = 0
                  if (qntZ == 0  |  qntY == 0)
                     {
                      DISPLAY2(STRCAT("Errore CAM division by zero lav.", STR(idx_att), " CamIncidente=", NOME(PADRE(idx_att, 1)), " \n",
                                      "Lav a PASSO con dim-grafiche negative; Z=", STR(Z), " Y=", STR(Y), " PASSO_LAV=", STR(PASSO_LAV), "\n",
                                      "Errore calcolo grafica, esempio se elemento steso"
                                     )
                              )
                      EXIT()
                     }

                  passoY = Y/qntY
                  passoZ = Z/qntZ
                  qnt = qntZ
                  if (qntZ > qntY)
                     {
                      qnt = qntZ
                      passoY = Y/qntZ
                     }
                  if (qntY > qntZ)
                     {
                      qnt = qntY
                      passoZ = Z/qntY
                     }

                  n = 1
                  while (n < qnt)
                     {
                      wk_pnt_s = STRCAT("__CamHit_s", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_s, 0,                    passoY*n, passoZ*n, 0, "")

                      wk_pnt_e = STRCAT("__CamHit_e", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_e, Profondita*direzione, passoY*n, passoZ*n, 0, "")

                      iVar = iVar+1
                      n = n+1
                     }
                  // Linea di Vettori in Y centrali in Z
                  n = 1
                  while (n < qnt)
                     {
                      wk_pnt_s = STRCAT("__CamHit_s", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_s, 0,                    passoY*n, Z/2, 0, "")

                      wk_pnt_e = STRCAT("__CamHit_e", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_e, Profondita*direzione, passoY*n, Z/2, 0, "")

                      iVar = iVar+1
                      n = n+1
                     }

                  n = 1
                  while (n < qnt)
                     {
                      wk_pnt_s = STRCAT("__CamHit_s", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_s, 0,                    Y-passoY*n, passoZ*n, 0, "")

                      wk_pnt_e = STRCAT("__CamHit_e", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_e, Profondita*direzione, Y-passoY*n, passoZ*n, 0, "")

                      iVar = iVar+1
                      n = n+1
                     }
                 }

              // incidenza in Y - sopra/sotto
              if (STRCMP(tipoIncidenza, "Y") == 0)
                 {
                  qntX = CEIL(X/PASSO_LAV)
                  qntZ = CEIL(Z/PASSO_LAV)

                  passoX = X/qntX
                  passoZ = Z/qntZ
                  qnt = qntX
                  if (qntX > qntZ)
                     {
                      qnt = qntX
                      passoZ = Z/qntX
                     }
                  if (qntZ > qntX)
                     {
                      qnt = qntZ
                      passoX = X/qntZ
                     }

                  n = 1
                  while (n < qnt)
                     {
                      wk_pnt_s = STRCAT("__CamHit_s", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_s, passoX*n, 0,                    passoZ*n, 0, "")

                      wk_pnt_e = STRCAT("__CamHit_e", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_e, passoX*n, Profondita*direzione, passoZ*n, 0, "")

                      iVar = iVar+1
                      n = n+1
                     }
                  // Linea di Vettori in X centrali in Z
                  n = 1
                  while (n < qnt)
                     {
                      wk_pnt_s = STRCAT("__CamHit_s", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_s, passoX*n, 0,                    Z/2, 0, "")

                      wk_pnt_e = STRCAT("__CamHit_e", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_e, passoX*n, Profondita*direzione, Z/2, 0, "")

                      iVar = iVar+1
                      n = n+1
                     }
                  n = 1
                  while (n < qnt)
                     {
                      wk_pnt_s = STRCAT("__CamHit_s", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_s, X-passoX*n, 0,                    passoZ*n, 0, "")

                      wk_pnt_e = STRCAT("__CamHit_e", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_e, X-passoX*n, Profondita*direzione, passoZ*n, 0, "")

                      iVar = iVar+1
                      n = n+1
                     }
                 }

              // incidenza in Z - davanti/dietro
              if (STRCMP(tipoIncidenza, "Z") == 0)
                 {
                  qntY = CEIL(Y/PASSO_LAV)
                  qntX = CEIL(X/PASSO_LAV)

                 // 01.07.2019 Gola A012738
                  // CEIL(-5.2/16.9) = CEIL(-0.307) = 0
                  if (qntY == 0  |  qntX == 0)
                     {
                      DISPLAY2(STRCAT("Errore CAM division by zero lav.", STR(idx_att), " CamIncidente=", NOME(PADRE(idx_att, 1)), " \n",
                                      "Lav a PASSO con dim-grafiche negative; X=", STR(X), " Y=", STR(Y), " PASSO_LAV=", STR(PASSO_LAV), "\n",
                                      "Errore calcolo grafica, esempio se elemento steso"
                                     )
                              )
                      EXIT()
                     }
                  passoY = Y/qntY
                  passoX = X/qntX
                  qnt = qntY
                  if (qntY > qntX)
                     {
                      qnt = qntY
                      passoX = X/qntY
                     }
                  if (qntX > qntY)
                     {
                      qnt = qntX
                      passoY = Y/qntX
                     }

                  // Devo fare 2 linee a croce in modo da prendere tutti i pezzi.
                  // Con un ciclo faccio dei punti da sinistra a destra e dal basso verso l'alto
                  n = 1
                  while (n < qnt)
                     {
                      wk_pnt_s = STRCAT("__CamHit_s", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_s, passoX*n, passoY*n, 0,                    0, "")

                      wk_pnt_e = STRCAT("__CamHit_e", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_e, passoX*n, passoY*n, Profondita*direzione, 0, "")

                      iVar = iVar+1
                      n = n+1
                     }
                  // Linea di Vettori in Y centrali in X
                  n = 1
                  while (n < qnt)
                     {
                      wk_pnt_s = STRCAT("__CamHit_s", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_s, X/2, passoY*n, 0,                    0, "")

                      wk_pnt_e = STRCAT("__CamHit_e", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_e, X/2, passoY*n, Profondita*direzione, 0, "")

                      iVar = iVar+1
                      n = n+1
                     }
                  // Con un ciclo faccio dei punti come una linea da destra a sinistra e dal basso verso l'alto
                  // Vedi gola orizzontale su fianco destro, se con i punti parto da sinistra verso destra
                  // e dal basso verso l'alto se la gola termina piu alta del fianco rischio di non
                  // trovarlo
                  n = 1
                  while (n < qnt)
                     {
                      wk_pnt_s = STRCAT("__CamHit_s", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_s, X-passoX*n, passoY*n, 0,                    0, "")

                      wk_pnt_e = STRCAT("__CamHit_e", STR(iVar))
                      VAR_CREATE_XYZ(idx_att, wk_pnt_e, X-passoX*n, passoY*n, Profondita*direzione, 0, "")

                      iVar = iVar+1
                      n = n+1
                     }
                 }
              //COMANDO2(STRCAT("LOGMSG } PASSO_LAV puntiNotevoli ", STR(idx_att), " ", DATA(1)))
             }
         }
   }

   Cam
   {
      if (VAR_EXIST(-1, "cam_inciso") == 0)  { EXITSUB() }

      CAM_DIM_X = X
      CAM_DIM_Y = Y
      CAM_DIM_Z = Z
      if (VAR_EXIST(PADRE(idx_att, 1), "CAM_DIM_X_reale") )  { CAM_DIM_X = VAR_VAL(PADRE(idx_att, 1), "CAM_DIM_X_reale") }
      if (VAR_EXIST(PADRE(idx_att, 1), "CAM_DIM_Y_reale") )  { CAM_DIM_Y = VAR_VAL(PADRE(idx_att, 1), "CAM_DIM_Y_reale") }
      if (VAR_EXIST(PADRE(idx_att, 1), "CAM_DIM_Z_reale") )  { CAM_DIM_Z = VAR_VAL(PADRE(idx_att, 1), "CAM_DIM_Z_reale") }
      if (X_pdr > 0)  { CAM_DIM_X = X_pdr }
      if (Y_pdr > 0)  { CAM_DIM_Y = Y_pdr }
      if (Z_pdr > 0)  { CAM_DIM_Z = Z_pdr }

      cam_idx_Cont_MdF_Reg = PADRE(idx_att, 3)
      if (HAS_ALIAS(cam_idx_Cont_MdF_Reg, "MdF_CAM") != 1)
         { cam_idx_Cont_MdF_Reg = PADRE(idx_att, 4) }

      GOSUB CAM_LAV_VAR_MDF_EREDITA
      if ( VAR_VAL(PADRE(idx_att, 3), "MdF_CerBat_Std2020") != 2
         & VAR_VAL(PADRE(idx_att, 4), "MdF_CerBat_Std2020") != 2
         )
         {
          GOSUB CAM_VariabiliLavorazione
         }

      idx_CamIncidente = PADRE(idx_att, 1)
      CAM_LAV_AngoloGr = ANG_TOT2(idx_CamIncidente)
      // Intanto per sicurezza solo su tipoIncidenza Y
      if (STRCMP(tipoIncidenza, "Y") == 0)
         {
          if (VAR_EXIST(idx_att, "ang_y") == 1)
             { CAM_LAV_AngoloGr = ANG_TOT2(idx_att) }
         }

      if (VAR_EXIST(idx_CamIncidente, "ang_z") )
         { CAM_LAV_AngoloGr_z = VAR_VAL(idx_CamIncidente, "ang_z") }

      if (VAR_EXIST(idx_att, "CAM_LAV_idx_Scocca") != 1)  { CAM_LAV_idx_Scocca = PADRE(idx_att, -1) }
     // 26.09.2017
      if (VAR_EXIST(idx_att, "CAM_LAV_AlScocca") != 1)
         {
          // 12.04.2019
          if (VAR_EXIST(PADRE(idx_att, 1), "DTP_AliasScocca") )  { CAM_LAV_AlScocca = VAR_VAL_STR(PADRE(idx_att, 1), "DTP_AliasScocca") }
          if (VAR_EXIST(PADRE(idx_att, 2), "DTP_AliasScocca") )  { CAM_LAV_AlScocca = VAR_VAL_STR(PADRE(idx_att, 2), "DTP_AliasScocca") }
          if (VAR_EXIST(PADRE(idx_att, 3), "DTP_AliasScocca") )  { CAM_LAV_AlScocca = VAR_VAL_STR(PADRE(idx_att, 3), "DTP_AliasScocca") }
         }

      if (VAR_VAL(-1, "cam_inciso") == -1)  { EXITSUB() }
      if (HAS_ALIAS($cam_inciso, "DsmInciso") )
         {
          CAM_NOME = "SOTTOPROG_DsmInciso"
          CAM_DSM_CODICE = VAR_VAL_STR(idx_att, "CHIAVE_TAB_CAM")
          CAM_ESCLUDI = 0
          if (UN_PADRE("MdF_CernieraBatt") )
             {
              if (IS_MATCH(NOME(PADRE($cam_inciso, 1)), "*Fia*") )
                 { CAM_ESCLUDI = 1 }
             }
          if (UN_PADRE("MdF_BasettaSXDX") )
             {
              if ( IS_MATCH(NOME(PADRE($cam_inciso, 1)), "*Ant*")
                 | IS_MATCH(NOME(PADRE($cam_inciso, 1)), "*Cass*")
                 | IS_MATCH(NOME(PADRE($cam_inciso, 1)), "*Cest*")
                 )
                 { CAM_ESCLUDI = 1 }
             }
         }

      angLav = FLOOR(ANG_TOT(PADRE(idx_att, 2))*100)/100
      angInc = FLOOR(ANG_TOT($cam_inciso)*100)/100
      CAM_LAV_ANG = angLav - angInc
      if ( ABS(CAM_LAV_ANG) > 360
         & VAR_EXIST($cam_inciso, "CAM_TST_TST_AngoloGr") == 1
         )
         { CAM_LAV_ANG = CAM_LAV_AngoloGr - VAR_VAL($cam_inciso, "CAM_TST_TST_AngoloGr") }

      if (CAM_LAV_ANG == -360)  { CAM_LAV_ANG = 0 }

      // Intanto per sicurezza solo su tipoIncidenza Y
      if (STRCMP(tipoIncidenza, "Y") == 0)
         {
          if (CAM_LAV_ANG > 0.2 & CAM_LAV_ANG <= 90)
             { CAM_LAV_AngoloGr = ANG_TOT2(idx_att) }
         }

      if (ABS(CAM_LAV_ANG) > 175  &  ABS(CAM_LAV_ANG) < 185)  { CAM_LAV_BIFACCIALE = 1 }

      if (STRCMP(tipoIncidenza, "X") == 0)
         {
          if (direzione == -1)  { CAM_Lav_FACCIA_Incidente = "S" }
          if (direzione == 1)   { CAM_Lav_FACCIA_Incidente = "D" }
         }
      if (STRCMP(tipoIncidenza, "Y") == 0)
         {
          if (direzione == -1)  { CAM_Lav_FACCIA_Incidente = "B" }
          if (direzione == 1)   { CAM_Lav_FACCIA_Incidente = "A" }
         }
      if (STRCMP(tipoIncidenza, "Z") == 0)
         {
          if (direzione == -1)  { CAM_Lav_FACCIA_Incidente = "R" }
          if (direzione == 1)   { CAM_Lav_FACCIA_Incidente = "F" }
         }

      if (VAR_EXIST(idx_att, "cam_Lav_idxInciso") )
         {
          if (cam_Lav_idxInciso != $cam_inciso)
             {
              cam_Lav_idxInciso_##1 = cam_Lav_idxInciso
              cam_Lav_idxInciso_##2 = $cam_inciso
             }
         }

      cam_Lav_idxInciso = $cam_inciso
      cam_Lav_CHIAVE_TST = VAR_VAL_STR($cam_inciso, "CAM_TST_CHIAVE_TAB_TST")
      cam_Lav_Z_Inc = VAR_VAL($cam_inciso, "Z")

      if (VAR_EXIST(idx_CamIncidente, "id_Reg") )
         {
          CAM_Lav_id_Reg = VAR_VAL(idx_CamIncidente, "id_Reg")
          if (STRLEN(VAR_VAL_STR(PADRE(idx_att, 2), "KeyFamRegFacc")) > 0)
             {
              cam_idx_KeyFam = PADRE(idx_att, 2)
              if (UN_PADRE("MdF_FerramentaSu*") )  { cam_idx_KeyFam = PADRE(idx_att, 1) }

              CAM_Lav_id_Reg = STRCAT(VAR_VAL_STR(cam_idx_KeyFam, "KeyFamRegFacc"), "_", STR(CAM_Lav_id_Reg))

              tLav = "CerBat"
              idEle = VAR_VAL(idx_CamIncidente, "id_Cer")
              cam_var_id_Reg_ToSearch = STRCAT("id_Reg_STR_", tLav, STR(idEle))
              if (VAR_EXIST(PADRE(cam_idx_KeyFam, 1), cam_var_id_Reg_ToSearch) == 1)
                 {
                  cam_id_Reg_STR = VAR_VAL_STR(PADRE(cam_idx_KeyFam, 1), cam_var_id_Reg_ToSearch)
                  CAM_Lav_id_Reg = STRCAT(VAR_VAL_STR(PADRE(cam_idx_KeyFam, 1), "KeyFamRegFacc"), "_", cam_id_Reg_STR)
                 }
             }
          if (VAR_EXIST(idx_CamIncidente, "MdfSys_collY_sposta") )
             {
              CAM_Lav_CollY_CerBat_sposta = VAR_VAL(idx_CamIncidente, "MdfSys_collY_sposta")

              cam_idCer = VAR_VAL(idx_CamIncidente, "id_Cer")

              cam_var_coll_case = STRCAT("MdfSys_Collision", STR(cam_idCer), "_Case")
              CAM_Lav_MdfSys_Collision_Case = VAR_VAL(PADRE(idx_att, 3), cam_var_coll_case)

              cam_var_coll_y_mm = STRCAT("MdfSys_Collision", STR(cam_idCer), "_y_mm")
              CAM_Lav_MdfSys_Collision_y_mm = VAR_VAL(PADRE(idx_att, 3), cam_var_coll_y_mm)

              // 02.09.2020
              if (VAR_EXIST(PADRE(idx_att, 3), "mdf_CerVic_case") )
                 {
                  if ( CAM_Lav_MdfSys_Collision_Case == 0
                     | CAM_Lav_MdfSys_Collision_y_mm != ABS(CAM_Lav_CollY_CerBat_sposta)
                     )
                     {
                      CAM_Lav_MdfSys_Collision_CerVicCase = VAR_VAL(PADRE(idx_att, 3), "mdf_CerVic_case")
                     }
                 }
             // 13.03.2023
              cam_var_coll_idx = STRCAT("MdfSys_Collision", STR(cam_idCer), "_idx")
             // 15.03.2024
              if (VAR_EXIST(PADRE(idx_att, 3), cam_var_coll_idx) )
                 { CAM_Lav_MdfSys_Collision_arch = NOME(VAR_VAL(PADRE(idx_att, 3), cam_var_coll_idx)) }
             // 28.03.2023
              cam_var_coll_idx_2Ele = STRCAT("MdfSys_Collision", STR(cam_idCer), "_idx_2Ele")
              if (VAR_EXIST(PADRE(idx_att, 3), cam_var_coll_idx_2Ele) )
                 {
                  CAM_Lav_MdfSys_Collision_arch_2Ele = NOME(VAR_VAL(PADRE(idx_att, 3), cam_var_coll_idx_2Ele))
                 }
             }
          // Spesso sulle lav. fianchi dai meccanismiDaFrontali potrebbero servire le dimensioni del frontale, quindi le passo da sistema
          // invece di passarle sul pannello Fianco, o andarle a ricercare da VariabiliLavorazione.txt
          CAM_Lav_X_MdFrontali = VAR_VAL(PADRE(idx_att, 3), "X")
          CAM_Lav_Y_MdFrontali = VAR_VAL(PADRE(idx_att, 3), "Y")
         // 17.02.2020
          if (PADRE(idx_att, 4) != PADRE($cam_inciso, 1))
             {
              CAM_Lav_IDX_Frontale = PADRE(idx_att, 4)
              CAM_Lav_MdF_Apertura = VAR_VAL_STR(PADRE(idx_att, 3), "MdF_Apertura")
             }
         }
      GOSUB cam_NoteDDP
   }

   Posiziona MdF_Blocco  pntAppl
   {
      @escluso = 1
      if (VAR_VAL(-1, "CAM_Visualize") > 0)  { @escluso = 0 }
      @c_rivestimento = [0, 64, 0]
      if (VAR_EXIST(idx_att, "ref_Bidirezionale") )
         { @c_rivestimento = [36, 251, 41] }

      @f_rivestimento = STR(100*0.005)

      @base_0 = base_0

      // Visto che e' identificativo dell' incidenza della lavorazione,
      // piuttosto di fare il blocco identico al padre come un etichetta
      // è piu rappresentativo il blocco che racchiude i vettori visto
      // che devono partire da fuori la faccia e penetrano la faccia
      if (direzione < 0)
         { @base_0.x = base_0.x - Profondita }
      @X = Profondita
      @Y = Y
      @Z = Z
      if (STRCMP(tipoIncidenza, "Y") == 0)
         {
          @base_0 = base_0
          if (direzione < 0)
             { @base_0.y = base_0.y - Profondita }
          @X = X
          @Y = Profondita
          @Z = Z
         }

      if (STRCMP(tipoIncidenza, "Z") == 0)
         {
          @base_0 = base_0
          if (direzione < 0)
             { @base_0.z = base_0.z - Profondita }
          @X = X
          @Y = Y
          @Z = Profondita
         }
   }

  // 16.02.2022
   Procedura MdF_noAUTO
   {
      if (VAR_EXIST(idx_att, "ref_Reverse") == 1)
         {
          MdF_comandoOnAUTO = 2
          COMANDO(STRCAT("NO_AUTO ", STR(idx_att) , " SET"))
         }
   }

  // 08.03.2022
   Procedura cancella
   {
      if ($StartingDel__ == ATTUALE())
         {
          $no_cancel = 1
          DISPLAY2("Non e' possibile cancellare in questo modo. Se la cerniera non e' idonea contattare uff.tecnico che si occuperà di sistemare")
          COMANDO(STRCAT("VAR_SET$ $no_cancel=0"))
         }
   }
}

Elemento MECCANISMO_UTENTE_CerBat
{
   Descrizione = "MECCANISMI DA FRONTALI UTENTE CerBat"
   Code        = GRANT
   Gruppo      = "MeccanismiDaFrontali"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   //Alias         MdF_CAM;MdF_Utente
   Alias         MdF_CAM;MdF_CerBat;MdF_Utente

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22
      //HIDE  ""  3

      MdF_Apertura                 "Apertura Generica"                    ""

      MdF_Visualize_sat            ""                                     ""
      Battuta_X                    "battuta in X rispetto al fianco"      0
      Battuta_Z                    "battuta in Z rispetto al fianco"      0
      KeyFamRegFacc_CerBat         ""                                     ""
      MCB_ElementoBdm_CerBat       ""                                     ""
      MCB_ElementoBdm_BasBat       ""                                     ""
      CHIAVE_TAB_CAM_CerBat1       ""                                     ""
      px_CerBat1                   "pos X Cerniera Battente UTENTE"       1
      pz_CerBat1                   "pos Z Cerniera Battente UTENTE"       1
      X_CerBat1                    ""                                     1
      Y_CerBat1                    ""                                     1
      Z_CerBat1                    ""                                     1

      img_sat_F1_CerBat            ""                                     ""
      img_sat_E2_CerBat            ""                                     ""
      //offxyz_sat_F1_CerBat         ""                                     ""
      //offxyz_sat_E2_CerBat         ""                                     ""

      py_CerBat1                   "pos Y Cerniera Battente UTENTE"       0

      MdF_Apertura_Utente          "Apertura Utente SX,DX"                "--"  TabStringa ( "\mnu\MdF_MenuSxDx.mnu" )

      M4_NO_OFFS                   "Sezione Posizone Disabilitata"        1

      // per Virtuo
      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      GOSUB MdF_SetStato_NoGEST
   }

   Attrezza
   {
      base_0 = @base_0
      base_0.z = @base_0.z
      X = @X
      Y = @Y
      Z = @Z
   }

   Procedura OnQueryBdmLocal
   {
      if ($query_type == 8)
         {
          idx_ref = $query_p1
          annulla_ins = 0
          if ( VAR_EXIST(idx_ref, "MdF_Utente") != 1
             | IS_MATCH(VAR_VAL_STR(idx_ref, "MdF_Utente"), "No*")
             )
             { annulla_ins = 1 }

          $QueryResult__ = 1-annulla_ins
         }
   }

   Controlli
   {
      idx_att = ATTUALE()
      idx_CamMdF = PADRE(idx_att, 1)
      nome_CamMdF = NOME(idx_CamMdF)

      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")
      Z = VAR_VAL(idx_CamMdF, "Z")

      //if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      //if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      //if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      idx_MdF_Var = idx_att
     // Ottimizzazioni
      GOSUB MdF_Ctrl_var_cam_Init
      GOSUB MdF_ctrl_Change_Var_CAM
      if (mdf_ctrl_Change_Var_CAM > 0)
         {
          GOSUB MdF_VariabiliDaTipoPadri
          CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "keyGenericaMdF"
          GOSUB MdF_Variabili
          if (VAR_VAL(idx_att, "mdf_ctrl_Change_SbordoY") > 0)  { GOSUB MdF_Battuta_X }

          CHIAVE_TABVAR_MDF = "CerBat"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = STRCAT("CerBatMdF", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_CerBatMdF"))
          GOSUB MdF_Variabili
         }

      GOSUB MdF_Battuta_X
      //GOSUB MdF_Battuta_Y

      GOSUB MdF_Ctrl_SbordoY_padre

      MdF_Visualize_sat      = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Visualize_sat")
      KeyFamRegFacc_CerBat   = VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_CerBat")
      MCB_ElementoBdm_CerBat = VAR_VAL_STR(PADRE(idx_att, 1), "MCB_ElementoBdm_CerBat")
      MCB_ElementoBdm_BasBat = VAR_VAL_STR(PADRE(idx_att, 1), "MCB_ElementoBdm_BasBat")

     // 13.09.2024
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_Apertura") )
         {
          if ( IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Utente"), "No*")
             | STRLEN(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Utente")) <= 2
             )
             {
              if ( IS_VAR_FIXED(idx_att, "py_CerBat1") != 1
                 & py_CerBat1 <= 0
                 )
                 {
                  DISPLAY2(STRCAT("Operazione Utente CerBat non abilitata MdF_Utente=", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Utente")))
                  escluso = 10
                  //if (ACTION() != 2  &  VAR_VAL(idx_att, "MdF_Post_LoadOrder") > 0)
                  COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // ", NOME(idx_att), " MdF_Utente non abil"))
                  EXITSUB()
                 }
             }
         }

      mdf_NoRegFacc = 0
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_Apertura") )
         {
          COMPONENTI2("mdf_CerBatRegFacc", PADRE(idx_att, 1), "MdF_CernieraBatt")
          mdf_padre_io = 0
          mdf_padre_ute = 0
          iMC = 1
          while (iMC <= mdf_CerBatRegFacc)
             {
              if (PADRE(mdf_CerBatRegFacc[iMC], 2) == idx_att)
                 { mdf_padre_io = mdf_padre_io+1 }
              else
                 {
                  if (IS_MATCH(NOME(PADRE(mdf_CerBatRegFacc[iMC], 2)), "MECC*UTE*") )
                     { mdf_padre_ute = mdf_padre_ute+1 }
                 }

              iMC = iMC+1
             }

          // 13.01.2025
          py_gia_fixed_da_rit = 0
          if (IS_VAR_FIXED(idx_att, "py_CerBat1") == 1)  { py_gia_fixed_da_rit = 1 }

          if (mdf_CerBatRegFacc == mdf_padre_io+mdf_padre_ute)
             {
              // 20.09.2024
              //DISPLAY2("Operazione non possibile. Non trovo CerBat da RegoleCAM")
              //escluso = 10
              //if (ACTION() == 2)
              //   {
              //    COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // ", NOME(idx_att), " Non gestita"))
              //   }
              //EXITSUB()
              mdf_NoRegFacc = 1
              // Per test CAM, altrimenti va definita CerBasBat_UTENTE sulle lavant,fia1,2,3.tab
              //chiave_tab_cam = "CerBasBat"
              chiave_tab_cam = "CerBasBat_UTENTE"
              CHIAVE_TAB_CAM_CerBat1 = chiave_tab_cam

              px_CerBat1 = 21.5
              pz_CerBat1 = 50

              img_sat_F1_CerBat1 = "MdF_CernieraBatt_SX"
              img_sat_E2_CerBat1 = "MdF_BasettaBatt_SX"

              offxyz_sat_F1_CerBat1 = "-15;-12;8.1;0;28;-12;8.1;0"
              offxyz_sat_E2_CerBat1 = "0;2.4;-25.5;0;0;2.4;-25.5;0"

              X_CerBat1 = 51
              Y_CerBat1 = 42
              Z_CerBat1 = 50

              str_max_X = STR(X-10)
              if (VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X") > 50)  { str_max_Y = STR(VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X")-10) }

              str_max_Y = STR(Y-49.5)
              if (VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y") > 50)  { str_max_Y = STR(VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y")-49.5) }

              if ( IS_MATCH(MdF_Apertura_Utente, "SX*") != 1
                 & IS_MATCH(MdF_Apertura_Utente, "DX*") != 1
                 )
                 {
                 // 05.12.2024 altrimenti chiede in caricamento ordine perchè inizialmente non ha ancora la regola RegFacc
                 // Qui deve entrare solo se non ho la RegFacc presente, appunto se mdf_NoRegFacc=1
                  if ( IS_VAR_FIXED(idx_att, "px_CerBat1") != 1
                     // 13.01.2025
                     & py_gia_fixed_da_rit == 0
                     )
                     {
                      CHIEDI(idx_att, "MdF_Apertura_Utente")
                     }
                 }

              // Se aggiunto prima che esistesse MdF_Apertura_Utente e' ancora --
              if (MdF_Apertura_Utente != "--")
                 {
                  MdF_Apertura = UPPER(MdF_Apertura_Utente)
                 }

              in_ins = 0
              iq=1
              varPos = STRCAT("py_CerBat", STR(iq))
              VAR_SET_MODE(idx_att, varPos, $MODE_USER)
              VAR_SET_MENU(idx_att, varPos, STRCAT("( 49.5-", str_max_Y, " )"))
              if (IS_VAR_FIXED(idx_att, varPos) != 1)
                 {
                  CHIEDI(idx_att, varPos)
                  in_ins = 1
                 }

              varPos = STRCAT("px_CerBat", STR(iq))
              VAR_SET_MODE(idx_att, varPos, $MODE_USER)
              VAR_SET_MENU(idx_att, varPos, STRCAT("( 10-", "100", " )"))
              if ( IS_VAR_FIXED(idx_att, varPos) != 1
                 // 13.01.2025
                 & py_gia_fixed_da_rit == 0
                 )
                 { CHIEDI(idx_att, varPos) }

              varPos = STRCAT("pz_CerBat", STR(iq))
              VAR_SET_MODE(idx_att, varPos, $MODE_USER)
              VAR_SET_MENU(idx_att, varPos, STRCAT("( 0-", "120 )"))
              if (IS_VAR_FIXED(idx_att, varPos) != 1
                 // 13.01.2025
                 & py_gia_fixed_da_rit == 0
                 )
                 { CHIEDI(idx_att, varPos) }

              if (VAR_VAL(idx_att, "Battuta_X") == 0)
                 {
                  Battuta_X = VAR_VAL(idx_att, "Battuta_X_Sx")
                  if (IS_MATCH(MdF_Apertura, "DX*") )  { Battuta_X = VAR_VAL(idx_att, "Battuta_X_Dx") }
                 }

              img_sat_F1_CerBat1 = STRCAT("MdF_CernieraBatt_", MdF_Apertura)
              img_sat_E2_CerBat1 = STRCAT("MdF_BasettaBatt_", MdF_Apertura)

              // Bisognerebbe chiedere anche MdF_angoloBas se si volessero fare le ANP
             }
         }

      if (mdf_NoRegFacc == 0)
         {
          if ( IS_MATCH(MdF_Apertura, "S*")
             | IS_MATCH(MdF_Apertura, "D*")
             )
             {
              COMPONENTI2("mdf_CerBatRegFacc", PADRE(idx_att, 1), "MdF_CernieraBatt")

              // Per ora tengo questo Default
              chiave_tab_cam = "UTENTE"
              CHIAVE_TAB_CAM_CerBat1 = chiave_tab_cam

              px_CerBat1 = 21.5
              pz_CerBat1 = 50

              img_sat_F1_CerBat1 = "MdF_CernieraBatt_SX"
              img_sat_E2_CerBat1 = "MdF_BasettaBatt_SX"

              offxyz_sat_F1_CerBat1 = "-15;-12;8.1;0;28;-12;8.1;0"
              offxyz_sat_E2_CerBat1 = "0;2.4;-25.5;0;0;2.4;-25.5;0"

              X_CerBat1 = 51
              Y_CerBat1 = 42
              Z_CerBat1 = 50

              HIDE_ON_EDIT(idx_att, "MdF_Apertura_Utente", 1)

              iMC = 1
              while (iMC <= mdf_CerBatRegFacc)
                 {
                  if ( IS_MATCH(NOME(PADRE(mdf_CerBatRegFacc[iMC], 3)), "MECCANISM*_UTENTE*") != 1
                     & IS_MATCH(NOME(PADRE(mdf_CerBatRegFacc[iMC], 2)), "MECCANISM*_UTENTE*") != 1
                     )
                     {
                      px_CerBat1 = VAR_VAL(PADRE(mdf_CerBatRegFacc[iMC], 2), "px_CerBat1")
                      pz_CerBat1 = VAR_VAL(PADRE(mdf_CerBatRegFacc[iMC], 2), "pz_CerBat1")

                      img_sat_F1_CerBat1 = VAR_VAL_STR(PADRE(mdf_CerBatRegFacc[iMC], 2), "img_sat_F1_CerBat1")
                      img_sat_E2_CerBat1 = VAR_VAL_STR(PADRE(mdf_CerBatRegFacc[iMC], 2), "img_sat_E2_CerBat1")

                      offxyz_sat_F1_CerBat1 = VAR_VAL_STR(PADRE(mdf_CerBatRegFacc[iMC], 2), "offxyz_sat_F1_CerBat1")
                      offxyz_sat_E2_CerBat1 = VAR_VAL_STR(PADRE(mdf_CerBatRegFacc[iMC], 2), "offxyz_sat_E2_CerBat1")

                      chiave_tab_cam = VAR_VAL_STR(mdf_CerBatRegFacc[iMC], "CHIAVE_TAB_CAM")
                      CHIAVE_TAB_CAM_CerBat1 = chiave_tab_cam
                      X_CerBat1 = VAR_VAL(PADRE(mdf_CerBatRegFacc[iMC], 1), "X_eleFro")
                      Y_CerBat1 = VAR_VAL(PADRE(mdf_CerBatRegFacc[iMC], 1), "Y_eleFro")
                      Z_CerBat1 = VAR_VAL(PADRE(mdf_CerBatRegFacc[iMC], 1), "Z_BasFia")

                      MdF_angoloBas = VAR_VAL(PADRE(mdf_CerBatRegFacc[iMC], 1), "MdF_angoloBas")

                      iMC = mdf_CerBatRegFacc
                     }
                  iMC = iMC+1
                 }

              str_max_Y = STR(Y-49.5)
              if (VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y") > 50)  { str_max_Y = STR(VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y")-49.5) }

              prosegui_chiedi = 0
              if ( VAR_EXIST(idx_att, "chiedi_nomaked") != 1
                 & IS_VAR_FIXED(idx_att, "py_CerBat1") != 1
                 )
                 { prosegui_chiedi = 1 }

              if (prosegui_chiedi > 0)
                 {
                  chiedi_nomaked = 1
                  iq=1
                  while (iq <= 1)
                     {
                      varPy = STRCAT("py_CerBat", STR(iq))
                      VAR_SET_MODE(idx_att, varPy, $MODE_USER)
                      VAR_SET_MENU(idx_att, varPy, STRCAT("( 49.5-", str_max_Y, " )"))
                      CHIEDI(idx_att, varPy)
                      iq = iq+1
                     }
                 }
              else
                 {
                  iq=1
                  while (iq <= 1)
                     {
                      varPy = STRCAT("py_CerBat", STR(iq))
                      VAR_SET_MODE(idx_att, varPy, $MODE_USER)
                      VAR_SET_MENU(idx_att, varPy, STRCAT("( 49.5-", str_max_Y, " )"))

                      iq = iq+1
                     }
                 }
             }
         }

      COMPONENTI3("mdf_cernBa", idx_att, "MdF_CernieraBasetta_Batt")
      if (mdf_cernBa > 0)
         {
          if (VAR_VAL(mdf_cernBa[1], "cerCancellata") == 1)
             {
              COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // MECCANISMO_UTENTE_CerBat cerCancellata"))
             }
         }
      DescEdit__ = STRCAT("Cerniera_UTE_", KeyFamRegFacc_CerBat, "_py", STR(py_CerBat1))
      if (mdf_NoRegFacc > 0)
         {
          DescEdit__ = STRCAT("Cerniera_UTE_", VAR_VAL_STR(idx_att, "chiave_tab_cam"), "_py", STR(py_CerBat1))
         }
      if (VAR_EXIST(idx_att, "base_0_offset") )
         {
          mdf_deb_basoffsety = VAR_VAL(idx_att, "base_0_offset.y")
          DEL_VAR(idx_att, "base_0_offset")
          COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_agganciati", " // ", NOME(idx_att), " x sezione Posizione non abilitata"))
         }
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_CernieraBasetta_Batt  cer1
   {
      @escluso = 1
      if (py_CerBat1 > 0  &  Y_CerBat1 > 1)  { @escluso = 0 }

      @base_0 = base_0
      @base_0.x = base_0.x + Battuta_X
      @base_0.y = base_0.y + py_CerBat1
      if (IS_MATCH(MdF_Apertura, "DX*") == 1)
         { @base_0.x = base_3.x - Battuta_X - @X }
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc_CerBat
      @pos_X_cerAnta = px_CerBat1-Battuta_X
      @id_Cer = 1

      @KeyFamRegFacc = KeyFamRegFacc_CerBat
   }

   Procedura MdF_Ctrl_Post_LoadOrder
   {
      MdF_Post_LoadOrder = 1
      COMPONENTI2("mdf_CerBatRegFacc", PADRE(idx_att, 1), "MdF_CernieraBatt")
      iMC = 1
      while (iMC <= mdf_CerBatRegFacc)
         {
          if ( IS_MATCH(NOME(PADRE(mdf_CerBatRegFacc[iMC], 3)), "MECCANISM*_UTENTE*") != 1
             & IS_MATCH(NOME(PADRE(mdf_CerBatRegFacc[iMC], 2)), "MECCANISM*_UTENTE*") != 1
             )
             {
              px_CerBat1 = VAR_VAL(PADRE(mdf_CerBatRegFacc[iMC], 2), "px_CerBat1")
              pz_CerBat1 = VAR_VAL(PADRE(mdf_CerBatRegFacc[iMC], 2), "pz_CerBat1")

              img_sat_F1_CerBat1 = VAR_VAL_STR(PADRE(mdf_CerBatRegFacc[iMC], 2), "img_sat_F1_CerBat1")
              img_sat_E2_CerBat1 = VAR_VAL_STR(PADRE(mdf_CerBatRegFacc[iMC], 2), "img_sat_E2_CerBat1")

              offxyz_sat_F1_CerBat1 = VAR_VAL_STR(PADRE(mdf_CerBatRegFacc[iMC], 2), "offxyz_sat_F1_CerBat1")
              offxyz_sat_E2_CerBat1 = VAR_VAL_STR(PADRE(mdf_CerBatRegFacc[iMC], 2), "offxyz_sat_E2_CerBat1")

              chiave_tab_cam_CerBat = VAR_VAL_STR(mdf_CerBatRegFacc[iMC], "CHIAVE_TAB_CAM")
              CHIAVE_TAB_CAM_CerBat1 = chiave_tab_cam_CerBat
              X_CerBat1 = VAR_VAL(PADRE(mdf_CerBatRegFacc[iMC], 1), "X_eleFro")
              Y_CerBat1 = VAR_VAL(PADRE(mdf_CerBatRegFacc[iMC], 1), "Y_eleFro")
              Z_CerBat1 = VAR_VAL(PADRE(mdf_CerBatRegFacc[iMC], 1), "Z_BasFia")

              MdF_angoloBas = VAR_VAL(PADRE(mdf_CerBatRegFacc[iMC], 1), "MdF_angoloBas")

              iMC = mdf_CerBatRegFacc
             }
          iMC = iMC+1
         }
   }
}

Elemento MECCANISMO_UTENTE_CerVasRib
{
   Descrizione = "MECCANISMI DA FRONTALI UTENTE CerVasRib"
   Code        = GRANT
   Gruppo      = "MeccanismiDaFrontali"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   Alias         MdF_CAM;MdF_Utente

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22
      //HIDE  ""  3

      MdF_Apertura                 "Apertura Generica"                    ""

      MdF_Visualize_sat            ""                                     ""

      Battuta_X                    "battuta in X rispetto al fianco"      0
      Battuta_Y                    "battuta in Y rispetto al Fon/cop"     0
      Battuta_Z                    "battuta in Z rispetto al fianco"      0

      KeyFamRegFacc_CerRib         ""                                     ""
      MCR_ElementoBdm_CerRib       ""                                     ""
      MCR_ElementoBdm_BasRib       ""                                     ""
      CHIAVE_TAB_CAM_CerRib1       ""                                     ""

      py_CerRib1                   "pos Y Cerniera RibVas UTENTE"         1
      pz_CerRib1                   "pos Z Cerniera RibVas UTENTE"         1
      X_CerRib1                    ""                                     1
      Y_CerRib1                    ""                                     1
      Z_CerRib1                    ""                                     1

      img_sat_F1_CerRib1           ""                                     ""
      img_sat_E2_CerRib1           ""                                     ""

      px_CerRib1                   "pos X Cerniera RibVas UTENTE"         0

      MdF_Apertura_Utente          "Apertura Utente VA,RI"                "--"  TabStringa ( "\mnu\MdF_MenuVaRi.mnu" )

      M4_NO_OFFS                   "Sezione Posizone Disabilitata"        1

      // per Virtuo
      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      GOSUB MdF_SetStato_NoGEST
   }

   Attrezza
   {
      base_0 = @base_0
      base_0.z = @base_0.z
      X = @X
      Y = @Y
      Z = @Z
   }

   Procedura OnQueryBdmLocal
   {
      if ($query_type == 8)
         {
          idx_ref = $query_p1
          annulla_ins = 0
          if ( VAR_EXIST(idx_ref, "MdF_Utente") != 1
             | IS_MATCH(VAR_VAL_STR(idx_ref, "MdF_Utente"), "No*")
             )
             { annulla_ins = 1 }

          $QueryResult__ = 1-annulla_ins
         }
   }

   Controlli
   {
      idx_att = ATTUALE()
      idx_CamMdF = PADRE(idx_att, 1)
      nome_CamMdF = NOME(idx_CamMdF)

      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")
      Z = VAR_VAL(idx_CamMdF, "Z")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      idx_MdF_Var = idx_att
     // Ottimizzazioni
      GOSUB MdF_Ctrl_var_cam_Init
      GOSUB MdF_ctrl_Change_Var_CAM
      if (mdf_ctrl_Change_Var_CAM > 0)
         {
          GOSUB MdF_VariabiliDaTipoPadri
          CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "keyGenericaMdF"
          GOSUB MdF_Variabili
          if (VAR_VAL(idx_att, "mdf_ctrl_Change_SbordoY") > 0)  { GOSUB MdF_Battuta_X }

          CHIAVE_TABVAR_MDF = "CerRib"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "CerRibMdF"
          GOSUB MdF_Variabili
         }

      GOSUB MdF_Battuta_X
      GOSUB MdF_Battuta_Y

      GOSUB MdF_Ctrl_SbordoY_padre

      MdF_Visualize_sat      = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Visualize_sat")
      KeyFamRegFacc_CerRib   = VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_CerRib")
      if (VAR_EXIST(PADRE(idx_att, 1), "MCR_ElementoBdm_CerRib") != 1)       { MCR_ElementoBdm_CerRib = "MdF_Sat_CerRib" }
      if (VAR_EXIST(PADRE(idx_att, 1), "MCR_ElementoBdm_CerRibVAPI") != 1)   { MCR_ElementoBdm_CerRibVAPI = "MdF_Sat_CerRibVAPI" }
      if (VAR_EXIST(PADRE(idx_att, 1), "MCR_ElementoBdm_BasRib") != 1)       { MCR_ElementoBdm_BasRib = "MdF_Sat_BasRib" }
      if (VAR_EXIST(PADRE(idx_att, 1), "MCR_ElementoBdm_BasRibVAPI") != 1)   { MCR_ElementoBdm_BasRibVAPI = "MdF_Sat_BasRibVAPI" }
      if (VAR_EXIST(PADRE(idx_att, 1), "MPA_ElementoBdm_PisAnta") != 1)      { MPA_ElementoBdm_PisAnta = "MdF_Sat_PisAnta" }
      if (VAR_EXIST(PADRE(idx_att, 1), "MPF_ElementoBdm_PisFia") != 1)       { MPF_ElementoBdm_PisFia = "MdF_Sat_PisFia" }

     // 13.09.2024
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_Apertura") )
         {
          if ( IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Utente"), "No*")
             | STRLEN(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Utente")) <= 2
             )
             {
              if ( IS_VAR_FIXED(idx_att, "px_CerRib1") != 1
                 & px_CerRib1 <= 0
                 )
                 {
                  DISPLAY2(STRCAT("Operazione Utente CerRibVas non abilitata MdF_Utente=", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Utente")))
                  escluso = 10
                  //if (ACTION() != 2  &  VAR_VAL(idx_att, "MdF_Post_LoadOrder") > 0)
                  COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // ", NOME(idx_att), " MdF_Utente non abil"))
                  EXITSUB()
                 }
             }
         }

      mdf_NoRegFacc = 0
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_Apertura") )
         {
          COMPONENTI2("mdf_CerRegFacc", PADRE(idx_att, 1), "MdF_CernieraVasRib")
          mdf_padre_io = 0
          mdf_padre_ute = 0
          iMC = 1
          while (iMC <= mdf_CerRegFacc)
             {
              if (PADRE(mdf_CerRegFacc[iMC], 2) == idx_att)
                 { mdf_padre_io = mdf_padre_io+1 }
              else
                 {
                  if (IS_MATCH(NOME(PADRE(mdf_CerRegFacc[iMC], 2)), "MECC*UTE*") )
                     { mdf_padre_ute = mdf_padre_ute+1 }
                 }

              iMC = iMC+1
             }

          if (mdf_CerRegFacc == mdf_padre_io+mdf_padre_ute)
             {
              // 20.09.2024
              //DISPLAY2("Operazione non possibile. Non trovo CerVasRib da RegoleCAM")
              //escluso = 10
              //if (ACTION() == 2)
              //   {
              //    COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // ", NOME(idx_att), " Non gestita"))
              //   }
              //EXITSUB()
              mdf_NoRegFacc = 1
              // Per test CAM, altrimenti va definita CerBasVasRib_UTENTE sulle lavant,pia1,2,3.tab
              //chiave_tab_cam = "CerBasPiegVaps"
              chiave_tab_cam = "CerBasVasRib_UTENTE"
              CHIAVE_TAB_CAM_CerRib1 = chiave_tab_cam

              py_CerRib1 = 21.5
              pz_CerRib1 = 50

              img_sat_F1_CerRib1 = "MdF_CernieraVas_VA"
              img_sat_E2_CerRib1 = "MdF_BasettaVas_VA"

              offxyz_sat_F1_CerRib1 = "-28.5;17.6;46.8;0"
              offxyz_sat_E2_CerRib1 = "-8.75;-5.75;-18.6;0"

              if ( IS_MATCH(MdF_Apertura_Utente, "VA*") != 1
                 & IS_MATCH(MdF_Apertura_Utente, "RI*") != 1
                 )
                 {
                 // 05.12.2024 altrimenti chiede in caricamento ordine perchè inizialmente non ha ancora la regola RegFacc
                 // Qui deve entrare solo se non ho la RegFacc presente, appunto se mdf_NoRegFacc=1
                  if (IS_VAR_FIXED(idx_att, "py_CerRib") != 1)
                     {
                      CHIEDI(idx_att, "MdF_Apertura_Utente")
                     }
                 }

              // Se aggiunto prima che esistesse MdF_Apertura_Utente e' ancora --
              if (MdF_Apertura_Utente != "--")
                 {
                  MdF_Apertura = UPPER(MdF_Apertura_Utente)
                 }

              MCR_angoloBas = 0

              if (IS_MATCH(MdF_Apertura, "VAPI*") )
                 {
                  img_sat_F1_CerRib1 = "MdF_CernieraVas_VAPI"
                  img_sat_E2_CerRib1 = "MdF_BasettaVas_VAPI"

                  offxyz_sat_F1_CerRib1 = "-28.5;2.5;47;0"
                  offxyz_sat_E2_CerRib1 = "-26.5;-4;-29.5;0"

                  MCR_angoloBas = 90
                 }

              GOSUB MdF_Battuta_Y

              X_CerRib1 = 44
              Y_CerRib1 = 44
              Z_CerRib1 = 44

              str_max_X = STR(X-10)
              if (VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X") > 50)  { str_max_Y = STR(VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X")-10) }

              str_max_Y = STR(Y-49.5)
              if (VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y") > 50)  { str_max_Y = STR(VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y")-49.5) }

              iq=1
              varPos = STRCAT("px_CerRib", STR(iq))
              VAR_SET_MODE(idx_att, varPos, $MODE_USER)
              VAR_SET_MENU(idx_att, varPos, STRCAT("( 49.5-", str_max_X, " )"))
              if (IS_VAR_FIXED(idx_att, varPos) != 1)
                 { CHIEDI(idx_att, varPos) }

              varPos = STRCAT("py_CerRib", STR(iq))
              VAR_SET_MODE(idx_att, varPos, $MODE_USER)
              VAR_SET_MENU(idx_att, varPos, STRCAT("( 10-", "100", " )"))
              if (IS_VAR_FIXED(idx_att, varPos) != 1)
                 { CHIEDI(idx_att, varPos) }

              varPos = STRCAT("pz_CerRib", STR(iq))
              VAR_SET_MODE(idx_att, varPos, $MODE_USER)
              VAR_SET_MENU(idx_att, varPos, STRCAT("( 0-", "120 )"))
              if (IS_VAR_FIXED(idx_att, varPos) != 1)
                 { CHIEDI(idx_att, varPos) }

              //if (VAR_VAL(idx_att, "Battuta_X") == 0)
              //   {
              //    Battuta_X = VAR_VAL(idx_att, "Battuta_X_Sx")
              //    if (IS_MATCH(MdF_Apertura, "DX*") )  { Battuta_X = VAR_VAL(idx_att, "Battuta_X_Dx") }
              //   }

              img_sat_F1_CerRib1 = STRCAT("MdF_CernieraVas_", MdF_Apertura)
              img_sat_E2_CerRib1 = STRCAT("MdF_BasettaVas_", MdF_Apertura)
              if (IS_MATCH(MdF_Apertura, "RI*") == 1)
                 {
                  img_sat_F1_CerRib1 = "MdF_CernieraVasRib_RI"
                  img_sat_E2_CerRib1 = "MdF_BasettaVasRib_RI"
                  offxyz_sat_F1_CerRib1 = "-28.5;-6.5;46.8;0"
                  offxyz_sat_E2_CerRib1 = "-8.75;-25.95;-18.6;0"
                 }
             }
         }

      if (mdf_NoRegFacc == 0)
         {
          if ( IS_MATCH(MdF_Apertura, "VA*")
             | IS_MATCH(MdF_Apertura, "RI*")
             )
             {
              // Per ora tengo questo Default
              chiave_tab_cam = "UTENTE"
              CHIAVE_TAB_CAM_CerRib1 = chiave_tab_cam

              py_CerRib1 = 21.5
              pz_CerRib1 = 50

              img_sat_F1_CerRib1 = "MdF_CernieraVas_VA"
              img_sat_E2_CerRib1 = "MdF_BasettaVas_VA"
              offxyz_sat_F1_CerRib1 = "-28.5;2.5;47;0"
              offxyz_sat_E2_CerRib1 = "-26.5;-4;-29.5;0"

              if (IS_MATCH(MdF_Apertura, "VAPI*") )
                 {
                  img_sat_F1_CerRib1 = "MdF_CernieraVas_VAPI"
                  img_sat_E2_CerRib1 = "MdF_BasettaVas_VAPI"

                  offxyz_sat_F1_CerRib1 = "-28.5;2.5;47;0"
                  offxyz_sat_E2_CerRib1 = "-26.5;-4;-29.5;0"

                  MCR_angoloBas = 90
                 }

              X_CerRib1 = 44
              Y_CerRib1 = 44
              Z_CerRib1 = 44

              COMPONENTI2("mdf_CerRegFacc", PADRE(idx_att, 1), "MdF_CernieraVasRib")
              iMC = 1
              while (iMC <= mdf_CerRegFacc)
                 {
                  if ( IS_MATCH(NOME(PADRE(mdf_CerRegFacc[iMC], 3)), "MECCANISM*_UTENTE*") != 1
                     & IS_MATCH(NOME(PADRE(mdf_CerRegFacc[iMC], 2)), "MECCANISM*_UTENTE*") != 1
                     )
                     {
                      MCR_ElementoBdm_CerRib = VAR_VAL_STR(PADRE(mdf_CerRegFacc[iMC], 2), "MCR_ElementoBdm_CerRib")
                      MCR_ElementoBdm_BasRib = VAR_VAL_STR(PADRE(mdf_CerRegFacc[iMC], 2), "MCR_ElementoBdm_BasRib")
                      if (IS_MATCH(MdF_Apertura, "VAPI*") )
                         {
                          MCR_ElementoBdm_CerRibVAPI = VAR_VAL_STR(PADRE(mdf_CerRegFacc[iMC], 2), "MCR_ElementoBdm_CerRibVAPI")
                          MCR_ElementoBdm_BasRibVAPI = VAR_VAL_STR(PADRE(mdf_CerRegFacc[iMC], 2), "MCR_ElementoBdm_BasRibVAPI")
                         }

                      py_CerRib1 = VAR_VAL(PADRE(mdf_CerRegFacc[iMC], 2), "py_CerRib1")
                      pz_CerRib1 = VAR_VAL(PADRE(mdf_CerRegFacc[iMC], 2), "pz_CerRib1")

                      img_sat_F1_CerRib1 = VAR_VAL_STR(PADRE(mdf_CerRegFacc[iMC], 2), "img_sat_F1_CerRib1")
                      img_sat_E2_CerRib1 = VAR_VAL_STR(PADRE(mdf_CerRegFacc[iMC], 2), "img_sat_E2_CerRib1")

                      offxyz_sat_F1_CerRib1 = VAR_VAL_STR(PADRE(mdf_CerRegFacc[iMC], 2), "offxyz_sat_F1_CerRib1")
                      offxyz_sat_E2_CerRib1 = VAR_VAL_STR(PADRE(mdf_CerRegFacc[iMC], 2), "offxyz_sat_E2_CerRib1")

                      chiave_tab_cam = VAR_VAL_STR(mdf_CerRegFacc[iMC], "CHIAVE_TAB_CAM")
                      CHIAVE_TAB_CAM_CerRib1 = chiave_tab_cam
                      X_CerRib1 = VAR_VAL(PADRE(mdf_CerRegFacc[iMC], 1), "X_eleFro")
                      Y_CerRib1 = VAR_VAL(PADRE(mdf_CerRegFacc[iMC], 1), "Y_eleFro")
                      Z_CerRib1 = VAR_VAL(PADRE(mdf_CerRegFacc[iMC], 1), "Z_BasPia")

                      MCR_angoloBas = VAR_VAL(PADRE(mdf_CerRegFacc[iMC], 2), "MCR_angoloBas")

                      iMC = mdf_CerRegFacc
                     }
                  iMC = iMC+1
                 }

              str_max_X = STR(X-49.5)
              if (VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X") > 50)  { str_max_X = STR(VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X")-49.5) }

              prosegui_chiedi = 0
              if ( VAR_EXIST(idx_att, "chiedi_nomaked") != 1
                 & IS_VAR_FIXED(idx_att, "px_CerRib1") != 1
                 )
                 { prosegui_chiedi = 1 }

              if (prosegui_chiedi > 0)
                 {
                  chiedi_nomaked = 1
                  iq=1
                  while (iq <= 1)
                     {
                      varPx = STRCAT("px_CerRib", STR(iq))
                      VAR_SET_MODE(idx_att, varPx, $MODE_USER)
                      VAR_SET_MENU(idx_att, varPx, STRCAT("( 49.5-", str_max_X, " )"))
                      CHIEDI(idx_att, varPx)
                      iq = iq+1
                     }
                 }
              else
                 {
                  iq=1
                  while (iq <= 1)
                     {
                      varPx = STRCAT("px_CerRib", STR(iq))
                      VAR_SET_MODE(idx_att, varPx, $MODE_USER)
                      VAR_SET_MENU(idx_att, varPx, STRCAT("( 49.5-", str_max_X, " )"))

                      iq = iq+1
                     }
                 }
             }
         }

      COMPONENTI3("mdf_cernBa", idx_att, "MdF_CernieraBasetta_VasRib")
      if (mdf_cernBa > 0)
         {
          if (VAR_VAL(mdf_cernBa[1], "cerCancellata") == 1)
             {
              COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // MECCANISMO_UTENTE_CerVasRib cerCancellata"))
             }
         }
      DescEdit__ = STRCAT("CernieraVR_UTE_", KeyFamRegFacc_CerRib, "_px", STR(px_CerRib1))
      if (mdf_NoRegFacc > 0)
         {
          DescEdit__ = STRCAT("CernieraVR_UTE_", VAR_VAL_STR(idx_att, "chiave_tab_cam"), "_px", STR(px_CerRib1))
         }
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_CernieraBasetta_VasRib  cer1
   {
      @escluso = 1
      if (px_CerRib1 > 0  &  Y_CerRib1 > 1)  { @escluso = 0 }

      @base_0.x = base_0.x + px_CerRib1
      @base_0.y = base_0.y + Battuta_Y
      if (IS_MATCH(MdF_Apertura, "VA*") == 1)
         { @base_0.y = alto_0.y - Battuta_Y - @Y }
      @base_0.z = base_0.z - @Z
      @PosizioneCerniera = MdF_Apertura
      @KeyFamRegFacc = KeyFamRegFacc_CerRib
      @pos_Y_cerAnta = py_CerRib1-Battuta_Y
      @id_Cer = 1
   }

   Procedura MdF_Ctrl_Post_LoadOrder
   {
      MdF_Post_LoadOrder = 1
      COMPONENTI2("mdf_CerRegFacc", PADRE(idx_att, 1), "MdF_CernieraVasRib")
      iMC = 1
      while (iMC <= mdf_CerRegFacc)
         {
          if ( IS_MATCH(NOME(PADRE(mdf_CerRegFacc[iMC], 3)), "MECCANISM*_UTENTE*") != 1
             & IS_MATCH(NOME(PADRE(mdf_CerRegFacc[iMC], 2)), "MECCANISM*_UTENTE*") != 1
             )
             {
              py_CerRib1 = VAR_VAL(PADRE(mdf_CerRegFacc[iMC], 2), "py_CerRib1")
              pz_CerRib1 = VAR_VAL(PADRE(mdf_CerRegFacc[iMC], 2), "pz_CerRib1")

              img_sat_F1_CerRib1 = VAR_VAL_STR(PADRE(mdf_CerRegFacc[iMC], 2), "img_sat_F1_CerRib1")
              img_sat_E2_CerRib1 = VAR_VAL_STR(PADRE(mdf_CerRegFacc[iMC], 2), "img_sat_E2_CerRib1")

              offxyz_sat_F1_CerRib1 = VAR_VAL_STR(PADRE(mdf_CerRegFacc[iMC], 2), "offxyz_sat_F1_CerRib1")
              offxyz_sat_E2_CerRib1 = VAR_VAL_STR(PADRE(mdf_CerRegFacc[iMC], 2), "offxyz_sat_E2_CerRib1")

              chiave_tab_cam = VAR_VAL_STR(mdf_CerRegFacc[iMC], "CHIAVE_TAB_CAM")
              CHIAVE_TAB_CAM_CerRib1 = chiave_tab_cam
              X_CerRib1 = VAR_VAL(PADRE(mdf_CerRegFacc[iMC], 1), "X_eleFro")
              Y_CerRib1 = VAR_VAL(PADRE(mdf_CerRegFacc[iMC], 1), "Y_eleFro")
              Z_CerRib1 = VAR_VAL(PADRE(mdf_CerRegFacc[iMC], 1), "Z_BasPia")

              MCR_angoloBas = VAR_VAL(PADRE(mdf_CerRegFacc[iMC], 2), "MCR_angoloBas")

              iMC = mdf_CerRegFacc
             }
          iMC = iMC+1
         }
   }
}

Elemento MECCANISMO_UTENTE_Fer_FroFiaPia
{
   Descrizione = "MECCANISMI DA FRONTALI UTENTE Ferramente Fro,Fia,Pia"
   Code        = GRANT
   Gruppo      = "MeccanismiDaFrontali"
   Tipo        = Contenitore
   Forma       = ""
   Attrezzabile  *
   Stendibile    !*
   Vestibile     !*
   Alias         MdF_CAM;MdF_Utente

   Variabili
   {
      X     "Larghezza"   476
      Y     "Altezza"     456
      Z     "Spessore"     22

      MdF_Apertura                 "Apertura Generica"                    ""

      MdF_Visualize_sat            ""                                     ""

      Battuta_X                    "battuta in X rispetto al fianco"      0
      Battuta_X_Sx                 "battuta in X rispetto al fianco Sx"   0
      Battuta_X_Dx                 "battuta in X rispetto al fianco Dx"   0
      Battuta_Y                    "battuta in Y rispetto al Fon/cop"     0
      Battuta_Z                    "battuta in Z rispetto al fianco"      0

      KeyFamRegFacc_FerFro         ""                                     ""
      KeyFamRegFacc_FerFia         ""                                     ""
      KeyFamRegFacc_FerPia         ""                                     ""
      CHIAVE_TAB_CAM_FerFro1       ""                                     ""
      CHIAVE_TAB_CAM_FerFia1       ""                                     ""
      CHIAVE_TAB_CAM_FerPia1       ""                                     ""

      px_FerFro1                   "pos X Ferramenta Fro UTENTE"          0
      py_FerFro1                   "pos Y Ferramenta Fro UTENTE"          0
      pz_FerFro1                   "pos Z Ferramenta Fro UTENTE"          0
      X_FerFro1                    ""                                     0.1
      Y_FerFro1                    ""                                     0.1
      Z_FerFro1                    ""                                     0.1

      px_FerFia1                   "pos X Ferramenta Fia UTENTE"          0
      py_FerFia1                   "pos Y Ferramenta Fia UTENTE"          0
      pz_FerFia1                   "pos Z Ferramenta Fia UTENTE"          0
      X_FerFia1                    ""                                     0.1
      Y_FerFia1                    ""                                     0.1
      Z_FerFia1                    ""                                     0.1

      px_FerPia1                   "pos X Ferramenta Pia UTENTE"          0
      py_FerPia1                   "pos Y Ferramenta Pia UTENTE"          0
      pz_FerPia1                   "pos Z Ferramenta Pia UTENTE"          0
      X_FerPia1                    ""                                     0.1
      Y_FerPia1                    ""                                     0.1
      Z_FerPia1                    ""                                     0.1

      //img_sat_F1_FerFro            ""                                     ""
      //img_sat_F1_FerFia            ""                                     ""
      //img_sat_F1_FerPia            ""                                     ""

      M4_NO_OFFS                   "Sezione Posizone Disabilitata"        1

      // per Virtuo
      // 1 : il componente non è visibile ad animazione chiusa (riceve solo ombre dinamiche)
      VR_ANIM_POS "" 1
   }

   Assegnazioni
   {
      idx_att = ATTUALE()
      GOSUB MdF_SetStato_NoGEST
   }

   Attrezza
   {
      base_0 = @base_0
      base_0.z = @base_0.z
      X = @X
      Y = @Y
      Z = @Z
   }

   Procedura OnQueryBdmLocal
   {
      if ($query_type == 8)
         {
          idx_ref = $query_p1
          annulla_ins = 0
          if ( VAR_EXIST(idx_ref, "MdF_Utente") != 1
             | IS_MATCH(VAR_VAL_STR(idx_ref, "MdF_Utente"), "No*")
             )
             { annulla_ins = 1 }

          $QueryResult__ = 1-annulla_ins
         }
   }

   Controlli
   {
      idx_att = ATTUALE()
      idx_CamMdF = PADRE(idx_att, 1)
      nome_CamMdF = NOME(idx_CamMdF)

      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() != 2)  { EXITSUB() }
         }

      X = VAR_VAL(idx_CamMdF, "X")
      Y = VAR_VAL(idx_CamMdF, "Y")
      Z = VAR_VAL(idx_CamMdF, "Z")

      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_X") )  { X = VAR_VAL(idx_CamMdF, "MdF_Pan_X") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Y") )  { Y = VAR_VAL(idx_CamMdF, "MdF_Pan_Y") }
      if (VAR_EXIST(idx_CamMdF, "MdF_Pan_Z") )  { Z = VAR_VAL(idx_CamMdF, "MdF_Pan_Z") }

      idx_MdF_Var = idx_att
     // Ottimizzazioni
      GOSUB MdF_Ctrl_var_cam_Init
      GOSUB MdF_ctrl_Change_Var_CAM
      if (mdf_ctrl_Change_Var_CAM > 0)
         {
          GOSUB MdF_VariabiliDaTipoPadri
          CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_addKey_keyGenerica"))
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "keyGenericaMdF"
          GOSUB MdF_Variabili
          if (VAR_VAL(idx_att, "mdf_ctrl_Change_SbordoY") > 0)  { GOSUB MdF_Battuta_X }

          CHIAVE_TABVAR_MDF = "FerFro"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "FerFia"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "FerPia"
          GOSUB MdF_Variabili
         }

      GOSUB MdF_Battuta_X
      GOSUB MdF_Battuta_Y

      GOSUB MdF_Ctrl_SbordoY_padre

      MdF_Visualize_sat      = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Visualize_sat")
      KeyFamRegFacc_FerFro   = VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_FerFro")
      KeyFamRegFacc_FerFia   = VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_FerFia")
      KeyFamRegFacc_FerPia   = VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_FerPia")

      // Per ora tengo questo Default
      chiave_tab_cam = "UTENTE"
      CHIAVE_TAB_CAM_FerFro1 = chiave_tab_cam
      CHIAVE_TAB_CAM_FerFia1 = chiave_tab_cam
      CHIAVE_TAB_CAM_FerPia1 = chiave_tab_cam

     // 13.09.2024
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_Apertura") )
         {
          if ( IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Utente"), "No*")
             | STRLEN(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Utente")) <= 2
             )
             {
              if ( IS_VAR_FIXED(idx_att, "px_FerFro1") != 1
                 & IS_VAR_FIXED(idx_att, "py_FerFro1") != 1
                 & IS_VAR_FIXED(idx_att, "pz_FerFro1") != 1
                 & IS_VAR_FIXED(idx_att, "px_FerFia1") != 1
                 & IS_VAR_FIXED(idx_att, "py_FerFia1") != 1
                 & IS_VAR_FIXED(idx_att, "pz_FerFia1") != 1
                 & IS_VAR_FIXED(idx_att, "px_FerPia1") != 1
                 & IS_VAR_FIXED(idx_att, "py_FerPia1") != 1
                 & IS_VAR_FIXED(idx_att, "pz_FerPia1") != 1
                 )
                 {
                  DISPLAY2(STRCAT("Operazione Utente Fer Fro,Fia,Pia non abilitata MdF_Utente=", VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Utente")))
                  escluso = 10
                  //if (ACTION() != 2  &  VAR_VAL(idx_att, "MdF_Post_LoadOrder") > 0)
                  COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // ", NOME(idx_att), " MdF_Utente non abil"))
                  EXITSUB()
                 }
             }
         }

      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_Apertura") )
         {
          COMPONENTI2("mdf_FerRegFacc", PADRE(idx_att, 1), "MdF_FerramentaSu*")
          mdf_padre_io = 0
          iMC = 1
          while (iMC <= mdf_FerRegFacc)
             {
              if (PADRE(mdf_FerRegFacc[iMC], 2) == idx_att)
                 { mdf_padre_io = mdf_padre_io+1 }
              iMC = iMC+1
             }

          if (mdf_FerRegFacc == mdf_padre_io)
             {
              DISPLAY2("Operazione non possibile. Non trovo Fer Fro,Fia,Pia da RegoleCAM")
              escluso = 10
              if (ACTION() == 2)
                 {
                  COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // ", NOME(idx_att), " Non gestita"))
                 }
              EXITSUB()
             }
         }

      COMPONENTI2("mdf_FerRegFacc", PADRE(idx_att, 1), "MdF_FerramentaSu*")
      iMC = 1
      while (iMC <= mdf_FerRegFacc)
         {
          if ( IS_MATCH(NOME(PADRE(mdf_FerRegFacc[iMC], 3)), "MECCANISM*_UTENTE*") != 1
             & IS_MATCH(NOME(PADRE(mdf_FerRegFacc[iMC], 2)), "MECCANISM*_UTENTE*") != 1
             )
             {
              MdF_Lato = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "MdF_Lato")

              if (IS_VAR_FIXED(idx_att, "px_FerFro1") != 1)  { px_FerFro1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "px_FerFro1") }
              if (IS_VAR_FIXED(idx_att, "py_FerFro1") != 1)  { py_FerFro1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "py_FerFro1") }
              if (IS_VAR_FIXED(idx_att, "pz_FerFro1") != 1)  { pz_FerFro1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "pz_FerFro1") }

              if (IS_VAR_FIXED(idx_att, "px_FerFia1") != 1)  { px_FerFia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "px_FerFia1") }
              if (IS_VAR_FIXED(idx_att, "py_FerFia1") != 1)  { py_FerFia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "py_FerFia1") }
              if (IS_VAR_FIXED(idx_att, "pz_FerFia1") != 1)  { pz_FerFia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "pz_FerFia1") }

              if (IS_VAR_FIXED(idx_att, "px_FerPia1") != 1)  { px_FerPia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "px_FerPia1") }
              if (IS_VAR_FIXED(idx_att, "py_FerPia1") != 1)  { py_FerPia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "py_FerPia1") }
              if (IS_VAR_FIXED(idx_att, "pz_FerPia1") != 1)  { pz_FerPia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "pz_FerPia1") }

              if ( VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "img_sat_F1_FerFro1")
                 | VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "img_sat_F1_FerFia1")
                 | VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "img_sat_F1_FerPia1")
                 )
                 {
                  img_sat_F1_FerFro1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "img_sat_F1_FerFro1")
                  img_sat_F1_FerFia1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "img_sat_F1_FerFia1")
                  img_sat_F1_FerPia1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "img_sat_F1_FerPia1")

                  offxyz_sat_F1_FerFro1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "offxyz_sat_F1_FerFro1")
                  offxyz_sat_F1_FerFia1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "offxyz_sat_F1_FerFia1")
                  offxyz_sat_F1_FerPia1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "offxyz_sat_F1_FerPia1")
                 }

              if (IS_MATCH(NOME(mdf_FerRegFacc[iMC]), "*SuAnta*") )  { CHIAVE_TAB_CAM_FerFro1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "CHIAVE_TAB_CAM_FerFro1") }
              if (IS_MATCH(NOME(mdf_FerRegFacc[iMC]), "*SuFian*") )  { CHIAVE_TAB_CAM_FerFia1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "CHIAVE_TAB_CAM_FerFia1") }
              if (IS_MATCH(NOME(mdf_FerRegFacc[iMC]), "*SuPian*") )  { CHIAVE_TAB_CAM_FerPia1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "CHIAVE_TAB_CAM_FerPia1") }

              if (STRLEN(CHIAVE_TAB_CAM_FerFro1) > 0)  { chiave_tab_cam = CHIAVE_TAB_CAM_FerFro1 }
              if (STRLEN(CHIAVE_TAB_CAM_FerFia1) > 0)  { chiave_tab_cam = CHIAVE_TAB_CAM_FerFia1 }
              if (STRLEN(CHIAVE_TAB_CAM_FerPia1) > 0)  { chiave_tab_cam = CHIAVE_TAB_CAM_FerPia1 }

              X_FerFro1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "X_FerFro1")
              Y_FerFro1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "Y_FerFro1")
              Z_FerFro1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "Z_FerFro1")

              X_FerFia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "X_FerFia1")
              Y_FerFia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "Y_FerFia1")
              Z_FerFia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "Z_FerFia1")

              X_FerPia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "X_FerPia1")
              Y_FerPia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "Y_FerPia1")
              Z_FerPia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "Z_FerPia1")

              iMC = mdf_FerRegFacc
             }
          iMC = iMC+1
         }

      str_max_X = STR(X+40)
      if (VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X") > 50)  { str_max_X = STR(VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X")+40) }

      str_max_Y = STR(Y+40)
      if (VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y") > 50)  { str_max_Y = STR(VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y")+40) }

      prosegui_chiedi = 0
      if ( VAR_EXIST(idx_att, "chiedi_nomaked") != 1
         & IS_VAR_FIXED(idx_att, "px_FerFro1") != 1
         & IS_VAR_FIXED(idx_att, "py_FerFro1") != 1
         & IS_VAR_FIXED(idx_att, "pz_FerFro1") != 1
         & IS_VAR_FIXED(idx_att, "px_FerFia1") != 1
         & IS_VAR_FIXED(idx_att, "py_FerFia1") != 1
         & IS_VAR_FIXED(idx_att, "pz_FerFia1") != 1
         & IS_VAR_FIXED(idx_att, "px_FerPia1") != 1
         & IS_VAR_FIXED(idx_att, "py_FerPia1") != 1
         & IS_VAR_FIXED(idx_att, "pz_FerPia1") != 1
         )
         { prosegui_chiedi = 1 }

      if (prosegui_chiedi > 0)
         {
          chiedi_nomaked = 1
          iq=1
          while (iq <= 1)
             {
              if (STRLEN(KeyFamRegFacc_FerFro) > 0)
                 {
                  varPx = STRCAT("px_FerFro", STR(iq))
                  VAR_SET_MODE(idx_att, varPx, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPx, STRCAT("( -", str_max_X, " )"))
                  CHIEDI(idx_att, varPx)

                  varPy = STRCAT("py_FerFro", STR(iq))
                  VAR_SET_MODE(idx_att, varPy, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPy, STRCAT("( -", str_max_Y, " )"))
                  CHIEDI(idx_att, varPy)

                  varPz = STRCAT("pz_FerFro", STR(iq))
                  VAR_SET_MODE(idx_att, varPz, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPz, STRCAT("( -", STR(Z+70), " )"))
                  CHIEDI(idx_att, varPz)
                 }

              if (STRLEN(KeyFamRegFacc_FerFia) > 0)
                 {
                  varPx = STRCAT("px_FerFia", STR(iq))
                  VAR_SET_MODE(idx_att, varPx, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPx, STRCAT("( -", str_max_X, " )"))
                  CHIEDI(idx_att, varPx)

                  varPy = STRCAT("py_FerFia", STR(iq))
                  VAR_SET_MODE(idx_att, varPy, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPy, STRCAT("( -", str_max_Y, " )"))
                  CHIEDI(idx_att, varPy)

                  varPz = STRCAT("pz_FerFia", STR(iq))
                  VAR_SET_MODE(idx_att, varPz, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPz, STRCAT("( -", STR(Z+70), " )"))
                  CHIEDI(idx_att, varPz)
                 }

              if (STRLEN(KeyFamRegFacc_FerPia) > 0)
                 {
                  varPx = STRCAT("px_FerPia", STR(iq))
                  VAR_SET_MODE(idx_att, varPx, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPx, STRCAT("( -", str_max_X, " )"))
                  CHIEDI(idx_att, varPx)

                  varPy = STRCAT("py_FerPia", STR(iq))
                  VAR_SET_MODE(idx_att, varPy, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPy, STRCAT("( -", str_max_Y, " )"))
                  CHIEDI(idx_att, varPy)

                  varPz = STRCAT("pz_FerPia", STR(iq))
                  VAR_SET_MODE(idx_att, varPz, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPz, STRCAT("( -", STR(Z+70), " )"))
                  CHIEDI(idx_att, varPz)
                 }
              iq = iq+1
             }
         }
      else
         {
          iq=1
          while (iq <= 1)
             {
              if (STRLEN(KeyFamRegFacc_FerFro) > 0)
                 {
                  varPx = STRCAT("px_FerFro", STR(iq))
                  VAR_SET_MODE(idx_att, varPx, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPx, STRCAT("( -", str_max_X, " )"))

                  varPy = STRCAT("py_FerFro", STR(iq))
                  VAR_SET_MODE(idx_att, varPy, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPy, STRCAT("( -", str_max_Y, " )"))

                  varPz = STRCAT("pz_FerFro", STR(iq))
                  VAR_SET_MODE(idx_att, varPz, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPz, STRCAT("( -", STR(Z+70), " )"))
                 }

              if (STRLEN(KeyFamRegFacc_FerFia) > 0)
                 {
                  varPx = STRCAT("px_FerFia", STR(iq))
                  VAR_SET_MODE(idx_att, varPx, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPx, STRCAT("( -", str_max_X, " )"))

                  varPy = STRCAT("py_FerFia", STR(iq))
                  VAR_SET_MODE(idx_att, varPy, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPy, STRCAT("( -", str_max_Y, " )"))

                  varPz = STRCAT("pz_FerFia", STR(iq))
                  VAR_SET_MODE(idx_att, varPz, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPz, STRCAT("( -", STR(Z+70), " )"))
                 }

              if (STRLEN(KeyFamRegFacc_FerPia) > 0)
                 {
                  varPx = STRCAT("px_FerPia", STR(iq))
                  VAR_SET_MODE(idx_att, varPx, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPx, STRCAT("( -", str_max_X, " )"))

                  varPy = STRCAT("py_FerPia", STR(iq))
                  VAR_SET_MODE(idx_att, varPy, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPy, STRCAT("( -", str_max_Y, " )"))

                  varPz = STRCAT("pz_FerPia", STR(iq))
                  VAR_SET_MODE(idx_att, varPz, $MODE_USER)
                  VAR_SET_MENU(idx_att, varPz, STRCAT("( -", STR(Z+70), " )"))
                 }

              iq = iq+1
             }
         }

      DescEdit__ = STRCAT("Ferramenta_FroFiaPia_UTE")
      if (STRLEN(KeyFamRegFacc_FerFro) > 0)
         {
          if (STRLEN(KeyFamRegFacc_FerFia) < 1)
             {
              DescEdit__ = STRCAT("Ferramenta_FroPia_UTE")
              if (STRLEN(KeyFamRegFacc_FerPia) < 1)
                 { DescEdit__ = STRCAT("Ferramenta_Fro_UTE") }
             }
          if (STRLEN(KeyFamRegFacc_FerPia) < 1)
             {
              DescEdit__ = STRCAT("Ferramenta_FroFia_UTE")
              if (STRLEN(KeyFamRegFacc_FerFia) < 1)
                 { DescEdit__ = STRCAT("Ferramenta_Fro_UTE") }
             }
         }

      if (STRLEN(KeyFamRegFacc_FerFro) < 1)
         {
          DescEdit__ = STRCAT("Ferramenta_FiaPia_UTE")
          if (STRLEN(KeyFamRegFacc_FerFia) < 1)
             { DescEdit__ = STRCAT("Ferramenta_Pia_UTE") }
          if (STRLEN(KeyFamRegFacc_FerPia) < 1)
             { DescEdit__ = STRCAT("Ferramenta_Fia_UTE") }
         }
   }

   PuntiNotevoli
   {
      // Invece di GOSUB punti metto direttamente i punti così evito altre variabili della PROCEDURA punti dei vari Bdm
      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]
   }

   Posiziona MdF_FerramenteXYZ  fer1
   {
      @escluso = 1
      if (px_FerFro1 != -999  |  py_FerFro1 != -999  |  pz_FerFro1 != -999)  { @escluso = 0 }
      if (px_FerFia1 != -999  |  py_FerFia1 != -999  |  pz_FerFia1 != -999)  { @escluso = 0 }
      if (px_FerPia1 != -999  |  py_FerPia1 != -999  |  pz_FerPia1 != -999)  { @escluso = 0 }

      if (STRLEN(KeyFamRegFacc_FerFro) > 1)
         {
          if (Y_FerFro1 < 1)  { @escluso = 1 }
         }

      if (STRLEN(KeyFamRegFacc_FerFia) > 1)
         {
          if (Y_FerFia1 < 1)  { @escluso = 1 }
         }

      if (STRLEN(KeyFamRegFacc_FerPia) > 1)
         {
          if (Y_FerPia1 < 1)  { @escluso = 1 }
         }

      @base_0 = base_0

      @X = X
      @Y = Y
      @Z = Z
      @px_FerFro = px_FerFro1
      @py_FerFro = py_FerFro1
      @pz_FerFro = pz_FerFro1
      @px_FerFia = px_FerFia1
      @py_FerFia = py_FerFia1
      @pz_FerFia = pz_FerFia1
      @px_FerPia = px_FerPia1
      @py_FerPia = py_FerPia1
      @pz_FerPia = pz_FerPia1
      @X_FerFro = X_FerFro1
      @Y_FerFro = Y_FerFro1
      @Z_FerFro = Z_FerFro1
      @X_FerFia = X_FerFia1
      @Y_FerFia = Y_FerFia1
      @Z_FerFia = Z_FerFia1
      @X_FerPia = X_FerPia1
      @Y_FerPia = Y_FerPia1
      @Z_FerPia = Z_FerPia1
      @Battuta_X_Sx = Battuta_X_Sx
      @Battuta_X_Dx = Battuta_X_Dx
      @Battuta_Y = Battuta_Y
      @Battuta_Z = Battuta_Z
      @KeyFamRegFacc = KeyFamRegFacc_FerFro
      if (STRLEN(@KeyFamRegFacc) < 1)  { @KeyFamRegFacc = KeyFamRegFacc_FerFia }
      if (STRLEN(@KeyFamRegFacc) < 1)  { @KeyFamRegFacc = KeyFamRegFacc_FerPia }
      @id_Fer = 1
   }

   Procedura MdF_Ctrl_Post_LoadOrder
   {
      MdF_Post_LoadOrder = 1
      COMPONENTI2("mdf_FerRegFacc", PADRE(idx_att, 1), "MdF_FerramentaSu*")
      iMC = 1
      while (iMC <= mdf_FerRegFacc)
         {
          if ( IS_MATCH(NOME(PADRE(mdf_FerRegFacc[iMC], 3)), "MECCANISM*_UTENTE*") != 1
             & IS_MATCH(NOME(PADRE(mdf_FerRegFacc[iMC], 2)), "MECCANISM*_UTENTE*") != 1
             )
             {
              MdF_Lato = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "MdF_Lato")

              if (IS_VAR_FIXED(idx_att, "px_FerFro1") != 1)  { px_FerFro1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "px_FerFro1") }
              if (IS_VAR_FIXED(idx_att, "py_FerFro1") != 1)  { py_FerFro1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "py_FerFro1") }
              if (IS_VAR_FIXED(idx_att, "pz_FerFro1") != 1)  { pz_FerFro1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "pz_FerFro1") }

              if (IS_VAR_FIXED(idx_att, "px_FerFia1") != 1)  { px_FerFia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "px_FerFia1") }
              if (IS_VAR_FIXED(idx_att, "py_FerFia1") != 1)  { py_FerFia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "py_FerFia1") }
              if (IS_VAR_FIXED(idx_att, "pz_FerFia1") != 1)  { pz_FerFia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "pz_FerFia1") }

              if (IS_VAR_FIXED(idx_att, "px_FerPia1") != 1)  { px_FerPia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "px_FerPia1") }
              if (IS_VAR_FIXED(idx_att, "py_FerPia1") != 1)  { py_FerPia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "py_FerPia1") }
              if (IS_VAR_FIXED(idx_att, "pz_FerPia1") != 1)  { pz_FerPia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "pz_FerPia1") }

              if ( VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "img_sat_F1_FerFro1")
                 | VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "img_sat_F1_FerFia1")
                 | VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "img_sat_F1_FerPia1")
                 )
                 {
                  img_sat_F1_FerFro1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "img_sat_F1_FerFro1")
                  img_sat_F1_FerFia1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "img_sat_F1_FerFia1")
                  img_sat_F1_FerPia1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "img_sat_F1_FerPia1")

                  offxyz_sat_F1_FerFro1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "offxyz_sat_F1_FerFro1")
                  offxyz_sat_F1_FerFia1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "offxyz_sat_F1_FerFia1")
                  offxyz_sat_F1_FerPia1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "offxyz_sat_F1_FerPia1")
                 }

              if (IS_MATCH(NOME(mdf_FerRegFacc[iMC]), "*SuAnta*") )  { CHIAVE_TAB_CAM_FerFro1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "CHIAVE_TAB_CAM_FerFro1") }
              if (IS_MATCH(NOME(mdf_FerRegFacc[iMC]), "*SuFian*") )  { CHIAVE_TAB_CAM_FerFia1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "CHIAVE_TAB_CAM_FerFia1") }
              if (IS_MATCH(NOME(mdf_FerRegFacc[iMC]), "*SuPian*") )  { CHIAVE_TAB_CAM_FerPia1 = VAR_VAL_STR(PADRE(mdf_FerRegFacc[iMC], 2), "CHIAVE_TAB_CAM_FerPia1") }

              if (STRLEN(CHIAVE_TAB_CAM_FerFro1) > 0)  { chiave_tab_cam = CHIAVE_TAB_CAM_FerFro1 }
              if (STRLEN(CHIAVE_TAB_CAM_FerFia1) > 0)  { chiave_tab_cam = CHIAVE_TAB_CAM_FerFia1 }
              if (STRLEN(CHIAVE_TAB_CAM_FerPia1) > 0)  { chiave_tab_cam = CHIAVE_TAB_CAM_FerPia1 }

              X_FerFro1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "X_FerFro1")
              Y_FerFro1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "Y_FerFro1")
              Z_FerFro1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "Z_FerFro1")

              X_FerFia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "X_FerFia1")
              Y_FerFia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "Y_FerFia1")
              Z_FerFia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "Z_FerFia1")

              X_FerPia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "X_FerPia1")
              Y_FerPia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "Y_FerPia1")
              Z_FerPia1 = VAR_VAL(PADRE(mdf_FerRegFacc[iMC], 2), "Z_FerPia1")

              iMC = mdf_FerRegFacc
             }
          iMC = iMC+1
         }
   }
}


Subroutine
{
   PROCEDURA MdF_CamMdFrontali_daMacro
   {
      $MdF_Load_att = "OnMacroMdF"
      GOSUB MdF_CamMdFrontali

     // 03.10.2017 per debug colisione CerBat. 27.05.2024 In realtà probabilmente è meglio che ci sia lo stesso a prescindere dal debug
      COMANDO(STRCAT("Procedura MdF_Ctrl_Cer_ChangeUte ", "// MdF_CamMdFrontali_daMacro"))
     // 27.05.2024
      if (STR_INDEX_OF(VAR_VAL_STR(-1, "MdF_Visualize"), 0, "ImportSat") > -1)
         { COMANDO(STRCAT("SHOW all // MdF_CamMdFrontali_daMacro")) }
   }

   PROCEDURA MdF_CamMdFrontali
   {
      // La procedura la chiamo già su OnLoadedOrder quindi so gia di essere in
      // $OnLoadOrder=0 o $VAR_LOAD_ORDER=0
      if (ACTION() == 3 | ACTION() <= 0)     { EXITSUB() }

      if (VAR_VAL(-1, "MDFSys_Exit_Always") == 1)   { EXITSUB() }

      GOSUB MdF_TABLE_CLOSE

      GOSUB MdF_path_cam_ini
      $MdF_Visualize = SUBST_LABEL(READ_INI2("CAMCAB", "MdF_Visualize", $MdF_path_camini))
      $MdF_Utente = SUBST_LABEL(READ_INI2("CAMCAB", "MdF_Utente", $MdF_path_camini))
      // Se non li trovo li cerco anche nel metron.ini
      if (STRCMP($MdF_Visualize, "") == 0)  { $MdF_Visualize = SUBST_LABEL(READ_INI("init", "MdF_Visualize")) }
      if (STRCMP($MdF_Utente, "") == 0)     { $MdF_Utente = SUBST_LABEL(READ_INI("init", "MdF_Utente")) }
     // 03.04.2018
      if (VAR_VAL(-1, "CAM_CloseOpenTab") < 0)
         { $CAM_CloseOpenTab = ATOI(SUBST_LABEL(READ_INI2("CAMCAB", "CAM_CloseOpenTab", $MdF_path_camini))) }
     // 23.04.2020
      if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacroCAM*") != 1)
         {
          if (VAR_VAL(-1, "CAM_CloseOpenTab") > 1)  { CHIEDI(-1, "CAM_CloseOpenTab") }
         }

      // MdF_Load puo avere i seguenti valori:
      // - OnMacro* significa solo da Macro quindi solo procedure che prima della chiamata hanno
      //            $MdF_Load_att = "OnMacroXXX", quindi non entrerà nemmeno in MdF_AttrezzaRegFacc
      // - NoOnLoadedOrder significa che non devono essere aggiunti nell'OnLoadedOrder ma
      //            può entrare nella MdF_AttrezzaRegFacc, quindi aggiunti solo nell'eventuale
      //            elemento che cambia e quindi entra in MdF_AttrezzaRegFacc
      // - OnAfterFirstMdFAdd significa che vengono aggiunti tutti non appena il primo CamMdFrontali
      //            entra in MdF_AttrezzaRegFacc
      // - OnInterat significa che entra solo per cambio da utente ACTION 3 o inserimento codice da Listino
      MDFSys_Load_ini = SUBST_LABEL(READ_INI2("CAMCAB", "MdF_Load", $MdF_path_camini))
      loc_MDFSys_Load_ini = MDFSys_Load_ini

     // 03.07.2024 Obsoleto. non deve piu essitere OnAfterFirstMdFAdd
      if (STRCMP(MDFSys_Load_ini, "OnAfterFirstMdFAdd") == 0)
         {
          MDFSys_Load_ini = "NoOnLoadedOrder"
          COMANDO2(STRCAT("LOGMSG MdF_CamMdFrontali cam.ini errato. MdF_Load OnAfterFirstMdFAdd non è più supportato dal 2018"))
         }

      GOSUB MdF_Ctrl_Load_save_prec

      if (STRLEN(VAR_VAL_STR(-1, "MdF_Load_att")) == 0)  { $MdF_Load_att = "OnLoadedOrder" }

      if ( IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1
         & STRLEN(MDFSys_Load_ini) > 1
         )
         {
          GOSUB MdF_DEL_VAR
          if (IS_MATCH(MDFSys_Load_ini, "OnMacro*") == 1)  { EXITSUB() }
          if (STRCMP(MDFSys_Load_ini, "NoOnLoadedOrder") == 0)
             {
              if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnLoadedOrder*") == 1)
                 { EXITSUB() }
             }
          if (STRCMP(MDFSys_Load_ini, "OnAfterFirstMdFAdd") == 0)
             {
              if (VAR_VAL(-1, "MdF_AttrezzaRegFacc") <= -1)
                 { EXITSUB() }
             }
         }

      if ( IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacroPreventivo") == 1
         | STRCMP(MDFSys_Load_ini, "OnMacro") == 0
         )
         { COMANDO2("SHOW Abilita Off   // MdF_CamMdFrontali") }

      if ($MdF_NO_LOGMSG == 0)
         {
          COMANDO2(STRCAT("LOGMSG { MdF_CamMdFrontali INIT ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
         }

      if ( STRCMP(MDFSys_Load_ini, "OnAfterFirstMdFAdd") == 0
         & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") == 1
         )
         {
          if (VAR_VAL(-1, "MdF_AttrezzaRegFacc") >= 0)
             {
              //mdf_idx_Ric = $MdF_AttrezzaRegFacc
              $MdF_AttrezzaRegFacc = -2
              //COMANDO2(STRCAT("RICALCOLA_UNA ", STR(mdf_idx_Ric), " no_ridisegna no_agganciati", " // ", NOME(mdf_idx_Ric), " x OnAfterFirstMdFAdd MdF_AttrezzaRegFacc"))
             }
         }

      if (STRCMP(MDFSys_Load_ini, "OnAfterFirstMdFAdd") == 0)
         {
          if (ACTION() == 2 & IS_IDX($MdF_AttrezzaRegFacc) )
             {
              if (VAR_VAL(PADRE($MdF_AttrezzaRegFacc, -1), "Preconfigurato") == 1)
                 { EXITSUB() }
             }
         }

      // Se cambio RegFacc non viene riletta
      if (VAR_VAL(-1, "CAM_Visualize") > 0  |  VAR_VAL(-1, "CAM_CloseOpenTab") > 1)
         {
          if (VAR_VAL(-1, "CAM_Visualize") != 3  |  VAR_VAL(-1, "CAM_CloseOpenTab") > 1)
             {
              if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") == 1)
                 {
                  WITH_ALIAS("test_mdf_Cam", "MdF_CAM")
                  test_mdf_i = 1
                  while (test_mdf_i <= test_mdf_Cam)
                     {
                      test_mdf_idx_Fro = test_mdf_Cam[test_mdf_i]
                      COMANDO2(STRCAT("RICALCOLA_UNA ", STR(test_mdf_idx_Fro), " no_ridisegna no_agganciati", " // ", NOME(test_mdf_idx_Fro), " da MdF_CamMdFrontali rilettura tab CAM_Visualize>0"))
                      test_mdf_i = test_mdf_i+1
                     }
                 }
             }
         }

      WITH_ALIAS("$mdf_Fro", "CamMdFrontali")

      NewRTA = "1"

      mdf_Add_Tot = 0
      mdf_Added_Tot = 0
      mdf_Add_TooEarly = 0
      $mdf_i = 1
      while ($mdf_i <= $mdf_Fro)
         {
          $mdf_idx_Fro = $mdf_Fro[$mdf_i]

          mdf_coll_compatibile = 1
          mdf_collezione_att = UPPER(COLLEZIONE($mdf_idx_Fro))
          mdf_collezione_glob = ""
          if (VAR_EXIST(-1, "COLLEZIONE") )  { mdf_collezione_glob = UPPER($COLLEZIONE) }

          if ( STRLEN(mdf_collezione_att) > 1
             & STRLEN(mdf_collezione_glob) > 1
             & STRCMP(mdf_collezione_att, mdf_collezione_glob) != 0
             )
             { mdf_coll_compatibile = 0 }

          //DISPLAY2(STRCAT("Collezione mdf_idx_Fro=", UPPER(COLLEZIONE($mdf_idx_Fro))))

          COMPONENTI3("$mdf_Ferr", $mdf_idx_Fro, "MdF_*")

          mdf_Add_ctrl = 0
          if ( $mdf_Ferr == 0
             & mdf_coll_compatibile > 0
             )
             { mdf_Add_ctrl = 1 }

          if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMdF_AttrezzaRegFac") != 1)
             {
              if ( STRCMP($MdF_Utente, "") != 0
                 & mdf_coll_compatibile > 0
                 )
                 { mdf_Add_ctrl = 2 }
             }

          if ( $mdf_Ferr > 0
             & mdf_coll_compatibile > 0
             & STRCMP($MdF_Utente, "") == 0
             & VAR_EXIST($mdf_idx_Fro, "KeyFamRegFacc") != 1
             )
             { mdf_Add_ctrl = 3 }

         // 03.11.2016
          if (VAR_VAL($mdf_idx_Fro, "MdF_NoOnLoadedOrder") == 1)
             { mdf_Add_ctrl = -1 }

          if (VAR_EXIST($mdf_idx_Fro, "MdF_NoOnLoadedOrder") == 1)
             {
              if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") == 1)
                 { mdf_Add_ctrl = 3.1 }
             }

          if (mdf_Add_ctrl == 0  &  $mdf_Ferr > 0)
             {
              mdf_just_added = 0
              iFeC=1
              while (iFeC <= $mdf_Ferr)
                 {
                  if (IS_IDX($mdf_Ferr[iFeC]) )
                     {
                     // Occhio agli MdF_ figli dei figli
                      if (PADRE($mdf_Ferr[iFeC], 1) == $mdf_idx_Fro)
                         {
                          mdf_just_added = 1
                          if ( STRCMP(VAR_VAL_STR($mdf_Ferr[iFeC], "MdF_Cambiato"), "ADD-TooEarly") == 0
                             | IS_MATCH(VAR_VAL_STR($mdf_Ferr[iFeC], "MdF_Cambiato"), "Dim*") == 1
                             )
                             {
                              mdf_just_added = -1
                              mdf_Add_TooEarly = mdf_Add_TooEarly+1
                              COMANDO2(STRCAT("ELIMINA ", STR($mdf_Ferr[iFeC]), " // Dim or ADD-TooEarly MdF_CamMdFrontali"))
                              // 12.03.2019
                              DEL_VAR($mdf_idx_Fro, "mdf_added_*_daLoadPers")
                              mdf_Add_ctrl = 4
                             }
                          else
                             {
                              mdf_just_added = 2
                              if (IS_MATCH(VAR_VAL_STR($mdf_Ferr[iFeC], "MdF_ADD_when"), "RE_Control") != 1)
                                 {
                                  SET_#($mdf_Ferr[iFeC])
                                  #MdF_ADD_when = "first_OnMacroMdF"
                                  mdf_just_added = 3
                                  // Se poi alla fine viene chiamata la MdF_Ctrl_Cambiamenti e VariabiliMdF.txt, VariabiliDaTipoPadri.txt
                                  // e keyFamRegFacc.txt hanno molte righe la procedura impiega del tempo.
                                  if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacroCAM") == 1)
                                     {
                                      SET_#($mdf_Ferr[iFeC])
                                      #MdF_Cambiato = "MdF_CamMdFrontali"
                                     }
                                 }
                             }
                         }
                     }
                  iFeC = iFeC+1
                 }
              if (mdf_just_added > 0)  { mdf_Add_Tot = mdf_Add_Tot+1 }
             }

          if (mdf_Add_ctrl <= 0)
             {
              tLav_ctrl = "Par"
              if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav_ctrl))) > 0)
                 {
                  $mdf_elemento_fro = "MdF_ContParacolpi"
                  COMPONENTI3("mdf_Ferr_eleCtrl", $mdf_idx_Fro, $mdf_elemento_fro)
                  if (mdf_Ferr_eleCtrl == 0)
                     { mdf_Add_ctrl = 6 }
                 }
              // 07.03.2024
              tLav_ctrl = "ParInt"
              if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav_ctrl))) > 0)
                 {
                  $mdf_elemento_fro = "MdF_ContParacolpiInt"
                  COMPONENTI3("mdf_Ferr_eleCtrl", $mdf_idx_Fro, $mdf_elemento_fro)
                  if (mdf_Ferr_eleCtrl == 0)
                     { mdf_Add_ctrl = 6.1 }
                 }
              if ( STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", "CerRib"))) > 0
                 | STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", "PisAnta"))) > 0
                 | STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", "PisFia"))) > 0
                 )
                 {
                  $mdf_elemento_fro = "MdF_CernierePistoneVasRib"
                  COMPONENTI3("mdf_Ferr_eleCtrl", $mdf_idx_Fro, $mdf_elemento_fro)
                  if (mdf_Ferr_eleCtrl == 0)
                     { mdf_Add_ctrl = 7 }
                 }

              if ( STRLEN(VAR_VAL_STR($mdf_idx_Fro, "MdF_Load_Interat")) > 1
                 | STRLEN($MdF_Load_pers) > 1
                 )
                 {
                  load_mdf_Cam = 0
                  iFeC=1
                  while (iFeC <= $mdf_Ferr)
                     {
                      if (HAS_ALIAS($mdf_Ferr[iFeC], "MdF_CAM") )
                         {
                          load_mdf_Cam = load_mdf_Cam+1
                         }
                      iFeC = iFeC+1
                     }

                 // 04.11.2019 con flusso corretto effettivamente non aggiungeva i paracolpi sulla SX/DXCER
                  // perche trova sia MdF_CerniereBattenti che MdF_CerniereAngLibro
                  load_mdf_CamLib = 0
                  if (load_mdf_Cam == 2)
                     {
                      if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", "CerAngLib"))) > 0)
                         { load_mdf_CamLib = 1 }
                     }

                  if ( load_mdf_Cam <= 1
                    // 04.11.2019
                     | load_mdf_CamLib == 1
                     )
                     {
                      if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, "MdF_Apertura")) <= 1)
                         {
                          if (IS_MATCH(UPPER(NOME($mdf_idx_Fro)), "*C*") != 1)
                             {
                              mdf_Add_ctrl = 8
                             }
                         }

                      if (VAR_EXIST($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", "Par1")) != 1)
                         {
                          if ( IS_MATCH(VAR_VAL_STR($mdf_idx_Fro, "MdF_Apertura"), "*SX*") == 1
                             | IS_MATCH(VAR_VAL_STR($mdf_idx_Fro, "MdF_Apertura"), "*DX*") == 1
                             | IS_MATCH(VAR_VAL_STR($mdf_idx_Fro, "MdF_Apertura"), "*VA*") == 1
                             | IS_MATCH(VAR_VAL_STR($mdf_idx_Fro, "MdF_Apertura"), "*RI*") == 1
                             | IS_MATCH(VAR_VAL_STR($mdf_idx_Fro, "MdF_Apertura"), "E*") == 1
                             | IS_MATCH(UPPER(NOME($mdf_idx_Fro)), "*C*") == 1
                             )
                             { mdf_Add_ctrl = 9 }

                         }
                      if (VAR_EXIST($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", "CerRib1")) != 1)
                         {
                          if ( IS_MATCH(VAR_VAL_STR($mdf_idx_Fro, "MdF_Apertura"), "*VA*") == 1
                             | IS_MATCH(VAR_VAL_STR($mdf_idx_Fro, "MdF_Apertura"), "*RI*") == 1
                             )
                             { mdf_Add_ctrl = 10 }
                         }
                      tLav_ctrl = "FerGen"
                      if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav_ctrl))) > 0)
                         {
                          $mdf_elemento_fro = "MdF_FerramenteGeneriche"
                          COMPONENTI3("mdf_Ferr_eleCtrl", $mdf_idx_Fro, $mdf_elemento_fro)
                          if (mdf_Ferr_eleCtrl == 0)
                             { mdf_Add_ctrl = 11 }
                         }
                      // 06.03.2024
                      tLav_ctrl = "FerCri"
                      if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav_ctrl))) > 0)
                         {
                          $mdf_elemento_fro = "MdF_FerramenteGenCri"
                          COMPONENTI3("mdf_Ferr_eleCtrl", $mdf_idx_Fro, $mdf_elemento_fro)
                          if (mdf_Ferr_eleCtrl == 0)
                             { mdf_Add_ctrl = 11.1 }
                         }
                      if ( STRLEN(VAR_VAL_STR($mdf_idx_Fro, "KeyFamRegFacc_FerFro")) > 0
                         | STRLEN(VAR_VAL_STR($mdf_idx_Fro, "KeyFamRegFacc_FerFia")) > 0
                         | STRLEN(VAR_VAL_STR($mdf_idx_Fro, "KeyFamRegFacc_FerPia")) > 0
                         )
                         {
                          $mdf_elemento_fro = "MdF_Ferramente_4Reg"
                          COMPONENTI3("mdf_Ferr_eleCtrl", $mdf_idx_Fro, $mdf_elemento_fro)
                          if (mdf_Ferr_eleCtrl == 0)
                             { mdf_Add_ctrl = 12 }
                         }
                     }
                  // 31.01.2024 Sc084826 CerSof Occhio a MdF_Utente mdf_Add_ctrl=2
                  // 28.02.2024 Em2019003882 Portato fuori dall' if sopra
                  if (IS_MATCH(VAR_VAL_STR($mdf_idx_Fro, "MdF_Apertura"), "*XSOF*") == 1)
                     {
                      $mdf_elemento_fro = "MdF_CerniereSoffietto"
                      COMPONENTI3("mdf_Ferr_eleCtrl", $mdf_idx_Fro, $mdf_elemento_fro)
                      if (mdf_Ferr_eleCtrl == 0)
                         { mdf_Add_ctrl = 13 }
                     }
                 }
             }

         // 06.02.2023 Se Par aggiunto in caricamento MdF_Load_Interat e ho anche FerGen o FerFia,Fro,Pia non aggiunge le ferramente
          if (mdf_Add_ctrl == 0)
             {
              // 06.02.2023
              // Se MdF_Load_Interat ha Par oppure anche CerBat;CerRib;Par ma in realta
              // non ho Cerniere, ma ho i paracolpi, quindi caricati in caricamento ordine e ho anche FerGen o
              // FerFia,Pia,Fro da aggiungere da Macro CAM Non venivano piu aggiunti
              // Solitamente i paracolpi ci sono con cerniere battenti o Vas/Rib e raramente ci sono
              // FerGen o FerFia,Pia,Fro insieme ai paracolpi e il tutto era fatto per leggere le tabelle il meno possibile
              if (STR_INDEX_OF(VAR_VAL_STR($mdf_idx_Fro, "MdF_Load_Interat"), 0, "Par") > -1)
                 {
                  GOSUB mdf_Add_MdF_Fer_Glob
                 }
             }

          if (VAR_VAL(-1, "CAM_CloseOpenTab") > 1)  { mdf_Add_ctrl = 99 }

          // 31.01.2024 Sc084826 CerSof Occhio a MdF_Utente mdf_Add_ctrl=2
          //if ($mdf_idx_Fro == 24307)
          //   {
          //    DISPLAY2(STRCAT("mdf_idx_Fro=", STR($mdf_idx_Fro), " mdf_Add_ctrl=", STR(mdf_Add_ctrl)))
          //   }

          // Accessorio rimane per Gestionale. In ogni caso è fatto alla fine
          //mdf_ins2_att = INSERIMENTO2(PADRE($mdf_idx_Fro, -1))
          //if (mdf_ins2_att == $ins2_accessorio)  { mdf_Add_ctrl = -9999 }
          if ( mdf_Add_ctrl > 0
             // 15.02.2018
             | $MdF_display_err > 0
             )
             {
             // COMANDO2(STRCAT("LOGMSG MdF_CamMdFrontali CtrlVar e ADD MdF_ per mdf_Add_ctrl=", STR(mdf_Add_ctrl), " idx=", STR($mdf_idx_Fro), " ele=", NOME($mdf_idx_Fro), " ", DATA(0)))
             // 15.02.2018
             // Così se correggo l'errore in tabella non devo chiudere e riaprire M4 o avere CAM_Visualize>0
             if ($MdF_display_err > 0)
                {
                 GOSUB MdF_TABLE_CLOSE_all
                }

              mdf_add_now_MdF_CamMdFrontali = 0
              mdF_Lav_offx = 0
              mdF_Lav_offz = 0
              mdF_Lav_offy = 0
              SET_#($mdf_idx_Fro)
              if (IS_MATCH(NewRTA, "1") == 1)  { mdF_Lav_offy = -#Y }

              DEL_VAR($mdf_idx_Fro, "Escludi_*")

              idx_MdF_Var = $mdf_idx_Fro
              $idx_tab_Var = idx_MdF_Var

              // 15.03.2024
              // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
              // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
              if (VAR_EXIST($mdf_idx_Fro, "CamSys_DistNear") )  { DEL_VAR($mdf_idx_Fro, "CamSys_DistNear") }

              GOSUB MdF_VariabiliDaTipoPadri
              CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR($mdf_idx_Fro, "MdF_addKey_keyGenerica"))
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "keyGenericaFro"
              GOSUB MdF_Variabili

              if (VAR_EXIST($mdf_idx_Fro, "MdF_offx_REL_ADD") )
                 { mdF_Lav_offx = mdF_Lav_offx + VAR_VAL($mdf_idx_Fro, "MdF_offx_REL_ADD") }

              if (VAR_EXIST($mdf_idx_Fro, "MdF_offy_REL_ADD") )
                 { mdF_Lav_offy = mdF_Lav_offy + VAR_VAL($mdf_idx_Fro, "MdF_offy_REL_ADD") }

              if (VAR_EXIST($mdf_idx_Fro, "MdF_offz_REL_ADD") )
                 { mdF_Lav_offz = mdF_Lav_offz + VAR_VAL($mdf_idx_Fro, "MdF_offz_REL_ADD") }

              if ( IS_MATCH(MdF_Apertura, "SX*")
                 | IS_MATCH(MdF_Apertura, "DX*")
                 )
                 {
                  CHIAVE_TABVAR_MDF = "CerBat"
                  GOSUB MdF_Variabili

                  // 22.10.2019
                  // Spostato prima di leggere le CerBatFro per avere gli sbordiY MdfSys_SbordoYSup/Inf prima di KeyFamRegFacc
                  // Lo tengo dopo CerBat per MdF_angolBas
                  mdf_idx_KFBX = idx_MdF_Var
                  GOSUB MdF_KeyFam_Battuta_X_Gen
                  SET_#($mdf_idx_Fro)

                  CHIAVE_TABVAR_MDF = "CerBatFro"
                  GOSUB MdF_Variabili

                  GOSUB MdF_pos_CerBat
                  if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                     {
                      $mdf_add_RegFacc = 1

                      // 13.02.2024
                      if (VAR_VAL($mdf_idx_Fro, "MdF_VanoY2") < 50)
                         {
                          $mdf_elemento_fro = "MdF_CerniereBattenti"
                          COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                          if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                          if ($mdf_add_RegFacc > 0)
                             {
                              #mdF_Lav_offy_LoadAttRegFacc = mdF_Lav_offy
                              mdf_add_now_MdF_CamMdFrontali = 1
                              COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0"))
                             }
                         }
                      else
                         {
                          // 13.02.2024
                          mdf_add_now_MdF_CamMdFrontali = 1
                          mdf_elemento_fro = "MdF_CerniereBattVY1"
                          COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, mdf_elemento_fro)
                          if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                          if ($mdf_add_RegFacc > 0)
                             {
                              MdF_VanoY1 = VAR_VAL($mdf_idx_Fro, "MdF_VanoY1")
                              MdF_AriaVaniY = VAR_VAL($mdf_idx_Fro, "MdF_AriaVaniY")
                              mdf_Vano_offy1 = VAR_VAL($mdf_idx_Fro, "MdF_Vano_offy1")
                              COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy+mdf_Vano_offy1)," ",STR(mdF_Lav_offz) ," 0"))

                              mdf_elemento_fro = "MdF_CerniereBattVY2"
                              COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy+mdf_Vano_offy1+MdF_AriaVaniY+MdF_VanoY1)," ",STR(mdF_Lav_offz) ," 0"))
                              // 07.03.2024
                              if (VAR_VAL($mdf_idx_Fro, "MdF_VanoY3") >= 50)
                                 {
                                  mdf_elemento_fro = "MdF_CerniereBattVY3"
                                  COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy+mdf_Vano_offy1+MdF_AriaVaniY+MdF_VanoY1+MdF_AriaVaniY+MdF_VanoY2)," ",STR(mdF_Lav_offz) ," 0"))
                                 }
                             }
                         }
                     }

                 // 15.12.2016
                  // Per il momento non uso key CerAngLib, dovrebbe bastare la CerBat
                  //CHIAVE_TABVAR_MDF = "CerAngLib"
                  //GOSUB MdF_Variabili
                  //CHIAVE_TABVAR_MDF = "CerAngLibFro"
                  //GOSUB MdF_Variabili
                  GOSUB MdF_pos_CerAngLib
                  if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                     {
                      $mdf_add_RegFacc = 1

                      $mdf_elemento_fro = "MdF_CerniereAngLibro"
                      COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                      if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                      if ($mdf_add_RegFacc > 0)
                         {
                          //#mdF_Lav_offy_LoadAttRegFacc = mdF_Lav_offy
                          //mdf_add_now_MdF_CamMdFrontali = 1
                          COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0"))
                         }
                     }
                 }

              if ( IS_MATCH(MdF_Apertura, "SX*") != 1
                 & IS_MATCH(MdF_Apertura, "DX*") != 1
                 // Se vuoi la battuta vuol dire che hai una MdF_Apertura che ha dei meccanismi RegFacc quindi non serve se vuota
                 & STRLEN(MdF_Apertura) > 0
                 )
                 {
                  mdf_idx_KFBX = idx_MdF_Var
                  GOSUB MdF_KeyFam_Battuta_X_Gen
                  SET_#($mdf_idx_Fro)
                 }

              if ( IS_MATCH(MdF_Apertura, "SX*SOF*")
                 | IS_MATCH(MdF_Apertura, "DX*SOF*")
                 )
                 {
                  CHIAVE_TABVAR_MDF = "CerSof"
                  GOSUB MdF_Variabili
                  CHIAVE_TABVAR_MDF = "CerSofFro"
                  GOSUB MdF_Variabili
                  GOSUB MdF_pos_CerSof
                  if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                     {
                      $mdf_add_RegFacc = 1

                      $mdf_elemento_fro = "MdF_CerniereSoffietto"
                      COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                      if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                      if ($mdf_add_RegFacc > 0)
                         {
                          mdf_add_now_MdF_CamMdFrontali = 1
                          COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0"))
                         }
                     }
                 }

              // Non serve entrare in VaribailiMdF con sottochiave CerRib se non sono MDF_Apertura VA RI
              // perché qui la MdF_Apertura deve esser già corretta con la keyGenerica
              if ( IS_MATCH(MdF_Apertura, "VA*") == 1
                 | IS_MATCH(MdF_Apertura, "RI*") == 1
                 )
                 {
                  CHIAVE_TABVAR_MDF = "CerRib"
                  GOSUB MdF_Variabili
                  CHIAVE_TABVAR_MDF = "CerRibFro"
                  GOSUB MdF_Variabili

                  CHIAVE_TABVAR_MDF = "PisAnta"
                  GOSUB MdF_Variabili
                  CHIAVE_TABVAR_MDF = "PisAntaFro"
                  GOSUB MdF_Variabili
                  CHIAVE_TABVAR_MDF = "PisFia"
                  GOSUB MdF_Variabili
                  CHIAVE_TABVAR_MDF = "PisFiaFro"
                  GOSUB MdF_Variabili
                  GOSUB MdF_pos_CerRib
                  if ( STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", "CerRib"))) > 0
                     | STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", "PisAnta"))) > 0
                     | STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", "PisFia"))) > 0
                     )
                     {
                      $mdf_add_RegFacc = 1

                      $mdf_elemento_fro = "MdF_CernierePistoneVasRib"
                      COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                      if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                      if ($mdf_add_RegFacc > 0)
                         {
                          mdf_add_now_MdF_CamMdFrontali = 1
                          COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0"))
                         }
                     }
                 }

              CHIAVE_TABVAR_MDF = "Par"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "ParFro"
              GOSUB MdF_Variabili
              GOSUB MdF_pos_Paracolpi
              if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                 {
                  $mdf_add_RegFacc = 1

                  $mdf_elemento_fro = "MdF_ContParacolpi"
                  COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                  if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                  if ($mdf_add_RegFacc > 0)
                     {
                      mdf_add_now_MdF_CamMdFrontali = mdf_add_now_MdF_CamMdFrontali+1
                      COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0"))
                     }
                 }

              CHIAVE_TABVAR_MDF = "ParInt"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "ParIntFro"
              GOSUB MdF_Variabili
              GOSUB MdF_pos_ParacolpiInt
              if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                 {
                  $mdf_add_RegFacc = 1

                  $mdf_elemento_fro = "MdF_ContParacolpiInt"
                  COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                  if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                  if ($mdf_add_RegFacc > 0)
                     {
                      mdf_add_now_MdF_CamMdFrontali = mdf_add_now_MdF_CamMdFrontali+1
                      COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0"))
                     }
                 }

              tLav = "FerGen"
              CHIAVE_TABVAR_MDF = "FerGen"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "FerGenFro"
              GOSUB MdF_Variabili
              GOSUB MdF_pos_FerramenteGen

              if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                 {
                  $mdf_add_RegFacc = 1

                  $mdf_elemento_fro = "MdF_FerramenteGeneriche"
                  COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                  if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                  if ($mdf_add_RegFacc > 0)
                     {
                      mdf_add_now_MdF_CamMdFrontali = mdf_add_now_MdF_CamMdFrontali+1
                      COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0"))
                     }
                 }

              tLav = "FerCri"
              CHIAVE_TABVAR_MDF = "FerCri"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "FerCriFro"
              GOSUB MdF_Variabili
              GOSUB MdF_pos_FerGenCri

              if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                 {
                  $mdf_add_RegFacc = 1

                  $mdf_elemento_fro = "MdF_FerramenteGenCri"
                  COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                  if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                  if ($mdf_add_RegFacc > 0)
                     {
                      mdf_add_now_MdF_CamMdFrontali = mdf_add_now_MdF_CamMdFrontali+1
                      COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0"))
                     }
                 }

              $mdf_indice_riga = 1
              $mdf_quante_RegFacc = 4

              GOSUB MdF_Var_Ferramente

              // In KeyFamRegFacc basta che passi una volta, è in RegFacc che verifica quanti
              // elementi Fer ci sono
              tLav = "FerFro"
              GOSUB MdF_KeyFamRegFacc
              tLav = "FerFia"
              GOSUB MdF_KeyFamRegFacc
              tLav = "FerPia"
              GOSUB MdF_KeyFamRegFacc

              if ( STRLEN(VAR_VAL_STR($mdf_idx_Fro, "KeyFamRegFacc_FerFro")) > 0
                 | STRLEN(VAR_VAL_STR($mdf_idx_Fro, "KeyFamRegFacc_FerFia")) > 0
                 | STRLEN(VAR_VAL_STR($mdf_idx_Fro, "KeyFamRegFacc_FerPia")) > 0
                 )
                 {
                  while($mdf_indice_riga < 16)
                     {
                      GOSUB MdF_pos_Ferramente
                      if ( VAR_EXIST($mdf_idx_Fro, "Escludi_FerFro1") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFro2")
                         | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFia1") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFia2")
                         | VAR_EXIST($mdf_idx_Fro, "Escludi_FerPia1") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerPia2")
                         | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFro3") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFro4")
                         | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFia3") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFia4")
                         | VAR_EXIST($mdf_idx_Fro, "Escludi_FerPia3") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerPia4")
                         )
                         {
                          $mdf_add_RegFacc = 1

                          $mdf_elemento_fro = "MdF_Ferramente_4Reg"
                          COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                          iFE=1
                          while (iFE <= $mdf_Ele)
                             {
                              if (VAR_VAL($mdf_Ele[iFE], "indice_riga") == $mdf_indice_riga)
                                 { $mdf_add_RegFacc = -1 }
                              iFE = iFE+1
                             }

                          if ($mdf_add_RegFacc > 0)
                             {
                              mdf_add_now_MdF_CamMdFrontali = mdf_add_now_MdF_CamMdFrontali+1
                              $mdf_elemento_fro = "MdF_Ferramente_4Reg"
                              // La gestione COMANDO2 con ELELMENTO_I da errore nel flusso M4 in inserimento elemento nella stanza
                              //COMANDO2(STRCAT("ELEMENTO_I ", $mdf_elemento_fro))
                              COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz) , " 0"))
                              COMPONENTI2("mdf_Ferr", $mdf_idx_Fro, $mdf_elemento_fro)
                              iFe=1
                              while (iFe <= mdf_Ferr)
                                 {
                                  if (VAR_EXIST(mdf_Ferr[iFe], "indice_riga") != 1)
                                     {
                                      VAR_VALUE_SET(mdf_Ferr[iFe], "indice_riga", $mdf_indice_riga)
                                      VAR_VALUE_SET(mdf_Ferr[iFe], "quante_RegFacc", $mdf_quante_RegFacc)
                                     }
                                  iFe = iFe+1
                                 }
                             }
                          DEL_VAR($mdf_idx_Fro, "Escludi_Fer*")
                         }

                      $mdf_indice_riga = $mdf_indice_riga+4
                     }
                 }
              $mdf_indice_riga = 1
              COMPONENTI3("$mdf_FerrADDED", $mdf_idx_Fro, "MdF_*")
              if ($mdf_FerrADDED > 0)
                 { mdf_Added_Tot = mdf_Added_Tot + 1 }

              if (IS_IDX($MdF_AttrezzaRegFacc))
                 {
                  if ( STRCMP(loc_MDFSys_Load_ini, "OnAfterFirstMdFAdd") == 0
                     & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1
                     )
                     {
                      if (idx_MdF_Var != $MdF_AttrezzaRegFacc)
                         {
                          if (VAR_EXIST($MdF_AttrezzaRegFacc, "del_var_CHIAVE") )
                             {
                              DEL_VAR($MdF_AttrezzaRegFacc, "CHIAVE_*")
                              DEL_VAR($MdF_AttrezzaRegFacc, "del_var_chiave*")
                             }

                          DEL_VAR($MdF_AttrezzaRegFacc, "DTP_*")
                          DEL_VAR($MdF_AttrezzaRegFacc, "CAM_*")
                          DEL_VAR($MdF_AttrezzaRegFacc, "Cam_*")
                          DEL_VAR($MdF_AttrezzaRegFacc, "MdF_*")
                         }
                     }
                 }

             // 20.03.2024 Potrebbe non servire piu e dovrebbe velocizzare un po' la Macro CAM
              //if ($MdF_NO_LOGMSG == 0)
              //   {
              //    if (mdf_add_now_MdF_CamMdFrontali == 0)
              //       {
              //        COMANDO2(STRCAT("LOGMSG MdF_CamMdFrontali entrato ma non ho aggiunto niente per mdf_Add_ctrl=", STR(mdf_Add_ctrl), " idx=", STR($mdf_idx_Fro), " ele=", NOME($mdf_idx_Fro), " ", DATA(0)))
              //       }
              //   }
             }

          $mdf_i = $mdf_i+1
         }
      if ($MdF_display_err > 0)  { $MdF_display_err = -0.1 }

      if ( IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacroPreventivo") == 1
         | STRCMP(MDFSys_Load_ini, "OnMacro") == 0
         )
         { COMANDO2("SHOW Abilita On   // MdF_CamMdFrontali") }

      if (STRCMP(MDFSys_Load_ini, "OnAfterFirstMdFAdd") == 0)
         {
          // Se inserisco da Listino il primo elemento e quindi lui stesso fa il ricalcola allora da problemi
          // quindi ACTION != 2
          if (ACTION() != 2)
             {
              if (mdf_Added_Tot > 0)
                 {
                  if (IS_IDX($MdF_AttrezzaRegFacc) )
                     { COMANDO(STRCAT("RICALCOLA_UNA ", STR($MdF_AttrezzaRegFacc), " no_ridisegna no_agganciati", " // ", NOME($MdF_AttrezzaRegFacc), " x OnAfterFirstMdFAdd MdF_AttrezzaRegFacc")) }
                 }
             }
         }

      // Se lo chiamo alla finefine quindi con COMANDO anzichè COMANDO2 va meglio
      // così se ci sono altri ricalcoli intermedi dei padri gli MdF_ figli si ricalcolano
      // già correttamente senza dover lanciare il RICALCOLA locale per indice_riga
      if ( IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1
        // per CamGraf_Msg_Coll_CerBat per far uscire il Messaggio subito
         & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMdF_AttrezzaRegFac*") != 1
         )
         {
          if (mdf_Added_Tot > 0)
             { COMANDO(STRCAT("Procedura MdF_Ctrl_Post_RELATIVE_ADD // NOOnMacro MdF_CamMdFrontali mdf_Added_Tot=", STR(mdf_Added_Tot))) }
         }
      else
         {
          // Se la procedura è chiamata da Macro esempio MacroCam conviene che il COMANDO sia fatto
          // subito, quindi prima che vengano aggiunti gli elementi CAM, quindi COMANDO2
          if (mdf_Add_Tot == 0)
             { COMANDO2("Procedura MdF_Ctrl_Post_RELATIVE_ADD // MdF_CamMdFrontali mdf_Add_Tot=0") }
          else
             {
              if (mdf_Added_Tot > 0)
                 { COMANDO2(STRCAT("Procedura MdF_Ctrl_Post_RELATIVE_ADD // MdF_CamMdFrontali da Macro=", $MdF_Load_att, " mdf_Added_Tot=", STR(mdf_Added_Tot))) }
              // In alcuni Ambienti impiega del tempo. In realtà mi interessa principalmente con la OnMacroCAM
              // o in determinati momenti
              if ( IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacroCAM") == 1
                 | IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacroFindCollCerBat") == 1
                 )
                 {
                  COMANDO2(STRCAT("Procedura MdF_Ctrl_Cambiamenti // MdF_CamMdFrontali mdf_Add_Tot=", STR(mdf_Add_Tot)))
                 }
             }
         }

      GOSUB MdF_DEL_VAR

      if ($MdF_NO_LOGMSG == 0)
         {
          COMANDO2(STRCAT("LOGMSG } MdF_CamMdFrontali FINE ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
         }
   }

  // 06.02.2023
   PROCEDURA mdf_Add_MdF_Fer_Glob
   {
      mdf_add_now_MdF_CamMdFrontali = 0
      mdF_Lav_offx = 0
      mdF_Lav_offz = 0
      mdF_Lav_offy = 0

     // 23.04.2024 Qui mancava
      if (VAR_EXIST($mdf_idx_Fro, "MdF_offx_REL_ADD") )  { mdF_Lav_offx = mdF_Lav_offx + VAR_VAL($mdf_idx_Fro, "MdF_offx_REL_ADD") }
      if (VAR_EXIST($mdf_idx_Fro, "MdF_offy_REL_ADD") )  { mdF_Lav_offy = mdF_Lav_offy + VAR_VAL($mdf_idx_Fro, "MdF_offy_REL_ADD") }
      if (VAR_EXIST($mdf_idx_Fro, "MdF_offz_REL_ADD") )  { mdF_Lav_offz = mdF_Lav_offz + VAR_VAL($mdf_idx_Fro, "MdF_offz_REL_ADD") }

      if (IS_MATCH(NewRTA, "1") == 1)  { mdF_Lav_offy = -VAR_VAL($mdf_idx_Fro, "Y") }

      idx_MdF_Var = $mdf_idx_Fro
      $idx_tab_Var = idx_MdF_Var

      // 15.03.2024
      // Altrimenti se non imposto un default in tabella perchè mi va bene 1 che è il default, mi rimane l' ultimo che ho impostato in
      // tabella e se rientro non lo reimposto a 1, ma mi tiene appunto l' ultimo
      if (VAR_EXIST($mdf_idx_Fro, "CamSys_DistNear") )  { DEL_VAR($mdf_idx_Fro, "CamSys_DistNear") }

      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR($mdf_idx_Fro, "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaFro"
      GOSUB MdF_Variabili

      CHIAVE_TABVAR_MDF = "FerGen"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "FerGenFro"
      GOSUB MdF_Variabili
      GOSUB MdF_pos_FerramenteGen

      if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
         {
          $mdf_add_RegFacc = 1

          $mdf_elemento_fro = "MdF_FerramenteGeneriche"
          COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
          if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

          if ($mdf_add_RegFacc > 0)
             {
              mdf_add_now_MdF_CamMdFrontali = mdf_add_now_MdF_CamMdFrontali+1
              COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0"))
             }
         }

     // 06.03.2024
      CHIAVE_TABVAR_MDF = "FerCri"
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "FerCriFro"
      GOSUB MdF_Variabili
      GOSUB MdF_pos_FerGenCri

      if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
         {
          $mdf_add_RegFacc = 1

          $mdf_elemento_fro = "MdF_FerramenteGenCri"
          COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
          if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

          if ($mdf_add_RegFacc > 0)
             {
              mdf_add_now_MdF_CamMdFrontali = mdf_add_now_MdF_CamMdFrontali+1
              COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0"))
             }
         }

      GOSUB MdF_Var_Ferramente
      // In KeyFamRegFacc basta che passi una volta, è in RegFacc che verifica quanti elementi Fer ci sono
      tLav = "FerFro"
      GOSUB MdF_KeyFamRegFacc
      tLav = "FerFia"
      GOSUB MdF_KeyFamRegFacc
      tLav = "FerPia"
      GOSUB MdF_KeyFamRegFacc

      if ( STRLEN(VAR_VAL_STR($mdf_idx_Fro, "KeyFamRegFacc_FerFro")) > 0
         | STRLEN(VAR_VAL_STR($mdf_idx_Fro, "KeyFamRegFacc_FerFia")) > 0
         | STRLEN(VAR_VAL_STR($mdf_idx_Fro, "KeyFamRegFacc_FerPia")) > 0
         )
         {
          $mdf_indice_riga = 1
          $mdf_quante_RegFacc = 4

          while($mdf_indice_riga < 16)
             {
              GOSUB MdF_pos_Ferramente
              if ( VAR_EXIST($mdf_idx_Fro, "Escludi_FerFro1") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFro2")
                 | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFia1") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFia2")
                 | VAR_EXIST($mdf_idx_Fro, "Escludi_FerPia1") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerPia2")
                 | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFro3") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFro4")
                 | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFia3") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFia4")
                 | VAR_EXIST($mdf_idx_Fro, "Escludi_FerPia3") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerPia4")
                 )
                 {
                  $mdf_add_RegFacc = 1

                  $mdf_elemento_fro = "MdF_Ferramente_4Reg"
                  COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                  iFE=1
                  while (iFE <= $mdf_Ele)
                     {
                      if (VAR_VAL($mdf_Ele[iFE], "indice_riga") == $mdf_indice_riga)
                         { $mdf_add_RegFacc = -1 }
                      iFE = iFE+1
                     }

                  if ($mdf_add_RegFacc > 0)
                     {
                      mdf_add_now_MdF_CamMdFrontali = mdf_add_now_MdF_CamMdFrontali+1
                      $mdf_elemento_fro = "MdF_Ferramente_4Reg"
                      // La gestione COMANDO2 con ELELMENTO_I da errore nel flusso M4 in inserimento elemento nella stanza
                      //COMANDO2(STRCAT("ELEMENTO_I ", $mdf_elemento_fro))
                      COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz) , " 0"))
                      COMPONENTI2("mdf_Ferr", $mdf_idx_Fro, $mdf_elemento_fro)
                      iFe=1
                      while (iFe <= mdf_Ferr)
                         {
                          if (VAR_EXIST(mdf_Ferr[iFe], "indice_riga") != 1)
                             {
                              VAR_VALUE_SET(mdf_Ferr[iFe], "indice_riga", $mdf_indice_riga)
                              VAR_VALUE_SET(mdf_Ferr[iFe], "quante_RegFacc", $mdf_quante_RegFacc)
                             }
                          iFe = iFe+1
                         }
                     }
                  DEL_VAR($mdf_idx_Fro, "Escludi_Fer*")
                 }

              $mdf_indice_riga = $mdf_indice_riga+4
             }
         }
      $mdf_indice_riga = 1
      COMPONENTI3("$mdf_FerrADDED", $mdf_idx_Fro, "MdF_*")
      if ($mdf_FerrADDED > 0)
         { mdf_Added_Tot = mdf_Added_Tot + 1 }
   }

   PROCEDURA MdF_CamMdFrontali_Load_pers
   {
      // La procedura la chiamo già su OnLoadedOrder quindi so gia di essere in
      // $OnLoadOrder=0 o $VAR_LOAD_ORDER=0

      if (VAR_VAL(-1, "MDFSys_Exit_Always") == 1)   { EXITSUB() }

      //$MdF_Load_pers vuoto significa far passare tutti su VaribailiDaTipoPadri e VariabiliMdF.txt per la keyGenerica
      GOSUB MdF_TABLE_CLOSE

      GOSUB MdF_path_cam_ini
      $MdF_Visualize = SUBST_LABEL(READ_INI2("CAMCAB", "MdF_Visualize", $MdF_path_camini))
      $MdF_Utente = SUBST_LABEL(READ_INI2("CAMCAB", "MdF_Utente", $MdF_path_camini))
      // Se non li trovo li cerco anche nel metron.ini
      if (STRCMP($MdF_Visualize, "") == 0)  { $MdF_Visualize = SUBST_LABEL(READ_INI("init", "MdF_Visualize")) }
      if (STRCMP($MdF_Utente, "") == 0)     { $MdF_Utente = SUBST_LABEL(READ_INI("init", "MdF_Utente")) }
     // 03.04.2018
      if (VAR_VAL(-1, "CAM_CloseOpenTab") < 0)
         { $CAM_CloseOpenTab = ATOI(SUBST_LABEL(READ_INI2("CAMCAB", "CAM_CloseOpenTab", $MdF_path_camini))) }
      if (VAR_VAL(-1, "CAM_CloseOpenTab") > 1)  { CHIEDI(-1, "CAM_CloseOpenTab") }

      // MdF_Load puo avere i seguenti valori:
      // - OnMacro* significa solo da Macro quindi solo procedure che prima della chiamata hanno
      //            $MdF_Load_att = "OnMacroXXX", quindi non entrerà nemmeno in MdF_AttrezzaRegFacc
      // - NoOnLoadedOrder significa che non devono essere aggiunti nell'OnLoadedOrder ma
      //            può entrare nella MdF_AttrezzaRegFacc, quindi aggiunti solo nell'eventuale
      //            elemento che cambia e quindi entra in MdF_AttrezzaRegFacc
      // - OnAfterFirstMdFAdd significa che vengono aggiunti tutti non appena il primo CamMdFrontali
      //            entra in MdF_AttrezzaRegFacc
      // - OnInterat significa che entra solo per cambio da utente ACTION 3 o inserimento codice da Listino
      MDFSys_Load_ini = SUBST_LABEL(READ_INI2("CAMCAB", "MdF_Load", $MdF_path_camini))
      loc_MDFSys_Load_ini = MDFSys_Load_ini
     // 03.07.2024 Obsoleto. non deve piu essitere OnAfterFirstMdFAdd
      if (STRCMP(MDFSys_Load_ini, "OnAfterFirstMdFAdd") == 0)
         {
          MDFSys_Load_ini = "NoOnLoadedOrder"
          COMANDO2(STRCAT("LOGMSG MdF_CamMdFrontali cam.ini errato. MdF_Load OnAfterFirstMdFAdd non è più supportato dal 2018"))
         }

      GOSUB MdF_Ctrl_Load_save_prec

      // 17.09.2015
      // Cambio COMANDO in COMANDO2
      // Andrebbe bene il concetto di fare COMANDO in modo da aggiungere gli MdF_ come ultimissima cosa,
      // in realtà se su OnLoadedOrder ci sono dei ricalcoli Bdm o dll, o meglio dei cambiamenti dll quindi ACTION 3
      // e c'è la gestione Interat mi entra 2 volte sulla lettura tabelle, anche se proprio perché gli elementi
      // si ricalcolano sarebbe opportuno fare dopo l' aggiunta MdF_
      // Dato che dipende dalle dll su OnLoadedOrder, intanto imposto la doppia gestione COMANDO o COMANDO2
      // perché cambia la velocità della procedura
      if ($MdF_Load_pers_CMD == 0)
         {
          COMANDO("SHOW Abilita Off   // MdF_CamMdFrontali_Load_pers")
          if ($MdF_NO_LOGMSG == 0)
             {
              COMANDO(STRCAT("LOGMSG { MdF_CamMdFrontali_Load_pers INIT ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
             }
         }
      else
         {
          COMANDO2("SHOW Abilita Off   // MdF_CamMdFrontali_Load_pers")
          if ($MdF_NO_LOGMSG == 0)
             {
              COMANDO2(STRCAT("LOGMSG { MdF_CamMdFrontali_Load_pers INIT ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
             }
         }

      if (STRLEN(VAR_VAL_STR(-1, "MdF_Load_att")) == 0)  { $MdF_Load_att = STRCAT("OnLoadPers", $MdF_Load_pers) }

      // Se cambio RegFacc non viene riletta
      if (VAR_VAL(-1, "CAM_Visualize") > 0  |  VAR_VAL(-1, "CAM_CloseOpenTab") > 1)
         {
          if (VAR_VAL(-1, "CAM_Visualize") != 3  |  VAR_VAL(-1, "CAM_CloseOpenTab") > 1)
             {
              if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") == 1)
                 {
                  WITH_ALIAS("test_mdf_Cam", "MdF_CAM")
                  test_mdf_i = 1
                  while (test_mdf_i <= test_mdf_Cam)
                     {
                      test_mdf_idx_Fro = test_mdf_Cam[test_mdf_i]
                      if ($MdF_Load_pers_CMD == 0)
                         { COMANDO(STRCAT("RICALCOLA_UNA ", STR(test_mdf_idx_Fro), " no_ridisegna no_agganciati", " // ", NOME(test_mdf_idx_Fro), " da MdF_CamMdFrontali rilettura tab CAM_Visualize>0")) }
                      else
                         { COMANDO2(STRCAT("RICALCOLA_UNA ", STR(test_mdf_idx_Fro), " no_ridisegna no_agganciati", " // ", NOME(test_mdf_idx_Fro), " da MdF_CamMdFrontali rilettura tab CAM_Visualize>0")) }

                      test_mdf_i = test_mdf_i+1
                     }
                 }
             }
         }

      WITH_ALIAS("$mdf_Fro", "CamMdFrontali")

      NewRTA = "1"

      mdf_Add_Tot = 0
      mdf_Added_Tot = 0
      mdf_Add_TooEarly = 0
      $mdf_i = 1
      while ($mdf_i <= $mdf_Fro)
         {
          $mdf_idx_Fro = $mdf_Fro[$mdf_i]

          mdf_coll_compatibile = 1
          mdf_collezione_att = UPPER(COLLEZIONE($mdf_idx_Fro))
          mdf_collezione_glob = ""
          if (VAR_EXIST(-1, "COLLEZIONE") )  { mdf_collezione_glob = UPPER($COLLEZIONE) }

          if ( STRLEN(mdf_collezione_att) > 1
             & STRLEN(mdf_collezione_glob) > 1
             & STRCMP(mdf_collezione_att, mdf_collezione_glob) != 0
             )
             { mdf_coll_compatibile = 0 }

          //DISPLAY2(STRCAT("Collezione mdf_idx_Fro=", UPPER(COLLEZIONE($mdf_idx_Fro))))

          COMPONENTI3("$mdf_Ferr", $mdf_idx_Fro, "MdF_*")

          mdf_Add_ctrl = 0
          if ( $mdf_Ferr == 0
             & mdf_coll_compatibile > 0
             )
             { mdf_Add_ctrl = 1 }

          if ( STRCMP($MdF_Utente, "") != 0
             & mdf_coll_compatibile > 0
             )
             { mdf_Add_ctrl = 2 }

          if ( $mdf_Ferr > 0
             & mdf_coll_compatibile > 0
             & STRCMP($MdF_Utente, "") == 0
             & VAR_EXIST($mdf_idx_Fro, "KeyFamRegFacc") != 1
             )
             { mdf_Add_ctrl = 3 }

          if (mdf_Add_ctrl == 0  &  $mdf_Ferr > 0)
             {
              mdf_Add_Tot = mdf_Add_Tot+1
             }

          mdf_ins2_att = INSERIMENTO2(PADRE($mdf_idx_Fro, -1))
          if (mdf_ins2_att == $ins2_accessorio)
             { mdf_Add_ctrl = -9999 }

         // 03.11.2016
          if (VAR_VAL($mdf_idx_Fro, "MdF_NoOnLoadedOrder") == 1)
             { mdf_Add_ctrl = -1 }

          if (mdf_Add_ctrl > 0)
             {
              //COMANDO2(STRCAT("LOGMSG MdF_CamMdFrontali_Load_pers CtrlVar e ADD MdF_ per mdf_Add_ctrl=", STR(mdf_Add_ctrl), " idx=", STR($mdf_idx_Fro), " ele=", NOME($mdf_idx_Fro), " ", DATA(0)))

              mdF_Lav_offx = 0
              mdF_Lav_offz = 0
              mdF_Lav_offy = 0
              SET_#($mdf_idx_Fro)
              if (IS_MATCH(NewRTA, "1") == 1) { mdF_Lav_offy = -#Y }
              #mdF_Lav_offy_LoadPers = mdF_Lav_offy

              DEL_VAR($mdf_idx_Fro, "Escludi_*")

              idx_MdF_Var = $mdf_idx_Fro
              $idx_tab_Var = idx_MdF_Var

              // Su Load_pers se ho gia caricato le variabili da MdF_Load_Var o MdF_Load_Var_Generica
              // significa che le ho già caricate come ultima cosa sull' OnLoadedOrder da un ricalcolo
              // Bdm o dll e quindi quando arriva alla MdF_CamMdFrontali_Load_pers non serve ripassare
              // di qua
              if ( VAR_VAL(idx_MdF_Var, "mdf_Load_Var_maked") <= 0
                 // problema caricamento cic
                 | VAR_EXIST(-1, "MdF_Apertura") != 1
                 )
                 {
                  GOSUB MdF_VariabiliDaTipoPadri
                  CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR($mdf_idx_Fro, "MdF_addKey_keyGenerica"))
                  GOSUB MdF_Variabili
                  CHIAVE_TABVAR_MDF = "keyGenericaFro"
                  GOSUB MdF_Variabili
                  VAR_CREATE_NUM(idx_MdF_Var, "mdf_Load_Var_maked", 1, 0, "")
                 }

              if (VAR_EXIST($mdf_idx_Fro, "MdF_offx_REL_ADD") )
                 { mdF_Lav_offx = mdF_Lav_offx + VAR_VAL($mdf_idx_Fro, "MdF_offx_REL_ADD") }

              if (VAR_EXIST($mdf_idx_Fro, "MdF_offy_REL_ADD") )
                 { mdF_Lav_offy = mdF_Lav_offy + VAR_VAL($mdf_idx_Fro, "MdF_offy_REL_ADD") }

              if (VAR_EXIST($mdf_idx_Fro, "MdF_offz_REL_ADD") )
                 { mdF_Lav_offz = mdF_Lav_offz + VAR_VAL($mdf_idx_Fro, "MdF_offz_REL_ADD") }

              if (STR_INDEX_OF($MdF_Load_pers, 0, "CerBat") > -1)
                 {
                  if ( IS_MATCH(MdF_Apertura, "SX*")
                     | IS_MATCH(MdF_Apertura, "DX*")
                     )
                     {
                      CHIAVE_TABVAR_MDF = "CerBat"
                      GOSUB MdF_Variabili

                      // 22.10.2019
                      // Spostato prima di leggere le CerBatFro per avere gli sbordiY MdfSys_SbordoYSup/Inf prima di KeyFamRegFacc
                      // Lo tengo dopo CerBat per MdF_angolBas
                      mdf_idx_KFBX = idx_MdF_Var
                      GOSUB MdF_KeyFam_Battuta_X_Gen
                      SET_#($mdf_idx_Fro)

                      CHIAVE_TABVAR_MDF = "CerBatFro"
                      GOSUB MdF_Variabili

                      GOSUB MdF_pos_CerBat
                      if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                         {
                          $mdf_add_RegFacc = 1

                          // 13.02.2024
                          if (VAR_VAL($mdf_idx_Fro, "MdF_VanoY2") < 50)
                             {
                              $mdf_elemento_fro = "MdF_CerniereBattenti"
                              COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                              if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                              if (VAR_VAL($mdf_idx_Fro, "mdf_added_Interat_CerBat") > 0)
                                 { $mdf_add_RegFacc = -2 }

                              if ($mdf_add_RegFacc > 0)
                                 {
                                  #mdf_added_CerBat_daLoadPers = 1
                                  if ($MdF_Load_pers_CMD == 0)
                                     { COMANDO(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                                  else
                                     { COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                                 }
                             }
                          else
                             {
                              // 13.02.2024
                              mdf_elemento_fro = "MdF_CerniereBattVY1"
                              COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, mdf_elemento_fro)
                              if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                              if (VAR_VAL($mdf_idx_Fro, "mdf_added_Interat_CerBat") > 0)
                                 { $mdf_add_RegFacc = -2 }

                              if ($mdf_add_RegFacc > 0)
                                 {
                                  #mdf_added_CerBat_daLoadPers = 1
                                  MdF_VanoY1 = VAR_VAL($mdf_idx_Fro, "MdF_VanoY1")
                                  MdF_AriaVaniY = VAR_VAL($mdf_idx_Fro, "MdF_AriaVaniY")
                                  mdf_Vano_offy1 = VAR_VAL($mdf_idx_Fro, "MdF_Vano_offy1")
                                  if ($MdF_Load_pers_CMD == 0)
                                     { COMANDO(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy+mdf_Vano_offy1)," ",STR(mdF_Lav_offz) ," 0")) }
                                  else
                                     { COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy+mdf_Vano_offy1)," ",STR(mdF_Lav_offz) ," 0")) }

                                  mdf_elemento_fro = "MdF_CerniereBattVY2"
                                  if ($MdF_Load_pers_CMD == 0)
                                     { COMANDO(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy+mdf_Vano_offy1+MdF_AriaVaniY+MdF_VanoY1)," ",STR(mdF_Lav_offz) ," 0")) }
                                  else
                                     { COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy+mdf_Vano_offy1+MdF_AriaVaniY+MdF_VanoY1)," ",STR(mdF_Lav_offz) ," 0")) }

                                  // 07.03.2024
                                  if (VAR_VAL($mdf_idx_Fro, "MdF_VanoY3") >= 50)
                                     {
                                      mdf_elemento_fro = "MdF_CerniereBattVY3"
                                      if ($MdF_Load_pers_CMD == 0)
                                         { COMANDO(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy+mdf_Vano_offy1+MdF_AriaVaniY+MdF_VanoY1+MdF_AriaVaniY+MdF_VanoY2)," ",STR(mdF_Lav_offz) ," 0")) }
                                      else
                                         { COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy+mdf_Vano_offy1+MdF_AriaVaniY+MdF_VanoY1+MdF_AriaVaniY+MdF_VanoY2)," ",STR(mdF_Lav_offz) ," 0")) }
                                     }
                                 }
                             }
                          }

                      // 15.12.2016
                      // Per il momento non uso key CerAngLib, dovrebbe bastare la CerBat
                      //CHIAVE_TABVAR_MDF = "CerAngLib"
                      //GOSUB MdF_Variabili
                      //CHIAVE_TABVAR_MDF = "CerAngLibFro"
                      //GOSUB MdF_Variabili

                      GOSUB MdF_pos_CerAngLib
                      if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                         {
                          $mdf_add_RegFacc = 1

                          $mdf_elemento_fro = "MdF_CerniereAngLibro"
                          COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                          if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                          if (VAR_VAL($mdf_idx_Fro, "mdf_added_Interat_CerBat") > 0)
                             { $mdf_add_RegFacc = -2 }

                          if ($mdf_add_RegFacc > 0)
                             {
                              #mdf_added_CerLib_daLoadPers = 1
                              if ($MdF_Load_pers_CMD == 0)
                                 { COMANDO(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                              else
                                 { COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                             }
                         }
                     }
                 }

              //- 02.11
              if ( IS_MATCH(MdF_Apertura, "SX*") != 1
                 & IS_MATCH(MdF_Apertura, "DX*") != 1
                 // Se vuoi la battuta vuol dire che hai una MdF_Apertura che ha dei meccanismi RegFacc quindi non serve se vuota
                 & STRLEN(MdF_Apertura) > 0
                 )
                 {
                  mdf_idx_KFBX = idx_MdF_Var
                  GOSUB MdF_KeyFam_Battuta_X_Gen
                  SET_#($mdf_idx_Fro)
                 }

              if (STR_INDEX_OF($MdF_Load_pers, 0, "CerSof") > -1)
                 {
                  if ( IS_MATCH(MdF_Apertura, "SX*SOF*")
                     | IS_MATCH(MdF_Apertura, "DX*SOF*")
                     )
                     {
                      CHIAVE_TABVAR_MDF = "CerSof"
                      GOSUB MdF_Variabili
                      GOSUB MdF_pos_CerSof
                      if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                         {
                          $mdf_add_RegFacc = 1

                          $mdf_elemento_fro = "MdF_CerniereSoffietto"
                          COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                          if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                          if ($mdf_add_RegFacc > 0)
                             {
                              #mdf_added_CerSof_daLoadPers = 1
                              if ($MdF_Load_pers_CMD == 0)
                                 { COMANDO(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                              else
                                 { COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                             }
                         }
                     }
                 }

              if ( STR_INDEX_OF($MdF_Load_pers, 0, "CerRib") > -1
                 | STR_INDEX_OF($MdF_Load_pers, 0, "PisAnta") > -1
                 | STR_INDEX_OF($MdF_Load_pers, 0, "PisFia") > -1
                 )
                 {
                  if ( IS_MATCH(MdF_Apertura, "VA*")
                     | IS_MATCH(MdF_Apertura, "RI*")
                     )
                     {
                      CHIAVE_TABVAR_MDF = "CerRib"
                      GOSUB MdF_Variabili
                      CHIAVE_TABVAR_MDF = "CerRibFro"
                      GOSUB MdF_Variabili

                      CHIAVE_TABVAR_MDF = "PisAnta"
                      GOSUB MdF_Variabili
                      CHIAVE_TABVAR_MDF = "PisAntaFro"
                      GOSUB MdF_Variabili
                      CHIAVE_TABVAR_MDF = "PisFia"
                      GOSUB MdF_Variabili
                      CHIAVE_TABVAR_MDF = "PisFiaFro"
                      GOSUB MdF_Variabili
                      GOSUB MdF_pos_CerRib
                      if ( STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", "CerRib"))) > 0
                         | STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", "PisAnta"))) > 0
                         | STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", "PisFia"))) > 0
                         )
                         {
                          $mdf_add_RegFacc = 1

                          $mdf_elemento_fro = "MdF_CernierePistoneVasRib"
                          COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                          if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                          if ($mdf_add_RegFacc > 0)
                             {
                              #mdf_added_CerRib_daLoadPers = 1
                              if ($MdF_Load_pers_CMD == 0)
                                 { COMANDO(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                              else
                                 { COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                             }
                         }
                     }
                 }

              if (STR_INDEX_OF($MdF_Load_pers, 0, "Par") > -1)
                 {
                  CHIAVE_TABVAR_MDF = "Par"
                  GOSUB MdF_Variabili
                  CHIAVE_TABVAR_MDF = "ParFro"
                  GOSUB MdF_Variabili
                  GOSUB MdF_pos_Paracolpi
                  if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                     {
                      $mdf_add_RegFacc = 1

                      $mdf_elemento_fro = "MdF_ContParacolpi"
                      COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                      if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                      if ($mdf_add_RegFacc > 0)
                         {
                          #mdf_added_Par_daLoadPers = 1
                          if ($MdF_Load_pers_CMD == 0)
                             { COMANDO(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                          else
                             { COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                         }
                     }
                 }

              if (STR_INDEX_OF($MdF_Load_pers, 0, "ParInt") > -1)
                 {
                  CHIAVE_TABVAR_MDF = "ParInt"
                  GOSUB MdF_Variabili
                  CHIAVE_TABVAR_MDF = "ParIntFro"
                  GOSUB MdF_Variabili
                  GOSUB MdF_pos_ParacolpiInt
                  if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                     {
                      $mdf_add_RegFacc = 1

                      $mdf_elemento_fro = "MdF_ContParacolpiInt"
                      COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                      if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                      if ($mdf_add_RegFacc > 0)
                         {
                          #mdf_added_Par_daLoadPers = 1
                          if ($MdF_Load_pers_CMD == 0)
                             { COMANDO(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                          else
                             { COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                         }
                     }
                 }

              if (STR_INDEX_OF($MdF_Load_pers, 0, "FerGen") > -1)
                 {
                  CHIAVE_TABVAR_MDF = "FerGen"
                  GOSUB MdF_Variabili
                  CHIAVE_TABVAR_MDF = "FerGenFro"
                  GOSUB MdF_Variabili
                  GOSUB MdF_pos_FerramenteGen
                  if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                     {
                      $mdf_add_RegFacc = 1

                      $mdf_elemento_fro = "MdF_FerramenteGeneriche"
                      COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                      if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                      if ($mdf_add_RegFacc > 0)
                         {
                          #mdf_added_FerGen_daLoadPers = 1
                          if ($MdF_Load_pers_CMD == 0)
                             { COMANDO(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                          else
                             { COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                         }
                     }
                 }

              // 06.03.2024
              if (STR_INDEX_OF($MdF_Load_pers, 0, "FerCri") > -1)
                 {
                  CHIAVE_TABVAR_MDF = "FerCri"
                  GOSUB MdF_Variabili
                  CHIAVE_TABVAR_MDF = "FerCriFro"
                  GOSUB MdF_Variabili
                  GOSUB MdF_pos_FerGenCri
                  if (STRLEN(VAR_VAL_STR($mdf_idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                     {
                      $mdf_add_RegFacc = 1

                      $mdf_elemento_fro = "MdF_FerramenteGenCri"
                      COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                      if ($mdf_Ele > 0)  { $mdf_add_RegFacc = -1 }

                      if ($mdf_add_RegFacc > 0)
                         {
                          #mdf_added_FerGen_daLoadPers = 1
                          if ($MdF_Load_pers_CMD == 0)
                             { COMANDO(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                          else
                             { COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                         }
                     }
                 }

              if ( STR_INDEX_OF($MdF_Load_pers, 0, "FerFro") > -1
                 | STR_INDEX_OF($MdF_Load_pers, 0, "FerFia") > -1
                 | STR_INDEX_OF($MdF_Load_pers, 0, "FerPia") > -1
                 )
                 {
                  $mdf_indice_riga = 1
                  $mdf_quante_RegFacc = 4
                  GOSUB MdF_Var_Ferramente

                  // In KeyFamRegFacc basta che passi una volta, è in RegFacc che verifica quanti
                  // elementi Fer ci sono
                  tLav = "FerFro"
                  GOSUB MdF_KeyFamRegFacc
                  tLav = "FerFia"
                  GOSUB MdF_KeyFamRegFacc
                  tLav = "FerPia"
                  GOSUB MdF_KeyFamRegFacc

                  if ( STRLEN(VAR_VAL_STR($mdf_idx_Fro, "KeyFamRegFacc_FerFro")) > 0
                     | STRLEN(VAR_VAL_STR($mdf_idx_Fro, "KeyFamRegFacc_FerFia")) > 0
                     | STRLEN(VAR_VAL_STR($mdf_idx_Fro, "KeyFamRegFacc_FerPia")) > 0
                     )
                     {
                      while($mdf_indice_riga < 16)
                         {
                          GOSUB MdF_pos_Ferramente
                          if ( VAR_EXIST($mdf_idx_Fro, "Escludi_FerFro1") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFro2")
                             | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFia1") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFia2")
                             | VAR_EXIST($mdf_idx_Fro, "Escludi_FerPia1") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerPia2")
                             | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFro3") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFro4")
                             | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFia3") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerFia4")
                             | VAR_EXIST($mdf_idx_Fro, "Escludi_FerPia3") | VAR_EXIST($mdf_idx_Fro, "Escludi_FerPia4")
                             )
                             {
                              $mdf_add_RegFacc = 1

                              $mdf_elemento_fro = "MdF_Ferramente_4Reg"
                              COMPONENTI3("$mdf_Ele", $mdf_idx_Fro, $mdf_elemento_fro)
                              iFE=1
                              while (iFE <= $mdf_Ele)
                                 {
                                  if (VAR_VAL($mdf_Ele[iFE], "indice_riga") == $mdf_indice_riga)
                                     { $mdf_add_RegFacc = -1 }
                                  iFE = iFE+1
                                 }

                              if ($mdf_add_RegFacc > 0)
                                 {
                                  #mdf_added_Fer4Reg_daLoadPers = 1
                                  $mdf_elemento_fro = "MdF_Ferramente_4Reg"
                                  // La gestione COMANDO2 con ELELMENTO_I da errore nel flusso M4 in inserimento elemento nella stanza
                                  //COMANDO2(STRCAT("ELEMENTO_I ", $mdf_elemento_fro))
                                  if ($MdF_Load_pers_CMD == 0)
                                     { COMANDO(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                                  else
                                     { COMANDO2(STRCAT("RELATIVE_ADD ", STR($mdf_idx_Fro), " ", $mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }

                                  COMPONENTI2("mdf_Ferr", $mdf_idx_Fro, $mdf_elemento_fro)
                                  iFe=1
                                  while (iFe <= mdf_Ferr)
                                     {
                                      if (VAR_EXIST(mdf_Ferr[iFe], "indice_riga") != 1)
                                         {
                                          VAR_VALUE_SET(mdf_Ferr[iFe], "indice_riga", $mdf_indice_riga)
                                          VAR_VALUE_SET(mdf_Ferr[iFe], "quante_RegFacc", $mdf_quante_RegFacc)
                                         }
                                      iFe = iFe+1
                                     }
                                 }
                              DEL_VAR($mdf_idx_Fro, "Escludi_Fer*")
                             }

                          $mdf_indice_riga = $mdf_indice_riga+4
                         }
                     }
                  $mdf_indice_riga = 1
                  COMPONENTI3("$mdf_FerrADDED", $mdf_idx_Fro, "MdF_*")
                  if ($mdf_FerrADDED > 0)
                     { mdf_Added_Tot = mdf_Added_Tot + 1 }
                 }
             }

          $mdf_i = $mdf_i+1
         }

      if ($MdF_Load_pers_CMD == 0)
         { COMANDO("SHOW Abilita On   // MdF_CamMdFrontali_Load_pers") }
      else
         { COMANDO2("SHOW Abilita On   // MdF_CamMdFrontali_Load_pers") }

      if ($MdF_Load_pers_CMD == 0)
         {
          if (mdf_Add_Tot == 0)
             { COMANDO("Procedura MdF_Ctrl_Post_RELATIVE_ADD // MdF_CamMdFrontali_Load_pers mdf_Add_Tot=0") }
          else
             {
              if (mdf_Added_Tot > 0)
                 { COMANDO("Procedura MdF_Ctrl_Post_RELATIVE_ADD // MdF_CamMdFrontali_Load_pers mdf_Add_TooEarly") }
             }
         }
      else
         {
          if (mdf_Add_Tot == 0)
             { COMANDO2("Procedura MdF_Ctrl_Post_RELATIVE_ADD // MdF_CamMdFrontali_Load_pers mdf_Add_Tot=0") }
          else
             {
              if (mdf_Added_Tot > 0)
                 { COMANDO2("Procedura MdF_Ctrl_Post_RELATIVE_ADD // MdF_CamMdFrontali_Load_pers mdf_Add_TooEarly") }
             }
         }

      GOSUB MdF_DEL_VAR

      if ($MdF_NO_LOGMSG == 0)
         {
          if ($MdF_Load_pers_CMD == 0)
             { COMANDO(STRCAT("LOGMSG } MdF_CamMdFrontali_Load_pers FINE ", VAR_VAL_STR(-1, "File"), " ", DATA(0))) }
          else
             { COMANDO2(STRCAT("LOGMSG } MdF_CamMdFrontali_Load_pers FINE ", VAR_VAL_STR(-1, "File"), " ", DATA(0))) }
         }
   }

   // 05.11.2019
   PROCEDURA MdF_RiCtrl_Battuta_X_Gen
   {
      WITH_ALIAS("mdf_FroRiCtrl", "CamMdFrontali")
      mdf_i = 1
      while (mdf_i <= mdf_FroRiCtrl)
         {
          idx_MdF_Var = mdf_FroRiCtrl[mdf_i]
          if (STRLEN(VAR_VAL_STR(idx_MdF_Var, "MdF_Apertura")) > 0)
             {
              mdf_idx_KFBX = idx_MdF_Var
              // 30.11.2020 MdF_Apertura devo riprenderla altrimenti in MdF_KeyFam_Battuta_X_Gen userebbe quella dell' ultimo CamMdFrontali
              MdF_Apertura = VAR_VAL_STR(idx_MdF_Var, "MdF_Apertura")
              GOSUB MdF_KeyFam_Battuta_X_Gen
             }
          mdf_i = mdf_i+1
         }
   }

   PROCEDURA MdF_sat_Ridisegna_Glob
   {
      WITH_ALIAS("mdf_FroS", "CamMdFrontali")

      mdfS_i = 1
      while (mdfS_i <= mdf_FroS)
         {
          mdf_idx_FroS = mdf_FroS[mdfS_i]
          //COMPONENTI2("mdf_ele_sat", mdf_idx_FroS, "MdF_Sat*")
          //mds_i = 1
          //while (mds_i <= mdf_ele_sat)
          //   {
          //    COMANDO(STRCAT("RICALCOLA_UNA ", STR(mdf_ele_sat[mds_i]), " no_agganciati", " // MdF_sat_Ridisegna"))
          //    mds_i = mds_i+1
          //   }
          COMANDO(STRCAT("RICALCOLA_UNA ", STR(mdf_idx_FroS), " no_agganciati", " // MdF_sat_Ridisegna"))
          mdfS_i = mdfS_i+1
         }
   }

   PROCEDURA MdF_Ricalcola_Post_Interat
   {
      WITH_ALIAS("$mdf_Fro", "CamMdFrontali")
      $mdf_i = 1
      while ($mdf_i <= $mdf_Fro)
         {
          $mdf_idx_Fro = $mdf_Fro[$mdf_i]
          if (VAR_VAL($mdf_idx_Fro, "mdf_Post_RELATIVE_ADD_interat") == 2)
             {
              SET_#($mdf_idx_Fro)
              #mdf_Post_RELATIVE_ADD_interat = 3
              COMANDO(STRCAT("RICALCOLA_UNA ", STR($mdf_idx_Fro), " no_agganciati", " // ", NOME($mdf_idx_Fro), " -MdF_Ricalcola_Post_Interat"))
             }
          $mdf_i = $mdf_i+1
         }
   }

  // per test per caricare le CerBat con i sat alla fine dell' OnLoadedOrder, ma impiega troppo tempo
   PROCEDURA MdF_CamMdFrontali_CerBat
   {
      WITH_ALIAS("mdf_Fro", "CamMdFrontali")
      mdf_i = 1
      while (mdf_i <= mdf_Fro)
         {
          mdf_idx_Fro = mdf_Fro[mdf_i]
          COMPONENTI2("wk_MdF", mdf_idx_Fro, "MdF_CerniereBattenti*")
          if (wk_MdF == 0)
             {
              if ( IS_MATCH(VAR_VAL_STR(mdf_idx_Fro, "MdF_Apertura"), "") == 1
                 | IS_MATCH(VAR_VAL_STR(mdf_idx_Fro, "MdF_Apertura"), "*SX*") == 1
                 | IS_MATCH(VAR_VAL_STR(mdf_idx_Fro, "MdF_Apertura"), "*DX*") == 1
                 )
                 {
                  COMANDO2(STRCAT("RICALCOLA_UNA ", STR(mdf_idx_Fro), " no_ridisegna no_agganciati", " // ", NOME(mdf_idx_Fro), " per MdF_CamMdFrontali_CerBat"))
                 }
             }

          mdf_i = mdf_i+1
         }
   }

   PROCEDURA MdF_path_cam_ini
   {
      // 30.04.2024 Ottimizzazioni FILE_EXIST per la rete
      if (STRLEN(VAR_VAL_STR(-1, "MdF_path_camini")) > 15)
         {
          if (VAR_VAL(-1, "mdF_path_camini_exist") >= 1)  { EXITSUB() }
         }

      if (FILE_EXIST(VAR_VAL_STR(-1, "MdF_path_camini")) == 1)
         {
          $mdF_path_camini_exist = 1
          EXITSUB()
         }

      $MdF_path_camini = STRCAT(GET_PATH("starting"), "\cam.ini")

      // metron_dir è per clienti Non standard !
      path_M4_CamExe = SUBST_LABEL(READ_INI( "label", "metron_dir"))
      if (STRLEN(path_M4_CamExe) < 1)
         {
          path_M4_CamExe = SUBST_LABEL(READ_INI( "label", "install_dir"))
         }

      // Se non ho il cam.ini in locale non devo più prendere il Metron.ini ma devo cercare il
      // cam.ini in rete. Anche sul CAM misto vecchio-2011+CAM-Nuovo funziona perché adesso se c'è il
      // CAM-Nuovo c'è sempre il cam.ini e se c'è il CAM vecchio-2011 per l'importDDP comanda la Esegui_DDP vecchia
      // tranne quando fatalità l'ordine ha solo CAM-Nuovo ma allora passa qua dentro e fa tutto
      // secondo CAM-Nuovo
      $mdf_path_DDP_gr = SUBST_LABEL(READ_INI2("CAMCAB", "path_DDP_gr", $MdF_path_camini))
      if (STRLEN($mdf_path_DDP_gr) <= 1)
         {
          $MdF_path_camini = STRCAT(path_M4_CamExe, "\cam.ini")
         }
   }

   PROCEDURA MdF_path_CAMTAB
   {
      if (STRLEN($path_CAMTABMDF) > 20)  { EXITSUB() }

      GOSUB MdF_path_cam_ini
      $path_CAMTABMDF = SUBST_LABEL(READ_INI2("CAMCAB", "path_CAMTABMDF", $MdF_path_camini))
      $path_file_sat_MdF = SUBST_LABEL(READ_INI2("CAMCAB", "path_file_sat_MdF", $MdF_path_camini))

      if (STRLEN($path_CAMTABMDF) < 3)
         { $path_CAMTABMDF = SUBST_LABEL(READ_INI2("CAMCAB", "path_CAMTAB", $MdF_path_camini)) }

      mdf_dir_camTab_ok = -1
      // 18.10.2022 rivisti commenti
      // su cam.ini c'è %dir_camTab% ma sara sempre vuota, perchè non c'è come label nel metron.ini, ma infatti
      // e' solo un' indicazione per dire che il path è dinamico e prendere la variabile $dir_camTab del Bdm corrente
      // Quindi se vuota la doppia barra ce l' ho alla fine del path, però devo fare con strindexof > 1, altrimenti con >=0 se ho il path di rete mi prende le barre iniziali per PC rete
      // 12.10.2021 Hms se \\ barre iniziali non entra, mdf_dir_camTab_ok rimane -1 e $path_CAMTABMDF prende path_CAMTABMDF da cam.ini
      //strindexof = STR_INDEX_OF($path_CAMTABMDF, 2, "\\")
      strindexof_2Fine_dir_camTabVuota = STR_INDEX_OF($path_CAMTABMDF, 2, "\\")
      strindexof_InitPathREte = STR_INDEX_OF($path_CAMTABMDF, 0, "\\")
      // quindi se ho rete e dir_camTab vuota entra qua in ogni caso e va bene
      //DISPLAY2(STRCAT("$path_CAMTABMDF ", $path_CAMTABMDF))
      if (STR_INDEX_OF($path_CAMTABMDF, 2, "\\") > 1)
         {
          mdf_dir_camTab_ok = 0
          if (STRLEN(VAR_VAL_STR(-1, "dir_camTab")) > 1)
             {
              mdf_dir_camTab_ok = 1
              $path_CAMTABMDF = STRCAT(STRMID(0,STRLEN($path_CAMTABMDF)-1,$path_CAMTABMDF), $dir_camTab, "\")
             }
         }

      // 12.10.2021
      //if (STRLEN($path_CAMTABMDF) < 3  |  mdf_dir_camTab_ok == 0)
      mdf_file_exist = FILE_EXIST(STRCAT($path_CAMTABMDF, "VariabiliMdF.txt"))
      if (STRLEN($path_CAMTABMDF) < 3  |  mdf_dir_camTab_ok == 0  |  mdf_file_exist != 1)
         {
          mdf_dir_camTab = "Tab"
          if (STRLEN(VAR_VAL_STR(-1, "dir_camTab")) > 1)
             { mdf_dir_camTab = VAR_VAL_STR(-1, "dir_camTab") }

          $path_CAMTABMDF = STRCAT(VAR_VAL_STR(-1, "path_bdm"), "Cam\", mdf_dir_camTab, "\")

          //if (FILE_EXIST(STRCAT($path_CAMTABMDF, "VariabiliMdF.txt")) != 1)
          //   { $path_CAMTABMDF = "ER" }
         }

      if (STRLEN($path_file_sat_MdF) < 3)
         {
          $path_file_sat_MdF = STRCAT(VAR_VAL_STR(-1, "path_bdm"), "Cam\sat\")
         // 31.01.2024 Bdm vecchi
          if (VAR_EXIST(-1, "path_bdm") != 1)
             { $path_file_sat_MdF = STRCAT(VAR_VAL_STR(-1, "path_files"), "Cam\sat\") }
         }
   }

   PROCEDURA MdF_Var_Ini
   {
      // 23.04.2020 dato che la richiamo sempre prima della GOSUB MdF_Var_Ini
      GOSUB MdF_path_cam_ini

      MDFSys_Load_ini = $MDFSys_Load_ini

      // 23.04.2020
      // altrimenti lo chiede per tutti i CamMdFrontali
      //if (VAR_EXIST(idx_att, "MDFSys_Load_ini") == 1  &  VAR_VAL(-1, "CAM_Visualize") <= 0  &  STRCMP($MdF_Utente, "-1") != 0)  { EXITSUB() }
     // 13.03.2025 H mdf_onInterat_sat=0
      //if (VAR_VAL(-1, "CAM_Visualize") <= 0  &  STRCMP($MdF_Utente, "-1") != 0)  { EXITSUB() }
      if (VAR_VAL(-1, "CAM_Visualize") <= 0  &  STRCMP($MdF_Utente, "-1") != 0)
         {
          if (STRLEN(MDFSys_Load_ini) > 1)                   { EXITSUB() }
          if (VAR_EXIST(idx_att, "mdf_Var_Ini_maked") == 1)  { EXITSUB() }
         }
      mdf_Var_Ini_maked = 1

      $MDFSys_Load_ini = SUBST_LABEL(READ_INI2("CAMCAB", "MdF_Load", $MdF_path_camini))
     // 23.04.2020 spostato, prima era dopo il GOSUB MdF_Var_Ini
      // MdF_Load puo avere i seguenti valori:
      // - OnMacro* significa solo da Macro quindi solo procedure che prima della chiamata hanno
      //            $MdF_Load_att = "OnMacroXXX", quindi non entrerà nemmeno in MdF_AttrezzaRegFacc
      // - NoOnLoadedOrder significa che non devono essere aggiunti nell'OnLoadedOrder ma
      //            può entrare nella MdF_AttrezzaRegFacc, quindi aggiunti solo nell'eventuale
      //            elemento che cambia e quindi entra in MdF_AttrezzaRegFacc
      // - OnAfterFirstMdFAdd significa che vengono aggiunti tutti non appena il primo CamMdFrontali
      //            entra in MdF_AttrezzaRegFacc
      // - OnInterat significa che entra solo per cambio da utente ACTION 3 o inserimento codice da Listino
      //MDFSys_Load_ini = SUBST_LABEL(READ_INI2("CAMCAB", "MdF_Load", $MdF_path_camini))
      MDFSys_Load_ini = $MDFSys_Load_ini
      if (STRCMP(MDFSys_Load_ini, "OnAfterFirstMdFAdd") == 0)
         {
          MDFSys_Load_ini = "NoOnLoadedOrder"
          COMANDO2(STRCAT("LOGMSG MdF_CamMdFrontali cam.ini errato. MdF_Load OnAfterFirstMdFAdd non è più supportato dal 2018"))
         }

      $MDFSys_Load_Var_ini = SUBST_LABEL(READ_INI2("CAMCAB", "MdF_Load_Var", $MdF_path_camini))

      if (STRCMP($MdF_Visualize, "") == 0)  { $MdF_Visualize = SUBST_LABEL(READ_INI2("CAMCAB", "MdF_Visualize", $MdF_path_camini)) }
      if (STRCMP($MdF_Utente, "-1") == 0)   { $MdF_Utente = SUBST_LABEL(READ_INI2("CAMCAB", "MdF_Utente", $MdF_path_camini)) }
      if (VAR_VAL(-1, "CAM_CloseOpenTab") < 0)  { $CAM_CloseOpenTab = ATOI(SUBST_LABEL(READ_INI2("CAMCAB", "CAM_CloseOpenTab", $MdF_path_camini))) }
      if (VAR_VAL(-1, "CAM_CloseOpenTab") > 1)  { CHIEDI(-1, "CAM_CloseOpenTab") }

     // 23.04.2020 altrimenti entra sempre perche' $CAM_Visualize=-1 di default
      if (VAR_VAL(-1, "CAM_Visualize") != 3)  { $CAM_Visualize = ATOI(SUBST_LABEL(READ_INI2("CAMCAB", "CAM_Visualize", $MdF_path_camini))) }
   }

   PROCEDURA Reg_pos_CerBat
   {
      if (VAR_VAL(idx_att, "escluso") != 0)  { EXITSUB() }
      if (ACTION() == 1064)  { EXITSUB() }

     // 07.08.2024
      if (UN_PADRE("MECCANISM*_UTENTE*") )  { EXITSUB() }

     // 14.12.2021
      if (VAR_EXIST(idx_att, "KeyFamRegFacc_prec") != 1)
         { KeyFamRegFacc_prec = "-" }

      // ACTION 3 per problema 08343
      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0  &  ACTION() != 3)
         {
          if (VAR_VAL(idx_att, "MdF_CerBat_Collision_Find") > 0  &  ACTION() == 2)
             { EXITSUB() }

          GOSUB MdF_CerBat_Collision
          EXITSUB()
         }

     // 10.05.2019 C1903203 Rip con CAM_TipoFori (MCB_collY_archetipo1_Var) che ancora non esiste
      if (IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "mdf_Load_save_prec") == 1)
         {
          if ( VAR_EXIST(idx_att, "MCB_collY_archetipo1_Var") == 1
             | VAR_EXIST(idx_att, "MCB_collY_archetipo2_Var") == 1
             | VAR_EXIST(idx_att, "MCB_collY_archetipo3_Var") == 1
             | VAR_EXIST(idx_att, "MCB_collY_archetipo4_Var") == 1
             | VAR_EXIST(idx_att, "MCB_collY_archetipo5_Var") == 1
             | VAR_EXIST(idx_att, "MCB_collY_archetipo6_Var") == 1
             | VAR_EXIST(idx_att, "MCB_collY_archetipo7_Var") == 1
             | VAR_EXIST(idx_att, "MCB_collY_archetipo8_Var") == 1
             )
             {
              if (VAR_VAL(idx_att, "MdF_CerBat_Collision_Find") > 0)
                 {
                  if ( ACTION() == 1
                     // cosi lo faccio una volta sola in piu
                     & VAR_VAL(idx_att, "mdf_CerBat_Collision_afterCaric") == 0
                     )
                     {
                      mdf_CerBat_Collision_afterCaric = 1
                      GOSUB MdF_CerBat_Collision
                     }
                 }
             }
         }

      // 10.05.2017
      if (VAR_VAL(idx_att, "mdf_collisionCer_Post") > 0)
         {
          mdf_collisionCer_Post = -1
          EXITSUB()
         }

      if ( ACTION() == 1 & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1
         // Se ACTION 1 puo capitare solo se MdF_ CerBat salvate nel rit con VAR_CHANGE sull' OnLoadedOrder
         & VAR_VAL(idx_att, "px_CerBat1") > 0
         )
         {
          // 16.07.2020 Catene Basi Ang Sn
          if (VAR_VAL(idx_att, "MdF_CerBat_Collision_Find") > 0)
             {
              if (VAR_VAL(idx_att, "mdf_CerBat_Collision_afterCaric") == 0)
                 {
                  mdf_CerBat_Collision_afterCaric = 2
                  mdf_CerBat_Collision_action = 1
                  GOSUB MdF_CerBat_Collision
                 }
             }
         }

      //if (PADRE(idx_att, 1) == 79336)  { DISPLAY2(STRCAT("Reg_pos_CerBat ", STR(VAR_VAL(idx_att, "mdf_ctrl_Change_Var_CAM")), " action=", STR(ACTION()))) }

      mdf_CerBat_Collision_maked = 0

     // 14.12.2021 altrimenti passava anche 4 volte
      if ( KeyFamRegFacc_prec == KeyFamRegFacc
        // 13.01.2022 P203728
         & VAR_VAL(idx_att, "px_CerBat1") > 0
         )
         {
          // PrC021601
          if (VAR_VAL(idx_att, "MdF_Ctrl_Cer_ChangeUte") == 0)
             {
             // 14.03.2025 altrimenti lo faceva 2 volte per ACTION() 1
              if (VAR_VAL(idx_att, "mdf_CerBat_Collision_action") <= 0)
                 {
                  mdf_CerBat_Collision_maked = 1
                  GOSUB MdF_CerBat_Collision
                  mdf_CerBat_Collision_action = -1
                 }
             }

         // 07.03.2022 Prima era senza controllo ACTION. Se qualcosa e' calcolato troppo tardi devo proseguire
          // a risettare anche RegFacc. Forse era per quello che non c' erano controlli
          // CMD() e' 1
         // 20.05.2024 Con Ottimizzazioni non va bene per 1023022113 CO80CASSINT2023 MdF_basy_CassInt1
          //if (ACTION() != 3)  { EXITSUB() }
          if (ACTION() != 3  &  ACTION() != 8)  { EXITSUB() }
         }

     // 09.05.2024 Ottimizzazioni
     // 20.05.2024 Non va bene per 1023022113 CO80CASSINT2023 MdF_basy_CassInt1
      //if (mdf_ctrl_Change_Var_CAM <= 0)  { EXITSUB() }

      if (ACTION() > 0)
         {
          // Se MdF_Apertura determina le Esclusioni e cambia anche dopo l'ADD degli MdF_
          // l'MdF_* deve rientrare per prendere le righe corrette !
          // In realta qualsiasi Colonna che è determinata da un condizionamento se cambia la
          // condizione devo rientrare !
          // In realtà mi basta vedere se cambia la KeyFamRegFacc e la MdF_Apertura
          // In realtà se l'ordine rigira nel Server-CAM il problema
          // non ci sarebbe (tranne nel caso trovato dove l'Apertura mi cambiava troppo tardi),
          // ma se si vuole fare solo il DDP-grezzo e l'inseritore ordine cambia delle varianti
          // il DDP-grezzo risulterebbe errato.
          // All'inizio si voleva evitare per evitare il COMANDO2 ma adesso c'è L' EVAL,
          // inoltre all'inizio entrava anche il Frontale mentre adesso il Frontale entra in
          // KeyFamRegFacc e ci sono le procedure MdF_ come MdF_pos_CerBat, MdF_pos_Paracolpi
          // e in piu vengono aggiunti alla fine e solo gli elementi MdF_ se c'è la sottochiave
          // (Par, CerBat,..) su KeyFamRegFacc.
          // Infine dato che gli elementi vengono aggiunti alla fine del caricamento
          // io lascerei che l'MdF entri qua dentro incondizionatamente.
          // Pertanto non vedo particolari rallentamenti o problemi se entro senza condizioni.

          // Eventualmente da verificare
          mdf_wk_RP_action_cmd = 0
          if (ACTION() > 0  &  ACTION() != 2  &  CMD() == 1)
             { mdf_wk_RP_action_cmd = ACTION() }

          if (VAR_EXIST(idx_att, "entry_regFacc") != 1)         { entry_regFacc = 0 }
          if (VAR_EXIST(idx_att, "entry_regFaccAct1") != 1)     { entry_regFaccAct1 = 0 }

          entry_regFacc_ACTION = ACTION()
          entry_regFacc = entry_regFacc+1

          px_CerBat1 = 0
          py_CerBat1 = 0
          py_CerBat2 = 0
          py_CerBat3 = 0
          py_CerBat4 = 0
          py_CerBat5 = 0
          py_CerBat6 = 0
          py_CerBat7 = 0
          py_CerBat8 = 0

          tLav = "CerBat"
          KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
         // 19.03.2024
          if (VAR_EXIST(idx_att, "MdF_numVanoY") )
             {
              KeyFamRegFacc_VY_Reg = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_VY", STR(MdF_numVanoY), "_", tLav))
              if (STRLEN(KeyFamRegFacc_VY_Reg) > 1)  { KeyFamRegFacc = KeyFamRegFacc_VY_Reg }
             }

          KeyFamRegFacc_prec = KeyFamRegFacc
          //CHIAVE_TABVAR_MDF = tLav
          //GOSUB MdF_Variabili
          GOSUB MdF_read_RegFacc

         // 26.10.2017
          if (VAR_VAL(idx_att, "MdF_Ctrl_Cer_ChangeUte") == 0)
             {
              if (mdf_CerBat_Collision_maked == 0)
                 { GOSUB MdF_CerBat_Collision }
             }

         // 14.12.2021 No la prima volta
          if (VAR_VAL(idx_att, "mdf_Ctrl_BasSat") >= 1)
             { GOSUB mdf_ctrl_posy_sat_Bas_ALW }

          if (VAR_EXIST(idx_att, "mdf_Ctrl_BasSat") != 1)  { mdf_Ctrl_BasSat = 1 }
         }
   }

   PROCEDURA Reg_pos_CerBat_parziale
   {
      if (VAR_VAL(idx_att, "escluso") != 0)  { EXITSUB() }
      if (ACTION() == 1064)  { EXITSUB() }

     // 07.08.2024
      if (UN_PADRE("MECCANISM*_UTENTE*") )  { EXITSUB() }

     // 14.12.2021
      if (VAR_EXIST(idx_att, "KeyFamRegFacc_prec") != 1)
         { KeyFamRegFacc_prec = "-" }

      // ACTION 3 per problema 08343
      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0  &  ACTION() != 3)
         {
          if (VAR_VAL(idx_att, "MdF_CerBat_Collision_Find") > 0  &  ACTION() == 2)
             { EXITSUB() }

          GOSUB MdF_CerBat_Collision
          EXITSUB()
         }

     // 10.05.2019 C1903203 Rip con CAM_TipoFori (MCB_collY_archetipo1_Var) che ancora non esiste
      if (IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "mdf_Load_save_prec") == 1)
         {
          if ( VAR_EXIST(idx_att, "MCB_collY_archetipo1_Var") == 1
             | VAR_EXIST(idx_att, "MCB_collY_archetipo2_Var") == 1
             | VAR_EXIST(idx_att, "MCB_collY_archetipo3_Var") == 1
             | VAR_EXIST(idx_att, "MCB_collY_archetipo4_Var") == 1
             | VAR_EXIST(idx_att, "MCB_collY_archetipo5_Var") == 1
             | VAR_EXIST(idx_att, "MCB_collY_archetipo6_Var") == 1
             | VAR_EXIST(idx_att, "MCB_collY_archetipo7_Var") == 1
             | VAR_EXIST(idx_att, "MCB_collY_archetipo8_Var") == 1
             )
             {
              if (VAR_VAL(idx_att, "MdF_CerBat_Collision_Find") > 0)
                 {
                  if ( ACTION() == 1
                     // cosi lo faccio una volta sola in piu
                     & VAR_VAL(idx_att, "mdf_CerBat_Collision_afterCaric") == 0
                     )
                     {
                      mdf_CerBat_Collision_afterCaric = 1
                      GOSUB MdF_CerBat_Collision
                     }
                 }
             }
         }

      // 10.05.2017
      if (VAR_VAL(idx_att, "mdf_collisionCer_Post") > 0)
         {
          mdf_collisionCer_Post = -1
          EXITSUB()
         }

      if ( ACTION() == 1 & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1
         // Se ACTION 1 puo capitare solo se MdF_ CerBat salvate nel rit con VAR_CHANGE sull' OnLoadedOrder
         & VAR_VAL(idx_att, "px_CerBat1") > 0
         )
         {
          // 16.07.2020 Catene Basi Ang Sn
          if (VAR_VAL(idx_att, "MdF_CerBat_Collision_Find") > 0)
             {
              if (VAR_VAL(idx_att, "mdf_CerBat_Collision_afterCaric") == 0)
                 {
                  mdf_CerBat_Collision_afterCaric = 2
                  mdf_CerBat_Collision_action = 1
                  GOSUB MdF_CerBat_Collision
                 }
             }
         // 14.12.2021
          //EXITSUB()
         }

     // 14.12.2021 altrimenti passava anche 4 volte
      if ( KeyFamRegFacc_prec == KeyFamRegFacc
        // 13.01.2022 P203728
         & VAR_VAL(idx_att, "px_CerBat1") > 0
         )
         {
          // PrC021601
          if (VAR_VAL(idx_att, "MdF_Ctrl_Cer_ChangeUte") == 0)
             {
             // 14.03.2025 altrimenti lo faceva 2 volte per ACTION() 1
              if (VAR_VAL(idx_att, "mdf_CerBat_Collision_action") <= 0)
                 {
                  mdf_CerBat_Collision_maked = 1
                  GOSUB MdF_CerBat_Collision
                  mdf_CerBat_Collision_action = -1
                 }
             }

         // 07.03.2022 Prima era senza controllo ACTION. Se qualcosa e' calcolato troppo tardi devo proseguire
          // a risettare anche RegFacc. Forse era per quello che non c' erano controlli
          // CMD() e' 1
          if (ACTION() != 3)  { EXITSUB() }
         }
   }

   PROCEDURA Reg_CerBat_att
   {
      KeyFamRegFacc_att = KeyFamRegFacc
      MdF_Aper_att = MdF_Apertura
      X_att = X
      Y_att = Y
      px_CerBat1_att = px_CerBat1
      py_CerBat1_att = py_CerBat1
      py_CerBat2_att = py_CerBat2
      py_CerBat3_att = py_CerBat3
      py_CerBat4_att = py_CerBat4
      py_CerBat5_att = py_CerBat5
      py_CerBat6_att = py_CerBat6
      py_CerBat7_att = py_CerBat7
      py_CerBat8_att = py_CerBat8
      Battuta_X_att = Battuta_X
   }

   PROCEDURA Reg_pos_CerSof
   {
      if (ACTION() > 0)
         {
          px_CerSof1 = 0
          py_CerSof1 = 0
          py_CerSof2 = 0
          py_CerSof3 = 0
          py_CerSof4 = 0
          py_CerSof5 = 0
          py_CerSof6 = 0
          py_CerSof7 = 0

          tLav = "CerSof"
          KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
          GOSUB MdF_read_RegFacc
         }
   }

   PROCEDURA Reg_CerSof_att
   {
      KeyFamRegFacc_att = KeyFamRegFacc
      MdF_Aper_att = MdF_Apertura
      X_att = X
      Y_att = Y
      px_CerSof1_att = px_CerSof1
      py_CerSof1_att = py_CerSof1
      py_CerSof2_att = py_CerSof2
      py_CerSof3_att = py_CerSof3
      py_CerSof4_att = py_CerSof4
      py_CerSof5_att = py_CerSof5
      py_CerSof6_att = py_CerSof6
      py_CerSof7_att = py_CerSof7
      Battuta_X_att = Battuta_X
   }

   PROCEDURA Reg_pos_CerAngLib
   {
      if (ACTION() > 0)
         {
          // Devo rientrare altrimenti se cambiano le condizioni specificate in tabella
          // non va a riprendersi i valori corretti
          px_CerAngLib1 = -999
          py_CerAngLib1 = -999
          pz_CerAngLib1 = -999
          px_CerAngLib2 = -999
          py_CerAngLib2 = -999
          pz_CerAngLib2 = -999
          px_CerAngLib3 = -999
          py_CerAngLib3 = -999
          pz_CerAngLib3 = -999
          px_CerAngLib4 = -999
          py_CerAngLib4 = -999
          pz_CerAngLib4 = -999

          tLav = "CerAngLib"
          KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
          GOSUB MdF_read_RegFacc
         }
   }

   PROCEDURA Reg_CerAngLib_att
   {
      KeyFamRegFacc_att = KeyFamRegFacc
      MdF_Aper_att = MdF_Apertura
      X_att = X
      Y_att = Y
      px_CerAngLib1_att = px_CerAngLib1
      px_CerAngLib2_att = px_CerAngLib2
      px_CerAngLib3_att = px_CerAngLib3
      px_CerAngLib4_att = px_CerAngLib4
      py_CerAngLib1_att = py_CerAngLib1
      py_CerAngLib2_att = py_CerAngLib2
      py_CerAngLib3_att = py_CerAngLib3
      py_CerAngLib4_att = py_CerAngLib4
      pz_CerAngLib1_att = pz_CerAngLib1
      pz_CerAngLib2_att = pz_CerAngLib2
      pz_CerAngLib3_att = pz_CerAngLib3
      pz_CerAngLib4_att = pz_CerAngLib4
   }

   PROCEDURA MdF_CerBat_Collision
   {
      MDFSys_Load_ini = $MDFSys_Load_ini
      if ( IS_MATCH(MDFSys_Load_ini, "OnMacro*") == 1
         | STRLEN(MDFSys_Load_ini) < 1
         )
         {
          if (STRLEN(VAR_VAL_STR(idx_att, "MdF_Cambiato")) < 1)
             {
              if ( STRCMP(VAR_VAL_STR(-1, "MdF_Load_att"), "OnLoadedOrder") == 0
                 | IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnLoadPers*") == 1
                 )
                 {
                  if (ACTION() == 2)  { EXITSUB() }
                 }
             }
         }

      //COMANDO2(STRCAT("LOGMSG MdF_CerBat_Collision per ACTION=", STR(ACTION()), " CMD=", STR(CMD()), " ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))

      id_collision = 1
      while ( VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(id_collision))) == 1
         )
         {
          if (VAR_VAL(idx_att, STRCAT("py_CerBat", STR(id_collision))) > 0)
             {
              GOSUB MdF_CerBat_Collision_Find
             }
          id_collision = id_collision+1
         }

     // 03.11.2017
      if (VAR_EXIST(idx_att, "mdf_collY_sposta_daCerVic") )
         {
          if (VAR_EXIST(idx_att, "mdf_ricalcola_daCerVic") != 1)
             {
              if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") == 0)
                 {
                  mdf_ricalcola_daCerVic = 1
                  COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x mdf_collY_sposta_daCerVic"))
                  DEL_VAR(idx_att, "mdf_collY_sposta_daCerVic")
                 }
             }
         }

     // 08.08.2022
      GOSUB mdf_Ctrl_BasSat_PostCollis

      //COMANDO2(STRCAT("LOGMSG MdF_CerBat_Collision FINE per ACTION=", STR(ACTION()), " CMD=", STR(CMD()), " ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
   }

   PROCEDURA MdF_CerBat_Collision_Find
   {
      mdf_collY_att = -1
      if (VAR_EXIST(idx_att, "mdf_collY_att_prec") != 1)  { mdf_collY_att_prec = -1 }

      mdf_collY_trovataCol = 0
      idx_troCollisB = -1.11

     // 28.07.2022 per ante con VAR_APRICHIUDI_ANTE=1
      if (VAR_VAL(PADRE(idx_att, 1), "MdF_NO_Ctrl_collisionCB") == 1)  { EXITSUB() }

      //mdF_collY_archetipo1 = "Fon*"
      //mdF_collY_archetipo2 = "Cop*"
      //mdF_collY_archetipo3 = "Rip*"
      mdF_collY_archetipo1 = ""
      mdF_collY_archetipo2 = ""
      mdF_collY_archetipo3 = ""
      mdF_collY_archetipo4 = ""
      mdF_collY_archetipo5 = ""
      mdF_collY_archetipo6 = ""
      mdF_collY_archetipo7 = ""
      mdF_collY_archetipo8 = ""
      mdF_collY_archetipo9 = ""
      if ( VAR_EXIST(idx_att, "MCB_collY_dist_ctrl")
         | VAR_EXIST(idx_att, "MCB_collY_dist_minima")
         )
         {
          mdF_collY_archetipo1 = "Fon*"
          mdF_collY_archetipo2 = "Cop*"
          mdF_collY_archetipo3 = "Rip*"
         }

      // Gestione corretta da VariabiliMdF
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo1") )  { mdF_collY_archetipo1 = VAR_VAL_STR(idx_att, "MCB_collY_archetipo1") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo2") )  { mdF_collY_archetipo2 = VAR_VAL_STR(idx_att, "MCB_collY_archetipo2") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo3") )  { mdF_collY_archetipo3 = VAR_VAL_STR(idx_att, "MCB_collY_archetipo3") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo4") )  { mdF_collY_archetipo4 = VAR_VAL_STR(idx_att, "MCB_collY_archetipo4") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo5") )  { mdF_collY_archetipo5 = VAR_VAL_STR(idx_att, "MCB_collY_archetipo5") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo6") )  { mdF_collY_archetipo6 = VAR_VAL_STR(idx_att, "MCB_collY_archetipo6") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo7") )  { mdF_collY_archetipo7 = VAR_VAL_STR(idx_att, "MCB_collY_archetipo7") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo8") )  { mdF_collY_archetipo8 = VAR_VAL_STR(idx_att, "MCB_collY_archetipo8") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo9") )  { mdF_collY_archetipo9 = VAR_VAL_STR(idx_att, "MCB_collY_archetipo9") }

      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision)), 0, 0, "")
      //VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), 0, 0, "")

      if (VAR_EXIST(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision))) )
         {
          if (VAR_EXIST(idx_att, STRCAT("MdfSys_collis_idx_Bas", STR(id_collision))) == 1)
             {
             // 27.07.2022
              mdf_collis_idx_Bas = VAR_VAL(idx_att, STRCAT("MdfSys_collis_idx_Bas", STR(id_collision)))
              if (IS_IDX(mdf_collis_idx_Bas) )
                 {
                  mdf_collY_sposta_Bas = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))
                 // 07.10.2022 Sc1022111999
                  VAR_CREATE_NUM(idx_att, STRCAT("mdf_collY_sposta_Bas", STR(id_collision)), mdf_collY_sposta_Bas, 0, "")
                  mdf_collY_arch_Bas = VAR_VAL_STR(idx_att, STRCAT("MdfSys_collis_arch_Bas", STR(id_collision)))
                  BOX_MODE(0)
                  dist_ToCollisionRip = 25.1
                  // 27.11.2023 Sc114677 mancava ABS !! in piu corretto sotto mdf_collis_idx_Bas, cioe MdfSys_collis_idx_BasSTR(id_collision)
                  NEAR_GLOBALE("mdfBasettaVic", mdf_collis_idx_Bas, dist_ToCollisionRip+25.1+ABS(mdf_collY_sposta_Bas), 1, mdf_collY_arch_Bas)
                  if (mdfBasettaVic == 0)
                     {
                      mdactioncollBas = ACTION()
                      DEL_VAR(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))
                     }
                 }
              else { DEL_VAR(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision))) }
             }
          else
             {
              mdf_del_varSposta_id = id_collision
              DEL_VAR(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))
             }
         }

      mdf_arch_n = 0
      GOSUB MdF_collY_dist_ctrl

     // 16.06.2023 Sc1023042226 Servirebbe il trace perchè queste righe non possono andare in errore, ci sono praticamente da sempre
      if (IS_IDX(idx_RegF) != 1)
         {
          COMANDO2(STRCAT("LOGMSG MdF_CerBat_Collision_Find idx_RegF Not Valid. Se scrivo questa riga probabile ci sia un problema di flusso. ACTION=", STR(ACTION()), " CMD=", STR(CMD()), " File=", VAR_VAL_STR(-1, "File")))
          EXITSUB()
         }
      //yCer = VAR_VAL(idx_RegF, STRCAT("Y_CerBat", STR(id_collision)))
      //zCer = VAR_VAL(idx_RegF, STRCAT("Z_CerBat", STR(id_collision)))
      yCer = VAR_VAL(idx_att, STRCAT("Y_CerBat", STR(id_collision)))
      zCer = VAR_VAL(idx_att, STRCAT("Z_CerBat", STR(id_collision)))

      dist_minZ = zCer
      if (dist_minZ > 80)                   { dist_minZ = 80 }
      if (dist_minZ > 36 & dist_minZ < 64)  { dist_minZ = zCer+16 }
      if (dist_minZ < 10)                   { dist_minZ = 37 }
      //dist_Coll = ABS(ABS(mdf_collY_dist_ctrl)-yCer/2)+dist_minZ
      dist_Coll = dist_minZ

      // Vedi anche PCL 01172 che con 25+18+1.5 non trova piu la collisione
      // un tecnico del mestiere dice tra Fianco e Lavello affinche' ci stia la basetta devono esserci 25mm,
      // ma meglio tenere 35 cosi da non controllare il tipo cerniera o errori ingombroLavello
      // Quindi al momento lascio invariato che e' cosi da sempre
      mcb_dist_min_X = 30+18-1.5
      if (VAR_EXIST(idx_att, "MCB_dist_min_X") )  { mcb_dist_min_X = VAR_VAL(idx_att, "MCB_dist_min_X") }

      BOX_MODE(0)
      if (STRLEN(mdF_collY_archetipo1) > 1)
         {
          mdf_arch_n=1
          NEAR_GLOBALE("mdf_collY", idx_att, dist_Coll, 1, mdF_collY_archetipo1)
          GOSUB MdF_while_Collision
         }

     // 06.05.2022 Sc1022042290
      GOSUB mdf_spostamentiCer_att
      if (STRLEN(mdF_collY_archetipo2) > 1)
         {
          // reimposto mdf_collY_dist_ctrl nel caso ci fosse MCB_collY_dist_min_arch1, MCB_collY_dist_minCn_arch1
          // e non c'e' MCB_collY_dist_min_arch2 o MCB_collY_dist_minCn_arch2
          mdf_arch_n=2
          GOSUB MdF_collY_dist_ctrl
          NEAR_GLOBALE("mdf_collY", idx_att, dist_Coll, 1, mdF_collY_archetipo2)
          GOSUB MdF_while_Collision
         // 06.05.2022 Sc1022042290
          // Prima fa il controllo per il Fondo del pensile sopra, poi per il suo Coperchio ma lo sposta per il Coperchio e' 32, mentre per il Fondo la dist e' 34.4
          // quindi con lo spostamento di 32 non basta per uscire anche dalla collisione del Fondo sopra
          GOSUB mdf_Ctrl_spostaCer_archPrec
         }
      if (STRLEN(mdF_collY_archetipo3) > 1)
         {
          // reimposto mdf_collY_dist_ctrl nel caso ci fosse MCB_collY_dist_min_arch2, MCB_collY_dist_minCn_arch2
          mdf_arch_n=3
          GOSUB MdF_collY_dist_ctrl
          // 14.10.2020
          if (VAR_EXIST(idx_att, "MCB_dist_NEAR_Collision3") )  { dist_Coll = VAR_VAL(idx_att, "MCB_dist_NEAR_Collision3") }
          NEAR_GLOBALE("mdf_collY", idx_att, dist_Coll, 1, mdF_collY_archetipo3)
          GOSUB MdF_while_Collision
         }

      if (STRLEN(mdF_collY_archetipo4) > 1)
         {
          // 04.08.2020 reimposto mdf_collY_dist_ctrl nel caso ci fosse MCB_collY_dist_min_arch3, MCB_collY_dist_minCn_arch3
          mdf_arch_n=4
          GOSUB MdF_collY_dist_ctrl
          if (VAR_EXIST(idx_att, "MCB_dist_NEAR_Collision4") )  { dist_Coll = VAR_VAL(idx_att, "MCB_dist_NEAR_Collision4") }
          NEAR_GLOBALE("mdf_collY", idx_att, dist_Coll, 1, mdF_collY_archetipo4)
          GOSUB MdF_while_Collision
         }
      if (STRLEN(mdF_collY_archetipo5) > 1)
         {
          // reimposto mdf_collY_dist_ctrl nel caso ci fosse MCB_collY_dist_min_arch4, MCB_collY_dist_minCn_arch4
          mdf_arch_n=5
          GOSUB MdF_collY_dist_ctrl
          if (VAR_EXIST(idx_att, "MCB_dist_NEAR_Collision5") )  { dist_Coll = VAR_VAL(idx_att, "MCB_dist_NEAR_Collision5") }
          NEAR_GLOBALE("mdf_collY", idx_att, dist_Coll, 1, mdF_collY_archetipo5)
          GOSUB MdF_while_Collision
         }

      if (STRLEN(mdF_collY_archetipo6) > 1)
         {
          mdf_arch_n=6
          GOSUB MdF_collY_dist_ctrl
          if (VAR_EXIST(idx_att, "MCB_dist_NEAR_Collision6") )  { dist_Coll = VAR_VAL(idx_att, "MCB_dist_NEAR_Collision6") }
         // 16.03.2023
          if (VAR_VAL(idx_att, "MCB_NO_collY_arch6") != 1)
             { NEAR_GLOBALE("mdf_collY", idx_att, dist_Coll, 1, mdF_collY_archetipo6) }
          GOSUB MdF_while_Collision
         }

      // 19.09.2019
      if (STRLEN(mdF_collY_archetipo7) > 1)
         {
          // reimposto mdf_collY_dist_ctrl nel caso ci fosse MCB_collY_dist_min_arch6, MCB_collY_dist_minCn_arch6
          mdf_arch_n=7
          GOSUB MdF_collY_dist_ctrl
          if (VAR_EXIST(idx_att, "MCB_dist_NEAR_Collision7") )  { dist_Coll = VAR_VAL(idx_att, "MCB_dist_NEAR_Collision7") }
          NEAR_GLOBALE("mdf_collY", idx_att, dist_Coll, 1, mdF_collY_archetipo7)
          GOSUB MdF_while_Collision
          // 26.07.2022
          if (VAR_VAL(PADRE(idx_att, 1), "MdF_Ctrl_Collision_Bas") > 0)
             {
              mdF_collY_archetipoBas = mdF_collY_archetipo7
              GOSUB MdF_while_CollisionBas
              if (IS_IDX(idx_troCollisB) )
                 {
                  mdf_ele_intern = idx_troCollisB+0.1
                  idx_troCol = idx_troCollisB
                  mdf_collY = 1
                  mdf_collY_##1 = idx_troCollisB
                  GOSUB MdF_while_Collision
                  idx_troCollisB = -7.11
                 }
             }
         }

      // 04.10.2019
      if (STRLEN(mdF_collY_archetipo8) > 1)
         {
          // reimposto mdf_collY_dist_ctrl nel caso ci fosse MCB_collY_dist_min_arch7, MCB_collY_dist_minCn_arch7
          mdf_arch_n=8
          GOSUB MdF_collY_dist_ctrl
          if (VAR_EXIST(idx_att, "MCB_dist_NEAR_Collision8") )  { dist_Coll = VAR_VAL(idx_att, "MCB_dist_NEAR_Collision8") }
          NEAR_GLOBALE("mdf_collY", idx_att, dist_Coll, 1, mdF_collY_archetipo8)
          GOSUB MdF_while_Collision
         }

      if (STRLEN(mdF_collY_archetipo9) > 1)
         {
          // reimposto mdf_collY_dist_ctrl nel caso ci fosse MCB_collY_dist_min_arch7, MCB_collY_dist_minCn_arch7
          mdf_arch_n=9
          GOSUB MdF_collY_dist_ctrl
          if (VAR_EXIST(idx_att, "MCB_dist_NEAR_Collision9") )  { dist_Coll = VAR_VAL(idx_att, "MCB_dist_NEAR_Collision9") }
          NEAR_GLOBALE("mdf_collY", idx_att, dist_Coll, 1, mdF_collY_archetipo9)
          GOSUB MdF_while_Collision
         }

     // 03.11.2017
     // 01.06.2020 altrimenti da OnMacro a volte serve un Ricalcolo. In effetti se la cerniera 5 fa lo spostamento
      // della cerniera1 se diverso da Macro probabilmente un Ricalcolo avveniva comunque e ha sempre funzionato
      // 04.06.2020 Deve rimanere anche questo perché se è la 1 a spostare la 5 il DEL_VAR iniziale cancella la MdfSys_collY_sposta
      // ed essendoci qui il DEL_VAR della MdfSys_collY_sposta_daCerVic poi non la crea piu
      if (VAR_EXIST(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(id_collision))) )
         {
          mdf_collY_sposta_daCerVic = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(id_collision)))
          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta_daCerVic, 0, "")
          DEL_VAR(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(id_collision)))
         }
      id_collisionVic = 1
      while ( VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(id_collisionVic))) == 1
         )
         {
          if ( VAR_EXIST(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(id_collisionVic)))
             // 04.06.2020
             & id_collisionVic < id_collision
             )
             {
              mdf_collY_sposta_daCerVic = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(id_collisionVic)))
              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collisionVic)), mdf_collY_sposta_daCerVic, 0, "")
              DEL_VAR(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(id_collisionVic)))
             }

          id_collisionVic = id_collisionVic+1
         }

      // 18.12.2020
      if ( mdf_collY_att != mdf_collY_att_prec
         | mdf_collY_att > 0
         )
         {
          mdf_collY_att_prec = mdf_collY_att
          GOSUB mdf_ctrl_posy_sat_Basette
         }

      MdF_CerBat_Collision_Find = 1
      MdF_CerBat_Collision_Act = ACTION()
   }

   PROCEDURA MdF_collY_dist_ctrl
   {
      mdf_collY_dist_ctrl = 32
      if (VAR_EXIST(idx_att, "MCB_collY_dist_ctrl") )  { mdf_collY_dist_ctrl = VAR_VAL(idx_att, "MCB_collY_dist_ctrl") }
     // 14.10.2020
      if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_ctrl_arch", STR(mdf_arch_n))) )  { mdf_collY_dist_ctrl = VAR_VAL(idx_att, STRCAT("MCB_collY_dist_ctrl_arch", STR(mdf_arch_n))) }
     // 11.10.2022
      if (VAR_EXIST(PADRE(idx_att, 1), "MCB_collY_dist_Rip6T"))  { mdf_collY_dist_ctrl = VAR_VAL(PADRE(idx_att, 1), "MCB_collY_dist_Rip6T") }
     // 04.05.2023
      mdf_collY_offy_INF = 0
      if (VAR_EXIST(idx_att, STRCAT("MCB_collY_offy_INF_arch", STR(mdf_arch_n))) )  { mdf_collY_offy_INF = VAR_VAL(idx_att, STRCAT("MCB_collY_offy_INF_arch", STR(mdf_arch_n))) }

     // 22.11.2023 Ce003442 Se esiste perchè prima trova una collisione con un elemento che ha MCB_collY_dist_min_arch poi potrebbe influire sulle gestioni delle altre cerniere
      // Strano non sia mai uscito prima
      if (VAR_EXIST(idx_att, "mdf_collY_dist_minima") )  { DEL_VAR(idx_att, "mdf_collY_dist_minima") }

      mdf_gestione_collY_dist_SE_CerVic = 0
      mdf_collY_dist_prec_SE_CerVic = mdf_collY_dist_ctrl

     // 03.11.2017
      // Gestione collisione tra cerniere vicine
      mdf_collY_CerVic = 0
     // 24.03.2025 Dato che funziona da anni inizio una gestione di default piuttosto che agire sempre su VariabiliMdF
      // In ogni caso farebbe il controllo delle cerniere in coppia, quindi dovrebbe comunque sempre farlo
      // Se 70 non va bene come default va impostato su VariabiliMdF ma in realtà va bene che ci sia un default piuttosto che le 2 cerniere si sovrappongano
      mdf_collY_CerVic_Std = 0
      // 11.04.2025 A006049
      //if (Y > 1247  &  X > 590)      { mdf_collY_CerVic_Std = 1 }
      if (Y > 715  &  X > 445)
         {
          if (VAR_VAL(idx_att, "py_CerBat3") > 130)  { mdf_collY_CerVic_Std = 1 }

         // 23.04.2025 St945832 La cer3 è usata per quella in basso a 110
          // 340 perchè se cer in alto a 192 se la seconda dall' alto fosse a 148 e ci fosse uno spostamento verso il basso potrebbe esserci una collisione tra cer
          // 194 perchè fin' ora la cer in alto non è mai meno di 192 dall' alto
          // Poi comunque resta sempre la possibilità di configurare MCB_collY_CerVic
          if (VAR_VAL(idx_att, "py_CerBat1") + 340 > Y  &  VAR_VAL(idx_att, "py_CerBat1") + 194 < Y)  { mdf_collY_CerVic_Std = 1.1 }
          if (VAR_VAL(idx_att, "py_CerBat2") + 340 > Y  &  VAR_VAL(idx_att, "py_CerBat2") + 194 < Y)  { mdf_collY_CerVic_Std = 2 }
          if (VAR_VAL(idx_att, "py_CerBat3") + 340 > Y  &  VAR_VAL(idx_att, "py_CerBat3") + 194 < Y)  { mdf_collY_CerVic_Std = 3 }
          if (VAR_VAL(idx_att, "py_CerBat4") + 340 > Y  &  VAR_VAL(idx_att, "py_CerBat4") + 194 < Y)  { mdf_collY_CerVic_Std = 4 }
          if (VAR_VAL(idx_att, "py_CerBat5") + 340 > Y  &  VAR_VAL(idx_att, "py_CerBat5") + 194 < Y)  { mdf_collY_CerVic_Std = 5 }
          if (VAR_VAL(idx_att, "py_CerBat6") + 340 > Y  &  VAR_VAL(idx_att, "py_CerBat6") + 194 < Y)  { mdf_collY_CerVic_Std = 6 }
          if (VAR_VAL(idx_att, "py_CerBat7") + 340 > Y  &  VAR_VAL(idx_att, "py_CerBat7") + 194 < Y)  { mdf_collY_CerVic_Std = 7 }
          if (VAR_VAL(idx_att, "py_CerBat8") + 340 > Y  &  VAR_VAL(idx_att, "py_CerBat8") + 194 < Y)  { mdf_collY_CerVic_Std = 8 }
         }

      if (mdf_collY_CerVic_Std > 0)  { mdf_collY_CerVic = 70 }

      if (VAR_EXIST(idx_att, "MCB_collY_CerVic") )  { mdf_collY_CerVic = VAR_VAL(idx_att, "MCB_collY_CerVic") }
      if (mdf_collY_CerVic > 0)
         {
          mdf_quota_CerVic = 0
         // 24.03.2025 Dato che funziona da anni inizio una gestione di default piuttosto che agire sempre su VariabiliMdF
         // 11.04.2025 A006049
          //if (mdf_collY_CerVic_Std > 0)   { mdf_quota_CerVic = Y-180 }
         // 24.04.2025 St62112 Devo considerare di prendere anche la seconda cerniera in accoppiata
          //if (mdf_collY_CerVic_Std > 0)   { mdf_quota_CerVic = Y-195 }
          if (mdf_collY_CerVic_Std > 0)   { mdf_quota_CerVic = Y-225 }

          if (VAR_EXIST(idx_att, "MCB_quota_CerVicSup") )  { mdf_quota_CerVic = VAR_VAL(idx_att, "MCB_quota_CerVicSup") }
          if (VAR_VAL(idx_att, STRCAT("py_CerBat", STR(id_collision))) >= mdf_quota_CerVic)
             {
             // 17.01.2019
              mdf_id_pyCer = 1
              while (VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(mdf_id_pyCer))) == 1)
                 {
                  if (mdf_id_pyCer != id_collision)
                     {
                      // 23.09.2019 Cer Inf a 138.5 solo 2 Cer
                      if (VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mdf_id_pyCer))) > 0)
                         {
                          mdf_py_Cer_altre = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mdf_id_pyCer)))
                          mdf_py_CerBat_init = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(id_collision)))

                          mdf_collY_diff_py_Cer = ABS(mdf_py_CerBat_init - mdf_py_Cer_altre)

                         // 11.03.2021  S1020006599
                          // Se mdf_collY_CerVic e' maggiore di mdf_collY_dist_ctrl impostata precedentemente
                          // rischio che mi trovi una collisione che non dovrebbe trovare
                          // mdf_collY_CerVic e' diventato 70 da poco, prima era 50, pertanto trova un Fondo vicino di 62 mm, quando
                          // MCB_collY_dist_ctrl valeva 42
                         // 24.03.2021  A162351
                          // Prima valeva solo se la cerniera presa in esame id_collision aveva cerniere vicine, ma per la casistica
                          // sopra non andava comunque bene
                          // Pertanto devo aggiungere una variabile per il cliente che vuole gestire uno stesso archetipo in modo diverso
                          // nel caso ci siano 2 cerniere vicine o nel caso la cerniera sia distante dalle altre
                          // Se invece sono archetipi diversi, esempio RipianoFisso sopra e RipianoSottoFrigo in basso
                          // aggiungere
                          // MCB_ collY_archetipo6         "RipianoSottoFrigo"
                          // MCB_ collY_dist_minCn_arch6   40  o  MCB_collY_dist_min_arch6 se la gestione non e' tra i centri
                          if (mdf_collY_diff_py_Cer < 140)
                             {
                              //mdf_collY_dist_ctrl = mdf_collY_CerVic
                              if (VAR_EXIST(idx_att, "MCB_collY_dist_SE_CerVic") )
                                 {
                                  // 08.08.2022
                                  mdf_no_Se_CerVic = 0
                                  if (mdf_arch_n <= 2)
                                     {
                                      if (VAR_EXIST(PADRE(idx_att, 1), "mcb_arch1_CollisCBTent") )
                                         { mdf_no_Se_CerVic = 1 }
                                     }
                                  // 11.10.2022
                                  if ( IS_MATCH(VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n))), VAR_VAL_STR(PADRE(idx_att, 1), "mcb_arch1_CollisCBTent"))
                                     | IS_MATCH(VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n))), VAR_VAL_STR(PADRE(idx_att, 1), "mcb_arch2_CollisCBTent"))
                                    // 19.07.2023
                                     | IS_MATCH(VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n))), VAR_VAL_STR(PADRE(idx_att, 1), "mcb_arch3_CollisCBTent"))
                                    // 21.02.2025 PCL000039
                                     | IS_MATCH(VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n))), VAR_VAL_STR(PADRE(idx_att, 1), "mcb_arch4_CollisCBTent"))
                                    // 26.10.2023 A157668 Occhio a MCB_Ute_spostaCer
                                     | IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "mcb_arch2_CollisCBTent"), VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n))) )
                                     )
                                     {
                                      if (VAR_EXIST(PADRE(idx_att, 1), "MCB_collY_dist_Rip6T") )
                                         { mdf_no_Se_CerVic = 2 }
                                     }
                                  if (mdf_no_Se_CerVic == 0)
                                     {
                                      mdf_gestione_collY_dist_SE_CerVic = 1
                                      mdf_collY_dist_ctrl = VAR_VAL(idx_att, "MCB_collY_dist_SE_CerVic")
                                     }
                                 }
                             }
                         }
                     }
                  mdf_id_pyCer = mdf_id_pyCer+1
                 }
             }
         }

      mdf_collY_dist_ctrl_Sec = -1
      if (VAR_EXIST(idx_att, "MCB_collY_dist_ctrl_Sec") )  { mdf_collY_dist_ctrl_Sec = VAR_VAL(idx_att, "MCB_collY_dist_ctrl_Sec") }
   }

   PROCEDURA MdF_while_Collision
   {
      // py_CerBat è già il centro Cer
      basy_CerCn = base_0.y + VAR_VAL(idx_att, STRCAT("py_CerBat", STR(id_collision)))
      iCol=1
      mdf_limite_pyCer_InfSup = 67/2 + 18 + 0.5
      if (VAR_EXIST(idx_att, "MCB_Limite_pyCer_InfSup") )  { mdf_limite_pyCer_InfSup = VAR_VAL_STR(idx_att, "MCB_Limite_pyCer_InfSup") }

      while(iCol <= mdf_collY)
         {
          mdf_collY_trovataCol = 0
          idx_troCol = mdf_collY[iCol]

          SET_#(mdf_collY[iCol])

          X_ele_collY = VAR_VAL(mdf_collY[iCol], "X")
          Z_ele_collY = VAR_VAL(mdf_collY[iCol], "Z")
          Ba0_att = [base_0.x, 0, base_0.z]
          Ba3_att = [base_3.x, 0, base_3.z]

          Ba1_ele = [#base_1.x, 0, #base_1.z]
          Ba2_ele = [#base_2.x, 0, #base_2.z]

          dist_02_ele = DISTANZA(Ba0_att, Ba2_ele)
          dist_31_ele = DISTANZA(Ba3_att, Ba1_ele)

          mdf_ele_intern = 1
          mdf_ele_collY_Only_Msg = 0
         // 04.09.2023
          GOSUB MdF_ele_intern_Collision
          if (VAR_VAL(idx_att, "mdf_ele_internC") != -99)  { mdf_ele_intern = VAR_VAL(idx_att, "mdf_ele_internC") }

         // 26.07.2022
          if (IS_IDX(idx_troCollisB) )
             { mdf_ele_intern = idx_troCollisB+0.1 }

          if (mdf_ele_intern > 0)
             {
              if (IS_MATCH(VAR_VAL_STR(mdf_collY[iCol], "MdF_CollisionCer"), "No") == 1)
                 { mdf_ele_intern = -10 }

              WITH_VAR_LOCAL(mdf_collY[iCol], "mdf_NoCollisionCer", "MdF_CollisionCer", 1+2, 1, "No")
              if (mdf_NoCollisionCer > 0)  { mdf_ele_intern = -11 }

              mdF_collY_archetipo1_No = ""
              mdF_collY_archetipo2_No = ""
              mdF_collY_archetipo3_No = ""
              mdF_collY_archetipo4_No = ""
              mdF_collY_archetipo5_No = ""
              mdF_collY_archetipo6_No = ""
              mdF_collY_archetipo7_No = ""
              mdF_collY_archetipi_No = ""
              if (VAR_EXIST(idx_att, "MCB_collY_archetipo1_No") )  { mdF_collY_archetipo1_No = VAR_VAL_STR(idx_att, "MCB_collY_archetipo1_No") }
              if (VAR_EXIST(idx_att, "MCB_collY_archetipo2_No") )  { mdF_collY_archetipo2_No = VAR_VAL_STR(idx_att, "MCB_collY_archetipo2_No") }
              if (VAR_EXIST(idx_att, "MCB_collY_archetipo3_No") )  { mdF_collY_archetipo3_No = VAR_VAL_STR(idx_att, "MCB_collY_archetipo3_No") }
              if (VAR_EXIST(idx_att, "MCB_collY_archetipo4_No") )  { mdF_collY_archetipo4_No = VAR_VAL_STR(idx_att, "MCB_collY_archetipo4_No") }
              // 13.04.2021 aggiunti 5,6,7
              if (VAR_EXIST(idx_att, "MCB_collY_archetipo5_No") )  { mdF_collY_archetipo5_No = VAR_VAL_STR(idx_att, "MCB_collY_archetipo5_No") }
              if (VAR_EXIST(idx_att, "MCB_collY_archetipo6_No") )  { mdF_collY_archetipo6_No = VAR_VAL_STR(idx_att, "MCB_collY_archetipo6_No") }
              if (VAR_EXIST(idx_att, "MCB_collY_archetipo7_No") )  { mdF_collY_archetipo7_No = VAR_VAL_STR(idx_att, "MCB_collY_archetipo7_No") }
              if (VAR_EXIST(idx_att, "MCB_collY_archetipi_No") )   { mdF_collY_archetipi_No  = VAR_VAL_STR(idx_att, "MCB_collY_archetipi_No") }
              if (VAR_EXIST(PADRE(idx_att, 1), "MCB_collY_archetipo1_No") )  { mdF_collY_archetipo1_No = VAR_VAL_STR(PADRE(idx_att, 1), "MCB_collY_archetipo1_No") }
              if (VAR_EXIST(PADRE(idx_att, 1), "MCB_collY_archetipo2_No") )  { mdF_collY_archetipo2_No = VAR_VAL_STR(PADRE(idx_att, 1), "MCB_collY_archetipo2_No") }
              if (VAR_EXIST(PADRE(idx_att, 1), "MCB_collY_archetipo3_No") )  { mdF_collY_archetipo3_No = VAR_VAL_STR(PADRE(idx_att, 1), "MCB_collY_archetipo3_No") }
              if (VAR_EXIST(PADRE(idx_att, 1), "MCB_collY_archetipo4_No") )  { mdF_collY_archetipo4_No = VAR_VAL_STR(PADRE(idx_att, 1), "MCB_collY_archetipo4_No") }
              if (VAR_EXIST(PADRE(idx_att, 1), "MCB_collY_archetipo5_No") )  { mdF_collY_archetipo5_No = VAR_VAL_STR(PADRE(idx_att, 1), "MCB_collY_archetipo5_No") }
              if (VAR_EXIST(PADRE(idx_att, 1), "MCB_collY_archetipo6_No") )  { mdF_collY_archetipo6_No = VAR_VAL_STR(PADRE(idx_att, 1), "MCB_collY_archetipo6_No") }
              if (VAR_EXIST(PADRE(idx_att, 1), "MCB_collY_archetipo7_No") )  { mdF_collY_archetipo7_No = VAR_VAL_STR(PADRE(idx_att, 1), "MCB_collY_archetipo7_No") }
              if (VAR_EXIST(PADRE(idx_att, 1), "MCB_collY_archetipi_No") )   { mdF_collY_archetipi_No  = VAR_VAL_STR(PADRE(idx_att, 1), "MCB_collY_archetipi_No") }

              if (IS_MATCH(NOME(mdf_collY[iCol]), mdF_collY_archetipo1_No) )  { mdf_ele_intern = -12 }
              if (IS_MATCH(NOME(mdf_collY[iCol]), mdF_collY_archetipo2_No) )  { mdf_ele_intern = -13 }
              if (IS_MATCH(NOME(mdf_collY[iCol]), mdF_collY_archetipo3_No) )  { mdf_ele_intern = -14 }
              if (IS_MATCH(NOME(mdf_collY[iCol]), mdF_collY_archetipo4_No) )  { mdf_ele_intern = -15 }
              if (IS_MATCH(NOME(mdf_collY[iCol]), mdF_collY_archetipo5_No) )  { mdf_ele_intern = -16 }
              if (IS_MATCH(NOME(mdf_collY[iCol]), mdF_collY_archetipo6_No) )  { mdf_ele_intern = -17 }
              if (IS_MATCH(NOME(mdf_collY[iCol]), mdF_collY_archetipo7_No) )  { mdf_ele_intern = -18 }
             // 26.02.2024
              if (MdF_IS_MATCH_LIST(NOME(mdf_collY[iCol]), mdF_collY_archetipi_No) >= 1)  { mdf_ele_intern = -19 }

             // 11.06.2018
              GOSUB MCB_collY_archetipoN_Var

              mdF_collY_archetipoMsg1 = ""
              mdF_collY_archetipoMsg2 = ""
              mdF_collY_archetipoMsg3 = ""
              mdF_collY_archetipoMsg4 = ""
              mdF_collY_archetipoMsg5 = ""
              if (VAR_EXIST(idx_att, "MCB_collY_archetipoMsg1") )  { mdF_collY_archetipoMsg1 = VAR_VAL_STR(idx_att, "MCB_collY_archetipoMsg1") }
              if (VAR_EXIST(idx_att, "MCB_collY_archetipoMsg2") )  { mdF_collY_archetipoMsg2 = VAR_VAL_STR(idx_att, "MCB_collY_archetipoMsg2") }
              if (VAR_EXIST(idx_att, "MCB_collY_archetipoMsg3") )  { mdF_collY_archetipoMsg3 = VAR_VAL_STR(idx_att, "MCB_collY_archetipoMsg3") }
              if (VAR_EXIST(idx_att, "MCB_collY_archetipoMsg4") )  { mdF_collY_archetipoMsg4 = VAR_VAL_STR(idx_att, "MCB_collY_archetipoMsg4") }
              if (VAR_EXIST(idx_att, "MCB_collY_archetipoMsg5") )  { mdF_collY_archetipoMsg5 = VAR_VAL_STR(idx_att, "MCB_collY_archetipoMsg5") }

              if (IS_MATCH(NOME(mdf_collY[iCol]), mdF_collY_archetipoMsg1) )  { mdf_ele_collY_Only_Msg = 1 }
              if (IS_MATCH(NOME(mdf_collY[iCol]), mdF_collY_archetipoMsg2) )  { mdf_ele_collY_Only_Msg = 2 }
              if (IS_MATCH(NOME(mdf_collY[iCol]), mdF_collY_archetipoMsg3) )  { mdf_ele_collY_Only_Msg = 3 }
              if (IS_MATCH(NOME(mdf_collY[iCol]), mdF_collY_archetipoMsg4) )  { mdf_ele_collY_Only_Msg = 4 }
              if (IS_MATCH(NOME(mdf_collY[iCol]), mdF_collY_archetipoMsg5) )  { mdf_ele_collY_Only_Msg = 5 }

             // 08.04.2021
              if (VAR_EXIST(idx_att, "MCB_collY_MsgCerSup") )
                 {
                  mcb_collY_MsgCerSup = VAR_VAL(idx_att, "MCB_collY_MsgCerSup")
                  if (mcb_collY_MsgCerSup > 0)
                     {
                      if (basy_CerCn + mcb_collY_MsgCerSup >= alto_0.y - VAR_VAL(idx_att, "MdfSys_SbordoYSup"))
                         { mdf_ele_collY_Only_Msg = 0.1+mcb_collY_MsgCerSup }
                     }
                 }

             // 08.04.2021
              if (VAR_EXIST(idx_att, "MCB_collY_MsgCerInf") )
                 {
                  mcb_collY_MsgCerInf = VAR_VAL(idx_att, "MCB_collY_MsgCerInf")
                  if (mcb_collY_MsgCerInf > 0)
                     {
                      if (basy_CerCn - mcb_collY_MsgCerInf <= base_0.y + VAR_VAL(idx_att, "MdfSys_SbordoYInf"))
                         { mdf_ele_collY_Only_Msg = 0.2+mcb_collY_MsgCerInf }
                     }
                 }
             }
         // 19.07.2021 S1051439
          if (mdf_ele_intern > 0)
             {
              // C_collide usato in "troppi" elementi tra cui cassetti/cestoni e su un' intera Spalla
              mdf_Y_Ele_CollY = VAR_VAL(idx_troCol, "Y") - mdf_collY_offy_INF
              if (mdf_Y_Ele_CollY >= Y-Y/20)  { mdf_ele_intern = -99 }
             }

          if (mdf_ele_intern > 0)
             {
              // 04.08.2020 bachissimo. Se ho MCB_collY_archetipo1 = *Fondo* e ho anche MCB_collY_dist_min_arch4
              // perche' poi devo fare MCB_collY_archetipo1 = FondoFrigo
              // se sto cercando *Fondo* mi trova anche FondoFrigo pertanto il while mdf_arch_n < 10 trova anche
              // MCB_collY_dist_min_arch4, per cui sfalsa la mdf_collY_dist_ctrl dei Fondi, in piu se ci fosse MCB_collY_dist_min_arch1
              // sfalserebbe anche quella degli archetipi successivi, mdF_collY_archetipo2 e mdF_collY_archetipo3.. n
              // Se usciva 5 anni fa, quando e' nata questa gestione (30.03.2015) era meglio
              //mdf_arch_n=1
              mdf_Y_Ele_CollY = VAR_VAL(idx_troCol, "Y") - mdf_collY_offy_INF
              mdf_ctrl_dist_arch = 0
              mdf_ctrl_dist_arch_min = 0
              mdf_ctrl_dist_add_mezzoEle = 0
              if (IS_MATCH(NOME(idx_troCol), VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n)))) == 1)
                 {
                  if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_minCn_arch", STR(mdf_arch_n))) )
                     {
                      mdf_collY_dist_ctrl = ABS(VAR_VAL(idx_att, STRCAT("MCB_collY_dist_minCn_arch", STR(mdf_arch_n))))
                      mdf_ctrl_dist_arch_min = 1
                     }

                 // 14.06.2018
                  if (mdf_ele_intern_VarVAL_dist_arch != 0)  { mdf_collY_dist_ctrl = ABS(mdf_ele_intern_VarVAL_dist_arch) }

                  if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_minCn_arch_Sec", STR(mdf_arch_n))) )
                     { mdf_collY_dist_ctrl_Sec = ABS(VAR_VAL(idx_att, STRCAT("MCB_collY_dist_minCn_arch_Sec", STR(mdf_arch_n)))) }

                 // 25.07.2017
                  // Aggiunto + mdf_Y_Ele_CollY/2 altrimenti se dist_CentriLav > mdf_collY_dist_ctrl non entra nei controlli mdf_collY_trovataCol
                  // in questo caso dist_min si intende distanza minima tra centro-Cer e filo alto o basso ele_CollY_Trovato
                 // 16.11.2021 Avendo corretto la gestione con mdf_spostaCer_UP non va bene aumentare di mdf_Y_Ele_CollY/2
                  //if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n))) )
                  //   {
                  //    mdf_collY_dist_ctrl = ABS(VAR_VAL(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n)))) + mdf_Y_Ele_CollY/2
                  //    if (mdf_ele_intern_VarVAL_dist_arch != 0)  { mdf_collY_dist_ctrl = ABS(mdf_ele_intern_VarVAL_dist_arch) + mdf_Y_Ele_CollY/2 }
                  //   }
                  if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n))) )
                     {
                      mdf_collY_dist_ctrl = ABS(VAR_VAL(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n))))
                      if (mdf_ele_intern_VarVAL_dist_arch != 0)  { mdf_collY_dist_ctrl = ABS(mdf_ele_intern_VarVAL_dist_arch) }
                     // 13.01.2022
                      mdf_ctrl_dist_add_mezzoEle = mdf_Y_Ele_CollY/2
                      mdf_ctrl_dist_arch_min = 1
                     }

                  if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n))) )
                     { mdf_collY_dist_ctrl_Sec = ABS(VAR_VAL(idx_att, STRCAT("MCB_collY_dist_min_arch_Sec", STR(mdf_arch_n)))) }

                  // 05.08.2020 Ce81163 avendo sistemato ieri, mancava pero che
                  // Avendo MCB_collY_archetipo1 *Frigo* e MCB_collY_archetipo4 FondoFrigo quando cerca *Fondo*
                  // troverebbe anche FondoFrigo ma sul quale so di volere una gestione diversa, quindi con MCB_collY_archetipo1
                  // non lo devo considerare
                  if ( VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_minCn_arch", STR(mdf_arch_n))) != 1
                     & VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n))) != 1
                     )
                     {
                      mdf_arch_n_exist = 1
                      while (mdf_arch_n_exist < 10)
                         {
                          if (mdf_arch_n_exist != mdf_arch_n)
                             {
                              if ( VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_minCn_arch", STR(mdf_arch_n_exist))) == 1
                                 | VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n_exist))) == 1
                                 )
                                 {
                                  // Se trovo il FondoFrigo e l' archetipo mdf_arch_n_exist e' quello del FondoFrigo, se mdf_arch_n_exist != mdf_arch_n non lo devo considerare
                                  // Se sono nella ricerca del Coperchio, senza questa if imposterebbe sempre mdf_ele_intern = -9999
                                  if (IS_MATCH(NOME(idx_troCol), VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n_exist)))) == 1)
                                     { mdf_ele_intern = -9999 }
                                 }
                             }
                          mdf_arch_n_exist = mdf_arch_n_exist+1
                         }
                     }
                 }
             }
          if (mdf_ele_intern > 0)
             {
             // 23.04.2025
              limiteY_Trov = 400
              if (mdf_ele_collY_Only_Msg > 0)  { limiteY_Trov = 600 }

             // 10.04.2024 Ce02980. Se mi sposta la cerniera piu in alto per verificare che non vada in collisione con altri
              // che avviene nella procedura MdF_Ctrl_Collis_CerBat_2Ele allora devo aggiungere lo sposta calcolato dalla cerniera
              // precedente alla posizione cer attuale
              mdf_collY_sposta_y_daCerVic = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(id_collision)))
             // 28.01.2025 Sc006874 Dovrei farlo anche per posY_Utente, ma aspetto che mi esca il caso o fra qualche settimana
             // 31.01.2025 In realtà, per ora lo faccio solo se c'è la gestione messaggio, perchè la cosa è ambigua.
             // Se c'è lo spostamento automatico e l' utente fa uno spostamento successivo lo fa in relazione comunque anche dello sposta
             // automatico. Il problema sarebbe se dopo lo spostamento utente la cerniera fosse ancora in collisione ma sarebbe un problema
             // utente. Quindi se nel controllo aggiunlo lo spostamento utente e non mi trova piu la collisione non fa piu nemmeno lo sposta automatico
             // quindi l' utente avrebbe fatto uno spostamento che però non corrisponde allo spostamento corretto perchè lui lo fa
             // con lo sposta automatico attivo che se poi viene meno risposterebbe la cerniera meno lo sposta automatico
             // Esempio: su ordini in cui c'è lo sposta utente e c'era anche lo sposta automatico, con questa modifica, se ricarico l' ordine,
             // la cerniera si rispsota senza lo sposta automatico
             // In realtà l' ordine Sc006874 non ha mdf_ele_collY_Only_Msg>=1 ma ha gli sposta a 0 e la gestione MessaggioCollisione a Bdm
             // pertanto vado a togliere a Bdm il messaggio nel caso ci sia spostamento utente, perchè il fatto di avere lo sposta a 0 lo
             // so troppo tardi rispetto a qui anche perchè potrebbe essere determinato proprio da questa gestione, quindi non la vedo possibile
             // se ho gli sposta a 0 e non ho mdf_ele_collY_Only_Msg >= 1
              mdf_CER_base0y_SpostataUte_CollY = 0
              if (mdf_ele_collY_Only_Msg >= 1)
                 {
                  mdf_LivSpostaCerUte = VAR_VAL(PADRE(idx_att, 1), "MdfSys_LivSpostaCerUte")-1
                  mdf_CER_base0y_SpostataUte_CollY = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(id_collision)))
                 }

              // py_CerBat è già il centro Cer
              basy_CerCn = base_0.y + VAR_VAL(idx_att, STRCAT("py_CerBat", STR(id_collision))) + mdf_collY_sposta_y_daCerVic + mdf_CER_base0y_SpostataUte_CollY
              y_trov = VAR_VAL(idx_troCol, "Y") - mdf_collY_offy_INF
              basy_trov = VAR_VAL(idx_troCol, "base_0.y") + mdf_collY_offy_INF
              //dist_CentriLav = basy_trov+y_trov/2 - (basy_Cer+yCer/2)
              dist_CentriLav = basy_trov+y_trov/2 - basy_CerCn
              // 30.09.2021 SCNOPV000245
              mdf_spostaCer_UP = 0
              mdf_spostaCer_DOWN = 0
              // 22.01.2025 Sn002438 Se l'ho gia aggiunto in basy_CerCn se lo aggiungo qui lo fa 2 volte. Strano non sia mai uscito da aprile, ma può essere
              // Vedi anche Ce02980
              //basy_Cer = basy_CerCn-yCer/2 + mdf_collY_sposta_y_daCerVic
              //alty_Cer = basy_CerCn+yCer/2 + mdf_collY_sposta_y_daCerVic
              basy_Cer = basy_CerCn-yCer/2
              alty_Cer = basy_CerCn+yCer/2
              alty_trov = basy_trov+y_trov
              basy_trovCn = basy_trov+y_trov/2
              mdf_diffbasyCerEle = basy_Cer - basy_trov
              mdf_diffaltyCerEle = alty_trov - alty_Cer
              mdf_diffbasyCeraltyEle = basy_Cer - alty_trov
              mdf_diffbasyCerCnaltyEle = basy_CerCn - alty_trov

              mdf_diffbasyCerCnbasyEleCn = basy_CerCn - basy_trovCn
              mdf_diffbasyCerCnbasyEle = basy_CerCn - basy_trov

             // 13.01.2022
              if (VAR_VAL(idx_att, "MCB_collY_dist_minima") != 0)  { mdf_ctrl_dist_add_mezzoEle = y_trov/2 }

              if ( basy_CerCn > alty_trov
                 & basy_Cer <= alty_trov
                 )
                 { mdf_spostaCer_UP = 1 }

              // dipende se l' elemento trov ha y minore o uguale a yCer
              if ( basy_Cer > basy_trov
                 & alty_Cer <= alty_trov
                 & mdf_diffbasyCerEle > mdf_diffaltyCerEle
                 & y_trov > yCer
                 & y_trov < limiteY_Trov
                 )
                 { mdf_spostaCer_UP = 2 }

              if ( alty_Cer >= alty_trov
                 & basy_Cer <= alty_trov
                 & mdf_diffbasyCerEle > mdf_diffaltyCerEle
                 & y_trov > yCer
                 & y_trov < limiteY_Trov
                 )
                 {
                  mdf_spostaCer_UP = 3
                 // 09.05.2022 facendo dei test CassInt Sc1052745
                  mdf_diffbasyCerEle_UP3_deb = mdf_diffbasyCerEle
                  mdf_diffaltyCerEle_UP3_deb = mdf_diffaltyCerEle
                  mdf_diffbasyCeraltyEle_UP3_deb = mdf_diffbasyCeraltyEle
                  mdf_diffbasyCerCnaltyEle_UP3_deb = mdf_diffbasyCerCnaltyEle
                  mdf_collY_dist_ctrl_UP3_deb = mdf_collY_dist_ctrl
                  if ( mdf_diffbasyCerCnaltyEle > ABS(mdf_collY_dist_ctrl)
                     & ABS(mdf_collY_dist_ctrl) < yCer
                     )
                     { mdf_spostaCer_UP = -3 }
                 }

             // 18.10.2021 St171796 baseCer a 0.5 sopra baseEle e ripiano Y=18
              if ( basy_Cer >= basy_trov
                 & basy_Cer < alty_trov
                 & mdf_diffbasyCerEle > mdf_diffaltyCerEle
                 & y_trov <= yCer
                 )
                 {
                  mdf_spostaCer_UP = 4
                 // 21.04.2022 Sn042101 mdf_collY_dist_ctrl 12.7 perche riguarda solo la basetta
                  mdf_diffbasyCerEle_deb = mdf_diffbasyCerEle
                  mdf_diffaltyCerEle_deb = mdf_diffaltyCerEle
                  mdf_diffbasyCeraltyEle_deb = mdf_diffbasyCeraltyEle
                  mdf_diffbasyCerCnaltyEle_deb = mdf_diffbasyCerCnaltyEle
                  mdf_collY_dist_ctrl_UP4_deb = mdf_collY_dist_ctrl
                  if ( mdf_diffbasyCerCnaltyEle > ABS(mdf_collY_dist_ctrl)
                     & ABS(mdf_collY_dist_ctrl) < yCer
                     )
                     { mdf_spostaCer_UP = -4 }
                 }

             // 19.10.2021 PC004457 dist_CentriLav_case5=38 mdf_collY_dist_ctrl 40
              dist_CentriLav_case5 = basy_CerCn - (basy_trov+y_trov/2)
             // 08.08.2022 Teoricamente = va bene. ASCE080670
              //if ( ABS(dist_CentriLav_case5) <= mdf_collY_dist_ctrl
              if ( ABS(dist_CentriLav_case5) < mdf_collY_dist_ctrl
                 & y_trov <= yCer
                 & basy_CerCn > basy_trov + y_trov
                 )
                 { mdf_spostaCer_UP = 5 }

             // 04.11.2021 P567356 VanoCassaforte y 330, cerniera già piu in alto dell' elemento ma non ancora alla distanza richiesta
             // 16.11.2021 SN111501
              //if ( ABS(mdf_diffaltyCerEle) < mdf_collY_dist_ctrl
              if ( ABS(mdf_diffbasyCerCnaltyEle) < mdf_collY_dist_ctrl
                 // 08.11.2021 VD835818 BloccoXInterfCer 62
                 //& y_trov > 2*yCer
                 // 15.12.2021 SN12568
                 //& y_trov > yCer
                 & y_trov < limiteY_Trov
                 & basy_CerCn > basy_trov + y_trov
                 )
                 {
                 // 16.11.2021
                  mdf_collY_dist_ctrl_testSpUP6 = mdf_collY_dist_ctrl
                  mdf_diffbasyCerCnaltyEle_deb6 = STRCAT("UP 6 idCer=", STR(id_collision), " diff basyCerCn altyEle=", STR(mdf_diffbasyCerCnaltyEle), " idxEle=", STR(idx_troCol))
                  dist_CentriLav_case5_deb = dist_CentriLav_case5

                  if (id_collision == 3)  { mdf_diffbasyCerCnaltyEle3_deb = STRCAT("UP 6 idCer=", STR(id_collision), " diff basyCerCn altyEle=", STR(mdf_diffbasyCerCnaltyEle), " idxEle=", STR(idx_troCol)) }

                 // 12.01.2022 St917083 MCB_collY_dist_ctrl 45 ma mdf_diffbasyCerCnaltyEle = 41.5 mentre dist_CentriLav_case5 = 50.5
                  // il caso SN12568 in realta si e' risolto con MCB_collY_dist_ctrl_arch3 ma entro qui cosi ho le var di debug
                  // se si verifica che il centro e' sopra ad alto-Ele devo farlo solo se y_trov > yCer altrimenti mi trova collisione
                  // non dai centri ma da centro cerniera a filo alto-Ele e invece il default mdf_collY_dist_ctrl deve sempre essere tra i centri
                  if (y_trov >= yCer)
                     {
                      mdf_spostaCer_UP = 6
                     // 22.12.2021 V838636 -7,5mm perchè mi porta a 35mm rispetto al ripiano sotto, ma non serviva perchè la distanza è già maggiore della collY_dist_minima
                      if ( VAR_EXIST(idx_att, "MCB_collY_dist_minima")
                         // 17.11.2022 dovrebbe essere piu corretto così perchè per archetipo c'è la correzione 16.11.2021
                         & VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n))) != 1
                         )
                         {
                          if (ABS(mdf_diffbasyCerCnaltyEle) >= MCB_collY_dist_minima)
                             {
                              mdf_spostaCer_UP = -6
                              mdf_spostaCer_UP_debug = -6
                             }
                         }
                     }
                 }

             // 13.01.2022 P245076 il caso mdf_spostaCer_UP 6 e' diverso dal default che prevede il controllo tra i centri
              // in piu rispetto a com' era la gestione mesi fa mancava da considerare appunto y_trov/2. Il caso mdf_spostaCer_UP 6
              // riguarda elementi piu grandi della cerniera
              if ( ABS(mdf_diffbasyCerCnbasyEleCn) < mdf_collY_dist_ctrl + mdf_ctrl_dist_add_mezzoEle
                 & mdf_diffbasyCerCnbasyEleCn > 0
                 & y_trov < limiteY_Trov
                 & basy_Cer > basy_trov + y_trov
                 )
                 {
                  mdf_collY_dist_ctrl_testSpUP7 = mdf_collY_dist_ctrl
                  dist_CentriLav_UP7_deb = dist_CentriLav
                  mdf_spostaCer_UP = 7
                 // 18.01.2022 Scn000231 alto ripiano a 43 dal centro cer dist_minima 48
                 // ma centro Cer a 61 da sotto coperchio a 50
                 // quindi o si sposta sotto al ripiano oppure la cerniera va verso il coperchio
                 // Vedi anche Scn000263 collisione con StrutturaCassCest
                  mdf_diffbasyCerCnbasyEleCn_deb  = STRCAT("UP 7 idCer=", STR(id_collision), " diff basyCerCn basyEleCn=", STR(mdf_diffbasyCerCnbasyEleCn), " idxEle=", STR(idx_troCol))
                  mdf_diffbasyCerCnaltyEleUP7_deb = STRCAT("UP 7 idCer=", STR(id_collision), " diff basyCerCn altyEle=", STR(mdf_diffbasyCerCnaltyEle), " idxEle=", STR(idx_troCol))
                  mdf_diffbasyCerCnbasyEle_deb    = STRCAT("UP 7 idCer=", STR(id_collision), " diff basyCerCn basyEle=", STR(mdf_diffbasyCerCnbasyEle), " idxEle=", STR(idx_troCol))
                  mdf_ctrl_dist_add_mezzoEle_deb  = STRCAT("UP 7 idCer=", STR(id_collision), " ", STR(mdf_ctrl_dist_add_mezzoEle))
                 // 24.01.2022 VD836182 Se c'e' MCB_collY_dist_minima devo controllare centro con altoEle, ma se c'e
                  // MCB_collY_dist_min_arch non devo fare il controllo
                  if ( VAR_VAL(idx_att, "MCB_collY_dist_minima") != 0
                     & ABS(mdf_diffbasyCerCnaltyEle) >= VAR_VAL(idx_att, "MCB_collY_dist_minima")
                     & mdf_ctrl_dist_arch_min == 0
                     // 17.11.2022 dovrebbe essere piu corretto così perchè per archetipo c'è la correzione 16.11.2021
                     & VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n))) != 1
                     )
                     {
                      mdf_spostaCer_UP = -7
                      mdf_spostaCer_UP_debug = -7
                     }

                  mdf_fia_doppioBattutaX = 0
                  if (VAR_VAL(PADRE(idx_att, 1), "mdf_doppio_fiaSx_inY_Battuta_X") > -1)
                     {
                      if ( IS_IDX(VAR_VAL(PADRE(idx_att, 1), "mdf_doppio_fiaSx_inY_Battuta_X"))
                         & IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "SX*")
                         )
                         { mdf_fia_doppioBattutaX = 1 }
                     }
                  if (VAR_VAL(PADRE(idx_att, 1), "mdf_doppio_fiaDx_inY_Battuta_X") > -1)
                     {
                      if ( IS_IDX(VAR_VAL(PADRE(idx_att, 1), "mdf_doppio_fiaDx_inY_Battuta_X"))
                         & IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "DX*")
                         )
                         { mdf_fia_doppioBattutaX = 1 }
                     }
                 // 08.09.2023 A3091926 Se ho il doppio fianco di battuta significa che c'è una scocca sopra
                  // Se sono mdf_gestione_collY_dist_SE_CerVic significa che sono una delle 2 cerniere in alto
                  // quindi se trovo collisione con il Fondo non è un caso di +-60 (cioe MCB_collY_dist_SE_CerVic), perchè con il
                  // Fondo ci sarebbe anche un Coperchio 18+18
                  // e nelle specifiche non ci sarebbe questo caso, quindi il controllo lo faccio sul 40 (mdf_collY_dist_ctrl)
                  // Prima si spostava in basso di 100 e non collideva con il coperchio perchè 40+60 non la fa collidere
                  // solo che in questo caso c' era anche un ripianoFisso ed è uscito il problema
                  if (mdf_fia_doppioBattutaX > 0)
                     {
                      if (VAR_VAL(idx_att, "mdf_gestione_collY_dist_SE_CerVic") )
                         {
                          mdf_collY_dist_prec_SE_CerVic_att = VAR_VAL(idx_att, "mdf_collY_dist_prec_SE_CerVic")
                          if (ABS(mdf_diffbasyCerCnbasyEleCn) >= mdf_collY_dist_prec_SE_CerVic_att + mdf_ctrl_dist_add_mezzoEle)
                             {
                              mdf_spostaCer_UP = -7.1
                              mdf_spostaCer_UP_debug = -7.1
                             }
                         }
                     }
                 }

             // per debug
              if (mdf_spostaCer_UP > 0)
                 {
                  if (id_collision == 1)  { mdf_spostaUP_Cer1_deb = STRCAT("UP=" , STR(mdf_spostaCer_UP), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn altyEle=", STR(mdf_diffbasyCerCnaltyEle), " idxEle=", STR(idx_troCol)) }
                  if (id_collision == 2)  { mdf_spostaUP_Cer2_deb = STRCAT("UP=" , STR(mdf_spostaCer_UP), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn altyEle=", STR(mdf_diffbasyCerCnaltyEle), " idxEle=", STR(idx_troCol)) }
                  if (id_collision == 3)  { mdf_spostaUP_Cer3_deb = STRCAT("UP=" , STR(mdf_spostaCer_UP), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn altyEle=", STR(mdf_diffbasyCerCnaltyEle), " idxEle=", STR(idx_troCol)) }
                  if (id_collision == 4)  { mdf_spostaUP_Cer4_deb = STRCAT("UP=" , STR(mdf_spostaCer_UP), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn altyEle=", STR(mdf_diffbasyCerCnaltyEle), " idxEle=", STR(idx_troCol)) }
                  if (id_collision == 5)  { mdf_spostaUP_Cer5_deb = STRCAT("UP=" , STR(mdf_spostaCer_UP), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn altyEle=", STR(mdf_diffbasyCerCnaltyEle), " idxEle=", STR(idx_troCol)) }
                  if (id_collision == 6)  { mdf_spostaUP_Cer6_deb = STRCAT("UP=" , STR(mdf_spostaCer_UP), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn altyEle=", STR(mdf_diffbasyCerCnaltyEle), " idxEle=", STR(idx_troCol)) }
                  if (id_collision == 7)  { mdf_spostaUP_Cer7_deb = STRCAT("UP=" , STR(mdf_spostaCer_UP), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn altyEle=", STR(mdf_diffbasyCerCnaltyEle), " idxEle=", STR(idx_troCol)) }
                  if (id_collision == 8)  { mdf_spostaUP_Cer8_deb = STRCAT("UP=" , STR(mdf_spostaCer_UP), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn altyEle=", STR(mdf_diffbasyCerCnaltyEle), " idxEle=", STR(idx_troCol)) }
                 }

              if ( basy_Cer >= basy_trov
                 & alty_Cer <= alty_trov
                 & mdf_diffbasyCerEle < mdf_diffaltyCerEle
                 & y_trov > yCer
                 // 06.10.2021 Sn002785 RipianoLeMans Y 525 Una collisione con un elemento Y 400 non ha molto senso, probabilmente vuol dire che c'e' da rivedere la regola Cerniere
                 // o escludere l' elemento in VariabiliMdF.txt
                 & y_trov < limiteY_Trov
                 )
                 { mdf_spostaCer_DOWN = 1 }

             // 01.10.2021
              if ( basy_Cer <= basy_trov
                 & alty_Cer < alty_trov
                 & alty_Cer > basy_trov
                 & mdf_diffbasyCerEle < mdf_diffaltyCerEle
                 & y_trov > yCer
                 & y_trov < limiteY_Trov
                 )
                 {
                  mdf_spostaCer_DOWN = 2
                  // 04.05.2023 Sc
                  mcb_collY_dist_min_arch_deb =  VAR_VAL(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n)))
                  mdf_diffbasyCerCnbasyEleCn_deb_DOWN2 = mdf_diffbasyCerCnbasyEleCn
                  if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n))) )
                     {
                      if (ABS(mdf_diffbasyCerCnbasyEleCn) - mdf_ctrl_dist_add_mezzoEle > ABS(VAR_VAL(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n)))) )
                         {
                          mdf_spostaCer_DOWN = -2
                          mdf_spostaCer_DOWN2_deb = STRCAT("-2 down idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn basyEle=", STR(mdf_diffbasyCerCnbasyEle), " idxEle=", STR(idx_troCol))
                         }
                     }
                  else
                     {
                      if ( ABS(mdf_diffbasyCerCnbasyEleCn) - mdf_ctrl_dist_add_mezzoEle >= ABS(VAR_VAL(idx_att, "MCB_collY_dist_minima"))
                         & VAR_VAL(idx_att, "MCB_collY_dist_minima") != 0
                         // dovrebbe essere piu corretto così perchè per archetipo c'è la correzione 16.11.2021
                         & VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n))) != 1
                         )
                         {
                          mdf_spostaCer_DOWN = -2.1
                          mdf_spostaCer_DOWN2_deb = STRCAT("-2.1 idCer=", STR(id_collision))
                         }
                     }
                 }

              // 13.01.2022 P581894
              if ( ABS(mdf_diffbasyCerCnbasyEleCn) < mdf_collY_dist_ctrl + mdf_ctrl_dist_add_mezzoEle
                 & mdf_diffbasyCerCnbasyEleCn < 0
                 & y_trov < limiteY_Trov
                 & basy_Cer <= basy_trov
                 )
                 {
                  mdf_collY_dist_ctrl_testSpDOWN3 = mdf_collY_dist_ctrl
                  mdf_diffbasyCerCnbasyEleCn_deb = mdf_diffbasyCerCnbasyEleCn
                  dist_CentriLav_DOWN3_deb = dist_CentriLav
                  mcb_collY_dist_minima_DOWN3 = VAR_VAL(idx_att, "MCB_collY_dist_minima")
                  mdf_spostaCer_DOWN = 3
                // 17.01.2022 P241597
                  mcb_collY_dist_min_arch_deb =  VAR_VAL(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n)))
                  if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n))) )
                     {
                      if (ABS(mdf_diffbasyCerCnbasyEleCn) - mdf_ctrl_dist_add_mezzoEle > ABS(VAR_VAL(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n)))) )
                         {
                          mdf_spostaCer_DOWN = -3
                          mdf_spostaCer_DOWN3_deb = STRCAT("-3 idCer=", STR(id_collision))
                         }
                     }
                  else
                     {
                     // 17.01.2022 Ca2145139
                      if ( ABS(mdf_diffbasyCerCnbasyEleCn) - mdf_ctrl_dist_add_mezzoEle >= ABS(VAR_VAL(idx_att, "MCB_collY_dist_minima"))
                         & VAR_VAL(idx_att, "MCB_collY_dist_minima") != 0
                         // 17.11.2022 dovrebbe essere piu corretto così perchè per archetipo c'è la correzione 16.11.2021
                         & VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n))) != 1
                         )
                         {
                          mdf_spostaCer_DOWN = -3.1
                          mdf_spostaCer_DOWN3_deb = STRCAT("-3.1 idCer=", STR(id_collision))
                         }
                     }
                 }
             // per debug
              if (mdf_spostaCer_DOWN > 0)
                 {
                  if (id_collision == 1)  { mdf_spostaDOWN_Cer1_deb = STRCAT("DOWN=" , STR(mdf_spostaCer_DOWN), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn basyEle=", STR(mdf_diffbasyCerCnbasyEle), " idxEle=", STR(idx_troCol)) }
                  if (id_collision == 2)  { mdf_spostaDOWN_Cer2_deb = STRCAT("DOWN=" , STR(mdf_spostaCer_DOWN), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn basyEle=", STR(mdf_diffbasyCerCnbasyEle), " idxEle=", STR(idx_troCol)) }
                  if (id_collision == 3)  { mdf_spostaDOWN_Cer3_deb = STRCAT("DOWN=" , STR(mdf_spostaCer_DOWN), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn basyEle=", STR(mdf_diffbasyCerCnbasyEle), " idxEle=", STR(idx_troCol)) }
                  if (id_collision == 4)  { mdf_spostaDOWN_Cer4_deb = STRCAT("DOWN=" , STR(mdf_spostaCer_DOWN), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn basyEle=", STR(mdf_diffbasyCerCnbasyEle), " idxEle=", STR(idx_troCol)) }
                  if (id_collision == 5)  { mdf_spostaDOWN_Cer5_deb = STRCAT("DOWN=" , STR(mdf_spostaCer_DOWN), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn basyEle=", STR(mdf_diffbasyCerCnbasyEle), " idxEle=", STR(idx_troCol)) }
                  if (id_collision == 6)  { mdf_spostaDOWN_Cer6_deb = STRCAT("DOWN=" , STR(mdf_spostaCer_DOWN), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn basyEle=", STR(mdf_diffbasyCerCnbasyEle), " idxEle=", STR(idx_troCol)) }
                  if (id_collision == 7)  { mdf_spostaDOWN_Cer7_deb = STRCAT("DOWN=" , STR(mdf_spostaCer_DOWN), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn basyEle=", STR(mdf_diffbasyCerCnbasyEle), " idxEle=", STR(idx_troCol)) }
                  if (id_collision == 8)  { mdf_spostaDOWN_Cer8_deb = STRCAT("DOWN=" , STR(mdf_spostaCer_DOWN), " idCer=", STR(id_collision), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " diff basyCerCn basyEle=", STR(mdf_diffbasyCerCnbasyEle), " idxEle=", STR(idx_troCol)) }
                 }

              if (dist_CentriLav == 0)
                 {
                  mdf_collY_trovataCol = 1
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"), 1, 0, "")
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"), dist_CentriLav, 0, "")
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"), idx_troCol, 0, "")

                  if ($MdF_NO_LOGMSG == 0)
                     {
                      COMANDO2(STRCAT("LOGMSG MdF_while_Collision ACTION=", STR(ACTION()), " CMD=", STR(CMD()), " idx_att=", STR(idx_att), " figlio di ", STR(PADRE(idx_att, 1)), " id_Cercollision=", STR(id_collision), " Case=", STR(mdf_collY_trovataCol), " dist_CentriLav=", STR(dist_CentriLav), " ", VAR_VAL_STR(-1, "File")))
                      //COMANDO2(STRCAT("LOGMSG basy_trov=", STR(basy_trov), " y_trov=", STR(y_trov), " basy_CerCn=", STR(basy_CerCn), " dist_CentriLav=", STR(dist_CentriLav)))
                     }
                 }
              else
                 {
                  if ( basy_CerCn-yCer/2 <= basy_trov
                    // 30.09.2021
                     | mdf_spostaCer_DOWN > 0
                     )
                     {
                      dist_CentriLav = basy_trov+y_trov/2 - basy_CerCn
                      if ( ABS(dist_CentriLav) <= mdf_collY_dist_ctrl
                         // 01.10.2021
                         | mdf_spostaCer_DOWN > 0
                         )
                         {
                          mdf_collY_trovataCol = 2
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"), mdf_collY_trovataCol, 0, "")
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"), dist_CentriLav, 0, "")
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"), idx_troCol, 0, "")
                          if (dist_CentriLav < 0)
                             {
                              mdf_collY_trovataCol = 3
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"), mdf_collY_trovataCol, 0, "")
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"), dist_CentriLav, 0, "")
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"), idx_troCol, 0, "")
                             }
                          if ($MdF_NO_LOGMSG == 0)
                             {
                              COMANDO2(STRCAT("LOGMSG MdF_while_Collision ACTION=", STR(ACTION()), " CMD=", STR(CMD()), " idx_att=", STR(idx_att), " figlio di ", STR(PADRE(idx_att, 1)), " id_Cercollision=", STR(id_collision), " Case=", STR(mdf_collY_trovataCol), " ", VAR_VAL_STR(-1, "File")))
                              //COMANDO2(STRCAT("LOGMSG basy_trov=", STR(basy_trov), " y_trov=", STR(y_trov), " basy_CerCn=", STR(basy_CerCn), " dist_CentriLav=", STR(dist_CentriLav)))
                             }
                         }
                      else
                         {
                          // deve essere alto_Cer > base_trov
                          // altrimenti è solo una vicinanza
                          if (basy_CerCn+yCer/2 > basy_trov)
                             {
                              // 20.07.2020 Entra qui solo se mdf_collY_dist_ctrl e' minore di yCer/2 (meta cerniera) ma
                              // se non e' vera l'if sopra ABS(dist_CentriLav) <= mdf_collY_dist_ctrl ed entra qui signifca
                              // che anche se c'è interferenza tra gli ingombri, e' sufficiente per farci stare la cerniera-basetta
                              // Esempio yCer 42 e mdf_collY_dist_ctrl 13.1.
                              // Semmai e' da considerarsi un errore di configurazione VariabiliMdf o RegFacc in quanto la X,Y cer dovrebbero essere 35
                              //mdf_collY_trovataCol = 4
                              //VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"), mdf_collY_trovataCol, 0, "")
                              //VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"), dist_CentriLav, 0, "")
                              //VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"), idx_troCol, 0, "")
                              //if ($MdF_NO_LOGMSG == 0)
                              //   {
                              //    COMANDO2(STRCAT("LOGMSG MdF_while_Collision ACTION=", STR(ACTION()), " CMD=", STR(CMD()), " idx_att=", STR(idx_att), " figlio di ", STR(PADRE(idx_att, 1)), " Case=", STR(mdf_collY_trovataCol), " ", VAR_VAL_STR(-1, "File")))
                              //   }
                              mdf_collY_diff4 = basy_CerCn+yCer/2 - basy_trov
                             }
                         }
                     }

                  // 02.07.2020 SCN yCer=66, mdf_collY_dist_ctrl=48
                  // Se centro cerniera - meta della distanza da controllare sta sopra il filo basso dell' elemento - meta_y_eletrovato
                  // se mi entra in mdf_collY_trovataCol=3 poi lo spostamento e' negativo e quindi me lo ritroverei ancora in collisione
                  mdf_case_3_5 = 0
                  if (VAR_EXIST(idx_att, "MCB_collY_dist_minima") )
                     {
                      mdf_collY_sposta_3_att = -1*VAR_VAL(idx_att, "MCB_collY_dist_minima") - y_trov/2 + dist_CentriLav
                      mdf_diff_spostamento = basy_CerCn+mdf_collY_sposta_3_att - basy_trov
                      if ( ABS(basy_CerCn+mdf_collY_sposta_3_att - basy_trov) < ABS(mdf_collY_dist_ctrl)
                         & dist_CentriLav < 0
                         )
                         { mdf_case_3_5 = dist_CentriLav }
                     }

                  // 30.09.2021 SCNOPV000245 dipende se l' elemento ha y minore o uguale a yCer
                  //if ( basy_CerCn-yCer/2 > basy_trov
                  //   // 03.07.2020 SCN yCer=66, mdf_collY_dist_ctrl=48 Se il centro cerniera sta sopra l' alto_elemento lo spostamento minore e' verso l' alto e non verso il basso come il case 3
                  //   | basy_CerCn > basy_trov + y_trov
                  if (mdf_spostaCer_UP > 0)
                     {
                      dist_CentriLav = basy_CerCn - (basy_trov+y_trov/2)
                      if ( ABS(dist_CentriLav) <= mdf_collY_dist_ctrl
                         | mdf_spostaCer_UP > 0
                         )
                         {
                          mdf_collY_trovataCol = 5
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"), mdf_collY_trovataCol, 0, "")
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"), dist_CentriLav, 0, "")
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"), idx_troCol, 0, "")
                          Z_ele = VAR_VAL(idx_troCol, "Z")
                          if (dist_CentriLav < 0)
                             {
                              mdf_collY_trovataCol = 6
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"), mdf_collY_trovataCol, 0, "")
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"), dist_CentriLav, 0, "")
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"), idx_troCol, 0, "")
                             }
                          if ($MdF_NO_LOGMSG == 0)
                             {
                              COMANDO2(STRCAT("LOGMSG MdF_while_Collision ACTION=", STR(ACTION()), " CMD=", STR(CMD()), " idx_att=", STR(idx_att), " figlio di ", STR(PADRE(idx_att, 1)), " id_Cercollision=", STR(id_collision), " Case=", STR(mdf_collY_trovataCol), " ", VAR_VAL_STR(-1, "File")))
                              //COMANDO2(STRCAT("LOGMSG basy_trov=", STR(basy_trov), " y_trov=", STR(y_trov), " basy_CerCn=", STR(basy_CerCn), " dist_CentriLav=", STR(dist_CentriLav)))
                             }
                         }
                      else
                         {
                          // deve essere base_Cer < alto_trov
                          // altrimenti è solo una vicinanza
                          if (basy_CerCn-yCer/2 < basy_trov+y_trov)
                             {
                              mdf_collY_diff7 = basy_CerCn-yCer/2 - (basy_trov+y_trov)
                              // 04.10.2019 1048508 dist_CentriLav 26.75 e collY_dist_min_arch7 22.1-9, quindi mdf_collY_dist_ctrl=13.1
                              // in realtà se non entra qui sopra per ABS(dist_CentriLav) <= mdf_collY_dist_ctrl significa che, anche se c'è interferenza
                              // tra gli ingombri, e' sufficiente per farci stare la cerniera-basetta
                              //mdf_collY_trovataCol = 7
                              //VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"), mdf_collY_trovataCol, 0, "")
                              //VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"), dist_CentriLav, 0, "")
                              //VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"), idx_troCol, 0, "")
                              //COMANDO2(STRCAT("LOGMSG MdF_while_Collision ACTION=", STR(ACTION()), " CMD=", STR(CMD()), " idx_att=", STR(idx_att), " figlio di ", STR(PADRE(idx_att, 1)), " Case=", STR(mdf_collY_trovataCol), " ", VAR_VAL_STR(-1, "File")))
                             }
                         }
                     }
                 }
             }
          mdf_ctrl_dist_arch_maked = 0
          if ( mdf_collY_trovataCol > 0
             & IS_IDX(mdf_collY[iCol])
             )
             {
              // Di default non faccio niente, così non rischio niente, ma gli offset sono decisi in VariabiliMdF.txt
              //mdf_collY_sposta_1 = -64
              //mdf_collY_sposta_2 = -32
              //mdf_collY_sposta_3 = -64
              //mdf_collY_sposta_4 = -32
              //mdf_collY_sposta_5 = 32
              //mdf_collY_sposta_6 = 64
              //mdf_collY_sposta_7 = 32

              mdf_collY_sposta_1 = 0
              mdf_collY_sposta_2 = 0
              mdf_collY_sposta_3 = 0
              mdf_collY_sposta_4 = 0
              mdf_collY_sposta_5 = 0
              mdf_collY_sposta_6 = 0
              mdf_collY_sposta_7 = 0

             // 20.07.2021 Siccome non ha senso spostare di -9999 lo uso come esistenza
              mcb_collY_sposta_Sup     = -9999
              mcb_collY_sposta_Sup_2   = -9999
              mcb_collY_sposta_Sup_Inv = -9999
              mcb_collY_sposta_Inf     = -9999
              mcb_collY_sposta_Inf_2   = -9999
              mcb_collY_sposta_Inf_Inv = -9999

             // 21.07.2021 portata fuoiri inzializzazione
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_Sup")     )        { mcb_collY_sposta_Sup     = VAR_VAL(idx_att, "MCB_collY_sposta_Sup") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_Sup_2")   )        { mcb_collY_sposta_Sup_2   = VAR_VAL(idx_att, "MCB_collY_sposta_Sup_2") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_Sup_Inv") )        { mcb_collY_sposta_Sup_Inv = VAR_VAL(idx_att, "MCB_collY_sposta_Sup_Inv") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_Inf")     )        { mcb_collY_sposta_Inf     = VAR_VAL(idx_att, "MCB_collY_sposta_Inf") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_Inf_2")   )        { mcb_collY_sposta_Inf_2   = VAR_VAL(idx_att, "MCB_collY_sposta_Inf_2") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_Inf_Inv") )        { mcb_collY_sposta_Inf_Inv = VAR_VAL(idx_att, "MCB_collY_sposta_Inf_Inv") }

             // valori da Bdm
              if (VAR_VAL(PADRE(idx_att, 1), "Sp_SUP_Scelta1") != 0)      { mcb_collY_sposta_Sup     = VAR_VAL(PADRE(idx_att, 1), "Sp_SUP_Scelta1") }
              if (VAR_VAL(PADRE(idx_att, 1), "Sp_SUP_Scelta2") != 0)      { mcb_collY_sposta_Sup_2   = VAR_VAL(PADRE(idx_att, 1), "Sp_SUP_Scelta2") }
              if (VAR_VAL(PADRE(idx_att, 1), "Sp_SUP_Scelta3") != 0)      { mcb_collY_sposta_Sup_Inv = VAR_VAL(PADRE(idx_att, 1), "Sp_SUP_Scelta3") }
              if (VAR_VAL(PADRE(idx_att, 1), "Sp_INF_Scelta1") != 0)      { mcb_collY_sposta_Inf     = VAR_VAL(PADRE(idx_att, 1), "Sp_INF_Scelta1") }
              if (VAR_VAL(PADRE(idx_att, 1), "Sp_INF_Scelta2") != 0)      { mcb_collY_sposta_Inf_2   = VAR_VAL(PADRE(idx_att, 1), "Sp_INF_Scelta2") }
              if (VAR_VAL(PADRE(idx_att, 1), "Sp_INF_Scelta3") != 0)      { mcb_collY_sposta_Inf_Inv = VAR_VAL(PADRE(idx_att, 1), "Sp_INF_Scelta3") }

             // valori da VariabiliMdF
              if (VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_SUP_Scelta1") != 0)  { mcb_collY_sposta_Sup     = VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_SUP_Scelta1") }
              if (VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_SUP_Scelta2") != 0)  { mcb_collY_sposta_Sup_2   = VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_SUP_Scelta2") }
              if (VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_SUP_Scelta3") != 0)  { mcb_collY_sposta_Sup_Inv = VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_SUP_Scelta3") }
              if (VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_INF_Scelta1") != 0)  { mcb_collY_sposta_Inf     = VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_INF_Scelta1") }
              if (VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_INF_Scelta2") != 0)  { mcb_collY_sposta_Inf_2   = VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_INF_Scelta2") }
              if (VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_INF_Scelta3") != 0)  { mcb_collY_sposta_Inf_Inv = VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_INF_Scelta3") }

              if (VAR_VAL(idx_att, "MCB_Sp_SUP_Scelta1") != 0)            { mcb_collY_sposta_Sup     = VAR_VAL(idx_att, "MCB_Sp_SUP_Scelta1") }
              if (VAR_VAL(idx_att, "MCB_Sp_SUP_Scelta2") != 0)            { mcb_collY_sposta_Sup_2   = VAR_VAL(idx_att, "MCB_Sp_SUP_Scelta2") }
              if (VAR_VAL(idx_att, "MCB_Sp_SUP_Scelta3") != 0)            { mcb_collY_sposta_Sup_Inv = VAR_VAL(idx_att, "MCB_Sp_SUP_Scelta3") }
              if (VAR_VAL(idx_att, "MCB_Sp_INF_Scelta1") != 0)            { mcb_collY_sposta_Inf     = VAR_VAL(idx_att, "MCB_Sp_INF_Scelta1") }
              if (VAR_VAL(idx_att, "MCB_Sp_INF_Scelta2") != 0)            { mcb_collY_sposta_Inf_2   = VAR_VAL(idx_att, "MCB_Sp_INF_Scelta2") }
              if (VAR_VAL(idx_att, "MCB_Sp_INF_Scelta3") != 0)            { mcb_collY_sposta_Inf_Inv = VAR_VAL(idx_att, "MCB_Sp_INF_Scelta3") }

              mdf_py_CerBat_ctrl = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(id_collision)))

              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision)), 1, 0, "")

              mdf_idx_CollY = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"))
              mdf_Y_Ele_CollY = VAR_VAL(mdf_idx_CollY, "Y") - mdf_collY_offy_INF
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_1") )  { mdf_collY_sposta_1 = VAR_VAL(idx_att, "MCB_collY_sposta_1") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_2") )  { mdf_collY_sposta_2 = VAR_VAL(idx_att, "MCB_collY_sposta_2") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_3") )  { mdf_collY_sposta_3 = VAR_VAL(idx_att, "MCB_collY_sposta_3") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_4") )  { mdf_collY_sposta_4 = VAR_VAL(idx_att, "MCB_collY_sposta_4") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_5") )  { mdf_collY_sposta_5 = VAR_VAL(idx_att, "MCB_collY_sposta_5") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_6") )  { mdf_collY_sposta_6 = VAR_VAL(idx_att, "MCB_collY_sposta_6") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_7") )  { mdf_collY_sposta_7 = VAR_VAL(idx_att, "MCB_collY_sposta_7") }

              mdf_collY_sposta_1_inv = -1*mdf_collY_sposta_1
              mdf_collY_sposta_2_inv = -1*mdf_collY_sposta_2
              mdf_collY_sposta_3_inv = -1*mdf_collY_sposta_3
              mdf_collY_sposta_4_inv = -1*mdf_collY_sposta_4
              mdf_collY_sposta_5_inv = -1*mdf_collY_sposta_5
              mdf_collY_sposta_6_inv = -1*mdf_collY_sposta_6
              mdf_collY_sposta_7_inv = -1*mdf_collY_sposta_7

             // 21.07.2021
              mdf_Iam_Cer_supOinf = 0
              if (mdf_py_CerBat_ctrl < 155)    { mdf_Iam_Cer_supOinf = 1 }
              if (mdf_py_CerBat_ctrl > Y-155)  { mdf_Iam_Cer_supOinf = 2 }

              if (mdf_Iam_Cer_supOinf <= 0)
                 {
                  mcb_Sp_genCER_Scelta1 = 0
                  if (VAR_VAL(PADRE(idx_att, 1), "Sp_genCER_Scelta1") != 0)       { mcb_Sp_genCER_Scelta1 = VAR_VAL(PADRE(idx_att, 1), "Sp_genCER_Scelta1") }
                  if (VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_genCER_Scelta1") != 0)   { mcb_Sp_genCER_Scelta1 = VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_genCER_Scelta1") }
                  if (VAR_VAL(idx_att, "MCB_Sp_genCER_Scelta1") != 0)             { mcb_Sp_genCER_Scelta1 = VAR_VAL(idx_att, "MCB_Sp_genCER_Scelta1") }

                  mcb_Sp_genCER_Scelta2 = 0
                  if (VAR_VAL(PADRE(idx_att, 1), "Sp_genCER_Scelta2") != 0)       { mcb_Sp_genCER_Scelta2 = VAR_VAL(PADRE(idx_att, 1), "Sp_genCER_Scelta2") }
                  if (VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_genCER_Scelta2") != 0)   { mcb_Sp_genCER_Scelta2 = VAR_VAL(PADRE(idx_att, 1), "MCB_Sp_genCER_Scelta2") }
                  if (VAR_VAL(idx_att, "MCB_Sp_genCER_Scelta2") != 0)             { mcb_Sp_genCER_Scelta2 = VAR_VAL(idx_att, "MCB_Sp_genCER_Scelta2") }

                  if (mcb_Sp_genCER_Scelta1 != 0)  { mdf_collY_sposta_1 = mcb_Sp_genCER_Scelta1 }
                  if (mcb_Sp_genCER_Scelta1 != 0)  { mdf_collY_sposta_2 = mcb_Sp_genCER_Scelta1 }
                  if (mcb_Sp_genCER_Scelta1 != 0)  { mdf_collY_sposta_3 = mcb_Sp_genCER_Scelta1 }
                  if (mcb_Sp_genCER_Scelta1 != 0)  { mdf_collY_sposta_5 = mcb_Sp_genCER_Scelta1 }
                  if (mcb_Sp_genCER_Scelta1 != 0)  { mdf_collY_sposta_6 = mcb_Sp_genCER_Scelta1 }

                  if (mcb_Sp_genCER_Scelta2 != 0)  { mdf_collY_sposta_1_inv = mcb_Sp_genCER_Scelta2 }
                  if (mcb_Sp_genCER_Scelta2 != 0)  { mdf_collY_sposta_2_inv = mcb_Sp_genCER_Scelta2 }
                  if (mcb_Sp_genCER_Scelta2 != 0)  { mdf_collY_sposta_3_inv = mcb_Sp_genCER_Scelta2 }
                  if (mcb_Sp_genCER_Scelta2 != 0)  { mdf_collY_sposta_5_inv = mcb_Sp_genCER_Scelta2 }
                  if (mcb_Sp_genCER_Scelta2 != 0)  { mdf_collY_sposta_6_inv = mcb_Sp_genCER_Scelta2 }

                  // Se c'e Scelta1 do per scontato che ci sia anche Scelta2 altrimenti non avrebbe senso. Do anche per scontato che Scelta2 sia di segno opposto
                  if (mcb_Sp_genCER_Scelta1 < 0)
                     {
                      mdf_collY_sposta_3     = mcb_Sp_genCER_Scelta2
                      mdf_collY_sposta_3_inv = mcb_Sp_genCER_Scelta1
                      mdf_collY_sposta_5     = mcb_Sp_genCER_Scelta2
                      mdf_collY_sposta_5_inv = mcb_Sp_genCER_Scelta1
                     }
                 }

             // 21.07.2021 Forse al posto di 32+9 è piu corretto 67/2+18+0.5, cioe mdf_limite_pyCer_InfSup
              // 11.12.2023 Cambiato +32+9 con mdf_limite_pyCer_InfSup, cioe 52
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 < mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_1 = mdf_collY_sposta_1_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 < mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_2 = mdf_collY_sposta_2_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 < mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_3 = mdf_collY_sposta_3_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 < mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_4 = mdf_collY_sposta_4_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 < mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_5 = mdf_collY_sposta_5_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 < mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_6 = mdf_collY_sposta_6_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 < mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_7 = mdf_collY_sposta_7_inv }

              mdf_collY_y_mm = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
              mdf_collY_case = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"))
              if (mdf_collY_sposta_2 > 0  &  mdf_collY_sposta_2 - mdf_collY_dist_ctrl < mdf_collY_y_mm)
                 {
                  // 17.01.2019 112901, 102202, 639860
                  //mdf_collY_sposta2_diff = mdf_collY_sposta_2 - mdf_collY_dist_ctrl
                  mdf_collY_sposta2_diff = mdf_collY_sposta_2 - mdf_collY_y_mm
                  // 26.09.2018
                  //DISPLAY2(STRCAT("mdf_collY_sposta2_diff=", STR(mdf_collY_sposta2_diff)))
                  //if (mdf_collY_sposta2_diff > 0)
                  // 12.03.2019 657436
                  //if (mdf_collY_sposta2_diff < mdf_collY_dist_ctrl-mdf_collY_sposta_2)
                  if (mdf_collY_sposta2_diff/2-0.1 < mdf_collY_dist_ctrl-mdf_collY_sposta_2)
                     {
                      //DISPLAY2(STRCAT("mdf_collY_sposta_2=", STR(mdf_collY_sposta_2), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " mdf_collY_y_mm=", STR(mdf_collY_y_mm)))
                      mdf_collY_sposta_2 = mdf_collY_sposta_2_inv
                     }
                 // 13.05.2019 S675987
                  // byCer piu basso del byRip
                  // dist_CentriLav = 23.5
                  // 23.5 *2 + 18/2 >  40
                  mdf_aly_Cer = basy_CerCn+yCer/2
                  mdf_aly_trov = basy_trov+y_trov
                  mdf_collY_alt_diff = mdf_aly_trov-mdf_aly_Cer

                  // 12.09.2019 A117814
                  // 28 < 32
                  // S675987 16.5 < 23.5
                  if (mdf_collY_sposta2_diff < mdf_collY_y_mm)
                     {
                      mdf_bay_Cer = basy_CerCn-yCer/2
                      // 58.5 e' minore di 60, la cerniera spostata di +60 esce dall' ingombro, ma non e' sufficiente
                      // in pratica la cerniera e' sotto al ripiano e per poco e' in collisione con esso
                      // quindi va spostata in negativo
                      mdf_collY_basalt_diff = mdf_aly_trov-mdf_bay_Cer
                      if (mdf_collY_sposta2_diff > 0  &  mdf_collY_y_mm > 0)
                         { mdf_collY_sposta_2 = mdf_collY_sposta_2_inv }
                     }
                 // A060603, 35516
                 // 30.09.2019 A129716 33 > 27  33 < 40
                  if ( mdf_collY_sposta2_diff > mdf_collY_y_mm
                     & mdf_collY_sposta2_diff < mdf_collY_dist_ctrl
                     )
                     {
                      mdf_bay_Cer = basy_CerCn-yCer/2
                      // 60-27 e' minore di 40, la cerniera spostata di +60 esce dall' ingombro, ma non e' sufficiente
                      // in pratica la cerniera e' sotto al ripiano e per poco e' in collisione con esso
                      // quindi va spostata in negativo
                      mdf_collY_basalt_diff = mdf_aly_trov-mdf_bay_Cer
                      if (mdf_collY_sposta2_diff > 0  &  mdf_collY_y_mm > 0)
                         { mdf_collY_sposta_2 = mdf_collY_sposta_2_inv }
                     }
                 }

             // 15.01.2020 S1048971 Primo caso da sempre, cioe dal 4 dicembre 2014
              // Come sopra ma per mdf_collY_trovataCol 4
              if (mdf_collY_sposta_4 > 0  &  mdf_collY_sposta_4 - mdf_collY_dist_ctrl < mdf_collY_y_mm)
                 {
                  mdf_collY_sposta4_diff = mdf_collY_sposta_4 - mdf_collY_y_mm
                  if (mdf_collY_sposta4_diff/2-0.1 < mdf_collY_dist_ctrl-mdf_collY_sposta_4)
                     {
                      //DISPLAY2(STRCAT("mdf_collY_sposta_4=", STR(mdf_collY_sposta_4), " mdf_collY_dist_ctrl=", STR(mdf_collY_dist_ctrl), " mdf_collY_y_mm=", STR(mdf_collY_y_mm)))
                      mdf_collY_sposta_4 = mdf_collY_sposta_4_inv
                     }
                  mdf_aly_Cer = basy_CerCn+yCer/2
                  mdf_aly_trov = basy_trov+y_trov
                  mdf_collY_alt_diff = mdf_aly_trov-mdf_aly_Cer

                  if (mdf_collY_sposta4_diff < mdf_collY_y_mm)
                     {
                      mdf_bay_Cer = basy_CerCn-yCer/2
                      mdf_collY_basalt_diff = mdf_aly_trov-mdf_bay_Cer
                      if (mdf_collY_sposta4_diff > 0  &  mdf_collY_y_mm > 0)
                         { mdf_collY_sposta_4 = mdf_collY_sposta_4_inv }
                     }
                  if ( mdf_collY_sposta4_diff > mdf_collY_y_mm
                     & mdf_collY_sposta4_diff < mdf_collY_dist_ctrl
                     )
                     {
                      mdf_bay_Cer = basy_CerCn-yCer/2
                      mdf_collY_basalt_diff = mdf_aly_trov-mdf_bay_Cer
                      if (mdf_collY_sposta4_diff > 0  &  mdf_collY_y_mm > 0)
                         { mdf_collY_sposta_4 = mdf_collY_sposta_4_inv }
                     }
                 }

              // 29.07.2020 aggiunto -MdfSys_SbordoYSup Ce81924 Uscito perche con modifica 03.07.2020 basy_CerCn > basy_trov + y_trov
              // un Case3 e' diventato giustamente un Case5 ma per 2mm la Cerniera non ci stava sopra
              // 26.11.2020 SL002458
              mdf_ctrl_SbordoY = VAR_VAL(idx_att, "MdfSys_SbordoYSup")
              if ( VAR_VAL(idx_att, "MCB_collY_Mansarda") > 0
                 & VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_Scocca") <= 0
                 )
                 { mdf_ctrl_SbordoY = 0 }

             // 23.02.2023
              // Se Divisione a 99 dall' alto la cerniera ci sta a 54 dall' alto
              // Se Divisione a 98 o meno dall' alto la cerniera non ci sta e quindi fare inversione sposta
              basy_trovCn = basy_trov+y_trov/2
             // 27.06.2023 Ce01113
              mdf_ctrl_Aly_Fia = VAR_VAL(PADRE(idx_att, 1), "Aly_Fia")
              mdf_exitBattuta_SX = VAR_VAL(PADRE(idx_att, 1), "exitBattuta_SX")
              if (IS_IDX(mdf_exitBattuta_SX) )
                 {
                  if (IS_MATCH(MdF_Apertura, "DX*") != 1)
                     { mdf_ctrl_Aly_Fia = VAR_VAL(mdf_exitBattuta_SX, "alto_0.y") }
                 }
              mdf_exitBattuta_DX = VAR_VAL(PADRE(idx_att, 1), "exitBattuta_DX")
              if (IS_IDX(mdf_exitBattuta_DX) )
                 {
                  if (IS_MATCH(MdF_Apertura, "SX*") != 1)
                     { mdf_ctrl_Aly_Fia = VAR_VAL(mdf_exitBattuta_DX, "alto_0.y") }
                 }

              mdf_quota_CnDivisione_altoFia = mdf_ctrl_Aly_Fia-basy_trovCn

              mcb_collY_Cer_LimDivAlto = VAR_VAL(idx_att, "MCB_collY_Cer_LimDivAlto")
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 > Y-mdf_ctrl_SbordoY-mdf_limite_pyCer_InfSup)
                 {
                  // Ce022225
                  // 27.06.2023 Ce1113
                  //if (mdf_quota_CnDivisione_altoFia >= mcb_collY_Cer_LimDivAlto  &  mdf_quota_CnDivisione_altoFia < mcb_collY_Cer_LimDivAlto+40)
                  if (mdf_quota_CnDivisione_altoFia >= mcb_collY_Cer_LimDivAlto  &  mdf_quota_CnDivisione_altoFia < mcb_collY_Cer_LimDivAlto+1)
                     {
                      mdf_quota_CnDivisione_deb = mdf_quota_CnDivisione_altoFia
                      mdf_collY_sposta_2 = Y-mdf_py_CerBat_ctrl-52.5
                     }
                 }

              dist_CentriLav_EleCer = basy_trov+y_trov/2 - basy_CerCn
              if (VAR_VAL(idx_att, "MCB_sposta_Cer_PASSO") > 1)
                 {
                  // Ce000901 -64 Ce000727 + 64
                  if (ABS(mdf_collY_sposta_2) > 32)
                     {
                      // Ce000727
                      if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 > Y-mdf_ctrl_SbordoY-mdf_limite_pyCer_InfSup)
                         {
                          mdf_collY_sposta_2 = mdf_collY_sposta_2_inv
                         }

                      // 24.05.2023 Ce052325 anche se in realta non doveva spostarsi perche corretto mdf_spostaCer_DOWN -2
                      if (mdf_spostaCer_DOWN > 0)
                         {
                          if (mdf_collY_sposta_2 > 0)
                             {
                              if (mdf_collY_sposta_2 < dist_CentriLav_EleCer)
                                 {
                                  mdf_collY_sposta_2 = mdf_collY_sposta_2_inv
                                 }
                             }
                         }

                      // Ce000901, Ce000727
                      if (mdf_collY_sposta_2 < 0)
                         {
                          if (ABS(mdf_collY_sposta_2)+dist_CentriLav_EleCer-MCB_sposta_Cer_PASSO >= mdf_collY_dist_ctrl)
                             {
                              mdf_collY_sposta_2 = mdf_collY_sposta_2+MCB_sposta_Cer_PASSO
                             }
                         }
                     }
                 // 06.02.2024 La00380 In teoria se mdf_collY_trovataCol 3 e si vuole MCB_collY_sposta_3 negativo e' improbabile
                  // che venga impostato -32 perche' -32 non sarà mai sufficiente
                  if (ABS(mdf_collY_sposta_3) > 10  &  ABS(mdf_collY_sposta_3) <= 32)
                     {
                      if (mdf_collY_sposta_3 < 0)
                         {
                          if (ABS(mdf_collY_sposta_3+dist_CentriLav_EleCer) < ABS(mdf_collY_dist_ctrl))
                             {
                              mdf_collY_sposta_3 = mdf_collY_sposta_3-MCB_sposta_Cer_PASSO
                             }
                         }
                     }
                 // 04.09.2024 La072118
                  if ( ABS(mdf_collY_sposta_5) > 10  &  ABS(mdf_collY_sposta_5) <= 32
                     & ABS(mdf_collY_sposta_5_inv) == ABS(mdf_collY_sposta_5)
                     )
                     {
                      // Questo controllo piu sotto farebbe prendere mdf_collY_sposta_5 = mdf_collY_sposta_5_inv che è negativo
                      // però mdf_collY_trovataCol 5 e sposta negativo non sarà mai sufficiente se solo -32
                      if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 > Y-mdf_ctrl_SbordoY-mdf_limite_pyCer_InfSup)
                         {
                          // dist_CentriLav_EleCer negativo, Cerniera sta sopra elemento
                          mdf_collY_sposta_5_dist_Centri = mdf_collY_sposta_5+dist_CentriLav_EleCer
                          if (mdf_collY_sposta_5 > 0  &  dist_CentriLav_EleCer < 0)
                             {
                              if (ABS(mdf_collY_sposta_5+dist_CentriLav_EleCer) < ABS(mdf_collY_dist_ctrl))
                                 {
                                  mdf_collY_sposta_5 = -mdf_collY_sposta_5-MCB_sposta_Cer_PASSO
                                  // mdf_collY_sposta_5 da positivo passa a negativo, pero -MCB_sposta_Cer_PASSO non e' ancora sufficiente
                                  // quindi devo stare attento ai segni +-
                                  if (ABS(mdf_collY_sposta_5-dist_CentriLav_EleCer) < ABS(mdf_collY_dist_ctrl))
                                     {
                                      mdf_collY_sposta_5 = mdf_collY_sposta_5-MCB_sposta_Cer_PASSO
                                     }
                                 }
                             }
                         }
                     }
                 }

              mdf_collY_sposta_2_Limite = mdf_collY_sposta_2

              // 23.02.2023 Cambiato -32-9 con -mdf_limite_pyCer_InfSup, cioe -52
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 > Y-mdf_ctrl_SbordoY-mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_1 = mdf_collY_sposta_1_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 > Y-mdf_ctrl_SbordoY-mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_2 = mdf_collY_sposta_2_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 > Y-mdf_ctrl_SbordoY-mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_3 = mdf_collY_sposta_3_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 > Y-mdf_ctrl_SbordoY-mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_4 = mdf_collY_sposta_4_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 > Y-mdf_ctrl_SbordoY-mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_5 = mdf_collY_sposta_5_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 > Y-mdf_ctrl_SbordoY-mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_6 = mdf_collY_sposta_6_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 > Y-mdf_ctrl_SbordoY-mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_7 = mdf_collY_sposta_7_inv }

             // Teoricamente non usate. Da non usare se c'e' la gestione Spostamento_Cerniere.dat
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_1_inv") )  { mdf_collY_sposta_1 = VAR_VAL(idx_att, "MCB_collY_sposta_1_inv") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_2_inv") )  { mdf_collY_sposta_2 = VAR_VAL(idx_att, "MCB_collY_sposta_2_inv") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_3_inv") )  { mdf_collY_sposta_3 = VAR_VAL(idx_att, "MCB_collY_sposta_3_inv") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_4_inv") )  { mdf_collY_sposta_4 = VAR_VAL(idx_att, "MCB_collY_sposta_4_inv") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_5_inv") )  { mdf_collY_sposta_5 = VAR_VAL(idx_att, "MCB_collY_sposta_5_inv") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_6_inv") )  { mdf_collY_sposta_6 = VAR_VAL(idx_att, "MCB_collY_sposta_6_inv") }
              if (VAR_EXIST(idx_att, "MCB_collY_sposta_7_inv") )  { mdf_collY_sposta_7 = VAR_VAL(idx_att, "MCB_collY_sposta_7_inv") }

              if (mcb_collY_sposta_Sup > -999)
                 {
                  // 12.07.2019 aggiunto MdfSys_SbordoYSup
                  if (basy_CerCn + 200 > alto_0.y - VAR_VAL(idx_att, "MdfSys_SbordoYSup"))
                     {
                      mdf_collY_sposta_1 = mcb_collY_sposta_Sup
                      mdf_collY_sposta_2 = mdf_collY_sposta_1
                      mdf_collY_sposta_3 = mdf_collY_sposta_1
                      mdf_collY_sposta_4 = mdf_collY_sposta_1
                      mdf_collY_sposta_5 = mdf_collY_sposta_1
                      mdf_collY_sposta_6 = mdf_collY_sposta_1
                      mdf_collY_sposta_7 = mdf_collY_sposta_1

                     // 08.04.2022 St252905
                      if (mdf_collY_sposta_5 <= 40  &  ABS(mdf_collY_sposta_5_inv) <= 40)
                         {
                          mdf_collY_sposta_5_inv = -mdf_collY_sposta_5-mdf_collY_y_mm
                         }

                     // 23.05.2025 St 946549
                      if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 > Y-mdf_ctrl_SbordoY-mdf_limite_pyCer_InfSup)
                         {
                          mdf_collY_sposta_3_prec = mdf_collY_sposta_3
                          if ( mcb_collY_sposta_Sup_2 > -400
                             & mcb_collY_sposta_Sup_2 < 0
                             & ABS(mcb_collY_sposta_Sup_2) > ABS(mdf_collY_sposta_3_inv)
                             )
                             { mdf_collY_sposta_3 = mcb_collY_sposta_Sup_2 }
                          else
                             { mdf_collY_sposta_3 = mdf_collY_sposta_3_inv }

                          // mdf_collY_y_mm e negativo se mdf_collY_trovataCol=3
                          // Se negativo e mdf_collY_trovataCol=3 per forza di cose non basta
                          if (mdf_collY_sposta_3 < 0  &  ABS(mdf_collY_sposta_3) < mdf_collY_dist_ctrl)
                             {
                              mdf_collY_sposta_3 = mdf_collY_sposta_3+mdf_collY_y_mm
                              mdf_collY_sposta_3_NegMin = mdf_collY_sposta_3
                              mdf_collY_sposta_3_inv = mdf_collY_sposta_3
                             }
                         }

                      if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 > Y-mdf_ctrl_SbordoY-mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_5 = mdf_collY_sposta_5_inv }

                      if (mcb_collY_sposta_Sup_2 > -999)
                         {
                         // 08.10.2021 St177932
                          if (mdf_collY_sposta_1 > 0 & mdf_collY_sposta_1 - mdf_collY_dist_ctrl < mdf_collY_y_mm)  { mdf_collY_sposta_1 = mcb_collY_sposta_Sup_2 }
                          if (mdf_collY_sposta_2 > 0 & mdf_collY_sposta_2 - mdf_collY_dist_ctrl < mdf_collY_y_mm)  { mdf_collY_sposta_2 = mcb_collY_sposta_Sup_2 }
                          if (mdf_collY_sposta_3 > 0 & mdf_collY_sposta_3 - mdf_collY_dist_ctrl < mdf_collY_y_mm)  { mdf_collY_sposta_3 = mcb_collY_sposta_Sup_2 }
                         // 03.07.2018
                         // 05.05.2020 se sono case 5 significa che sono sopra all' elemento, quindi se aggiungo lo sposta per esser fuori dalla collisione deve essere > di mdf_collY_dist_ctrl
                          //if (mdf_collY_sposta_5 > 0 & mdf_collY_sposta_5 - mdf_collY_dist_ctrl < mdf_collY_y_mm)
                          // 166572                    34.5 +20  <  40  = No, quindi non entrare, mi va bene MCB_collY_sposta_Sup
                          if (mdf_collY_sposta_5 > 0 & mdf_collY_y_mm+mdf_collY_sposta_5 < mdf_collY_dist_ctrl)
                             {
                              // 05.09.2018 altrimenti per id_collision 5 non ha senso, perché va ancora piu in collisione
                              if (ABS(mcb_collY_sposta_Sup_2) > ABS(mdf_collY_sposta_5) )
                                 {
                                  // 166572 mdf_collY_y_mm 34.5 -60  >  40
                                  // altrimenti resta in collisione e quindi conviene mantenere MCB_collY_sposta_Sup
                                  // 06.05.2020 19221, 19627
                                  //if (ABS(mdf_collY_y_mm+mcb_collY_sposta_Sup_2) > mdf_collY_dist_ctrl)
                                  if (ABS(mdf_collY_y_mm+mcb_collY_sposta_Sup_2) > yCer)
                                     {
                                      mdf_collY_sposta_5 = mcb_collY_sposta_Sup_2
                                      mdf_collY_sposta_5_Sup_2 = mdf_collY_sposta_5
                                     }
                                 }
                             }
                         // 26.07.2018
                          if (mdf_collY_sposta_6 > 0 & mdf_collY_sposta_6 - mdf_collY_dist_ctrl < mdf_collY_y_mm)  { mdf_collY_sposta_6 = mcb_collY_sposta_Sup_2 }
                         }

                      if (mcb_collY_sposta_Sup_Inv > -999)
                         {
                          mdf_collY_sposta_1_inv = mcb_collY_sposta_Sup_Inv
                          mdf_collY_sposta_2_inv = mdf_collY_sposta_1_inv
                          mdf_collY_sposta_3_inv = mdf_collY_sposta_1_inv
                          mdf_collY_sposta_4_inv = mdf_collY_sposta_1_inv
                          mdf_collY_sposta_5_inv = mdf_collY_sposta_1_inv
                          mdf_collY_sposta_6_inv = mdf_collY_sposta_1_inv
                          mdf_collY_sposta_7_inv = mdf_collY_sposta_1_inv
                         }
                     }
                 }
              if (mcb_collY_sposta_Inf > -999)
                 {
                  // 12.07.2019 aggiunto MdfSys_SbordoYInf
                  if (basy_CerCn - 200 < base_0.y + VAR_VAL(idx_att, "MdfSys_SbordoYInf"))
                     {
                      mdf_collY_sposta_1 = mcb_collY_sposta_Inf
                      mdf_collY_sposta_2 = mdf_collY_sposta_1
                      mdf_collY_sposta_3 = mdf_collY_sposta_1
                      mdf_collY_sposta_4 = mdf_collY_sposta_1
                      mdf_collY_sposta_5 = mdf_collY_sposta_1
                      mdf_collY_sposta_6 = mdf_collY_sposta_1
                      mdf_collY_sposta_7 = mdf_collY_sposta_1
                      if (mcb_collY_sposta_Inf_2 > -999)
                         {
                          if (mdf_collY_sposta_2 > 0 & mdf_collY_sposta_2 - mdf_collY_dist_ctrl < mdf_collY_y_mm)  { mdf_collY_sposta_2 = mcb_collY_sposta_Inf_2 }
                          if (mdf_collY_sposta_3 > 0 & mdf_collY_sposta_3 - mdf_collY_dist_ctrl < mdf_collY_y_mm)  { mdf_collY_sposta_3 = mcb_collY_sposta_Inf_2 }
                         }

                      if (mcb_collY_sposta_Inf_Inv > -999)
                         {
                          mdf_collY_sposta_1_inv = mcb_collY_sposta_Inf_Inv
                          mdf_collY_sposta_2_inv = mdf_collY_sposta_1_inv
                          mdf_collY_sposta_3_inv = mdf_collY_sposta_1_inv
                          mdf_collY_sposta_4_inv = mdf_collY_sposta_1_inv
                          mdf_collY_sposta_5_inv = mdf_collY_sposta_1_inv
                          mdf_collY_sposta_6_inv = mdf_collY_sposta_1_inv
                          mdf_collY_sposta_7_inv = mdf_collY_sposta_1_inv
                         }
                     }
                 }

              if (VAR_EXIST(idx_att, "MCB_collY_dist_minimaCn") )
                 {
                  mdf_collY_dist_minima = VAR_VAL(idx_att, "MCB_collY_dist_minimaCn")
                  mdf_collY_sposta_1 = -1*mdf_collY_dist_minima
                  mdf_collY_sposta_2 = -1*mdf_collY_dist_minima + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  // 03.07.2020 come sotto
                  mdf_collY_sposta_3 = -1*mdf_collY_dist_minima + VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
                  mdf_collY_sposta_4 = -1*mdf_collY_dist_minima + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  mdf_collY_sposta_5 =  mdf_collY_dist_minima - 1*ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  mdf_collY_sposta_6 =  mdf_collY_dist_minima - 1*ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  mdf_collY_sposta_7 =  mdf_collY_dist_minima - 1*ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))

                  mdf_collY_sposta_1_inv = mdf_collY_dist_minima
                  mdf_collY_sposta_2_inv = mdf_collY_dist_minima + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  mdf_collY_sposta_3_inv = mdf_collY_dist_minima - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
                  mdf_collY_sposta_4_inv = mdf_collY_dist_minima + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  mdf_collY_sposta_5_inv = -1*mdf_collY_dist_minima - ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  mdf_collY_sposta_6_inv = -1*mdf_collY_dist_minima - ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  mdf_collY_sposta_7_inv = -1*mdf_collY_dist_minima - ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))

                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 < 32+9)  { mdf_collY_sposta_1 = mdf_collY_sposta_1_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 < 32+9)  { mdf_collY_sposta_2 = mdf_collY_sposta_2_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 < 32+9)  { mdf_collY_sposta_3 = mdf_collY_sposta_3_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 < 32+9)  { mdf_collY_sposta_4 = mdf_collY_sposta_4_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 < 32+9)  { mdf_collY_sposta_5 = mdf_collY_sposta_5_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 < 32+9)  { mdf_collY_sposta_6 = mdf_collY_sposta_6_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 < 32+9)  { mdf_collY_sposta_7 = mdf_collY_sposta_7_inv }

                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 > Y-32-9)  { mdf_collY_sposta_1 = mdf_collY_sposta_1_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 > Y-32-9)  { mdf_collY_sposta_2 = mdf_collY_sposta_2_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 > Y-32-9)  { mdf_collY_sposta_3 = mdf_collY_sposta_3_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 > Y-32-9)  { mdf_collY_sposta_4 = mdf_collY_sposta_4_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 > Y-32-9)  { mdf_collY_sposta_5 = mdf_collY_sposta_5_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 > Y-32-9)  { mdf_collY_sposta_6 = mdf_collY_sposta_6_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 > Y-32-9)  { mdf_collY_sposta_7 = mdf_collY_sposta_7_inv }

                  GOSUB MdF_Ctrl_Collis_CerBat_suc_prec
                 }

              if (VAR_EXIST(idx_att, "MCB_collY_dist_minima") )
                 {
                  mdf_collY_dist_minima = VAR_VAL(idx_att, "MCB_collY_dist_minima")
                  mdf_collY_sposta_1 = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2
                  mdf_collY_sposta_2 = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2 + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  // 03.07.2020
                  //mdf_collY_sposta_3 = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2 + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  mdf_collY_sposta_3 = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2 + VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
                  mdf_collY_sposta_4 = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2 + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  mdf_collY_sposta_5 =  mdf_collY_dist_minima + mdf_Y_Ele_CollY/2 - 1*ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  mdf_collY_sposta_6 =  mdf_collY_dist_minima + mdf_Y_Ele_CollY/2 - 1*ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  mdf_collY_sposta_7 =  mdf_collY_dist_minima + mdf_Y_Ele_CollY/2 - 1*ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))

                  mdf_collY_sposta_5_min_deb = mdf_collY_sposta_5
                  mdf_py_CB_sposta5_deb = mdf_py_CerBat_ctrl + mdf_collY_sposta_5

                  mdf_collY_sposta_1_inv = mdf_collY_dist_minima + mdf_Y_Ele_CollY/2
                  mdf_collY_sposta_2_inv = mdf_collY_dist_minima + mdf_Y_Ele_CollY/2 - ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  // 13.01.2025 T2025OCL000009 se MCB_collY_dist_minima < mdf_collY_dist_ctrl
                  // Teoricamente per forza di cose userebbe lo sposta_2_inv solo se mdf_spostaCer_DOWN però per ora tengo così
                  if (mdf_spostaCer_DOWN > 0)
                     {
                      mdf_Collision_y_mm = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
                      if (id_collision == 1)  { mdf_collY_sposta_2_DOWN1 = mdf_collY_sposta_2 }
                      if (ABS(mdf_Collision_y_mm) < mdf_collY_dist_ctrl)
                         {
                          mdf_collY_sposta_2_DOWN = mdf_collY_sposta_2
                          mdf_collY_sposta_2_inv = mdf_collY_dist_minima + mdf_Y_Ele_CollY/2 + mdf_Collision_y_mm
                         }
                     }
                  mdf_collY_sposta_3_inv = mdf_collY_dist_minima + mdf_Y_Ele_CollY/2 - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
                  mdf_collY_sposta_4_inv = mdf_collY_dist_minima + mdf_Y_Ele_CollY/2 - ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                 // 20.03.2024 H24006903
                  //mdf_collY_sposta_5_inv = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2 + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  mdf_collY_sposta_5_inv = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2 - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
                  mdf_collY_sposta_6_inv = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2 + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                  mdf_collY_sposta_7_inv = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2 + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))

                  mdf_collY_sposta_5_inv_min_deb = mdf_collY_sposta_5_inv

                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 < 32+9)  { mdf_collY_sposta_1 = mdf_collY_sposta_1_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 < 32+9)  { mdf_collY_sposta_2 = mdf_collY_sposta_2_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 < 32+9)  { mdf_collY_sposta_3 = mdf_collY_sposta_3_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 < 32+9)  { mdf_collY_sposta_4 = mdf_collY_sposta_4_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 < 32+9)  { mdf_collY_sposta_5 = mdf_collY_sposta_5_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 < 32+9)  { mdf_collY_sposta_6 = mdf_collY_sposta_6_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 < 32+9)  { mdf_collY_sposta_7 = mdf_collY_sposta_7_inv }

                 // 13.12.2021 il limite corretto sarebbe 52 = 33.5+18+0.5 Per ora cambio solo il Case 1 che capita raramente
                  //if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 > Y-32-9)  { mdf_collY_sposta_1 = mdf_collY_sposta_1_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 > Y-mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_1 = mdf_collY_sposta_1_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 > Y-32-9)  { mdf_collY_sposta_2 = mdf_collY_sposta_2_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 > Y-32-9)  { mdf_collY_sposta_3 = mdf_collY_sposta_3_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 > Y-32-9)  { mdf_collY_sposta_4 = mdf_collY_sposta_4_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 > Y-32-9)  { mdf_collY_sposta_5 = mdf_collY_sposta_5_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 > Y-32-9)  { mdf_collY_sposta_6 = mdf_collY_sposta_6_inv }
                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 > Y-32-9)  { mdf_collY_sposta_7 = mdf_collY_sposta_7_inv }

                  GOSUB MdF_Ctrl_Collis_CerBat_suc_prec
                 }

             // 28.10.2021 H16000012, 17004445
              if ( mdf_arch_n > 2
                 | mdf_spostaCer_UP == 7
                 )
                 {
                  // Primo controllo doppia collisione, trova ripiano, ma lo spostamento andrebbe a toccare il Coperchio
                  // quindi spostamento invece che verso l' alto lo faccio verso il basso
                  // Per ora solo se mdf_ctrl_SbordoY e Case 5.
                  // Tra l' altro i casi in questione avevano il Taglio mansarda
                  mdf_ctrl_SbordoY = VAR_VAL(idx_att, "MdfSys_SbordoYSup")
                  if ( mdf_ctrl_SbordoY > 120
                     | mdf_spostaCer_UP == 7
                     )
                     {
                      mdf_collY_sposta_Temp = VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_collY_trovataCol)))
                     // 22.11.2021 St204274
                      if (VAR_EXIST(idx_att, "mdf_collY_dist_minima") )
                         {
                         // 18.01.2022 sistemato
                          if (IS_MATCH(mdF_collY_archetipo2, "*Cop*") )
                             {
                              NEAR_GLOBALE("mdf_collY_vic_ar2", idx_att, dist_Coll+mdf_collY_sposta_Temp, 1, mdF_collY_archetipo2)
                              if (mdf_collY_vic_ar2 > 0)
                                 {
                                  basyCop = VAR_VAL(mdf_collY_vic_ar2[1], "base_0.y")
                                  mdf_basyCop_basy_CerCn_deb = basyCop-basy_CerCn
                                  if (ABS(basyCop-basy_CerCn) - ABS(mdf_collY_sposta_Temp) < ABS(mdf_collY_dist_minima))
                                     {
                                      mdf_collY_sposta_arch2 = -mdf_collY_dist_minima - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
                                      if (mdf_collY_trovataCol == 5)  { mdf_collY_sposta_5 = mdf_collY_sposta_arch2 }
                                     }
                                 }
                             }
                         // 18.01.2022 Scn000231 alto ripiano a 43 dal centro cer dist_minima 48
                         // ma centro Cer a 61 da sotto coperchio a 50
                          // Vedi anche Scn000263 collisione con StrutturaCassCest
                          if (IS_MATCH(mdF_collY_archetipo4, "*Cop*") )
                             {
                              NEAR_GLOBALE("mdf_collY_vic_ar4", idx_att, dist_Coll+mdf_collY_sposta_Temp, 1, mdF_collY_archetipo4)
                              if (mdf_collY_vic_ar4 > 0)
                                 {
                                  basyCop = VAR_VAL(mdf_collY_vic_ar4[1], "base_0.y")
                                  mdf_basyCop_basy_CerCn_deb = basyCop-basy_CerCn
                                  if (ABS(basyCop-basy_CerCn) - ABS(mdf_collY_sposta_Temp) < ABS(mdf_collY_dist_minima))
                                     {
                                      mdf_collY_sposta_arch4 = -mdf_collY_dist_minima - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
                                      if (mdf_collY_trovataCol == 5)  { mdf_collY_sposta_5 = mdf_collY_sposta_arch4 }
                                     }
                                 }
                             }
                         }
                     }
                 }

              // 04.08.2020 come sopra
              //mdf_arch_n=1
              //while (mdf_arch_n < 10)
              if (IS_MATCH(NOME(idx_troCol), VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n)))) == 1)
                 {
                  mdf_ctrl_dist_arch = 0
                  if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_minCn_arch", STR(mdf_arch_n))) )
                     {
                      mdf_ctrl_dist_arch_maked = 1
                      mdf_nome_arch = VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n)))
                      mdf_collY_dist_minima = VAR_VAL(idx_att, STRCAT("MCB_collY_dist_minCn_arch", STR(mdf_arch_n)))
                     // 14.06.2018
                      if (mdf_ele_intern_VarVAL_dist_arch > 0)
                         {
                          mdf_collY_dist_minima = mdf_ele_intern_VarVAL_dist_arch
                         }

                      if (ABS(mdf_collY_dist_minima) >= ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))) )
                         {
                          mdf_ctrl_dist_arch = 1
                          mdf_case_collision = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"))
                          if (mdf_case_collision <= 4)
                             {
                              if (mdf_collY_dist_minima > 0)
                                 { mdf_collY_sposta_1 = mdf_collY_dist_minima + VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) }
                              else
                                 { mdf_collY_sposta_1 = -1*(ABS(mdf_collY_dist_minima) - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))) }

                              _mdf_collY_sposta_archdebug = mdf_collY_sposta_1
                             }
                          else
                             {
                              if (mdf_collY_dist_minima > 0)
                                 { mdf_collY_sposta_1 = mdf_collY_dist_minima - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) }
                              else
                                 { mdf_collY_sposta_1 = -1*(ABS(mdf_collY_dist_minima) + VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))) }

                              _mdf_collY_sposta_archdebug_2 = mdf_collY_sposta_1
                             }
                         }

                      if (mdf_ctrl_dist_arch > 0)
                         {
                          mdf_collY_sposta_2 = mdf_collY_sposta_1
                          mdf_collY_sposta_3 = mdf_collY_sposta_1
                          mdf_collY_sposta_4 = mdf_collY_sposta_1
                          mdf_collY_sposta_5 = mdf_collY_sposta_1
                          mdf_collY_sposta_6 = mdf_collY_sposta_1
                          mdf_collY_sposta_7 = mdf_collY_sposta_1

                          mdf_nome_var_sposta_arch = STRCAT("MCB_collY_sposta_", mdf_nome_arch)
                         // 23.09.2024
                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) != 1)
                             {
                              mdf_var_length = STRLEN(mdf_nome_var_sposta_arch)
                              mdf_nome_var_sposta_arch_orig = mdf_nome_var_sposta_arch
                              mdf_var_length_w = mdf_var_length-1
                              while ( mdf_var_length_w > 19
                                 & VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) != 1
                                 )
                                 {
                                  mdf_nome_var_sposta_arch = STRMID(0, mdf_var_length_w, mdf_nome_var_sposta_arch_orig)
                                  mdf_var_length_w = mdf_var_length_w-1
                                 }
                             }

                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) )  { mdf_collY_sposta_1 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) }
                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_2")) )  { mdf_collY_sposta_2 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_2")) }
                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_3")) )  { mdf_collY_sposta_3 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_3")) }
                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_4")) )  { mdf_collY_sposta_4 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_4")) }
                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_5")) )  { mdf_collY_sposta_5 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_5")) }
                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_6")) )  { mdf_collY_sposta_6 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_6")) }
                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_7")) )  { mdf_collY_sposta_7 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_7")) }

                         // 11.06.2018
                          GOSUB MCB_CollY_sposta_Cer_Sup_Inf
                         }
                     }
                 }

              // 04.08.2020 Come sopra
              // spostamento calcolato tra ingombro Archetipo e Centro Cerniera-Basetta
              if (IS_MATCH(NOME(idx_troCol), VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n)))) == 1)
                 {
                  // 26.07.2022 sarebbe un baco perche e' gia azzerato sopra per la stessa if, ma se poi entra in MCB_collY_dist_minCn_arch me lo azzererebbe
                  // Siccome MCB_collY_dist_minCn_arch e' usato poco non e' mai uscito
                  //mdf_ctrl_dist_arch = 0
                  if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n))) )
                     {
                      mdf_ctrl_dist_arch_maked = 2
                      mdf_nome_arch = VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n)))
                      mdf_collY_dist_minima = VAR_VAL(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n)))
                     // 14.06.2018
                      if (mdf_ele_intern_VarVAL_dist_arch != 0)
                         {
                          mdf_collY_dist_minima = mdf_ele_intern_VarVAL_dist_arch
                         }
                      if (ABS(mdf_collY_dist_minima) >= ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))) -mdf_Y_Ele_CollY/2)
                         {
                          mdf_ctrl_dist_arch = 1
                          mdf_case_collision = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"))
                          if (mdf_case_collision <= 4)
                             {
                              mdf_collY_sposta_archContr2 = -1*(ABS(mdf_collY_dist_minima) - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))) - mdf_Y_Ele_CollY/2
                              if (mdf_collY_dist_minima > 0)
                                 {
                                  mdf_collY_sposta_1 = mdf_collY_dist_minima + VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) + mdf_Y_Ele_CollY/2
                                  mdf_collY_sposta_att_Case2 = mdf_collY_sposta_1

                                  mdf_inverti_sposta_arch = 0
                                 // 04.03.2022 Sc1022005395 per 0.5 spostava la cerniera a +253.5 in collisione con il cestone
                                  if ( mdf_collY_sposta_1 > 60
                                     & mdf_collY_sposta_1 > mdf_Y_Ele_CollY/2
                                     & mdf_py_CerBat_ctrl < 195
                                     & mdf_py_CerBat_ctrl > 18+27
                                     // 11.12.2023 Sc1023105773 la CerInf veniva messa a 46, 5mm sopra Fondo
                                     & mdf_py_CerBat_ctrl + mdf_collY_sposta_archContr2 > mdf_limite_pyCer_InfSup
                                     )
                                     { mdf_inverti_sposta_arch = 1 }

                                 // 19.07.2023 Sc1054868 Cer centrale per 36 spostava la cerniera in collisione con il cestone a +99 invece che -26.9
                                  if ( mdf_collY_sposta_1 > 70
                                     & mdf_collY_sposta_1 > mdf_Y_Ele_CollY/2
                                     & mdf_py_CerBat_ctrl > Y/2+60
                                     & mdf_py_CerBat_ctrl < Y-180
                                     & ABS(mdf_collY_sposta_archContr2) < 35
                                     )
                                     {
                                      mdf_collY_sposta_1_attCn = mdf_collY_sposta_1
                                      mdf_inverti_sposta_arch = 2
                                     }

                                  if (mdf_inverti_sposta_arch > 0)
                                     {
                                      if (ABS(mdf_collY_sposta_archContr2) < mdf_collY_sposta_1)
                                         {
                                          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_archContr2 > 18+27)
                                             {
                                              mdf_collY_sposta_1 = mdf_collY_sposta_archContr2
                                             }
                                         }
                                     }
                                 // 17.03.2023 Sc1054283
                                  if ( mdf_collY_sposta_1 > 60
                                     & mdf_collY_sposta_1 > mdf_Y_Ele_CollY/2
                                     // Seconda cer dall' alto per -3.5 la spostava a +111.5 che tra l' altro andava sopra all' altra cer
                                     & Y-mdf_py_CerBat_ctrl < 250
                                     & Y-mdf_py_CerBat_ctrl > 150
                                     )
                                     {
                                      if ( ABS(mdf_collY_sposta_archContr2) < mdf_collY_sposta_1
                                         & ABS(mdf_collY_sposta_archContr2) < 15
                                         )
                                         {
                                          mdf_collY_sposta_1 = mdf_collY_sposta_archContr2
                                         }
                                     }
                                 // 29.07.2020 Sc1020052003 Case2
                                 // 13.12.2021 Sc1304448 Case1 mdf_limite_pyCer_InfSup = 67/2 + 18 + 0.5
                                  //if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 > Y-VAR_VAL(idx_att, "MdfSys_SbordoYSup")-32-9)  { mdf_collY_sposta_1 = -1*(mdf_collY_dist_minima - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) + mdf_Y_Ele_CollY/2) }
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 > Y-VAR_VAL(idx_att, "MdfSys_SbordoYSup")-mdf_limite_pyCer_InfSup)  { mdf_collY_sposta_1 = -1*(mdf_collY_dist_minima - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) + mdf_Y_Ele_CollY/2) }
                                 }
                              else
                                 {
                                  mdf_collY_sposta_1 = -1*(ABS(mdf_collY_dist_minima) - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))) - mdf_Y_Ele_CollY/2
                                 // 05.07.2023 Ce01415 -104 cestello Colonna molto vicino alle 2 ante mandava la cerniera Inf dell' anta sup troppo in basso, fuori dall' anta
                                  // melgio +117
                                  if ( mdf_collY_sposta_1 < -60
                                     & ABS(mdf_collY_sposta_1) > mdf_Y_Ele_CollY/2
                                    // Se sono la cerniere Inf meglio che non mi sposti troppo verso il basso, anzi non puoi proprio mettermi fuori limite
                                     & mdf_py_CerBat_ctrl < 195
                                     & mdf_py_CerBat_ctrl+mdf_collY_sposta_1 < 18+0.5-1.5+35.5
                                     )
                                     {
                                      mdf_collY_sposta_1 = ABS(mdf_collY_dist_minima) + VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) + mdf_Y_Ele_CollY/2
                                      mdf_collY_sposta_archINFdeb = mdf_collY_sposta_1
                                     }
                                 }

                              _mdf_collY_sposta_archdebug = mdf_collY_sposta_1
                             }
                          else
                             {
                              if (mdf_collY_dist_minima > 0)
                                 {
                                  mdf_collY_sposta_1_Case5_att = mdf_collY_sposta_1
                                  mdf_collY_sposta_1 = mdf_collY_dist_minima - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) + mdf_Y_Ele_CollY/2
                                 // 26.11.2019 26328
                                  _mdf_collY_sposta_archdebug_S1 = mdf_collY_sposta_1

                                  mdf_collY_sposta_ContrCase5 = -mdf_collY_dist_minima - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) - mdf_Y_Ele_CollY/2

                                 // 01.06.2021 Sc1051192 anche se e' sbagliato il posizionamento in RegFacc, se comunque sfugge non dobrebbe spostare troppo in alto la CerInf
                                  if ( mdf_collY_sposta_1 > 60
                                     & mdf_collY_sposta_1 > mdf_Y_Ele_CollY/2
                                    // Se sono la cerniere Inf meglio che non mi sposti troppo verso l' alto, vedi se puoi tenermi in basso
                                     & mdf_py_CerBat_ctrl < 195
                                     & mdf_py_CerBat_ctrl > 18+27
                                     )
                                     {
                                      // mdf_collY_trovataCol 6
                                      mdf_collY_sposta_att_Case6 = mdf_collY_sposta_1
                                      mdf_collY_sposta_ContrCase6 = -mdf_collY_dist_minima - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) - mdf_Y_Ele_CollY/2

                                      if (ABS(mdf_collY_sposta_ContrCase6) < mdf_collY_sposta_1)
                                         {
                                          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_ContrCase6 > 18+27)
                                             {
                                              mdf_collY_sposta_1 = mdf_collY_sposta_ContrCase6
                                             }
                                         }
                                     }

                                  // 26.11.2020 SL002458
                                  mdf_is_TagMansarda = 0
                                  if ( VAR_VAL(idx_att, "MCB_collY_Mansarda") > 0
                                     & VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_Scocca") <= 0
                                     )
                                     { mdf_is_TagMansarda = 1 }

                                  if (mdf_is_TagMansarda == 0)
                                     {
                                      // 22.05.2025 Sn 005238
                                      //if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 > Y-VAR_VAL(idx_att, "MdfSys_SbordoYSup")-32-9)  { mdf_collY_sposta_1 = -mdf_collY_sposta_1 - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) }
                                      if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 > Y-VAR_VAL(idx_att, "MdfSys_SbordoYSup")-mdf_limite_pyCer_InfSup)
                                         {
                                          // Mi pare un po' strano che il problema esca adesso, cassetto interno abbastanza in alto che sente per 1mm la cerniera a 68 dall' alto, quindi forse dipende da questo, che quella volta era su ripiano e non un elemento con Y piu grande di 32
                                          // Probabilmente è piu corretto mdf_collY_sposta_ContrCase5 e cambierebbe solo di pochi millimetri lo spostamente che c' era prima in caso di ripiano
                                          if (mdf_Y_Ele_CollY <= ABS(mdf_collY_dist_minima))
                                             {
                                              mdf_collY_sposta_1 = -mdf_collY_sposta_1 - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
                                             }
                                          else
                                             { mdf_collY_sposta_1 = mdf_collY_sposta_ContrCase5 }
                                         }
                                     }
                                 }
                              else
                                 {
                                  mdf_collY_sposta_1 = -1*(ABS(mdf_collY_dist_minima) + VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))) - mdf_Y_Ele_CollY/2
                                  _mdf_collY_sposta_archdebug_S2 = mdf_collY_sposta_1
                                  // 18.12.2020 funziona con Case 5 mdf_collY_trovataCol 5
                                  mdf_collY_sposta_1_Contr = -mdf_collY_dist_minima - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) + mdf_Y_Ele_CollY/2

                                  // 02.08.2024 PH2024OVB536752 Case5
                                  mdf_case_sposta_Y_ELe_Grande = 0
                                  if ( ABS(mdf_collY_sposta_1) > 330
                                     & ABS(mdf_collY_sposta_1_Contr) < ABS(mdf_collY_sposta_1)
                                     )
                                     { mdf_case_sposta_Y_ELe_Grande = 1 }

                                 // 04.11.2021 P567356 VanoCassaforte y 330, cerniera già piu in alto dell' elemento ma non ancora alla distanza richiesta
                                  // mdf_collY_dist_minima negativa ma mdf_spostaCer_UP e quindi mi basta poco spostamento verso l' alto per uscire dalla collisione
                                 // 12.05.2025 L11155 melgio +25 che -74 anche perchè poi andrebbe sopra all' altra cerniera che dovrebbe spostarsi pure lei
                                  //if ( mdf_spostaCer_UP >= 6
                                  if ( mdf_spostaCer_UP >= 5
                                     // 10.10.2022 Ce2022OCP101078_completo
                                     | mdf_spostaCer_UP == 2
                                     // 14.10.2022 CeOCP101480
                                     | mdf_spostaCer_UP == 3
                                     // 02.08.2024 PH2024OVB536752
                                     | mdf_case_sposta_Y_ELe_Grande > 0
                                     )
                                     {
                                      // 18.01.2022
                                      // Non solo se l' elemento e' molto grande, o meglio, anche se lo spostamento è di parecchio e quindi per i pesi-anta non va bene giro lo spostamento
                                      // In piu rischia che vada troppo vicina ad un' altra cerniera e venga eliminata per il controllo MCB_limDELCerVic MdfSys_DELCerVic
                                      // altrimenti se ho dist_minima negativa e' perchè voglio come prima scelta lo spostamento verso il basso
                                      // P245070 SI -177.5 quinta cer, va bene anche se + 78.5 (diff 99) sarebbe meglio, ma ormai è passato così
                                      // P000012 NO -209.5 terza cer meglio fare +46.5, altrimenti va sopra ad altra Cer
                                      // P245076 SI -113.5 quinta cer resta meglio di +14.5
                                      // 24.01.2022
                                      // P248165 SI -225.5 quarta cer meglio di +30.5 YFro=2558 XFro=478 4cer ma terza escl + quinta attiva
                                      // P245348 SI -110.5 terza  cer meglio di +17.5 YFro=2398 XFro=639 6cer
                                      mcb_LimMax_SpostaContr = 115
                                      if (id_collision > 2)
                                         {
                                          if (id_collision == 4)
                                             {
                                              mdf_collY_sposta_1_deb4 = mdf_collY_sposta_1
                                              mdf_collY_sposta_1_Contr_deb4 = mdf_collY_sposta_1_Contr
                                             }
                                          if (id_collision == 5)
                                             {
                                              mdf_collY_sposta_1_deb5 = mdf_collY_sposta_1
                                              mdf_collY_sposta_1_Contr_deb5 = mdf_collY_sposta_1_Contr
                                             }
                                          if (Y > 2000)
                                             {
                                              COMPONENTI2("mdf_NumCerBas", idx_att, "MdF_CernieraBasetta_Batt")
                                              if (mdf_NumCerBas <= 4)  { mcb_LimMax_SpostaContr = 230 }
                                             }
                                          // 14.10.2022 CeOCP101480 Base con cassetti seconda cer in alto a passo 96
                                          // meglio -210 (cosi va al centro) che +1
                                          if (id_collision == 3)
                                             {
                                              if ( Y < 999
                                                 & mdf_py_CerBat_ctrl+200 > Y
                                                 )
                                                 {
                                                  COMPONENTI2("mdf_NumCerBas", idx_att, "MdF_CernieraBasetta_Batt")
                                                  if (mdf_NumCerBas <= 3)  { mcb_LimMax_SpostaContr = 230 }
                                                 }
                                             }
                                         }
                                      if (VAR_EXIST(idx_att, "MCB_LimMax_SpostaContr") )  { mcb_LimMax_SpostaContr = VAR_VAL(idx_att, "MCB_LimMax_SpostaContr") }

                                      if ( ABS(mdf_collY_sposta_1) > mcb_LimMax_SpostaContr
                                         & ABS(mdf_collY_sposta_1_Contr) < 50
                                         )
                                         {
                                          mdf_collY_sposta_1 = mdf_collY_sposta_1_Contr
                                         }
                                      mdf_py_CerBat_PiuSpostaContr = mdf_py_CerBat_ctrl+mdf_collY_sposta_1_Contr
                                     // 10.10.2022 Ce00378 NO -140 quinta cer (terza dal basso), meglio +80
                                      if ( y_trov > 2*yCer
                                         & ABS(mdf_collY_sposta_1) > mcb_LimMax_SpostaContr
                                         & ABS(mdf_collY_sposta_1_Contr) < ABS(mdf_collY_sposta_1)-59
                                         // 24.10.2023 ScBROWSER2000687
                                         & mdf_py_CerBat_ctrl+mdf_collY_sposta_1_Contr < Y-mdf_limite_pyCer_InfSup
                                         )
                                         {
                                          mdf_collY_sposta_1 = mdf_collY_sposta_1_Contr
                                         }

                                     // 18.04.2025 L00007 Meglio +9.5 che -89.5 che fa spostare anche la cerniera in accoppiata 108
                                      if ( ABS(mdf_collY_sposta_1) > 70
                                         // 12.05.2025 L11155 melgio +25 che -74 anche perchè poi andrebbe sopra all' altra cerniera che dovrebbe spostarsi pure lei
                                         //& ABS(mdf_collY_sposta_1_Contr) < ABS(mdf_collY_sposta_1)-69
                                         & ABS(mdf_collY_sposta_1_Contr) < ABS(mdf_collY_sposta_1)-47
                                         & mdf_collY_sposta_1 < 0
                                         // +10 perchè non voglio la cerniera troppo filo alto con il pianoFisso che mi fa un vano piccolo dove ci sarebbe anche cerniera/basetta
                                         // In quel caso melgio andare verso il basso. Anche se con cer a 192 dall' alto non potrebbe mai succedere
                                         & mdf_py_CerBat_ctrl+mdf_collY_sposta_1_Contr+10 < Y-mdf_limite_pyCer_InfSup
                                         & mdf_py_CerBat_ctrl+220 > Y
                                         )
                                         {
                                          mdf_py_CerBat_PiuSposta = mdf_py_CerBat_ctrl+mdf_collY_sposta_1
                                          py_CerCn_Suc1 = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(id_collision+1)))

                                          ipy=1
                                          while (ipy <= 6)
                                             {
                                              py_CerCn_SucN = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(id_collision+ipy)))
                                              // Se cerniera in accoppiata
                                              if ( py_CerCn_SucN < mdf_py_CerBat_ctrl
                                                 & ABS(py_CerCn_SucN-mdf_py_CerBat_PiuSposta) < 60
                                                 )
                                                 {
                                                  mdf_collY_sposta_1 = mdf_collY_sposta_1_Contr
                                                  ipy = ipy+999
                                                 }
                                              ipy = ipy+1
                                             }
                                         }
                                     }
                                 }

                              _mdf_collY_sposta_archdebug_2 = mdf_collY_sposta_1
                             }
                         }

                      if (mdf_ctrl_dist_arch > 0)
                         {
                          mdf_collY_sposta_2 = mdf_collY_sposta_1
                          mdf_collY_sposta_3 = mdf_collY_sposta_1
                          mdf_collY_sposta_4 = mdf_collY_sposta_1
                          mdf_collY_sposta_5 = mdf_collY_sposta_1
                          mdf_collY_sposta_6 = mdf_collY_sposta_1
                          mdf_collY_sposta_7 = mdf_collY_sposta_1

                          mdf_nome_var_sposta_arch = STRCAT("MCB_collY_sposta_", mdf_nome_arch)

                         // 23.09.2024
                          // collY_dist_min_arch4 36
                          // collY_archetipo4 CatenaY_CM, CatenaZ_CM, CatenaAll_CM
                          // collY_sposta_CatenaY_CM_1...7
                          // collY_sposta_CatenaZ_CM_1...7
                          // collY_sposta_CatenaAll_CM_1...7
                          // Per non avere 7 righe di sposta per ogni nome Catena
                          // Posso mettere collY_archetipo4 Catena* e
                          // collY_sposta_Catena_1...7
                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) != 1)
                             {
                              mdf_var_length = STRLEN(mdf_nome_var_sposta_arch)
                              mdf_nome_var_sposta_arch_orig = mdf_nome_var_sposta_arch
                              mdf_var_length_w = mdf_var_length-1
                              while ( mdf_var_length_w > 19
                                 & VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) != 1
                                 )
                                 {
                                  mdf_nome_var_sposta_arch = STRMID(0, mdf_var_length_w, mdf_nome_var_sposta_arch_orig)
                                  mdf_var_length_w = mdf_var_length_w-1
                                 }
                             }

                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) )  { mdf_collY_sposta_1 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) }
                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_2")) )  { mdf_collY_sposta_2 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_2")) }
                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_3")) )  { mdf_collY_sposta_3 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_3")) }
                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_4")) )  { mdf_collY_sposta_4 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_4")) }
                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_5")) )  { mdf_collY_sposta_5 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_5")) }
                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_6")) )  { mdf_collY_sposta_6 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_6")) }
                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_7")) )  { mdf_collY_sposta_7 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_7")) }

                          if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_Sup_arch", STR(mdf_arch_n))) )
                             {
                              if (mcb_collY_sposta_Sup > -999)
                                 {
                                  mcb_collY_sposta_Sup = VAR_VAL(idx_att, STRCAT("MCB_collY_sposta_Sup_arch", STR(mdf_arch_n)))
                                 }
                              if (mcb_collY_sposta_Sup_2 > -999)
                                 {
                                  mcb_collY_sposta_Sup_2 = VAR_VAL(idx_att, STRCAT("MCB_collY_sposta_Sup_2_arch", STR(mdf_arch_n)))
                                 }
                             }

                          if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_Inf_arch", STR(mdf_arch_n))) )
                             {
                              if (mcb_collY_sposta_Inf > -999)
                                 {
                                  mcb_collY_sposta_Inf = VAR_VAL(idx_att, STRCAT("MCB_collY_sposta_Inf_arch", STR(mdf_arch_n)))
                                 }
                              if (mcb_collY_sposta_Inf_2 > -999)
                                 {
                                  mcb_collY_sposta_Inf_2 = VAR_VAL(idx_att, STRCAT("MCB_collY_sposta_Inf_2_arch", STR(mdf_arch_n)))
                                 }
                             }

                         // 12.09.2019
                          if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_1_arch", STR(mdf_arch_n))) )
                             { mdf_collY_sposta_1 = VAR_VAL(idx_att, STRCAT("MCB_collY_sposta_1_arch", STR(mdf_arch_n))) }
                          if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_2_arch", STR(mdf_arch_n))) )
                             {
                             // 11.07.2023 Sc1023033808 -32 con gli sposta VariabiliMdF, ma deve essere -32.5
                              mdf_collY_sposta_2_arch = VAR_VAL(idx_att, STRCAT("MCB_collY_sposta_2_arch", STR(mdf_arch_n)))
                              mdf_sposta2_troppo_poco = 0
                              if ( mdf_collY_sposta_2_arch < 0  &  ABS(mdf_collY_sposta_2_arch) < ABS(mdf_collY_sposta_2)
                                 & ABS(mdf_collY_sposta_2_arch) < mdf_collY_dist_ctrl
                                 )
                                 {
                                  //DISPLAY2(STRCAT("Controlla spostaCer2 ", STR(idx_att)))
                                  mdf_sposta2_troppo_poco = 1
                                  mdf_ctrl_spostaMeno32 = ABS(mdf_collY_sposta_2)+dist_CentriLav_EleCer-y_trov/2
                                 }

                              if (mdf_sposta2_troppo_poco == 0)
                                 {
                                  mdf_collY_sposta_2 = VAR_VAL(idx_att, STRCAT("MCB_collY_sposta_2_arch", STR(mdf_arch_n)))
                                 }
                             }
                          if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_3_arch", STR(mdf_arch_n))) )
                             { mdf_collY_sposta_3 = VAR_VAL(idx_att, STRCAT("MCB_collY_sposta_3_arch", STR(mdf_arch_n))) }
                          if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_4_arch", STR(mdf_arch_n))) )
                             { mdf_collY_sposta_4 = VAR_VAL(idx_att, STRCAT("MCB_collY_sposta_4_arch", STR(mdf_arch_n))) }
                          if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_5_arch", STR(mdf_arch_n))) )
                             { mdf_collY_sposta_5 = VAR_VAL(idx_att, STRCAT("MCB_collY_sposta_5_arch", STR(mdf_arch_n))) }
                          if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_6_arch", STR(mdf_arch_n))) )
                             { mdf_collY_sposta_6 = VAR_VAL(idx_att, STRCAT("MCB_collY_sposta_6_arch", STR(mdf_arch_n))) }
                          if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_7_arch", STR(mdf_arch_n))) )
                             { mdf_collY_sposta_7 = VAR_VAL(idx_att, STRCAT("MCB_collY_sposta_7_arch", STR(mdf_arch_n))) }

                          // 18.12.2020
                          if (VAR_EXIST(idx_att, "MCB_collY_sposta_SupLimNeg") == 1)
                             {
                              mcb_collY_sposta_SupLimNeg = VAR_VAL(idx_att, "MCB_collY_sposta_SupLimNeg")
                              if (basy_CerCn + mcb_collY_sposta_SupLimNeg + mdf_collY_sposta_1 < Y - VAR_VAL(idx_att, "MdfSys_SbordoYSup"))
                                 {
                                  if (VAR_VAL(idx_att, "mdf_collY_sposta_1_Contr") != 0)
                                     {
                                      mdf_collY_sposta_1 = mdf_collY_sposta_1_Contr
                                      mdf_collY_sposta_2 = mdf_collY_sposta_1
                                      mdf_collY_sposta_3 = mdf_collY_sposta_1
                                      mdf_collY_sposta_5 = mdf_collY_sposta_1
                                      mdf_collY_sposta_6 = mdf_collY_sposta_1
                                     }
                                 }
                             }

                          if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_SupLim_arch", STR(mdf_arch_n))) != 1)
                             {
                              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_1_arch", STR(mdf_arch_n))) )
                                 {
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 > Y-32-9)  { mdf_collY_sposta_1 = -mdf_collY_sposta_1 }
                                 }
                              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_2_arch", STR(mdf_arch_n))) )
                                 {
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 > Y-VAR_VAL(idx_att, "MdfSys_SbordoYSup")-32-9)  { mdf_collY_sposta_2 = -mdf_collY_sposta_2 }
                                 }
                              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_3_arch", STR(mdf_arch_n))) )
                                 {
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 > Y-32-9)  { mdf_collY_sposta_3 = -mdf_collY_sposta_3 }
                                 }
                              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_4_arch", STR(mdf_arch_n))) )
                                 {
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 > Y-32-9)  { mdf_collY_sposta_4 = -mdf_collY_sposta_4 }
                                 }
                              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_5_arch", STR(mdf_arch_n))) )
                                 {
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 > Y-32-9)  { mdf_collY_sposta_5 = -mdf_collY_sposta_5 }
                                 }
                              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_6_arch", STR(mdf_arch_n))) )
                                 {
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 > Y-32-9)  { mdf_collY_sposta_6 = -mdf_collY_sposta_6 }
                                 }
                              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_7_arch", STR(mdf_arch_n))) )
                                 {
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 > Y-32-9)  { mdf_collY_sposta_7 = -mdf_collY_sposta_7 }
                                 }
                             }

                          if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_InfLim_arch", STR(mdf_arch_n))) != 1)
                             {
                              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_1_arch", STR(mdf_arch_n))) )
                                 {
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 < 32+9)  { mdf_collY_sposta_1 = -mdf_collY_sposta_1 }
                                 }
                              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_2_arch", STR(mdf_arch_n))) )
                                 {
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 < 32+9)  { mdf_collY_sposta_2 = -mdf_collY_sposta_2 }
                                 }
                              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_3_arch", STR(mdf_arch_n))) )
                                 {
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 < 32+9)  { mdf_collY_sposta_3 = -mdf_collY_sposta_3 }
                                 }
                              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_4_arch", STR(mdf_arch_n))) )
                                 {
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 < 32+9)  { mdf_collY_sposta_4 = -mdf_collY_sposta_4 }
                                 }
                              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_5_arch", STR(mdf_arch_n))) )
                                 {
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 < 32+9)  { mdf_collY_sposta_5 = -mdf_collY_sposta_5 }
                                 }
                              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_6_arch", STR(mdf_arch_n))) )
                                 {
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 < 32+9)  { mdf_collY_sposta_6 = -mdf_collY_sposta_6 }
                                 }
                              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_7_arch", STR(mdf_arch_n))) )
                                 {
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 < 32+9)  { mdf_collY_sposta_7 = -mdf_collY_sposta_7 }
                                 }
                             }

                          if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_SupLim_arch", STR(mdf_arch_n))) )
                             {
                              if (basy_CerCn + 160 > alto_0.y - VAR_VAL(idx_att, "MdfSys_SbordoYSup"))
                                 {
                                  mdf_collY_sposta_s_archatt = VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_collY_trovataCol)))
                                  mdf_collY_sposta_Sup_arch = VAR_VAL(idx_att, STRCAT("MCB_collY_sposta_SupLim_arch", STR(mdf_arch_n)))

                                  mdf_collY_sposta_Sup_arch_calc = mdf_collY_sposta_s_archatt
                                  if (mdf_collY_sposta_Sup_arch < mdf_collY_sposta_s_archatt)
                                     { mdf_collY_sposta_Sup_arch_calc = mdf_collY_sposta_Sup_arch }

                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 > Y-32-9)  { mdf_collY_sposta_1 = mdf_collY_sposta_Sup_arch_calc }
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 > Y-32-9)  { mdf_collY_sposta_2 = mdf_collY_sposta_Sup_arch_calc }
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 > Y-32-9)  { mdf_collY_sposta_3 = mdf_collY_sposta_Sup_arch_calc }
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 > Y-32-9)  { mdf_collY_sposta_4 = mdf_collY_sposta_Sup_arch_calc }
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 > Y-32-9)  { mdf_collY_sposta_5 = mdf_collY_sposta_Sup_arch_calc }
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 > Y-32-9)  { mdf_collY_sposta_6 = mdf_collY_sposta_Sup_arch_calc }
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 > Y-32-9)  { mdf_collY_sposta_7 = mdf_collY_sposta_Sup_arch_calc }
                                 }
                             }

                          if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_InfLim_arch", STR(mdf_arch_n))) )
                             {
                              if (basy_CerCn - 160 < base_0.y + VAR_VAL(idx_att, "MdfSys_SbordoYInf"))
                                 {
                                  mdf_collY_sposta_i_archatt = VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_collY_trovataCol)))
                                  mdf_collY_sposta_Inf_arch = VAR_VAL(idx_att, STRCAT("MCB_collY_sposta_InfLim_arch", STR(mdf_arch_n)))

                                  mdf_collY_sposta_Inf_arch_calc = mdf_collY_sposta_i_archatt
                                  if (mdf_collY_sposta_Inf_arch < ABS(mdf_collY_sposta_i_archatt))
                                     { mdf_collY_sposta_Inf_arch_calc = mdf_collY_sposta_Inf_arch }

                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 < 32+9)  { mdf_collY_sposta_1 = mdf_collY_sposta_Inf_arch_calc }
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 < 32+9)  { mdf_collY_sposta_2 = mdf_collY_sposta_Inf_arch_calc }
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 < 32+9)  { mdf_collY_sposta_3 = mdf_collY_sposta_Inf_arch_calc }
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 < 32+9)  { mdf_collY_sposta_4 = mdf_collY_sposta_Inf_arch_calc }
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 < 32+9)  { mdf_collY_sposta_5 = mdf_collY_sposta_Inf_arch_calc }
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 < 32+9)  { mdf_collY_sposta_6 = mdf_collY_sposta_Inf_arch_calc }
                                  if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 < 32+9)  { mdf_collY_sposta_7 = mdf_collY_sposta_Inf_arch_calc }
                                 }
                             }

                         // 11.06.2018
                          GOSUB MCB_CollY_sposta_Cer_Sup_Inf
                         }
                     }
                 }

              // 08.08.2022
              mcb_gest_CollisCBTent = 0
              if ( IS_MATCH(NOME(idx_troCol), VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("mcb_arch", STR(1), "_CollisCBTent"))) == 1
                 | IS_MATCH(NOME(idx_troCol), VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("mcb_arch", STR(2), "_CollisCBTent"))) == 1
                // 19.07.2023
                 | IS_MATCH(NOME(idx_troCol), VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("mcb_arch", STR(3), "_CollisCBTent"))) == 1
                // 21.02.2025 PCL000039
                 | IS_MATCH(NOME(idx_troCol), VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("mcb_arch", STR(4), "_CollisCBTent"))) == 1
                 )
                 {
                  mcb_gest_CollisCBTent = 1
                  mcb_Sposta_Tent1 = VAR_VAL(PADRE(idx_att, 1), "mcb_Sposta_Tentativo1")
                  mcb_Sposta_Tent2 = VAR_VAL(PADRE(idx_att, 1), "mcb_Sposta_Tentativo2")
                  mcb_Sposta_Tent3 = VAR_VAL(PADRE(idx_att, 1), "mcb_Sposta_Tentativo3")
                  mcb_Sposta_Tent4 = VAR_VAL(PADRE(idx_att, 1), "mcb_Sposta_Tentativo4")
                  mcb_Sposta_Tent5 = VAR_VAL(PADRE(idx_att, 1), "mcb_Sposta_Tentativo5")
                  mcb_Sposta_Tent6 = VAR_VAL(PADRE(idx_att, 1), "mcb_Sposta_Tentativo6")

                  mdf_collY_sposta_att = VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_collY_trovataCol)))
                  mcb_dist_y_mm = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
                  spostaTent_n = 1
                  //VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), STRCAT("mcb_Sposta_Tent", STR(spostaTent_n)), 0, "")
                  //mdf_collY_spostaTent_Temp = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), STRCAT("mcb_Sposta_Tent", STR(spostaTent_n)))
                  mdf_collY_spostaTent_Temp = VAR_VAL(idx_att, STRCAT("mcb_Sposta_Tent", STR(spostaTent_n)))
                  mcb_collY_dist_Fon = 0.5+9+40
                  mcb_collY_dist_Cop = 0.5+9+40
                  basy_trovCn = basy_trov+y_trov/2
                  basy_CerCn = base_0.y + mdf_py_CerBat_ctrl
                  if (VAR_EXIST(PADRE(idx_att, 1), "MCB_collY_dist_Fon"))  { mcb_collY_dist_Fon = VAR_VAL(PADRE(idx_att, 1), "MCB_collY_dist_Fon") }
                  if (VAR_EXIST(PADRE(idx_att, 1), "MCB_collY_dist_Cop"))  { mcb_collY_dist_Cop = VAR_VAL(PADRE(idx_att, 1), "MCB_collY_dist_Cop") }
                  //Vedi anche MCB_collY_dist_Rip6T
                  ist = 1
                  mdf_pyCer_piu_spostaTent = mdf_py_CerBat_ctrl+mdf_collY_spostaTent_Temp
                  mdf_basyCerCn_spostBasCnTrov = ABS(basy_CerCn + mdf_collY_spostaTent_Temp - basy_trovCn)

                 // 25.11.2022 A112501
                  if (mdf_py_CerBat_ctrl+2*mcb_collY_dist_Cop > Y)
                     {
                      if (ABS(mdf_collY_spostaTent_Temp) < mcb_collY_dist_Cop)
                         { mdf_collY_spostaTent_Temp = mcb_collY_dist_Cop }
                     }

                  while (ist <= 6)
                     {
                      // 29.07.2024 AOCL088465 solo commento, in caso di modifica verificare anche questo ordine
                      if ( mdf_py_CerBat_ctrl+mdf_collY_spostaTent_Temp > Y-mcb_collY_dist_Cop
                         | ABS(basy_CerCn + mdf_collY_spostaTent_Temp - basy_trovCn) < mdf_collY_dist_ctrl
                         )
                         {
                          spostaTent_n = spostaTent_n+1
                          mdf_collY_spostaTent_Temp = VAR_VAL(idx_att, STRCAT("mcb_Sposta_Tent", STR(spostaTent_n)))
                         }
                      ist = ist+1
                     }
                  ist = 1
                  while (ist <= 6)
                     {
                      if ( mdf_py_CerBat_ctrl+mdf_collY_spostaTent_Temp < mcb_collY_dist_Fon
                         | ABS(basy_CerCn + mdf_collY_spostaTent_Temp - basy_trovCn) < mdf_collY_dist_ctrl
                         )
                         {
                          spostaTent_n = spostaTent_n+1
                          mdf_collY_spostaTent_Temp = VAR_VAL(idx_att, STRCAT("mcb_Sposta_Tent", STR(spostaTent_n)))
                         }
                      ist = ist+1
                     }

                  if (spostaTent_n <= 6)
                     {
                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_spostaTent_Temp, 0, "")
                      GOSUB MdF_Ctrl_Collis_CerBat_VicTent
                      // 17.03.2025 A 17476
                      GOSUB MdF_Ctrl_Collis_CerBat_2Ele_DivTent
                     }
                  else
                     { mcb_gest_CollisCBTent = -1 }
                 }

              if (mdf_ele_collY_Only_Msg == 0  &  mcb_gest_CollisCBTent <= 0)
                 {
                  mdf_collY_sposta = VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_collY_trovataCol)))
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta, 0, "")

                 // 13.03.2025 EM05540  per debug
                  mdf_collY_dist_minima_deb = VAR_VAL(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n)))
                  //mmm_FondoDiv = VAR_VAL(idx_att, "MCB_FondoDiv")
                  //COMANDO2(STRCAT("LOGMSG MdF_while_Collision idx_att=", STR(idx_att), " figlio di ", STR(PADRE(idx_att, 1)), " id_Cercollision=", STR(id_collision), " mdf_collY_dist_minima=", STR(mdf_collY_dist_minima_deb), " mdf_collY_sposta=", STR(mdf_collY_sposta), " mmm_FondoDiv=", STR(mmm_FondoDiv)))

                  // 22.01.2025 Ce02980
                  if (VAR_EXIST(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(id_collision))) )
                     {
                      mdf_collY_sposta_daCerVic_att = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(id_collision)))
                      if (mdf_collY_sposta_daCerVic_att < 0  &  mdf_collY_sposta < 0)
                         {
                          mdf_collY_sposta_att_2E_CV = mdf_collY_sposta
                          mdf_collY_sposta_2Ele_CV = mdf_collY_sposta_daCerVic_att+mdf_collY_sposta
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(id_collision)), mdf_collY_sposta_2Ele_CV, 0, "")
                         }
                     }

                 // 03.11.2017
                  GOSUB MdF_Ctrl_Collis_CerBat_CerVic
                 // 14.10.2022
                  GOSUB MdF_Ctrl_Collis_CerBat_2Ele
                 // 04.09.2023
                  GOSUB MdF_Ctrl_Collis_CerBat_2Ele_Diversi
                 }
             }

          if (mdf_ele_intern > 0)
             {
              GOSUB MdF_CollY_dist_ctrl_Sec
              // 23.11.2022
              GOSUB MdF_Ctrl_Collis_CerBat_CopFon
             }

          if (mdf_collY_trovataCol != 0)  { mdf_collY_att = mdf_collY_trovataCol }

          iCol = iCol+1
         }
   }

   PROCEDURA MdF_ele_intern_Collision
   {
      mdf_ele_internC = -99
      if (X < X_ele_collY)
         {
          mdf_ele_internC = 1.1

          // 23.03.2021 S1021027489 X 147 con angolo vuoto e cassettiera da 300 nell' altra parete C_collide 300
          mdf_ang_ele = ANG_TOT2(PADRE(idx_troCol, 1))
          mdf_ang_ele_idx = ANG_TOT2(idx_troCol)
          mdf_ang_mdf_att = ANG_TOT2(PADRE(idx_att, 1))
          mdf_ctrl_ang = 0
          if (ABS(mdf_ang_ele-mdf_ang_mdf_att) > 45 & ABS(mdf_ang_ele-mdf_ang_mdf_att) < 135)
             { mdf_ctrl_ang = 1 }
          if (ABS(mdf_ang_ele-mdf_ang_mdf_att) > 225 & ABS(mdf_ang_ele-mdf_ang_mdf_att) < 315)
             { mdf_ctrl_ang = 2 }

          mdf_per_X_ang = 0
          // In realta probabilmente non serve l' if sulla X, ma va fatto sempre se c'e' l' angolo
          // 08.09.2021 S1021080266 X 297 con cassettiera C_Collide X 600 nell' altra parete
          //if (X < 170)
          if (mdf_ctrl_ang > 0)
             {
              mdf_per_X_ang = X/7
              if (X >= 170)  { mdf_per_X_ang = X/3 }
              mdf_debug_per_X_ang = mdf_per_X_ang
              mdf_debug_per_X_ang_dist_02_ele = dist_02_ele
              mdf_debug_per_X_ang_ele_collY   = X_ele_collY
              mdf_debug_per_X_ang_dist_31_ele = dist_31_ele
              mdf_debug_per_X_ang_calc = X_ele_collY + X/2 + X/5 -mdf_per_X_ang
             }

         // 17.12.2021 AL904255
          mdf_angz_ele = VAR_VAL(idx_troCol, "ang_z")
          if (mdf_angz_ele > 175  &  mdf_angz_ele < 185)
             {
              Ba0_ele = [#base_0.x, 0, #base_0.z]
              Ba3_ele = [#base_3.x, 0, #base_3.z]

              dist_02_ele = DISTANZA(Ba0_att, Ba1_ele)
              dist_31_ele = DISTANZA(Ba3_att, Ba2_ele)
             }
          // Se l'elemento in collisione è tanto piu grande di me devo fare il /5 su me stesso
          // Dato che sono gia X < #X in questo modo comprendo meglio il caso
          if (dist_02_ele > X_ele_collY + X/2 + X/5 -mdf_per_X_ang  |  dist_31_ele > X_ele_collY + X/2 + X/5 -mdf_per_X_ang)
             { mdf_ele_internC = 0 }

          // 08.08.2018
          // Base Lavello 2ante con VascaLavello centrale molto larga, ma assolutamente non in collisione
          // 30.06.2020 PC000869
          //if (dist_02_ele > X_ele_collY + X/2 - X/5)
          // 14.07.2020 SC1020033208 vicino Base cassetti interni girata di 180 e piu profonda
          mdf_vic_girata180 = 0
          dist_32_ele = DISTANZA(Ba3_att, Ba2_ele)
          if (dist_02_ele > X_ele_collY + mcb_dist_min_X + 10)
             {
              if (dist_32_ele > X_ele_collY + mcb_dist_min_X + 15)
                 { mdf_vic_girata180 = 1 }
             }
          if ( dist_02_ele > X_ele_collY + mcb_dist_min_X + 20
             | mdf_vic_girata180 > 0
             )
             {
              dist_01_ele = DISTANZA(Ba0_att, Ba1_ele)
              // Apertura SX dist_01_ele > mcb_dist_min_X+10 così è certo che non è in collisione
              if (dist_31_ele > mcb_dist_min_X+10  &  dist_01_ele > mcb_dist_min_X+10)
                 {
                  if (IS_MATCH(MdF_Apertura, "SX*") == 1)  { mdf_ele_internC = -0.01 }
                 }
             // 22.07.2024 Sc1056441 vicino Base cassetti interni girata di 180 e piu profonda e piu larga
              if (dist_31_ele > mcb_dist_min_X+10  &  dist_32_ele > mcb_dist_min_X+10)
                 {
                  dist_01_ele_ang180_deb = dist_01_ele
                  dist_02_ele_ang180_deb = dist_02_ele
                  dist_31_ele_ang180_deb = dist_31_ele
                  dist_32_ele_ang180_deb = dist_32_ele
                  if (IS_MATCH(MdF_Apertura, "DX*") == 1)  { mdf_ele_internC = -0.01 }
                 }
             }
          // 25.03.2019 H19011561 Cab Ang
          // 28.03.2019 A11716 Lavello 2 ante
          Ba0_ele = [#base_0.x, 0, #base_0.z]
          dist_30_ele = DISTANZA(Ba3_att, Ba0_ele)
          mdf_dist_ele_ang = 0
          if (dist_30_ele > X_ele_collY + X/2 - X/5)
             {
              if (IS_MATCH(NOME(idx_troCol), "*Ang*") )
                 {
                  mdf_ang_fro = ANG_TOT(PADRE(idx_att, 1))
                  if (ABS(mdf_ang_fro) > 10  &  ABS(mdf_ang_fro) < 80)
                     { mdf_dist_ele_ang = 1 }
                 }
             }
          if ( dist_31_ele > X_ele_collY + X/2 - X/5
             | mdf_dist_ele_ang > 0
             )
             {
              dist_32_ele = DISTANZA(Ba3_att, Ba2_ele)
              // Apertura DX dist_32_ele > mcb_dist_min_X+10 così è certo che non è in collisione
              if (dist_02_ele > mcb_dist_min_X+10  &  dist_32_ele > mcb_dist_min_X+10)
                 {
                  if (IS_MATCH(MdF_Apertura, "DX*") == 1)  { mdf_ele_internC = -0.01 }
                 }
             }

          // Colonna Terminale con ripiani girata di 90 gradi
          if (mdf_ele_internC > 0)
             {
              dist_02_ele_ang = dist_02_ele
              dist_31_ele_ang = dist_31_ele

              dist_01_ele = DISTANZA(Ba0_att, Ba1_ele)
              dist_32_ele = DISTANZA(Ba3_att, Ba2_ele)

              Ba0_ele = [#base_0.x, 0, #base_0.z]
              Ba3_ele = [#base_3.x, 0, #base_3.z]
              dist_00_ele_ang = DISTANZA(Ba0_att, Ba0_ele)
              dist_33_ele_ang = DISTANZA(Ba3_att, Ba3_ele)

              mdf_ctrl_00 = 0
              if (dist_02_ele > X + X/7  &  dist_31_ele > X/2 + X/7)    { mdf_ctrl_00 = 1 }
              if (dist_02_ele > X/2 + X/7  &  dist_31_ele > X + X/7)    { mdf_ctrl_00 = 2 }
              if (dist_02_ele > X + X/14  &  dist_31_ele > X/2 + X/14)  { mdf_ctrl_00 = 3 }
              if (dist_02_ele > X/2 + X/14  &  dist_31_ele > X + X/14)  { mdf_ctrl_00 = 4 }

             // 13.12.2019 1019103451 base vicina girata di 180 gradi
              if (dist_33_ele_ang > X+X_ele_collY-50)
                 {
                  if (dist_32_ele > X+X_ele_collY+mcb_dist_min_X)
                     {
                      if (dist_31_ele > X+mcb_dist_min_X)
                         {
                          if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "DX*") )
                             { mdf_ele_internC = -1.101 }
                         }
                     }
                 }
             // 04.03.2021 Sn00976
              rip_ang_multi_point = 0
              rip_ang_mp_ctrl = 0
              //   335.379    371.377       654.5           78.7433       654.5       46.5
              if (dist_01_ele+dist_32_ele > X_ele_collY  &  dist_02_ele < X_ele_collY-mcb_dist_min_X)
                 { rip_ang_mp_ctrl = 1 }
              // 30.09.2021 SCNOPV000245
              //   365.08     401.659       971.5       285       28.5044
              if (dist_01_ele+dist_32_ele > (X_ele_collY+X)/2  &  dist_02_ele < X_ele_collY-mcb_dist_min_X  &  dist_02_ele < X/4)
                 { rip_ang_mp_ctrl = 2 }

              if (rip_ang_mp_ctrl > 0)
                 {
                  ele_riptest_p = 1
                  //   335.379   -46.5            296    78.7433     296/3     371.377
                  // 30.09.2021
                  //   298.364   -46.5            285    28.5044     285/3     401.659
                  // 15.12.2023 A177579 Con i ripiani andava bene, ma con fondo coperchio che sono piu vicini al fronte per pochi mm non entrava
                  // 360.672     -46.5            357    22.1415               379.008    -46.5              357
                  //if (dist_01_ele-mcb_dist_min_X < X  &  dist_02_ele < X/3  &  dist_32_ele-mcb_dist_min_X > X)
                  if (dist_01_ele-mcb_dist_min_X < X  &  dist_02_ele < X/3  &  dist_32_ele-18 > X)
                     {
                      ele_riptest_p = dist_32_ele
                      dist_12_Puntiele = DISTANZA(Ba1_ele, Ba2_ele)
                      //  352.5+10
                      if (dist_12_Puntiele+20 < X_ele_collY)
                         { rip_ang_multi_point = 1 }
                     }
                 }

              mdf_fro_Bifac = 0

              if (dist_01_ele > mcb_dist_min_X)
                 {
                  dist_01_ele_x = ABS(Ba0_att.x - Ba1_ele.x)
                  dist_01_ele_z = ABS(Ba0_att.z - Ba1_ele.z)
                  mdf_ctrl_Ingombro01 = 0
                  if (dist_01_ele_x > mcb_dist_min_X  &  mdf_ang_ele == 0)    { mdf_ctrl_Ingombro01 = 1 }
                  if (dist_01_ele_x > mcb_dist_min_X  &  mdf_ang_ele == 180)  { mdf_ctrl_Ingombro01 = 2 }

                  if (dist_01_ele_z > mcb_dist_min_X)
                     {
                      // 04.09.2020 Modifico perche' non va bene, vedi sopra 2017OCL115730
                      //if (mdf_ang_ele != 0  &  mdf_ang_ele != 180)  { mdf_ctrl_Ingombro01 = 3 }
                      if (mdf_ang_ele >= 88   &  mdf_ang_ele <= 92)   { mdf_ctrl_Ingombro01 = 3 }
                      if (mdf_ang_ele >= 268  &  mdf_ang_ele <= 272)  { mdf_ctrl_Ingombro01 = 3 }
                     }

                 // 02.12.2019 1019100506 ANP SX
                  if (dist_32_ele > mcb_dist_min_X  &  dist_31_ele > mcb_dist_min_X  &  dist_01_ele > X)
                     {
                      mdf_ele_diff_ang = ABS(mdf_ang_ele-mdf_ang_mdf_att)
                      mdf_ele_diff_ang_case = 0
                      if (mdf_ele_diff_ang > 260  &  mdf_ele_diff_ang < 280)  { mdf_ele_diff_ang_case = 1 }
                     // 13.12.2019 E1048885
                      if (mdf_ele_diff_ang > 80   &  mdf_ele_diff_ang < 100)  { mdf_ele_diff_ang_case = 2 }

                      if (mdf_ele_diff_ang_case > 0)
                         {
                          if (VAR_VAL(idx_att, "MdF_angoloBas") != 0)
                             {
                              mdf_ele_internC = -1.0012
                             }
                         }
                     }

                  if (mdf_ctrl_Ingombro01 > 0)
                     {
                      mdf_ANP_bas = 0
                      if (ABS(VAR_VAL(idx_att, "MdF_angoloBas")) > 80  &  ABS(VAR_VAL(idx_att, "MdF_angoloBas")) < 100)
                         { mdf_ANP_bas = 1 }

                      mdf_ctrl_eleANP = 0
                      if (mdf_ctrl_00 > 0)
                         {
                          // 16.06.2020 A036175
                          //    622.999       1073 + 30          1090          1073+30            622.999       (467+1073)/3=513.33+100   622.99         513.33-40
                          //if (dist_01_ele < X_ele_collY+30  &  dist_31_ele < X_ele_collY+30  &  dist_01_ele < (X+X_ele_collY)/3+100  &  dist_01_ele > (X+X_ele_collY)/3-40)
                          if (dist_01_ele < X_ele_collY+30  &  dist_31_ele < X_ele_collY+30  &  dist_01_ele < X_ele_collY-X+40  &  dist_01_ele > X_ele_collY-X-40)
                             { mdf_ctrl_eleANP = 1 }

                          // 23.05.2023 Se problema arriva qui mdf_ctrl_eleANP 0 Vedi DX
                         }
                     // 03.07.2019
                      mdf_Lavel_tuttaX = 0
                      if ( dist_02_ele > X+2  &  dist_31_ele > X+2
                         // per non prendere gli ANP
                         // però non prende AntaDX Base2Ante, con Lavello tuttaX perchè manca il controllo sul lato destro dist_32_ele vedi 08.10.2024 Sc1056729
                         & X+100 > VAR_VAL(PADRE(idx_att, 4), "X")
                         )
                         { mdf_Lavel_tuttaX = 1 }

                     // 31.05.2023 Sc1022152799
                      mdf_ele_diff_ang = ABS(mdf_ang_ele-mdf_ang_mdf_att)
                      dist_03_ele_Bif = DISTANZA(Ba0_att, Ba3_ele)
                      if (mdf_ele_diff_ang > 179  &  mdf_ele_diff_ang < 181)
                         {
                          if (dist_03_ele_Bif < mcb_dist_min_X)
                             { mdf_fro_Bifac = 1 }
                         }

                      if (IS_MATCH(MdF_Apertura, "SX*") == 1  &  mdf_ctrl_eleANP == 0  &  mdf_fro_Bifac == 0)
                         {
                          // 03.07.2019
                          if (mdf_Lavel_tuttaX == 0)  { mdf_ele_internC = -0.001 }
                         }
                      // 02.10.2019 1048499
                      if (dist_32_ele > mcb_dist_min_X  &  dist_31_ele > mcb_dist_min_X  &  dist_01_ele > X)
                         {
                          mdf_ele_diff_ang = ABS(mdf_ang_ele-mdf_ang_mdf_att)
                          if (mdf_ele_diff_ang > 80  &  mdf_ele_diff_ang < 100)
                             {
                              if (IS_MATCH(MdF_Apertura, "DX*") == 1)
                                 {
                                  if (mdf_Lavel_tuttaX == 0)
                                     {
                                      // 04.03.2021 Sn000976
                                      if (rip_ang_multi_point == 0)  { mdf_ele_internC = -0.0012 }
                                     }
                                 }
                             }
                         }
                     // 16.07.2020 SC1049840 ANP SX non deve sentire il Ripiano, perche' semmai deve essere sistemato
                      // VariabiliMdF.txt MCB_ collY_dist_min_arch e MCB_ dist_NEAR_Collision
                      if (dist_02_ele > mcb_dist_min_X  &  dist_01_ele > mcb_dist_min_X  &  dist_31_ele > X)
                         {
                          if (mdf_ANP_bas == 1)
                             {
                              if (IS_MATCH(MdF_Apertura, "SX*") == 1)
                                 {
                                  if (mdf_Lavel_tuttaX == 0)  { mdf_ele_inter_debug = -0.0112 }
                                 }
                             }
                         }
                     }
                 }
              if (dist_32_ele > mcb_dist_min_X)
                 {
                  dist_32_ele_x = ABS(Ba3_att.x - Ba2_ele.x)
                  dist_32_ele_z = ABS(Ba3_att.z - Ba2_ele.z)

                  // 03.10.2017
                  mdf_ctrl_Ingombro32 = 0
                  if (dist_32_ele_x > mcb_dist_min_X  &  mdf_ang_ele == 0)    { mdf_ctrl_Ingombro32 = 1 }
                  if (dist_32_ele_x > mcb_dist_min_X  &  mdf_ang_ele == 180)  { mdf_ctrl_Ingombro32 = 2 }

                  if (dist_32_ele_z > mcb_dist_min_X)
                     {
                      if (mdf_ang_ele != 0  &  mdf_ang_ele != 180)
                         { mdf_ctrl_Ingombro32 = 3 }
                     }

                  // 05.07.2019
                   mdf_Lavel_tuttaX = 0
                   // A032601 Lavello che parte da sinistra a 12 da FiaSx e sborda a destra da FiaDx di 160.
                   // Eventualmente vedi anche dist_31_ele > X-mcb_dist_min_X & dist_31_ele < X+mcb_dist_min_X
                   //                           570.523       597
                   //if ( dist_02_ele > X+2  &  dist_31_ele > X+2
                   if ( dist_02_ele > X+2  &  dist_31_ele > X-40
                      // per non prendere gli ANP
                      // però non prende AntaDX Base2Ante, con Lavello tuttaX perchè manca il controllo sul lato destro dist_32_ele vedi 08.10.2024 Sc1056729
                      & X+100 > VAR_VAL(PADRE(idx_att, 4), "X")
                      )
                      { mdf_Lavel_tuttaX = 1 }

                  // 04.12.2019 BROS1574359
                  // doppia anta Lavello Anta DX composizione in angolo di 45 gradi con Lavello centrato verso destra X 548.3 piu grande dell' anta 347
                  if (dist_02_ele+mcb_dist_min_X-6 < X  &  dist_02_ele+dist_32_ele-5 > X  &  dist_32_ele > mcb_dist_min_X)
                     {
                      // 11.06.2021 Caso limite BROS1737762, vedi anche LavelloLimiteAng45_19114359 Vasca rientrante in basso
                      //if (dist_31_ele+3 > X_ele_collY+mcb_dist_min_X)
                      if (dist_31_ele-2 > X_ele_collY+mcb_dist_min_X)
                         {
                          if (IS_MATCH(MdF_Apertura, "DX*") == 1)
                             { mdf_ele_internC = -0.0013 }
                         }
                     }

                  if (mdf_ctrl_Ingombro32 > 0)
                     {
                      mdf_ctrl_eleANP = 0
                      mdf_EleAttraversaInMezzo = 0
                      if (mdf_ctrl_00 > 0)
                         {
                          // 16.06.2020 di riflesso simile a come sopra
                          // 20.07.2020 A058535 alla fine andava -40
                          if (dist_32_ele < X_ele_collY+30  &  dist_02_ele < X_ele_collY+30  &  dist_32_ele < X_ele_collY-X+40  &  dist_32_ele > X_ele_collY-X-40)
                             { mdf_ctrl_eleANP = 1 }

                         // 23.05.2023 Sc1023033098 Caso 3 ante, una SX, poi ANP DX e poi FrontaleFisso con Mensolone a tutta X
                          if ( dist_32_ele < X_ele_collY+30  &  dist_02_ele < X_ele_collY+30  &  dist_32_ele < X_ele_collY-X+40  &  dist_32_ele > X_ele_collY-2*X-40
                             & dist_32_ele > X
                             )
                             { mdf_ctrl_eleANP = 2 }

                          // 08.03.2024 H24010566
                          mdf_EleAttraversaInMezzo = 0
                          dist_31_ele_EAIM = dist_31_ele
                          Ba1_att = [base_1.x, 0, base_1.z]
                          dist_11_ele = DISTANZA(Ba1_att, Ba1_ele)
                          dist_32_ele = DISTANZA(Ba3_att, Ba2_ele)
                          if ( dist_02_ele > X  &  dist_31_ele > X
                             & dist_11_ele > X/2  &  dist_32_ele > X/2
                             & dist_32_ele < X_ele_collY - X + 20  &  dist_02_ele < X_ele_collY - X + 20
                             )
                             { mdf_EleAttraversaInMezzo = 1 }
                         }

                     // 31.05.2023 Sc1022152799
                      mdf_ele_diff_ang = ABS(mdf_ang_ele-mdf_ang_mdf_att)
                      dist_30_ele_Bif = DISTANZA(Ba3_att, Ba0_ele)
                      if (mdf_ele_diff_ang > 179  &  mdf_ele_diff_ang < 181)
                         {
                          if (dist_30_ele_Bif < mcb_dist_min_X)
                             { mdf_fro_Bifac = 1 }
                         }

                     // 18.04.2018
                      if (IS_MATCH(MdF_Apertura, "DX*") == 1  &  mdf_ctrl_eleANP == 0  &  mdf_fro_Bifac == 0  &  mdf_EleAttraversaInMezzo == 0)
                         {
                          // 08.10.2024 Sc1056729 BaseLavello2Ante AntaDX. In realtà il lavello sporge anche leggermente fuori dalla Base sia a Sx che dx, per quello non era uscito prima il problema
                          if (dist_02_ele > X-20  &  dist_31_ele > X+40)
                             {
                              Z_basetta = 60
                              if (dist_32_ele < Z_basetta+13)
                                 {
                                  if (dist_32_ele_x < mcb_dist_min_X-5  &  dist_32_ele_z < Z_basetta+10)
                                     { mdf_Lavel_tuttaX = 1.002 }
                                 }
                             }
                          // 05.07.2019
                          if (mdf_Lavel_tuttaX == 0)  { mdf_ele_internC = -0.002 }
                         }
                     }
                 }

              if (mdf_ctrl_ang > 0)
                 {
                  if (dist_02_ele > #Z + X/2 + #Z/5  |  dist_31_ele > #Z + X/2 + #Z/5 )
                     {
                      mdf_ele_internC = -0.1
                      // 15.05.2024 ScBROWSER2055869 Come sotto per avere mdf_ctrl_eleANP = 1
                      if (dist_32_ele < X_ele_collY+30  &  dist_02_ele < X_ele_collY+30  &  dist_32_ele < X_ele_collY-X+40  &  dist_32_ele > X_ele_collY-X-40)
                         {
                          // Ma devo esser sicuro che collida
                          // In z rientra di 50
                          dist_01_ele = DISTANZA(Ba0_att, Ba1_ele)
                          if (dist_01_ele < mcb_dist_min_X+10)  { mdf_ele_internC = 0.1 }
                         }
                     }

                  // 29.04.2020 aggiunto -0.6 CatenaY X=277 Z=19, X_anta 223 Base AngL
                  // in realta ora 20.05.2020 ho spostato fuori il ripristino collisione Traversa
                  if (dist_02_ele > X - X/13 - 0.6  &  dist_31_ele > #Z + X/2 + 10)
                     {
                      mdf_ele_internC = -0.2

                      // 25.03.2020 RipAng
                      // 678.439      < 697   1416.43     < 1395           697-678.439  + 5
                      if (dist_02_ele < X  &  dist_31_ele < X_ele_collY + (X-dist_02_ele) + 5)
                         { mdf_ele_internC = 0.22 }
                     }
                  // 31.07.2018
                  // Base Angolo L collisione con Traversa, quindi ripristino la collisione
                  // 20.05.2020 spostato fuori da mdf_ele_internC -0.2
                  //if ( dist_02_ele < X  &  dist_31_ele < (X_ele_collY + X)/2 + (X_ele_collY + X)/10  &  Z_ele_collY < 40
                  // X_ele_collY=247
                  //   138.5         156       264.523   156    138.5        156-46.5
                  if ( dist_02_ele < X  &  dist_31_ele > X  &  dist_02_ele > X-mcb_dist_min_X
                     & Z_ele_collY < 40
                     )
                     { mdf_ele_internC = 0.2 }

                  // Significa che è un elemento appoggiato. Esempio PannelloFro elementi ANP
                  if (dist_02_ele < X  &  dist_31_ele < X  &  dist_02_ele < Z_ele_collY + Z_ele_collY/10  &  dist_31_ele < Z_ele_collY + Z_ele_collY/10)
                     { mdf_ele_internC = -0.3 }

                  // 13.05.2020 19979
                  // Appoggiato vicino ANP
                  // dist_31_ele = 908.874
                  //  665.864     794.146       1163            497.796       1163        53
                  if (dist_01_ele+dist_32_ele > X_ele_collY  &  dist_02_ele < X_ele_collY-mcb_dist_min_X)
                     {
                      // 04.03.2021 Sn00976
                      // 335.379    371.377       654.5           78.7433       654.5       46.5
                      if (rip_ang_multi_point == 0)
                         {
                         // 04.07.2024 Sc1056339 ArmANP con solo da una metà una Mensola profonda che tocca la cerniera ANP di striscio
                          if (dist_32_ele+1 > mcb_dist_min_X)  { mdf_ele_internC = -0.31 }
                         }
                     }

                  if (mdf_ctrl_00 > 0)
                     {
                      if (dist_00_ele_ang > X + X_ele_collY/2)
                         {
                         // 04.07.2024 Sc1056339 ArmANP con solo da una metà una Mensola profonda che tocca la cerniera ANP di striscio
                          if (dist_32_ele+1 > mcb_dist_min_X)
                             {
                              mdf_ele_internC = -0.4
                             }
                          else
                             {
                              // 06.09.2024 Sc 1024057285 ANG MCB_dist_min_X da VariabiliMdF.txt
                              dist_32_ele_x = ABS(Ba3_att.x - Ba2_ele.x)
                              dist_32_ele_z = ABS(Ba3_att.z - Ba2_ele.z)

                              if (mdf_ele_internC <= 0  &  mcb_dist_min_X > 50)
                                 {
                                  if ( dist_32_ele_z < mcb_dist_min_X
                                     // Qui e' in AND MdF_Apertura DX
                                     & dist_32_ele_x < mcb_dist_min_X
                                     )
                                     { mdf_ele_internC = 0.4 }
                                 }
                             }
                         }

                      if ( dist_02_ele > X - X/10  &  dist_31_ele > #Z + X/2 + 10  &  dist_00_ele_ang > X + #Z/3 + 10  &  dist_00_ele_ang > #Z + X/3 + 10
                         & dist_33_ele_ang > X_ele_collY + 50
                         )
                         { mdf_ele_internC = -0.41 }

                     // 24.04.2017
                      dist_03_ele_ang = DISTANZA(Ba0_att, Ba3_ele)
                      dist_30_ele_ang = DISTANZA(Ba3_att, Ba0_ele)
                      if ( dist_00_ele_ang > #X + #X/15  &  dist_32_ele > #X + #X/15  &  dist_01_ele > X/2 + X/15
                         & dist_02_ele > X/2 + X/15
                         & dist_33_ele_ang > X + 10
                         & dist_30_ele_ang > #X + X + 10
                         )
                         {
                          mdf_ele_internC = -0.42
                         }
                     }
                 }
              if (PADRE(idx_troCol, -1) != PADRE(idx_att, -1) )
                 {
                  // Colonna vicina a pensile Angolo ridotto in profondita
                  if (IS_MATCH(NOME(idx_troCol), "*Ang*") == 1)
                     {
                      if (dist_02_ele > X_ele_collY + X/2 + X/20  |  dist_31_ele > X_ele_collY + X/2 + X/20 )
                         { mdf_ele_internC = -0.5 }
                     }
                  if (dist_02_ele > X - X/13  &  dist_31_ele > X - X/13)
                     {
                      Ba0_ele = [#base_0.x, 0, #base_0.z]
                      dist_00_ele_ang = DISTANZA(Ba0_att, Ba0_ele)
                      if (dist_00_ele_ang > X + X_ele_collY/2)
                         {
                         // 04.07.2024 Sc1056339 ArmANP con solo da una metà una Mensola profonda che tocca la cerniera ANP di striscio
                          if (dist_32_ele+1 > mcb_dist_min_X)
                             {
                              mdf_ele_internC = -0.6
                             }
                         }
                     }
                 }

              mdf_ele_inter_X_min = mdf_ele_internC
             }
         }
      else
         {
          mdf_ele_internC = 1.2
          if (dist_02_ele > X + X_ele_collY/2 + X_ele_collY/5  |  dist_31_ele > X + X_ele_collY/2 + X_ele_collY/5)
             { mdf_ele_internC = -1 }

          // Colonna Terminale con ripiani girata di 90 gradi
          if (mdf_ele_internC > 0)
             {
              dist_02_ele_ang = dist_02_ele
              dist_31_ele_ang = dist_31_ele
              mdf_ang_ele = ANG_TOT2(PADRE(idx_troCol, 1))
              mdf_ang_mdf_att = ANG_TOT2(PADRE(idx_att, 1))
              mdf_ctrl_ang = 0
              if (ABS(mdf_ang_ele-mdf_ang_mdf_att) > 45 & ABS(mdf_ang_ele-mdf_ang_mdf_att) < 135)
                 { mdf_ctrl_ang = 1 }
              if (ABS(mdf_ang_ele-mdf_ang_mdf_att) > 225 & ABS(mdf_ang_ele-mdf_ang_mdf_att) < 315)
                 { mdf_ctrl_ang = 2 }

              dist_01_ele = DISTANZA(Ba0_att, Ba1_ele)
              dist_32_ele = DISTANZA(Ba3_att, Ba2_ele)
              Ba0_ele = [#base_0.x, 0, #base_0.z]
              dist_30_ele = DISTANZA(Ba3_att, Ba0_ele)
              Ba3_ele = [#base_3.x, 0, #base_3.z]

              mdf_ctrl_00 = 0
              if (dist_02_ele > X + X/7  &  dist_31_ele > X/2 + X/7)  { mdf_ctrl_00 = 1 }
              if (dist_02_ele > X/2 + X/7  &  dist_31_ele > X + X/7)  { mdf_ctrl_00 = 2 }

              if (dist_01_ele > mcb_dist_min_X)
                 {
                  dist_01_ele_x = ABS(Ba0_att.x - Ba1_ele.x)
                  dist_01_ele_z = ABS(Ba0_att.z - Ba1_ele.z)
                  mdf_ctrl_Ingombro01 = 0
                  if (dist_01_ele_x > mcb_dist_min_X  &  mdf_ang_ele == 0)    { mdf_ctrl_Ingombro01 = 1 }
                  if (dist_01_ele_x > mcb_dist_min_X  &  mdf_ang_ele == 180)  { mdf_ctrl_Ingombro01 = 2 }

                  if (dist_01_ele_z > mcb_dist_min_X)
                     {
                      // 04.09.2020 caso stranissimo di ordine vecchio 2017OCL115730 (che tra l' altro e' un caso limite) dove
                      // mdf_ang_ele vale 180 ma Metron inspiegabilmente in caricamento ordine entra qui
                      //if (mdf_ang_ele != 0  &  mdf_ang_ele != 180)  { mdf_ctrl_Ingombro01 = 3 }
                      if (mdf_ang_ele >= 88   &  mdf_ang_ele <= 92)   { mdf_ctrl_Ingombro01 = 3 }
                      if (mdf_ang_ele >= 268  &  mdf_ang_ele <= 272)  { mdf_ctrl_Ingombro01 = 3 }
                     // 29.10.2020 A59456
                      if (mdf_ang_ele > 0   &  mdf_ang_ele <= 5)      { mdf_ctrl_Ingombro01 = 4 }

                      // 05.11.2019 PCL01172 ang 270
                      // 13.11.2019 EM07524
                      if (ABS(mdf_ang_ele-mdf_ang_mdf_att) == 0  &  dist_01_ele_x > mcb_dist_min_X)
                         { mdf_ctrl_Ingombro01 = 3.1 }
                     }

                  // 26.06.2020 S773298 FondoFrigo a 52 dal fronte
                  mdf_collision_z = 0
                  // oppure usare zCer presa da RegFacc ma per il momento limito di piu
                  Z_basetta = 60
                  // 04.09.2020 caso stranissimo di ordine vecchio 2017OCL115730_mdf_ang_ele180
                  // dist_01_ele_x 38.5 dist_01_ele 72.9812, quindi Lavello un po' piu vicino in x, ma rientra di piu in z e c'e' piu rischio collisione
                  if ( dist_01_ele_x >= Battuta_X+10
                     & dist_01_ele > Battuta_X+mcb_dist_min_X
                    // 10.09.2020 ord. A123038 dist_01_ele_x 53.5 dist_01_ele 68.0166, quindi Lavello un po' piu distante in x, ma rientra di meno in z e c'e' meno rischio collisione
                     & dist_01_ele_x < Battuta_X+25
                     )
                     {
                      if (dist_01_ele_z < Z_basetta+3  &  dist_01_ele < Z_basetta+13)   { mdf_collision_z = 1 }
                      if (dist_01_ele_z >= Z_basetta+3 &  dist_01_ele >= Z_basetta+13)  { mdf_ctrl_Ingombro01 = mdf_ctrl_Ingombro01+0.99 }
                     }
                  if (dist_01_ele_x < Battuta_X+10)
                     {
                     // Siccome e' il primo caso in 4 anni limito il piu possibile
                      if (dist_01_ele_z < Z_basetta-4  &  dist_01_ele < Z_basetta-1)  { mdf_collision_z = 2 }
                     }

                  // 25.11.2020 A86621 come sotto Lavello in mezzo
                  if ( dist_01_ele < X_ele_collY-Battuta_X
                     & dist_02_ele < X_ele_collY-Battuta_X
                     & dist_31_ele > X
                     )
                     { mdf_collision_z = 2 }

                  // 03.02.2025 H24067275 Bifacciale
                  if (dist_30_ele < mcb_dist_min_X)
                     {
                      // Bifacciale
                      if (ABS(mdf_ang_ele-mdf_ang_mdf_att) > 175 & ABS(mdf_ang_ele-mdf_ang_mdf_att) < 185)
                         {
                          dist_00_ele_ang = DISTANZA(Ba0_att, Ba0_ele)
                          dist_30_ele_z = ABS(Ba3_att.z - Ba0_ele.z)
                          if ( dist_02_ele < X_ele_collY-Battuta_X
                             & dist_31_ele < X_ele_collY-Battuta_X
                             & dist_32_ele > X
                             )
                             {
                              // Per non rischiare che senta elementi vicini
                              dist_33_ele_ang = DISTANZA(Ba3_att, Ba3_ele)
                              if ( dist_30_ele_z < Z_basetta-4
                                 & dist_33_ele_ang > X-X/3  &  dist_33_ele_ang < X+2
                                 & dist_00_ele_ang > X-X/3  &  dist_00_ele_ang < X+2
                                 )
                                 { mdf_collision_z = 3 }
                             }
                         }
                     }

                  if (mdf_ctrl_Ingombro01 > 0)
                     {
                      // 26.06.2020
                      if (mdf_collision_z == 0)
                         {
                          if (IS_MATCH(MdF_Apertura, "SX*") )
                             { mdf_ele_internC = -1.001 }
                         }
                     }

                   // 12.09.2019 1016051316 DX ANP sente il ripiano vicino
                   mdf_Lavel_tuttaX = 0
                   if ( dist_02_ele > X+2  &  dist_31_ele > X+2
                      // per non prendere gli ANP
                      & X+100 > VAR_VAL(PADRE(idx_att, 4), "X")
                      )
                      { mdf_Lavel_tuttaX = 1 }

                  if (mdf_ctrl_Ingombro01 > 0)
                     {
                      //if (dist_32_ele > mcb_dist_min_X  &  dist_31_ele > mcb_dist_min_X  &  dist_01_ele > X)
                      if (dist_32_ele > mcb_dist_min_X  &  dist_31_ele > mcb_dist_min_X)
                         {
                          if (dist_01_ele > X)
                             {
                              mdf_ele_diff_ang = ABS(mdf_ang_ele-mdf_ang_mdf_att)
                              if (mdf_ele_diff_ang > 80  &  mdf_ele_diff_ang < 100)
                                 {
                                  if (IS_MATCH(MdF_Apertura, "DX*") == 1)
                                     {
                                      if (mdf_Lavel_tuttaX == 0)  { mdf_ele_internC = -1.0012 }
                                     }
                                 }
                             }
                          // 04.11.2019 PCL000891 ANP
                          if ( dist_31_ele > X_ele_collY
                             & dist_31_ele < X
                             )
                             {
                              if (VAR_VAL(idx_att, "MdF_angoloBas") != 0)
                                 {
                                  if (IS_MATCH(MdF_Apertura, "DX*") == 1)
                                     {
                                      mdf_ele_internC = -1.0013
                                      mdf_ctrl_ANP = 1
                                     }
                                 }
                             }
                         }
                     // 27.03.2024 SL010722 MdF_Apertura DX
                      mdf_fro_Bifac = 0
                      mdf_ele_diff_ang = ABS(mdf_ang_ele-mdf_ang_mdf_att)
                      if (mdf_ele_diff_ang > 179  &  mdf_ele_diff_ang < 181)  { mdf_fro_Bifac = 1 }

                      if (mdf_fro_Bifac > 0)
                         {
                          dist_33_ele_ang = DISTANZA(Ba3_att, Ba3_ele)
                          if (dist_33_ele_ang < 40)  { mdf_ele_internC = -1.0014 }
                         }
                     }
                 }
              if (dist_32_ele > mcb_dist_min_X)
                 {
                  dist_32_ele_x = ABS(Ba3_att.x - Ba2_ele.x)
                  dist_32_ele_z = ABS(Ba3_att.z - Ba2_ele.z)
                  mdf_ctrl_Ingombro32 = 0
                  if (dist_32_ele_x > mcb_dist_min_X  &  mdf_ang_ele == 0)    { mdf_ctrl_Ingombro32 = 1 }
                  if (dist_32_ele_x > mcb_dist_min_X  &  mdf_ang_ele == 180)  { mdf_ctrl_Ingombro32 = 2 }

                  if (dist_32_ele_z > mcb_dist_min_X)
                     {
                      if (mdf_ang_ele != 0  &  mdf_ang_ele != 180)
                         { mdf_ctrl_Ingombro32 = 3 }
                     }

                  // 26.06.2020 S773298 FondoFrigo a 52 dal fronte
                  mdf_collision_z = 0
                  // oppure usare zCer presa da RegFacc ma per il momento limito di piu
                  Z_basetta = 60
                  // 10.09.2020 come sopra vedi ord. A123038
                  if ( dist_32_ele_x >= Battuta_X+10
                     & dist_32_ele > Battuta_X+mcb_dist_min_X
                     & dist_32_ele_x < Battuta_X+25
                     )
                     {
                      if (dist_32_ele_z < Z_basetta+3  &  dist_32_ele < Z_basetta+13)   { mdf_collision_z = 1 }
                      if (dist_32_ele_z >= Z_basetta+3 &  dist_32_ele >= Z_basetta+13)  { mdf_ctrl_Ingombro32 = mdf_ctrl_Ingombro32+0.99 }
                     }
                  if (dist_32_ele_x < Battuta_X+10)
                     {
                     // Siccome e' il primo caso in 4 anni limito il piu possibile
                      if (dist_32_ele_z < Z_basetta-4  &  dist_32_ele < Z_basetta-1)  { mdf_collision_z = 1 }
                     }

                  // 25.11.2020 A86621 Lavello in mezzo
                  if ( dist_31_ele < X_ele_collY-Battuta_X
                     & dist_32_ele < X_ele_collY-Battuta_X
                     & dist_02_ele > X
                     )
                     { mdf_collision_z = 2 }

                  // 03.02.2025 H24067275 Bifacciale
                  if (dist_30_ele < mcb_dist_min_X)
                     {
                      // Bifacciale
                      if (ABS(mdf_ang_ele-mdf_ang_mdf_att) > 175 & ABS(mdf_ang_ele-mdf_ang_mdf_att) < 185)
                         {
                          dist_00_ele_ang = DISTANZA(Ba0_att, Ba0_ele)
                          dist_30_ele_z = ABS(Ba3_att.z - Ba0_ele.z)
                          if ( dist_02_ele < X_ele_collY-Battuta_X
                             & dist_31_ele < X_ele_collY-Battuta_X
                             & dist_32_ele > X
                             )
                             {
                              // Per non rischiare che senta elementi vicini
                              dist_33_ele_ang = DISTANZA(Ba3_att, Ba3_ele)
                              if ( dist_30_ele_z < Z_basetta-4
                                 & dist_33_ele_ang > X-X/3  &  dist_33_ele_ang < X+2
                                 & dist_00_ele_ang > X-X/3  &  dist_00_ele_ang < X+2
                                 )
                                 { mdf_collision_z = 3 }
                             }
                         }
                     }

                  if (mdf_ctrl_Ingombro32 > 0)
                     {
                      // 26.06.2020
                      if (mdf_collision_z == 0)
                         {
                          if (IS_MATCH(MdF_Apertura, "DX*") )
                             {
                              // 22.02.2024 PH530536 Colonna Angolo
                              Ba3_ele = [#base_3.x, 0, #base_3.z]
                              dist_33_ele_RipAng_dx = DISTANZA(Ba3_att, Ba3_ele)
                              dist_32_ele_dx = dist_32_ele
                              dist_02_ele_dx = dist_02_ele
                              dist_31_ele_dx = dist_31_ele
                              mdf_ele_idx_dx = idx_troCol

                              // Normalmente sarà sempre maggiore la dist dietro ripiano con qualsiasi punto del frontale
                              // Infatti fin' ora Ba3_ele non era mai servito nell' else se X >= X_ele_collY
                              // Se fosse anta su vano retro semmai per apertura DX sarebbe dist_30, mentre dist_33 sarebbe simile alla X frontale
                              if (dist_33_ele_RipAng_dx > Battuta_X+mcb_dist_min_X)
                                 {
                                  mdf_ele_internC = -1.002
                                  mdf_ele_idx_troCol_I32dx = idx_troCol
                                  // 21.05.2025 Sc 1058114 ScassoVasca stanza angolata 23.4423
                                  if ( dist_33_ele_RipAng_dx > X-80
                                     // 23.05.2025 Sc entrava anche 1021114910
                                     & dist_32_ele_x < mcb_dist_min_X-15
                                     )
                                     {
                                      if (dist_32_ele_x < Battuta_X+mcb_dist_min_X)
                                         {
                                          if (dist_32_ele_z < Z_basetta+1.1  &  dist_32_ele < Z_basetta+2.1)
                                             {
                                              mdf_ele_internC = 10.002
                                             }
                                         }
                                     }
                                 }
                             }
                         }

                     // 08.04.2019 H007438 RipLibTerm a Sx
                     // 05.10.2021 Sn00925 ele giorno molto piccolo a sinistra compreso da Anta molto larga deve dare collisione
                      //if (dist_32_ele > (X + X_ele_collY)/2)
                      if (dist_32_ele > (X + X_ele_collY)/2  &  dist_31_ele > X)
                         {
                          if (IS_MATCH(MdF_Apertura, "SX*") )
                             { mdf_ele_internC = -1.003 }
                         }
                     }
                 }

              if (mdf_ctrl_00 > 0)
                 {
                  Ba0_ele = [#base_0.x, 0, #base_0.z]
                  Ba3_ele = [#base_3.x, 0, #base_3.z]
                  dist_00_ele_ang = DISTANZA(Ba0_att, Ba0_ele)
                  dist_33_ele_ang = DISTANZA(Ba3_att, Ba3_ele)
                 }
              if (mdf_ctrl_ang > 0)
                 {
                  dist_01_ele = DISTANZA(Ba0_att, Ba1_ele)
                  dist_32_ele = DISTANZA(Ba3_att, Ba2_ele)

                  if (dist_02_ele > X + #Z/2 + #Z/5  |  dist_31_ele > X + #Z/2 + #Z/5)
                     { mdf_ele_internC = -1.1 }

                  if (dist_02_ele > X - X/13  &  dist_31_ele > X + #Z/2 + 10)
                     { mdf_ele_internC = -1.2 }
                  // Significa che è un elemento appoggiato. Esempio PannelloFro elementi ANP
                  // 08.06.2022 Ca2209094 l' anta sborda fino a meta fianco quindi dist_02_ele e dist_31_ele sono per forza minori di X
                  // 11 perchè la Battuta_X e' 10.76 su Fianco X 25
                  //if (dist_02_ele < X  &  dist_31_ele < X  &  dist_02_ele < #Z + #Z/10 &  dist_31_ele < #Z + #Z/10)
                  if (dist_02_ele+11 < X  &  dist_31_ele+11 < X  &  dist_02_ele < #Z + #Z/10 &  dist_31_ele < #Z + #Z/10)
                     { mdf_ele_internC = -1.3 }

                 // 22.06.2017
                  // Condizione angolo mdf_ctrl_ang=1
                  // Tutte le distanze sono maggiori dell' ingombro Cerniera in X e Z ipotizzabile di 120
                  if (dist_01_ele > 120  &  dist_31_ele > 120)
                     {
                      Ba0_ele = [#base_0.x, 0, #base_0.z]
                      Ba3_ele = [#base_3.x, 0, #base_3.z]
                      ma1_dist_00_ele_ang = DISTANZA(Ba0_att, Ba0_ele)
                      ma1_dist_33_ele_ang = DISTANZA(Ba3_att, Ba3_ele)
                      ma1_dist_03_ele_ang = DISTANZA(Ba0_att, Ba3_ele)
                      ma1_dist_30_ele_ang = DISTANZA(Ba3_att, Ba0_ele)
                      ma1_dist_02_ele_ang = DISTANZA(Ba0_att, Ba2_ele)
                      ma1_dist_32_ele_ang = DISTANZA(Ba3_att, Ba2_ele)

                      ma1_dist_00_ApSX_ok = 1
                      if ( ma1_dist_00_ele_ang < 120
                         & IS_MATCH(MdF_Apertura, "SX*")
                         )
                         { ma1_dist_00_ApSX_ok = 0 }

                      if ( ma1_dist_00_ApSX_ok > 0
                         & ma1_dist_03_ele_ang > #Z+30  &  ma1_dist_32_ele_ang > #Z+100
                         & ma1_dist_30_ele_ang > X+100   &  ma1_dist_33_ele_ang > X+100
                         & ma1_dist_32_ele_ang > X+25
                         )
                         { mdf_ele_internC = -1.31 }
                     }

                  //if (dist_02_ele > X  &  dist_01_ele > X  &  dist_31_ele < dist_Coll  &  dist_32_ele > #X)
                  if (dist_02_ele > X  &  dist_01_ele > X  &  dist_31_ele < dist_Coll  &  dist_32_ele > X_ele_collY)
                     {
                     // 20.06.2022 HN22017677
                      ripGiratoInCollision = 0
                      if (mdf_ctrl_ang == 2)
                         {
                          if (dist_31_ele < 10  &  dist_30_ele < X  &  dist_30_ele < X_ele_collY)
                             {
                              // 12.11.2024 parser A3 2024_lic12986_9514_t_31195
                              dist_00_ele_ang = DISTANZA(Ba0_att, Ba0_ele)
                              if (dist_00_ele_ang < 20)  { ripGiratoInCollision = 1 }
                             }
                         }
                      if (ripGiratoInCollision == 0)
                         { mdf_ele_internC = -1.4 }
                     }
                 // 22.05.2017
                  if (mdf_ctrl_ang == 2)
                     {
                      Ba0_ele = [#base_0.x, 0, #base_0.z]
                      Ba3_ele = [#base_3.x, 0, #base_3.z]
                      dist_00_ele_ang = DISTANZA(Ba0_att, Ba0_ele)
                      dist_33_ele_ang = DISTANZA(Ba3_att, Ba3_ele)

                      dist_03_ele_ang = DISTANZA(Ba0_att, Ba3_ele)
                      dist_30_ele_ang = DISTANZA(Ba3_att, Ba0_ele)
                      // E' un elemento vicino alla parte fissa AngoloPannello dove Z_ele < X_Fro
                      if ( dist_00_ele_ang > X+1
                         & dist_02_ele > #X+20  &  dist_02_ele > #Z+20
                         & dist_32_ele > #X+20  &  dist_32_ele > #Z+20
                         & dist_31_ele > #X+20  &  dist_31_ele > #Z
                         & dist_33_ele_ang > #X+20
                         & dist_30_ele_ang < 50
                         // Gia questo non può mai essere una collisione
                         & dist_03_ele_ang > X/2 + #X/2 + X/5 + #X/5
                         & dist_03_ele_ang > X/2 + X/12 + #Z
                         )
                         {
                          mdf_ele_internC = -1.41
                         }
                      // 07.07.2017
                      if ( dist_00_ele_ang > X+1
                         & dist_30_ele_ang > #X+20  &  dist_30_ele_ang > #Z+20
                         & dist_32_ele > #X+20  &  dist_32_ele > #Z+20
                         & dist_31_ele > #X+20  &  dist_31_ele > #Z
                         & dist_02_ele < 90
                         // Gia questo non può mai essere una collisione
                         & dist_31_ele_ang > X/2 + #X/2 + X/5 + #X/5
                         & dist_31_ele_ang > X/2 + X/12 + #Z
                         & dist_33_ele_ang > X/2 + #X/2 + X/5 + #X/5
                         & dist_33_ele_ang > X/2 + X/12 + #Z
                         & dist_30_ele_ang > X/2 + #X/2 + X/5 + #X/5
                         & dist_30_ele_ang > X/2 + X/12 + #Z
                         )
                         {
                          mdf_ele_internC = -1.42
                         }
                     }

                  if (mdf_ctrl_00 > 0)
                     {
                      if (dist_00_ele_ang > X + #X/2)
                         { mdf_ele_internC = -1.5 }
                      if ( dist_02_ele > X - X/10  &  dist_31_ele > #Z + X/2 + 10  &  dist_00_ele_ang > X + #Z/3 + 10  &  dist_00_ele_ang > #Z + X/3 + 10
                         & dist_33_ele_ang > #X + 50
                         )
                         { mdf_ele_internC = -1.51 }
                     }
                 }

             // 19.05.2017
              if (ABS(mdf_ang_ele-mdf_ang_mdf_att) >= 179 & ABS(mdf_ang_ele-mdf_ang_mdf_att) <= 181)
                 {
                  if (mdf_ctrl_00 > 0)
                     {
                      if (dist_00_ele_ang < 50  &  dist_00_ele_ang < dist_01_ele+10)
                         {
                          if (dist_31_ele > X  &  dist_32_ele > X+#X  &  dist_33_ele_ang > X+#X)
                             { mdf_ele_internC = -1.6 }
                         }
                     }
                 }

              if (PADRE(idx_troCol, -1) != PADRE(idx_att, -1) )
                 {
                  // Colonna vicina a pensile Angolo ridotto in profondita
                  if (IS_MATCH(NOME(idx_troCol), "*Ang*") == 1)
                     {
                      if (dist_02_ele > X + #X/2 + #X/20  |  dist_31_ele > X + #X/2 + #X/20)
                         { mdf_ele_internC = -1.6 }
                     }
                  Ba0_ele = [#base_0.x, 0, #base_0.z]
                  dist_00_ele_ang = DISTANZA(Ba0_att, Ba0_ele)
                 }
             }
         }
      if (mdf_ele_internC > 0)
         {
          // 05.02.2025 ScBROWSER2120656 GraficaForiRipiano filgio di ForaturaRipiano. Lo fa lo stesso, ma è giusto che sia con l' elemento corretto
          if (IS_MATCH(NOME(idx_troCol), "*raf*ori*Rip*") == 1)
             {
              if (VAR_VAL(idx_troCol, "Y") < 2)
                 {
                  if ( IS_MATCH(NOME(PADRE(idx_troCol, 1)), "*Rip*") == 1
                     & VAR_VAL(PADRE(idx_troCol, 1), "Y") >= 2
                     )
                     {
                      mdf_ele_internC = mdf_ele_internC-1000
                     }
                 }
             }
         }
   }

   PROCEDURA MdF_while_CollisionBas
   {
      if (VAR_EXIST(idx_att, "idx_MdF") != 1)  { idx_MdF = idx_att }

      GOSUB mdf_idx_Battuta_SX
      GOSUB mdf_idx_Battuta_DX

      idx_Basette = mdf_idx_Battuta_DX
      if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "SX*") )  { idx_Basette = mdf_idx_Battuta_SX }

      COMPONENTI2("camSatBasetta", idx_Basette, "MdF_Sat_BasBat")
      icBas = 1
      while (icBas <= camSatBasetta)
         {
          camBasetteVis = camSatBasetta[icBas]
          // 03.08.2022
          idx_MdFgraf_BasVis = VAR_VAL(camBasetteVis, "idx_MdFgraf")
          if (IS_IDX(idx_MdFgraf_BasVis) )
             {
              if (VAR_VAL(idx_MdFgraf_BasVis, "id_Cer") == id_collision)
                 {
                  // La X del sat e' 18.5, quindi non del tutto sufficiente, ma il controllo poi è da fare in y
                  // perche' l' ingombro da controllare e' 25 in y, ma 30 in x.
                  // Vedi anche sat che in x nel sat destro non e' proprio corretto, ma non dovrebbe esser un problema
                  //if (IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "DX*") )  { dist_ToSearch = dist_ToCollision-10 }

                  BOX_MODE(0)

                  // Il fatto di aggiungere un valore al dist_ToSearch dipende dal fatto che l' MdF_Sat_BasBat e' posizionato fuori della sua Z
                  // tranne per un 0.5, questo perché sarebbe da sistemare in Z i sat MdF_BasettaSXDX_SX.sat/DX.sat e poi relativi offsetz
                  // mdf_sat_offz_BasBat_1_SX/DX
                  // Pertanto
                  // se il Telaio*Estr sta a 78 da filo fronte, ragionavolmente la distanza diagonale minina deve essere di circa 78
                  // se il BL_Ripiano sta a 50 da filo fronte, ragionavolmente la distanza diagonale minina deve essere di circa 50
                  // Oppure andrebbe sistemato il sat e riposizionato che sarebbe anche una cosa buona e giusta e veloce
                  // Per il cont_collide_Ante invece il problema non c'e' perché questo va fuori in z quindi si sovrappone alla
                  // posizione del sat
                  // Non ha senso aggiungere un _cont_Collide_Sat figlio degli MdF_Sat_BasBat e adattare la posizione su questo figlio
                  // perche' appesantirebbe di molto il sistema visto anche che basterebbe una piccola sistemazione sat
                  // riposizionandolo in z
                  // Se così non dovesse funzionare bene, andrebbe sistemato il sat, oppure fatto il NEAR sui _cont_collide
                  // del Telaio e del Ripiano se esistono. In realta non serve perche' se trova elementi vicini con questa
                  // distanza vuol dire che in X e Z e' effettivamente sovrapposto, bastera' controllare che ci sia la
                  // collisione in y
                  // qui basta in y perche' in x e' sicuro che sono sopra se li trova.
                  // Poi il problema qui si pone in z per cui c'e' l' aumento della distanza da controllare
                 // 07.10.2022 Sc1022111999
                  mdf_addctrl_sposta_Bas = VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_Bas", STR(id_collision)))
                 // 27.11.2023 Sc114677
                  // Il sat Basetta in pratica parte da fuori a 612.5, mentre il Ripiano a 562.5, quindi 50 dovrebbe bastare
                  // mancava + ABS(mdf_collY_sposta_Bas_att) in modo da trovarlo sempre, come anche sopra
                  mdf_collY_sposta_Bas_att = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))
                  // Se dovesse aver problemi togliere +ABS(mdf_collY_sposta_Bas_att), perchè avendo corretto sopra diciamo che qui potrebbe anche non
                  // essere necessario, piu che altro per non rischiare di trovare anche altri elementi se rientra dopo lo spostamento

                  // 05.12.2024 1057073
                  //dist_ToCollisionRip = 25.1+ABS(mdf_collY_sposta_Bas_att)
                  // 1057073 così evito di sentire Ripiani di altre scocche
                  //if (VAR_VAL(camBasetteVis, "mdf_correggi_basz") > 10)
                  //   {
                  //    dist_ToCollisionRip = 0+ABS(mdf_collY_sposta_Bas_att)
                  //    if (VAR_VAL(camBasetteVis, "mdf_correggi_basz") > 25.1)
                  //       { dist_ToCollisionRip = -8+ABS(mdf_collY_sposta_Bas_att) }
                  //   }
                  // In realta essendo l' unico caso che gestisce cosi le collisioni (MdF_Ctrl_Collision_Bas), se corretto MdF_Sat_BasBat imposto il valore corretto
                  dist_ToCollisionRip = ABS(mdf_collY_sposta_Bas_att)

                  NEAR_GLOBALE("camVicBasette", camBasetteVis, dist_ToCollisionRip+25.1+mdf_addctrl_sposta_Bas, 1, mdF_collY_archetipoBas)
                  if (camVicBasette == 0)
                     {
                      if (VAR_VAL(idx_att, "mdfBasettaVic") == 0)
                         {
                          if (VAR_EXIST(idx_att, STRCAT("MdfSys_collis_idx_Bas", STR(id_collision))) )
                             {
                              DEL_VAR(idx_att, STRCAT("MdfSys_collis_idx_Bas", STR(id_collision)))
                              DEL_VAR(idx_att, STRCAT("MdfSys_collis_arch_Bas", STR(id_collision)))
                              // 07.10.2022
                              DEL_VAR(idx_att, STRCAT("mdf_collY_sposta_Bas", STR(id_collision)))

                              // 27.11.2023
                              // Per ora come debug
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collis_sposta_Bas_att", STR(id_collision)), mdf_collY_sposta_Bas_att, 0, "")
                             }
                         }
                     }
                  GOSUB MdF_Collision_BasBat
                 }
             }

          icBas = icBas+1
         }
   }

   PROCEDURA MdF_Collision_BasBat
   {
      iVBas=1
      while (iVBas <= camVicBasette)
         {
          // Se trova il _cont_collide_Ante di se stesso
          if ( PADRE(idx_att, 2) != PADRE(camVicBasette[iVBas], 1)
             & PADRE(idx_att, 2) != PADRE(camVicBasette[iVBas], 2)
             & PADRE(idx_att, 2) != PADRE(camVicBasette[iVBas], 3)
             & IS_MATCH(NOME(PADRE(camVicBasette[iVBas], -1)), "*Anta*") != 1
             )
             {
              basy_Fro = VAR_VAL(idx_MdF, "base_0.y")
              idCer = VAR_VAL(camBasetteVis,"id_Reggraf")
              basy_IngBaset = basy_Fro + VAR_VAL(idx_MdF, STRCAT("py_CerBat", STR(idCer))) - 12.5
              alty_IngBaset = basy_Fro + VAR_VAL(idx_MdF, STRCAT("py_CerBat", STR(idCer))) + 12.5

              camG_idxEleColl = camVicBasette[iVBas]
              basy_Ele = VAR_VAL(camG_idxEleColl, "base_0.y")
              alty_Ele = VAR_VAL(camG_idxEleColl, "alto_0.y")

              is_collisionB = 0
              if (basy_Ele <= basy_IngBaset  &  alty_Ele >= basy_IngBaset)  { is_collisionB = 1 }
              if (basy_Ele >= basy_IngBaset  &  basy_Ele <= alty_IngBaset)  { is_collisionB = 2 }

              SET_#(camBasetteVis)
              bas0_Bas = #base_0
              bas3_Bas = #base_3
              SET_#(camG_idxEleColl)
              bas1_EleColl = #base_1
              bas2_EleColl = #base_2
              dist_Bas3EleTrov1 = DISTANZA(bas3_Bas, bas1_EleColl)
              dist_Bas0EleTrov2 = DISTANZA(bas0_Bas, bas2_EleColl)

              if (IS_MATCH(NOME(camG_idxEleColl), "_cont_collide_Ante*") )
                 {
                  if ( ABS(VAR_VAL(camG_idxEleColl, "ang_y")) < 85
                     | ABS(VAR_VAL(camG_idxEleColl, "ang_y")) > 95
                     )
                     {
                      is_collisionB = -1
                     }
                 }

              if (is_collisionB > 0)
                 {
                  if (IS_MATCH(NOME(camG_idxEleColl), "*collide*"))  { idx_troCollisB = PADRE(camG_idxEleColl, 2) }
                  idx_troCollisB = camG_idxEleColl
                  mdf_colis_idx_Bas = camVicBasette[iVBas]
                  // 27.11.2023 Sc114677
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collis_idx_BasEle", STR(id_collision)), mdf_colis_idx_Bas, 0, "")
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collis_idx_Bas",    STR(id_collision)), camBasetteVis, 0, "")
                  VAR_CREATE_STR(idx_att, STRCAT("MdfSys_collis_arch_Bas",   STR(id_collision)), mdF_collY_archetipoBas, 0, "")
                  dist_Bas3EleTrov1_att = dist_Bas3EleTrov1
                  dist_Bas0EleTrov2_att = dist_Bas0EleTrov2
                 }
             }
          iVBas = iVBas+1
         }
   }


  // 03.11.2017
   PROCEDURA MdF_Ctrl_Collis_CerBat_CerVic
   {
      // Occhio che mdf_collY_CerVic non e' la distanza minima tra cerniere (MCB_distMin_CerVic),
      // ma la distanza che vorrei mantenere se possibile tra l' accoppiata cerniere vicine se una delle 2 collide con qualcosa
      if (mdf_collY_CerVic < 10)  { EXITSUB() }

      mdf_id_sp = 1
      mdf_collY_sposta_id_CerVic_deb = VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_collY_trovataCol)))
      mdf_collY_sposta_id_sp_att     = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))

      mdf_collY_sposta_id_sp     = VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_collY_trovataCol)))
      mdf_collY_sposta_id_sp_inv = VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_collY_trovataCol), "_inv"))

      dist_CentriLav_CV = basy_trov+y_trov/2 - basy_CerCn

      mdf_maked_spostaCerVic = 0

      mdf_id_pyCer = 1
      while (VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(mdf_id_pyCer))) > 0)
         {
          // 25.09.2018
          // Può essere che la 3 sia a 0 e cè la 4 come aggiuntiva in alto
          if (VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mdf_id_pyCer))) > 0)
             {
              if (mdf_id_pyCer != id_collision)
                 {
                  mdf_py_Cer_suc_prec = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mdf_id_pyCer)))
                  mdf_collY_diff_suc_prec = ABS(mdf_py_CerBat_ctrl + mdf_collY_sposta_id_sp - mdf_py_Cer_suc_prec)

                  //if (PADRE(idx_att, -1) == 4053)  { DISPLAY2(STRCAT("mdf_collY_diff_suc_prec=", STR(mdf_collY_diff_suc_prec), " mdf_py_Cer_suc_prec", STR(mdf_py_Cer_suc_prec))) }

                  if (mdf_collY_diff_suc_prec < mdf_collY_CerVic)
                     {
                      if (mdf_py_Cer_suc_prec + mdf_collY_sposta_id_sp > Y-mdf_collY_CerVic)
                         {
                          //if (PADRE(idx_att, -1) == 4053)  { DISPLAY2(STRCAT("mdf_collY_sposta_id_sp=", STR(mdf_collY_sposta_id_sp))) }
                          if (mdf_collY_sposta_id_sp > 0)
                             {
                              if (dist_CentriLav <= 40)
                                 {
                                 // Se spostando l' altra cerniera questa va troppo in alto allora
                                 // non la sposto e inverto lo spostamento della cerniera in collisione
                                  // Pan.003, 010
                                  sposta_dist_CentriLav = 0
                                  if (dist_CentriLav > 0)  { sposta_dist_CentriLav = -dist_CentriLav }
                                  // 15.10.2018 Pann.113
                                  //DISPLAY2(STRCAT("basy_CerCn+y_trov/2=", STR(basy_CerCn+y_trov/2)))

                                  if (basy_CerCn > basy_trov+y_trov/2)
                                     {
                                      mdf_CerVic_case = 1
                                      spsota_CerVic_case_1 = -mdf_collY_sposta_id_sp-dist_CentriLav
                                     // 24.04.2025 St62112 dipende sempre da mdf_collY_CerVic se vale 75 entra qui
                                      if (VAR_VAL(idx_att, "MCB_sposta_CerVic_STD") != 0)
                                         {
                                          spsota_CerVic_case_1 = -mdf_collY_sposta_id_sp
                                         }
                                      if (mdf_py_CerBat_ctrl < mdf_py_Cer_suc_prec)
                                         {
                                          if (dist_CentriLav_CV < 0)
                                             {
                                              // Ce000106, Ce000693 dipende se MCB_collY_sposta_5 vale 32 o 64
                                              // Con la gestione degli sposta di default puo essere che non basti invertire se di partenza lo spostamento e' piccolo
                                             // 18.04.2023 A125902
                                              //if (ABS(mdf_collY_sposta_id_sp)+dist_CentriLav_CV < mdf_collY_dist_ctrl)
                                              // Se mi sposto di - dist_CentriLav arrivo al centro, poi mi sposto di -32, non basta
                                              // Se faccio -32 e poi -32 ma senza -dist_CentriLav arrivo a -64 che però con 22.5 di dist_CentriLav è ancora inferiore a 45
                                              if ( ABS(mdf_collY_sposta_id_sp) < mdf_collY_dist_ctrl
                                                 // Per avere senso devo avere lo spostamento per PASSO
                                                 & VAR_VAL(idx_att, "MCB_sposta_Cer_PASSO") > 1
                                                 )
                                                 {
                                                  mdf_CerVic_case = 1.3
                                                  spsota_CerVic_case_1 = -mdf_collY_sposta_id_sp-MCB_sposta_Cer_PASSO
                                                  if (ABS(spsota_CerVic_case_1)+dist_CentriLav_CV < mdf_collY_dist_ctrl)
                                                     {
                                                      spsota_CerVic_case_1 = spsota_CerVic_case_1-MCB_sposta_Cer_PASSO
                                                     }
                                                 }
                                             // 12.05.2025 St946221 sposta -40, ma distanza -39, in pratica si posiziona sopra
                                              // Quindi +1 al posto di -40
                                              // Avendo cambiato mdf_collY_CerVic da 70 a 75 ci sono molte piu situazioni perchè entra in controlli diversi
                                              // perché 110-40 di spostamento = 70 tra le 2 cerniere in alto e prima era appunto uguale al minimo e quindi non c'erano problemi, mentre adesso non va bene perché appunto 70 minore di 75
                                              if (spsota_CerVic_case_1 < 0)
                                                 {
                                                  if (VAR_VAL(idx_att, "MCB_sposta_CerVic_STD") != 0)
                                                     {
                                                      if (spsota_CerVic_case_1-dist_CentriLav_CV < mdf_collY_dist_ctrl)
                                                         {
                                                          mdf_CerVic_case = 1.31
                                                          spsota_CerVic_case_1_att = spsota_CerVic_case_1
                                                          spsota_CerVic_case_1 = -spsota_CerVic_case_1+dist_CentriLav_CV

                                                          mdf_collY_diff_suc_prec_sposta_CerVic_1 = ABS(mdf_py_CerBat_ctrl + spsota_CerVic_case_1 - mdf_py_Cer_suc_prec)
                                                          if (mdf_collY_diff_suc_prec_sposta_CerVic_1 < mdf_collY_CerVic)
                                                             {
                                                              spsota_CerVic_case_1 = spsota_CerVic_case_1_att+dist_CentriLav_CV
                                                             }
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), spsota_CerVic_case_1, 0, "")

                                      // 17.02.2020 S1049127
                                      if (VAR_EXIST(idx_att, "mdf_collY_dist_minima") )
                                         {
                                          mdf_collY_dist_y_mm = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
                                          mdf_collY_dist_minima_att = mdf_collY_dist_minima
                                          mdf_sposta_inv_distmin_per_CerVic = dist_CentriLav + y_trov/2 + mdf_collY_dist_minima_att
                                          mdf_CerVic_case = 1.1
                                         // 03.08.2023 Ce001039 basy_CerCn > (basy_trov+y_trov/2)
                                          mdf_collY_dist_minima_Vic11 = VAR_VAL(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n)))
                                          if (mdf_collY_dist_minima_att < 0)
                                             {
                                              mdf_CerVic_case = 1.4
                                              mdf_sposta_inv_distmin_per_CerVic = dist_CentriLav + y_trov/2 + ABS(mdf_collY_dist_minima_att)
                                             }
                                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -mdf_sposta_inv_distmin_per_CerVic, 0, "")
                                         }
                                     }
                                  else
                                     {
                                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -mdf_collY_sposta_id_sp+dist_CentriLav, 0, "")
                                      mdf_CerVic_case = 1.2
                                     // 05.09.2023 Ce000106 (Facendo i test) Divisione piu in alto quindi non passa piu per mdf_CerVic_case 1.3, quindi sarebbe piu corretto cosi
                                      if (VAR_VAL(idx_att, "MCB_sposta_Cer_PASSO") > 1)
                                         {
                                          mdf_collY_sposta_id_sp_1_2 = mdf_collY_sposta_id_sp
                                          if ( ABS(mdf_collY_sposta_id_sp)/2 == ABS(VAR_VAL(idx_att, "MCB_sposta_Cer_PASSO"))
                                             & mdf_collY_sposta_id_sp > 0
                                             & ABS(mdf_collY_sposta_id_sp) > mdf_collY_dist_ctrl
                                             )
                                             {
                                              mdf_CerVic_case = 1.5
                                              spsota_CerVic_case_1 = -mdf_collY_sposta_id_sp
                                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), spsota_CerVic_case_1, 0, "")
                                             }
                                         }

                                     }
                                 }
                              if (dist_CentriLav > 40)
                                 {
                                  sposta_dist_CentriLav = mdf_collY_CerVic-dist_CentriLav
                                  if (sposta_dist_CentriLav == 0)
                                     {
                                      if (mdf_py_CerBat_ctrl < mdf_py_Cer_suc_prec)
                                         {
                                          // Se spostando l' altra cerniera va sopra esattamente all' altra mi farebbe spostamento 0 che se sono
                                          // in collisione con qualcosa mi rimane appunto in collisione
                                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -mdf_collY_sposta_id_sp, 0, "")
                                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), mdf_collY_sposta_id_sp, 0, "")
                                          mdf_CerVic_case = 2
                                          mdf_maked_spostaCerVic = mdf_id_pyCer
                                         }
                                     }
                                  else
                                     {
                                      if (mdf_py_CerBat_ctrl < mdf_py_Cer_suc_prec)
                                         {
                                          // Se spostando l' altra cerniera va sopra esattamente all' altra mi farebbe spostamento 0 che se sono
                                          // in collisione con qualcosa mi rimane appunto in collisione
                                          if (basy_CerCn > basy_trov+y_trov/2)
                                             {
                                             // 18.04.2023 Sc1023023091 Se lo spostamento e' in negativo e la cerniera in alto e' gia fuori dalla collisione
                                              // non la sposto anche se non rimane piu l' accoppiata in alto, perchè altrimenti la cerniera in alto mi va lei in collisione con l' elemento
                                              basy_CerCn_suc_prec = base_0.y + mdf_py_Cer_suc_prec
                                              dist_altoEle_CnCerSupPrec = basy_CerCn_suc_prec - (basy_trov+y_trov)
                                              //sposta_Cer_Contr_Vic31 = -VAR_VAL(idx_att, "mdf_collY_dist_minima") - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) - mdf_Y_Ele_CollY/2
                                              sposta_Cer_Contr_Vic31 = -mdf_collY_dist_ctrl - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) - mdf_Y_Ele_CollY/2
                                              dist_CentriLav_Vic31 = dist_CentriLav
                                              mdf_collY_sposta_id_sp_Vic31 = mdf_collY_sposta_id_sp
                                              //if (dist_altoEle_CnCerSupPrec > VAR_VAL(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n))) )
                                              //if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n))) )
                                              if ( mdf_collY_sposta_id_sp-dist_CentriLav < 0
                                                 & dist_altoEle_CnCerSupPrec > mdf_collY_dist_ctrl
                                                 )
                                                 {
                                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), sposta_Cer_Contr_Vic31, 0, "")
                                                  mdf_CerVic_case = 30.1
                                                 // 19.07.2023 come sotto 30.2
                                                  if (VAR_EXIST(idx_att, "MCB_collY_dist_SE_CerVic") )
                                                     {
                                                      mdf_CerVic_case = 30.2
                                                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -mdf_collY_sposta_id_sp-dist_CentriLav, 0, "")
                                                     }
                                                 }
                                              else
                                                 {
                                                  // 04.05.2023 Sc1023030682 Seconda Cer in alto collisione Guida
                                                  if ( mdf_collY_sposta_id_sp-dist_CentriLav <= dist_altoEle_CnCerSupPrec
                                                     & mdf_collY_sposta_id_sp > 50
                                                     & sposta_Cer_Contr_Vic31 < 0
                                                     )
                                                     {
                                                      mdf_CerVic_case = 30.3
                                                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), sposta_Cer_Contr_Vic31, 0, "")
                                                     // 19.07.2023 A015756
                                                      if (VAR_EXIST(idx_att, "MCB_collY_dist_SE_CerVic") )
                                                         {
                                                          mdf_CerVic_case = 30.2
                                                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -mdf_collY_sposta_id_sp-dist_CentriLav, 0, "")
                                                         }
                                                     }
                                                  else
                                                     {
                                                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta_id_sp-dist_CentriLav, 0, "")
                                                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), mdf_collY_sposta_id_sp-dist_CentriLav, 0, "")
                                                      mdf_CerVic_case = 3.1
                                                      mdf_maked_spostaCerVic = mdf_id_pyCer
                                                     }
                                                 }
                                             }
                                          else
                                             {
                                              // 83631 002
                                              // 105063 048
                                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -mdf_collY_sposta_id_sp+dist_CentriLav, 0, "")
                                              mdf_CerVic_case = 3.2
                                             }
                                         }
                                      else
                                         {
                                         // Pan. 017, 024, 059
                                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), sposta_dist_CentriLav, 0, "")
                                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), sposta_dist_CentriLav, 0, "")
                                          mdf_CerVic_case = 3.3
                                          mdf_maked_spostaCerVic = mdf_id_pyCer
                                         }
                                     }
                                 }
                             }
                         }
                      else
                         {
                          // viene fatto il DEL_VAR pertanto se è impostato dalla cerniera precedente poi quando entra questa
                          // il DEL_VAR vanifica la variabile pertanto ne creo una nuova
                          if (mdf_collY_sposta_id_sp < 0)
                             {
                              //DISPLAY2(STRCAT("mdf_py_Cer_suc_prec=", STR(mdf_py_Cer_suc_prec), " mdf_collY_diff_suc_prec=", STR(mdf_collY_diff_suc_prec), " mdf_collY_CerVic=", STR(mdf_collY_CerVic)))
                              //DISPLAY2(STRCAT("mdf_collY_trovataCol=", STR(mdf_collY_trovataCol), " mdf_collY_sposta_id_sp=", STR(mdf_collY_sposta_id_sp)))
                              if (dist_CentriLav <= 40)
                                 {
                                  mdf_CerVic_case = 4
                                 // Se spostando l' altra cerniera questa va a toccare l' altra
                                 // Pan.031, 038
                                  sposta_dist_CentriLav = 0
                                  sposta_dist_CerVic = 0
                                  if (dist_CentriLav > 0)
                                     {
                                      mdf_CerVic_case = 4.1
                                      sposta_dist_CentriLav = mdf_collY_CerVic-dist_CentriLav
                                      mdf_debug_daCerVic4_mdf_collY_sposta_id_sp = mdf_collY_sposta_id_sp
                                      mdf_debug_daCerVic4_sposta_dist            = sposta_dist_CentriLav
                                      mdf_debug_daCerVic4_dist_CentriLav         = dist_CentriLav
                                      // 23.02.2023 Ce022225 Per spostare a passo come da sposta da VariabiliMdF
                                      // Siccome in questo case le sposto entrambe
                                      // 1 meglio spostarle del valore piu basso (esempio -64) che mi fa uscire dalla collisione piuttosto di (-90)
                                      // 2 se ho lo spostamento a passo non lo farebbe a passo
                                      if ( mdf_collY_dist_ctrl < mdf_collY_CerVic
                                         & ABS(mdf_collY_sposta_id_sp)+dist_CentriLav_CV >= mdf_collY_dist_ctrl
                                         // 19.09.2023 Ce02572 -74.5 non e' sufficiente come -87. Poi c'è il problema dell' altra
                                         // cerniera che spostandosi va a collidere con l' altra sponda piu in basso
                                         //& ABS(mdf_collY_sposta_id_sp) < sposta_dist_CentriLav
                                         //& basy_CerCn < basy_trov + y_trov/2
                                         )
                                         {
                                          // il meno e' perche poi fa di nuovo -
                                          sposta_dist_CentriLav = -mdf_collY_sposta_id_sp
                                         }
                                      mdf_debug_daCerVic4_1_mdf_collY_sposta_id_sp = mdf_collY_sposta_id_sp
                                      mdf_debug_daCerVic4_1_sposta_dist            = sposta_dist_CentriLav
                                      mdf_debug_daCerVic4_1_dist_CentriLav         = dist_CentriLav

                                     // 02.07.2021 ACL72541 Cer piu in alto Case5 sta sopra Rip, cer sotto sta sotto a Rip Case2
                                      // Qui a fare il controllo arriva la cer in alto
                                      // Vedi anche AOCP050601 e S0111905731
                                      mdf_collY_Vic_Case_Ctrl = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"))

                                      if ( basy_CerCn-yCer/2 > basy_trov
                                         | basy_CerCn > basy_trov + y_trov
                                         )
                                         {
                                          if (sposta_dist_CentriLav < ABS(mdf_collY_sposta_id_sp) )
                                             {
                                              mdf_CerVic_case = 40.1
                                              //sposta_dist_CentriLav = -mdf_collY_sposta_id_sp
                                              sposta_dist_CentriLav = mdf_collY_CerVic+dist_CentriLav

                                              mdf_collY_diff_suc_prec4 = ABS(mdf_py_CerBat_ctrl - sposta_dist_CentriLav - mdf_py_Cer_suc_prec)
                                             }
                                         }

                                      // 08.02.2021 S1021008081 FasciaFrontColFrigo
                                      // Rivedi anche AOCP050601 60-10.5=49.5
                                      if ( sposta_dist_CentriLav < ABS(mdf_collY_sposta_id_sp)
                                         // 11.02.2021
                                         & sposta_dist_CentriLav < VAR_VAL(idx_att, "mdf_Y_Ele_CollY")/2
                                         & dist_CentriLav < VAR_VAL(idx_att, "mdf_Y_Ele_CollY")/2
                                         )
                                         {
                                          sposta_dist_CentriLav_debV4_2 = sposta_dist_CentriLav
                                          dist_CentriLav_debV4_2 = dist_CentriLav
                                          mdf_Y_Ele_CollY_debV4_2 = VAR_VAL(idx_att, "mdf_Y_Ele_CollY")
                                          mdf_collY_sposta_id_sp_debV4_2 = mdf_collY_sposta_id_sp
                                          mdf_CerVic_case_att4_2 = VAR_VAL(idx_att, "mdf_CerVic_case")
                                         // 01.12.2022 Sc1022127393
                                          // mdf_collY_diff_suc_prec vale 12
                                          // sposta_dist_CentriLav 76.5
                                          // mdf_collY_diff_suc_prec4 vale 19.5 da 96-76.5
                                          // La prima in alto si abbasserebbe di 76.5
                                          mdf_collY_diff_suc_precV_4_2 = mdf_collY_diff_suc_prec
                                          mdf_id_collision_debV_4_2 = id_collision
                                          mdf_id_pyCer_devV_4_2 = mdf_id_pyCer
                                         // 01.12.2022 Sc1022127393
                                          // Entrambe sentono la collisione, ma la prima entra gia in mdf_CerVic_case 40.1
                                          // oppure dovrei fare ABS(sposta_dist_CentriLav) < mdf_collY_CerVic
                                          if (VAR_EXIST(idx_att, "mdf_collY_diff_suc_prec4") != 1)
                                             {
                                              mdf_CerVic_case = 4.2
                                              sposta_dist_CentriLav = -mdf_collY_sposta_id_sp

                                              mdf_collY_spostaMinCer = mdf_collY_diff_suc_prec-mdf_collY_CerVic
                                              sposta_dist_CerVic = mdf_collY_spostaMinCer
                                             }
                                         }

                                      // 14.01.2020 S728123
                                      // MCB_sposta_CerVic_STD=1 per mantenere lo spostamento di collisione invariato dalla gestione standard-cliente cioe con MCB_collY_sposta_n,
                                      // mentre se si considera mdf_collY_CerVic lo spostamento e' fatto per mantenere invariata
                                      // la distanza tra cerniera con il centro elementoInCollisione e cioè pari appunto a mdf_collY_CerVic
                                      if (VAR_VAL(idx_att, "MCB_sposta_CerVic_STD") != 0)
                                         { sposta_dist_CentriLav = -mdf_collY_sposta_id_sp }
                                     }
                                  else
                                     {
                                      mdf_CerVic_case = 4.3
                                      // 092601 001
                                      // 092502 001
                                      // 31.01.2020 S751671
                                      sposta_dist_CentriLav = mdf_collY_CerVic+dist_CentriLav

                                      if (basy_CerCn + sposta_dist_CentriLav+32+9 > alto_0.y)
                                         {
                                          mdf_CerVic_case = 4.4
                                          sposta_dist_CentriLav = ABS(mdf_collY_sposta_id_sp_inv)
                                         }
                                      // 21.04.2021 S2021001410 sono gia nel caso di mdf_collY_sposta_id_sp negativo, quindi se sono cerniera in alto
                                      // difficilmente voglio che me la sposti verso l' alto, quindi il caso sopra va bene se mdf_collY_CerVic+dist_CentriLav
                                      // risulta positivo
                                      // Soprattutto nel caso mdf_ctrl_dist_arch>0 dove lo sposta _inv in realta non ha sempre senso impostarlo
                                      // soprattutto per la cerniera in alto soprattutto se in collisione con elementi con una Y importante
                                      // come per esempio il Lavello dove la cerniera non potra mai spostarsi verso l'alto
                                      if (basy_CerCn+120 + 32+9 > alto_0.y)
                                         {
                                          // Se 4.41 nel ddp Lav_MdfSys_Collision_CerVicCase potrebbe arrivare senza il secondo decimale
                                          mdf_CerVic_case = 4.5
                                          mdf_debug_daCerVic441_dist = dist_CentriLav
                                          // negativo perche poi sotto rifaccio -
                                          //  ABS(70-30)                 < ABS(-75)
                                          if (ABS(sposta_dist_CentriLav) < ABS(mdf_collY_sposta_id_sp))
                                             { sposta_dist_CentriLav = -mdf_collY_sposta_id_sp }
                                         }

                                      if (VAR_VAL(idx_att, "MCB_sposta_CerVic_STD") != 0)
                                         {
                                          mdf_CerVic_case = 4.6
                                          sposta_dist_CentriLav = -mdf_collY_sposta_id_sp_inv
                                          if (basy_CerCn + sposta_dist_CentriLav+mdf_limite_pyCer_InfSup > alto_0.y)
                                             {
                                              mdf_CerVic_case = 4.7
                                              sposta_dist_CentriLav = ABS(mdf_collY_sposta_id_sp_inv)
                                             }
                                         }
                                     }
                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -sposta_dist_CentriLav, 0, "")
                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), -sposta_dist_CentriLav, 0, "")
                                  if (VAR_VAL(idx_att, "sposta_dist_CerVic") != 0)
                                     {
                                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), sposta_dist_CerVic, 0, "")
                                     }
                                  mdf_maked_spostaCerVic = mdf_id_pyCer
                                  mdf_debug_daCerVic4_sposta = sposta_dist_CentriLav
                                  //DISPLAY2(STRCAT("mdf_debug_mdf_collY_CerVic3=", STR(mdf_debug_mdf_collY_CerVic3)))
                                 }
                              if (dist_CentriLav > 40)
                                 {
                                  mdf_CerVic_case = 5
                                  sposta_dist_CentriLav = mdf_collY_CerVic-dist_CentriLav
                                  // 06.06.2019 A060603 KR
                                  //VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), sposta_dist_CentriLav, 0, "")
                                  //VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), sposta_dist_CentriLav, 0, "")
                                  basy_CerCn_suc_prec = base_0.y + mdf_py_Cer_suc_prec
                                  if (basy_CerCn_suc_prec + mdf_collY_CerVic <= basy_trov+y_trov/2)
                                     {
                                      // A060603 CerSup con Ripiano dist_CentriLav_att_CaseVic5_3 49.5 sposta_dist_CentriLav 10.5
                                      // 26.04.2023 SecondaCer con IngombroVasca Lavello A035688 dist_CentriLav_att_CaseVic5_3 101 sposta_dist_CentriLav -31
                                      // Strano non sia uscito prima
                                      //VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -sposta_dist_CentriLav, 0, "")
                                      //VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), -sposta_dist_CentriLav, 0, "")
                                      mdf_CerVic_case = 5.1
                                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -ABS(sposta_dist_CentriLav), 0, "")
                                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), -ABS(sposta_dist_CentriLav), 0, "")
                                      mdf_maked_spostaCerVic = mdf_id_pyCer

                                     // 21.06.2024 ScEM1056262_062101 Base Lavello collide con Catena, ante da 60 con cer accoppiata in alto, mentre ante da 40 solo una cer in alto
                                      // Devono spostarsi allo stesso modo
                                      mdf_coll_case_5_1 = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"))
                                      if (VAR_EXIST(idx_att, STRCAT("MCB_collY_sposta_", STR(mdf_coll_case_5_1) ,"_arch", STR(mdf_arch_n))) )
                                         {
                                          mcb_collY_sposta_arch_5_1 = VAR_VAL(idx_att, STRCAT("MCB_collY_sposta_", STR(mdf_coll_case_5_1) ,"_arch", STR(mdf_arch_n)))
                                          if ( ABS(mcb_collY_sposta_arch_5_1) > ABS(sposta_dist_CentriLav)
                                             & mcb_collY_sposta_arch_5_1 < 0
                                             )
                                             {
                                              mdf_CerVic_case = 5.4
                                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mcb_collY_sposta_arch_5_1, 0, "")
                                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), mcb_collY_sposta_arch_5_1, 0, "")
                                             }
                                         }

                                     // 21.01.2025 Sn2024OCL002438
                                      if (IS_MATCH(NOME(idx_troCol), VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n)))) == 1)
                                         {
                                          GOSUB MdF_sposta_nome_arch
                                          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch_ctrl, "_", STR(mdf_coll_case_nome_arch))) )
                                             {
                                              mcb_collY_sposta_nome_arch = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch_ctrl, "_", STR(mdf_coll_case_nome_arch)))
                                              if ( ABS(mcb_collY_sposta_nome_arch) > ABS(sposta_dist_CentriLav)
                                                 & mcb_collY_sposta_nome_arch < 0
                                                 )
                                                 {
                                                  mdf_CerVic_case = 5.5
                                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mcb_collY_sposta_nome_arch, 0, "")
                                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), mcb_collY_sposta_nome_arch, 0, "")
                                                 }
                                             }
                                         }

                                      // 26.05.2022 Sc1022056889
                                      dist_CentriLav_att_CaseVic5_3 = dist_CentriLav
                                      if ( sposta_dist_CentriLav < ABS(mdf_collY_sposta_id_sp)
                                         & sposta_dist_CentriLav < VAR_VAL(idx_att, "mdf_Y_Ele_CollY")/2
                                         & dist_CentriLav < VAR_VAL(idx_att, "mdf_Y_Ele_CollY")/2
                                         )
                                         {
                                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta_id_sp, 0, "")
                                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), mdf_collY_sposta_id_sp, 0, "")
                                          mdf_CerVic_case = 5.3
                                          mdf_maked_spostaCerVic = mdf_id_pyCer
                                         }
                                     }
                                  else
                                     {
                                      // Vedi anche 125902 113, 120 mdf_CerVic_case 1.1
                                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), sposta_dist_CentriLav, 0, "")
                                      mdf_CerVic_case = 5.2
                                     }
                                 }
                             }
                          else
                             {
                              // 25.07.2022 Em0122202111 Se arrivo qua sono la seconda cerniera in alto
                              // che spostandosi verso l' alto tocca la cerniera piu in alto e quindi conviene lo spostamento verso il basso
                              mdf_collY_dist_minima_Vic = VAR_VAL(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_arch_n)))
                              if (mdf_collY_dist_minima_Vic != 0)
                                 {
                                  mdf_collY_spostaVic_archContr2 = -1*(ABS(mdf_collY_dist_minima_Vic) - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))) - mdf_Y_Ele_CollY/2
                                  //sposta_dist_CentriLav = -mdf_collY_sposta_id_sp+dist_CentriLav
                                  sposta_dist_CentriLav = mdf_collY_spostaVic_archContr2
                                  basy_CerCn_suc_prec = base_0.y + mdf_py_Cer_suc_prec
                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), sposta_dist_CentriLav, 0, "")
                                  mdf_CerVic_case = 50
                                 }
                              else
                                 {
                                  // 08.04.2024 Ce01629
                                  mdf_collY_spostaVic_archContrVic50_1 = -1*(ABS(mdf_collY_dist_ctrl) + VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
                                  if (VAR_VAL(idx_att, "MCB_sposta_Cer_PASSO") > 1)
                                     {
                                      mdf_collY_spostaVic_archContrVic50_1 = -mdf_collY_sposta_id_sp-VAR_VAL(idx_att, "MCB_sposta_Cer_PASSO")
                                      if (mdf_collY_sposta_id_sp <= 32  &  VAR_VAL(idx_att, "MCB_sposta_Cer_PASSO") <= 32)
                                         {
                                          mdf_collY_spostaVic_archContrVic50_1 = -mdf_collY_sposta_id_sp-2*VAR_VAL(idx_att, "MCB_sposta_Cer_PASSO")
                                         }
                                     }

                                  sposta_dist_CentriLav = mdf_collY_spostaVic_archContrVic50_1
                                  basy_CerCn_suc_prec = base_0.y + mdf_py_Cer_suc_prec
                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), sposta_dist_CentriLav, 0, "")
                                  mdf_CerVic_case = 50.1
                                 }
                             }
                         }
                     }
                  else
                     {
                      //if (PADRE(idx_att, -1) == 4053)  { DISPLAY2(STRCAT("mdf_py_CerBat_ctrl-mdf_py_Cer_suc_prec=", STR(ABS(mdf_py_CerBat_ctrl-mdf_py_Cer_suc_prec)))) }
                      // La py_CerBat che entra qui per esser controllata - la py_CerBat di una cerniera successiva o precedente
                      // e' <= di mdf_collY_CerVic che e' il valore distanza minima per non avere collisione
                      if (ABS(mdf_py_CerBat_ctrl-mdf_py_Cer_suc_prec) <= mdf_collY_CerVic)
                         {
                          if (mdf_collY_sposta_id_sp < 0)
                             {
                              if (dist_CentriLav <= 40)
                                 {
                                 // Se spostando l' altra cerniera questa va a toccare l' altra
                                 // Pan.045,052
                                  mdf_CerVic_case = 6
                                  sposta_dist_CentriLav = 0
                                  if (dist_CentriLav > 0)  { sposta_dist_CentriLav = mdf_collY_CerVic-dist_CentriLav }
                                  // 22.02.2023 Ce022225 dist_CentriLav=0 La cerniera sotto controlla quella sopra, ma se lo spostamento
                                  // e' già negativo va bene
                                  sposta_dist_CentriLav_Vic_6 = sposta_dist_CentriLav
                                  dist_CentriLav_CVic_6 = dist_CentriLav_CV
                                  if (mdf_py_CerBat_ctrl < mdf_py_Cer_suc_prec)
                                     {
                                      // Se ho mdf_collY_dist_ctrl=mdf_collY_CerVic, cioe collY_dist_SE_CerVic (es. 60) vuol dire che non voglio solo uscire dalla collisione
                                      // ma voglio anche mantenere la distanza dalla collisione pari a mdf_collY_CerVic
                                      // Vedi A125902
                                      if (mdf_collY_dist_ctrl < mdf_collY_CerVic)
                                         {
                                          // Vedi anche mdf_CerVic_case 8.2
                                          if (ABS(mdf_collY_sposta_id_sp)+dist_CentriLav_CV >= mdf_collY_dist_ctrl)
                                             {
                                              mdf_CerVic_case = 6.1
                                              // In pratica rimane lo spostamento calcolato prima, solo che poi fa -sposta_dist_CentriLav e quindi qui metto -
                                              sposta_dist_CentriLav = -mdf_collY_sposta_id_sp
                                             }
                                          else
                                             {
                                              if (VAR_VAL(idx_att, "MCB_sposta_Cer_PASSO") > 1)
                                                 {
                                                  mdf_CerVic_case = 6.2
                                                  sposta_dist_CentriLav = -1*(mdf_collY_sposta_id_sp-MCB_sposta_Cer_PASSO)
                                                 }
                                             }
                                         }
                                     }

                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -sposta_dist_CentriLav, 0, "")
                                 }
                             }
                          if (mdf_collY_sposta_id_sp > 0)
                             {
                              //if (PADRE(idx_att, -1) == 4053)  { DISPLAY2(STRCAT("dist_CentriLav=", STR(dist_CentriLav))) }
                             // 15.10.2018
                              if (dist_CentriLav <= 40)
                                 {
                                  if (basy_CerCn > basy_trov+y_trov/2)
                                     {
                                      // 83631 002
                                      mdf_collY_sposta_id_sp_att = mdf_collY_sposta_id_sp
                                      mdf_dist_CentriLav_att = dist_CentriLav
                                      mdf_id_pyCer_att = mdf_id_pyCer
                                      mdf_id_collision_att = id_collision

                                      // 24.02.2023 Ce000693 +32 calcolato solo per CerSup meglio di -61 di spostamento entrambe
                                      // Qui sarebbe se uno vuol mantenere invariato il passo delle cer accoppiate in alto, quindi da regole le cerniere hanno il passo = mdf_collY_CerVic
                                      // e se una si sposta leggermente e si vuol mantenerlo. Ma se una va tutta da un' altra parte non ha molto senso
                                      mdf_ipotesi_spostaVic_7_1 = -mdf_collY_sposta_id_sp-dist_CentriLav
                                      mdf_diff_spostaVic_7_1 = mdf_collY_sposta_id_sp-mdf_ipotesi_spostaVic_7_1

                                      mdf_CerVic_case = 7.1
                                      if (mdf_collY_sposta_id_sp-mdf_ipotesi_spostaVic_7_1 < 60)
                                         {
                                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -mdf_collY_sposta_id_sp-dist_CentriLav, 0, "")
                                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), -mdf_collY_sposta_id_sp-dist_CentriLav, 0, "")
                                          mdf_maked_spostaCerVic = mdf_id_pyCer
                                         }
                                     }
                                  else
                                     {
                                      // 23.02.2023 Ce022225
                                      // Qui sarebbe se uno vuol mantenere invariato il passo delle cer accoppiate in alto, quindi da regole le cerniere hanno il passo = mdf_collY_CerVic
                                      // e se una si sposta leggermente e si vuol mantenerlo. Ma se una va tutta da un' altra parte non ha molto senso
                                      mdf_ipotesi_spostaVic_7_2 = -mdf_collY_sposta_id_sp+dist_CentriLav
                                      mdf_diff_spostaVic_7_2 = mdf_collY_sposta_id_sp-mdf_ipotesi_spostaVic_7_2
                                      mdf_CerVic_case = 7.2
                                      if (mdf_collY_sposta_id_sp-mdf_ipotesi_spostaVic_7_2 < 60)
                                         {
                                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -mdf_collY_sposta_id_sp+dist_CentriLav, 0, "")
                                          // 125902 099
                                          // 092601 008
                                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), -mdf_collY_sposta_id_sp+dist_CentriLav, 0, "")
                                          mdf_maked_spostaCerVic = mdf_id_pyCer
                                         }
                                     }
                                 }
                              if (dist_CentriLav > 40)
                                 {
                                  // 102202 Pan 015
                                  // Vedi anche 125902 113, 120 mdf_CerVic_case 1.1
                                  sposta_dist_CentriLav = mdf_collY_CerVic-dist_CentriLav
                                  //VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), sposta_dist_CentriLav, 0, "")
                                  basy_CerCn_suc_prec = base_0.y + mdf_py_Cer_suc_prec
                                  if (basy_CerCn_suc_prec + mdf_collY_CerVic <= basy_trov+y_trov/2)
                                     {
                                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -sposta_dist_CentriLav, 0, "")
                                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), -sposta_dist_CentriLav, 0, "")
                                      mdf_CerVic_case = 8.1
                                      mdf_maked_spostaCerVic = mdf_id_pyCer
                                     }
                                  else
                                     {
                                      // 25.01.2024 Ce08088 deve spostarsi di +6.5, invece faceva -8
                                      // Mantenere il passo tra cerniere e' incompatibile con la collisione, quindi rimane lo spostamento positivo calcolato prima
                                      mdf_CerVic_case_8_2 = 1
                                      if (mdf_collY_sposta_id_sp > 0  &  sposta_dist_CentriLav < 0)
                                         { mdf_CerVic_case_8_2 = 0 }

                                      if (mdf_CerVic_case_8_2 > 0)
                                         {
                                          // Vedi anche 125902 113, 120 mdf_CerVic_case 1.1
                                          mdf_CerVic_case = 8.2
                                          // 09.10.2024 Ce011351
                                          mdf_CerVic_case = 8.3
                                          mdf_sposta_8_3 = alto_0.y-basy_CerCn-mdf_limite_pyCer_InfSup
                                          sposta_Cer_minimo_Vic8_3 = mdf_collY_dist_ctrl - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
                                          mdf_collY_sposta_id_sp_8_3 = mdf_collY_sposta_id_sp

                                          mdf_CerVic_case_8_3 = 0
                                          if (basy_CerCn + sposta_dist_CentriLav+mdf_limite_pyCer_InfSup > alto_0.y)
                                             { mdf_CerVic_case_8_3 = 1 }

                                          if ( mdf_collY_sposta_id_sp > 0
                                             & sposta_dist_CentriLav > mdf_collY_dist_ctrl
                                             & sposta_dist_CentriLav > 0
                                             // Il problema e' la cerniera piu in alto
                                             & basy_CerCn + 147 > alto_0.y
                                             )
                                             { mdf_CerVic_case_8_3 = 2 }

                                          if (mdf_CerVic_case_8_3 > 0)
                                             {
                                              if ( sposta_dist_CentriLav > mdf_collY_dist_ctrl
                                                 & mdf_sposta_8_3 > mdf_collY_dist_ctrl
                                                 & sposta_Cer_minimo_Vic8_3 > 0
                                                 )
                                                 {
                                                  mdf_CerVic_case = 8.4
                                                  mdf_CerVic_sposta_8_4 = sposta_dist_CentriLav
                                                  sposta_dist_limite_alto = alto_0.y-basy_CerCn-mdf_limite_pyCer_InfSup
                                                  sposta_dist_CentriLav = sposta_Cer_minimo_Vic8_3
                                                  if (VAR_VAL(idx_att, "MCB_sposta_Cer_PASSO") > 1)
                                                     {
                                                      if ( MCB_sposta_Cer_PASSO > sposta_Cer_minimo_Vic8_3
                                                         & MCB_sposta_Cer_PASSO < mdf_CerVic_sposta_8_4
                                                         )
                                                         {
                                                          sposta_dist_CentriLav = MCB_sposta_Cer_PASSO
                                                         }
                                                     }
                                                 }
                                             }
                                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), sposta_dist_CentriLav, 0, "")
                                         }
                                     }
                                 }
                             }
                         }
                      else
                         {
                          // 30.11.2018
                          // La py_CerBat che entra qui per esser controllata - la py_CerBat di una cerniera successiva o precedente
                          // e' maggiore di mdf_collY_CerVic che e' il valore distanza minima per non avere collisione
                          // significa che devo spostare solo la cerniera che è in collisione con l' elemento
                          // e mdf_collY_sposta_id_sp > 0
                          // se la cerniera sta piu in alto dell' elemento allora la devo spostare con segno opposto di mdf_collY_sposta_id_sp e -dist_CentriLav
                          // se la cerniera sta piu in basso dell' elemento allora la devo spostare con segno opposto di mdf_collY_sposta_id_sp e +dist_CentriLav

                          if (mdf_collY_sposta_id_sp > 0)
                             {
                              if (dist_CentriLav <= 40)
                                 {
                                  basy_CerCn_suc_prec = base_0.y + mdf_py_Cer_suc_prec
                                 // 17.01.2019
                                  if (ABS(mdf_py_CerBat_ctrl-mdf_py_Cer_suc_prec) <= mdf_collY_sposta_id_sp + ABS(dist_CentriLav) + mdf_collY_CerVic)
                                     {
                                      if (basy_CerCn > basy_trov+y_trov/2)
                                         {
                                          mdf_dist_CentriLav91 = dist_CentriLav
                                          sposta_dist_CentriLav = -mdf_collY_sposta_id_sp-dist_CentriLav

                                          // 01.09.2020 Sc1020039515 Al momento commento, perchè teoricamente non dovrebbe cambiare lo spostamento gia impostato nella gestione normale
                                          // 25.11.2020 vedi anche St810860 che infatti funziona
                                          //VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -mdf_collY_sposta_id_sp-dist_CentriLav, 0, "")
                                          mdf_CerVic_case = 9.1

                                          // 11.03.2021 Sc1049127
                                          // Se la cerniera successiva e' quella piu in alto e lo spostamento della cerniera
                                          // sotto e' in positivo, devo spostare anche quella piu in alto
                                          if (mdf_py_Cer_suc_prec > mdf_py_CerBat_ctrl)
                                             {
                                              if (dist_CentriLav > 0)
                                                 {
                                                  mdf_Sposta_attuale_CerSotto = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))
                                                  basy_CerCn_suc_prec_91 = basy_CerCn_suc_prec
                                                  mdf_collY_diff_suc_prec_att = mdf_collY_diff_suc_prec
                                                  mdf_collY_spostaMinCer = mdf_collY_diff_suc_prec-mdf_collY_CerVic
                                                  basy_CerCn_suc_prec_ToSpost = basy_CerCn_suc_prec + yCer/2 + mdf_Sposta_attuale_CerSotto+mdf_limite_pyCer_InfSup
                                                  // Per ora non faccio niente, perche il problema era MCB_ collY_CerVic a 50 quindi minore di 51
                                                  // pertanto e' piu corretto che non si sposti
                                                  // Meglio che MCB_ collY_CerVic valga 70 o impostare il valore piu corretto possibile!
                                                  //if (basy_CerCn_suc_prec + yCer/2 + mdf_Sposta_attuale_CerSotto+32+9+4 <= alto_0.y)
                                                  //   { VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), mdf_Sposta_attuale_CerSotto, 0, "") }
                                                  //else
                                                  //   { VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), mdf_collY_spostaMinCer, 0, "") }
                                                  mdf_CerVic_case = 9.12
                                                  // 24.04.2025 St62112 Inceve devo fare qualcosa, ma dipende sempre da mdf_collY_CerVic che vale 50, invece corretto sarebbe 75
                                                  if (VAR_VAL(idx_att, "MCB_sposta_CerVic_STD") != 0)
                                                     {
                                                      mdf_diff_CerVic_Sposta_cerSotto = basy_CerCn+mdf_Sposta_attuale_CerSotto-basy_CerCn_suc_prec
                                                      if (mdf_diff_CerVic_Sposta_cerSotto < mdf_collY_CerVic)
                                                         {
                                                          mdf_Margine_NoTroppoSopra = 20
                                                          if (basy_CerCn_suc_prec_ToSpost+mdf_Margine_NoTroppoSopra <= alto_0.y)
                                                             {
                                                              mdf_CerVic_case = 9.13
                                                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), mdf_Sposta_attuale_CerSotto, 0, "")
                                                             }
                                                          else
                                                             {
                                                              mdf_CerVic_case = 9.14
                                                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -mdf_Sposta_attuale_CerSotto, 0, "")
                                                              // 16.05.2025 St632389
                                                              mdf_collY_spostaMinCer_9_14 = mdf_collY_spostaMinCer
                                                              sposta_Cer_minimo_Vic_9_14 = mdf_collY_dist_ctrl - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
                                                              if ( mdf_collY_spostaMinCer < mdf_Sposta_attuale_CerSotto
                                                                 & sposta_Cer_minimo_Vic_9_14 < mdf_collY_spostaMinCer
                                                                 )
                                                                 {
                                                                  mdf_CerVic_case = 9.15
                                                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), sposta_Cer_minimo_Vic_9_14, 0, "")
                                                                 }
                                                              else
                                                                 {
                                                                  mdf_CerVic_case = 9.16
                                                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), -2*mdf_Sposta_attuale_CerSotto, 0, "")
                                                                 }
                                                             }
                                                         }
                                                     }
                                                 }
                                             }
                                         }
                                      else
                                         {
                                          // 21.03.2025 Sc EM2025000562,
                                          // unico caso al mondo precedentemente rilevato EM 2024005575 ma comunque errato
                                          mdf_basy_CerCn_Test_Sup_9_2 = basy_CerCn + mdf_collY_sposta_id_sp + mdf_limite_pyCer_InfSup
                                          mdf_alt_9_2 = alto_0.y - VAR_VAL(idx_att, "MdfSys_SbordoYSup")
                                          if (basy_CerCn + mdf_collY_sposta_id_sp + mdf_limite_pyCer_InfSup > alto_0.y - VAR_VAL(idx_att, "MdfSys_SbordoYSup"))
                                             {
                                              mdf_CerVic_case = 9.2
                                              sposta_dist_CentriLav = -mdf_collY_sposta_id_sp+dist_CentriLav
                                              // in realta entro gia sopra se mdf_collY_sposta_id_sp > 0
                                              if (mdf_collY_sposta_id_sp > 0)
                                                 {
                                                  sposta_dist_CentriLav = -mdf_collY_sposta_id_sp
                                                  if (ABS(sposta_dist_CentriLav) <= mdf_collY_dist_ctrl)
                                                     {
                                                      // Vedi anche mdf_diffbasyCerCnbasyEle
                                                      mdf_diffbasyCerCnbasyEle_9_2 = mdf_diffbasyCerCnbasyEle
                                                      sposta_dist_CentriLav = -mdf_collY_sposta_id_sp-dist_CentriLav
                                                     }
                                                 }

                                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), sposta_dist_CentriLav, 0, "")
                                             // 21.03.2025 Sc EM 2024005575
                                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), sposta_dist_CentriLav, 0, "")
                                             }
                                         }
                                     }
                                 }
                             }
                          else
                             {
                              // 11.04.2025 A006049 mdf_collY_diff_suc_prec = 78.5 > 70
                              // Qui arriva se
                              // mdf_collY_diff_suc_prec > mdf_collY_CerVic   ...mdf_collY_diff_suc_prec = ABS(mdf_py_CerBat_ctrl + mdf_collY_sposta_id_sp - mdf_py_Cer_suc_prec)
                              // ABS(mdf_py_CerBat_ctrl-mdf_py_Cer_suc_prec) > mdf_collY_CerVic
                              // mdf_collY_sposta_id_sp <= 0
                              mdf_py_CerBat_ctrlVic_eSpostam = mdf_py_CerBat_ctrl + mdf_collY_sposta_id_sp
                              // Significa che quella sopra con lo spostamento si sposta sotta ad un' altra, pertanto anche essa sarà in collisione
                              // Apparentemente se mdf_collY_diff_suc_prec > mdf_collY_CerVic potrebbe andar bene ma in realtà anch' essa entrerà nelle collisioni
                              // per spostarsi e si sposterà esattamente sopra all' altra
                              if ( mdf_py_CerBat_ctrl > mdf_py_Cer_suc_prec
                                 & mdf_py_CerBat_ctrlVic_eSpostam < mdf_py_Cer_suc_prec
                                 )
                                 {
                                  mdf_CerVic_case = 10
                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), mdf_collY_sposta_id_sp, 0, "")
                                 }
                             }
                         }
                     }
                 }
             }

          mdf_id_pyCer = mdf_id_pyCer+1
         }
   }

   PROCEDURA MdF_sposta_nome_arch
   {
      if (IS_MATCH(NOME(idx_troCol), VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n)))) == 1)
         {
          mdf_nome_arch_ctrl = VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n)))
          mdf_nome_var_sposta_arch_ctrl = STRCAT("MCB_collY_sposta_", mdf_nome_arch_ctrl)
          if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch_ctrl, "_1")) != 1)
             {
              mdf_var_length = STRLEN(mdf_nome_var_sposta_arch_ctrl)
              mdf_nome_var_sposta_arch_orig = mdf_nome_var_sposta_arch_ctrl
              mdf_var_length_w = mdf_var_length-1
              while ( mdf_var_length_w > 19
                 & VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch_ctrl, "_1")) != 1
                 )
                 {
                  mdf_nome_var_sposta_arch_ctrl = STRMID(0, mdf_var_length_w, mdf_nome_var_sposta_arch_orig)
                  mdf_var_length_w = mdf_var_length_w-1
                 }
             }

          mdf_coll_case_nome_arch = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"))
         }
   }

   PROCEDURA MdF_Ctrl_CerBat_Vic
   {
      mdf_id_sp = 1
      mdf_collY_sposta_id_sp_Vic =  VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))

      if (VAR_VAL(idx_att, "mdf_collY_sposta_id_sp_Vic") <= 0)  { EXITSUB() }

      mdf_id_pyCer = 1
      while (VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(mdf_id_pyCer))) > 0)
         {
          // Può essere che la 3 sia a 0 e cè la 4 come aggiuntiva in alto
          if (VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mdf_id_pyCer))) > 0)
             {
              if (mdf_id_pyCer != id_collision)
                 {
                  mdf_py_Cer_suc_prec = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mdf_id_pyCer)))
                  mdf_collY_diff_suc_prec = ABS(mdf_py_CerBat_ctrl + mdf_collY_sposta_id_sp_Vic - mdf_py_Cer_suc_prec)

                  if (mdf_collY_diff_suc_prec < 96)
                     {
                      mdf_collY_sposta_Vic = -2*mdf_collY_sposta_id_sp_Vic
                      if (ABS(mdf_collY_sposta_id_sp_Vic) <= 32)
                         { mdf_collY_sposta_Vic = -3*mdf_collY_sposta_id_sp_Vic }
                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta_Vic, 0, "")
                     }
                 }
             }

          mdf_id_pyCer = mdf_id_pyCer+1
         }
   }

  // 14.10.2022
   PROCEDURA MdF_Ctrl_Collis_CerBat_2Ele
   {
     // 14.02.2023 VD845949 se BloccoXInterfCer ha @Y=Y
      //mdf_collY_sposta_id_sp =  VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_collY_trovataCol)))
      mdf_collY_sposta_2Ele_trov =  VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_collY_trovataCol)))
      mdf_collY_sposta_2Ele =  VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))
      mdf_collY_sposta_id_sp =  VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))

     // 22.05.2024 BROWSER2055869_2005 Cer5
      mdf_collY_sposta2Ele_ctrl = mdf_collY_sposta_id_sp

      mdf_idcol2E = 1
      while (mdf_idcol2E <= mdf_collY)
         {
          // 05.02.2025 ScBROWSER2120656 GraficaForiRipiano filgio di ForaturaRipiani. Lo fa lo stesso, ma è giusto che sia con l' elemento corretto
          mdf_ele_2Ele_OK = 1
          if (IS_MATCH(NOME(mdf_collY[mdf_idcol2E]), "*raf*ori*Rip*") == 1)
             {
              if (VAR_VAL(mdf_collY[mdf_idcol2E], "Y") < 2)
                 {
                  if ( IS_MATCH(NOME(PADRE(mdf_collY[mdf_idcol2E], 1)), "*Rip*") == 1
                     & VAR_VAL(PADRE(mdf_collY[mdf_idcol2E], 1), "Y") >= 2
                     )
                     {
                      mdf_ele_2Ele_OK = -1
                     }
                 }
             }

          if ( mdf_collY[mdf_idcol2E] != idx_troCol
             // 26.02.2024 S935278 RipianoVertFisso Non ha senso una collisione con elementi Y>=500
             & VAR_VAL(mdf_collY[mdf_idcol2E], "Y") < 500
             & mdf_ele_2Ele_OK > 0
             )
             {
              midx_Trov2E = mdf_collY[mdf_idcol2E]
              if ( PADRE(midx_Trov2E, -1) == PADRE(idx_att, -1)
                 | IS_MATCH(NOME(PADRE(idx_att, -1)), "*_Anta")
                 )
                 {
                  basy_trov2E = VAR_VAL(midx_Trov2E, "base_0.y")
                  alty_trov2E = VAR_VAL(midx_Trov2E, "alto_0.y")
                  // 22.05.2024 BROWSER2055869_2005 Cer5
                  mdf_newposyCer = basy_Cer + mdf_collY_sposta2Ele_ctrl
                  mdf_newaltyCer = alty_Cer + mdf_collY_sposta2Ele_ctrl
                  mdf_newpCenCer = basy_CerCn + mdf_collY_sposta2Ele_ctrl
                  mdf_collis_2Ele_UP = 0
                  mdf_collis_2Ele_DOWN = 0
                  if ( mdf_newposyCer > basy_trov2E
                     & mdf_newposyCer < alty_trov2E
                     )
                     {
                      mdf_collis_2Ele_DOWN = 1
                     }
                  if ( mdf_newaltyCer > basy_trov2E
                     & mdf_newaltyCer < alty_trov2E
                     )
                     {
                      mdf_collis_2Ele_UP = 1
                     }
                  mdf_dist_cenCer_bTrov2E = mdf_newpCenCer - basy_trov2E
                  mdf_dist_cenCer_aTrov2E = alty_trov2E - mdf_newpCenCer
                 // 17.10.2022 ScBROWSER1894534
                  if (VAR_EXIST(idx_att, "mdf_collY_dist_minima") )
                     { mdf_collY_dist_min_att2E = ABS(mdf_collY_dist_minima) }
                  else
                     { mdf_collY_dist_min_att2E = mdf_collY_dist_ctrl }

                 // 28.03.2023 P2022OVB281394 trova Ripiano sopra e sotto VanoCassaforte con spostamento negativo
                  if ( mdf_collis_2Ele_DOWN > 0
                     & mdf_collis_2Ele_UP > 0
                     )
                     {
                      if (mdf_collY_sposta2Ele_ctrl < 0)
                         {
                          mdf_collY_sposta2Ele = -mdf_collY_sposta_id_sp
                          mdf_collY_sposta2Ele_ctrl = mdf_collY_sposta2Ele
                         // 10.04.2024 Ce02980 Mi sposta l' altra che è piu in alto causa Catena e poi rientro per la seconda cer dall' alto
                          // e con quello sposta e' in collisione con una guida CassCest
                          // In realta vedi modifiche 22.01.2025, qui non entra piu perche era errato basy_Cer
                          if (VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(id_collision))) < 0)
                             {
                              mdf_collY_sposta_daCerVic = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(id_collision)))
                              mdf_collY_sposta_collTrov = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))
                              if (mdf_collY_sposta_collTrov < 0  &  mdf_collY_sposta_daCerVic < 0)
                                 {
                                  mdf_collY_sposta2Ele = mdf_collY_sposta_daCerVic + mdf_collY_sposta_collTrov
                                  // Non la cancello, ma la modifico perchè se poi controlla l' archetipo successivo e va in collisione prenderebbe
                                  // quest' ulitmo spostamento che sicuramente non andrà bene, anzi probabilmente andrebbe sopra alla cerniera superiore
                                  // che si è già spostata per colpa di quell' archetipo
                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(id_collision)), mdf_collY_sposta2Ele, 0, "")
                                 }
                             }
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta2Ele, 0, "")
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx_2Ele"), midx_Trov2E, 0, "")
                         }
                     }

                  if ( mdf_collis_2Ele_DOWN > 0
                     & mdf_collis_2Ele_UP <= 0
                     )
                     {
                      if (mdf_collY_sposta2Ele_ctrl < 0)
                         {
                          mdf_collY_sposta2Ele = mdf_collY_sposta2Ele_ctrl - mdf_dist_cenCer_bTrov2E - mdf_collY_dist_min_att2E
                          // 24.02.2023 da test Ce000446
                          mdf_collis_2ELe_DOWN_new = mdf_py_CerBat_ctrl+mdf_collY_sposta2Ele
                          if (mdf_py_CerBat_ctrl+mdf_collY_sposta2Ele < mdf_limite_pyCer_InfSup)
                             {
                              mdf_collY_sposta2Ele = -mdf_collY_sposta_id_sp
                             }
                          mdf_collY_sposta2Ele_ctrl = mdf_collY_sposta2Ele

                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta2Ele, 0, "")
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx_2Ele"), midx_Trov2E, 0, "")
                         }
                     }
                  if (mdf_collis_2Ele_UP > 0)
                     {
                      if (mdf_collY_sposta2Ele_ctrl > 0)
                         {
                          mdf_collY_sposta2EleUP = mdf_collY_sposta2Ele_ctrl + mdf_dist_cenCer_aTrov2E + mdf_collY_dist_min_att2E
                          mdf_collY_sposta2Ele_ctrl = mdf_collY_sposta2EleUP
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta2EleUP, 0, "")
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx_2Ele"), midx_Trov2E, 0, "")
                         }
                      else
                         {
                          // 22.05.2024 BROWSER2055869_2005 Cer5
                          mdf_collY_sposta2EleUP = mdf_collY_sposta2Ele_ctrl - mdf_dist_cenCer_bTrov2E - mdf_collY_dist_min_att2E
                          mdf_collY_sposta2Ele_ctrl = mdf_collY_sposta2EleUP
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta2EleUP, 0, "")
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx_2Ele"), midx_Trov2E, 0, "")
                         }
                     }
                 // 19.09.2023 Ce02572 ricontrollo se sposta_daCerVic fa andare in collisione con altri elementi
                  if (VAR_VAL(idx_att, "mdf_maked_spostaCerVic") != 0)
                     {
                      if (VAR_EXIST(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_maked_spostaCerVic))) )
                         {
                          mdf_py_Cer_sp_Vic = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mdf_maked_spostaCerVic)))
                          basy_Cer_suc_prec = base_0.y + mdf_py_Cer_sp_Vic - yCer/2
                          alty_Cer_suc_prec = base_0.y + mdf_py_Cer_sp_Vic + yCer/2
                          basy_CerCn_suc_prec = base_0.y + mdf_py_Cer_sp_Vic
                          mdf_newposyCerVic = basy_Cer_suc_prec + mdf_collY_sposta_id_sp
                          mdf_newaltyCerVic = alty_Cer_suc_prec + mdf_collY_sposta_id_sp
                          mdf_newpCenCerVic = basy_CerCn_suc_prec + mdf_collY_sposta_id_sp
                          mdf_collis_2Ele_UPVic = 0
                          mdf_collis_2Ele_DOWNVic = 0
                          if ( basy_Cer_suc_prec+mdf_collY_sposta_id_sp > basy_trov2E
                             & basy_Cer_suc_prec+mdf_collY_sposta_id_sp < alty_trov2E
                             )
                             {
                              mdf_collis_2Ele_DOWNVic = 1
                             }
                          if ( alty_Cer_suc_prec+mdf_collY_sposta_id_sp > basy_trov2E
                             & alty_Cer_suc_prec+mdf_collY_sposta_id_sp < alty_trov2E
                             )
                             {
                              mdf_collis_2Ele_UPVic = 1
                             }
                          mdf_dist_cenCer_bTrov2EVic = mdf_newpCenCerVic - basy_trov2E
                          mdf_dist_cenCer_aTrov2EVic = alty_trov2E - mdf_newpCenCerVic

                          if (VAR_EXIST(idx_att, "mdf_collY_dist_minima") )
                             { mdf_collY_dist_min_att2EVic = ABS(mdf_collY_dist_minima) }
                          else
                             { mdf_collY_dist_min_att2EVic = mdf_collY_dist_ctrl }

                          if (mdf_collis_2Ele_DOWNVic > 0)
                             {
                              if (mdf_collY_sposta_id_sp < 0)
                                 {
                                  mdf_collY_sposta2EleVic = mdf_collY_sposta_id_sp - mdf_dist_cenCer_bTrov2EVic - mdf_collY_dist_min_att2EVic

                                  mdf_collis_2ELe_DOWN_newVic = basy_CerCn_suc_prec+mdf_collY_sposta2EleVic

                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_maked_spostaCerVic)), mdf_collY_sposta2EleVic, 0, "")
                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(mdf_maked_spostaCerVic), "_idx_2Ele"), midx_Trov2E, 0, "")
                                 }
                             }
                         }
                     }
                 }
             }

          mdf_idcol2E = mdf_idcol2E+1
         }
   }

  // 04.09.2023
   PROCEDURA MdF_Ctrl_Collis_CerBat_2Ele_Diversi
   {
      mdf_collY_sposta_2EleD_trov =  VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_collY_trovataCol)))
      mdf_collY_sposta_2EleD =  VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))
      mdf_collY_sposta_id_sp =  VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))

      // Per ora limito
      // 16.11.2023
      mdf_ctrl_2Ele = 1
      if (VAR_VAL(idx_troCol, "Y") > 20)
         {
          yTrov2Ele = VAR_VAL(idx_troCol, "Y")
          // Sc1023110458
          if ( IS_MATCH(NOME(idx_troCol), "*Telaio*") != 1
             & IS_MATCH(NOME(idx_troCol), "*Rip*") != 1
             )
             { mdf_ctrl_2Ele = 0 }

          if (IS_MATCH(NOME(idx_troCol), "*Telaio*") == 1)
             {
              if (yTrov2Ele > 60)  { mdf_ctrl_2Ele = 0 }
             }
          if (IS_MATCH(NOME(idx_troCol), "*Rip*") == 1)
             {
              if (yTrov2Ele > 35)  { mdf_ctrl_2Ele = 0 }
             }
         }

      if (mdf_ctrl_2Ele <= 0)  { EXITSUB() }

      mdf_collY_arch2EleD = 0
      if (STRLEN(mdF_collY_archetipo2) > 1)
         {
          NEAR_GLOBALE("mdf_collY_arch2EleD", idx_att, dist_Coll+ABS(mdf_collY_sposta_2EleD_trov), 1, mdF_collY_archetipo2)
          GOSUB mdf_while_collis_2EleD
         }

     // 23.07.2024 Ce06685 Fondo Sovracolonna
      if ( STRLEN(mdF_collY_archetipo1) > 1
         & IS_MATCH(NOME(idx_troCol), STRCAT("*", mdF_collY_archetipo1, "*")) != 1
         // Per ora limito
         // 06.02.2025 VD 2024OVC856728 apro per primo caso
         //& VAR_VAL(idx_att, "MCB_sposta_Cer_PASSO") > 1
         //& VAR_VAL(PADRE(idx_att, 1), "mdf_fia_doppioBattutaX") > 0
         )
         {
          NEAR_GLOBALE("mdf_collY_arch2EleD", idx_att, dist_Coll+ABS(mdf_collY_sposta_2EleD_trov), 1, mdF_collY_archetipo1)
          GOSUB mdf_while_collis_2EleD
         }
     // 16.11.2023 Sc1023110458
      if ( IS_MATCH(mdF_collY_archetipo3, "*Rip*") == 1
         // In teoria si arrangia la MdF_Ctrl_Collis_CerBat_2Ele
         & IS_MATCH(NOME(idx_troCol), "*Rip*") != 1
         )
         {
          NEAR_GLOBALE("mdf_collY_arch2EleD", idx_att, dist_Coll+ABS(mdf_collY_sposta_2EleD_trov), 1, mdF_collY_archetipo3)
          GOSUB mdf_while_collis_2EleD
         }

     // 02.12.2024 AOCL136234
      if ( IS_MATCH(mdF_collY_archetipo5, "*Rip*") == 1
         // In teoria si arrangia la MdF_Ctrl_Collis_CerBat_2Ele
         & IS_MATCH(NOME(idx_troCol), "*Rip*") != 1
         )
         {
          NEAR_GLOBALE("mdf_collY_arch2EleD", idx_att, dist_Coll+ABS(mdf_collY_sposta_2EleD_trov), 1, mdF_collY_archetipo5)
          GOSUB mdf_while_collis_2EleD
         }
   }

   PROCEDURA mdf_while_collis_2EleD
   {
      mdf_idcol2ED = 1
      while (mdf_idcol2ED <= mdf_collY_arch2EleD)
         {
          SET_#(mdf_collY_arch2EleD[mdf_idcol2ED])

          X_ele_collY = VAR_VAL(mdf_collY_arch2EleD[mdf_idcol2ED], "X")
          Z_ele_collY = VAR_VAL(mdf_collY_arch2EleD[mdf_idcol2ED], "Z")
          Ba0_att = [base_0.x, 0, base_0.z]
          Ba3_att = [base_3.x, 0, base_3.z]

          Ba1_ele = [#base_1.x, 0, #base_1.z]
          Ba2_ele = [#base_2.x, 0, #base_2.z]

          dist_02_ele = DISTANZA(Ba0_att, Ba2_ele)
          dist_31_ele = DISTANZA(Ba3_att, Ba1_ele)
          mdf_ele_intern2EleD = 0
          GOSUB MdF_ele_intern_Collision
          if (VAR_VAL(idx_att, "mdf_ele_internC") != -99)  { mdf_ele_intern2EleD = VAR_VAL(idx_att, "mdf_ele_internC") }

          midx_Trov2ED = mdf_collY_arch2EleD[mdf_idcol2ED]
          if ( mdf_ele_intern2EleD > 0
             // Per ora limito
             // 16.11.2023 Sc1023110458
             //& VAR_VAL(midx_Trov2ED, "Y") <= 20
             // 06.02.2025 VD 2024OVC856728 apro per primo caso
             //& VAR_VAL(midx_Trov2ED, "Y") <= 35
             & VAR_VAL(midx_Trov2ED, "Y") <= 46
             )
             {
              if (mdf_collY_arch2EleD[mdf_idcol2ED] != idx_troCol)
                 {
                  // Andrebbe tolta, ma per ora limito
                  if ( PADRE(midx_Trov2ED, -1) == PADRE(idx_att, -1)
                     // 23.07.2024 Ce06685 Fondo Sovracolonna. Per ora apro solo per il Fondo
                     | IS_MATCH(NOME(midx_Trov2ED), STRCAT("*", mdF_collY_archetipo1, "*")) == 1
                     )
                     {
                      midx_Trov2ED_deb1 = mdf_collY_arch2EleD[mdf_idcol2ED]
                      basy_trov2ED = VAR_VAL(midx_Trov2ED, "base_0.y")
                      alty_trov2ED = VAR_VAL(midx_Trov2ED, "alto_0.y")
                      y_2EleD = VAR_VAL(midx_Trov2ED, "Y")
                      y_idx_TroCol_2EleD = VAR_VAL(idx_troCol, "Y")

                      alty_Cer_2EleD = alty_Cer
                      basy_Cer_2EleD = basy_Cer
                      basy_CerCn_2EleD = basy_CerCn

                      mdf_newposyCer = basy_Cer + mdf_collY_sposta_id_sp
                      mdf_newaltyCer = alty_Cer + mdf_collY_sposta_id_sp
                      mdf_newpCenCer = basy_CerCn + mdf_collY_sposta_id_sp
                      mdf_collis_2EleD_UP = 0
                      mdf_collis_2EleD_DOWN = 0
                      if ( basy_Cer+mdf_collY_sposta_id_sp > basy_trov2ED
                         & basy_Cer+mdf_collY_sposta_id_sp < alty_trov2ED
                         )
                         {
                          mdf_collis_2EleD_DOWN = 1
                         }
                     // 04.09.2023 Ce01218
                      if ( basy_CerCn+mdf_collY_sposta_id_sp >= basy_trov2ED
                         & basy_CerCn+mdf_collY_sposta_id_sp <= alty_trov2ED
                         & mdf_collY_sposta_id_sp > 0
                         )
                         {
                          mdf_collis_2EleD_DOWN = 1
                         }

                     // Vedi anche 08.05.2025 A142327 mdf_while_collis_2EleDTent

                      if ( alty_Cer+mdf_collY_sposta_id_sp > basy_trov2ED
                         & alty_Cer+mdf_collY_sposta_id_sp < alty_trov2ED
                         )
                         {
                          mdf_collis_2EleD_UP = 1
                         }

                     // 02.12.2024 AOCL136234
                      if ( basy_CerCn+mdf_collY_sposta_id_sp <= basy_trov2ED
                         & basy_CerCn+mdf_collY_sposta_id_sp <= alty_trov2ED
                         & alty_Cer+mdf_collY_sposta_id_sp > basy_trov2ED
                         & basy_Cer+mdf_collY_sposta_id_sp < basy_trov2ED
                         & mdf_collY_sposta_id_sp < 0
                         )
                         {
                          // Per ora lascio commentato
                          //mdf_collis_2EleD_UP = 1
                          // Gestione 6 Tentativi, dopo il -60, deve provare +120
                          if (VAR_EXIST(PADRE(idx_att, 1), "mcb_arch1_CollisCBTent") )
                             {
                              mdf_collis_2EleD_UP = 2
                              mdf_collis_2EleD_UP2_idx = mdf_collY_arch2EleD[mdf_idcol2ED]
                             }
                         }

                     // 16.11.2023 Sc1023110458
                      mdf_collY_sposta_2EleD_att = mdf_collY_sposta_2EleD
                      if ( mdf_collY_sposta_2EleD > 0
                         & alty_Cer+mdf_collY_sposta_id_sp > basy_trov2ED
                         & alty_Cer < alty_trov2ED
                         & y_idx_TroCol_2EleD > 40
                         & y_idx_TroCol_2EleD-mdf_collY_sposta_2EleD > y_2EleD
                         )
                         {
                          mdf_collis_2EleD_UP = 1
                         }

                      mdf_dist_cenCer_bTrov2ED = mdf_newpCenCer - basy_trov2ED
                      mdf_dist_cenCer_aTrov2ED = alty_trov2ED - mdf_newpCenCer
                      if (VAR_EXIST(idx_att, "mdf_collY_dist_minima") )
                         { mdf_collY_dist_min_att2ED = ABS(mdf_collY_dist_minima) }
                      else
                         { mdf_collY_dist_min_att2ED = mdf_collY_dist_ctrl }

                      if ( mdf_collis_2EleD_DOWN > 0
                         & mdf_collis_2EleD_UP > 0
                         )
                         {
                          if (mdf_collY_sposta_id_sp < 0)
                             {
                              mdf_collY_sposta2EleD = -mdf_collY_sposta_id_sp
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta2EleD, 0, "")
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx_2Ele"), midx_Trov2ED, 0, "")
                             }
                         }

                      if ( mdf_collis_2EleD_DOWN > 0
                         & mdf_collis_2EleD_UP <= 0
                         )
                         {
                          if (mdf_collY_sposta_id_sp < 0)
                             {
                              mdf_collY_sposta2EleD = mdf_collY_sposta_id_sp - mdf_dist_cenCer_bTrov2ED - mdf_collY_dist_min_att2ED
                              mdf_collis_2ELeD_DOWN_new = mdf_py_CerBat_ctrl+mdf_collY_sposta2EleD
                              if (mdf_py_CerBat_ctrl+mdf_collY_sposta2EleD < mdf_limite_pyCer_InfSup)
                                 {
                                  mdf_collY_sposta2EleD = -mdf_collY_sposta_id_sp
                                 }

                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta2EleD, 0, "")
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx_2Ele"), midx_Trov2ED, 0, "")
                             }
                          if (mdf_collY_sposta_id_sp > 0)
                             {
                              mdf_collY_sposta2EleD = -mdf_collY_sposta_id_sp
                              mdf_collis_2ELeD_DOWN_new_PosNeg = mdf_py_CerBat_ctrl+mdf_collY_sposta2EleD
                              //if (mdf_py_CerBat_ctrl+mdf_collY_sposta2Ele < mdf_limite_pyCer_InfSup)
                              //   { mdf_collY_sposta2EleD = -mdf_collY_sposta_id_sp }

                             // 23.07.2024 Ce06685 Fondo Sovracolonna
                              if (VAR_VAL(PADRE(idx_att, 1), "mdf_fia_doppioBattutaX") > 0)
                                 {
                                  if (VAR_VAL(idx_att, "MCB_sposta_Cer_PASSO") > 1)
                                     {
                                      mdf_collY_sposta2EleD = mdf_collY_sposta_id_sp+VAR_VAL(idx_att, "MCB_sposta_Cer_PASSO")
                                      mdf_collis_2ELeD_DOWN_new_Posit = mdf_py_CerBat_ctrl+mdf_collY_sposta2EleD
                                     }
                                 }

                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta2EleD, 0, "")
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx_2Ele"), midx_Trov2ED, 0, "")
                             }
                         }
                      if (mdf_collis_2EleD_UP > 0)
                         {
                          if (mdf_collY_sposta_id_sp > 0)
                             {
                              mdf_collY_sposta2EleD_UP = mdf_collY_sposta_id_sp + mdf_dist_cenCer_aTrov2ED + mdf_collY_dist_min_att2ED
                              // 23.05.2024 St506910
                              if (mdf_py_CerBat_ctrl+mdf_collY_sposta2EleD_UP > Y-mdf_limite_pyCer_InfSup)
                                 {
                                  mdf_collY_sposta2EleD_UP = -mdf_collY_sposta_id_sp - mdf_dist_cenCer_bTrov2ED - mdf_collY_dist_min_att2ED
                                 }

                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta2EleD_UP, 0, "")
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx_2Ele"), midx_Trov2ED, 0, "")
                             }

                          // 02.12.2024 AOCL136234
                          if (mdf_collY_sposta_id_sp < 0)
                             {
                              if (mdf_collis_2EleD_UP >= 2)
                                 {
                                  mdf_collY_sposta2EleD_UP = 2*ABS(mdf_collY_sposta_id_sp)
                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta2EleD_UP, 0, "")
                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx_2Ele"), midx_Trov2ED, 0, "")
                                 }
                             }
                         }
                     }
                 }
             }

          mdf_idcol2ED = mdf_idcol2ED+1
         }
   }

   PROCEDURA MdF_Ctrl_Collis_CerBat_2Ele_DivTent
   {
      mdf_collY_sposta_2EleD_trov =  VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_collY_trovataCol)))
      mdf_collY_sposta_2EleD =  VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))
      mdf_collY_sposta_id_sp =  VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))

      mdf_ctrl_2Ele = 1
      if (VAR_VAL(idx_troCol, "Y") > 20)
         {
          yTrov2Ele = VAR_VAL(idx_troCol, "Y")
          if ( IS_MATCH(NOME(idx_troCol), "*Telaio*") != 1
             & IS_MATCH(NOME(idx_troCol), "*Rip*") != 1
             )
             { mdf_ctrl_2Ele = 0 }

          if (IS_MATCH(NOME(idx_troCol), "*Telaio*") == 1)
             {
              if (yTrov2Ele > 60)  { mdf_ctrl_2Ele = 0 }
             }
          if (IS_MATCH(NOME(idx_troCol), "*Rip*") == 1)
             {
              if (yTrov2Ele > 35)  { mdf_ctrl_2Ele = 0 }
             }
         }

      if (mdf_ctrl_2Ele <= 0)  { EXITSUB() }

      mdf_collY_arch2EleD = 0
      if (STRLEN(mdF_collY_archetipo2) > 1)
         {
          NEAR_GLOBALE("mdf_collY_arch2EleD", idx_att, dist_Coll+ABS(mdf_collY_sposta_2EleD_trov), 1, mdF_collY_archetipo2)
          GOSUB mdf_while_collis_2EleDTent
         }

      if ( STRLEN(mdF_collY_archetipo1) > 1
         & IS_MATCH(NOME(idx_troCol), STRCAT("*", mdF_collY_archetipo1, "*")) != 1
         )
         {
          NEAR_GLOBALE("mdf_collY_arch2EleD", idx_att, dist_Coll+ABS(mdf_collY_sposta_2EleD_trov), 1, mdF_collY_archetipo1)
          GOSUB mdf_while_collis_2EleDTent
         }

      if ( IS_MATCH(mdF_collY_archetipo3, "*Rip*") == 1
         & IS_MATCH(NOME(idx_troCol), "*Rip*") != 1
         )
         {
          NEAR_GLOBALE("mdf_collY_arch2EleD", idx_att, dist_Coll+ABS(mdf_collY_sposta_2EleD_trov), 1, mdF_collY_archetipo3)
          GOSUB mdf_while_collis_2EleDTent
         }

     // 02.12.2024 AOCL136234
      if ( IS_MATCH(mdF_collY_archetipo5, "*Rip*") == 1
         & IS_MATCH(NOME(idx_troCol), "*Rip*") != 1
         )
         {
          NEAR_GLOBALE("mdf_collY_arch2EleD", idx_att, dist_Coll+ABS(mdf_collY_sposta_2EleD_trov), 1, mdF_collY_archetipo5)
          GOSUB mdf_while_collis_2EleDTent
         }
   }

   PROCEDURA mdf_while_collis_2EleDTent
   {
      mdf_idcol2ED = 1
      while (mdf_idcol2ED <= mdf_collY_arch2EleD)
         {
          SET_#(mdf_collY_arch2EleD[mdf_idcol2ED])

          X_ele_collY = VAR_VAL(mdf_collY_arch2EleD[mdf_idcol2ED], "X")
          Z_ele_collY = VAR_VAL(mdf_collY_arch2EleD[mdf_idcol2ED], "Z")
          Ba0_att = [base_0.x, 0, base_0.z]
          Ba3_att = [base_3.x, 0, base_3.z]

          Ba1_ele = [#base_1.x, 0, #base_1.z]
          Ba2_ele = [#base_2.x, 0, #base_2.z]

          dist_02_ele = DISTANZA(Ba0_att, Ba2_ele)
          dist_31_ele = DISTANZA(Ba3_att, Ba1_ele)
          mdf_ele_intern2EleD = 0
          GOSUB MdF_ele_intern_Collision
          if (VAR_VAL(idx_att, "mdf_ele_internC") != -99)  { mdf_ele_intern2EleD = VAR_VAL(idx_att, "mdf_ele_internC") }

          midx_Trov2ED = mdf_collY_arch2EleD[mdf_idcol2ED]
          if ( mdf_ele_intern2EleD > 0
             & VAR_VAL(midx_Trov2ED, "Y") <= 46
             )
             {
              if (mdf_collY_arch2EleD[mdf_idcol2ED] != idx_troCol)
                 {
                  // Andrebbe tolta, ma per ora limito
                  if ( PADRE(midx_Trov2ED, -1) == PADRE(idx_att, -1)
                     | IS_MATCH(NOME(midx_Trov2ED), STRCAT("*", mdF_collY_archetipo1, "*")) == 1
                     | IS_MATCH(NOME(midx_Trov2ED), STRCAT("*", mdF_collY_archetipo2, "*")) == 1
                     )
                     {
                      midx_Trov2ED_deb1 = mdf_collY_arch2EleD[mdf_idcol2ED]
                      basy_trov2ED = VAR_VAL(midx_Trov2ED, "base_0.y")
                      alty_trov2ED = VAR_VAL(midx_Trov2ED, "alto_0.y")
                      y_2EleD = VAR_VAL(midx_Trov2ED, "Y")
                      y_idx_TroCol_2EleD = VAR_VAL(idx_troCol, "Y")

                      alty_Cer_2EleD = alty_Cer
                      basy_Cer_2EleD = basy_Cer
                      basy_CerCn_2EleD = basy_CerCn

                      mdf_newposyCer = basy_Cer + mdf_collY_sposta_id_sp
                      mdf_newaltyCer = alty_Cer + mdf_collY_sposta_id_sp
                      mdf_newpCenCer = basy_CerCn + mdf_collY_sposta_id_sp
                      mdf_collis_2EleD_UP = 0
                      mdf_collis_2EleD_DOWN = 0

                      mdf_collY_dist_min_att2EDT = mdf_collY_dist_ctrl

                      if ( basy_Cer+mdf_collY_sposta_id_sp > basy_trov2ED
                         & basy_Cer+mdf_collY_sposta_id_sp < alty_trov2ED
                         )
                         {
                          mdf_collis_2EleD_DOWN = 1
                         }

                      if ( basy_CerCn+mdf_collY_sposta_id_sp >= basy_trov2ED
                         & basy_CerCn+mdf_collY_sposta_id_sp <= alty_trov2ED
                         & mdf_collY_sposta_id_sp > 0
                         )
                         {
                          mdf_collis_2EleD_DOWN = 1
                         }

                     // 08.05.2025 A142327
                      mdf_dist_2EleTPostSpost = ABS(basy_CerCn+mdf_collY_sposta_id_sp-basy_trov2ED)
                      basy_CerCn_2EleTPostSpost = basy_CerCn+mdf_collY_sposta_id_sp +mdf_collY_dist_min_att2EDT
                      if ( mdf_dist_2EleTPostSpost < mdf_collY_dist_min_att2EDT
                         & basy_CerCn+mdf_collY_sposta_id_sp +mdf_collY_dist_min_att2EDT >= basy_trov2ED
                         & mdf_collY_sposta_id_sp > 0
                         )
                         {
                          mdf_collis_2EleD_DOWN = 2
                          mdf_collis_2EleDT_DOWN2_idx = mdf_collY_arch2EleD[mdf_idcol2ED]
                         }

                      if ( alty_Cer+mdf_collY_sposta_id_sp > basy_trov2ED
                         & alty_Cer+mdf_collY_sposta_id_sp < alty_trov2ED
                         )
                         {
                          mdf_collis_2EleD_UP = 1
                          varSpostaTent = STRCAT("mcb_Sposta_Tent", STR(spostaTent_n+1) )
                          if (VAR_VAL(idx_att, varSpostaTent) < 0)
                             {
                              mdf_collis_2EleD_UP = -1
                              mdf_collis_2EleD_DOWN = 1.1
                             }
                         }

                      if ( basy_CerCn+mdf_collY_sposta_id_sp <= basy_trov2ED
                         & basy_CerCn+mdf_collY_sposta_id_sp <= alty_trov2ED
                         & alty_Cer+mdf_collY_sposta_id_sp > basy_trov2ED
                         & basy_Cer+mdf_collY_sposta_id_sp < basy_trov2ED
                         & mdf_collY_sposta_id_sp < 0
                         )
                         {
                          // Per ora lascio commentato
                          //mdf_collis_2EleD_UP = 1
                          // Gestione 6 Tentativi, dopo il -60, deve provare +120
                          if (VAR_EXIST(PADRE(idx_att, 1), "mcb_arch1_CollisCBTent") )
                             {
                              mdf_collis_2EleD_UP = 2
                              mdf_collis_2EleD_UP2_idx = mdf_collY_arch2EleD[mdf_idcol2ED]
                             }
                         }

                      mdf_collY_sposta_2EleD_att = mdf_collY_sposta_2EleD
                      if ( mdf_collY_sposta_2EleD > 0
                         & alty_Cer+mdf_collY_sposta_id_sp > basy_trov2ED
                         & alty_Cer < alty_trov2ED
                         & y_idx_TroCol_2EleD > 40
                         & y_idx_TroCol_2EleD-mdf_collY_sposta_2EleD > y_2EleD
                         )
                         {
                          mdf_collis_2EleD_UP = 1
                          varSpostaTent = STRCAT("mcb_Sposta_Tent", STR(spostaTent_n+1) )
                          if (VAR_VAL(idx_att, varSpostaTent) < 0)
                             {
                              mdf_collis_2EleD_UP = -1
                              mdf_collis_2EleD_DOWN = 1.1
                             }
                         }

                      mdf_dist_cenCer_bTrov2ED = mdf_newpCenCer - basy_trov2ED
                      mdf_dist_cenCer_aTrov2ED = alty_trov2ED - mdf_newpCenCer
                      if (VAR_EXIST(idx_att, "mdf_collY_dist_minima") )
                         { mdf_collY_dist_min_att2ED = ABS(mdf_collY_dist_minima) }
                      else
                         { mdf_collY_dist_min_att2ED = mdf_collY_dist_ctrl }

                      if ( mdf_collis_2EleD_DOWN > 0
                         & mdf_collis_2EleD_UP > 0
                         )
                         {
                          if (mdf_collY_sposta_id_sp < 0)
                             {
                              mdf_collY_sposta2EleD = -mdf_collY_sposta_id_sp
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta2EleD, 0, "")
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx_2Ele"), midx_Trov2ED, 0, "")
                             }
                         }

                      if ( mdf_collis_2EleD_DOWN > 0
                         & mdf_collis_2EleD_UP <= 0
                         )
                         {
                          if (mdf_collY_sposta_id_sp < 0)
                             {
                              mdf_collY_sposta2EleD = mdf_collY_sposta_id_sp - mdf_dist_cenCer_bTrov2ED - mdf_collY_dist_min_att2ED
                              mdf_collis_2ELeD_DOWN_new = mdf_py_CerBat_ctrl+mdf_collY_sposta2EleD
                              if (mdf_py_CerBat_ctrl+mdf_collY_sposta2EleD < mdf_limite_pyCer_InfSup)
                                 {
                                  mdf_collY_sposta2EleD = -mdf_collY_sposta_id_sp
                                 }

                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta2EleD, 0, "")
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx_2Ele"), midx_Trov2ED, 0, "")
                             }
                          if (mdf_collY_sposta_id_sp > 0)
                             {
                              mdf_collY_sposta2EleD = -mdf_collY_sposta_id_sp
                              mdf_collis_2ELeD_DOWN_new_PosNeg = mdf_py_CerBat_ctrl+mdf_collY_sposta2EleD
                              //if (mdf_py_CerBat_ctrl+mdf_collY_sposta2Ele < mdf_limite_pyCer_InfSup)
                              //   { mdf_collY_sposta2EleD = -mdf_collY_sposta_id_sp }

                              if (VAR_VAL(PADRE(idx_att, 1), "mdf_fia_doppioBattutaX") > 0)
                                 {
                                  if (VAR_VAL(idx_att, "MCB_sposta_Cer_PASSO") > 1)
                                     {
                                      mdf_collY_sposta2EleD = mdf_collY_sposta_id_sp+VAR_VAL(idx_att, "MCB_sposta_Cer_PASSO")
                                      mdf_collis_2ELeD_DOWN_new_Posit = mdf_py_CerBat_ctrl+mdf_collY_sposta2EleD
                                     }
                                 }

                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta2EleD, 0, "")
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx_2Ele"), midx_Trov2ED, 0, "")
                             }
                         }
                      if (mdf_collis_2EleD_UP > 0)
                         {
                          if (mdf_collY_sposta_id_sp > 0)
                             {
                              mdf_collY_sposta2EleD_UP = mdf_collY_sposta_id_sp + mdf_dist_cenCer_aTrov2ED + mdf_collY_dist_min_att2ED
                              if (mdf_py_CerBat_ctrl+mdf_collY_sposta2EleD_UP > Y-mdf_limite_pyCer_InfSup)
                                 {
                                  mdf_collY_sposta2EleD_UP = -mdf_collY_sposta_id_sp - mdf_dist_cenCer_bTrov2ED - mdf_collY_dist_min_att2ED
                                 }

                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta2EleD_UP, 0, "")
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx_2Ele"), midx_Trov2ED, 0, "")
                             }

                          if (mdf_collY_sposta_id_sp < 0)
                             {
                              if (mdf_collis_2EleD_UP >= 2)
                                 {
                                  mdf_collY_sposta2EleD_UP = 2*ABS(mdf_collY_sposta_id_sp)
                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta2EleD_UP, 0, "")
                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx_2Ele"), midx_Trov2ED, 0, "")
                                 }
                             }
                         }
                     }
                 }
             }

          mdf_idcol2ED = mdf_idcol2ED+1
         }
   }

  // 08.08.2022
   PROCEDURA MdF_Ctrl_Collis_CerBat_VicTent
   {
      mdf_distMin_CerVic = 0
      if (VAR_EXIST(idx_att, "MCB_distMin_CerVic") )  { mdf_distMin_CerVic = VAR_VAL(idx_att, "MCB_distMin_CerVic") }
      if (mdf_distMin_CerVic < 10)  { mdf_distMin_CerVic = 70 }

      mdf_id_sp = 1
      mdf_collY_sposta_id_sp = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))

      spostaTentVic_n = 1

      mdf_id_pyCer = 1
      while (VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(mdf_id_pyCer))) > 0)
         {
          // 25.09.2018
          // Può essere che la 3 sia a 0 e cè la 4 come aggiuntiva in alto
          if (VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mdf_id_pyCer))) > 0)
             {
              if (mdf_id_pyCer != id_collision)
                 {
                  mdf_py_Cer_suc_prec = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mdf_id_pyCer)))
                  mdf_collY_diff_suc_prec = ABS(mdf_py_CerBat_ctrl + mdf_collY_sposta_id_sp - mdf_py_Cer_suc_prec)

                  //if (PADRE(idx_att, -1) == 4053)  { DISPLAY2(STRCAT("mdf_collY_diff_suc_prec=", STR(mdf_collY_diff_suc_prec), " mdf_py_Cer_suc_prec", STR(mdf_py_Cer_suc_prec))) }

                  spostaTentVic_n_Temp = VAR_VAL(PADRE(idx_att, 1), STRCAT("mcb_Sposta_Tentativo", STR(spostaTentVic_n)))
                  if (mdf_collY_diff_suc_prec < mdf_distMin_CerVic)
                     {
                      mdf_collY_y_mm_Vic = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
                      mdf_collY_diff_suc_prec_att = mdf_collY_diff_suc_prec
                      basy_CerCn_suc_prec = base_0.y + mdf_py_Cer_suc_prec

                      basy_trovCn = basy_trov+y_trov/2

                     // 15.05.2024 A068410
                      //mdf_collY_diffTent_suc_prec = ABS(mdf_py_CerBat_ctrl + mdf_collY_sposta_id_sp - (mdf_py_Cer_suc_prec + spostaTentVic_n_Temp))
                      mdf_collY_diffTent_suc_prec = ABS(mdf_py_CerBat_ctrl + spostaTentVic_n_Temp - mdf_py_Cer_suc_prec)

                     // 24.06.2024 A3072094
                      mdf_pyCer_piu_spostaTent_att = basy_CerCn+spostaTentVic_n_Temp
                      mdf_diffT_basyCerCn_spostBasCnTrov_att = ABS(basy_CerCn + spostaTentVic_n_Temp - basy_trovCn)

                      //mdf_pyCer_piu_spostaTent_Vic = mdf_py_Cer_suc_prec+spostaTentVic_n_Temp
                      mdf_pyCer_piu_spostaTent_Vic = basy_CerCn_suc_prec+spostaTentVic_n_Temp
                      mdf_diffT_basyCerCn_spostBasCnTrov_Vic = ABS(basy_CerCn_suc_prec + spostaTentVic_n_Temp - basy_trovCn)

                      istV = 1
                      while (istV <= 6)
                         {
                          // 15.05.2024 A068410
                          //if ( ABS(basy_CerCn_suc_prec + spostaTentVic_n_Temp - basy_trovCn) < mdf_collY_dist_ctrl
                          if ( mdf_collY_diffTent_suc_prec < mdf_distMin_CerVic
                             | mdf_py_CerBat_ctrl + spostaTentVic_n_Temp > Y-mdf_limite_pyCer_InfSup
                             // 24.06.2024 A3072094
                             | mdf_diffT_basyCerCn_spostBasCnTrov_att < mdf_collY_dist_ctrl
                             // Se esce un caso, ma in teoria non dovrebbe essere possibile
                             //| mdf_diffT_basyCerCn_spostBasCnTrov_Vic < mdf_collY_dist_ctrl
                             )
                             {
                              spostaTentVic_n = spostaTentVic_n+1
                              spostaTentVic_n_while = VAR_VAL(PADRE(idx_att, 1), STRCAT("mcb_Sposta_Tentativo", STR(spostaTentVic_n)))
                              if (mdf_collY_sposta_id_sp < 0  &  spostaTentVic_n_while < 0)
                                 {
                                  spostaTentVic_n_Temp = VAR_VAL(PADRE(idx_att, 1), STRCAT("mcb_Sposta_Tentativo", STR(spostaTentVic_n)))
                                  //mdf_collY_diffTent_suc_prec = ABS(mdf_py_CerBat_ctrl + mdf_collY_sposta_id_sp - (mdf_py_Cer_suc_prec + spostaTentVic_n_Temp))
                                  mdf_collY_diffTent_suc_prec = ABS(mdf_py_CerBat_ctrl + spostaTentVic_n_Temp - mdf_py_Cer_suc_prec)

                                  mdf_pyCer_piu_spostaTent_att = basy_CerCn+spostaTentVic_n_Temp
                                  mdf_diffT_basyCerCn_spostBasCnTrov_att = ABS(basy_CerCn + spostaTentVic_n_Temp - basy_trovCn)

                                  mdf_pyCer_piu_spostaTent_Vic = basy_CerCn_suc_prec+spostaTentVic_n_Temp
                                  mdf_diffT_basyCerCn_spostBasCnTrov_Vic = ABS(basy_CerCn_suc_prec + spostaTentVic_n_Temp - basy_trovCn)
                                 }
                              if (mdf_collY_sposta_id_sp > 0  &  spostaTentVic_n_while > 0)
                                 {
                                  spostaTentVic_n_Temp = VAR_VAL(PADRE(idx_att, 1), STRCAT("mcb_Sposta_Tentativo", STR(spostaTentVic_n)))
                                  mdf_collY_diffTent_suc_prec = ABS(mdf_py_CerBat_ctrl + spostaTentVic_n_Temp - mdf_py_Cer_suc_prec)

                                  mdf_pyCer_piu_spostaTent_att = basy_CerCn+spostaTentVic_n_Temp
                                  mdf_diffT_basyCerCn_spostBasCnTrov_att = ABS(basy_CerCn + spostaTentVic_n_Temp - basy_trovCn)

                                  mdf_pyCer_piu_spostaTent_Vic = basy_CerCn_suc_prec+spostaTentVic_n_Temp
                                  mdf_diffT_basyCerCn_spostBasCnTrov_Vic = ABS(basy_CerCn_suc_prec + spostaTentVic_n_Temp - basy_trovCn)
                                 }
                             // 15.05.2024 A068410
                              if (mdf_collY_sposta_id_sp > 0  &  spostaTentVic_n_while < 0)
                                 {
                                  spostaTentVic_n_Temp = VAR_VAL(PADRE(idx_att, 1), STRCAT("mcb_Sposta_Tentativo", STR(spostaTentVic_n)))
                                  mdf_collY_diffTent_suc_prec = ABS(mdf_py_CerBat_ctrl + spostaTentVic_n_Temp - mdf_py_Cer_suc_prec)

                                  mdf_pyCer_piu_spostaTent_att = basy_CerCn+spostaTentVic_n_Temp
                                  mdf_diffT_basyCerCn_spostBasCnTrov_att = ABS(basy_CerCn + spostaTentVic_n_Temp - basy_trovCn)

                                  mdf_pyCer_piu_spostaTent_Vic = basy_CerCn_suc_prec+spostaTentVic_n_Temp
                                  mdf_diffT_basyCerCn_spostBasCnTrov_Vic = ABS(basy_CerCn_suc_prec + spostaTentVic_n_Temp - basy_trovCn)
                                 }
                             }

                          istV = istV+1
                         }
                      // 15.05.2024 A068410
                      if (spostaTentVic_n > 1  &  spostaTentVic_n <= 6)
                         {
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), spostaTentVic_n_Temp, 0, "")
                         }
                      //if (spostaTentVic_n <= 6)
                      if ( spostaTentVic_n > 6
                         & ABS(basy_CerCn_suc_prec + spostaTentVic_n_Temp - basy_trovCn) < mdf_collY_dist_ctrl
                         )
                         {
                          mdf_CerVic_case = 100
                          spostaTentVic_n_CerVic = spostaTentVic_n_Temp
                          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), spostaTentVic_n_CerVic, 0, "")
                         }

                     // 16.05.2024 2024OCP050901
                      mdf_collY_diffTent_suc_prec_NoTent = ABS(mdf_py_CerBat_ctrl + mdf_collY_sposta_id_sp - mdf_py_Cer_suc_prec)
                      if (spostaTentVic_n == 1)
                         {
                          if (mdf_collY_diffTent_suc_prec_NoTent < mdf_distMin_CerVic)
                             {
                              mdf_CerVic_case = 101
                              spostaTentVic_n_CerVic = mdf_collY_sposta_id_sp
                              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), spostaTentVic_n_CerVic, 0, "")
                             }
                         }
                     }
                 }
             }

          mdf_id_pyCer = mdf_id_pyCer+1
         }
   }

   PROCEDURA MdF_Ctrl_Collis_CerBat_suc_prec
   {
      mdf_id_sp = 1
      // 7 sono i 7 casi di sposta
      while (mdf_id_sp <= 7)
         {
          mdf_collY_sposta_id_sp = VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_id_sp)))
          mdf_collY_sposta_id_sp_inv = VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_id_sp), "_inv"))

          mdf_id_pyCer = 1
          while ( VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(mdf_id_pyCer))) == 1)
             {
              // 28.10.2020
              // Può essere che la 3 sia a 0 e cè la 4 come aggiuntiva in alto
              if (VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mdf_id_pyCer))) > 0)
                 {
                  mdf_Ctrl_Collis_CerBat_suc_prec_entry = mdf_id_pyCer
                  if (mdf_id_pyCer != id_collision)
                     {
                      mdf_py_Cer_suc_prec = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mdf_id_pyCer)))
                      mdf_collY_diff_suc_prec = ABS(mdf_py_CerBat_ctrl + mdf_collY_sposta_id_sp - mdf_py_Cer_suc_prec)

                      mdf_Ctrl_Collis_CerBat_suc_prec_deb1 = -1
                      if (mdf_collY_diff_suc_prec < mdf_limite_pyCer_InfSup)
                         {
                          // 23.04.2024 Scan000230
                          mdf_py_Cer_suc_prec_att_post = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(id_collision))) + mdf_collY_sposta_id_sp_inv
                          if (mdf_py_Cer_suc_prec_att_post >= mdf_limite_pyCer_InfSup)
                             {
                              mdf_id_pyCer_deb1 = mdf_id_pyCer
                              VAR_CREATE_NUM(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_id_sp)), mdf_collY_sposta_id_sp_inv, 0, "")
                              mdf_Ctrl_Collis_CerBat_suc_prec_deb2 = mdf_collY_sposta_id_sp_inv
                              mdf_collY_diff_suc_prec_deb = mdf_collY_diff_suc_prec
                             }
                          else
                             {
                              mdf_id_pyCer_deb2 = mdf_id_pyCer
                              if (mdf_id_sp == mdf_collY_trovataCol)
                                 {
                                  mdf_id_sp_deb = mdf_id_sp
                                  mdf_py_Cer_suc_prec_att_post_deb = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(id_collision))) + mdf_collY_sposta_id_sp_inv
                                  mdf_sposta_suc_prec_post = mdf_limite_pyCer_InfSup-mdf_collY_diff_suc_prec
                                  mdf_CerVic_case = 999
                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta_daCerVic", STR(mdf_id_pyCer)), mdf_sposta_suc_prec_post, 0, "")
                                 }
                             }
                         }
                     }
                 }

              mdf_id_pyCer = mdf_id_pyCer+1
             }
          mdf_id_sp = mdf_id_sp+1
         }
   }

   PROCEDURA MdF_CollY_dist_ctrl_Sec
   {
      if (mdf_collY_dist_ctrl_Sec <= mdf_collY_dist_ctrl)  { EXITSUB() }
      mdf_collY_trovataCol_Sec = 0

      // py_CerBat è già il centro Cer
      basy_CerCn = base_0.y + VAR_VAL(idx_att, STRCAT("py_CerBat", STR(id_collision)))
      y_trov = VAR_VAL(idx_troCol, "Y")
      basy_trov = VAR_VAL(idx_troCol, "base_0.y")
      dist_CentriLav = basy_trov+y_trov/2 - basy_CerCn
      if ( basy_CerCn-yCer/2 <= basy_trov
         & ABS(dist_CentriLav) > mdf_collY_dist_ctrl
         )
         {
          if (ABS(dist_CentriLav) <= mdf_collY_dist_ctrl_Sec)
             {
              mdf_collY_trovataCol_Sec = 2
              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"), mdf_collY_trovataCol_Sec, 0, "")
              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"), dist_CentriLav, 0, "")
              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"), idx_troCol, 0, "")
              if (dist_CentriLav < 0)
                 {
                  mdf_collY_trovataCol_Sec = 3
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"), mdf_collY_trovataCol_Sec, 0, "")
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"), dist_CentriLav, 0, "")
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"), idx_troCol, 0, "")
                 }
             }
          else
             {
              // deve essere alto_Cer > base_trov
              // altrimenti è solo una vicinanza
              if (basy_CerCn+yCer/2 > basy_trov)
                 {
                  mdf_collY_trovataCol_Sec = 4
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"), mdf_collY_trovataCol_Sec, 0, "")
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"), dist_CentriLav, 0, "")
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"), idx_troCol, 0, "")
                 }
             }
         }

      dist_CentriLav = basy_CerCn - (basy_trov+y_trov/2)
      if ( basy_CerCn-yCer/2 > basy_trov
         & ABS(dist_CentriLav) > mdf_collY_dist_ctrl
         )
         {
          if (ABS(dist_CentriLav) <= mdf_collY_dist_ctrl_Sec)
             {
              mdf_collY_trovataCol_Sec = 5
              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"), mdf_collY_trovataCol_Sec, 0, "")
              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"), dist_CentriLav, 0, "")
              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"), idx_troCol, 0, "")
              if (dist_CentriLav < 0)
                 {
                  mdf_collY_trovataCol_Sec = 6
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"), mdf_collY_trovataCol_Sec, 0, "")
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"), dist_CentriLav, 0, "")
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"), idx_troCol, 0, "")
                 }
             }
          else
             {
              // deve essere base_Cer < alto_trov
              // altrimenti è solo una vicinanza
              if (basy_CerCn-yCer/2 < basy_trov+y_trov)
                 {
                  mdf_collY_trovataCol_Sec = 7
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"), mdf_collY_trovataCol_Sec, 0, "")
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"), dist_CentriLav, 0, "")
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"), idx_troCol, 0, "")
                 }
             }
         }

      if ( mdf_collY_trovataCol_Sec > 0
         & IS_IDX(mdf_collY[iCol])
         )
         {
          // Di default non faccio niente, così non rischio niente, ma gi offset sono decisi in VariabiliMdF.txt
          mdf_collY_sposta_1 = 0
          mdf_collY_sposta_2 = 0
          mdf_collY_sposta_3 = 0
          mdf_collY_sposta_4 = 0
          mdf_collY_sposta_5 = 0
          mdf_collY_sposta_6 = 0
          mdf_collY_sposta_7 = 0

          mdf_py_CerBat_ctrl = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(id_collision)))

          VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision)), 1, 0, "")

          mdf_idx_CollY = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"))
          mdf_Y_Ele_CollY = VAR_VAL(mdf_idx_CollY, "Y")
          if (VAR_EXIST(idx_att, "MCB_collY_sposta_Sec_1") )  { mdf_collY_sposta_1 = VAR_VAL(idx_att, "MCB_collY_sposta_Sec_1") }
          if (VAR_EXIST(idx_att, "MCB_collY_sposta_Sec_2") )  { mdf_collY_sposta_2 = VAR_VAL(idx_att, "MCB_collY_sposta_Sec_2") }
          if (VAR_EXIST(idx_att, "MCB_collY_sposta_Sec_3") )  { mdf_collY_sposta_3 = VAR_VAL(idx_att, "MCB_collY_sposta_Sec_3") }
          if (VAR_EXIST(idx_att, "MCB_collY_sposta_Sec_4") )  { mdf_collY_sposta_4 = VAR_VAL(idx_att, "MCB_collY_sposta_Sec_4") }
          if (VAR_EXIST(idx_att, "MCB_collY_sposta_Sec_5") )  { mdf_collY_sposta_5 = VAR_VAL(idx_att, "MCB_collY_sposta_Sec_5") }
          if (VAR_EXIST(idx_att, "MCB_collY_sposta_Sec_6") )  { mdf_collY_sposta_6 = VAR_VAL(idx_att, "MCB_collY_sposta_Sec_6") }
          if (VAR_EXIST(idx_att, "MCB_collY_sposta_Sec_7") )  { mdf_collY_sposta_7 = VAR_VAL(idx_att, "MCB_collY_sposta_Sec_7") }

          mdf_collY_sposta_1_inv = -1*mdf_collY_sposta_1
          mdf_collY_sposta_2_inv = -1*mdf_collY_sposta_2
          mdf_collY_sposta_3_inv = -1*mdf_collY_sposta_3
          mdf_collY_sposta_4_inv = -1*mdf_collY_sposta_4
          mdf_collY_sposta_5_inv = -1*mdf_collY_sposta_5
          mdf_collY_sposta_6_inv = -1*mdf_collY_sposta_6
          mdf_collY_sposta_7_inv = -1*mdf_collY_sposta_7

          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 < 32+9)  { mdf_collY_sposta_1 = mdf_collY_sposta_1_inv }
          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 < 32+9)  { mdf_collY_sposta_2 = mdf_collY_sposta_2_inv }
          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 < 32+9)  { mdf_collY_sposta_3 = mdf_collY_sposta_3_inv }
          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 < 32+9)  { mdf_collY_sposta_4 = mdf_collY_sposta_4_inv }
          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 < 32+9)  { mdf_collY_sposta_5 = mdf_collY_sposta_5_inv }
          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 < 32+9)  { mdf_collY_sposta_6 = mdf_collY_sposta_6_inv }
          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 < 32+9)  { mdf_collY_sposta_7 = mdf_collY_sposta_7_inv }

          mdf_collY_y_mm = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))
          mdf_collY_case_Sec = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"))
          if (mdf_collY_sposta_2 > 0 & mdf_collY_sposta_2 - mdf_collY_dist_ctrl_Sec < mdf_collY_y_mm)  { mdf_collY_sposta_2 = mdf_collY_sposta_2_inv }
         // 28.03.2023 Ce00271 Non uscirà mai dalla collisione se la cerniera sta sopra e lo spostamento e minore di 36
          if ( mdf_collY_sposta_3 < 0
             & mdf_collY_y_mm < 0
             )
             {
              mdf_sposta3_piu_mdf_collY_dist_ctrl_Sec = mdf_collY_sposta_3 + mdf_collY_dist_ctrl_Sec
              mdf_collY_y_mm_Sec_att = mdf_collY_y_mm
              if (mdf_collY_sposta_3 + mdf_collY_dist_ctrl_Sec < ABS(mdf_collY_y_mm))  { mdf_collY_sposta_3 = mdf_collY_sposta_3_inv }
             }

          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 > Y-32-9)  { mdf_collY_sposta_1 = mdf_collY_sposta_1_inv }
          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 > Y-32-9)  { mdf_collY_sposta_2 = mdf_collY_sposta_2_inv }
          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 > Y-32-9)  { mdf_collY_sposta_3 = mdf_collY_sposta_3_inv }
          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 > Y-32-9)  { mdf_collY_sposta_4 = mdf_collY_sposta_4_inv }
          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 > Y-32-9)  { mdf_collY_sposta_5 = mdf_collY_sposta_5_inv }
          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 > Y-32-9)  { mdf_collY_sposta_6 = mdf_collY_sposta_6_inv }
          if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 > Y-32-9)  { mdf_collY_sposta_7 = mdf_collY_sposta_7_inv }

          if (VAR_EXIST(idx_att, "MCB_collY_dist_minimaCn_Sec") )
             {
              mdf_collY_dist_minima = VAR_VAL(idx_att, "MCB_collY_dist_minimaCn_Sec")
              mdf_collY_sposta_1 = -1*mdf_collY_dist_minima
              mdf_collY_sposta_2 = -1*mdf_collY_dist_minima + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_3 = -1*mdf_collY_dist_minima + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_4 = -1*mdf_collY_dist_minima + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_5 =  mdf_collY_dist_minima - 1*ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_6 =  mdf_collY_dist_minima - 1*ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_7 =  mdf_collY_dist_minima - 1*ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))

              mdf_collY_sposta_1_inv = mdf_collY_dist_minima
              mdf_collY_sposta_2_inv = mdf_collY_dist_minima + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_3_inv = mdf_collY_dist_minima + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_4_inv = mdf_collY_dist_minima + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_5_inv = -1*mdf_collY_dist_minima - ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_6_inv = -1*mdf_collY_dist_minima - ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_7_inv = -1*mdf_collY_dist_minima - ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))

              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 < 32+9)  { mdf_collY_sposta_1 = mdf_collY_sposta_1_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 < 32+9)  { mdf_collY_sposta_2 = mdf_collY_sposta_2_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 < 32+9)  { mdf_collY_sposta_3 = mdf_collY_sposta_3_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 < 32+9)  { mdf_collY_sposta_4 = mdf_collY_sposta_4_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 < 32+9)  { mdf_collY_sposta_5 = mdf_collY_sposta_5_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 < 32+9)  { mdf_collY_sposta_6 = mdf_collY_sposta_6_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 < 32+9)  { mdf_collY_sposta_7 = mdf_collY_sposta_7_inv }

              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 > Y-32-9)  { mdf_collY_sposta_1 = mdf_collY_sposta_1_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 > Y-32-9)  { mdf_collY_sposta_2 = mdf_collY_sposta_2_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 > Y-32-9)  { mdf_collY_sposta_3 = mdf_collY_sposta_3_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 > Y-32-9)  { mdf_collY_sposta_4 = mdf_collY_sposta_4_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 > Y-32-9)  { mdf_collY_sposta_5 = mdf_collY_sposta_5_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 > Y-32-9)  { mdf_collY_sposta_6 = mdf_collY_sposta_6_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 > Y-32-9)  { mdf_collY_sposta_7 = mdf_collY_sposta_7_inv }

              GOSUB MdF_Ctrl_Collis_CerBat_suc_prec
             }

          if (VAR_EXIST(idx_att, "MCB_collY_dist_minima_Sec") )
             {
              mdf_collY_dist_minima = VAR_VAL(idx_att, "MCB_collY_dist_minima_Sec")
              mdf_collY_sposta_1 = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2
              mdf_collY_sposta_2 = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2 + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_3 = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2 + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_4 = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2 + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_5 =  mdf_collY_dist_minima + mdf_Y_Ele_CollY/2 - 1*ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_6 =  mdf_collY_dist_minima + mdf_Y_Ele_CollY/2 - 1*ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_7 =  mdf_collY_dist_minima + mdf_Y_Ele_CollY/2 - 1*ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))

              mdf_collY_sposta_1_inv = mdf_collY_dist_minima + mdf_Y_Ele_CollY/2
              mdf_collY_sposta_2_inv = mdf_collY_dist_minima + mdf_Y_Ele_CollY/2 - ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_3_inv = mdf_collY_dist_minima + mdf_Y_Ele_CollY/2 - ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_4_inv = mdf_collY_dist_minima + mdf_Y_Ele_CollY/2 - ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_5_inv = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2 + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_6_inv = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2 + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))
              mdf_collY_sposta_7_inv = -1*mdf_collY_dist_minima - mdf_Y_Ele_CollY/2 + ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")))

              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 < 32+9)  { mdf_collY_sposta_1 = mdf_collY_sposta_1_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 < 32+9)  { mdf_collY_sposta_2 = mdf_collY_sposta_2_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 < 32+9)  { mdf_collY_sposta_3 = mdf_collY_sposta_3_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 < 32+9)  { mdf_collY_sposta_4 = mdf_collY_sposta_4_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 < 32+9)  { mdf_collY_sposta_5 = mdf_collY_sposta_5_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 < 32+9)  { mdf_collY_sposta_6 = mdf_collY_sposta_6_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 < 32+9)  { mdf_collY_sposta_7 = mdf_collY_sposta_7_inv }

              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_1 > Y-32-9)  { mdf_collY_sposta_1 = mdf_collY_sposta_1_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_2 > Y-32-9)  { mdf_collY_sposta_2 = mdf_collY_sposta_2_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_3 > Y-32-9)  { mdf_collY_sposta_3 = mdf_collY_sposta_3_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_4 > Y-32-9)  { mdf_collY_sposta_4 = mdf_collY_sposta_4_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_5 > Y-32-9)  { mdf_collY_sposta_5 = mdf_collY_sposta_5_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_6 > Y-32-9)  { mdf_collY_sposta_6 = mdf_collY_sposta_6_inv }
              if (mdf_py_CerBat_ctrl + mdf_collY_sposta_7 > Y-32-9)  { mdf_collY_sposta_7 = mdf_collY_sposta_7_inv }

              GOSUB MdF_Ctrl_Collis_CerBat_suc_prec
             }

          // 04.08.2020
          //mdf_arch_n=1
          //while (mdf_arch_n < 10)
          if (IS_MATCH(NOME(idx_troCol), VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n)))) == 1)
             {
              mdf_ctrl_dist_arch = 0
              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_minCn_arch_Sec", STR(mdf_arch_n))) )
                 {
                  mdf_collY_dist_minima = VAR_VAL(idx_att, STRCAT("MCB_collY_dist_minCn_arch_Sec", STR(mdf_arch_n)))
                  mdf_nome_arch = VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n)))
                  if (ABS(mdf_collY_dist_minima) >= ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))) )
                     {
                      mdf_ctrl_dist_arch = 1
                      mdf_case_collision = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"))
                      if (mdf_case_collision <= 4)
                         {
                          if (mdf_collY_dist_minima > 0)
                             { mdf_collY_sposta_1 = mdf_collY_dist_minima + VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) }
                          else
                             { mdf_collY_sposta_1 = -1*(ABS(mdf_collY_dist_minima) - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))) }

                          _mdf_collY_sposta_archdebug = mdf_collY_sposta_1
                         }
                      else
                         {
                          if (mdf_collY_dist_minima > 0)
                             { mdf_collY_sposta_1 = mdf_collY_dist_minima - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) }
                          else
                             { mdf_collY_sposta_1 = -1*(ABS(mdf_collY_dist_minima) + VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))) }

                          _mdf_collY_sposta_archdebug_2 = mdf_collY_sposta_1
                         }
                     }

                  if (mdf_ctrl_dist_arch > 0)
                     {
                      mdf_collY_sposta_2 = mdf_collY_sposta_1
                      mdf_collY_sposta_3 = mdf_collY_sposta_1
                      mdf_collY_sposta_4 = mdf_collY_sposta_1
                      mdf_collY_sposta_5 = mdf_collY_sposta_1
                      mdf_collY_sposta_6 = mdf_collY_sposta_1
                      mdf_collY_sposta_7 = mdf_collY_sposta_1

                      mdf_nome_var_sposta_arch = STRCAT("MCB_collY_sposta_", mdf_nome_arch, "_Sec")
                      // 23.09.2024
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) != 1)
                         {
                          mdf_var_length = STRLEN(mdf_nome_var_sposta_arch)
                          mdf_nome_var_sposta_arch_orig = mdf_nome_var_sposta_arch
                          mdf_var_length_w = mdf_var_length-4
                          while ( mdf_var_length_w > 19
                             & VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) != 1
                             )
                             {
                              mdf_nome_var_sposta_arch = STRCAT(STRMID(0, mdf_var_length_w, mdf_nome_var_sposta_arch_orig), "_Sec")
                              mdf_var_length_w = mdf_var_length_w-1
                             }
                         }
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) )  { mdf_collY_sposta_1 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) }
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_2")) )  { mdf_collY_sposta_2 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_2")) }
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_3")) )  { mdf_collY_sposta_3 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_3")) }
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_4")) )  { mdf_collY_sposta_4 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_4")) }
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_5")) )  { mdf_collY_sposta_5 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_5")) }
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_6")) )  { mdf_collY_sposta_6 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_6")) }
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_7")) )  { mdf_collY_sposta_7 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_7")) }
                     }
                 }
             }

          // 04.08.2020
          //mdf_arch_n=1
          //while (mdf_arch_n < 10)
          // spostamento calcolato tra ingombro Archetipo e Centro Cerniera-Basetta
          if (IS_MATCH(NOME(idx_troCol), VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n)))) == 1)
             {
              mdf_ctrl_dist_arch = 0
              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch_Sec", STR(mdf_arch_n))) )
                 {
                  mdf_collY_dist_minima = VAR_VAL(idx_att, STRCAT("MCB_collY_dist_min_arch_Sec", STR(mdf_arch_n)))
                  if (ABS(mdf_collY_dist_minima) >= ABS(VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))) -mdf_Y_Ele_CollY/2)
                     {
                      mdf_ctrl_dist_arch = 1
                      mdf_nome_arch = VAR_VAL_STR(idx_att, STRCAT("mdF_collY_archetipo", STR(mdf_arch_n)))
                      mdf_case_collision = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"))
                      if (mdf_case_collision <= 4)
                         {
                          if (mdf_collY_dist_minima > 0)
                             { mdf_collY_sposta_1 = mdf_collY_dist_minima + VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) + mdf_Y_Ele_CollY/2 }
                          else
                             { mdf_collY_sposta_1 = -1*(ABS(mdf_collY_dist_minima) - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))) - mdf_Y_Ele_CollY/2  }

                          _mdf_collY_sposta_archdebug = mdf_collY_sposta_1
                         }
                      else
                         {
                          if (mdf_collY_dist_minima > 0)
                             { mdf_collY_sposta_1 = mdf_collY_dist_minima - VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm")) + mdf_Y_Ele_CollY/2 }
                          else
                             { mdf_collY_sposta_1 = -1*(ABS(mdf_collY_dist_minima) + VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"))) - mdf_Y_Ele_CollY/2 }

                          _mdf_collY_sposta_archdebug_2 = mdf_collY_sposta_1
                         }
                     }

                  if (mdf_ctrl_dist_arch > 0)
                     {
                      mdf_collY_sposta_2 = mdf_collY_sposta_1
                      mdf_collY_sposta_3 = mdf_collY_sposta_1
                      mdf_collY_sposta_4 = mdf_collY_sposta_1
                      mdf_collY_sposta_5 = mdf_collY_sposta_1
                      mdf_collY_sposta_6 = mdf_collY_sposta_1
                      mdf_collY_sposta_7 = mdf_collY_sposta_1

                      mdf_nome_var_sposta_arch = STRCAT("MCB_collY_sposta_", mdf_nome_arch, "_Sec")
                      // 23.09.2024
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) != 1)
                         {
                          mdf_var_length = STRLEN(mdf_nome_var_sposta_arch)
                          mdf_nome_var_sposta_arch_orig = mdf_nome_var_sposta_arch
                          mdf_var_length_w = mdf_var_length-4
                          while ( mdf_var_length_w > 19
                             & VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) != 1
                             )
                             {
                              mdf_nome_var_sposta_arch = STRCAT(STRMID(0, mdf_var_length_w, mdf_nome_var_sposta_arch_orig), "_Sec")
                              mdf_var_length_w = mdf_var_length_w-1
                             }
                         }
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) )  { mdf_collY_sposta_1 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_1")) }
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_2")) )  { mdf_collY_sposta_2 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_2")) }
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_3")) )  { mdf_collY_sposta_3 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_3")) }
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_4")) )  { mdf_collY_sposta_4 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_4")) }
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_5")) )  { mdf_collY_sposta_5 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_5")) }
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_6")) )  { mdf_collY_sposta_6 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_6")) }
                      if (VAR_EXIST(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_7")) )  { mdf_collY_sposta_7 = VAR_VAL(idx_att, STRCAT(mdf_nome_var_sposta_arch, "_7")) }
                     }
                 }
             }

          if (mdf_ele_collY_Only_Msg == 0)
             {
              mdf_collY_sposta = VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_collY_trovataCol_Sec)))
              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_sposta, 0, "")

              // 25.11.2022
              mdf_py_CerBat_ctrl = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(id_collision)))
              GOSUB MdF_Ctrl_CerBat_Vic
             }
         }
   }

   // 23.11.2022 Ce112301
   PROCEDURA MdF_Ctrl_Collis_CerBat_CopFon
   {
      // 25.11.2022
      //mdf_collY_sposta_attCF = VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_collY_trovataCol)))
      // 13.03.2024 Errato _
      //mdf_collY_sposta_attCF = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta_", STR(id_collision)))
      mdf_collY_sposta_attCF = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)))

     // 04.04.2024 Sc1052742 Vedi mdf_Ctrl_spostaCer_archPrec
      if ( mdf_collY_sposta_attCF != 0
         & ABS(VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision), "_att"))) > mdf_collY_sposta_attCF
         )
         {
          mdf_collY_sposta_attCF_ByarchPrec = mdf_collY_sposta_attCF
          mdf_collY_sposta_attCF = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision), "_att"))
         }

      if (VAR_VAL(idx_att, "mdf_collY_trovataCol_Sec") > 0)  { mdf_collY_sposta_attCF = VAR_VAL(idx_att, STRCAT("mdf_collY_sposta_", STR(mdf_collY_trovataCol_Sec))) }

      if (mdf_collY_sposta_attCF == 0)  { EXITSUB() }

      // Se a qualcun altro da fastidio si puo abilitare questa riga
      //if (mdf_collY_dist_ctrl_Sec <= mdf_collY_dist_ctrl)  { EXITSUB() }

      // Per ora solo se sposta <= 32
      // 04.04.2024 St508176
      //if (ABS(mdf_collY_sposta_attCF) > 32)  { EXITSUB() }
      if (ABS(mdf_collY_sposta_attCF) > 45)  { EXITSUB() }

      mdf_collY_sposta_attCF_att = mdf_collY_sposta_attCF
      mcb_found_collis = 0
      mcb_collis_idx = VAR_VAL(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"))
      mcb_find_archCF = mdF_collY_archetipo1

      // 25.11.2022
      if ( IS_MATCH(NOME(mcb_collis_idx), "*Fon*") != 1
         & IS_MATCH(NOME(mcb_collis_idx), "*Cop*") != 1
         )
         { EXITSUB() }

      if (IS_MATCH(NOME(mcb_collis_idx), "*Fon*") )
         { mcb_find_archCF = mdF_collY_archetipo2 }

      NEAR_GLOBALE("mdf_collY_vic_CF", idx_att, dist_Coll+mdf_collY_sposta_attCF, 1, mcb_find_archCF)

      iCF = 1
      while (iCF <= mdf_collY_vic_CF)
         {
          // 13.03.2024 Ce000027
          mcb_idx_CBCF = mdf_collY_vic_CF[iCF]
          SET_#(mcb_idx_CBCF)

          X_ele_collY = VAR_VAL(mcb_idx_CBCF, "X")
          Z_ele_collY = VAR_VAL(mcb_idx_CBCF, "Z")
          Ba0_att = [base_0.x, 0, base_0.z]
          Ba3_att = [base_3.x, 0, base_3.z]

          Ba1_ele = [#base_1.x, 0, #base_1.z]
          Ba2_ele = [#base_2.x, 0, #base_2.z]

          dist_02_ele = DISTANZA(Ba0_att, Ba2_ele)
          dist_31_ele = DISTANZA(Ba3_att, Ba1_ele)
          mdf_ele_internCF = 0
          GOSUB MdF_ele_intern_Collision
          if (VAR_VAL(idx_att, "mdf_ele_internC") != -99)  { mdf_ele_internCF = VAR_VAL(idx_att, "mdf_ele_internC") }

          if (mdf_ele_internCF > 0)
             {
              if (mdf_collY_vic_CF[iCF] != mcb_collis_idx)
                 {
                  bas0y_CF = VAR_VAL(mdf_collY_vic_CF[iCF], "base_0.y")
                  y_CF = VAR_VAL(mdf_collY_vic_CF[iCF], "Y")
                  if (mdf_collY_sposta_attCF > 0)
                     {
                      mdf_collisCBCF_testposy = mdf_py_CerBat_ctrl+base_0.y + mdf_collY_sposta_attCF
                      if ( mdf_collisCBCF_testposy+68/2 > bas0y_CF
                         //& mdf_py_CerBat_ctrl+base_0.y - 30 < bas0y_CF
                         & mdf_collisCBCF_testposy - 68/2 < bas0y_CF+y_CF
                         )
                         {
                          mcb_found_collis = 1
                          mcb_idx_CBCF_found = mdf_collY_vic_CF[iCF]
                         }
                     }
                  else
                     {
                      mdf_collisCBCF_testposy2 = mdf_py_CerBat_ctrl+base_0.y + mdf_collY_sposta_attCF
                      mdf_py_CerBat_ctrl_Ass = mdf_py_CerBat_ctrl+base_0.y
                      if ( mdf_py_CerBat_ctrl+base_0.y + mdf_collY_sposta_attCF-68/2 < bas0y_CF
                         & mdf_py_CerBat_ctrl+base_0.y + 30 > bas0y_CF
                         // 09.01.2025 St943038
                         & mdf_py_CerBat_ctrl+base_0.y + mdf_collY_sposta_attCF+mdf_collY_dist_ctrl > bas0y_CF+y_CF/2
                         )
                         {
                          mdf_collY_dist_ctrl_CF = mdf_collY_dist_ctrl
                          mcb_idx_CBCF_found = mdf_collY_vic_CF[iCF]
                          mcb_found_collis = 2
                         }
                     }
                 }
             }
          iCF = iCF+1
         }
      if (mcb_found_collis >= 1)
         {
          mdf_collY_spostaCF = mdf_collY_sposta_attCF*2
          // 13.03.2024 Ce000027
          if (mdf_py_CerBat_ctrl + mdf_collY_spostaCF > mdf_limite_pyCer_InfSup)
             {
              VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collision)), mdf_collY_spostaCF, 0, "")
             }
         }
   }

  // 11.06.2018
   PROCEDURA MCB_CollY_sposta_Cer_Sup_Inf
   {
      if (mcb_collY_sposta_Sup > -999)
         {
          // 12.07.2019 aggiunto MdfSys_SbordoYSup
          if (basy_CerCn + 180 > alto_0.y - VAR_VAL(idx_att, "MdfSys_SbordoYSup"))
             {
              mdf_sposta_CerSup = 1
              // 10.02.2020 A170443, A110136 con il flusso corretto da MdF_Load_COMANDO2=1 MCB_IngombroVasca vale 0 perche non lo trova subito
              // e quindi crea MCB_collY_sposta_Sup pertanto entra qui dentro ma non dovrebbe ed effettivamente
              // non e' sicuro creare MCB_collY_sposta_Sup in funzione di una vicinanza che appunto potrebbe non trovare subito
              // ma se proprio la crea, qui non deve entrare nel caso di MCB_collY_dist_min_arch
              if (mdf_ctrl_dist_arch > 0  &  mdf_collY_sposta_1 < 0)  { mdf_sposta_CerSup = 0 }

              if (mdf_sposta_CerSup)
                 {
                  mdf_collY_sposta_1 = mcb_collY_sposta_Sup
                  mdf_collY_sposta_2 = mdf_collY_sposta_1
                  mdf_collY_sposta_3 = mdf_collY_sposta_1
                  mdf_collY_sposta_4 = mdf_collY_sposta_1
                  mdf_collY_sposta_5 = mdf_collY_sposta_1
                  mdf_collY_sposta_6 = mdf_collY_sposta_1
                  mdf_collY_sposta_7 = mdf_collY_sposta_1
                  if (mcb_collY_sposta_Sup_2 > -999)
                     {
                      if (mdf_collY_sposta_2 > 0 & mdf_collY_sposta_2 - mdf_collY_dist_ctrl < mdf_collY_y_mm)  { mdf_collY_sposta_2 = mcb_collY_sposta_Sup_2 }
                      if (mdf_collY_sposta_3 > 0 & mdf_collY_sposta_3 - mdf_collY_dist_ctrl < mdf_collY_y_mm)  { mdf_collY_sposta_3 = mcb_collY_sposta_Sup_2 }
                     // 26.07.2018
                      if (mdf_collY_sposta_6 > 0 & mdf_collY_sposta_6 - mdf_collY_dist_ctrl < mdf_collY_y_mm)  { mdf_collY_sposta_6 = mcb_collY_sposta_Sup_2 }
                     }

                  if (mcb_collY_sposta_Sup_Inv > -999)
                     {
                      mdf_collY_sposta_1_inv = mcb_collY_sposta_Sup_Inv
                      mdf_collY_sposta_2_inv = mdf_collY_sposta_1_inv
                      mdf_collY_sposta_3_inv = mdf_collY_sposta_1_inv
                      mdf_collY_sposta_4_inv = mdf_collY_sposta_1_inv
                      mdf_collY_sposta_5_inv = mdf_collY_sposta_1_inv
                      mdf_collY_sposta_6_inv = mdf_collY_sposta_1_inv
                      mdf_collY_sposta_7_inv = mdf_collY_sposta_1_inv
                     }
                 }
             }
         }
      if (mcb_collY_sposta_Inf > -999)
         {
          // 12.07.2019 aggiunto MdfSys_SbordoYInf
          if (basy_CerCn - 180 < base_0.y + VAR_VAL(idx_att, "MdfSys_SbordoYInf"))
             {
              mdf_collY_sposta_1 = mcb_collY_sposta_Inf
              mdf_collY_sposta_2 = mdf_collY_sposta_1
              mdf_collY_sposta_3 = mdf_collY_sposta_1
              mdf_collY_sposta_4 = mdf_collY_sposta_1
              mdf_collY_sposta_5 = mdf_collY_sposta_1
              mdf_collY_sposta_6 = mdf_collY_sposta_1
              mdf_collY_sposta_7 = mdf_collY_sposta_1
              if (mcb_collY_sposta_Inf_2 > -999)
                 {
                  if (mdf_collY_sposta_2 > 0 & mdf_collY_sposta_2 - mdf_collY_dist_ctrl < mdf_collY_y_mm)  { mdf_collY_sposta_2 = mcb_collY_sposta_Inf_2 }
                  if (mdf_collY_sposta_3 > 0 & mdf_collY_sposta_3 - mdf_collY_dist_ctrl < mdf_collY_y_mm)  { mdf_collY_sposta_3 = mcb_collY_sposta_Inf_2 }
                 }

              if (mcb_collY_sposta_Inf_Inv > -999)
                 {
                  mdf_collY_sposta_1_inv = mcb_collY_sposta_Inf_Inv
                  mdf_collY_sposta_2_inv = mdf_collY_sposta_1_inv
                  mdf_collY_sposta_3_inv = mdf_collY_sposta_1_inv
                  mdf_collY_sposta_4_inv = mdf_collY_sposta_1_inv
                  mdf_collY_sposta_5_inv = mdf_collY_sposta_1_inv
                  mdf_collY_sposta_6_inv = mdf_collY_sposta_1_inv
                  mdf_collY_sposta_7_inv = mdf_collY_sposta_1_inv
                 }
             }
         }
   }

   PROCEDURA MdF_Ctrl_limCerVic
   {
      mcb_limDELCerVic = -1
      if (VAR_EXIST(idx_att, "MCB_limDELCerVic") )  { mcb_limDELCerVic = VAR_VAL(idx_att, "MCB_limDELCerVic") }

      if (mcb_limDELCerVic < 0)  { EXITSUB() }

      DEL_VAR(idx_att, "MdfSys_DELCerVic*")

      mcb_id_pyCer = 1
      // 8 sono le 8 cerniere
      while (VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(mcb_id_pyCer))) > 0)
         {
          if (VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mcb_id_pyCer))) > 0)
             {
              mcb_py_CerBat = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mcb_id_pyCer)))
              mcb_collY_sposta = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(mcb_id_pyCer)) )
              mcb_ute_sposta = VAR_VAL(idx_att, STRCAT("MCB_Ute_spostaCer", STR(mcb_id_pyCer)) )
              mcb_py_CerBat_Compl = mcb_py_CerBat + mcb_collY_sposta + mcb_ute_sposta
              mcb_j_cer = 1
              while (VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(mcb_j_cer))) > 0)
                 {
                  if ( VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mcb_j_cer))) > 0
                     & mcb_j_cer != mcb_id_pyCer
                     )
                     {
                      mcbj_py_CerBat = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mcb_j_cer)))

                      mcbj_collY_sposta = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(mcb_j_cer)) )
                      mcbj_ute_sposta = VAR_VAL(idx_att, STRCAT("MCB_Ute_spostaCer", STR(mcb_j_cer)) )
                      mcbj_py_CerBat_Compl = mcbj_py_CerBat + mcbj_collY_sposta + mcbj_ute_sposta

                      // 22.11.2018
                      mcb_sposta_vic_da_SbordoY = 0
                      if (VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_Scocca") >= 1)
                         {
                          if (VAR_VAL(idx_att, "MdfSys_SbordoYSup") > 40)
                             { mcb_sposta_vic_da_SbordoY = MdfSys_SbordoYSup }
                         }

                      // Lo faccio se c'è stata una collisione in una delle 2 cerniere che sto considerando
                      if ( mcb_collY_sposta != 0  |  mcbj_collY_sposta != 0
                         | mcb_sposta_vic_da_SbordoY > 0
                         )
                         {
                          if ( ABS(mcb_py_CerBat_Compl - mcbj_py_CerBat_Compl) <= mcb_limDELCerVic
                             // 22.11.2018 altrimenti le elimina entrambe
                             & VAR_VAL(idx_att, STRCAT("MdfSys_DELCerVic", STR(mcb_j_cer))) != 1
                             )
                             {
                              if (mcb_py_CerBat_Compl+mcb_sposta_vic_da_SbordoY > 120 & mcb_py_CerBat_Compl+mcb_sposta_vic_da_SbordoY < Y-120)
                                 {
                                  mcb_case_DELCerVic = 1
                                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_DELCerVic", STR(mcb_id_pyCer)), mcb_case_DELCerVic, 0, "")
                                 }
                             }
                         }
                     }
                   mcb_j_cer = mcb_j_cer+1
                  }
              }
          mcb_id_pyCer = mcb_id_pyCer+1
         }
   }

  // 11.06.2018
   PROCEDURA MCB_collY_archetipoN_Var
   {
      mdF_collY_archetipo1_Var = ""
      mdF_collY_archetipo2_Var = ""
      mdF_collY_archetipo3_Var = ""
      mdF_collY_archetipo4_Var = ""
      mdF_collY_archetipo5_Var = ""
      mdF_collY_archetipo6_Var = ""
      mdF_collY_archetipo7_Var = ""
      mdF_collY_archetipo8_Var = ""
      mdF_collY_archetipo9_Var = ""
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo1_Var") )  { mdF_collY_archetipo1_Var = VAR_VAL_STR(idx_att, "MCB_collY_archetipo1_Var") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo2_Var") )  { mdF_collY_archetipo2_Var = VAR_VAL_STR(idx_att, "MCB_collY_archetipo2_Var") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo3_Var") )  { mdF_collY_archetipo3_Var = VAR_VAL_STR(idx_att, "MCB_collY_archetipo3_Var") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo4_Var") )  { mdF_collY_archetipo4_Var = VAR_VAL_STR(idx_att, "MCB_collY_archetipo4_Var") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo5_Var") )  { mdF_collY_archetipo5_Var = VAR_VAL_STR(idx_att, "MCB_collY_archetipo5_Var") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo6_Var") )  { mdF_collY_archetipo6_Var = VAR_VAL_STR(idx_att, "MCB_collY_archetipo6_Var") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo7_Var") )  { mdF_collY_archetipo7_Var = VAR_VAL_STR(idx_att, "MCB_collY_archetipo7_Var") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo8_Var") )  { mdF_collY_archetipo8_Var = VAR_VAL_STR(idx_att, "MCB_collY_archetipo8_Var") }
      if (VAR_EXIST(idx_att, "MCB_collY_archetipo9_Var") )  { mdF_collY_archetipo9_Var = VAR_VAL_STR(idx_att, "MCB_collY_archetipo9_Var") }

      mdf_ele_intern_VarVAL_ESCL = 0
      mdf_ele_intern_VarVAL_OK = 0
      mdf_ele_intern_VarVAL_dist_arch = 0

      mdf_cY_arch = 1
      // 26.02.2025 forse era rimasto da correggere
      //while (mdf_cY_arch <= 5)
      while (mdf_cY_arch <= 9)
         {
          mdF_collY_archetipoGEN = VAR_VAL_STR(ATTUALE(), STRCAT("mdF_collY_archetipo", STR(mdf_cY_arch)))
          if (IS_MATCH(NOME(mdf_collY[iCol]), mdF_collY_archetipoGEN) )
             {
              mdF_collY_archetipo_VarGEN = VAR_VAL_STR(ATTUALE(), STRCAT("mdF_collY_archetipo", STR(mdf_cY_arch), "_Var"))
              GOSUB MCB_collY_archetipoN_VarVAL_GEN
             }
          mdf_cY_arch = mdf_cY_arch+1
         }
      if (mdf_ele_intern_VarVAL_ESCL > 0)
         {
          if (mdf_ele_intern_VarVAL_OK <= 0)  { mdf_ele_intern = -16 }
         }
   }

   PROCEDURA MCB_collY_archetipoN_VarVAL_GEN
   {
      mdf_index_of_archVar = STR_INDEX_OF(mdF_collY_archetipo_VarGEN, 0, "=")
      mdf_index_of_arch_OR = STR_INDEX_OF(mdF_collY_archetipo_VarGEN, 0, "|")

     // 26.02.2025 St606638
      mdf_index_of_arch_AND = -1.1
      if (mdf_index_of_arch_OR < 0)
         {
          mdf_index_of_arch_AND = STR_INDEX_OF(mdF_collY_archetipo_VarGEN, 0, "&")
          mdf_index_of_arch_OR = mdf_index_of_arch_AND
         }

      mdf_index_of_arch_OR_att = mdf_index_of_arch_OR
      if (mdf_index_of_arch_OR <= 0)  { mdf_index_of_arch_OR = STRLEN(mdF_collY_archetipo_VarGEN) }
      mdf_archVar = STRMID(0, mdf_index_of_archVar, mdF_collY_archetipo_VarGEN)
      //mdf_archVal = STRMID(mdf_index_of_archVar+2, STRLEN(mdF_collY_archetipo_VarGEN)-1, mdF_collY_archetipo_VarGEN)
      mdf_archVal = STRMID(mdf_index_of_archVar+2, mdf_index_of_arch_OR-mdf_index_of_archVar-2, mdF_collY_archetipo_VarGEN)
      mdf_archVar1 = mdf_archVar
      mdf_archVal1 = mdf_archVal
      GOSUB MCB_collY_archetipoN_VarVAL
      mdf_ele_intern_VarVAL_ESCL1 = mdf_ele_intern_VarVAL_ESCLn
      mdf_ele_intern_VarVAL_ESCL2 = 1
      mdf_ele_intern_VarVAL_OK1 = mdf_ele_intern_VarVAL_OKn
      mdf_ele_intern_VarVAL_OK2 = 0

      if (mdf_index_of_arch_OR_att > 3)
         {
          mdf_ele_intern_VarVAL_ESCL2 = 0
          mdf_index_of_archVar2 = STR_INDEX_OF(mdF_collY_archetipo_VarGEN, mdf_index_of_arch_OR, "=")
          mdf_archVar2 = STRMID(mdf_index_of_arch_OR+1, mdf_index_of_archVar2-mdf_index_of_arch_OR-1, mdF_collY_archetipo_VarGEN)
          mdf_archVal2 = STRMID(mdf_index_of_archVar2+2, STRLEN(mdF_collY_archetipo_VarGEN)-1, mdF_collY_archetipo_VarGEN)
          mdf_archVar = mdf_archVar2
          mdf_archVal = mdf_archVal2
          GOSUB MCB_collY_archetipoN_VarVAL
          mdf_ele_intern_VarVAL_ESCL2 = mdf_ele_intern_VarVAL_ESCLn
          mdf_ele_intern_VarVAL_OK2 = mdf_ele_intern_VarVAL_OKn
         }
      if (mdf_ele_intern_VarVAL_ESCL1 > 0  &  mdf_ele_intern_VarVAL_ESCL2 > 0)
         { mdf_ele_intern_VarVAL_ESCL = 1 }

     // 26.02.2025 St606638
      if (mdf_index_of_arch_AND > 0)
         {
          if (mdf_ele_intern_VarVAL_ESCL1 > 0  |  mdf_ele_intern_VarVAL_ESCL2 > 0)
             { mdf_ele_intern_VarVAL_ESCL = 1.1 }

          if (mdf_ele_intern_VarVAL_OK1 > 0  &  mdf_ele_intern_VarVAL_OK2 > 0)
             {
              mdf_ele_intern_VarVAL_OK = 1
              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_minCn_arch", STR(mdf_cY_arch))) )
                 { mdf_ele_intern_VarVAL_dist_arch = VAR_VAL(idx_att, STRCAT("MCB_collY_dist_minCn_arch", STR(mdf_cY_arch))) }
              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_cY_arch))) )
                 { mdf_ele_intern_VarVAL_dist_arch = VAR_VAL(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_cY_arch))) }
             }
         }
      else
         {
          if (mdf_ele_intern_VarVAL_OK1 > 0  |  mdf_ele_intern_VarVAL_OK2 > 0)
             {
              mdf_ele_intern_VarVAL_OK = 1
              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_minCn_arch", STR(mdf_cY_arch))) )
                 { mdf_ele_intern_VarVAL_dist_arch = VAR_VAL(idx_att, STRCAT("MCB_collY_dist_minCn_arch", STR(mdf_cY_arch))) }
              if (VAR_EXIST(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_cY_arch))) )
                 { mdf_ele_intern_VarVAL_dist_arch = VAR_VAL(idx_att, STRCAT("MCB_collY_dist_min_arch", STR(mdf_cY_arch))) }
             }
         }
   }

   PROCEDURA MCB_collY_archetipoN_VarVAL
   {
      mdf_ele_intern_VarVAL_ESCLn = 0
      mdf_ele_intern_VarVAL_OKn = 0
      if (VAR_EXIST(mdf_collY[iCol], mdf_archVar) )
         {
          if (VAR_TYPE(mdf_collY[iCol], mdf_archVar) == 0)
             {
              if (VAR_VAL(mdf_collY[iCol], mdf_archVar) != ATOI(mdf_archVal))
                 {
                  //mdf_ele_intern = -16
                  mdf_ele_intern_VarVAL_ESCLn = 1
                  mdf_ele_intern_VarVAL = mdf_archVal
                  mdf_ele_intern_archVar = mdf_archVar
                 }
              else
                 { mdf_ele_intern_VarVAL_OKn = 1 }
             }
          else
             {
              if (IS_MATCH(VAR_VAL_STR(mdf_collY[iCol], mdf_archVar), STRCAT(mdf_archVal, "*")) != 1)
                 {
                  //mdf_ele_intern = -16
                  mdf_ele_intern_VarVAL_ESCLn = 1
                  mdf_ele_intern_VarVAL = mdf_archVal
                  mdf_ele_intern_archVar = mdf_archVar
                 }
              else
                 { mdf_ele_intern_VarVAL_OKn = 1 }
             }
         }
   }

   PROCEDURA mdf_spostamentiCer_att
   {
      MdfSys_collY_sposta1_att = VAR_VAL(idx_att, "MdfSys_collY_sposta1")
      MdfSys_collY_sposta2_att = VAR_VAL(idx_att, "MdfSys_collY_sposta2")
      MdfSys_collY_sposta3_att = VAR_VAL(idx_att, "MdfSys_collY_sposta3")
      MdfSys_collY_sposta4_att = VAR_VAL(idx_att, "MdfSys_collY_sposta4")
      MdfSys_collY_sposta5_att = VAR_VAL(idx_att, "MdfSys_collY_sposta5")
      MdfSys_collY_sposta6_att = VAR_VAL(idx_att, "MdfSys_collY_sposta6")
      MdfSys_collY_sposta7_att = VAR_VAL(idx_att, "MdfSys_collY_sposta7")
      MdfSys_collY_sposta8_att = VAR_VAL(idx_att, "MdfSys_collY_sposta8")
   }

  // 06.05.2022 Sc1022042290
   PROCEDURA mdf_Ctrl_spostaCer_archPrec
   {
     // Per ora circoscritto ad un caso specifico
      // Prima fa il controllo per il Fondo del pensile sopra, poi per il suo Coperchio ma lo sposta per il Coperchio e' 32, mentre per il Fondo la dist e' 34.4
      // quindi con lo spostamento di 32 non basta per uscire anche dalla collisione del Fondo sopra

     // 06.11.2024 Sc10483400913 Aggiunto per sposta4
      if ( VAR_EXIST(idx_att, "MdfSys_collY_sposta4")
         & VAR_EXIST(idx_att, "MdfSys_collY_sposta4_att")
         & VAR_VAL(idx_att, "MdfSys_collY_sposta4") != 0
         // dovrebbe essere anche MdfSys_collY_sposta4_att != 0 ma per le var debug mi va bene entrare
         )
         {
          if (VAR_VAL(idx_att, "mdf_arch_n") == 2)
             {
              mdfsys_collY_sposta4_att_deb1 = MdfSys_collY_sposta4_att
              mdfsys_collY_sposta4_deb2     = MdfSys_collY_sposta4
             }
          if (VAR_VAL(idx_att, "mdf_arch_n") == 3)
             {
              mdfsys_collY_sposta4_att_deb2 = MdfSys_collY_sposta4_att
              MdfSys_collY_sposta4_deb3     = MdfSys_collY_sposta4
             }
          if ( MdfSys_collY_sposta4_att > MdfSys_collY_sposta4
             // Se era 0 e poi trova una collisione di meno di 10mm devo stare attento che non imposti 0
             // anche se per essere MdfSys_collY_sposta4_att maggiore di MdfSys_collY_sposta4 deve essere per forza diverso da zero
             // ma lo tengo per promemoria se ci fosse da fare per lo spostamento in negativo
             & MdfSys_collY_sposta4_att != 0
             )
             {
              // Visto che e' il primo caso in 7 anni per ora lo faccio solo se la differenza e' poca perche' potrebbero esserci altri spostamenti o collisioni in gioco
              // altrimenti comunque sarebbe da valutare se si puo gestire meglio il caso in RegFacc o VariabiliMdF
              if (MdfSys_collY_sposta4_att - MdfSys_collY_sposta4 < 15)
                 {
                  mdfsys_collY_sposta4_debR = MdfSys_collY_sposta4
                  MdfSys_collY_sposta4 = MdfSys_collY_sposta4_att
                 }
             }
         }

      if ( VAR_EXIST(idx_att, "MdfSys_collY_sposta5")
         & VAR_EXIST(idx_att, "MdfSys_collY_sposta5_att")
         & VAR_VAL(idx_att, "MdfSys_collY_sposta5") != 0
         // dovrebbe essere anche MdfSys_collY_sposta5_att != 0 ma per le var debug mi va bene entrare
         )
         {
          if (VAR_VAL(idx_att, "mdf_arch_n") == 2)
             {
              mdfsys_collY_sposta5_att_deb1 = MdfSys_collY_sposta5_att
              MdfSys_collY_sposta5_deb2     = MdfSys_collY_sposta5
             }
          if (VAR_VAL(idx_att, "mdf_arch_n") == 3)
             {
              mdfsys_collY_sposta5_att_deb2 = MdfSys_collY_sposta5_att
              MdfSys_collY_sposta5_deb3     = MdfSys_collY_sposta5
             }
          if ( MdfSys_collY_sposta5_att > MdfSys_collY_sposta5
             // Se era 0 e poi trova una collisione di meno di 3mm devo stare attento che non imposti 0
             // anche se per essere MdfSys_collY_sposta5_att maggiore di MdfSys_collY_sposta5 deve essere per forza diverso da zero
             // ma lo tengo per promemoria se ci fosse da fare per lo spostamento in negativo
             & MdfSys_collY_sposta5_att != 0
             )
             {
              // Visto che e' il primo caso in 7 anni per ora lo faccio solo se la differenza e' poca perche' potrebbero esserci altri spostamenti o collisioni in gioco
              // altrimenti comunque sarebbe da valutare se si puo gestire meglio il caso in RegFacc o VariabiliMdF
              if (MdfSys_collY_sposta5_att - MdfSys_collY_sposta5 < 3)
                 { MdfSys_collY_sposta5 = MdfSys_collY_sposta5_att }
             }
         }

      if ( VAR_EXIST(idx_att, "MdfSys_collY_sposta6")
         & VAR_EXIST(idx_att, "MdfSys_collY_sposta6_att")
         & VAR_VAL(idx_att, "MdfSys_collY_sposta6") != 0
         )
         {
          if (VAR_VAL(idx_att, "mdf_arch_n") == 2)
             {
              mdfsys_collY_sposta6_att_deb1 = MdfSys_collY_sposta6_att
              MdfSys_collY_sposta6_deb2     = MdfSys_collY_sposta6
             }
          if (VAR_VAL(idx_att, "mdf_arch_n") == 3)
             {
              mdfsys_collY_sposta6_att_deb2 = MdfSys_collY_sposta6_att
              MdfSys_collY_sposta6_deb3     = MdfSys_collY_sposta6
             }
          if ( MdfSys_collY_sposta6_att > MdfSys_collY_sposta6
             // Se era 0 e poi trova una collisione di meno di 3mm devo stare attento che non imposti 0
             // anche se per essere MdfSys_collY_sposta6_att maggiore di MdfSys_collY_sposta6 deve essere per forza diverso da zero
             // ma lo tengo per promemoria se ci fosse da fare per lo spostamento in negativo
             & MdfSys_collY_sposta6_att != 0
             )
             {
              // Visto che e' il primo caso in 7 anni per ora lo faccio solo se la differenza e' poca perche' potrebbero esserci altri spostamenti o collisioni in gioco
              // altrimenti comunque sarebbe da valutare se si puo gestire meglio il caso in RegFacc o VariabiliMdF
              if (MdfSys_collY_sposta6_att - MdfSys_collY_sposta6 < 3)
                 { MdfSys_collY_sposta6 = MdfSys_collY_sposta6_att }
             }
         }
   }

   PROCEDURA MdF_Msg_Collis_CerBat
   {
      //$MdF_Load_att = "OnFindCollCerBat"
      // Se sono stati gia aggiunti ma troppo presto con OnMacro fa il MdF_Ctrl_Cambiamenti
      $MdF_Load_att = "OnMacroFindCollCerBat"
      GOSUB MdF_CamMdFrontali

      WITH_ALIAS("mdf_msg_arrayCCB", "MdF_CerBat")

      iCC=1
      while (iCC <= mdf_msg_arrayCCB)
         {
          iCer=1
          while (iCer <= 8)
             {
              if (VAR_VAL(mdf_msg_arrayCCB[iCC], STRCAT("py_CerBat", STR(iCer))) > 0)
                 {
                  colll = VAR_VAL(mdf_msg_arrayCCB[iCC], STRCAT("MdfSys_Collision", STR(iCer)))

                  if (VAR_VAL(mdf_msg_arrayCCB[iCC], STRCAT("MdfSys_Collision", STR(iCer))) > 0)
                     {
                      mdf_msg_coll_idx = mdf_msg_arrayCCB[iCC]
                      HI(mdf_msg_coll_idx, 1)
                      mdf_msg_idxRipColl = VAR_VAL(mdf_msg_arrayCCB[iCC], STRCAT("MdfSys_Collision", STR(iCer), "_idx"))
                      mdf_msg_nomeRipColl = NOME(mdf_msg_idxRipColl)
                      HI(mdf_msg_idxRipColl, 1)
                      mdf_msg_idReg = STRCAT(VAR_VAL_STR(mdf_msg_arrayCCB[iCC], "KeyFamRegFacc"), "_", STR(iCer))
                      DISPLAY2(STRCAT("Collisione tra CernieraBattente id_Reg ", mdf_msg_idReg, " Frontale=", STR(mdf_msg_arrayCCB[iCC]), " e ", mdf_msg_nomeRipColl, " ", STR(mdf_msg_idxRipColl)))
                      HI(mdf_msg_coll_idx, 0)
                      HI(mdf_msg_idxRipColl, 0)
                     }
                 }
              iCer = iCer+1
             }
          iCC = iCC+1
         }
   }

   PROCEDURA Reg_pos_CerRib
   {
      // 13.10.2023 Come Reg_pos_CerBat
      if (VAR_VAL(idx_att, "escluso") != 0)  { EXITSUB() }
      if (ACTION() == 1064)  { EXITSUB() }
     // 07.08.2024
      if (UN_PADRE("MECCANISM*_UTENTE*") )  { EXITSUB() }

      // 13.10.2023 Simil Reg_pos_CerBat
      if (VAR_EXIST(idx_att, "KeyFamRegFacc_CerRib_prec") != 1)   { KeyFamRegFacc_CerRib_prec = "-" }
      if (VAR_EXIST(idx_att, "KeyFamRegFacc_PisAnta_prec") != 1)  { KeyFamRegFacc_PisAnta_prec = "-" }
      if (VAR_EXIST(idx_att, "KeyFamRegFacc_PisFia_prec") != 1)   { KeyFamRegFacc_PisFia_prec = "-" }

      //if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0  &  ACTION() != 3)  { EXITSUB() }
      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)
         {
          if ( VAR_VAL(idx_att, "py_CerRib1") > 0
             | VAR_VAL(idx_att, "py_PisAnta1") > 0
             )
             {
              // 13.10.2023
              // { EXITSUB() }
              // 21.10.2024 Ampliato, prima era solo PisAnta
              mdf_NONcambia_PostRE_PisAnta = 0
              mdf_NONcambia_PostRE_PisFia = 0
              mdf_NONcambia_PostRE_CerRib = 0
              if ( VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta_prec") == VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta")
                 & VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_PisAnta") == VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta")
                 )
                 { mdf_NONcambia_PostRE_PisAnta = 1 }

              if ( VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia_prec") == VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia")
                 & VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_PisFia") == VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia")
                 )
                 { mdf_NONcambia_PostRE_PisFia = 1 }

              if ( VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerRib_prec") == VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerRib")
                 & VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_CerRib") == VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerRib")
                 )
                 { mdf_NONcambia_PostRE_CerRib = 1 }

              if ( mdf_NONcambia_PostRE_PisAnta == 1  &  mdf_NONcambia_PostRE_PisFia == 1  &  mdf_NONcambia_PostRE_CerRib == 1
                 // 21.10.2024 Se senza ottimizzazioni MdF_Ctrl_var_gest_MdF
                 & mdf_ctrl_Change_Var_CAM < 1
                 )
                 {
                  KeyFamRegFacc_PisAnta_pdr = VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_PisAnta")
                  KeyFamRegFacc_PisFia_pdr = VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_PisFia")
                  KeyFamRegFacc_CerRib_pdr = VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_CerRib")
                  if (ACTION() != 3)  { EXITSUB() }
                 }
             }
         }

      if (ACTION() == 1 & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1)
         {
         // 13.10.2023 Simil Reg_pos_CerBat
          //EXITSUB()
          if ( VAR_VAL(idx_att, "py_CerRib1") > 0
             | VAR_VAL(idx_att, "py_PisAnta1") > 0
             )
             {
              // 21.10.2024 Ampliato, prima era solo PisAnta
              mdf_NONcambia_ACT1_PisAnta = 0
              mdf_NONcambia_ACT1_PisFia = 0
              mdf_NONcambia_ACT1_CerRib = 0
              if ( VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta_prec") == VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta")
                 & VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_PisAnta") == VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta")
                 )
                 { mdf_NONcambia_ACT1_PisAnta = 1 }

              if ( VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia_prec") == VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia")
                 & VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_PisFia") == VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia")
                 )
                 { mdf_NONcambia_ACT1_PisFia = 1 }

              if ( VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerRib_prec") == VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerRib")
                 & VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_CerRib") == VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerRib")
                 )
                 { mdf_NONcambia_ACT1_CerRib = 1 }

              if ( mdf_NONcambia_ACT1_PisAnta == 1  &  mdf_NONcambia_ACT1_PisFia == 1  &  mdf_NONcambia_ACT1_CerRib == 1
                 // 21.10.2024 Se senza ottimizzazioni MdF_Ctrl_var_gest_MdF
                 & mdf_ctrl_Change_Var_CAM < 1
                 )
                 {
                  KeyFamRegFacc_CerRib_pdr = VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_CerRib")
                  KeyFamRegFacc_PisAnta_pdr = VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_PisAnta")
                  KeyFamRegFacc_CerRib_pdrAct1 = VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc_CerRib")
                  EXITSUB()
                 }
             }
         }

     // 09.05.2024 Ottimizzazioni
      if (mdf_ctrl_Change_Var_CAM <= 0)  { EXITSUB() }

      if (ACTION() > 0)
         {
          // Devo rientrare altrimenti se cambiano le condizioni specificate in tabella
          // non va a riprendersi i valori corretti

          py_CerRib1 = 0
          px_CerRib1 = 0
          px_CerRib2 = 0
          px_CerRib3 = 0
          px_CerRib4 = 0
          px_CerRib5 = 0

          tLav = "CerRib"
          KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
          KeyFamRegFacc_CerRib = KeyFamRegFacc
          KeyFamRegFacc_CerRib_prec = KeyFamRegFacc
          //CHIAVE_TABVAR_MDF = tLav
          //GOSUB MdF_VariabiliDaTipoPadri
          //GOSUB MdF_Variabili
          GOSUB MdF_read_RegFacc

          px_PisAnta1 = 0
          py_PisAnta1 = 0
          DEL_VAR(idx_att, "p*_PisAnta2")
          tLav = "PisAnta"
          KeyFamRegFacc_PisAnta = ""
          if (STRLEN(VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav)) ) > 0)
             {
              KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
              KeyFamRegFacc_PisAnta = KeyFamRegFacc
              GOSUB MdF_read_RegFacc
              px_PisAntaCn1 = 0
              py_PisAntaCn1 = 0
              px_PisAntaCn2 = 0
              py_PisAntaCn2 = 0
             // 01.03.2019
              px_PisAntaCn3 = 0
              py_PisAntaCn3 = 0
              px_PisAntaCn4 = 0
              py_PisAntaCn4 = 0
             // 21.01.2021
              px_PisAntaCn5 = 0
              py_PisAntaCn5 = 0
              px_PisAntaCn6 = 0
              py_PisAntaCn6 = 0
              tLav = "PisAntaCn"
              GOSUB MdF_read_RegFacc
             }
          // 09.12.2024 Se non c'è almeno lo mette uguale a vuoto invece che rimanere uguale a "-"
          KeyFamRegFacc_PisAnta_prec = KeyFamRegFacc_PisAnta

          px_PisFia1 = 0
          py_PisFia1 = 0
          DEL_VAR(idx_att, "p*_PisFia2")
          tLav = "PisFia"
          KeyFamRegFacc_PisFia = ""
          if (STRLEN(VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav)) ) > 0)
             {
              KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
              KeyFamRegFacc_PisFia = KeyFamRegFacc
              GOSUB MdF_read_RegFacc
              px_PisFiaCn1  = 0
              py_PisFiaCn1  = 0
              px_PisFiaCn2  = 0
              py_PisFiaCn2  = 0
             // 01.03.2019
              px_PisFiaCn3  = 0
              py_PisFiaCn3  = 0
              px_PisFiaCn4  = 0
              py_PisFiaCn4  = 0
             // 21.01.2021
              px_PisFiaCn5  = 0
              py_PisFiaCn5  = 0
              px_PisFiaCn6  = 0
              py_PisFiaCn6  = 0
              tLav = "PisFiaCn"
              GOSUB MdF_read_RegFacc
             }
          KeyFamRegFacc_PisFia_prec = KeyFamRegFacc_PisFia

          if (VAR_EXIST(idx_att, "px_PisAnta2") )
             {
              if (VAR_EXIST(idx_att, "px_PisFia2") != 1)
                 {
                  px_PisFia2 = 0
                  py_PisFia2 = 0
                 }
             }
         }
   }

   PROCEDURA Reg_CerRib_att
   {
      if (VAR_EXIST(idx_att, "KeyFamRegFacc_CerRib") != 1)  { EXITSUB() }

      KeyFamRegFacc_CerRib_att = KeyFamRegFacc_CerRib
      KeyFamRegFacc_PisAnta_att = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisAnta")
      KeyFamRegFacc_PisFia_att = VAR_VAL_STR(idx_att, "KeyFamRegFacc_PisFia")
      MdF_Aper_att = MdF_Apertura
      X_att = X
      Y_att = Y
      py_CerRib1_att = py_CerRib1
      px_CerRib1_att = px_CerRib1
      px_CerRib2_att = px_CerRib2
      px_CerRib3_att = px_CerRib3
      px_CerRib4_att = px_CerRib4
      px_CerRib5_att = px_CerRib5
      px_CerRib6_att = px_CerRib6

      px_CerRib7_att = px_CerRib7
      px_CerRib8_att = px_CerRib8
      px_CerRib9_att = px_CerRib9

      pz_CerRib1_att = pz_CerRib1
      px_PisAnta1_att = px_PisAnta1
      py_PisAnta1_att = py_PisAnta1
      py_PisFia1_att = py_PisFia1
      px_PisAntaCn1_att = px_PisAntaCn1
      py_PisAntaCn1_att = py_PisAntaCn1
      px_PisFiaCn1_att  = px_PisFiaCn1
      py_PisFiaCn1_att  = py_PisFiaCn1
      px_PisAntaCn2_att = px_PisAntaCn2
      py_PisAntaCn2_att = py_PisAntaCn2
      px_PisFiaCn2_att  = px_PisFiaCn2
      py_PisFiaCn2_att  = py_PisFiaCn2
      // 01.03.2019
      px_PisAntaCn3_att = px_PisAntaCn3
      py_PisAntaCn3_att = py_PisAntaCn3
      px_PisFiaCn3_att  = px_PisFiaCn3
      py_PisFiaCn3_att  = py_PisFiaCn3
      px_PisAntaCn4_att = px_PisAntaCn4
      py_PisAntaCn4_att = py_PisAntaCn4
      px_PisFiaCn4_att  = px_PisFiaCn4
      py_PisFiaCn4_att  = py_PisFiaCn4
      // 21.01.2021
      px_PisAntaCn5_att = px_PisAntaCn5
      py_PisAntaCn5_att = py_PisAntaCn5
      px_PisFiaCn5_att  = px_PisFiaCn5
      py_PisFiaCn5_att  = py_PisFiaCn5
      px_PisAntaCn6_att = px_PisAntaCn6
      py_PisAntaCn6_att = py_PisAntaCn6
      px_PisFiaCn6_att  = px_PisFiaCn6
      py_PisFiaCn6_att  = py_PisFiaCn6

      Battuta_X_Sx_att = Battuta_X_Sx
      Battuta_X_Dx_att = Battuta_X_Dx
      Battuta_Y_att = Battuta_Y
      Battuta_Z_att = Battuta_Z
   }

   PROCEDURA Reg_pos_Paracolpi
   {
      if (ACTION() == 1064)  { EXITSUB() }
     // 17.05.2024 Ottimizzazioni
      if (mdf_ctrl_Change_Var_CAM <= 0)  { EXITSUB() }

      //if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0  &  ACTION() != 3)  { EXITSUB() }
      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)
         {
          if ( VAR_VAL(idx_att, "px_Par1") > 0
             | VAR_VAL(idx_att, "py_Par1") > 0
             )
             { EXITSUB() }
         }

      if (ACTION() == 1 & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1)  { EXITSUB() }

      if (ACTION() > 0)
         {
          if (VAR_EXIST(idx_att, "entry_regFacc") != 1)         { entry_regFacc = 0 }
          if (VAR_EXIST(idx_att, "entry_regFaccAct1") != 1)     { entry_regFaccAct1 = 0 }

          // Devo rientrare altrimenti se cambiano le condizioni specificate in tabella
          // non va a riprendersi i valori corretti
          px_Par1 = 0
          px_Par2 = 0
          px_Par3 = 0
          px_Par4 = 0
          px_Par5 = -1
          px_Par6 = -1
          px_Par7 = -1
          px_Par8 = -1
          py_Par1 = 0
          py_Par2 = 0
          py_Par3 = 0
          py_Par4 = 0
          py_Par5 = -1
          py_Par6 = -1
          py_Par7 = -1
          py_Par8 = -1

          tLav = "Par"
          KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
          GOSUB MdF_read_RegFacc
         // 17.05.2024 Ottimizzazioni
          if (VAR_VAL_STR(idx_att, "KeyFamRegFacc_prec") != KeyFamRegFacc)
             { KeyFamRegFacc_prec = KeyFamRegFacc }
         }
   }

   PROCEDURA Reg_Paracolpi_att
   {
      KeyFamRegFacc_att = KeyFamRegFacc
      MdF_Aper_att = MdF_Apertura
      X_att = X
      Y_att = Y
      px_Par1_att = px_Par1
      px_Par2_att = px_Par2
      px_Par3_att = px_Par3
      px_Par4_att = px_Par4
      px_Par5_att = px_Par5
      px_Par6_att = px_Par6
      px_Par7_att = px_Par7
      px_Par8_att = px_Par8
      py_Par1_att = py_Par1
      py_Par2_att = py_Par2
      py_Par3_att = py_Par3
      py_Par4_att = py_Par4
      py_Par5_att = py_Par5
      py_Par6_att = py_Par6
      py_Par7_att = py_Par7
      py_Par8_att = py_Par8
   }

   PROCEDURA Reg_pos_ParacolpiInt
   {
      if (ACTION() == 1064)  { EXITSUB() }
      //if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0  &  ACTION() != 3)  { EXITSUB() }
      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)
         {
          if ( VAR_VAL(idx_att, "px_ParInt1") > 0
             | VAR_VAL(idx_att, "py_ParInt1") > 0
             )
             { EXITSUB() }
         }

      if (ACTION() == 1 & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1)  { EXITSUB() }

      if (ACTION() > 0)
         {
          if (VAR_EXIST(idx_att, "entry_regFacc") != 1)         { entry_regFacc = 0 }
          if (VAR_EXIST(idx_att, "entry_regFaccAct1") != 1)     { entry_regFaccAct1 = 0 }

          // Devo rientrare altrimenti se cambiano le condizioni specificate in tabella
          // non va a riprendersi i valori corretti
          px_ParInt1 = 0
          px_ParInt2 = 0
          px_ParInt3 = 0
          px_ParInt4 = 0
          px_ParInt5 = -1
          px_ParInt6 = -1
          px_ParInt7 = -1
          px_ParInt8 = -1
          py_ParInt1 = 0
          py_ParInt2 = 0
          py_ParInt3 = 0
          py_ParInt4 = 0
          py_ParInt5 = -1
          py_ParInt6 = -1
          py_ParInt7 = -1
          py_ParInt8 = -1

          tLav = "ParInt"
          KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
          GOSUB MdF_read_RegFacc
         }
   }

   PROCEDURA Reg_ParacolpiInt_att
   {
      KeyFamRegFacc_att = KeyFamRegFacc
      MdF_Aper_att = MdF_Apertura
      X_att = X
      Y_att = Y
      px_ParInt1_att = px_ParInt1
      px_ParInt2_att = px_ParInt2
      px_ParInt3_att = px_ParInt3
      px_ParInt4_att = px_ParInt4
      px_ParInt5_att = px_ParInt5
      px_ParInt6_att = px_ParInt6
      px_ParInt7_att = px_ParInt7
      px_ParInt8_att = px_ParInt8
      py_ParInt1_att = py_ParInt1
      py_ParInt2_att = py_ParInt2
      py_ParInt3_att = py_ParInt3
      py_ParInt4_att = py_ParInt4
      py_ParInt5_att = py_ParInt5
      py_ParInt6_att = py_ParInt6
      py_ParInt7_att = py_ParInt7
      py_ParInt8_att = py_ParInt8
   }

   PROCEDURA Reg_pos_Ferramente
   {
      if (ACTION() > 0)
         {
          // Devo rientrare altrimenti se cambiano le condizioni specificate in tabella
          // non va a riprendersi i valori corretti
          px_FerFro1 = -999
          py_FerFro1 = -999
          pz_FerFro1 = -999
          px_FerFro2 = -999
          py_FerFro2 = -999
          pz_FerFro2 = -999

          px_FerFro3 = -999
          py_FerFro3 = -999
          pz_FerFro3 = -999
          px_FerFro4 = -999
          py_FerFro4 = -999
          pz_FerFro4 = -999

          tLav = "FerFro"
          KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
          KeyFamRegFacc_FerFro = KeyFamRegFacc
          CHIAVE_TABVAR_MDF = tLav
          //GOSUB MdF_VariabiliDaTipoPadri
          GOSUB MdF_Variabili
          GOSUB MdF_read_RegFacc

          px_FerFia1 = -999
          py_FerFia1 = -999
          pz_FerFia1 = -999
          px_FerFia2 = -999
          py_FerFia2 = -999
          pz_FerFia2 = -999

          px_FerFia3 = -999
          py_FerFia3 = -999
          pz_FerFia3 = -999
          px_FerFia4 = -999
          py_FerFia4 = -999
          pz_FerFia4 = -999

          tLav = "FerFia"
          if (STRLEN(VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav)) ) > 0)
             {
              KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
              KeyFamRegFacc_FerFia = KeyFamRegFacc
              CHIAVE_TABVAR_MDF = tLav
              GOSUB MdF_Variabili
              GOSUB MdF_read_RegFacc
             }

          px_FerPia1 = -999
          py_FerPia1 = -999
          pz_FerPia1 = -999
          Z_FerPia1 = 0
          px_FerPia2 = -999
          py_FerPia2 = -999
          pz_FerPia2 = -999
          Z_FerPia2 = 0

          px_FerPia3 = -999
          py_FerPia3 = -999
          pz_FerPia3 = -999
          Z_FerPia3 = 0
          px_FerPia4 = -999
          py_FerPia4 = -999
          pz_FerPia4 = -999
          Z_FerPia4 = 0

          tLav = "FerPia"
          if (STRLEN(VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav)) ) > 0)
             {
              KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
              KeyFamRegFacc_FerPia = KeyFamRegFacc
              CHIAVE_TABVAR_MDF = tLav
              GOSUB MdF_Variabili
              GOSUB MdF_read_RegFacc
             }
         }
   }

   PROCEDURA Reg_Ferramente_att
   {
      KeyFamRegFacc_att = KeyFamRegFacc
      KeyFamRegFacc_FerFro_att = KeyFamRegFacc_FerFro
      KeyFamRegFacc_FerFia_att = KeyFamRegFacc_FerFia
      KeyFamRegFacc_FerPia_att = KeyFamRegFacc_FerPia
      MdF_Aper_att = MdF_Apertura
      X_att = X
      Y_att = Y
      px_FerFro1_att = px_FerFro1
      py_FerFro1_att = py_FerFro1
      pz_FerFro1_att = pz_FerFro1
      px_FerFro2_att = px_FerFro2
      py_FerFro2_att = py_FerFro2
      pz_FerFro2_att = pz_FerFro2
      px_FerFia1_att = px_FerFia1
      py_FerFia1_att = py_FerFia1
      pz_FerFia1_att = pz_FerFia1
      px_FerFia2_att = px_FerFia2
      py_FerFia2_att = py_FerFia2
      pz_FerFia2_att = pz_FerFia2
      px_FerPia1_att = px_FerPia1
      py_FerPia1_att = py_FerPia1
      pz_FerPia1_att = pz_FerPia1
      px_FerPia2_att = px_FerPia2
      py_FerPia2_att = py_FerPia2
      pz_FerPia2_att = pz_FerPia2

      px_FerFro3_att = px_FerFro3
      py_FerFro3_att = py_FerFro3
      pz_FerFro3_att = pz_FerFro3
      px_FerFro4_att = px_FerFro4
      py_FerFro4_att = py_FerFro4
      pz_FerFro4_att = pz_FerFro4
      px_FerFia3_att = px_FerFia3
      py_FerFia3_att = py_FerFia3
      pz_FerFia3_att = pz_FerFia3
      px_FerFia4_att = px_FerFia4
      py_FerFia4_att = py_FerFia4
      pz_FerFia4_att = pz_FerFia4
      px_FerPia3_att = px_FerPia3
      py_FerPia3_att = py_FerPia3
      pz_FerPia3_att = pz_FerPia3
      px_FerPia4_att = px_FerPia4
      py_FerPia4_att = py_FerPia4
      pz_FerPia4_att = pz_FerPia4
   }

   PROCEDURA Reg_pos_FerramenteGen
   {
      if (ACTION() > 0)
         {
          // Devo rientrare altrimenti se cambiano le condizioni specificate in tabella
          // non va a riprendersi i valori corretti
          px_FerGen1 = -999
          py_FerGen1 = -999
          pz_FerGen1 = -999
          px_FerGen2 = -999
          py_FerGen2 = -999
          pz_FerGen2 = -999
          px_FerGen3 = -999
          py_FerGen3 = -999
          pz_FerGen3 = -999
          px_FerGen4 = -999
          py_FerGen4 = -999
          pz_FerGen4 = -999
          px_FerGen5 = -999
          py_FerGen5 = -999
          pz_FerGen5 = -999
          px_FerGen6 = -999
          py_FerGen6 = -999
          pz_FerGen6 = -999
          px_FerGen7 = -999
          py_FerGen7 = -999
          pz_FerGen7 = -999
          px_FerGen8 = -999
          py_FerGen8 = -999
          pz_FerGen8 = -999

          tLav = "FerGen"
          KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
          //CHIAVE_TABVAR_MDF = tLav
          //GOSUB MdF_VariabiliDaTipoPadri
          //GOSUB MdF_Variabili
          GOSUB MdF_read_RegFacc
         }
   }

   PROCEDURA Reg_FerGen_att
   {
      KeyFamRegFacc_att = KeyFamRegFacc
      MdF_Aper_att = MdF_Apertura
      X_att = X
      Y_att = Y
      px_FerGen1_att = px_FerGen1
      px_FerGen2_att = px_FerGen2
      px_FerGen3_att = px_FerGen3
      px_FerGen4_att = px_FerGen4
      px_FerGen5_att = px_FerGen5
      px_FerGen6_att = px_FerGen6
      px_FerGen7_att = px_FerGen7
      px_FerGen8_att = px_FerGen8
      py_FerGen1_att = py_FerGen1
      py_FerGen2_att = py_FerGen2
      py_FerGen3_att = py_FerGen3
      py_FerGen4_att = py_FerGen4
      py_FerGen5_att = py_FerGen5
      py_FerGen6_att = py_FerGen6
      py_FerGen7_att = py_FerGen7
      py_FerGen8_att = py_FerGen8
      pz_FerGen1_att = pz_FerGen1
      pz_FerGen2_att = pz_FerGen2
      pz_FerGen3_att = pz_FerGen3
      pz_FerGen4_att = pz_FerGen4
      pz_FerGen5_att = pz_FerGen5
      pz_FerGen6_att = pz_FerGen6
      pz_FerGen7_att = pz_FerGen7
      pz_FerGen8_att = pz_FerGen8
   }

   PROCEDURA Reg_pos_FerGenCri
   {
      if (ACTION() > 0)
         {
         // 17.05.2024 Ottimizzazioni
          if (mdf_ctrl_Change_Var_CAM <= 0)  { EXITSUB() }

          // Devo rientrare altrimenti se cambiano le condizioni specificate in tabella
          // non va a riprendersi i valori corretti
          px_FerCri1 = -999
          py_FerCri1 = -999
          pz_FerCri1 = -999
          px_FerCri2 = -999
          py_FerCri2 = -999
          pz_FerCri2 = -999

          tLav = "FerCri"
          KeyFamRegFacc = VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", tLav))
         // 17.05.2024 Ottimizzazioni
          if (VAR_VAL_STR(idx_att, "KeyFamRegFacc_prec") != KeyFamRegFacc)
             { KeyFamRegFacc_prec = KeyFamRegFacc }

          //CHIAVE_TABVAR_MDF = tLav
          //GOSUB MdF_VariabiliDaTipoPadri
          //GOSUB MdF_Variabili
          GOSUB MdF_read_RegFacc
         }
   }

   PROCEDURA Reg_FerCri_att
   {
      KeyFamRegFacc_att = KeyFamRegFacc
      MdF_Aper_att = MdF_Apertura
      X_att = X
      Y_att = Y
      px_FerCri1_att = px_FerCri1
      px_FerCri2_att = px_FerCri2
      py_FerCri1_att = py_FerCri1
      py_FerCri2_att = py_FerCri2
      pz_FerCri1_att = pz_FerCri1
      pz_FerCri2_att = pz_FerCri2
   }

   PROCEDURA MdF_pos_CerBat
   {
      if (ACTION() > 0)
         {
          tLav = "CerBat"
          GOSUB MdF_KeyFamRegFacc
          KeyFamRegFacc = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))
          VAR_CREATE_STR(idx_Fro, "KeyFamRegFacc", KeyFamRegFacc, 0, "")
          // 08.02.2024
          if (VAR_VAL(idx_Fro, "MdF_VanoY2") > 50)
             {
              VAR_CREATE_STR(idx_Fro, "KeyFamRegFaccVY1", KeyFamRegFacc, 0, "")
              KeyFamRegFacc_VY1_tLav = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_VY1_", tLav))
              if (STRLEN(KeyFamRegFacc_VY1_tLav) > 1)
                 {
                  VAR_CREATE_STR(idx_Fro, "KeyFamRegFaccVY1", KeyFamRegFacc_VY1_tLav, 0, "")
                 }
              else
                 {
                  // 20.03.2024 Se su KeyFamRegFacc non ci sono le sottochiavi VY a questo punto creo comunque io la KeyFamRegFacc_VYn_<tLav>
                  VAR_CREATE_STR(idx_Fro, STRCAT("KeyFamRegFacc_VY1_", tLav), KeyFamRegFacc, 0, "")
                 }

              mdf_Find_KeyFamVY2 = 1
              // 19.03.2024 manca la GOSUB
              GOSUB MdF_KeyFamRegFacc
              KeyFamRegFacc_tempV2 = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))
              VAR_CREATE_STR(idx_Fro, "KeyFamRegFaccVY2", KeyFamRegFacc_tempV2, 0, "")

              // 19.03.2024
              KeyFamRegFacc_VY2_tLav = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_VY2_", tLav))
              if (STRLEN(KeyFamRegFacc_VY2_tLav) > 1)
                 {
                  VAR_CREATE_STR(idx_Fro, "KeyFamRegFaccVY2", KeyFamRegFacc_VY2_tLav, 0, "")
                 }
              else
                 {
                  // 20.03.2024 Se su KeyFamRegFacc non ci sono le sottochiavi VY a questo punto creo comunque io la KeyFamRegFacc_VYn_<tLav>
                  VAR_CREATE_STR(idx_Fro, STRCAT("KeyFamRegFacc_VY2_", tLav), KeyFamRegFacc_tempV2, 0, "")
                 }

              mdf_Find_KeyFamVY2 = 0
              if (VAR_VAL(idx_Fro, "MdF_VanoY3") > 50)
                 {
                  mdf_Find_KeyFamVY3 = 1
                  GOSUB MdF_KeyFamRegFacc
                  KeyFamRegFacc_tempV3 = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))
                  VAR_CREATE_STR(idx_Fro, "KeyFamRegFaccVY3", KeyFamRegFacc_tempV3, 0, "")
                  mdf_Find_KeyFamVY3 = 0

                  // 19.03.2024
                  KeyFamRegFacc_VY3_tLav = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_VY3_", tLav))
                  if (STRLEN(KeyFamRegFacc_VY3_tLav) > 1)
                     {
                      VAR_CREATE_STR(idx_Fro, "KeyFamRegFaccVY3", KeyFamRegFacc_VY3_tLav, 0, "")
                     }
                  else
                     {
                      // 20.03.2024 Se su KeyFamRegFacc non ci sono le sottochiavi VY a questo punto creo comunque io la KeyFamRegFacc_VYn_<tLav>
                      VAR_CREATE_STR(idx_Fro, STRCAT("KeyFamRegFacc_VY3_", tLav), KeyFamRegFacc_tempV3, 0, "")
                     }
                 }
             }

          // Se arrivo qua e ho una KeyFamRegFacc si presume che ci sia la relativa in
          // RegFacc quindi non entro a leggermi la RegFacc solo per verificare se
          // se c'è almeno una riga con questa chiave
          // Tanto se aggiungo l'MdF_ e non ho la chiave su RegFacc l'MdF_ resta con i
          // figli esclusi e sono comunque entrato una volta sola su RegFacc
          // Quindi in condizioni a regime dove ho la KeyFamRegFacc e la relativa in
          // RegFacc al RELATIVE_ADD invece di entrare 2 volte, entro una volta
          //GOSUB MdF_read_RegFacc
         }
   }

   PROCEDURA MdF_pos_CerAngLib
   {
      // 21.03.2019 aggiunta exit
      if (ACTION() <= 0)  { EXITSUB() }
      tLav = "CerAngLib"
      GOSUB MdF_KeyFamRegFacc
      KeyFamRegFacc = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))
      VAR_CREATE_STR(idx_Fro, "KeyFamRegFacc", KeyFamRegFacc, 0, "")
   }

   PROCEDURA MdF_pos_CerSof
   {
      if (ACTION() > 0)
         {
          tLav = "CerSof"
          GOSUB MdF_KeyFamRegFacc
          KeyFamRegFacc = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))
          VAR_CREATE_STR(idx_Fro, "KeyFamRegFacc", KeyFamRegFacc, 0, "")
         }
   }

   PROCEDURA MdF_pos_CerRib
   {
      if (ACTION() > 0)
         {
          tLav = "CerRib"
          GOSUB MdF_KeyFamRegFacc
          KeyFamRegFacc = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))
          VAR_CREATE_STR(idx_Fro, "KeyFamRegFacc", KeyFamRegFacc, 0, "")

          tLav = "PisAnta"
          GOSUB MdF_KeyFamRegFacc
          KeyFamRegFacc = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))
          VAR_CREATE_STR(idx_Fro, "KeyFamRegFacc", KeyFamRegFacc, 0, "")

          tLav = "PisFia"
          GOSUB MdF_KeyFamRegFacc
          KeyFamRegFacc = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))
          VAR_CREATE_STR(idx_Fro, "KeyFamRegFacc", KeyFamRegFacc, 0, "")
        }
   }

   PROCEDURA MdF_pos_Paracolpi
   {
      if (ACTION() > 0)
         {
          tLav = "Par"
          GOSUB MdF_KeyFamRegFacc
          KeyFamRegFacc = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))
          VAR_CREATE_STR(idx_Fro, "KeyFamRegFacc", KeyFamRegFacc, 0, "")
         }
   }

   PROCEDURA MdF_pos_ParacolpiInt
   {
      if (ACTION() > 0)
         {
          tLav = "ParInt"
          GOSUB MdF_KeyFamRegFacc
          KeyFamRegFacc = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))
          VAR_CREATE_STR(idx_Fro, "KeyFamRegFacc", KeyFamRegFacc, 0, "")
         }
   }

   PROCEDURA MdF_pos_Ferramente
   {
      if (ACTION() > 0)
         {
          px_FerFro1 = -999
          py_FerFro1 = -999
          px_FerFro2 = -999
          py_FerFro2 = -999
          px_FerFro3 = -999
          py_FerFro3 = -999
          px_FerFro4 = -999
          py_FerFro4 = -999

          tLav = "FerFro"
          //GOSUB MdF_KeyFamRegFacc
          KeyFamRegFacc = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))
          VAR_CREATE_STR(idx_Fro, "KeyFamRegFacc", KeyFamRegFacc, 0, "")
          GOSUB MdF_read_RegFacc

          py_FerFia1 = -999
          pz_FerFia1 = -999
          py_FerFia2 = -999
          pz_FerFia2 = -999
          py_FerFia3 = -999
          pz_FerFia3 = -999
          py_FerFia4 = -999
          pz_FerFia4 = -999

          tLav = "FerFia"
          //GOSUB MdF_KeyFamRegFacc
          KeyFamRegFacc = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))
          VAR_CREATE_STR(idx_Fro, "KeyFamRegFacc", KeyFamRegFacc, 0, "")
          GOSUB MdF_read_RegFacc

          px_FerPia1 = -999
          pz_FerPia1 = -999
          Z_FerPia1 = 0
          px_FerPia2 = -999
          pz_FerPia2 = -999
          Z_FerPia2 = 0
          px_FerPia3 = -999
          pz_FerPia3 = -999
          Z_FerPia3 = 0
          px_FerPia4 = -999
          pz_FerPia4 = -999
          Z_FerPia4 = 0

          tLav = "FerPia"

          KeyFamRegFacc = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))
          VAR_CREATE_STR(idx_Fro, "KeyFamRegFacc", KeyFamRegFacc, 0, "")
          GOSUB MdF_read_RegFacc
         }
   }

   PROCEDURA MdF_Var_Ferramente
   {
      tLav = "FerFro"
      CHIAVE_TABVAR_MDF = tLav
      GOSUB MdF_Variabili

      tLav = "FerFia"
      CHIAVE_TABVAR_MDF = tLav
      GOSUB MdF_Variabili

      tLav = "FerPia"
      CHIAVE_TABVAR_MDF = tLav
      GOSUB MdF_Variabili
   }

   PROCEDURA MdF_pos_FerramenteGen
   {
      if (ACTION() > 0)
         {
          tLav = "FerGen"
          GOSUB MdF_KeyFamRegFacc
          KeyFamRegFacc = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))
          VAR_CREATE_STR(idx_Fro, "KeyFamRegFacc", KeyFamRegFacc, 0, "")
         }
   }

   PROCEDURA MdF_pos_FerGenCri
   {
      if (ACTION() > 0)
         {
          tLav = "FerCri"
          GOSUB MdF_KeyFamRegFacc
          KeyFamRegFacc = VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))
          VAR_CREATE_STR(idx_Fro, "KeyFamRegFacc", KeyFamRegFacc, 0, "")
         }
   }

   // 05.06.2023
   PROCEDURA MdF_Par_Collision
   {
      if (VAR_EXIST(idx_att, STRCAT("MPa_collY_archPar", STR(1))) != 1)  { EXITSUB() }

      MDFSys_Load_ini = $MDFSys_Load_ini
      if ( IS_MATCH(MDFSys_Load_ini, "OnMacro*") == 1
         | STRLEN(MDFSys_Load_ini) < 1
         )
         {
          if (STRLEN(VAR_VAL_STR(idx_att, "MdF_Cambiato")) < 1)
             {
              if ( STRCMP(VAR_VAL_STR(-1, "MdF_Load_att"), "OnLoadedOrder") == 0
                 | IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnLoadPers*") == 1
                 )
                 {
                  if (ACTION() == 2)  { EXITSUB() }
                 }
             }
         }

      //COMANDO2(STRCAT("LOGMSG MdF_Par_Collision per ACTION=", STR(ACTION()), " CMD=", STR(CMD()), " ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))

      id_collision = 1
      while ( VAR_EXIST(idx_att, STRCAT("py_Par", STR(id_collision))) == 1
         )
         {
          if (VAR_VAL(idx_att, STRCAT("py_Par", STR(id_collision))) > 0)
             {
              GOSUB MdF_Par_Collision_Find
             }
          id_collision = id_collision+1
         }

      //COMANDO2(STRCAT("LOGMSG MdF_Par_Collision FINE per ACTION=", STR(ACTION()), " CMD=", STR(CMD()), " ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
   }

   PROCEDURA MdF_Par_Collision_Find
   {
      mdf_collY_trovataCol = 0

      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_CollisionX", STR(id_collision)), 0, 0, "")
      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_CollisionY", STR(id_collision)), 0, 0, "")
      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_CollisionEscludi", STR(id_collision)), 0, 0, "")

      BOX_MODE(0)
      mdf_arch_n = 1
      while (VAR_EXIST(idx_att, STRCAT("MPa_collY_archPar", STR(mdf_arch_n))) == 1)
         {
          mdF_collY_archetipo = VAR_VAL_STR(idx_att, STRCAT("MPa_collY_archPar", STR(mdf_arch_n)))
          mdf_collY_dist_ctrl = 0
          if (VAR_EXIST(idx_att, STRCAT("MPa_collY_dist_ctrl_arch", STR(mdf_arch_n))) )  { mdf_collY_dist_ctrl = VAR_VAL(idx_att, STRCAT("MPa_collY_dist_ctrl_arch", STR(mdf_arch_n))) }
          dist_Coll = 10
          NEAR_GLOBALE("mdf_collY", idx_att, dist_Coll, 1, mdF_collY_archetipo)
          GOSUB MdF_while_CollisionPar
          mdf_arch_n = mdf_arch_n+1
         }

      MdF_Par_Collision_Find = 1
      MdF_Par_Collision_Act = ACTION()
   }

   PROCEDURA MdF_while_CollisionPar
   {
      // py_Par è già il centro Par
      basy_ParCn = base_0.y + VAR_VAL(idx_att, STRCAT("py_Par", STR(id_collision)))
      iCol=1

      while(iCol <= mdf_collY)
         {
          mdf_collY_trovataCol = 0
          idx_troCol = mdf_collY[iCol]
          basy_trov = VAR_VAL(idx_troCol, "base_0.y")
          y_trov = VAR_VAL(idx_troCol, "Y")

          SET_#(mdf_collY[iCol])

          X_ele_collY = VAR_VAL(mdf_collY[iCol], "X")
          Z_ele_collY = VAR_VAL(mdf_collY[iCol], "Z")
          Ba0_att = [base_0.x, 0, base_0.z]
          Ba3_att = [base_3.x, 0, base_3.z]

          Ba1_ele = [#base_1.x, 0, #base_1.z]
          Ba2_ele = [#base_2.x, 0, #base_2.z]

          dist_02_ele = DISTANZA(Ba0_att, Ba2_ele)
          dist_31_ele = DISTANZA(Ba3_att, Ba1_ele)

          mdf_ele_intern = 1
          mdf_ele_collY_Only_Msg = 0
          if (X < X_ele_collY)
             {
              mdf_ele_intern = 1.1

              mdf_ang_ele = ANG_TOT2(PADRE(idx_troCol, 1))
              mdf_ang_ele_idx = ANG_TOT2(idx_troCol)
              mdf_ang_mdf_att = ANG_TOT2(PADRE(idx_att, 1))
              mdf_angz_ele = VAR_VAL(idx_troCol, "ang_z")

              Ba0_ele = [#base_0.x, 0, #base_0.z]
              dist_30_ele = DISTANZA(Ba3_att, Ba0_ele)
              mdf_dist_ele_ang = 0

              mdf_per_X_ang = 0

              if (dist_02_ele > X_ele_collY + X/2 + X/5 -mdf_per_X_ang  |  dist_31_ele > X_ele_collY + X/2 + X/5 -mdf_per_X_ang)
                 { mdf_ele_intern = 0 }

              // Colonna Terminale con ripiani girata di 90 gradi
              if (mdf_ele_intern > 0)
                 {
                  dist_02_ele_ang = dist_02_ele
                  dist_31_ele_ang = dist_31_ele

                  dist_01_ele = DISTANZA(Ba0_att, Ba1_ele)
                  dist_32_ele = DISTANZA(Ba3_att, Ba2_ele)

                  Ba0_ele = [#base_0.x, 0, #base_0.z]
                  Ba3_ele = [#base_3.x, 0, #base_3.z]
                  dist_00_ele_ang = DISTANZA(Ba0_att, Ba0_ele)
                  dist_33_ele_ang = DISTANZA(Ba3_att, Ba3_ele)

                  mdf_ctrl_00 = 0
                  if (dist_02_ele > X + X/7  &  dist_31_ele > X/2 + X/7)    { mdf_ctrl_00 = 1 }
                  if (dist_02_ele > X/2 + X/7  &  dist_31_ele > X + X/7)    { mdf_ctrl_00 = 2 }
                  if (dist_02_ele > X + X/14  &  dist_31_ele > X/2 + X/14)  { mdf_ctrl_00 = 3 }
                  if (dist_02_ele > X/2 + X/14  &  dist_31_ele > X + X/14)  { mdf_ctrl_00 = 4 }

                  mdf_ele_inter_X_min = mdf_ele_intern
                 }
             }
          else
             {
              mdf_ele_intern = 1.2
              if (dist_02_ele > X + X_ele_collY/2 + X_ele_collY/5  |  dist_31_ele > X + X_ele_collY/2 + X_ele_collY/5)
                 { mdf_ele_intern = -1 }

              // Colonna Terminale con ripiani girata di 90 gradi
              if (mdf_ele_intern > 0)
                 {
                  dist_02_ele_ang = dist_02_ele
                  dist_31_ele_ang = dist_31_ele
                  mdf_ang_ele = ANG_TOT2(PADRE(idx_troCol, 1))
                  mdf_ang_mdf_att = ANG_TOT2(PADRE(idx_att, 1))
                  mdf_ctrl_ang = 0
                  if (ABS(mdf_ang_ele-mdf_ang_mdf_att) > 45 & ABS(mdf_ang_ele-mdf_ang_mdf_att) < 135)
                     { mdf_ctrl_ang = 1 }
                  if (ABS(mdf_ang_ele-mdf_ang_mdf_att) > 225 & ABS(mdf_ang_ele-mdf_ang_mdf_att) < 315)
                     { mdf_ctrl_ang = 2 }

                  dist_01_ele = DISTANZA(Ba0_att, Ba1_ele)
                  dist_32_ele = DISTANZA(Ba3_att, Ba2_ele)
                  Ba0_ele = [#base_0.x, 0, #base_0.z]
                  dist_30_ele = DISTANZA(Ba3_att, Ba0_ele)

                  mdf_ctrl_00 = 0
                  if (dist_02_ele > X + X/7  &  dist_31_ele > X/2 + X/7)  { mdf_ctrl_00 = 1 }
                  if (dist_02_ele > X/2 + X/7  &  dist_31_ele > X + X/7)  { mdf_ctrl_00 = 2 }
                 }
             }

          if (mdf_ele_intern > 0)
             {
              mdf_Y_Ele_CollY = VAR_VAL(idx_troCol, "Y")
              if (mdf_Y_Ele_CollY >= Y-Y/20)  { mdf_ele_intern = -99 }
             }

          dist_CentriLav = basy_trov+y_trov/2 - basy_ParCn
          if (mdf_ele_intern > 0)
             {
              if (dist_CentriLav >= 0)
                 {
                  if (dist_CentriLav < ABS(mdf_collY_dist_ctrl))
                     {
                      mdf_collY_trovataCol = 1
                     }
                 }
              if (dist_CentriLav < 0)
                 {
                  if (ABS(dist_CentriLav) < ABS(mdf_collY_dist_ctrl))
                     {
                      mdf_collY_trovataCol = 2
                     }
                 }
              if ( mdf_collY_trovataCol > 0
                 & IS_IDX(mdf_collY[iCol])
                 )
                 {
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_Case"), mdf_collY_trovataCol, 0, "")
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_y_mm"), dist_CentriLav, 0, "")
                  VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_Collision", STR(id_collision), "_idx"), idx_troCol, 0, "")

                  mdF_collY_Azione_arch = VAR_VAL_STR(idx_att, STRCAT("MPa_collY_Azione_arch", STR(mdf_arch_n)))
                  mdF_collY_SpostaX_arch = VAR_VAL(idx_att, STRCAT("MPa_collY_SpostaX_arch", STR(mdf_arch_n)))
                  mdF_collY_SpostaY_arch = VAR_VAL(idx_att, STRCAT("MPa_collY_SpostaY_arch", STR(mdf_arch_n)))
                  if (IS_MATCH(mdF_collY_Azione_arch, "SpostaX") )
                     {
                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_CollisionX", STR(id_collision)), 1, 0, "")
                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_CollisionSpostaX", STR(id_collision)), mdF_collY_SpostaX_arch, 0, "")
                     }
                  if (IS_MATCH(mdF_collY_Azione_arch, "SpostaY") )
                     {
                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_CollisionY", STR(id_collision)), 1, 0, "")
                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_CollisionSpostaY", STR(id_collision)), mdF_collY_SpostaY_arch, 0, "")
                     }
                  if (IS_MATCH(mdF_collY_Azione_arch, "Escludi") )
                     {
                      VAR_CREATE_NUM(idx_att, STRCAT("MdfSys_CollisionEscludi", STR(id_collision)), 1, 0, "")
                     }
                 }
             }

          if (mdf_collY_trovataCol != 0)  { mdf_collY_att = mdf_collY_trovataCol }

          iCol = iCol+1
         }
   }

   PROCEDURA MdF_read_RegFacc
   {
      if (ACTION() <= 0)  { EXITSUB() }

      idx_Fro = -1
      if (VAR_EXIST(-1, "mdf_idx_Fro") == 1)
         { idx_Fro = $mdf_idx_Fro }

      if ( VAR_EXIST(-1, "mdf_idx_Fro") != 1
         & VAR_EXIST(ATTUALE(), "idx_att") == 1
         )
         { idx_Fro = idx_att }

      if (VAR_EXIST(ATTUALE(), "mdf_KeyFamCtCh_idx") == 1)
         { idx_Fro = mdf_KeyFamCtCh_idx }

      idx_RegF = idx_Fro
     // 22.06.2017
      // M4.10 segnala errore se funzione NOME di -1
      if (ATTUALE() != -1)
         {
          if (IS_MATCH(NOME(ATTUALE()), "MdF_*") )
             { idx_RegF = idx_att }
         }

      if (IS_IDX(idx_RegF) != 1)  { EXITSUB() }

      tpc = ""
      if (VAR_EXIST(idx_RegF, "KeyFamRegFacc") != 1)  { KeyFamRegFacc = "" }
      if (STRCMP(VAR_VAL_STR(idx_RegF, "KeyFamRegFacc"), "") != 0)
         { tpc = VAR_VAL_STR(idx_RegF, "KeyFamRegFacc") }

      Key = STRCAT(tpc, "_", tLav)
      if ($MdF_TABLE_RegFacc < 0)
         {
          GOSUB MdF_path_CAMTAB
          $MdF_TABLE_RegFacc = TABLE_OPEN(STRCAT($path_CAMTABMDF, "RegFacc.txt"))
          if (VAR_VAL(-1, "CAM_Visualize") > 0  |  VAR_VAL(-1, "CAM_CloseOpenTab") > 1)
             {
              if ($MdF_TABLE_RegFacc > 0)
                 {
                  TABLE_CLOSE($MdF_TABLE_RegFacc)
                  $MdF_TABLE_RegFacc = TABLE_OPEN(STRCAT($path_CAMTABMDF, "RegFacc.txt"))
                 }
             }

          if ($MdF_TABLE_RegFacc < 0)
             { DISPLAY2(STRCAT("Tabella ", $path_CAMTABMDF, " RegFacc.txt NON Aperta!")) EXITSUB() }
         }

      idx_MdF_Var = idx_RegF
      $idx_tab_Var = idx_MdF_Var

  // 11.04.2024
  //DISPLAY2(STRCAT("RegFacc.txt ", Key, " idx=", STR(idx_MdF_Var)))

      nriga = 1
      if (VAR_EXIST(idx_RegF, "indice_riga") )
         { nriga = VAR_VAL(idx_RegF, "indice_riga") }

      kriga = STRCAT(Key,"_",RIGHT( STRCAT("0", STR(nriga)), 2) )
      sriga = 1
      sotriga = STRCAT(Key,"_",RIGHT( STRCAT("0", STR(nriga)), 2), "_", STR(sriga) )

      nReg = 0
      OK = ATOI(TABLE_FIELD_AT($MdF_TABLE_RegFacc, kriga, "OK"))
      $MdF_CntEntry_TABLE_RegFacc = $MdF_CntEntry_TABLE_RegFacc+1

      OK_s = 1
      while (OK == 0  &  OK_s == 1)
         {
          GOSUB MdF_read_sottorigaRegFacc
         }
      OK_s = 1
      while (OK)
         {
          if ( VAR_VAL(-1, "mdf_idx_Fro") == idx_RegF
             | VAR_VAL(idx_RegF, "ctrl_solo_chiave") == 1
             )
             { GOSUB MdF_riga_RegFacc }
          else
             { GOSUB riga_RegFacc }

          nriga = nriga + 1
          kriga = STRCAT(Key, "_", RIGHT( STRCAT("0", STR(nriga)), 2) )
          OK = ATOI(TABLE_FIELD_AT($MdF_TABLE_RegFacc, kriga, "OK"))
          if (VAR_VAL(idx_RegF, "quante_RegFacc") > 0)
             {
              if (nriga >= indice_riga+quante_RegFacc)
                 {
                  OK = 0
                  OK_s = 0
                 }
             }
          // Es: KeyFam_tLav_01
          //     KeyFam_tLav_02_1
          //     KeyFam_tLav_02_2
          //     KeyFam_tLav_03
          //     KeyFam_tLav_04_1
          //     KeyFam_tLav_04_2
          //     KeyFam_tLav_04_3
          while (OK == 0  &  OK_s == 1)
             {
              GOSUB MdF_read_sottorigaRegFacc
             }
          OK_s = 1
         }

      DEL_VAR(-1, "idx_tab_Var")
   }

   PROCEDURA MdF_riga_RegFacc
   {
      nReg = nriga
      if (VAR_EXIST(-1, "mdf_indice_riga") )
         { nReg = nriga-VAR_VAL(-1, "mdf_indice_riga")+1 }

      var_name = "Escludi"
      var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc, kriga, var_name)
      VAR_CREATE_STR(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)), var_val, 0, "")

      //var_name = "modalita"
      //var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc, kriga, var_name)
      //VAR_CREATE_STR(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)), var_val, 0, "")
   }

   PROCEDURA riga_RegFacc
   {
      // Rendo dinamiche anche queste variabili
      var_name = "Xanta_min"
      var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc, kriga, var_name)
      // 11.04.2024 Per non creare variabili che servono a poco anche come debug
      //GOSUB MdF_VAL_VAR_RegFacc
      //Xanta_min = VAR_VAL(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)))
      GOSUB MdF_VAL_VAR_RegFaccTemp
      Xanta_min = mdf_VAL_VAR_RegFaccTemp

      var_name = "Xanta_max"
      var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc, kriga, var_name)
      // 11.04.2024
      //GOSUB MdF_VAL_VAR_RegFacc
      //Xanta_max = VAR_VAL(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)))
      GOSUB MdF_VAL_VAR_RegFaccTemp
      Xanta_max = mdf_VAL_VAR_RegFaccTemp

      var_name = "Yanta_min"
      var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc, kriga, var_name)
      // 11.04.2024
      //GOSUB MdF_VAL_VAR_RegFacc
      //Yanta_min = VAR_VAL(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)))
      GOSUB MdF_VAL_VAR_RegFaccTemp
      Yanta_min = mdf_VAL_VAR_RegFaccTemp

      var_name = "Yanta_max"
      var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc, kriga, var_name)
      //GOSUB MdF_VAL_VAR_RegFacc
      //Yanta_max = VAR_VAL(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)))
      GOSUB MdF_VAL_VAR_RegFaccTemp
      Yanta_max = mdf_VAL_VAR_RegFaccTemp

      // nReg lo metto fuori e uguale a nriga perchè in pratica io ho a disposizione solo
      // un tot di variabili quindi non ha senso aggiungere delle righe con progressivo
      // superiore al numero delle variabili, perchè creerebbe delle variabili non utilizzate
      // In realtà prima senza sottoriga e Escludi entrava solo nei casi corretti
      // quindi comunque al massimo entrava 6 volte soltanto che c'era discrepanza tra
      // il numero di riga e il progressivo variabili e in piu era meno visibile la riga
      // da esaminare in caso di debug anche se adesso con id_cer / id_Reg riesco a saperlo
      // ma in ogni caso così è piu leggibile
      // Es: py_CerBat10 non mi serve perchè per CerBat ho fino a py_CerBat8 per un
      // massino di 8 cerniere per il battente
      //     KeyFam_tLav_01
      //     KeyFam_tLav_02_1
      //     KeyFam_tLav_02_2
      //     KeyFam_tLav_03
      //     KeyFam_tLav_04_1
      //     KeyFam_tLav_04_2
      //     KeyFam_tLav_04_3
      //     KeyFam_tLav_05
      //     KeyFam_tLav_06
      //     KeyFam_tLav_07
      //     KeyFam_tLav_08
      //     KeyFam_tLav_09  non ha senso perchè per CerBat ho fino a py_CerBat8

      //nReg = nReg + 1
      nReg = nriga
      if (VAR_EXIST(idx_RegF, "indice_riga") )
         { nReg = nriga-VAR_VAL(idx_RegF, "indice_riga")+1 }

      SET_#(idx_Fro)

      var_name = "Escludi"
      var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc, kriga, var_name)
      // EVAL con Motore.dll del 09.01.2012
      GOSUB MdF_VAL_VAR_STR_RegFacc
      // per debug creo le var Escludi_tLav_nReg di riga e invece di scriverci "si" metto
      // la condizione che ha portato il valore "si"
      name_var_Escludi = STRCAT(var_name, "_", tLav, STR(nReg))

      //name_var_Escludi = var_name
      table_CVer = $MdF_TABLE_RegFacc
      GOSUB MdF_CtrlVersioni

      X_Fro = VAR_VAL(idx_RegF, "X")
      Y_Fro = VAR_VAL(idx_RegF, "Y")

      dim_ok = 0
     // 19.10.2023
      if (VAR_EXIST(-1, "MdfSys_TolleranzaDimReg") != 1)
         {
          if (X_Fro >= Xanta_min  &  X_Fro <= Xanta_max  &  Y_Fro >= Yanta_min  &  Y_Fro <= Yanta_max)
             { dim_ok = 1 }
         }
      else
         {
          X_Fro = ROUND2(X_Fro, ABS($MdfSys_TolleranzaDimReg))
          Y_Fro = ROUND2(Y_Fro, ABS($MdfSys_TolleranzaDimReg))

          if ($MdfSys_TolleranzaDimReg >= 0)
             {
              if (X_Fro >= Xanta_min  &  X_Fro < Xanta_max  &  Y_Fro >= Yanta_min  &  Y_Fro < Yanta_max)
                 { dim_ok = 1 }
             }
          else
             {
              if (X_Fro >= Xanta_min  &  X_Fro <= Xanta_max  &  Y_Fro >= Yanta_min  &  Y_Fro <= Yanta_max)
                 { dim_ok = 1 }
             }
         }

      //if ( X_Fro >= Xanta_min  &  X_Fro <= Xanta_max  &  Y_Fro >= Yanta_min  &  Y_Fro <= Yanta_max
      if ( dim_ok == 1
         & STRCMP(VAR_VAL_STR(idx_RegF, name_var_Escludi), "no") == 0
         )
         {
          var_name = "px"
          var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc,kriga,var_name)
          GOSUB MdF_VAL_VAR_RegFacc

          var_name = "py"
          var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc,kriga,var_name)
          GOSUB MdF_VAL_VAR_RegFacc

          var_name = "pz"
          var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc,kriga,var_name)
          GOSUB MdF_VAL_VAR_RegFacc

          var_name = "X"
          var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc,kriga,var_name)
          GOSUB MdF_VAL_VAR_RegFacc

          var_name = "Y"
          var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc,kriga,var_name)
          GOSUB MdF_VAL_VAR_RegFacc

          var_name = "Z"
          var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc,kriga,var_name)
          GOSUB MdF_VAL_VAR_RegFacc

          var_name = "Battuta_X"
          var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc,kriga,var_name)
          if (STRLEN(var_val) > 0  &  STRCMP(var_val, "-") != 0)
             {
              // Problema forzatura Battuta diversa tra Sx e Dx per moduli inclinati
              //VAR_CREATE_NUM(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)), ATOI(var_val), 0, "")
              // Così var_val Battuta_X puo essere dinamico
              GOSUB MdF_VAL_VAR_RegFacc
             }

          var_name = "Battuta_Y"
          var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc,kriga,var_name)
          if (STRLEN(var_val) > 0  &  STRCMP(var_val, "-") != 0)
             {
             // 07.11.2017
              // Per Ribalta con SbordoInf
              if (STRLEN(var_val) >= 3)
                 {
                  GOSUB MdF_VAL_VAR_RegFacc
                 }
              else
                 { VAR_CREATE_NUM(idx_RegF, STRCAT(var_name, "_", tLav, "1"), ATOI(var_val), 0, "") }
             }

          var_name = "Battuta_Z"
          var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc,kriga,var_name)
          if (STRLEN(var_val) > 0  &  STRCMP(var_val, "-") != 0)
             { VAR_CREATE_NUM(idx_RegF, STRCAT(var_name, "_", tLav, "1"), ATOI(var_val), 0, "") }

          var_name = "Visualizza"
          var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc,kriga,var_name)
          if (STRLEN(var_val) > 0  &  STRCMP(var_val, "-") != 0)
             {
             // Compatibilità 2013 campo Visualizza RegFacc 0 o 1
              if (STRLEN(var_val) == 1)
                 {
                  retEval = EVAL(STRCAT(var_name,"_",tLav,STR(nReg),"=",var_val))
                  if (retEval == -1)  { VAR_CREATE_STR(ATTUALE(), STRCAT(var_name, "_", tLav, STR(nReg), "_Err"), "Error", 0, "") }
                 }
              else
                 {
                  GOSUB MdF_VAL_VAR_STR_RegFacc
                 }
             }

          var_name = "img_sat_F1"
          var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc, kriga,var_name)
          if (STRLEN(var_val) > 0  &  STRCMP(var_val, "-") != 0)
             {
              GOSUB MdF_VAL_VAR_STR_RegFacc
             }

          var_name = "img_sat_E2"
          var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc, kriga,var_name)
          if (STRLEN(var_val) > 0  &  STRCMP(var_val, "-") != 0)
             {
              GOSUB MdF_VAL_VAR_STR_RegFacc
             }
         // 23.10.2023
          if (STRCMP(VAR_VAL_STR(idx_RegF, "MdF_Visualize_sat"), "No") != 0)
             {
              var_name = "offxyz_sat_F1"
              var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc, kriga,var_name)
              if (STRLEN(var_val) > 0  &  STRCMP(var_val, "-") != 0)
                 { GOSUB MdF_VAL_VAR_STR_RegFacc }
              else
                 {
                 // 18.01.2024
                  if (VAR_EXIST(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg))) )
                     { DEL_VAR(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg))) }
                 }

              var_name = "offxyz_sat_E2"
              var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc, kriga,var_name)
              if (STRLEN(var_val) > 0  &  STRCMP(var_val, "-") != 0)
                 { GOSUB MdF_VAL_VAR_STR_RegFacc }
              else
                 {
                 // 18.01.2024
                  if (VAR_EXIST(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg))) )
                     { DEL_VAR(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg))) }
                 }
             }

          var_name = "CHIAVE_TAB_CAM"
          var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc,kriga,var_name)
          if (STRLEN(var_val) > 0  &  STRCMP(var_val, "-") != 0)
             {
              GOSUB MdF_VAL_VAR_STR_RegFacc
             }

          var_name = "id_Reg"
          var_val = TABLE_FIELD_AT($MdF_TABLE_RegFacc,kriga,var_name)
          if (STRLEN(var_val) > 0  &  STRCMP(var_val, "-") != 0)
             {
              VAR_CREATE_NUM(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)), ATOI(var_val), 0, "")
              // nel caso di 5.10 numerico diventa 5.1
              if (STRLEN(var_val) > 3  &  STRCMP(RIGHT(var_val, 1), "0") == 0)
                 {
                  VAR_CREATE_STR(idx_RegF, STRCAT(var_name, "_STR", "_", tLav, STR(nReg)), var_val, 0, "")
                 }
             // 14.12.2020
              if (STRLEN(var_val) > 3  &  STRCMP(RIGHT(var_val, 1), "0") != 0)
                 {
                  DEL_VAR(idx_RegF, STRCAT(var_name, "_STR", "_", tLav, STR(nReg)))
                 }
             }
         }
   }

   PROCEDURA MdF_read_sottorigaRegFacc
   {
      sotriga = STRCAT(Key, "_", RIGHT( STRCAT("0", STR(nriga)), 2), "_", STR(sriga) )
      OK_s = ATOI(TABLE_FIELD_AT($MdF_TABLE_RegFacc, sotriga, "OK"))
      kriga = sotriga
      while (OK_s)
         {
          //nReg = nriga-1
          nReg = nriga
          if ( VAR_VAL(-1, "mdf_idx_Fro") == idx_RegF
             | VAR_VAL(idx_RegF, "ctrl_solo_chiave") == 1
             )
             { GOSUB MdF_riga_RegFacc }
          else
             { GOSUB riga_RegFacc }

          sriga = sriga+1
          sotriga = STRCAT(Key, "_", RIGHT( STRCAT("0", STR(nriga)), 2), "_", STR(sriga) )
          kriga = sotriga
          OK_s = ATOI(TABLE_FIELD_AT($MdF_TABLE_RegFacc, sotriga, "OK"))
         }
      sriga = 1
      nriga = nriga + 1
      kriga = STRCAT(Key, "_", RIGHT( STRCAT("0", STR(nriga)), 2) )
      OK = ATOI(TABLE_FIELD_AT($MdF_TABLE_RegFacc, kriga, "OK"))
      sotriga = STRCAT(Key, "_", RIGHT( STRCAT("0", STR(nriga)), 2), "_", STR(sriga) )
      OK_s = ATOI(TABLE_FIELD_AT($MdF_TABLE_RegFacc, sotriga, "OK"))
   }

   PROCEDURA MdF_KeyFamRegFacc
   {
      if (ACTION() <= 0)  { EXITSUB() }

      idx_Fro = -1
      if (VAR_EXIST(-1, "mdf_idx_Fro") == 1)
         { idx_Fro = $mdf_idx_Fro }

      if ( VAR_EXIST(-1, "mdf_idx_Fro") != 1
         & VAR_EXIST(ATTUALE(), "idx_att") == 1
         )
         { idx_Fro = idx_att }

      if (VAR_EXIST(ATTUALE(), "mdf_KeyFamCtCh_idx") == 1)
         { idx_Fro = mdf_KeyFamCtCh_idx }

      idx_RegF = idx_Fro
      if (IS_IDX(idx_RegF) != 1)  { EXITSUB() }

     // 22.03.2019
      mdf_ADD_Reg_Interat_ExitKeyFam = -1

      if ( ACTION() == 1 & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1
         & VAR_VAL(idx_RegF, "MdFSys_Ctrl_Var") <= 0
         & VAR_VAL(idx_RegF, "mdf_prosegui_action1") <= 0
         & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMdF_AttrezzaRegFac*") != 1
         )
         {
          // 27.03.2019 spostato dentro
          mdf_ADD_Reg_Interat_ExitKeyFam = 1
          if ( VAR_EXIST(idx_RegF, STRCAT("KeyFamRegFacc_", tLav)) != 1
             & STRLEN(VAR_VAL_STR(idx_RegF, "MdF_Apertura")) > 0
             & IS_MATCH(VAR_VAL_STR(idx_RegF, "mdf_ADD_Reg_Interat_da"), "entry_ADD")
             & VAR_VAL(idx_RegF, "MdF_NoOnLoadedOrder") == 0
             // 06.06.2019 se MdF_Load_Interat ha solo CerRib e no PisAnta, PisFia non imposta
             // py_PisAnta1,2..
             //& STR_INDEX_OF(VAR_VAL_STR(idx_RegF, "MdF_bdm_Load"), 0, tLav) > -1
             )
             {
              // 25.03.2019
              if (CAM_loadOrder == 0)
                 {
                  //COMANDO2(STRCAT("LOGMSG MdF_KeyFamRegFacc tLav=", tLav, " ", VAR_VAL_STR(-1, "File"), " idx=", STR(idx_RegF), " passa di qua raramente se Bdm fatto bene con pochi RICALCOLI"))
                  mdf_ADD_Reg_Interat_ExitKeyFam = 0
                 }
             }
         // 27.12.2022 Se bifacciale MdF_Apertura e' vuota e voglio graficare i KEKU da FerGen
          if ( VAR_EXIST(idx_RegF, STRCAT("KeyFamRegFacc_", tLav)) != 1
             & VAR_EXIST(idx_RegF, "MdF_Apertura") == 1
             & IS_MATCH(VAR_VAL_STR(idx_RegF, "mdf_ADD_Reg_Interat_da"), "entry_ADD")
             & VAR_VAL(idx_RegF, "MdF_NoOnLoadedOrder") == 0
             )
             {
              if (CAM_loadOrder == 0)
                 {
                  if ( STR_INDEX_OF(VAR_VAL_STR(idx_RegF, "MdF_Load_Interat"), 0, "FerGen") > -1
                     | STR_INDEX_OF(VAR_VAL_STR(idx_RegF, "MdF_Load_Interat"), 0, "FerCri") > -1
                     | STR_INDEX_OF(VAR_VAL_STR(idx_RegF, "MdF_Load_Interat"), 0, "FerFia") > -1
                     )
                     {
                      if (VAR_EXIST(idx_RegF, "Battuta_X_Sx") != 0)
                         {
                          mdf_ADD_Reg_Interat_ExitKeyFam = 0
                         }
                     }

                 // 03.01.2023
                  if (STR_INDEX_OF(VAR_VAL_STR(idx_RegF, "MdF_Load_Interat"), 0, "FerPia") > -1)
                     {
                      if ( STRCMP(VAR_VAL_STR(idx_RegF, "MdF_Visualize_sat"), "No") != 0
                         & STRLEN(VAR_VAL_STR(idx_RegF, "MdF_Visualize_sat")) > 0
                         )
                         { mdf_ADD_Reg_Interat_ExitKeyFam = 0 }
                     }
                 // 09.10.2024 PK solo Par e MdF_Apertura vuota
                  // Sono certi che prima della Versione Metron 11.325 funzionasse. Allora prima c' era un ACTION() 3 che adesso non c'è più
                  if ( STR_INDEX_OF(VAR_VAL_STR(idx_RegF, "MdF_Load_Interat"), 0, "Par") > -1
                     | STR_INDEX_OF(VAR_VAL_STR(idx_RegF, "MdF_Load_Interat"), 0, "ParInt") > -1
                     )
                     {
                      if (VAR_EXIST(idx_RegF, "Battuta_X_Sx") != 0)
                         {
                          if ( STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "Par"))) <= 0
                             & STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "ParInt"))) <= 0
                             )
                             { mdf_ADD_Reg_Interat_ExitKeyFam = 0 }
                         }
                     }
                 }
             }

           // 07.07.2020 SN01822
           if (VAR_VAL(idx_att, "mdf_ctrl_Change_Apertura") == 0)
              {
               if (mdf_ADD_Reg_Interat_ExitKeyFam == 1  &  VAR_VAL(idx_att, "mdf_ADD_Reg_Interat_PostV") == 0)  { EXITSUB() }
              }
         }

      // 01.12.2015
      if ( ACTION() == 1 & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMdF_AttrezzaRegFac*") == 1
         & $MdF_AttrezzaRegFacc > -1
         & STRLEN(VAR_VAL_STR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav))) > 1
         )
         { EXITSUB() }

      //COMANDO2(STRCAT("LOGMSG MdF_KeyFamRegFacc INIT ", VAR_VAL_STR(-1, "File"), " ", DATA(0))) }

      if ($MdF_TABLE_KeyFamRegFacc < 0)
         {
          GOSUB MdF_path_CAMTAB
          $MdF_TABLE_KeyFamRegFacc = TABLE_OPEN(STRCAT($path_CAMTABMDF, "KeyFamRegFacc.txt"))
          if (VAR_VAL(-1, "CAM_Visualize") > 0  |  VAR_VAL(-1, "CAM_CloseOpenTab") > 1)
             {
              if ($MdF_TABLE_KeyFamRegFacc > 0)
                 {
                  TABLE_CLOSE($MdF_TABLE_KeyFamRegFacc)
                  $MdF_TABLE_KeyFamRegFacc = TABLE_OPEN(STRCAT($path_CAMTABMDF, "KeyFamRegFacc.txt"))
                 }
             }
          if ($MdF_TABLE_KeyFamRegFacc < 0)
             { DISPLAY2(STRCAT("Tabella ", $path_CAMTABMDF, " KeyFamRegFacc.txt NON Aperta!")) EXITSUB() }
         }

      // Se non la azzero mai e entra in KeyFamRegFacc al primo giro però poi
      // EscludikFm_diventa=si mi restano gli MdF_ attivi
      if (VAR_EXIST(idx_Fro, STRCAT("KeyFamRegFacc_", tLav)) == 1)
         { DEL_VAR(idx_Fro, STRCAT("KeyFamRegFacc_", tLav)) }

      idx_MdF_Var = idx_RegF
      $idx_tab_Var = idx_MdF_Var

      tpc = NOME(idx_RegF)
      if (VAR_EXIST(idx_RegF, "CHIAVE_TAB_REG") )
         { tpc = VAR_VAL_STR(idx_RegF, "CHIAVE_TAB_REG") }

      Key = tpc
      if (STRLEN(tLav) > 0)
         { Key = STRCAT(tpc,"_",tLav) }

  // 11.04.2024
  //DISPLAY2(STRCAT("KeyFamRegFacc.txt ", Key, " idx=", STR(idx_MdF_Var)))

      nriga = 1
      kriga = STRCAT(Key,"_",RIGHT( STRCAT("0", STR(nriga)), 2) )
      nReg = 0
      OK = ATOI(TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc, kriga, "OK"))
      if (OK)  { $MdF_CntEntry_TABLE_KeyFam = $MdF_CntEntry_TABLE_KeyFam+1 }

      while (OK)
         {
          GOSUB MdF_riga_KeyFamRegFacc

          nriga = nriga + 1
          kriga = STRCAT(Key, "_", RIGHT( STRCAT("0", STR(nriga)), 2) )
          if (nriga > 9)  { kriga = STRCAT(Key, "_", STR(nriga)) }
          OK = ATOI(TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc, kriga, "OK"))
         }

      // 19.03.2024
      if (VAR_VAL(idx_RegF, "MdF_VanoY2") >= 50)
         {
          tpc_att = tpc
          mdf_KFRFVY = "VY1"
          tpc = STRCAT(tpc_att, "_", mdf_KFRFVY)
          GOSUB MdF_KeyFamRegFacc_nKEY
          mdf_KFRFVY = "VY2"
          tpc = STRCAT(tpc_att, "_", mdf_KFRFVY)
          GOSUB MdF_KeyFamRegFacc_nKEY
          mdf_KFRFVY = "VY3"
          tpc = STRCAT(tpc_att, "_", mdf_KFRFVY)
          GOSUB MdF_KeyFamRegFacc_nKEY
         }

      DEL_VAR(-1, "idx_tab_Var")
   }

  // 19.03.2024
   PROCEDURA MdF_KeyFamRegFacc_nKEY
   {
      Key = tpc
      if (STRLEN(tLav) > 0)
         { Key = STRCAT(tpc,"_",tLav) }

      nriga = 1
      kriga = STRCAT(Key,"_",RIGHT( STRCAT("0", STR(nriga)), 2) )
      nReg = 0
      OK = ATOI(TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc, kriga, "OK"))
      if (OK)  { $MdF_CntEntry_TABLE_KeyFam = $MdF_CntEntry_TABLE_KeyFam+1 }

      while (OK)
         {
          GOSUB MdF_riga_KeyFamRegFacc_nKEY

          nriga = nriga + 1
          kriga = STRCAT(Key, "_", RIGHT( STRCAT("0", STR(nriga)), 2) )
          if (nriga > 9)  { kriga = STRCAT(Key, "_", STR(nriga)) }
          OK = ATOI(TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc, kriga, "OK"))
         }
   }

   PROCEDURA MdF_riga_KeyFamRegFacc_nKEY
   {
      // Se sono in ambito di ATTUALE() = -1 e uso queste variabili su KeyFamRegFacc
      // devo crearle appunto in ambito di -1 perndendole dall' idx che sto analizzando
      // Qui dovò inserire tutte le variabili di sistema non create in VariabiliMdF (perché
      // calcolate dopo) che si vorranno usare nei campi di KeyFamRegFacc
      if (ATTUALE() == -1)
         {
          MdfSys_SbordoYSup = VAR_VAL(idx_RegF, "MdfSys_SbordoYSup")
          MdfSys_SbordoYInf = VAR_VAL(idx_RegF, "MdfSys_SbordoYInf")
         }

      nReg = nriga

      var_name = "Xanta_min"
      var_val = TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc, kriga, var_name)
      if ( VAR_VAL(-1, "CAM_CloseOpenTab") >= 1
         | VAR_VAL(-1, "CAM_Visualize") >= 1
         )
         {
          GOSUB MdF_VAL_VAR_RegFacc
          Xanta_min_KFRF = VAR_VAL(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)))
         }
      else
         {
          GOSUB MdF_VAL_VAR_RegFaccTemp
          Xanta_min_KFRF = mdf_VAL_VAR_RegFaccTemp
         }

      var_name = "Xanta_max"
      var_val = TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc, kriga, var_name)
      GOSUB MdF_VAL_VAR_RegFaccTemp
      Xanta_max_KFRF = mdf_VAL_VAR_RegFaccTemp

      var_name = "Yanta_min"
      var_val = TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc, kriga, var_name)
      GOSUB MdF_VAL_VAR_RegFaccTemp
      Yanta_min_KFRF = mdf_VAL_VAR_RegFaccTemp

      var_name = "Yanta_max"
      var_val = TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc, kriga, var_name)
      GOSUB MdF_VAL_VAR_RegFaccTemp
      Yanta_max_KFRF = mdf_VAL_VAR_RegFaccTemp

      var_name = "EscludikFm"
      var_val = TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc, kriga, var_name)
      mdf_glob_escludikfm = "no"
      if (STRLEN(var_val) <= 4)  { mdf_glob_escludikfm = STRMID(1,STRLEN(var_val)-2,var_val) }
      else
         {
          retEval_ctrl_error = EVAL(STRCAT("mdf_glob_escludikfm=",var_val))
          if (retEval_ctrl_error == -1)  { GOSUB MdF_VAL_VAR_STR_RegFacc }
         }

      if (STRLEN(mdf_glob_escludikfm) > 4)  { GOSUB MdF_VAL_VAR_STR_RegFacc }

      name_var_Escludi = STRCAT(var_name, "_", tLav, STR(nReg))
      table_CVer = $MdF_TABLE_KeyFamRegFacc
      GOSUB MdF_CtrlVersioni

      X_Fro = VAR_VAL(idx_RegF, "X")
      Y_Fro = VAR_VAL(idx_RegF, "Y")

      if (mdf_KFRFVY == "VY1")  { Y_Fro = VAR_VAL(idx_RegF, "MdF_VanoY1") }
      if (mdf_KFRFVY == "VY2")  { Y_Fro = VAR_VAL(idx_RegF, "MdF_VanoY2") }
      if (mdf_KFRFVY == "VY3")  { Y_Fro = VAR_VAL(idx_RegF, "MdF_VanoY3") }

      dim_ok = 0

      if (VAR_EXIST(-1, "MdfSys_TolleranzaDimReg") != 1)
         {
          if (X_Fro >= Xanta_min_KFRF  &  X_Fro <= Xanta_max_KFRF  &  Y_Fro >= Yanta_min_KFRF  &  Y_Fro <= Yanta_max_KFRF)
             { dim_ok = 1 }
         }
      else
         {
          X_Fro = ROUND2(X_Fro, ABS($MdfSys_TolleranzaDimReg))
          Y_Fro = ROUND2(Y_Fro, ABS($MdfSys_TolleranzaDimReg))

          if ($MdfSys_TolleranzaDimReg >= 0)
             {
              if (X_Fro >= Xanta_min_KFRF  &  X_Fro < Xanta_max_KFRF  &  Y_Fro >= Yanta_min_KFRF  &  Y_Fro < Yanta_max_KFRF)
                 { dim_ok = 1 }
             }
          else
             {
              if (X_Fro >= Xanta_min_KFRF  &  X_Fro <= Xanta_max_KFRF  &  Y_Fro >= Yanta_min_KFRF  &  Y_Fro <= Yanta_max_KFRF)
                 { dim_ok = 1 }
             }
         }

      if (dim_ok == 1)
         {
          var_name = "KeyFamRegFacc"
          var_val = TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc,kriga,var_name)
          GOSUB MdF_VAL_VAR_STR_RegFacc_nKEY

          var_KeyFam = STRCAT("KeyFamRegFacc_", mdf_KFRFVY, "_", tLav, STR(nriga))
          if (STRCMP(UPPER(mdf_glob_escludikfm), "NO") == 0)
             {
              KeyFamRegFacc_VY = VAR_VAL_STR(idx_RegF, var_KeyFam)
              VAR_CREATE_STR(idx_RegF, STRCAT("KeyFamRegFacc_", mdf_KFRFVY, "_", tLav), KeyFamRegFacc_VY, 0, "")
             }
         }
   }

   PROCEDURA MdF_KeyFam_Battuta_X
   {
      if ( ACTION() == 1 & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1
         & VAR_VAL(idx_att, "mdf_ctrl_OnAfterFirstMdFAdd") == 0
         // 24.07.2020 AntaFittizia in inserimento. Avendo tolto il RICALCOLA_UNA di mdf_log_PCL001953 prima passava di qua per ACTION 3,
         // mentre ora giustamente passa di meno ma quindi per ACTION 1 devo entrare se mdf_OnInterat_Battuta_X_Post!=0
         & VAR_VAL(idx_att, "mdf_OnInterat_Battuta_X_Post") == 0
         )
         {
          if ( VAR_VAL(idx_att, "Battuta_X") > 0
             & VAR_VAL(idx_att, "Battuta_SX") > 0
             & VAR_VAL(idx_att, "Battuta_X_Sx") > 0
             )
             {
              mdf_KeyFam_Battuta_X_Exit = 1
              EXITSUB()
             }

          if ( VAR_VAL(idx_att, "Battuta_X") > 0
             & VAR_VAL(idx_att, "Battuta_DX") > 0
             & VAR_VAL(idx_att, "Battuta_X_Dx") > 0
             )
             {
              mdf_KeyFam_Battuta_X_Exit = 2
              EXITSUB()
             }
         }

      mdF_archetipo_Fia = "Fia*"
      mdF_archetipo_Fia_2 = "Div*"
      if (VAR_EXIST(idx_att, "archetipo_Fia") )    { mdF_archetipo_Fia   = VAR_VAL_STR(idx_att, "archetipo_Fia") }
      if (VAR_EXIST(idx_att, "archetipo_Fia_2") )  { mdF_archetipo_Fia_2 = VAR_VAL_STR(idx_att, "archetipo_Fia_2") }
      // Gestione corretta da VariabiliMdF
      if (VAR_EXIST(idx_att, "MdF_archetipo_Fia") )    { mdF_archetipo_Fia   = VAR_VAL_STR(idx_att, "MdF_archetipo_Fia") }
      if (VAR_EXIST(idx_att, "MdF_archetipo_Fia_2") )  { mdF_archetipo_Fia_2 = VAR_VAL_STR(idx_att, "MdF_archetipo_Fia_2") }
      mdF_archetipo_Fia_3 = ""
      if (VAR_EXIST(idx_att, "MdF_archetipo_Fia_3") )  { mdF_archetipo_Fia_3 = VAR_VAL_STR(idx_att, "MdF_archetipo_Fia_3") }
     // 19.05.2021 FiancoChiusura in accosto a Colonne Slide che hanno la Battuta_X a 71 sul FiancoInterno
      mdF_arch_NO_BatFia   = ""
      mdF_arch_NO_BatFia_2 = ""
      if (VAR_EXIST(idx_att, "MdF_arch_NO_BatFia") )    { mdF_arch_NO_BatFia   = VAR_VAL_STR(idx_att, "MdF_arch_NO_BatFia") }
      if (VAR_EXIST(idx_att, "MdF_arch_NO_BatFia_2") )  { mdF_arch_NO_BatFia_2 = VAR_VAL_STR(idx_att, "MdF_arch_NO_BatFia_2") }

      Battuta_X = 0
      Battuta_X_Sx = Battuta_X
      Battuta_X_Dx = Battuta_X
      exitBattuta_SX = -1
      exitBattuta_DX = -1
      X_FiaBatSX_Cn = 0
      X_FiaBatDX_Cn = 0
      DEL_VAR(idx_att, "Fianchi_vic_*")
      DEL_VAR(idx_att, "mdf_Battuta_X_Sx")
      DEL_VAR(idx_att, "mdf_Battuta_X_Dx")
      DEL_VAR(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
      DEL_VAR(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
      Battuta_SX = 0
      Battuta_DX = 0
      Battuta_Z = 0

      BOX_MODE(0)
      mdf_distNearBatFia = 10
      if (VAR_EXIST(idx_att, "MdF_distNearBatFia") )  { mdf_distNearBatFia = VAR_VAL(idx_att, "MdF_distNearBatFia") }
      NEAR_GLOBALE("Fianchi_vic", idx_att, mdf_distNearBatFia, 1, mdF_archetipo_Fia)
      if (Fianchi_vic == 0)
         {
          mdF_archetipo_Fia = "*Fia*"
          NEAR_GLOBALE("Fianchi_vic", idx_att, mdf_distNearBatFia, 1, mdF_archetipo_Fia)
         }

      // 30.01.2019
      mdf_doppio_fiaSx_inY_Battuta_X = -1
      mdf_doppio_fiaDx_inY_Battuta_X = -1
      // 08.02.2019
      mdf_doppio_fiaSx_inY_basso = -1
      mdf_doppio_fiaSx_inY_alto = -1
      mdf_doppio_fiaDx_inY_basso = -1
      mdf_doppio_fiaDx_inY_alto = -1
      // 12.05.2022
      mdf_ctrl_Fia_2 = 0
      mdf_doppio_fiaSx_Battuta_X = -1
      mdf_doppio_fiaDx_Battuta_X = -1

      GOSUB MdF_while_X

      mdf_ctrl_Fia_Batt = 0
      if (exitBattuta_SX == -1  &  exitBattuta_DX == -1)
         { mdf_ctrl_Fia_Batt = 1 }
     // 10.07.2019 O18622001
      if (exitBattuta_SX == -1  &  IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "SX*") )
         { mdf_ctrl_Fia_Batt = 1.1 }
      if (exitBattuta_DX == -1  &  IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "DX*") )
         { mdf_ctrl_Fia_Batt = 1.2 }

      // 28.11.2018
      mdf_ctrl_Fia_VaRi = 0
      if ( IS_MATCH(MdF_Apertura, "S*") != 1
         & IS_MATCH(MdF_Apertura, "D*") != 1
         )
         {
         // 12.12.2018
          //if (Battuta_X_Sx != 0 | Battuta_X_Sx < 0)
          if (Battuta_X_Sx != 0 & Battuta_X_Sx < 2)
             { mdf_ctrl_Fia_VaRi = 1 }

          if (Battuta_X_Dx != 0 & Battuta_X_Dx < 2)
             { mdf_ctrl_Fia_VaRi = 2 }
         }

     // 25.01.2021 SL2021000312
      // Trova prima un Fia* con Battuta_SX,DX negativa e non va piu in cerca dei *Fia*
      // Probabilmente con l' introduzione mdf_BattutaSX_ok e' saltato il caso
      mdf_ctrl_Fia_Batt_neg = 0
      if (Fianchi_vic >= 1)
         {
          // nel caso di Aperture no SX, DX
          if (Battuta_X == 0)
             {
              if (Battuta_SX == 0  &  Battuta_DX == 0)    { mdf_ctrl_Fia_Batt_neg = 1 }
              if (Battuta_SX < -1.5  &  Battuta_DX <= 0)  { mdf_ctrl_Fia_Batt_neg = 2 }
              if (Battuta_SX <= 0  &  Battuta_DX < -1.5)  { mdf_ctrl_Fia_Batt_neg = 3 }
             }
         }

      if (Fianchi_vic > 0)
         {
          if ( Battuta_X != 0
             | mdf_ctrl_Fia_VaRi > 0
             )
             {
              mdf_ctrl_Battuta_X_att = Battuta_X
              if ( VAR_EXIST(idx_att, "exitBattuta_SX")
                 & IS_IDX(VAR_VAL(idx_att, "exitBattuta_SX") )
                 )
                 {
                  y_Fro = VAR_VAL(idx_att, "Y")
                  mdf_ctrl_Bay_Fia = VAR_VAL(exitBattuta_SX, "base_0.y")
                  mdf_ctrl_Aly_Fia = VAR_VAL(exitBattuta_SX, "alto_0.y")
                  mdf_ctrl_diff_BaFBaMy = mdf_ctrl_Bay_Fia - base_0.y
                  mdf_ctrl_diff_AlMAlFy = alto_0.y - mdf_ctrl_Aly_Fia

                  // 01.06.2020
                  mdf_BattutaSX_ok = 0
                  // 07.08.2020 Problema Graf*Fia* Vetro di 5mm figlio di Fia*, ma in ogni caso questo era sbagliato perche' colonna 2 ante
                  // il fianco di Battuta e' piu grande dell' anta
                  //if ( IS_MATCH(VAR_VAL_STR(idx_att, "MdF_archetipo_Fia"), "Fia*")
                  if ( IS_MATCH(mdF_archetipo_Fia, "Fia*")
                     & IS_MATCH(mdF_archetipo_Fia_2, "*Fia*") != 1
                     )
                     {
                      if (mdf_ctrl_Aly_Fia > alto_0.y  &  mdf_ctrl_Bay_Fia < base_0.y)
                         {
                          mdf_BattutaSX_ok = 1
                         }
                     }
                  // 25.01.2021
                  if (mdf_ctrl_Fia_Batt_neg > 0)  { mdf_BattutaSX_ok = 0 }

                  if (ABS(mdf_ctrl_diff_BaFBaMy)+ABS(mdf_ctrl_diff_AlMAlFy) > y_Fro/2-1)
                     {
                      if (mdf_BattutaSX_ok == 0)
                         {
                          mdf_exitBattuta_SX_att = exitBattuta_SX
                          exitBattuta_SX = -1
                          mdf_ctrl_Fia_Batt = 2
                         }
                     }
                 // 23.01.2023 Se sopra ho gia mdf_ctrl_Fia_Batt!=0 se entro qua rischio di impostre mdf_exitBattuta_SX_att a -1
                  if ( exitBattuta_SX != -1
                     | mdf_ctrl_Fia_Batt == 0
                     )
                     {
                      if ( Battuta_X < 0
                         | mdf_ctrl_Fia_VaRi > 0
                         )
                         {
                          if ( ABS(Battuta_X) > VAR_VAL(idx_att, "X_FiaBatSX")+0.1
                             // 26.09.2022 IMO68840401 come Dx
                             | Battuta_X_Sx < -1
                             )
                             {
                              mdf_exitBattuta_SX_att = exitBattuta_SX
                              exitBattuta_SX = -1
                              mdf_ctrl_Fia_Batt = 3
                             // 10.03.2025 simil Dx anta interna Fianco
                              if (Battuta_X_Sx < -1.1)
                                 {
                                  // 07.05.2025 A01994 Battuta_Z troppo negativa significa che è un fianco in accosto
                                  //if (Battuta_Z < -16)
                                  if (Battuta_Z > -30  &  Battuta_Z < -16)
                                     { exitBattuta_SX = mdf_exitBattuta_SX_att }
                                 }
                             }
                         // Se qui sopra ho impostato exitBattuta_SX -1
                          if (IS_IDX(VAR_VAL(idx_att, "exitBattuta_SX") ) )
                             {
                             // 16.03.2018
                              if (PADRE(exitBattuta_SX, 3) != PADRE(idx_att, 3) )
                                 {
                                  if (mdf_BattutaSX_ok == 0)
                                     {
                                      // 06.12.2019 S030125 elemento Bdm gestito con xxxxxFia con a sx e dx elementi con Fiaxxxxx
                                      // quindi trova 2 Fianchi_vic
                                      mdf_exitBattuta_SX_att = exitBattuta_SX
                                      exitBattuta_SX = -1
                                      mdf_ctrl_Fia_Batt = 4
                                     // 10.03.2025 simil Dx anta interna Fianco
                                      if (Battuta_X_Sx < -1.1)
                                         {
                                          //if (Battuta_Z < -16)
                                          if (Battuta_Z > -30  &  Battuta_Z < -16)
                                             { exitBattuta_SX = mdf_exitBattuta_SX_att }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
              if ( VAR_EXIST(idx_att, "exitBattuta_DX")
                 & IS_IDX(VAR_VAL(idx_att, "exitBattuta_DX") )
                 )
                 {
                  y_Fro = VAR_VAL(idx_att, "Y")
                  mdf_ctrl_Bay_Fia = VAR_VAL(exitBattuta_DX, "base_0.y")
                  mdf_ctrl_Aly_Fia = VAR_VAL(exitBattuta_DX, "alto_0.y")
                  mdf_ctrl_diff_BaFBaMy = mdf_ctrl_Bay_Fia - base_0.y
                  mdf_ctrl_diff_AlMAlFy = alto_0.y - mdf_ctrl_Aly_Fia

                  // 01.06.2020
                  mdf_BattutaDX_ok = 0
                  // 07.08.2020 Problema Graf*Fia* Vetro di 5mm figlio di Fia*, ma in ogni caso questo era sbagliato perche' colonna 2 ante
                  // il fianco di Battuta e' piu grande dell' anta
                  //if ( IS_MATCH(VAR_VAL_STR(idx_att, "MdF_archetipo_Fia"), "Fia*")
                  if ( IS_MATCH(mdF_archetipo_Fia, "Fia*")
                     & IS_MATCH(mdF_archetipo_Fia_2, "*Fia*") != 1
                     )
                     {
                      if (mdf_ctrl_Aly_Fia > alto_0.y  &  mdf_ctrl_Bay_Fia < base_0.y)
                         {
                          mdf_BattutaDX_ok = 1
                         }
                     }
                  if (ABS(mdf_ctrl_diff_BaFBaMy)+ABS(mdf_ctrl_diff_AlMAlFy) > y_Fro/2-1)
                     {
                      if (mdf_BattutaDX_ok == 0)
                         {
                          mdf_exitBattuta_DX_att = exitBattuta_DX
                          exitBattuta_DX = -1
                          mdf_ctrl_Fia_Batt = 2.1
                         }
                     }
                 // 23.01.2023 Se sopra ho gia mdf_ctrl_Fia_Batt!=0 se entro qua rischio di impostre mdf_exitBattuta_DX_att a -1
                  if ( exitBattuta_DX != -1
                     | mdf_ctrl_Fia_Batt == 0
                     )
                     {
                     // 30.06.2017
                      if ( Battuta_X < 0
                         | mdf_ctrl_Fia_VaRi > 0
                         )
                         {
                          if ( ABS(Battuta_X) > VAR_VAL(idx_att, "X_FiaBatDX")+0.1
                             // 26.09.2022 IMO68840401 anta sup DoppioVas trova prima FiaLib e non Cuc_FiaDx
                             | Battuta_X_Dx < -1
                             )
                             {
                              mdf_exitBattuta_DX_att = exitBattuta_DX
                              exitBattuta_DX = -1
                              mdf_ctrl_Fia_Batt = 3.1
                             // 10.03.2025 A023142 anta interna Fianco
                              if (Battuta_X_Dx < -1.1)
                                 {
                                  //if (Battuta_Z < -16)
                                  if (Battuta_Z > -30  &  Battuta_Z < -16)
                                     { exitBattuta_DX = mdf_exitBattuta_DX_att }
                                 }
                             }
                         // Se qui sopra ho impostato exitBattuta_DX -1
                          if (IS_IDX(VAR_VAL(idx_att, "exitBattuta_DX") ) )
                             {
                             // 16.03.2018
                              if (PADRE(exitBattuta_DX, 3) != PADRE(idx_att, 3) )
                                 {
                                  if (mdf_BattutaDX_ok == 0)
                                     {
                                      // 06.12.2019 S030125 elemento Bdm gestito con xxxxxFia con a sx e dx elementi con Fiaxxxxx
                                      mdf_exitBattuta_DX_att = exitBattuta_DX
                                      exitBattuta_DX = -1
                                      mdf_ctrl_Fia_Batt = 4.1
                                     // 10.03.2025 A023142 anta interna Fianco
                                      if (Battuta_X_Dx < -1.1)
                                         {
                                          //if (Battuta_Z < -16)
                                          if (Battuta_Z > -30  &  Battuta_Z < -16)
                                             { exitBattuta_DX = mdf_exitBattuta_DX_att }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }

     // 25.01.2017
      // Con mdF_archetipo_Fia = "Fia*" trovo un FiaLib vicino ma a quel punto non vado piu in cerca dei Cuc_Fia
      // con mdF_archetipo_Fia = "*Fia*" perchè Fianchi_vic è > 0
      if (mdf_ctrl_Fia_Batt > 0)
         {
          if (Fianchi_vic > 0)
             {
              mdF_archetipo_Fia = "*Fia*"
              NEAR_GLOBALE("Fianchi_vic", idx_att, mdf_distNearBatFia, 1, mdF_archetipo_Fia)
              // 22.10.2018
              // Se la scocca ha 2 ante battenti potrebbe trovare solo 2 Fianchi
              //if (Fianchi_vic > 2)
              if (Fianchi_vic >= 2)
                 { GOSUB MdF_while_X }

             // 23.03.2017
              if (exitBattuta_SX == -1  &  VAR_EXIST(idx_att, "mdf_exitBattuta_SX_att") )
                 { exitBattuta_SX = VAR_VAL(idx_att, "mdf_exitBattuta_SX_att") }

              if (exitBattuta_DX == -1  &  VAR_EXIST(idx_att, "mdf_exitBattuta_DX_att") )
                 { exitBattuta_DX = VAR_VAL(idx_att, "mdf_exitBattuta_DX_att") }
             }
         }

      //DISPLAY2(STRCAT("1.MdF_Battuta_X - Fianchi_vic=", STR(Fianchi_vic), " mdF_archetipo_Fia=", mdF_archetipo_Fia))

      mdf_aperture_NoBatt = 0
      mdf_ctrl_Battuta_NoBatt = 0
      if ( IS_MATCH(MdF_Apertura, "S*") != 1
         & IS_MATCH(MdF_Apertura, "D*") != 1
         )
         {
          mdf_aperture_NoBatt = 1
         }
      if (mdf_aperture_NoBatt > 0)
         {
          if (VAR_EXIST(idx_att, "Battuta_X_Sx") )
             {
              if (Battuta_X_Sx == 0)
                 { mdf_ctrl_Battuta_NoBatt = 1 }
             }
          if (VAR_EXIST(idx_att, "Battuta_X_Dx") )
             {
              if (Battuta_X_Dx == 0)
                 { mdf_ctrl_Battuta_NoBatt = 2 }
             }
         }
      if (exitBattuta_SX == -1  |  exitBattuta_DX == -1)
         {
          NEAR_GLOBALE("Fianchi_vic", idx_att, mdf_distNearBatFia, 1, mdF_archetipo_Fia_2)
          if (Fianchi_vic == 0)
             {
              mdF_archetipo_Fia_2 = "*Div*"
              NEAR_GLOBALE("Fianchi_vic", idx_att, mdf_distNearBatFia, 1, mdF_archetipo_Fia_2)
             }
          if (Fianchi_vic > 0)
             {
             // 12.05.2022
              mdf_ctrl_Fia_2 = 1
              GOSUB MdF_while_X
             }
         }

      if (exitBattuta_SX == -1  |  exitBattuta_DX == -1)
         {
          if (STRLEN(mdF_archetipo_Fia_3) > 0)
             {
              NEAR_GLOBALE("Fianchi_vic", idx_att, mdf_distNearBatFia, 1, mdF_archetipo_Fia_3)
              if (Fianchi_vic > 0)
                 { GOSUB MdF_while_X }
             }
         }

      if (mdf_aperture_NoBatt > 0)
         {
          if ( VAR_EXIST(idx_att, "Battuta_X_Sx")
             & VAR_VAL(idx_att, "Battuta_X_Sx") == 0
             )
             { Battuta_X_Sx = Battuta_DX }

          if ( VAR_EXIST(idx_att, "Battuta_X_Dx")
             & VAR_VAL(idx_att, "Battuta_X_Dx") == 0
             )
             { Battuta_X_Dx = Battuta_SX }
         }
      if (VAR_EXIST(idx_att, "MdF_offx_Battuta_Sx") )
         {
          mdf_offx_Battuta_Sx = VAR_VAL(idx_att, "MdF_offx_Battuta_Sx")
          if (Battuta_SX == 0  &  ABS(Battuta_DX) < 19)
             { Battuta_SX = Battuta_DX }
          Battuta_SX = Battuta_SX + mdf_offx_Battuta_Sx
          if (IS_MATCH(MdF_Apertura, "S*") == 1)
             { Battuta_X = Battuta_SX }
         }
      if (VAR_EXIST(idx_att, "MdF_offx_Battuta_Dx") )
         {
          if (Battuta_DX == 0  &  ABS(Battuta_SX) < 19)
             { Battuta_DX = Battuta_SX }
          mdf_offx_Battuta_Dx = VAR_VAL(idx_att, "MdF_offx_Battuta_Dx")
          Battuta_DX = Battuta_DX + mdf_offx_Battuta_Dx
          if (IS_MATCH(MdF_Apertura, "D*") == 1)
             { Battuta_X = Battuta_DX }
         }

     // 10.02.2017 Preso simile, non uguale da MdF_KeyFam_Battuta_X_Gen
      // Protezione frontali posizionati sciolti ma vicini a dove dovrebbero andare
      // ma spostati in z piu di 10mm, o magari vicini ad altre scocche con fianchi
      // oppure solo per grafica cerniere spostata fuori dal pannello anta se graficato sciolto
      if (Battuta_X == 0)
         {
          if ( IS_MATCH(NOME(PADRE(idx_att, -1)), "*Anta*")
             // 10.10.2023 aggiunto solo perchè in molti cominciano a fare archetipi con nome Frontale*
             | IS_MATCH(NOME(PADRE(idx_att, -1)), "*Fron*")
             // 03.06.2020
             | VAR_VAL(PADRE(idx_att, -1), "VAR_vuoto") == 1
             )
             {
              mdf_wk_fia_comp = -0.1
              mdf_antaCerANP = 0
              if ( VAR_VAL(PADRE(idx_att, 1), "MdF_angoloBas") > 84
                 & VAR_VAL(PADRE(idx_att, 1), "MdF_angoloBas") < 96
                 )
                 { mdf_antaCerANP = 1 }

            // 01.12.2023 Bifacciali. Avendo aggiunto che entra con Fron e' uscito l' errore
             // La Battuta_Sx,Dx=0 e' usata in RegFacc per riconoscere che non c'è fianco
             if (IS_MATCH(NOME(PADRE(idx_att, -1)), "*Fron*") )
                {
                  if ( IS_MATCH(NOME(PADRE(idx_att, -1)), "*Bif*")
                     | STRLEN(VAR_VAL_STR(idx_att, "MdF_Apertura")) <= 0
                     | IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "*B*")
                     )
                     {
                      // 04.12.2023 Se bifacciale centrale non ha ne exitBattuta_SX, ne DX
                      mdf_antaCerANP = 2
                     }
                }

             // 03.06.2020 sistemato codice
              if (exitBattuta_SX == -1  |  exitBattuta_DX == -1)
                 {
                  COMPONENTI2("mdf_wk_fia_comp", PADRE(idx_att, -1), "*Fia*")
                 // 10.10.2023 St443018 trova anche gli elementi MdF_Pistone*Fia*
                  if (mdf_aperture_NoBatt > 0)
                     {
                      if (mdf_wk_fia_comp > 0)
                         {
                          COMPONENTI2("mdf_mdf_pis_fia", idx_att, "MdF_*Pis*Fia*")
                          mdf_wk_fia_comp = mdf_wk_fia_comp-mdf_mdf_pis_fia
                         }
                     }
                 }

              if (exitBattuta_SX == -1)
                 {
                  if (mdf_wk_fia_comp == 0)
                     {
                      if (Battuta_SX == 0)
                         {
                          // 27.04.2018
                          if (mdf_antaCerANP == 0)  { Battuta_SX = 17.111 }
                         }
                      if (IS_MATCH(MdF_Apertura, "S*") == 1)
                         { Battuta_X = Battuta_SX }
                     }
                 }

              // 10.10.2023 St443018 trova comunque un fianco a destra, ma appunto con Battuta negativa e se sono un anta su VAR_vuoto o singola
              // meglio prendere la Battuta_X distante da quel Fianco
              if (mdf_aperture_NoBatt > 0)
                 {
                  if (mdf_wk_fia_comp == 0)
                     {
                      if (VAR_VAL(idx_att, "Battuta_X_Sx") < -1)
                         {
                          // Potrei fare solo per VAR_Vuoto perchè non è così scontato che vada sempre bene anche se dev' essere per forza
                          // il primo caso che esce perchè altrimenti qualcuno me lo avrebbe segnalato dato che trova gli MdF_*Pis*Fia* e quindi
                          // non poteva funzionare per aperture non battenti
                          Battuta_X_Sx = 16.777
                         }
                     }
                 }

              if (exitBattuta_DX == -1)
                 {
                  if (mdf_wk_fia_comp == 0)
                     {
                      if (Battuta_DX == 0)
                         {
                          if (mdf_antaCerANP == 0)  { Battuta_DX = 17.111 }
                         }
                      if (IS_MATCH(MdF_Apertura, "D*") == 1)
                         { Battuta_X = Battuta_DX }
                     }
                 }

              // 10.10.2023 St443018 trova comunque un fianco a destra, ma appunto con Battuta negativa e se sono un anta su VAR_vuoto o singola
              // meglio prendere la Battuta_X distante da quel Fianco
              if (mdf_aperture_NoBatt > 0)
                 {
                  if (mdf_wk_fia_comp == 0)
                     {
                      if (VAR_VAL(idx_att, "Battuta_X_Dx") < -1)
                         {
                          // Potrei fare solo per VAR_Vuoto perchè non è così scontato che vada sempre bene anche se dev' essere per forza
                          // il primo caso che esce perchè altrimenti qualcuno me lo avrebbe segnalato dato che trova gli MdF_*Pis*Fia* e quindi
                          // non poteva funzionare per aperture non battenti
                          // In caso da abilitare questa if
                          //if (VAR_VAL(PADRE(idx_att, -1), "VAR_vuoto") == 1)
                          Battuta_X_Dx = 16.777
                         }
                     }
                 }
             }
         }
     // 01.04.2020 nel caso si usasse in modo errato ang_y per vedere le ante aperte
      if ( exitBattuta_SX == -1
        // 20.11.2020 1020092595 altrimenti se ci ripassa non sovrascriverebbe la Battuta_X
         | VAR_VAL(idx_att, "idx_Battuta_SX_BDM") == exitBattuta_SX
         )
         {
          if (VAR_EXIST(idx_att, "idx_Battuta_SX_BDM") )
             {
              if (IS_IDX(idx_Battuta_SX_BDM) )
                 {
                  exitBattuta_SX = VAR_VAL(idx_att, "idx_Battuta_SX_BDM")
                  Battuta_X = VAR_VAL(idx_att, "Battuta_X_BDM")
                 }
             }
         }
      if (exitBattuta_DX == -1
        // 20.11.2020 1020092595
         | VAR_VAL(idx_att, "idx_Battuta_DX_BDM") == exitBattuta_DX
         )
         {
          if (VAR_EXIST(idx_att, "idx_Battuta_DX_BDM") )
             {
              if (IS_IDX(idx_Battuta_DX_BDM) )
                 {
                  exitBattuta_DX = VAR_VAL(idx_att, "idx_Battuta_DX_BDM")
                  Battuta_X = VAR_VAL(idx_att, "Battuta_X_BDM")
                 }
             }
         }
     // 10.10.2023
      mdf_id_ForzaBatt = idx_att
     // 18.02.2025 A199525 AntaRicambioSciolta posizionata da utente circa vicino Pensile, Battuta_X 0.0129297
      mdf_Ctrl_AntaScio = 0
      if ( VAR_VAL(idx_att, "Battuta_X") > -1  &  VAR_VAL(idx_att, "Battuta_X") < 1
         & VAR_VAL(idx_att, "Battuta_X") != 0
         )
         {
          if ( IS_MATCH(NOME(PADRE(idx_att, -1)), "*Anta*")
             | IS_MATCH(NOME(PADRE(idx_att, -1)), "*Fron*")
             )
             {
              mdf_Ctrl_AntaScio = 1
              // Teoricamente non serve
              if ( IS_MATCH(NOME(PADRE(idx_att, -1)), "*Bif*")
                 | STRLEN(VAR_VAL_STR(idx_att, "MdF_Apertura")) <= 0
                 | IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "*B*")
                 )
                 {
                  // Se bifacciale centrale non ha ne exitBattuta_SX, ne DX
                  mdf_Ctrl_AntaScio = -1
                 }
             }
         }

     // 17.01.2025
      if ( VAR_VAL(idx_att, "Battuta_X") == 0
         | mdf_Ctrl_AntaScio > 0
         )
         {
          if ( IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "S*")
             | IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "D*")
             )
             {
              if (VAR_EXIST(mdf_id_ForzaBatt, "MCB_BattutaX_minima") != 1)  { mdf_id_ForzaBatt = PADRE(idx_att, 1) }
              if (VAR_VAL(mdf_id_ForzaBatt, "MCB_BattutaX_minima") > 4)
                 {
                  if (VAR_VAL(idx_att, "MdF_angoloBas") == 0)
                     {
                      COMPONENTI2("mdf_fia_pres", PADRE(idx_att, -1), "*Fia*")
                      COMPONENTI3("mdf_fia_escl", PADRE(idx_att, -1), "*Fia*")
                      if (mdf_fia_pres == 0  &  mdf_fia_escl > 0)
                         {
                          Battuta_X = VAR_VAL(mdf_id_ForzaBatt, "MCB_BattutaX_minima")
                         }
                     // 18.02.2025 A199525
                      if (mdf_fia_pres == 0  &  mdf_Ctrl_AntaScio > 0)
                         {
                          Battuta_X = VAR_VAL(mdf_id_ForzaBatt, "MCB_BattutaX_minima")
                         }
                     }
                 }
             }
         }
     // 11.02.2025 Sc1057073 Devo reimpostarlo altrimenti se non esiste MCB_BattutaX_minima lo imposta a PADRE di 1 qui sopra
      mdf_id_ForzaBatt = idx_att
      if (VAR_EXIST(mdf_id_ForzaBatt, "MPF_ForzaBattutaX_Sx") != 1)  { mdf_id_ForzaBatt = PADRE(idx_att, 1) }
      if (VAR_VAL(mdf_id_ForzaBatt, "MPF_ForzaBattutaX_Sx") != 0)
         {
          Battuta_X_Sx = VAR_VAL(mdf_id_ForzaBatt, "MPF_ForzaBattutaX_Sx")
         }

      mdf_id_ForzaBatt = idx_att
      if (VAR_EXIST(mdf_id_ForzaBatt, "MPF_ForzaBattutaX_Dx") != 1)  { mdf_id_ForzaBatt = PADRE(idx_att, 1) }
      if (VAR_VAL(mdf_id_ForzaBatt, "MPF_ForzaBattutaX_Dx") != 0)
         {
          Battuta_X_Dx = VAR_VAL(mdf_id_ForzaBatt, "MPF_ForzaBattutaX_Dx")
         }

     // 18.04.2024 BaseSat
      mdf_id_ForzaBatt = idx_att
      if (VAR_EXIST(mdf_id_ForzaBatt, "MCB_ForzaBattutaX") != 1)  { mdf_id_ForzaBatt = PADRE(idx_att, 1) }
      if (VAR_VAL(mdf_id_ForzaBatt, "MCB_ForzaBattutaX") != 0)
         {
          Battuta_X = VAR_VAL(mdf_id_ForzaBatt, "MCB_ForzaBattutaX")
         }

     // 10.05.2024
      GOSUB MdF_fia_doppioBattutaX
   }

   PROCEDURA MdF_KeyFam_Battuta_X_Gen
   {
      mdF_archetipo_Fia = "Fia*"
      mdF_archetipo_Fia_2 = "Div*"
      // Gestione corretta da VariabiliMdF
      if (VAR_EXIST(mdf_idx_KFBX, "MdF_archetipo_Fia") )    { mdF_archetipo_Fia   = VAR_VAL_STR(mdf_idx_KFBX, "MdF_archetipo_Fia") }
      if (VAR_EXIST(mdf_idx_KFBX, "MdF_archetipo_Fia_2") )  { mdF_archetipo_Fia_2 = VAR_VAL_STR(mdf_idx_KFBX, "MdF_archetipo_Fia_2") }
      mdF_archetipo_Fia_3 = ""
      if (VAR_EXIST(mdf_idx_KFBX, "MdF_archetipo_Fia_3") )  { mdF_archetipo_Fia_3 = VAR_VAL_STR(mdf_idx_KFBX, "MdF_archetipo_Fia_3") }
     // 19.05.2021 FiancoChiusura in accosto a Colonne Slide che hanno la Battuta_X a 71 sul FiancoInterno
      mdF_arch_NO_BatFia   = ""
      mdF_arch_NO_BatFia_2 = ""
      if (VAR_EXIST(mdf_idx_KFBX, "MdF_arch_NO_BatFia") )    { mdF_arch_NO_BatFia   = VAR_VAL_STR(mdf_idx_KFBX, "MdF_arch_NO_BatFia") }
      if (VAR_EXIST(mdf_idx_KFBX, "MdF_arch_NO_BatFia_2") )  { mdF_arch_NO_BatFia_2 = VAR_VAL_STR(mdf_idx_KFBX, "MdF_arch_NO_BatFia_2") }

      Battuta_X = 0
      Battuta_X_Sx = Battuta_X
      Battuta_X_Dx = Battuta_X
      exitBattuta_SX = -1
      exitBattuta_DX = -1
      mdf_Battuta_X_SX_Pro_Cn = 0
      mdf_Battuta_X_DX_Pro_Cn = 0
      mdf_idx_FiaBatSX_CnSX = -1
      mdf_idx_FiaBatDX_CnSX = -1
      mdf_idx_FiaBatSX_CnDX = -1
      mdf_idx_FiaBatDX_CnDX = -1
      X_FiaBatSX_Cn = 0
      X_FiaBatDX_Cn = 0
      //DEL_VAR(idx_att, "Fianchi_vic_*")
      DEL_VAR(mdf_idx_KFBX, "mdf_Battuta_X_Sx")
      DEL_VAR(mdf_idx_KFBX, "mdf_Battuta_X_Dx")
      Battuta_SX = 0
      Battuta_DX = 0
     // 16.10.2017
      // Se c'è la gestione MdF_CamMdFrontali_Load_pers e quindi con la Macro-CAM ripasso
      // per MdF_KeyFam_Battuta_X_Gen le Battute Cn erano errate
      DEL_VAR(mdf_idx_KFBX, "MdfSys_Battuta_SX_Cn")
      DEL_VAR(mdf_idx_KFBX, "MdfSys_Battuta_DX_Cn")

      // Potrebbe arrivare troppo presto ed essere a 0.
      // Caso rarissimo, teoricamente dovuto per Bdm e GEST non ottimali
      if (VAR_VAL(mdf_idx_KFBX, "X") < 30)
         {
          SET_#(mdf_idx_KFBX)
          #X_Fro_KeyFam_Batt = VAR_VAL(mdf_idx_KFBX, "X")
         }

      BOX_MODE(0)
      mdf_distNearBatFia = 10
      if (VAR_EXIST(mdf_idx_KFBX, "MdF_distNearBatFia") )  { mdf_distNearBatFia = VAR_VAL(mdf_idx_KFBX, "MdF_distNearBatFia") }
      NEAR_GLOBALE("Fianchi_vic", mdf_idx_KFBX, mdf_distNearBatFia, 1, mdF_archetipo_Fia)

      if (Fianchi_vic == 0)
         {
          mdF_archetipo_Fia = "*Fia*"
          NEAR_GLOBALE("Fianchi_vic", mdf_idx_KFBX, mdf_distNearBatFia, 1, mdF_archetipo_Fia)
         }

      // 30.01.2019
      mdf_doppio_fiaSx_inY_Battuta_X = -1
      mdf_doppio_fiaDx_inY_Battuta_X = -1
      // 08.02.2019
      mdf_doppio_fiaSx_inY_basso = -1
      mdf_doppio_fiaSx_inY_alto = -1
      mdf_doppio_fiaDx_inY_basso = -1
      mdf_doppio_fiaDx_inY_alto = -1
      // 12.05.2022
      mdf_ctrl_Fia_2 = 0
      mdf_doppio_fiaSx_Battuta_X = -1
      mdf_doppio_fiaDx_Battuta_X = -1

      Battuta_Z = 0
      GOSUB MdF_while_X_Gen
      GOSUB MdF_Battuta_Z_Gen

      mdf_ctrl_Fia_Batt = 0
      if (exitBattuta_SX == -1  &  exitBattuta_DX == -1)
         { mdf_ctrl_Fia_Batt = 1 }

     // 10.07.2019 O18622001
      if (exitBattuta_SX == -1  &  IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura"), "SX*") )
         { mdf_ctrl_Fia_Batt = 1.1 }
      if (exitBattuta_DX == -1  &  IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura"), "DX*") )
         { mdf_ctrl_Fia_Batt = 1.2 }

      // 28.11.2018
      mdf_ctrl_Fia_VaRi = 0
      if ( IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura"), "S*") != 1
         & IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura"), "D*") != 1
         )
         {
         // 12.12.2018
          //if (Battuta_X_Sx != 0 | Battuta_X_Sx < 0)
          if (Battuta_X_Sx != 0 & Battuta_X_Sx < 2)
             { mdf_ctrl_Fia_VaRi = 1 }

          if (Battuta_X_Dx != 0 & Battuta_X_Dx < 2)
             { mdf_ctrl_Fia_VaRi = 2 }
         }

     // 25.01.2021 SL2021000312
      // Trova prima un Fia* con Battuta_SX,DX negativa e non va piu in cerca dei *Fia*
      // Probabilmente con l' introduzione mdf_BattutaSX_ok e' saltato il caso
      mdf_ctrl_Fia_Batt_neg = 0
      if (Fianchi_vic >= 1)
         {
          // nel caso di Aperture no SX, DX
          if (Battuta_X == 0)
             {
              if (Battuta_SX == 0  &  Battuta_DX == 0)    { mdf_ctrl_Fia_Batt_neg = 1 }
              if (Battuta_SX < -1.5  &  Battuta_DX <= 0)  { mdf_ctrl_Fia_Batt_neg = 2 }
              if (Battuta_SX <= 0  &  Battuta_DX < -1.5)  { mdf_ctrl_Fia_Batt_neg = 3 }
             }
         }

      if (Fianchi_vic > 0)
         {
          if ( Battuta_X != 0
             // 28.11.2018
             | mdf_ctrl_Fia_VaRi > 0
             )
             {
              mdf_ctrl_Battuta_X_att = Battuta_X
              if (IS_IDX(mdf_fiaBatSx_Gen) )
                 {
                  y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")
                  mdf_ctrl_Bay_Fia = VAR_VAL(mdf_fiaBatSx_Gen, "base_0.y")
                  mdf_ctrl_Aly_Fia = VAR_VAL(mdf_fiaBatSx_Gen, "alto_0.y")
                  mdf_ctrl_diff_BaFBaMy = mdf_ctrl_Bay_Fia - Bay_KFBX
                  mdf_ctrl_diff_AlMAlFy = Aly_KFBX - mdf_ctrl_Aly_Fia

                  // 01.06.2020
                  mdf_BattutaSX_ok = 0
                  // 07.08.2020 Problema Graf*Fia* Vetro di 5mm figlio di Fia*, ma in ogni caso questo era sbagliato perche' colonna 2 ante
                  // il fianco di Battuta e' piu grande dell' anta
                  //if ( IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_archetipo_Fia"), "Fia*")
                  if ( IS_MATCH(mdF_archetipo_Fia, "Fia*")
                     & IS_MATCH(mdF_archetipo_Fia_2, "*Fia*") != 1
                     )
                     {
                      if (mdf_ctrl_Aly_Fia > Aly_KFBX  &  mdf_ctrl_Bay_Fia < Bay_KFBX)
                         {
                          mdf_BattutaSX_ok = 1
                         }
                     }
                  // 25.01.2021
                  if (mdf_ctrl_Fia_Batt_neg > 0)  { mdf_BattutaSX_ok = 0 }

                  if (ABS(mdf_ctrl_diff_BaFBaMy)+ABS(mdf_ctrl_diff_AlMAlFy) > y_Fro/2-1)
                     {
                      if (mdf_BattutaSX_ok == 0)
                         {
                          mdf_exitBattuta_SX_att = exitBattuta_SX
                          exitBattuta_SX = -1
                          mdf_ctrl_Fia_Batt = 2
                         }
                     }
                 // 23.01.2023 Se sopra ho gia mdf_ctrl_Fia_Batt!=0 se entro qua rischio di impostre mdf_exitBattuta_SX_att a -1
                  if ( exitBattuta_SX != -1
                     | mdf_ctrl_Fia_Batt == 0
                     )
                     {
                     // 30.06.2017
                     // Caso di Elementi Angolo Anta Diagonale con nomi archetipi Fianco e Cmp_FiaAng
                      // trova prima il Fianco con Battuta -18.4 e poi non cerca piu Cmp_FiaAng
                      if ( Battuta_X < 0
                         | mdf_ctrl_Fia_VaRi > 0
                         )
                         {
                          if ( ABS(Battuta_X) > VAR_VAL(mdf_fiaBatSx_Gen, "X")+0.1
                             // 26.09.2022 IMO68840401 Come Dx
                             | Battuta_X_Sx < -1
                             )
                             {
                              mdf_exitBattuta_SX_att = exitBattuta_SX
                              exitBattuta_SX = -1
                              mdf_ctrl_Fia_Batt = 3
                             // 10.03.2025 simil Dx anta interna Fianco
                              if (Battuta_X_Sx < -1.1)
                                 {
                                  // 07.05.2025 A01994 Battuta_Z troppo negativa significa che è un fianco in accosto
                                  //if (Battuta_Z < -16)
                                  if (Battuta_Z > -30  &  Battuta_Z < -16)
                                     { exitBattuta_SX = mdf_exitBattuta_SX_att }
                                 }
                             }
                         // 06.02.2018
                          // Trova prima FiaLibG perché mdF_archetipo_Fia = "Fia*"
                          // e quindi non trova Cuc_FiaSx, serve ricerca per *Fia*
                          // Non lo cambio all' inizio di default perché dovrei ripassare tutto il mondo per sicurezza
                          // anche se al punto in cui è arrivato questo file è probabile che funzioni
                         // 16.03.2018
                          // PADRE di 3, perché potrebbe esserci un padre in piu
                          // e poi non è detto perché potrebbe esserci Fia e Divisorio
                          // quindi vedi sotto
                          if (PADRE(mdf_fiaBatSx_Gen, 3) != PADRE(mdf_idx_KFBX, 3) )
                             {
                              if (mdf_BattutaSX_ok == 0)
                                 {
                                  // 06.12.2019, vedi proc locale
                                  //DISPLAY2(STRCAT("Padre2dimdf_fiaBatSx_Gen=", STR(PADRE(mdf_fiaBatSx_Gen, 3)), " Padre2dimdf_idx_KFBX=", STR(PADRE(mdf_idx_KFBX, 3))))
                                  mdf_exitBattuta_SX_att = exitBattuta_SX
                                  exitBattuta_SX = -1
                                  mdf_ctrl_Fia_Batt = 4
                                 // 10.03.2025 simil Dx anta interna Fianco
                                  if (Battuta_X_Sx < -1.1)
                                     {
                                      //if (Battuta_Z < -16)
                                      if (Battuta_Z > -30  &  Battuta_Z < -16)
                                         { exitBattuta_SX = mdf_exitBattuta_SX_att }
                                     }
                                 }
                             }
                         }
                     }
                 }
              if (IS_IDX(mdf_fiaBatDx_Gen) )
                 {
                  y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")
                  mdf_ctrl_Bay_Fia = VAR_VAL(mdf_fiaBatDx_Gen, "base_0.y")
                  mdf_ctrl_Aly_Fia = VAR_VAL(mdf_fiaBatDx_Gen, "alto_0.y")
                  mdf_ctrl_diff_BaFBaMy = mdf_ctrl_Bay_Fia - Bay_KFBX
                  mdf_ctrl_diff_AlMAlFy = Aly_KFBX - mdf_ctrl_Aly_Fia

                  // 01.06.2020
                  mdf_BattutaDX_ok = 0
                  // 07.08.2020 Problema Graf*Fia* Vetro di 5mm figlio di Fia*, ma in ogni caso questo era sbagliato perche' colonna 2 ante
                  // il fianco di Battuta e' piu grande dell' anta
                  //if ( IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_archetipo_Fia"), "Fia*")
                  if ( IS_MATCH(mdF_archetipo_Fia, "Fia*")
                     & IS_MATCH(mdF_archetipo_Fia_2, "*Fia*") != 1
                     )
                     {
                      if (mdf_ctrl_Aly_Fia > Aly_KFBX  &  mdf_ctrl_Bay_Fia < Bay_KFBX)
                         {
                          mdf_BattutaDX_ok = 1
                         }
                     }
                  if (ABS(mdf_ctrl_diff_BaFBaMy)+ABS(mdf_ctrl_diff_AlMAlFy) > y_Fro/2-1)
                     {
                      if (mdf_BattutaDX_ok == 0)
                         {
                          mdf_exitBattuta_DX_att = exitBattuta_DX
                          exitBattuta_DX = -1
                          mdf_ctrl_Fia_Batt = 2.1
                         }
                     }
                 // 23.01.2023 Se sopra ho gia mdf_ctrl_Fia_Batt!=0 se entro qua rischio di impostre mdf_exitBattuta_DX_att a -1
                  if ( exitBattuta_DX != -1
                     | mdf_ctrl_Fia_Batt == 0
                     )
                     {
                     // 30.06.2017
                     // Caso di Elementi Angolo Anta Diagonale con nomi archetipi Fianco e Cmp_FiaAng
                      // trova prima il Fianco con Battuta -18.4 e poi non cerca piu Cmp_FiaAng
                      if ( Battuta_X < 0
                         | mdf_ctrl_Fia_VaRi > 0
                         )
                         {
                          if ( ABS(Battuta_X) > VAR_VAL(mdf_fiaBatDx_Gen, "X")+0.1
                             // 26.09.2022 IMO68840401 anta sup DoppioVas trova prima FiaLib e non Cuc_FiaDx
                             | Battuta_X_Dx < -1
                             )
                             {
                              mdf_exitBattuta_DX_att = exitBattuta_DX
                              exitBattuta_DX = -1
                              mdf_ctrl_Fia_Batt = 3.1
                             // 10.03.2025 A023142 anta interna Fianco
                              if (Battuta_X_Dx < -1.1)
                                 {
                                  // 07.05.2025
                                  //if (Battuta_Z < -16)
                                  if (Battuta_Z > -30  &  Battuta_Z < -16)
                                     { exitBattuta_DX = mdf_exitBattuta_DX_att }
                                 }
                             }
                         // 06.02.2018
                          // Trova prima FiaLibG perché mdF_archetipo_Fia = "Fia*"
                          // e quindi non trova Cuc_FiaSx, serve ricerca per *Fia*
                          // Non lo cambio all' inizio di default perché dovrei ripassare tutto il mondo per sicurezza
                          // anche se al punto in cui è arrivato questo file è probabile che funzioni
                         // 16.03.2018
                          // PADRE di 3, perché potrebbe esserci un padre in piu
                          // e poi non è detto perché potrebbe esserci Fia e Divisorio
                          if (PADRE(mdf_fiaBatDx_Gen, 3) != PADRE(mdf_idx_KFBX, 3) )
                             {
                              if (mdf_BattutaDX_ok == 0)
                                 {
                                  // 06.12.2019, vedi proc locale
                                  //DISPLAY2(STRCAT("Padre2dimdf_fiaBatSx_Gen=", STR(PADRE(mdf_fiaBatDx_Gen, 2)), " Padre2dimdf_idx_KFBX=", STR(PADRE(mdf_idx_KFBX, 2))))
                                  mdf_exitBattuta_DX_att = exitBattuta_DX
                                  exitBattuta_DX = -1
                                  mdf_ctrl_Fia_Batt = 4.1
                                 // 10.03.2025 A023142 anta interna Fianco
                                  if (Battuta_X_Dx < -1.1)
                                     {
                                      //if (Battuta_Z < -16)
                                      if (Battuta_Z > -30  &  Battuta_Z < -16)
                                         { exitBattuta_DX = mdf_exitBattuta_DX_att }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
         }

     // 25.01.2017
      // Con mdF_archetipo_Fia = "Fia*" trovo un FiaLib vicino ma a quel punto non vado piu in cerca dei Cuc_Fia
      // con mdF_archetipo_Fia = "*Fia*" perchè Fianchi_vic è > 0
      if (mdf_ctrl_Fia_Batt > 0)
         {
          if (Fianchi_vic > 0)
             {
              mdF_archetipo_Fia = "*Fia*"
              NEAR_GLOBALE("Fianchi_vic", mdf_idx_KFBX, mdf_distNearBatFia, 1, mdF_archetipo_Fia)
              // 22.10.2018
              // Se la scocca ha 2 ante battenti potrebbe trovare solo 2 Fianchi
              //if (Fianchi_vic > 2)
              if (Fianchi_vic >= 2)
                 {
                  GOSUB MdF_while_X_Gen
                  GOSUB MdF_Battuta_Z_Gen
              // 23.10.2018
              // Chiusa parentesi prima come su MdF_KeyFam_Battuta_X
              // perché tra l' altro vedi GOSUB MdF_get_Battuta_SX_Gen dove dopo qualche riga
              // se exitBattuta_DX -1 prende la Battuta_X da quello che ha trovato a Sx
              // quindi se qui sotto poi fa il controllo per Divisorio a sinistra, mi fotte la Battuta_DX
              // che nel caso di Battute non uguali mi sbaglia appunto la Battuta_X Apertura DX
                 }

              // 23.03.2017
               if (mdf_ctrl_Fia_Batt == 2)
                  {
                   SET_#(mdf_idx_KFBX)
                   #mdf_debug_exitBattuta_SX = mdf_exitBattuta_SX_att

                   if (exitBattuta_SX == -1)
                      {
                       #exitBattuta_SX = mdf_exitBattuta_SX_att
                       exitBattuta_SX = mdf_exitBattuta_SX_att
                      }
                  }
               if (mdf_ctrl_Fia_Batt == 2.1)
                  {
                   SET_#(mdf_idx_KFBX)
                   #mdf_debug_exitBattuta_DX = mdf_exitBattuta_DX_att

                   if (exitBattuta_DX == -1)
                      {
                       #exitBattuta_DX = mdf_exitBattuta_DX_att
                       exitBattuta_DX = mdf_exitBattuta_DX_att
                      }
                  }
             // 16.03.2018
              // potrebbe esserci Fia e Divisorio, quindi ripristino se non ho trovato la Battuta
              if (mdf_ctrl_Fia_Batt == 4)
                 {
                  SET_#(mdf_idx_KFBX)
                  #mdf_debug_exitBattuta_SX = mdf_exitBattuta_SX_att

                  if (exitBattuta_SX == -1)
                     {
                      #exitBattuta_SX = mdf_exitBattuta_SX_att
                      exitBattuta_SX = mdf_exitBattuta_SX_att
                     }
                 }
              if (mdf_ctrl_Fia_Batt == 4.1)
                 {
                  SET_#(mdf_idx_KFBX)
                  #mdf_debug_exitBattuta_DX = mdf_exitBattuta_DX_att

                  if (exitBattuta_DX == -1)
                     {
                      #exitBattuta_DX = mdf_exitBattuta_DX_att
                      exitBattuta_DX = mdf_exitBattuta_DX_att
                     }
                 }
             }
         }

      //DISPLAY2(STRCAT("1.MdF_Battuta_X - Fianchi_vic=", STR(Fianchi_vic), " mdF_archetipo_Fia=", mdF_archetipo_Fia))

      mdf_aperture_NoBatt = 0
      mdf_ctrl_Battuta_NoBatt = 0
      if ( IS_MATCH(MdF_Apertura, "S*") != 1
         & IS_MATCH(MdF_Apertura, "D*") != 1
         )
         {
          mdf_aperture_NoBatt = 1
         }
      if (mdf_aperture_NoBatt > 0)
         {
          if (VAR_EXIST(mdf_idx_KFBX, "Battuta_X_Sx") )
             {
              if (Battuta_X_Sx == 0)
                 { mdf_ctrl_Battuta_NoBatt = 1 }
             }
          if (VAR_EXIST(mdf_idx_KFBX, "Battuta_X_Dx") )
             {
              if (Battuta_X_Dx == 0)
                 { mdf_ctrl_Battuta_NoBatt = 2 }
             }
         }
      if (exitBattuta_SX == -1  |  exitBattuta_DX == -1)
         {
          NEAR_GLOBALE("Fianchi_vic", mdf_idx_KFBX, mdf_distNearBatFia, 1, mdF_archetipo_Fia_2)
          if (Fianchi_vic == 0)
             {
              mdF_archetipo_Fia_2 = "*Div*"
              NEAR_GLOBALE("Fianchi_vic", mdf_idx_KFBX, mdf_distNearBatFia, 1, mdF_archetipo_Fia_2)
             }
          if (Fianchi_vic > 0)
             {
             // 12.05.2022
              mdf_ctrl_Fia_2 = 1
              GOSUB MdF_while_X_Gen
              GOSUB MdF_Battuta_Z_Gen
             }
         }

      if (exitBattuta_SX == -1  |  exitBattuta_DX == -1)
         {
          if (STRLEN(mdF_archetipo_Fia_3) > 0)
             {
              NEAR_GLOBALE("Fianchi_vic", mdf_idx_KFBX, mdf_distNearBatFia, 1, mdF_archetipo_Fia_3)
              if (Fianchi_vic > 0)
                 {
                  GOSUB MdF_while_X_Gen
                  GOSUB MdF_Battuta_Z_Gen
                 }
             }
         }
      if (mdf_aperture_NoBatt > 0)
         {
          if ( VAR_EXIST(mdf_idx_KFBX, "Battuta_X_Sx")
             & VAR_VAL(mdf_idx_KFBX, "Battuta_X_Sx") == 0
             )
             { Battuta_X_Sx = Battuta_DX }

          if ( VAR_EXIST(mdf_idx_KFBX, "Battuta_X_Dx")
             & VAR_VAL(mdf_idx_KFBX, "Battuta_X_Dx") == 0
             )
             { Battuta_X_Dx = Battuta_SX }
         }
      if (VAR_EXIST(mdf_idx_KFBX, "MdF_offx_Battuta_Sx") )
         {
          SET_#(mdf_idx_KFBX)
          mdf_offx_Battuta_Sx = VAR_VAL(mdf_idx_KFBX, "MdF_offx_Battuta_Sx")
          if (Battuta_SX == 0  &  ABS(Battuta_DX) < 19)
             { #Battuta_SX = Battuta_DX }
          #Battuta_SX = #Battuta_SX + mdf_offx_Battuta_Sx
          if (IS_MATCH(MdF_Apertura, "S*") == 1)
             { #Battuta_X = #Battuta_SX }
         }
      if (VAR_EXIST(mdf_idx_KFBX, "MdF_offx_Battuta_Dx") )
         {
          SET_#(mdf_idx_KFBX)
          if (Battuta_DX == 0  &  ABS(Battuta_SX) < 19)
             { #Battuta_DX = Battuta_SX }
          mdf_offx_Battuta_Dx = VAR_VAL(mdf_idx_KFBX, "MdF_offx_Battuta_Dx")
          #Battuta_DX = #Battuta_DX + mdf_offx_Battuta_Dx
          if (IS_MATCH(MdF_Apertura, "D*") == 1)
             { #Battuta_X = #Battuta_DX }
         }

      // Protezione frontali posizionati sciolti ma vicini a dove dovrebbero andare
      // ma spostati in z piu di 10mm, o magari vicini ad altre scocche con fianchi
      if (Battuta_X == 0)
         {
          if ( IS_MATCH(NOME(PADRE(mdf_idx_KFBX, -1)), "*Anta*")
             // 10.10.2023 aggiunto solo perchè in molti cominciano a fare archetipi con nome Frontale*
             | IS_MATCH(NOME(PADRE(mdf_idx_KFBX, -1)), "*Fron*")
             // 28.07.2020 come proc locale MdF_KeyFam_Battuta_X
             | VAR_VAL(PADRE(mdf_idx_KFBX, -1), "VAR_vuoto") == 1
             )
             {
              mdf_wk_fia_comp = -0.1
              mdf_antaCerANP = 0
              if ( VAR_VAL(PADRE(mdf_idx_KFBX, 1), "MdF_angoloBas") > 84
                 & VAR_VAL(PADRE(mdf_idx_KFBX, 1), "MdF_angoloBas") < 96
                 )
                 { mdf_antaCerANP = 1 }

            // 01.12.2023 Bifacciali. Avendo aggiunto che entra con Fron e' uscito l' errore
             // La Battuta_Sx,Dx=0 e' usata in RegFacc per riconoscere che non c'è fianco
             if (IS_MATCH(NOME(PADRE(mdf_idx_KFBX, -1)), "*Fron*") )
                {
                  if ( IS_MATCH(NOME(PADRE(mdf_idx_KFBX, -1)), "*Bif*")
                     | STRLEN(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura")) <= 0
                     | IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura"), "*B*")
                     )
                     {
                      // 04.12.2023 Se bifacciale centrale non ha ne exitBattuta_SX, ne DX
                      mdf_antaCerANP = 2
                     }
                }

              if (exitBattuta_SX == -1  | exitBattuta_DX == -1)
                 {
                  COMPONENTI2("mdf_wk_fia_comp", mdf_idx_KFBX, "*Fia*")
                 // 10.10.2023 St443018 trova anche gli elementi MdF_Pistone*Fia*
                  if (mdf_aperture_NoBatt > 0)
                     {
                      if (mdf_wk_fia_comp > 0)
                         {
                          COMPONENTI2("mdf_mdf_pis_fia", mdf_idx_KFBX, "MdF_*Pis*Fia*")
                          mdf_wk_fia_comp = mdf_wk_fia_comp-mdf_mdf_pis_fia
                         }
                     }
                 }
              if (exitBattuta_SX == -1)
                 {
                  if (mdf_wk_fia_comp == 0)
                     {
                      SET_#(mdf_idx_KFBX)
                      if (Battuta_SX == 0)
                         {
                          if (mdf_antaCerANP == 0)  { #Battuta_SX = 18.111 }
                         }
                      if (IS_MATCH(MdF_Apertura, "S*") == 1)
                         { #Battuta_X = #Battuta_SX }
                     }
                 }

              // 10.10.2023 St443018 trova comunque un fianco a destra, ma appunto con Battuta negativa e se sono un anta su VAR_vuoto o singola
              // meglio prendere la Battuta_X distante da quel Fianco
              if (mdf_aperture_NoBatt > 0)
                 {
                  if (mdf_wk_fia_comp == 0)
                     {
                      if (VAR_VAL(mdf_idx_KFBX, "Battuta_X_Sx") < -1)
                         {
                          // Potrei fare solo per VAR_Vuoto perchè non è così scontato che vada sempre bene anche se dev' essere per forza
                          // il primo caso che esce perchè altrimenti qualcuno me lo avrebbe segnalato dato che trova gli MdF_*Pis*Fia* e quindi
                          // non poteva funzionare per aperture non battenti
                          Battuta_X_Sx = 16.555
                         }
                     }
                 }

              if (exitBattuta_DX == -1)
                 {
                  if (mdf_wk_fia_comp == 0)
                     {
                      SET_#(mdf_idx_KFBX)
                      if (Battuta_DX == 0)
                         {
                          if (mdf_antaCerANP == 0)  { #Battuta_DX = 18.111 }
                         }
                      if (IS_MATCH(MdF_Apertura, "D*") == 1)
                         { #Battuta_X = #Battuta_DX }
                     }
                 }

              // 10.10.2023 St443018 trova comunque un fianco a destra, ma appunto con Battuta negativa e se sono un anta su VAR_vuoto o singola
              // meglio prendere la Battuta_X distante da quel Fianco
              if (mdf_aperture_NoBatt > 0)
                 {
                  if (mdf_wk_fia_comp == 0)
                     {
                      if (VAR_VAL(mdf_idx_KFBX, "Battuta_X_Dx") < -1)
                         {
                          // Potrei fare solo per VAR_Vuoto perchè non è così scontato che vada sempre bene anche se dev' essere per forza
                          // il primo caso che esce perchè altrimenti qualcuno me lo avrebbe segnalato dato che trova gli MdF_*Pis*Fia* e quindi
                          // non poteva funzionare per aperture non battenti
                          Battuta_X_Dx = 16.555
                         }
                     }
                 }
             }
         }
     // 01.04.2020 nel caso si usasse in modo errato ang_y per vedere le ante aperte
      if ( exitBattuta_SX == -1
        // 20.11.2020 1020092595 altrimenti se ci ripassa non sovrascriverebbe la Battuta_X
         | VAR_VAL(mdf_idx_KFBX, "idx_Battuta_SX_BDM") == exitBattuta_SX
         )
         {
          if (VAR_EXIST(mdf_idx_KFBX, "idx_Battuta_SX_BDM") )
             {
              if (IS_IDX(VAR_VAL(mdf_idx_KFBX, "idx_Battuta_SX_BDM")) )
                 {
                  exitBattuta_SX = VAR_VAL(mdf_idx_KFBX, "idx_Battuta_SX_BDM")
                  Battuta_X = VAR_VAL(mdf_idx_KFBX, "Battuta_X_BDM")
                  VAR_VALUE_SET(mdf_idx_KFBX, "exitBattuta_SX", exitBattuta_SX)
                  VAR_VALUE_SET(mdf_idx_KFBX, "Battuta_X", Battuta_X)
                 }
             }
         }
      if ( exitBattuta_DX == -1
        // 20.11.2020 1020092595
         | VAR_VAL(mdf_idx_KFBX, "idx_Battuta_DX_BDM") == exitBattuta_DX
         )
         {
          if (VAR_EXIST(mdf_idx_KFBX, "idx_Battuta_DX_BDM") )
             {
              if (IS_IDX(VAR_VAL(mdf_idx_KFBX, "idx_Battuta_DX_BDM")) )
                 {
                  exitBattuta_DX = VAR_VAL(mdf_idx_KFBX, "idx_Battuta_DX_BDM")
                  Battuta_X = VAR_VAL(mdf_idx_KFBX, "Battuta_X_BDM")
                  VAR_VALUE_SET(mdf_idx_KFBX, "exitBattuta_DX", exitBattuta_DX)
                  VAR_VALUE_SET(mdf_idx_KFBX, "Battuta_X", Battuta_X)
                 }
             }
         }
     // 10.10.2023
      mdf_id_ForzaBatt = mdf_idx_KFBX
      if (VAR_EXIST(mdf_id_ForzaBatt, "MPF_ForzaBattutaX_Sx") != 1)  { mdf_id_ForzaBatt = PADRE(mdf_idx_KFBX, 1) }
      if (VAR_VAL(mdf_id_ForzaBatt, "MPF_ForzaBattutaX_Sx") != 0)
         {
          Battuta_X_Sx = VAR_VAL(mdf_id_ForzaBatt, "MPF_ForzaBattutaX_Sx")
         }

      if (VAR_EXIST(mdf_id_ForzaBatt, "MPF_ForzaBattutaX_Dx") != 1)  { mdf_id_ForzaBatt = PADRE(mdf_idx_KFBX, 1) }
      if (VAR_VAL(mdf_id_ForzaBatt, "MPF_ForzaBattutaX_Dx") != 0)
         {
          Battuta_X_Dx = VAR_VAL(mdf_id_ForzaBatt, "MPF_ForzaBattutaX_Dx")
         }

     // 18.02.2025 A199525 AntaRicambioSciolta posizionata da utente circa vicino Pensile, Battuta_X 0.0129297
      mdf_Ctrl_AntaScio = 0
      if ( VAR_VAL(mdf_idx_KFBX, "Battuta_X") > -1  &  VAR_VAL(mdf_idx_KFBX, "Battuta_X") < 1
         & VAR_VAL(mdf_idx_KFBX, "Battuta_X") != 0
         )
         {
          if ( IS_MATCH(NOME(PADRE(mdf_idx_KFBX, -1)), "*Anta*")
             | IS_MATCH(NOME(PADRE(mdf_idx_KFBX, -1)), "*Fron*")
             )
             {
              mdf_Ctrl_AntaScio = 1
              // Teoricamente non serve
              if ( IS_MATCH(NOME(PADRE(mdf_idx_KFBX, -1)), "*Bif*")
                 | STRLEN(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura")) <= 0
                 | IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura"), "*B*")
                 )
                 {
                  // Se bifacciale centrale non ha ne exitBattuta_SX, ne DX
                  mdf_Ctrl_AntaScio = -1
                 }
             }
         }
     // 17.01.2025
      if (VAR_VAL(mdf_idx_KFBX, "Battuta_X") == 0)
         {
          if ( IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura"), "S*")
             | IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura"), "D*")
             )
             {
              if (VAR_EXIST(mdf_id_ForzaBatt, "MCB_BattutaX_minima") != 1)  { mdf_id_ForzaBatt = PADRE(mdf_idx_KFBX, 1) }
              if (VAR_VAL(mdf_id_ForzaBatt, "MCB_BattutaX_minima") > 4)
                 {
                  if (VAR_VAL(mdf_idx_KFBX, "MdF_angoloBas") == 0)
                     {
                      COMPONENTI2("mdf_fia_pres", PADRE(mdf_idx_KFBX, -1), "*Fia*")
                      COMPONENTI3("mdf_fia_escl", PADRE(mdf_idx_KFBX, -1), "*Fia*")
                      if (mdf_fia_pres == 0  &  mdf_fia_escl > 0)
                         {
                          Battuta_X = VAR_VAL(mdf_id_ForzaBatt, "MCB_BattutaX_minima")
                         }
                     // 18.02.2025 A199525
                      if (mdf_fia_pres == 0  &  mdf_Ctrl_AntaScio > 0)
                         {
                          Battuta_X = VAR_VAL(mdf_id_ForzaBatt, "MCB_BattutaX_minima")
                         }
                     }
                 }
             }
         }

     // 11.02.2025 Sc1057073 Devo reimpostarlo altrimenti se non esiste MCB_BattutaX_minima lo imposta a PADRE di 1 qui sopra
      mdf_id_ForzaBatt = mdf_idx_KFBX
     // 18.04.2024 BaseSat
      if (VAR_EXIST(mdf_id_ForzaBatt, "MCB_ForzaBattutaX") != 1)  { mdf_id_ForzaBatt = PADRE(mdf_idx_KFBX, 1) }
      if (VAR_VAL(mdf_id_ForzaBatt, "MCB_ForzaBattutaX") != 0)
         {
          Battuta_X = VAR_VAL(mdf_id_ForzaBatt, "MCB_ForzaBattutaX")
         }
   }

   PROCEDURA MdF_riga_KeyFamRegFacc
   {
      // Se sono in ambito di ATTUALE() = -1 e uso queste variabili su KeyFamRegFacc
      // devo crearle appunto in ambito di -1 perndendole dall' idx che sto analizzando
      // Qui dovò inserire tutte le variabili di sistema non create in VariabiliMdF (perché
      // calcolate dopo) che si vorranno usare nei campi di KeyFamRegFacc
      if (ATTUALE() == -1)
         {
          MdfSys_SbordoYSup = VAR_VAL(idx_RegF, "MdfSys_SbordoYSup")
          MdfSys_SbordoYInf = VAR_VAL(idx_RegF, "MdfSys_SbordoYInf")

          MdfSys_SbordoYSup_DaCop = VAR_VAL(idx_RegF, "MdfSys_SbordoYSup_DaCop")
          MdfSys_SbordoYInf_DaFon = VAR_VAL(idx_RegF, "MdfSys_SbordoYInf_DaFon")
         }

      nReg = nriga

      var_name = "Xanta_min"
      var_val = TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc, kriga, var_name)
      // 09.01.2024 Ottimizzo gestione variabili Xanta_min/max, Yanta_min/max KeyFamRegFacc
      if ( VAR_VAL(-1, "CAM_CloseOpenTab") >= 1
         | VAR_VAL(-1, "CAM_Visualize") >= 1
         )
         {
          GOSUB MdF_VAL_VAR_RegFacc
          Xanta_min_KFRF = VAR_VAL(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)))
         }
      else
         {
          GOSUB MdF_VAL_VAR_RegFaccTemp
          Xanta_min_KFRF = mdf_VAL_VAR_RegFaccTemp
         }

      var_name = "Xanta_max"
      var_val = TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc, kriga, var_name)
      //GOSUB MdF_VAL_VAR_RegFacc
      //Xanta_max_KFRF = VAR_VAL(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)))
      GOSUB MdF_VAL_VAR_RegFaccTemp
      Xanta_max_KFRF = mdf_VAL_VAR_RegFaccTemp

      var_name = "Yanta_min"
      var_val = TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc, kriga, var_name)
      //GOSUB MdF_VAL_VAR_RegFacc
      //Yanta_min_KFRF = VAR_VAL(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)))
      GOSUB MdF_VAL_VAR_RegFaccTemp
      Yanta_min_KFRF = mdf_VAL_VAR_RegFaccTemp

      var_name = "Yanta_max"
      var_val = TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc, kriga, var_name)
      //GOSUB MdF_VAL_VAR_RegFacc
      //Yanta_max_KFRF = VAR_VAL(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)))
      GOSUB MdF_VAL_VAR_RegFaccTemp
      Yanta_max_KFRF = mdf_VAL_VAR_RegFaccTemp

      var_name = "EscludikFm"
      var_val = TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc, kriga, var_name)
      mdf_glob_escludikfm = "no"
      if (STRLEN(var_val) <= 4)  { mdf_glob_escludikfm = STRMID(1,STRLEN(var_val)-2,var_val) }
      else
         {
          // 15.02.2018
          retEval_ctrl_error = EVAL(STRCAT("mdf_glob_escludikfm=",var_val))
          if (retEval_ctrl_error == -1)  { GOSUB MdF_VAL_VAR_STR_RegFacc }
         }

      // Creo la variabile solo se il valore non è corretto per fare la gestione errori
      // 15.02.2018
      // Con M4.10 EVALIZZA comunque il SE_STR no o si quindi è sempre <=4, mentre prima
      // ritornava come valore la stringa andata in errore
      // quindi ho aggiunto direttamente qui sopra retEval_ctrl_error che alla fine è piu corretto
      // Per il momento questa riga la lascio lo stesso anche se non dovrebbe entrare piu
      if (STRLEN(mdf_glob_escludikfm) > 4)  { GOSUB MdF_VAL_VAR_STR_RegFacc }

      name_var_Escludi = STRCAT(var_name, "_", tLav, STR(nReg))
      table_CVer = $MdF_TABLE_KeyFamRegFacc
      GOSUB MdF_CtrlVersioni

      X_Fro = VAR_VAL(idx_RegF, "X")
      Y_Fro = VAR_VAL(idx_RegF, "Y")
      // 08.02.2024
      if (VAR_VAL(idx_RegF, "MdF_VanoY2") >= 50)
         {
          // 20.03.2024
          //Y_Fro = Y_Fro-VAR_VAL(idx_RegF, "MdF_VanoY2")
          Y_Fro = VAR_VAL(idx_RegF, "MdF_VanoY1")
          if (VAR_VAL(idx_RegF, "mdf_Find_KeyFamVY2") > 0)
             {
              //Y_Fro = Y_Fro-VAR_VAL(idx_RegF, "MdF_VanoY1")
              Y_Fro = VAR_VAL(idx_RegF, "MdF_VanoY2")
             }
          if (VAR_VAL(idx_RegF, "mdf_Find_KeyFamVY3") > 0)  { Y_Fro = VAR_VAL(idx_RegF, "MdF_VanoY3") }
         }

      dim_ok = 0
     // 19.10.2023
      if (VAR_EXIST(-1, "MdfSys_TolleranzaDimReg") != 1)
         {
          if (X_Fro >= Xanta_min_KFRF  &  X_Fro <= Xanta_max_KFRF  &  Y_Fro >= Yanta_min_KFRF  &  Y_Fro <= Yanta_max_KFRF)
             { dim_ok = 1 }
         }
      else
         {
          X_Fro = ROUND2(X_Fro, ABS($MdfSys_TolleranzaDimReg))
          Y_Fro = ROUND2(Y_Fro, ABS($MdfSys_TolleranzaDimReg))

          if ($MdfSys_TolleranzaDimReg >= 0)
             {
              if (X_Fro >= Xanta_min_KFRF  &  X_Fro < Xanta_max_KFRF  &  Y_Fro >= Yanta_min_KFRF  &  Y_Fro < Yanta_max_KFRF)
                 { dim_ok = 1 }
             }
          else
             {
              if (X_Fro >= Xanta_min_KFRF  &  X_Fro <= Xanta_max_KFRF  &  Y_Fro >= Yanta_min_KFRF  &  Y_Fro <= Yanta_max_KFRF)
                 { dim_ok = 1 }
             }
         }

      if (dim_ok == 1)
         {
          var_name = "KeyFamRegFacc"
          var_val = TABLE_FIELD_AT($MdF_TABLE_KeyFamRegFacc,kriga,var_name)
          GOSUB MdF_VAL_VAR_STR_RegFacc

          var_KeyFam = STRCAT("KeyFamRegFacc_", tLav, STR(nriga))
          if (STRCMP(UPPER(mdf_glob_escludikfm), "NO") == 0)
             {
              KeyFamRegFacc = VAR_VAL_STR(idx_RegF, var_KeyFam)
              VAR_CREATE_STR(idx_RegF, STRCAT("KeyFamRegFacc_", tLav), KeyFamRegFacc, 0, "")
             }
         }
   }

   PROCEDURA MdF_AttrezzaRegFacc
   {
      // vedi GOSUB MdF_CamMdFrontali
      // Devo entrare anche quando cambia l'Elemento perchè se mi cambia una condizione
      // che determina un altra KeyFamRegFacc in fase di inserimento ordine avrei
      // DDP_Grezzo da fine Ordine sbagliato e quindi CAM sbagliato.
      //if (ACTION() != 2)  { EXITSUB() }
      // 0 Comando Interattivo: esempio inserimento codice da Listino
      // 1 comando Automatico: da BDM
      // 2 comando da Redo: da comando su RIT

      if (VAR_VAL(-1, "MDFSys_Exit_Always") == 1)   { EXITSUB() }

      // MdF_AttrezzaRegFacc e' obsoleta usare MdF_ADD_Reg_Interat
      MdF_Load_COMANDO2 = 1
      GOSUB MdF_ADD_Reg_Interat
   }

   PROCEDURA MdF_Ctrl_OnAfterFirstMdFAdd
   {
      if (STRLEN(VAR_VAL_STR(-1, "MdF_Load_att")) > 0)
         {
          if (ACTION() == 3)
             {
              if (VAR_VAL(idx_att, "mdf_ctrl_OnAfterFirstMdFAdd") == 2)
                 {
                  COMPONENTI2("mdf_FerrOAFMA", idx_att, "MdF_*")
                  if (mdf_FerrOAFMA > 0)
                     {
                      if (VAR_VAL(mdf_FerrOAFMA[1], "mdf_rel_ADD_bas0y_LoadARF_Error") <= 0)
                         {
                          mdf_ctrl_OnAfterFirstMdFAdd = 0
                         }
                     }
                 }
             }

          mdf_rel_ADD_bas0y_LoadARF_Error = 0

          if ( VAR_EXIST(idx_att, "mdF_Lav_offy_LoadAttRegFacc") == 1
             // 07.03.2019 aggiunto +MdF_offy_REL_ADD
             // 14.03.2019 corretto idx
             & ABS(VAR_VAL(idx_att, "mdF_Lav_offy_LoadAttRegFacc")) != Y + ABS(VAR_VAL(idx_att, "MdF_offy_REL_ADD"))
             )
             {
              mdf_rel_ADD_bas0y_LoadARF_Error = 1
              mdf_ctrl_OnAfterFirstMdFAdd = 2
             }
         }
      // 14.03.2025 Ora è inutile, da togliere
      //if (STRCMP(MDFSys_Load_ini, "OnAfterFirstMdFAdd") != 0)  { EXITSUB() }
   }

   // Può esser chiamata da sola al posto della MdF_AttrezzaRegFacc se si vogliono
   // avere gli MdF_ solo se viene cambiato l'elemento da utente
   // Oppure a Bdm va chiamata subito dopo la MdF_AttrezzaRegFacc
   // Solitamente ha senso usarla se MdF_Load è OnMacro per esempio
   // per avere le cerniere subito per MdF_Utente o per le collisioni
   // Oppure mantenere MdF_AttrezzaRegFacc e utilizzare MdF_Load OnInterat
   PROCEDURA MdF_ADD_Reg_Interat
   {
      if (ACTION() == 1064)  { EXITSUB() }

     // 15.03.2019
      mdf_ins2_att = INSERIMENTO2(PADRE(idx_att, -1))
      if (mdf_ins2_att == $ins2_accessorio)  { EXITSUB() }

      if (HAS_ALIAS(idx_att, "CamMdFrontali") != 1)
         {
          COMANDO2(STRCAT("LOGMSG Ambiguita-Bdm: trovata GOSUB MdF_ADD_Reg_Interat ma non c'è Alias CamMdFrontali idx=", STR(idx_att), " ele=", NOME(idx_att), ". Aggiungere l'Alias o togliere GOSUB MdF_ADD_Reg_Interat ", DATA(0)))
          EXITSUB()
         }

      if (VAR_VAL(-1, "MDFSys_Exit_Always") == 1)   { EXITSUB() }

      // Conflitto VAR_CHANGE sull' OnLoadedOrder
      if (ATTUALE() == -1 & ACTION() == 3)  { EXITSUB() }

      if (VAR_VAL(idx_att, "escluso") != 0)  { EXITSUB() }

      if (ACTION() <= 0)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
     // 18.01.2021 Posso personalizzare il Load MdF_ svincolandomi dall $OnLoadOrder o $VAR_LOAD_ORDER
      if (VAR_VAL(-1, "MdF_LoadOrder") > -1)  { CAM_loadOrder = $MdF_LoadOrder }

     // Commento
      // Per aggiungere gli MdF_ quando si vuole, o meglio nel momento opportuno basta impostare nel Bdm-cliente
      // svincolandosi da $OnLoadOrder e $VAR_LOAD_ORDER
      // $MdF_LoadOrder=0 prima della GOSUB MdF_ADD_Reg_Interat o nell' OnLoadedOrder
      // Oppure aggiungere una Procedura esempio CtrlStatici nell' elemento Alias CamMdFrontail e aggiungere queste righe
      //MdF_ElePostValido = 1
      //MdF_Load_COMANDO2 = 1
      //MdF_Visualize_sat = "OnInterat"
      //GOSUB MdF_ADD_Reg_Interat

     // 25.02.2025
      GOSUB MdF_Ctrl_GEST_Config
      if (mdf_Ctrl_var_GEST_Configured <= 0)  { EXITSUB() }

     // 29.11.2018
      GOSUB MdF_Ctrl_IS_IDX_sat
     // 19.05.2020
      GOSUB MdF_Ctrl_copied

     // 12.02.2018
      GOSUB MdF_Ctrl_var_gest_Init

     // 21.06.2018
      GOSUB MdF_KeyFam_Battuta_X_Post

      // 23.04.2020
      if (IS_MATCH(VAR_VAL_STR(idx_att, "mdf_ADD_Reg_Interat_da"), "MdF_AttrezzaRegFacc*") != 1)
         { GOSUB MdF_Ctrl_Load_save_prec_att }

      mdf_onInterat_sat = 0
      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Visualize_sat"), "OnRicalcola") )  { mdf_onInterat_sat = 1 }
      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Visualize_sat"), "OnBdm") )        { mdf_onInterat_sat = 2 }
      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Visualize_sat"), "OnInterat") )    { mdf_onInterat_sat = 3 }

     // 25.11.2019
      if (VAR_EXIST(idx_att, "MdF_Visualize_sat_prec") != 1)
         {
          MdF_Visualize_sat_prec = VAR_VAL_STR(idx_att, "MdF_Visualize_sat")
         }

      mdf_onInterat_ctrl_Act1 = 0

     // 29.09.2020 in caso volessi attivare gli MdF_ da COMANDO Procedura
      mdf_ADD_Reg_Interat_PostV = 0
      mdf_ElePostValido = VAR_VAL(idx_att, "MdF_ElePostValido")
      if (mdf_ElePostValido > 0)
         {
          if (CAM_loadOrder == 0)
             {
              if (ACTION() == 8)  { mdf_ADD_Reg_Interat_PostV = 1 }
             // 25.03.2022 Do la possibilita' di rileggere le tabelle senza fare COMANDO Procedura AntaSing_CerBat per entrare solo per ACTION 8
              if (ACTION() > 0)
                 {
                  if (mdf_ElePostValido >= 2)  { mdf_ADD_Reg_Interat_PostV = mdf_ElePostValido }
                 }
             }
         }

     // 30.07.2024 spostato piu sopra
      mdf_read_VDP = 0

     // 10.04.2019 L009603 spostato dopo CAM_loadOrder
      mdf_ADD_Reg_Interat_Exit1 = 0
      GOSUB mdf_ADD_Reg_Interat_1
      if (mdf_ADD_Reg_Interat_Exit1 > 0  &  mdf_ADD_Reg_Interat_PostV == 0)  { EXITSUB() }

      // 0 Comando Interattivo: esempio inserimento codice da Listino
      // 1 comando Automatico: da BDM
      // 2 comando da Redo: da comando su RIT

     // 26.07.2019
      if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacroCancella*") == 1)
         {
          if (ACTION() == 3)  { EXITSUB() }
          COMPONENTI3("mdf_FerrCa", idx_att, "MdF_*")
          if (mdf_FerrCa > 0)
             {
              COMANDO2(STRCAT("LOGMSG MdF_ADD_Reg_Interat: OnMacroCancella idx=", STR(idx_att), " ele=", NOME(idx_att), ". Action=", STR(ACTION()), " ", DATA(0)))
              EXITSUB()
             }
         }
     // 26.07.2019
      if ( IS_MATCH(VAR_VAL_STR(idx_att, "MDFSys_Load_ini"), "OnMacro*") == 1
         & IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "mdf_Load_save_prec") != 1
         )
         {
          if (STRLEN(VAR_VAL_STR(-1, "MdF_Load_att")) == 0)  { EXITSUB() }
         }

      mdf_ADD_Reg_Interat_Exit3 = 0
      GOSUB mdf_ADD_Reg_Interat_3
      if (mdf_ADD_Reg_Interat_Exit3 > 0  &  mdf_ADD_Reg_Interat_PostV == 0)  { EXITSUB() }

      mdf_ADD_Reg_Interat_da = STRCAT("entryAct_", STR(ACTION()), "_Cmd_", STR(CMD()))

      GOSUB mdf_verify_Battuta_X

      mdf_ADD_Reg_Interat_Exit4 = 0
      GOSUB mdf_ADD_Reg_Interat_4
      if (mdf_ADD_Reg_Interat_Exit4 > 0  &  mdf_ADD_Reg_Interat_PostV == 0)  { EXITSUB() }

      if (CAM_loadOrder == 1)
         {
          if (ACTION() == 3)  { mdf_ActPreLoad = "ACTION3" }
         }

     // 13.03.2017
      GOSUB MdF_Ctrl_OnAfterFirstMdFAdd

      mdf_ADD_Reg_Interat_da = "entry_ADD"

      // 25.10.2019 solo commento di una riga che in realta' non serve perche' c'e' gia MdF_offz_REL_ADD_prec
      // 02.10.2023 Vedi piu sotto
      //if (VAR_EXIST(idx_att, "mdf_offz_REL_ADD_prec") != 1)  { mdf_offz_REL_ADD_prec = VAR_VAL(idx_att, "MdF_offz_REL_ADD") }

      mdf_ADD_Reg_Interat_Exit6 = 0
      GOSUB mdf_ADD_Reg_Interat_6
      if (mdf_ADD_Reg_Interat_Exit6 > 0  &  mdf_ADD_Reg_Interat_PostV == 0)  { EXITSUB() }

      if (VAR_VAL(idx_att, "mdf_Y_Interat_prec") <= 0)  { mdf_Y_Interat_prec = Y }
      if (VAR_VAL(idx_att, "mdf_X_Interat_prec") <= 0)  { mdf_X_Interat_prec = X }
     // 17.10.2024
      if (VAR_EXIST(idx_att, "mdf_Zt_Interat_prec") != 1)  { mdf_Zt_Interat_prec = VAR_VAL(idx_att, "Zt") }

      GOSUB MdF_Var_Ini

      MdF_bdm_Load = VAR_VAL_STR(idx_att, "MdF_Load_Interat")
      if (STRLEN(MdF_bdm_Load) <= 0)  { MdF_bdm_Load = "CerBat;CerSof;CerRib;PisAnta;PisFia;Par;FerGen;FerCri;FerFro;FerFia;FerPia" }

      ctrl_solo_chiave = 1

      NewRTA = "1"

     // 25.07.2019
      mdf_Load_COMANDO2 = VAR_VAL(idx_att, "MdF_Load_COMANDO2")
      // Se ho un elemento che è sia CamIncidente che CamMdFrontali mi ritrovo le variabili CAM sulla procedura Sub_Cam_Ins_Elementi !
      // Siccome qua sono solo di appoggio non devo avere lo stesso nome con prefisso CAM_
      // Vedi MdF_off*_REL_ADD
      mdF_Lav_offx = 0
      mdF_Lav_offz = 0
      mdF_Lav_offy = 0
      if (IS_MATCH(NewRTA, "1") == 1)  { mdF_Lav_offy = -Y }

      DEL_VAR(idx_att, "Escludi_*")

     // 30.07.2018
      if (VAR_VAL(idx_att, "MdF_Eliminato") > 0)
         {
          if (VAR_EXIST(idx_att, "MdF_Eliminato_action3") != 1)  { MdF_Eliminato_action3 = 0 }
          MdF_Eliminato_action3 = MdF_Eliminato_action3+1

         // 18.11.2021
          if (VAR_EXIST(idx_att, "MdF_Eliminato_loop") != 1)  { MdF_Eliminato_loop = 0 }
          MdF_Eliminato_loop = MdF_Eliminato_loop+1

          if (MdF_Eliminato_loop > 10)
             {
              COMANDO(STRCAT("LOGMSG MdF_ADD_Reg_Interat ESCO PER LOOP. Controlla questo frontale perche ha dimensioni che cambiano in loop idx=", STR(idx_att), " ", DATA(0)))
              MdF_Eliminato_loop = 0
              EXITSUB()
             }

          if ($MdF_NO_LOGMSG == 0)
             {
              if (mdf_Load_COMANDO2 == 0)
                 { COMANDO(STRCAT("LOGMSG MdF_ADD_Reg_Interat COMANDO eliminato idx=", STR(idx_att), " MdF_Eliminato=", STR(MdF_Eliminato), " ", DATA(0))) }
              else
                 { COMANDO2(STRCAT("LOGMSG MdF_ADD_Reg_Interat COMANDO2 eliminato idx=", STR(idx_att), " MdF_Eliminato=", STR(MdF_Eliminato), " ", DATA(0))) }
             }
          // 13.02.2019 altrimenti non ri-aggiunge piu gli MdF_ dopo l' eliminazione per Dim
          //EXITSUB()
          // 28.02.2019 ArPrCu Ante graficate sciolte ma deve uscire se mdf_add_PostControl > 0
          if (PADRE(idx_att, 1) == idx_att)
             {
              if (VAR_VAL(idx_att, "mdf_add_PostControl") > 0)  { EXITSUB() }
             }
         // 16.04.2019 PCP021302 Cestone sup ridotto per Gola duplicava Paracolpi
         // 06.05.2019 cosi e' piu' corretto perche' piu' generico
          if (VAR_VAL(idx_att, "CAM_loadOrder") == 0)
             {
              if (ACTION() == 3  &  CMD() == 1)
                 {
                  if (VAR_VAL(idx_att, "mdf_add_now") > 0)
                     {
                      mdf_add_now = -1
                      EXITSUB()
                     }
                 }
             }
         }
      MdF_Eliminato_action3 = 0

      mdf_add_now_MdF_ADD_Reg_Interat = 0
      str_action = STRCAT(" action=", STR(ACTION()))
      // 25.06.2020
      //if ($MdF_NO_LOGMSG == 0)
      //   {
      //    mdf_Interat_log1 = STRCAT("LOGMSG { MdF_ADD_Reg_Interat INIT idx=", STR(idx_att), " ele=", NOME(idx_att))
      //    mdf_Interat_log2 = STRCAT("MdF_Apertura=", VAR_VAL_STR(idx_att, "MdF_Apertura"), " , mdf_ctrl_Change_Apertura=", STR(VAR_VAL(idx_att, "mdf_ctrl_Change_Apertura")), str_action)
      //    if (mdf_Load_COMANDO2 == 0)
      //       { COMANDO(STRCAT(mdf_Interat_log1, " ", mdf_Interat_log2, " ", DATA(0))) }
      //    else
      //       { COMANDO2(STRCAT(mdf_Interat_log1, " ", mdf_Interat_log2, " ", DATA(0))) }
      //   }

     // 20.05.2019
      // Vedi MdF_Pan_X, CAM_Pan_X su VariabiliDaTipoPadri
      // 30.07.2024 spostato piu sopra mdf_read_VDP = 0
      if ( STRLEN(MdF_bdm_Load) > 1
         & STRLEN(VAR_VAL_STR(idx_att, "MdF_Apertura")) < 1
         )
         { mdf_read_VDP = 1 }

      if (VAR_VAL(idx_att, "MdF_Eliminato") > 0)  { mdf_read_VDP = 2 }

     // 04.09.2024 Cestone con Z 22 e Zt 500, se riduco scocca paracolpi restano avanti
      if (VAR_EXIST(idx_att, "mdf_Zt_prec") != 1)  { mdf_Zt_prec = VAR_VAL(idx_att, "Zt") }
      if (mdf_Zt_prec != VAR_VAL(idx_att, "Zt") )
         {
          mdf_Zt_prec = VAR_VAL(idx_att, "Zt")
          if (VAR_EXIST(idx_att, "MdF_offz_REL_ADD") )  { mdf_read_VDP = 3 }
         }

     // 10.02.2023 Cancello se rientro, altrimenti mi tiene l' ultimo e non il default che e' a 1
      // Per ora pero posso solo su idx_att, perchè altrimenti rischio di cancellarlo anche dove non dovrei
      if (VAR_EXIST(idx_att, "CamSys_DistNear") )  { DEL_VAR(idx_att, "CamSys_DistNear") }

     // 12.04.2023 Se ho gia fatto la Macro CAM, cambio apertura da Fissa a Vasistas, la fissa non ha i paracolpi
      // mentre la VAS li ha, quindi ho KeyFamRegFacc_Par1, ma non KeyFamRegFacc_Par, rifaccio la Macro non metterebbe i Paracolpi
      if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") == 1)
         {
          if ( VAR_EXIST(idx_att, STRCAT("KeyFamRegFacc_", "Par1")) == 1
             // Significa che ho gia letto le righe Par, ma non ho nessuna regola Paracolpi, ma se ho cambiato Apertura
             // dopo la Macro CAM devo rileggere
             & VAR_EXIST(idx_att, STRCAT("KeyFamRegFacc_", "Par")) != 1
             )
             {
              mdf_del_keyPar = 1
              DEL_VAR(idx_att, "KeyFamRegFacc_Par*")
             }
         }

      idx_MdF_Var = idx_att
      if (mdf_read_VDP > 0)
         {
          GOSUB MdF_VariabiliDaTipoPadri
          CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(idx_att, "MdF_addKey_keyGenerica"))
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "keyGenericaFro"
          GOSUB MdF_Variabili

         // 07.07.2020 se imposto MdF_Ctrl_var_gest da VariabiliMdF al primo giro con la chiamata in alto non farebbe niente
          GOSUB MdF_Ctrl_var_gest_Init
         }

     // 31.10.2024 Se imposto MdF_Visualize_sat da VariabiliMdF keyGenericaFro e non prima della GOSUB MdF_ADD_Reg_Interat
      if ( VAR_VAL_STR(idx_att, "MdF_Visualize_sat_prec") == ""
         & VAR_EXIST(idx_att, "MdF_Visualize_sat")
         )
         { MdF_Visualize_sat_prec = VAR_VAL_STR(idx_att, "MdF_Visualize_sat") }

      // 24.11.2021
      // 14.12.2021 Non va bene. Vedi PrCu111201. Al massimo da fare su Bdm-cliente prima di GOSUB MdF_ADD_Reg_Interat
       //if (VAR_VAL(-1, "__loading__") )  { $MdF_Esegui_Show_Abilita = 0 }
       //else                              { $MdF_Esegui_Show_Abilita = 1 }
     // 01.06.2022
      // A bdm dove serve aggiungere if (ACTION() == 2  &  CMD() == 0)  { MdFBdm_Esegui_Show_Abilita = -0.1 }
      // prima di GOSUB MdF_ADD_Reg_Interat
      mdf_Esegui_Show_Abilita = $MdF_Esegui_Show_Abilita
      if (VAR_EXIST(idx_att, "MdFBdm_Esegui_Show_Abilita") )  { mdf_Esegui_Show_Abilita = VAR_VAL(idx_att, "MdFBdm_Esegui_Show_Abilita") }
     // 11.03.2024 Se elimino e riaggiungo devo farlo da sistema altrimenti esce il messaggio Graphic Error. Vedi anche show_graphics_error=1 m4.ini
      if (VAR_EXIST(idx_att, "MdFSys_Esegui_Show_Abilita") )  { mdf_Esegui_Show_Abilita = VAR_VAL(idx_att, "MdFSys_Esegui_Show_Abilita") }

     // 05.12.2018
      // Strano sia uscito solo adesso il problema
      // Se MdF_offx_REL_ADD è impostato su VariabiliDaTipoPadri queste stesse righe poco piu sopra non vanno bene
      // Forse 2 anni fa si usava di piu la MdF_AttrezzaRegFacc e magari erano impostate prima
      if (VAR_EXIST(idx_att, "MdF_offx_REL_ADD") )  { mdF_Lav_offx = mdF_Lav_offx + VAR_VAL(idx_att, "MdF_offx_REL_ADD") }
      if (VAR_EXIST(idx_att, "MdF_offy_REL_ADD") )  { mdF_Lav_offy = mdF_Lav_offy + VAR_VAL(idx_att, "MdF_offy_REL_ADD") }
      if (VAR_EXIST(idx_att, "MdF_offz_REL_ADD") )  { mdF_Lav_offz = mdF_Lav_offz + VAR_VAL(idx_att, "MdF_offz_REL_ADD") }
      // 02.10.2023 serve, perchè altrimenti se fa il RICALCOLA_UNA al posto del MdF_Ctrl_Post_RELATIVE_ADD se rientra trova mdf_offz_REL_ADD_prec e' ancora inesistente, quindi 0
      // e mdf_ADD_Reg_Interat_6 imposta MdF_Cambiato = "Dim_MdF_offz_REL_ADD"
      // In ogni caso la imposto solo se non esiste e quindi in questo momento se non esiste MdF_offz_REL_ADD allora
      // mdf_offz_REL_ADD_prec sarebbe comunque zero
      if (VAR_EXIST(idx_att, "MdF_offz_REL_ADD_prec") != 1)  { MdF_offz_REL_ADD_prec = VAR_VAL(idx_att, "MdF_offz_REL_ADD") }

     // 06.11.2019 GOSUB MdF_KeyFam_Battuta_X spostato sotto:
      // - una chiamata dopo aver letto CerBat perche li potrei cambiare MdF_archetipo_Fia o magari anche la MdF_distNearBatFia
      // ma prima di CerBatFro cosi potrei avere le MdfSys_SbordoY gia su VariabiliMdF
      // - seconda chiamata fuori per le aperture non Battenti
      //mdf_OnInterat_Battuta_X = 0

     // 20.02.2019
      // In alcuni casi di mdf_Load_save_prec il Fianco non e' ancora graficato correttamente
      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "mdf_Load_save_prec") == 1)
         {
          if (VAR_EXIST(idx_att, "exitBattuta_SX") == 1)
             {
              // 27.02.2019
              if (ACTION() == 1)
                 {
                  if (VAR_EXIST(idx_att, "mdf_ctrl_OnAfterFirstMdFAdd") != 1)
                     { mdf_ctrl_OnAfterFirstMdFAdd = 0 }

                  mdf_ctrl_OnAfterFirstMdFAdd = mdf_ctrl_OnAfterFirstMdFAdd+1
                 }
              if (ACTION() == 3)  { mdf_ctrl_OnAfterFirstMdFAdd = -0.1 }

              if (VAR_VAL(idx_att, "mdf_ctrl_OnAfterFirstMdFAdd") > 1)  { mdf_ctrl_OnAfterFirstMdFAdd = -0.2 }

              GOSUB MdF_KeyFam_Battuta_X
             }
         }

     // 07.05.2025 EM0122400072
      if (VAR_EXIST(idx_att, "mdf_bas0_y_Fro_Prec") != 1)
         { mdf_bas0_y_Fro_Prec = base_0.y }

      if (mdf_bas0_y_Fro_Prec != base_0.y)
         {
          WITH_VAR_LOCAL(idx_att, "mdf_bas0y_diff", "mdiffbas0y_CamMdF", 2, 0, "0")
          if (mdf_bas0y_diff > 0)
             { mdf_bas0_y_Fro_Prec = base_0.y }
         }

      if (STR_INDEX_OF(MdF_bdm_Load, 0, "CerBat") > -1)
         {
          if ( IS_MATCH(MdF_Apertura, "SX*")
             | IS_MATCH(MdF_Apertura, "DX*")
             )
             {
              // 08.02.2024
              if (VAR_VAL(idx_att, "MdF_VanoY2") < 50)
                 {
                  mdf_elemento_fro = "MdF_CerniereBattenti"
                  COMPONENTI3("mdf_Ferr_eleIn", idx_att, mdf_elemento_fro)
                 // 03.05.2017
                  mdf_da_rit = 0
                  mdf_ins_utente = 0
                  if (mdf_Ferr_eleIn >= 1)
                     {
                      tLav = "CerBat"
                      if (STRLEN(VAR_VAL_STR(mdf_Ferr_eleIn[1], STRCAT("KeyFamRegFacc_", tLav))) == 0)
                         { mdf_da_rit = 1 }

                      // 07.08.2024
                      iInU = 1
                      while (iInU <= mdf_Ferr_eleIn)
                         {
                          if (IS_MATCH(NOME(PADRE(mdf_Ferr_eleIn[iInU], 1)), "MECCANISM*_UTENTE*") )
                             {
                              mdf_ins_utente = mdf_ins_utente+1
                             }
                          iInU = iInU+1
                         }
                     }

                  if (mdf_Ferr_eleIn == mdf_ins_utente)
                     {
                      mdf_Ferr_eleIn = 0
                      mdf_da_rit = 0
                     }

                  if (mdf_Ferr_eleIn == 0  |  VAR_VAL(idx_att, "mdf_ctrl_MdF_Apertura") > 0  |  mdf_da_rit > 0)
                     {
                      CHIAVE_TABVAR_MDF = "CerBat"
                      GOSUB MdF_Variabili
                      // 04.02.2021
                      // 06.11.2019 prima era sopra
                      // - chiamata dopo aver letto CerBat perche li potrei cambiare MdF_archetipo_Fia o magari anche la MdF_distNearBatFia
                      // ma prima di CerBatFro cosi potrei avere le MdfSys_SbordoY gia su VariabiliMdF
                      //// 02.12.2019 PC008990
                      //// In realta se entro qui avrebbe piu senso ricontrollare sempre e comunque anche la Battuta_X
                      //// quindi potrei togliere le if sopra e farla diretta.

                      // 04.02.2021 così e' piu corretto
                      GOSUB MdF_KeyFam_Battuta_X
                      // Su CerBatFro potrei prendere le MdfSys_SbordoY

                      CHIAVE_TABVAR_MDF = "CerBatFro"
                      GOSUB MdF_Variabili

                      GOSUB MdF_pos_CerBat
                      if ( mdf_Ferr_eleIn == 0
                         & VAR_VAL(idx_att, "mdf_added_CerBat_daLoadPers") == 0
                         )
                         {
                          tLav = "CerBat"
                          if (STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                             {
                              // 13.03.2017
                              mdF_Lav_offy_LoadAttRegFacc = mdF_Lav_offy
                              mdf_added_Interat_CerBat = 1
                              // 25.06.2020
                              GOSUB mdf_ShowAbilitaOff_Interat
                              mdf_add_now_MdF_ADD_Reg_Interat = 1
                              // 13.06.2019 Show Abilita Off, On fa sfarfallare la grafica in inserimento da Listino
                              // In realta dipende da COMANDO al posto di COMANDO2. Ora che funziona il flusso della MdF_ADD_Reg_Interat
                              // sarebbe da provare a mettere COMANDO2 in tutti i RELATIVE_ADD
                              // 25.07.2019
                              if (mdf_Load_COMANDO2 == 0)
                                 { COMANDO(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                              else
                                 { COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                             }
                         }
                     // 15.11.2019
                      GOSUB MdF_ricalcola_escl_Incl
                     }
                 }
              else
                 {
                  GOSUB MdF_add_CerBatVY
                 }

             // 15.12.2016
              // Per il momento non uso key CerAngLib, dovrebbe bastare la CerBat
              //CHIAVE_TABVAR_MDF = "CerAngLib"
              //GOSUB MdF_Variabili
              //CHIAVE_TABVAR_MDF = "CerAngLibFro"
              //GOSUB MdF_Variabili

              GOSUB MdF_pos_CerAngLib
              if (STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", tLav))) > 0)
                 {
                  mdf_added_Interat_CerBat = 1
                  mdf_elemento_froAngLib = "MdF_CerniereAngLibro"
                  COMPONENTI3("mdf_Ferr_eleIn", idx_att, mdf_elemento_froAngLib)
                  if ( mdf_Ferr_eleIn == 0
                     & VAR_VAL(idx_att, "mdf_added_CerLib_daLoadPers") == 0
                     )
                     {
                      // 25.06.2020
                      GOSUB mdf_ShowAbilitaOff_Interat
                      mdf_add_now_MdF_ADD_Reg_Interat = 1
                      if (mdf_Load_COMANDO2 == 0)
                         { COMANDO(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_froAngLib," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                      else
                         { COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_froAngLib," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                     }
                 }
             }
         }
      // 06.11.2019 prima era sopra
      // - seconda chiamata per le aperture non Battenti
      mdf_OnInterat_Battuta_X2 = 0
      if ( VAR_EXIST(idx_att, "exitBattuta_SX") != 1
         | VAR_EXIST(idx_att, "exitBattuta_DX") != 1
         | VAR_VAL(idx_att, "Battuta_X") == 0
         )
         {
          mdf_OnInterat_Battuta_X2 = 1
          GOSUB MdF_KeyFam_Battuta_X
         }

      if (STR_INDEX_OF(MdF_bdm_Load, 0, "CerSof") > -1)
         {
          CHIAVE_TABVAR_MDF = "CerSof"
          GOSUB MdF_Variabili
          GOSUB MdF_pos_CerSof
         }
      if ( IS_MATCH(MdF_Apertura, "SX*SOF*")
         | IS_MATCH(MdF_Apertura, "DX*SOF*")
         )
         {
          tLav = "CerSof"
          if (STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", tLav))) > 0)
             {
              mdf_elemento_froCerSof = "MdF_CerniereSoffietto"
              COMPONENTI3("mdf_Ferr_eleIn", idx_att, mdf_elemento_froCerSof)
              if ( mdf_Ferr_eleIn == 0
                 & VAR_VAL(idx_att, "mdf_added_CerSof_daLoadPers") == 0
                 )
                 {
                  // 25.06.2020
                  GOSUB mdf_ShowAbilitaOff_Interat
                  mdf_add_now_MdF_ADD_Reg_Interat = 1
                  if (mdf_Load_COMANDO2 == 0)
                     { COMANDO(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_froCerSof," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                  else
                     { COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_froCerSof," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                 }
             }
         }

      if ( STR_INDEX_OF(MdF_bdm_Load, 0, "CerRib") > -1
         | STR_INDEX_OF(MdF_bdm_Load, 0, "PisAnta") > -1
         | STR_INDEX_OF(MdF_bdm_Load, 0, "PisFia") > -1
         )
         {
          // Non serve entrare in VaribailiMdF con sottochiave CerRib se non sono MdF_Apertura VA RI
          // perché qui la MdF_Apertura deve esser già corretta con la keyGenerica
          if ( IS_MATCH(MdF_Apertura, "VA*") == 1
             | IS_MATCH(MdF_Apertura, "RI*") == 1
             )
             {
              CHIAVE_TABVAR_MDF = "CerRib"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "CerRibFro"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "PisAnta"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "PisAntaFro"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "PisFia"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "PisFiaFro"
              GOSUB MdF_Variabili

              GOSUB MdF_pos_CerRib
              if ( STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "CerRib"))) > 0
                 | STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "PisAnta"))) > 0
                 | STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "PisFia"))) > 0
                 )
                 {
                  mdf_elemento_froCerVaRi = "MdF_CernierePistoneVasRib"
                  COMPONENTI3("mdf_Ferr_eleIn", idx_att, mdf_elemento_froCerVaRi)
                  // 07.08.2024
                  if (mdf_Ferr_eleIn >= 1)
                     {
                      mdf_ins_utente = 0
                      if (IS_MATCH(NOME(PADRE(mdf_Ferr_eleIn[1], 1)), "MECCANISM*_UTENTE*") )
                         {
                          mdf_Ferr_eleIn = mdf_Ferr_eleIn-1
                         }
                     }
                  if ( mdf_Ferr_eleIn == 0
                     & VAR_VAL(idx_att, "mdf_added_CerRib_daLoadPers") == 0
                     )
                     {
                      // 13.03.2017
                      mdF_Lav_offy_LoadAttRegFacc = mdF_Lav_offy
                      // 25.06.2020
                      GOSUB mdf_ShowAbilitaOff_Interat
                      mdf_add_now_MdF_ADD_Reg_Interat = 1
                      if (mdf_Load_COMANDO2 == 0)
                         { COMANDO(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_froCerVaRi," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                      else
                         { COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_froCerVaRi," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                     }
                 }
             }
         }

      if ( STR_INDEX_OF(MdF_bdm_Load, 0, "Par") > -1
         | VAR_VAL(idx_att, "mdf_read_VarMdF_Par") > 0
         )
         {
          if ( VAR_VAL(idx_att, "mdf_Load_Var_maked") <= 0
             | VAR_VAL(idx_att, "mdf_ctrl_MdF_Apertura") > 0
             )
             {
              CHIAVE_TABVAR_MDF = "Par"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "ParFro"
              GOSUB MdF_Variabili
              GOSUB MdF_pos_Paracolpi
             }
          tLav = "Par"
          mdf_elemento_froPar = "MdF_ContParacolpi"
          if (STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", tLav))) > 0)
             {
              COMPONENTI3("mdf_Ferr_eleIn", idx_att, mdf_elemento_froPar)
              if ( mdf_Ferr_eleIn == 0
                 & VAR_VAL(idx_att, "mdf_added_Par_daLoadPers") == 0
                 )
                 {
                  // 25.06.2020
                  GOSUB mdf_ShowAbilitaOff_Interat
                  mdf_add_now_MdF_ADD_Reg_Interat = mdf_add_now_MdF_ADD_Reg_Interat+1
                  if (mdf_Load_COMANDO2 == 0)
                     { COMANDO(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_froPar," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                  else
                     { COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_froPar," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                 }
             }
          else
             {
              // 07.07.2020 SN01822
              if (VAR_VAL(idx_att, "mdf_ctrl_Change_Apertura") > 0)
                 {
                  COMPONENTI3("mdf_Ferr_eleIn", idx_att, mdf_elemento_froPar)
                  GOSUB MdF_ELIMINA_x_NoKey
                 }
             }
         }

      if ( STR_INDEX_OF(MdF_bdm_Load, 0, "ParInt") > -1
         | VAR_VAL(idx_att, "mdf_read_VarMdF_Par") > 0
         )
         {
          if ( VAR_VAL(idx_att, "mdf_Load_Var_maked") <= 0
             | VAR_VAL(idx_att, "mdf_ctrl_MdF_Apertura") > 0
             )
             {
              CHIAVE_TABVAR_MDF = "ParInt"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "ParIntFro"
              GOSUB MdF_Variabili
              GOSUB MdF_pos_ParacolpiInt
             }
          tLav = "ParInt"
          mdf_elemento_froPar = "MdF_ContParacolpiInt"
          if (STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", tLav))) > 0)
             {
              COMPONENTI3("mdf_Ferr_eleIn", idx_att, mdf_elemento_froPar)
              if ( mdf_Ferr_eleIn == 0
                 & VAR_VAL(idx_att, "mdf_added_Par_daLoadPers") == 0
                 )
                 {
                  // 25.06.2020
                  GOSUB mdf_ShowAbilitaOff_Interat
                  mdf_add_now_MdF_ADD_Reg_Interat = mdf_add_now_MdF_ADD_Reg_Interat+1
                  if (mdf_Load_COMANDO2 == 0)
                     { COMANDO(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_froPar," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                  else
                     { COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_froPar," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0")) }
                 }
             }
          else
             {
              // 07.07.2020 SN01822
              if (VAR_VAL(idx_att, "mdf_ctrl_Change_Apertura") > 0)
                 {
                  COMPONENTI3("mdf_Ferr_eleIn", idx_att, mdf_elemento_froPar)
                  GOSUB MdF_ELIMINA_x_NoKey
                 }
             }
         }

      if (STR_INDEX_OF(MdF_bdm_Load, 0, "FerGen") > -1)
         {
          if ( VAR_VAL(idx_att, "mdf_Load_Var_maked") <= 0
             | VAR_VAL(idx_att, "mdf_ctrl_MdF_Apertura") > 0
             )
             {
              CHIAVE_TABVAR_MDF = "FerGen"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "FerGenFro"
              GOSUB MdF_Variabili
             // 04.02.2021 prima era fuori dall' if ma se su KeyFamRegFacc uso VariabiliMdF e non sono entrato mi va in errore
              GOSUB MdF_pos_FerramenteGen
             }

          tLav = "FerGen"
          if (STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", tLav))) > 0)
             {
              mdf_elemento_FerGen = "MdF_FerramenteGeneriche"
              COMPONENTI3("mdf_Ferr_eleIn", idx_att, mdf_elemento_FerGen)
              if ( mdf_Ferr_eleIn == 0
                 & VAR_VAL(idx_att, "mdf_added_FerGen_daLoadPers") == 0
                 )
                 {
                  // 25.06.2020
                  GOSUB mdf_ShowAbilitaOff_Interat
                  mdf_add_now_MdF_ADD_Reg_Interat = mdf_add_now_MdF_ADD_Reg_Interat+1
                  // 10.07.2019 SL30549
                  // Se ripasso subito per un VAR_CHANGE COMPONENTI2 o 3 non lo trova
                  // Gli altri MdF_ funzionano perche' hanno l' ELIMINA mdf_gia_inserito
                  // In futuro sara da cambiare tutti in COMANDO2. Prima non potevo, adesso che
                  // il flusso e' consolidato e c'e' la MdF_Ctrl_var_gest allora si puo pensare
                  COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_FerGen," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0"))
                 }
             }
         }

      if (STR_INDEX_OF(MdF_bdm_Load, 0, "FerCri") > -1)
         {
          if ( VAR_VAL(idx_att, "mdf_Load_Var_maked") <= 0
             | VAR_VAL(idx_att, "mdf_ctrl_MdF_Apertura") > 0
             )
             {
              CHIAVE_TABVAR_MDF = "FerCri"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "FerCriFro"
              GOSUB MdF_Variabili
              // prima era fuori dall' if ma se su KeyFamRegFacc uso VariabiliMdF e non sono entrato mi va in errore
              GOSUB MdF_pos_FerGenCri
             }

          tLav = "FerCri"
          if (STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", tLav))) > 0)
             {
              mdf_elemento_FerCri = "MdF_FerramenteGenCri"
              COMPONENTI3("mdf_Ferr_eleIn", idx_att, mdf_elemento_FerCri)
              if ( mdf_Ferr_eleIn == 0
                 & VAR_VAL(idx_att, "mdf_added_FerCri_daLoadPers") == 0
                 )
                 {
                  // 25.06.2020
                  GOSUB mdf_ShowAbilitaOff_Interat
                  mdf_add_now_MdF_ADD_Reg_Interat = mdf_add_now_MdF_ADD_Reg_Interat+1
                  // Se ripasso subito per un VAR_CHANGE COMPONENTI2 o 3 non lo trova
                  // Gli altri MdF_ funzionano perche' hanno l' ELIMINA mdf_gia_inserito
                  // In futuro sara da cambiare tutti in COMANDO2. Prima non potevo, adesso che
                  // il flusso e' consolidato e c'e' la MdF_Ctrl_var_gest allora si puo pensare
                  COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_FerCri," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0"))
                 }
             }
         }

      if ( STR_INDEX_OF(MdF_bdm_Load, 0, "FerFro") > -1
         | STR_INDEX_OF(MdF_bdm_Load, 0, "FerFia") > -1
         | STR_INDEX_OF(MdF_bdm_Load, 0, "FerPia") > -1
         )
         {
          $mdf_indice_riga = 1
          $mdf_quante_RegFacc = 4
          GOSUB MdF_Var_Ferramente
          // In KeyFamRegFacc basta che passi una volta, è in RegFacc che verifica quanti
          // elementi Fer ci sono
          tLav = "FerFro"
          GOSUB MdF_KeyFamRegFacc
          tLav = "FerFia"
          GOSUB MdF_KeyFamRegFacc
          tLav = "FerPia"
          GOSUB MdF_KeyFamRegFacc

          if ( STRLEN(VAR_VAL_STR(idx_att, "KeyFamRegFacc_FerFro")) > 0
             | STRLEN(VAR_VAL_STR(idx_att, "KeyFamRegFacc_FerFia")) > 0
             | STRLEN(VAR_VAL_STR(idx_att, "KeyFamRegFacc_FerPia")) > 0
             )
             {
              $mdf_indice_riga = 1
              $mdf_quante_RegFacc = 4

              while($mdf_indice_riga < 16)
                 {
                  GOSUB MdF_pos_Ferramente
                  if ( VAR_EXIST(idx_att, "Escludi_FerFro1") | VAR_EXIST(idx_att, "Escludi_FerFro2")
                     | VAR_EXIST(idx_att, "Escludi_FerFia1") | VAR_EXIST(idx_att, "Escludi_FerFia2")
                     | VAR_EXIST(idx_att, "Escludi_FerPia1") | VAR_EXIST(idx_att, "Escludi_FerPia2")
                     | VAR_EXIST(idx_att, "Escludi_FerFro3") | VAR_EXIST(idx_att, "Escludi_FerFro4")
                     | VAR_EXIST(idx_att, "Escludi_FerFia3") | VAR_EXIST(idx_att, "Escludi_FerFia4")
                     | VAR_EXIST(idx_att, "Escludi_FerPia3") | VAR_EXIST(idx_att, "Escludi_FerPia4")
                     )
                     {
                      mdf_elemento_4Reg = "MdF_Ferramente_4Reg"
                      COMPONENTI3("mdf_Ferr_4RegIn", idx_att, mdf_elemento_4Reg)
                      iFe=1
                      ferrADDED=0
                      while (iFe <= mdf_Ferr_4RegIn)
                         {
                          if (VAR_VAL(mdf_Ferr_4RegIn[iFe], "indice_riga") == $mdf_indice_riga)
                             { ferrADDED=1 }
                          iFe = iFe+1
                         }
                      // La gestione COMANDO2 con ELELMENTO_I da errore nel flusso M4 in inserimento elemento nella stanza
                      if ( ferrADDED == 0
                         & VAR_VAL(idx_att, "mdf_added_Fer4Reg_daLoadPers") == 0
                         )
                         {
                          // 25.06.2020
                          GOSUB mdf_ShowAbilitaOff_Interat
                          mdf_add_now_MdF_ADD_Reg_Interat = mdf_add_now_MdF_ADD_Reg_Interat+1
                          // 24.06.2019
                          // Non da errore in inserimento da Listino forse perche' non uso ELEMENTO_I
                          // o forse perche' adesso il flusso della MdF_ADD_Reg_Interat e' sistemato
                          // Comunque senza OnMdF_AttrezzaRegFac entra di qua, ma usando COMANDO poi
                          // COMPONENTI2 non trova l' elemento appena aggiunto e quindi salta indice_riga
                          COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_4Reg," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy)," ",STR(mdF_Lav_offz) ," 0"))
                         }
                      COMPONENTI2("mdf_Ferr_4RegIn", idx_att, mdf_elemento_4Reg)
                      iFe=1
                      while (iFe <= mdf_Ferr_4RegIn)
                         {
                          if (VAR_EXIST(mdf_Ferr_4RegIn[iFe], "indice_riga") != 1)
                             {
                              VAR_VALUE_SET(mdf_Ferr_4RegIn[iFe], "indice_riga", $mdf_indice_riga)
                              VAR_VALUE_SET(mdf_Ferr_4RegIn[iFe], "quante_RegFacc", $mdf_quante_RegFacc)
                             }
                          iFe = iFe+1
                         }

                      DEL_VAR(idx_att, "Escludi_Fer*")
                     }

                  $mdf_indice_riga = $mdf_indice_riga+4
                 }
              mdf_indice_riga = $mdf_indice_riga
             }
          DEL_VAR(idx_att, "mdf_quante_RegFacc")
         }

      if ( STRLEN(MdF_bdm_Load) > 1
         & STRLEN(VAR_VAL_STR(idx_att, "MdF_Apertura")) > 1
         )
         { mdf_Load_Var_maked = 1.12 }

      DEL_VAR(-1, "mdf_*")
      // Se arrivo qui significa che ho aggiunto un MdF_ quindi controllo se ha i punti notevoli corretti
      if (mdf_add_now_MdF_ADD_Reg_Interat > 0)
         {
          MdF_ADD_Reg_Interat = 1

         // 27.02.2025 PK Se aggiungo solo i paracolpi su CassCest e poi cambio la Y non elimina gli MdF_perchè manca il riferimento iniziale
         // 03.03.2025 PK in realtà deve sempre essere aggiornato, perchè se cambia la Y deve riaggiornarsi
          //if (VAR_EXIST(idx_att, "mdF_Lav_offy_LoadAttRegFacc") != 1)
          //   {
              mdF_Lav_offy_LoadAttRegFacc = mdF_Lav_offy
          //   }

          // 13.03.2017
          // 24.06.2019 ACTION 3 messo in else
          if (VAR_VAL(idx_att, "mdf_rel_ADD_bas0y_LoadARF_Error") > 0)
             {
              mdf_rel_ADD_bas0y_LoadARF_Error = 0
              if (mdf_Load_COMANDO2 == 0)
                 { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " per MdF_Ctrl_Dim per MdF_ADD_Reg_Interat")) }
              else
                 { COMANDO2(STRCAT("LOGMSG MdF_ADD_Reg_Interat ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " per MdF_Ctrl_Dim per MdF_ADD_Reg_Interat")) }
             }
          else
             {
              // 12.03.2019
              if (ACTION() == 3)
                 {
                  if (mdf_Load_COMANDO2 == 0)
                     {
                      // 24.01.2020 verificare msg_err_loop
                      mdf_debug_MdF_offy_REL_ADD = VAR_VAL(idx_att, "MdF_offy_REL_ADD")
                      // 01.07.2020
                      // 31.05.2022
                      if ($MdF_Esegui_Show_Abilita_Act > 0)
                         { COMANDO(STRCAT("SHOW Abilita On   // MdF_ADD_Reg_Interat ACTION 3 idx=", STR(idx_att), " ", NOME(idx_att))) }
                      COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " per mdf_add_now_MdF_ADD_Reg_Interat"))
                     }
                  else
                     {
                      // 01.07.2020 altrimenti se ricalcola prima della fine non fa lo Show On perche ricalcolandosi mdf_add_now_MdF_ADD_Reg_Interat torna a 0
                      // Succede con colonna falegnameria R5040, attrezzi prima anta da 0 a 72 ok, attrezzi la seconda e non viene visualizzata
                      //COMANDO2(STRCAT("SHOW Abilita On   // MdF_ADD_Reg_Interat ACTION 3 idx=", STR(idx_att), " ", NOME(idx_att)))
                      //// 04.11.2019 Con Flusso corretto vedi PCL001953 altrimenti alcune volte le MdF_Cer non sono posizionate corrette
                      //COMANDO2(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " per mdf_add_now_MdF_ADD_Reg_Interat"))
                      // 01.07.2020 riprovato PCL001953 e ora funziona, quindi lascio solo un log temporaneo
                      //COMANDO2(STRCAT("LOGMSG 01.07.2020 temporaneo PCL001953 ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " per mdf_add_now_MdF_ADD_Reg_Interat"))
                      mdf_log_PCL001953 = 1
                      // 31.05.2024 5461CO Se cambio l' Anta Inf COL Frigo in anta Maxxi con sbordo Inf
                      // A questo punto con le ottimizzazioni ma anche senza ottimizzazioni posso intanto fare così
                      if (CMD() == 1)
                         {
                          COMPONENTI2("mdf_added_prec", idx_att, "MdF_Cerniere*")
                          iAp = 1
                          mecc_ute_prec = 0
                          while (iAp <= mdf_added_prec)
                             {
                              if (IS_MATCH(NOME(PADRE(mdf_added_prec[iAp], 1)), "MECCANISM*_UTENTE*") )
                                 {
                                  mecc_ute_prec = mecc_ute_prec+1
                                 }
                              iAp = iAp+1
                             }
                          if (mdf_added_prec-mecc_ute_prec > 0)
                             {
                              // 17.07.2024 PolK 2024_POK6_AG100_00442 In realta effettivamente dovrebbe bastare una volta.
                              // Dipende da MdF_Pan_X che fa entrare in GOSUB MdF_Ctrl_ADD_TooEarly che poi fa COMANDO e non COMANDO2
                              // Per ora lascio commentato perchè corretto MdF_Ctrl_Post_RELATIVE_ADD e MdF_Ctrl_ADD_TooEarly
                              //if (VAR_VAL(idx_att, "MdF_Ctrl_Post_REL_ADD_working") <= 0)
                              //   {
                              //    MdF_Ctrl_Post_REL_ADD_working = 1
                                  COMANDO2(STRCAT("Procedura MdF_Ctrl_Post_RELATIVE_ADD ", STR(mdf_added_prec[1]), " // MdF_ADD_Reg_Interat per mdf_add_now_MdF_ADD_Reg_Interat mdf_log_PCL001953 da=", STR(idx_att), " idxPdr=", STR(PADRE(idx_att, -1)), " ", NOME(PADRE(idx_att, -1))))
                              //   }
                              //else
                              //   {
                              //    MdF_Ctrl_Post_REL_ADD_working = -1
                              //   }
                              GOSUB MdF_Ctrl_IS_IDX_sat
                             }
                         // 05-06.09.2024 Se ho solo Ferramente devo farlo fuori
                          COMPONENTI2("meccUte_added_prec", idx_att, "MECCANISM*_UTENTE*")
                          if (meccUte_added_prec > 0)
                             {
                              if (VAR_VAL_STR(meccUte_added_prec[1], "chiave_tab_cam") == "UTENTE")
                                 {
                                  COMANDO("Procedura MdF_Ctrl_Post_LoadOrder")
                                 }
                             }
                         }
                     }
                 }
              else
                 {
                  // 10.07.2019 SL009950, 12638
                  // 25.07.2019
                  if (mdf_Load_COMANDO2 == 0)
                     {
                      // 01.07.2020
                      // 31.05.2022
                      if ($MdF_Esegui_Show_Abilita_Act > 0)
                         { COMANDO(STRCAT("SHOW Abilita On   // MdF_ADD_Reg_Interat ACTION 1no3 idx=", STR(idx_att), " ", NOME(idx_att))) }
                      COMANDO("Procedura MdF_Ctrl_Post_RELATIVE_ADD // MdF_ADD_Reg_Interat per mdf_add_now_MdF_ADD_Reg_Interat")
                     }
                  else
                     {
                      // Vedi PCP001676 altrimenti alcune volte le MdF_Cer non sono posizionate corrette
                      // 07.07.2020 Forse non serve piu
                      // 04.09.2020 PCL003217
                      // 17.09.2020 2020PCL008093 Non c'e' un motivo apparente per cui in certi ordini serve e in altri no
                      // Il problema e' che il calcolo di MdF_Ctrl_Post_RELATIVE_ADD, per cui si rende necessario il ricalcola per punti notevoli, entra nel ricalcolo anche in casi in cui non servirebbe.
                      // L' unico modo per limitare e' COMANDO al posto di COMANDO2 e del singolo idx, cioe del singolo MdF_ appena aggiunto
                      // 01.10.2020 per mdf_ADD_Reg_Interat_PostV
                      mdf_MdF_Ctrl_Post_RELATIVE_ADD = 0
                      if (ACTION() == 1  &  CMD() == 1)   { mdf_MdF_Ctrl_Post_RELATIVE_ADD = 1 }
                      if (mdf_ADD_Reg_Interat_PostV > 0)  { mdf_MdF_Ctrl_Post_RELATIVE_ADD = 2 }

                      if (mdf_MdF_Ctrl_Post_RELATIVE_ADD > 0)
                         {
                          COMPONENTI2("mdf_added_now", idx_att, "MdF_Cerniere*")
                          if (mdf_added_now > 0)
                             {
                             // 06.07.2021 P009135 Vedi CucP_OnChangedMisure
                              // Se serve impostare MdF_Post_RELATIVE_ADD_COMANDO2=1 molto probabilmente significa che c'e' qualche problema nelle dimensioni dell' elemento in questione
                              // o che le dimensioni frontale arrivano "troppo" tardi
                              // 16.03.2022 Vedi anche VD 841753 aggiunto MdF_Post_RELATIVE_ADD_COMANDO2 = 1 se if (ACTION() > 0  &  VAR_VAL(-1, "OnLoadOrder") == 0)
                              if (VAR_VAL(idx_att, "MdF_Post_RELATIVE_ADD_COMANDO2") < 1)
                                 {
                                  // 28.05.2024 AOCL079990
                                  if (VAR_VAL(-1, "OnLoadOrder2") == 0)
                                     { COMANDO(STRCAT("Procedura MdF_Ctrl_Post_RELATIVE_ADD ", STR(mdf_added_now[1]), " // da ", STR(idx_att), " MdF_ADD_Reg_Interat per mdf_add_now_MdF_ADD_Reg_Interat idxPdr=", STR(PADRE(idx_att, -1)), " ", NOME(PADRE(idx_att, -1)) )) }
                                  else
                                     {
                                      // 28.05.2024 AOCL079990 Se richiamo con COMANDO in modo generale, anche se lo chiamo per tutti invece che con l' idx
                                      // se poi non trovo punti notevoli sfalsati non fa il ricalcola_una per nessuno perchè magari nel frattempo è già stato fatto
                                      // un ricalcolo del padre. E anche se lo fanno tutti i CamMdFrontali comunque se appunto non trova punti notevoli sfalsati esce subito
                                      // impiegando solo 16 millesimi o addirittura 0 e se anche facesse il ricalcola_una di qualche MdF_ in ogni caso lo farebbe solo una
                                      // volta come prima
                                      // Teoricamente in questo modo non dovrebbe piu dare errori in Coda comandi.
                                      // C'è anche da dire che se c'è l' ottimizzazione MdF_Ctrl_var_gest_MdF il ricalcola_una impiegherebbe solo 30 millesimi per Frontale che arriva qui.
                                      // Ma alla fine impiegherebbe lo stesso tempo di richiamare MdF_Ctrl_Post_RELATIVE_ADD per idx specifico
                                      //COMANDO2(STRCAT("Procedura MdF_Ctrl_Post_RELATIVE_ADD ", STR(mdf_added_now[1]), " // da ", STR(idx_att), " MdF_ADD_Reg_Interat per mdf_add_now_MdF_ADD_Reg_Interat OnLoadOrder2 idxPdr=", STR(PADRE(idx_att, -1)), " ", NOME(PADRE(idx_att, -1)) ))
                                      COMANDO(STRCAT("Procedura MdF_Ctrl_Post_RELATIVE_ADD // MdF_ADD_Reg_Interat per mdf_add_now_MdF_ADD_Reg_Interat OnLoadOrder2 da=", STR(idx_att), " idxPdr=", STR(PADRE(idx_att, -1)), " ", NOME(PADRE(idx_att, -1))))
                                     }
                                 }
                              else
                                 { COMANDO2(STRCAT("Procedura MdF_Ctrl_Post_RELATIVE_ADD ", STR(mdf_added_now[1]), " // da ", STR(idx_att), " MdF_ADD_Reg_Interat per mdf_add_now_MdF_ADD_Reg_Interat 2 idxPdr=", STR(PADRE(idx_att, -1)), " ", NOME(PADRE(idx_att, -1)) )) }
                             }
                         }
                     }
                 }
             }
         }
      else
         {
          // 03.08.2023 La010468 Potrei fare solo per if (mdf_ADD_Reg_Interat_PostV >= 2), ma effettivamente che la MdF_Apertura sia diversa non va bene comunque
          // e non dovrebbe mai capitare. In piu se capita con un Rigenera manuale almeno si sistemerebbe
          if (VAR_EXIST(idx_att, "mdf_added_now") )
             {
              if (mdf_added_now > 0)
                 {
                  // 11.09.2023 In Sn ancora non andava
                  if (IS_IDX(mdf_added_now[1]) )
                     {
                      mdf_cambiata_KeyRegCerBat = 0
                      if (IS_MATCH(NOME(mdf_added_now[1]), "MdF_CerniereBat*") )
                         {
                          if (VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "CerBat"))  != VAR_VAL_STR(mdf_added_now[1], "KeyFamRegFacc") )
                             { mdf_cambiata_KeyRegCerBat = 1 }
                         }
                      if ( VAR_VAL_STR(idx_att, "MdF_Apertura") != VAR_VAL_STR(mdf_added_now[1], "MdF_Apertura")
                         // 06.05.2024 A PCL006466 GEST_344 arriva troppo tardi
                         | mdf_cambiata_KeyRegCerBat > 0
                         | VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "CerRib"))  != VAR_VAL_STR(mdf_added_now[1], "KeyFamRegFacc_CerRib")
                         | VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "PisAnta")) != VAR_VAL_STR(mdf_added_now[1], "KeyFamRegFacc_PisAnta")
                         | VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "PisFia"))  != VAR_VAL_STR(mdf_added_now[1], "KeyFamRegFacc_PisFia")
                         )
                         {
                          COMPONENTI2("mdf_added_now", idx_att, "MdF_Cerniere*")
                          SET_#(mdf_added_now[1])
                          #MdF_Cambiato = "MdF_Apertura"
                         // Anche se potrei mettere solo per ACTION() 28 lo faccio comunque perchè come detto non dovrebbe mai capitare
                          if (mdf_Load_COMANDO2 <= 0)
                             { COMANDO(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(mdf_added_now[1]), " // da ", STR(idx_att), " MdF_ADD_Reg_Interat per Controllo MdF_Apertura o KeyFam ACTION 28")) }
                          else
                             { COMANDO2(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(mdf_added_now[1]), " // da ", STR(idx_att), " MdF_ADD_Reg_Interat per Controllo MdF_Apertura o KeyFam ACTION 28 2")) }

                          // Per i sat
                          if ( IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Visualize_sat"), "No*") != 1
                             & STRLEN(VAR_VAL_STR(idx_att, "MdF_Visualize_sat")) > 2
                             )
                             {
                              if (IS_IDX(exitBattuta_SX)  &  IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "SX*") )
                                 {
                                  if (mdf_Load_COMANDO2 <= 0)
                                     { COMANDO(STRCAT("RICALCOLA_UNA ", STR(exitBattuta_SX), " // da ", STR(idx_att), " MdF_ADD_Reg_Interat per Controllo MdF_Apertura o KeyFam ACTION28")) }
                                  else
                                     { COMANDO2(STRCAT("RICALCOLA_UNA ", STR(exitBattuta_SX), " // da ", STR(idx_att), " MdF_ADD_Reg_Interat per Controllo MdF_Apertura o KeyFam ACTION28 2")) }
                                 }
                              if (IS_IDX(exitBattuta_DX)  &  IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "DX*") )
                                 {
                                  if (mdf_Load_COMANDO2 <= 0)
                                     { COMANDO(STRCAT("RICALCOLA_UNA ", STR(exitBattuta_DX), " // da ", STR(idx_att), " MdF_ADD_Reg_Interat per Controllo MdF_Apertura o KeyFam ACTION28")) }
                                  else
                                     { COMANDO2(STRCAT("RICALCOLA_UNA ", STR(exitBattuta_DX), " // da ", STR(idx_att), " MdF_ADD_Reg_Interat per Controllo MdF_Apertura o KeyFam ACTION28 2")) }
                                 }
                             }
                         }
                     }
                 }
             }
          else
             {
              // 21.10.2024 Se arrivo qui significa che c'è qualcosa che non va nel flusso Bdm o Versione M4 (come la 325).
              // Perchè non e' possibile che ad oggi sia costretto ad aggiungere queste modifiche

              // 10.03.2025 Ca2450029 Da capire come mai è uscito adesso il problema. Sembra sempre la versione M4 324/325
              if (VAR_EXIST(idx_att, "mdf_added_prec") != 1)
                 {
                  mdf_added_prec_NotExisted = 1
                  COMPONENTI2("mdf_added_prec", idx_att, "MdF_Cerniere*")
                 }

              if (VAR_EXIST(idx_att, "mdf_added_prec") )
                 {
                  if (mdf_added_prec > 0)
                     {
                      if (IS_IDX(mdf_added_prec[1]) )
                         {
                          GOSUB mdf_ADD_Ctrl_Post_ADD_Reg
                         }
                     }
                 }
             }
         }

     // 16.02.2017
      if (VAR_VAL(idx_att, "mdf_ctrl_Change_Apertura") > 0)
         {
          // 07.07.2020 SN01822
          mdf_ctrl_MdF_Apertura = 0
         }

     // 28.11.2023 La VAPI potrebbe essere configurata prima della VAPS e la VAPS non è ancora passata su VariabiliMdF.txt
      if ( VAR_EXIST(idx_att, "mdf_idx_Sat_BasRibVAPI") == 1
         & VAR_EXIST(idx_att, "ric_idx_Sat_BasRibVAPI") != 1
         )
         {
          ric_idx_Sat_BasRibVAPI = 1
          COMPONENTI2("mdf_sat_BRVAP", idx_att, "MdF_Sat_BasRibVAPI")
          if (mdf_sat_BRVAP == 0)
             {
              COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(mdf_idx_Sat_BasRibVAPI, 2)), " no_ridisegna no_agganciati", " // per mdf_idx_Sat_BasRibVAPI"))
             // 05.09.2024
              COMPONENTI2("mdf_MECC_UTE_CerVasRib", PADRE(mdf_idx_Sat_BasRibVAPI, 3), "MECCANISMO_UTENTE_CerVasRib")
              iMU=1
              while(iMU <= mdf_MECC_UTE_CerVasRib)
                 {
                  COMANDO(STRCAT("RICALCOLA_UNA ", STR(mdf_MECC_UTE_CerVasRib[iMU]), " no_ridisegna no_agganciati", " // per mdf_idx_Sat_BasRibVAPI"))
                  iMU = iMU+1
                 }
             }
         }

      // 25.11.2019
      GOSUB MdF_Ctrl_MdF_Visualize_sat

     // 25.06.2020
      if (VAR_VAL(idx_att, "mdf_add_now_MdF_ADD_Reg_Interat") > 0)
         {
          if (mdf_Esegui_Show_Abilita > 0)
             {
              if (mdf_Load_COMANDO2 == 0)
                 {
                  COMANDO(STRCAT("SHOW Abilita On   // MdF_ADD_Reg_Interat idx=", STR(idx_att), " ", NOME(idx_att), " act=", STR(ACTION()) ))
                  // 03.03.2025 PK
                  if (VAR_VAL(idx_att, "MdF_Eliminato") > 0)
                     {
                      // Non ho altro modo di far vedere i paracolpi. Il flusso Bdm non mi pare corretto
                      COMANDO(STRCAT("SHOW All   // MdF_ADD_Reg_Interat per problema flusso Bdm idx=", STR(idx_att), " ", NOME(idx_att), " act=", STR(ACTION()) ))
                     }
                 }
              else
                 {
                  COMANDO2(STRCAT("SHOW Abilita On   // 2 MdF_ADD_Reg_Interat idx=", STR(idx_att), " ", NOME(idx_att), " act=", STR(ACTION()) ))
                  // 25.11.2024 Per ora solo testato ma non cambia molto
                  //MdF_WITH_ALIAS_att("mdf_ADD_Reg_now", "MdF_CAM", idx_att)
                  //iM = 1
                  //while (iM <= mdf_ADD_Reg_now)
                  //   {
                  //    COMANDO2(STRCAT("SHOW Abilita On   // MdF_ADD_Reg_Interat idx=", STR(mdf_ADD_Reg_now[iM]), " da=", NOME(idx_att), " act=", STR(ACTION()) ))
                  //    iM = iM+1
                  //   }

                  // 11.03.2024 A 5447C
                  if (VAR_VAL(idx_att, "MdFSys_Esegui_Show_Abilita") > 0)
                     {
                      // 13.03.2024
                      if (VAR_EXIST(idx_att, "exitBattuta_SX") )
                         {
                          if (IS_IDX(exitBattuta_SX) )
                             { COMANDO2(STRCAT("Show Strutture idx add ", STR(exitBattuta_SX), "  // MdF_ADD_Reg_Interat")) }
                         }
                      if (VAR_EXIST(idx_att, "exitBattuta_DX") )
                         {
                          if (IS_IDX(exitBattuta_DX) )
                             { COMANDO2(STRCAT("Show Strutture idx add ", STR(exitBattuta_DX), "  // MdF_ADD_Reg_Interat")) }
                         }
                      // 25.11.2024 anche se sembra non servire
                      if (VAR_EXIST(idx_att, "mdf_doppio_fiaSx_inY_Battuta_X") )
                         {
                          if (IS_IDX(mdf_doppio_fiaSx_inY_Battuta_X) )
                             { COMANDO2(STRCAT("Show Strutture idx add ", STR(mdf_doppio_fiaSx_inY_Battuta_X), "  // MdF_ADD_Reg_Interat")) }
                         }
                      if (VAR_EXIST(idx_att, "mdf_doppio_fiaDx_inY_Battuta_X") )
                         {
                          if (IS_IDX(mdf_doppio_fiaDx_inY_Battuta_X) )
                             { COMANDO2(STRCAT("Show Strutture idx add ", STR(mdf_doppio_fiaDx_inY_Battuta_X), "  // MdF_ADD_Reg_Interat")) }
                         }
                      MdFSys_Esegui_Show_Abilita = -1
                     }
                 }
             }
         }

      // 25.06.2020
      //if ($MdF_NO_LOGMSG == 0)
      //   {
      //    mdf_Interat_logFine1 = STRCAT("LOGMSG } MdF_ADD_Reg_Interat FINE idx=", STR(idx_att), " ele=", NOME(idx_att))
      //    mdf_Interat_logFine2 = STRCAT("MdF_Apertura=", VAR_VAL_STR(idx_att, "MdF_Apertura"), " , mdf_add_now_MdF_ADD_Reg_Interat=", STR(VAR_VAL(idx_att, "mdf_add_now_MdF_ADD_Reg_Interat")), str_action)
      //    if (mdf_Load_COMANDO2 == 0)
      //       { COMANDO(STRCAT(mdf_Interat_logFine1, " ", mdf_Interat_logFine2, " ", DATA(0))) }
      //    else
      //       { COMANDO2(STRCAT(mdf_Interat_logFine1, " ", mdf_Interat_logFine2, " ", DATA(0))) }
      //   }
   }

   PROCEDURA mdf_ADD_Ctrl_Post_ADD_Reg
   {
       COMPONENTI2("mdf_added_Post", idx_att, "MdF_Cerniere*")
       if (mdf_added_Post <= 0)  { EXITSUB() }

       if (IS_IDX(mdf_added_Post[1]) )
          {
           mdf_cambiata_KeyRegCerBat = 0
           if (IS_MATCH(NOME(mdf_added_Post[1]), "MdF_CerniereBat*") )
              {
               if (VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "CerBat"))  != VAR_VAL_STR(mdf_added_Post[1], "KeyFamRegFacc") )
                  { mdf_cambiata_KeyRegCerBat = 1 }
              }
           if ( VAR_VAL_STR(idx_att, "MdF_Apertura") != VAR_VAL_STR(mdf_added_Post[1], "MdF_Apertura")
              // 06.05.2024 A PCL006466 GEST_344 arriva troppo tardi
              | mdf_cambiata_KeyRegCerBat > 0
              | VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "CerRib"))  != VAR_VAL_STR(mdf_added_Post[1], "KeyFamRegFacc_CerRib")
              | VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "PisAnta")) != VAR_VAL_STR(mdf_added_Post[1], "KeyFamRegFacc_PisAnta")
              | VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "PisFia"))  != VAR_VAL_STR(mdf_added_Post[1], "KeyFamRegFacc_PisFia")
              )
              {
               //COMPONENTI2("mdf_added_Post", idx_att, "MdF_Cerniere*")
               SET_#(mdf_added_Post[1])
               #MdF_Cambiato = "MdF_Apertura"
              // Anche se potrei mettere solo per ACTION() 28 lo faccio comunque perchè come detto non dovrebbe mai capitare
               if (mdf_Load_COMANDO2 <= 0)
                  { COMANDO(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(mdf_added_Post[1]), " // da ", STR(idx_att), " MdF_ADD_Reg_Interat per Controllo mdf_added_Post MdF_Apertura o KeyFam ACTION=", STR(ACTION()))) }
               else
                  { COMANDO2(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(mdf_added_Post[1]), " // da ", STR(idx_att), " MdF_ADD_Reg_Interat per Controllo mdf_added_Post MdF_Apertura o KeyFam 2 ACTION=", STR(ACTION()))) }

               // Per i sat
               if ( IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Visualize_sat"), "No*") != 1
                  & STRLEN(VAR_VAL_STR(idx_att, "MdF_Visualize_sat")) > 2
                  )
                  {
                   if (IS_IDX(exitBattuta_SX)  &  IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "SX*") )
                      {
                       if (mdf_Load_COMANDO2 <= 0)
                          { COMANDO(STRCAT("RICALCOLA_UNA ", STR(exitBattuta_SX), " // da ", STR(idx_att), " MdF_ADD_Reg_Interat per Controllo mdf_added_Post MdF_Apertura o KeyFam ACTION=", STR(ACTION()))) }
                       else
                          { COMANDO2(STRCAT("RICALCOLA_UNA ", STR(exitBattuta_SX), " // da ", STR(idx_att), " MdF_ADD_Reg_Interat per Controllo mdf_added_Post MdF_Apertura o KeyFam 2 ACTION=", STR(ACTION()))) }
                      }
                   if (IS_IDX(exitBattuta_DX)  &  IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "DX*") )
                      {
                       if (mdf_Load_COMANDO2 <= 0)
                          { COMANDO(STRCAT("RICALCOLA_UNA ", STR(exitBattuta_DX), " // da ", STR(idx_att), " MdF_ADD_Reg_Interat per Controllo mdf_added_Post MdF_Apertura o KeyFam ACTION=", STR(ACTION()))) }
                       else
                          { COMANDO2(STRCAT("RICALCOLA_UNA ", STR(exitBattuta_DX), " // da ", STR(idx_att), " MdF_ADD_Reg_Interat per Controllo mdf_added_Post MdF_Apertura o KeyFam 2 ACTION=", STR(ACTION()))) }
                      }
                  }
              }
          }
   }

   PROCEDURA mdf_ADD_Reg_Interat_1
   {
      // 23.04.2020
      if (CAM_loadOrder == 1)
         {
          mdf_ADD_Reg_Interat_Exit1 = 99
          EXITSUB()
         }

      if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1)
         {
          // 16.07.2020
          GOSUB MdF_Elimina_x_DimXY_Change
          if (mdf_ADD_Reg_Interat_XY_Ch != 0)  { EXITSUB() }
          // 29.11.2018
          if (ACTION() == 1)
             {
              if ( VAR_VAL(idx_att, "MdF_Eliminato_action3") < 2
                 // 13.02.2019 Se MdF_ salvati nel rit esempio MdF_Utente="CerBat"
                 & IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "mdf_Load_save_prec") != 1
                 )
                 {
                  // 24.01.2019
                  GOSUB MdF_Ctrl_Apertura_Init
                  if (mdf_aperInit_Vuota == 0)
                     {
                      // 07.07.2020 SN01822
                      GOSUB MdF_ctrl_Change_Apertura_GEST
                      if (VAR_VAL(idx_att, "mdf_ctrl_Change_Apertura") > 0)
                         {
                          mdf_ADD_Reg_Interat_Exit1 = -1
                          EXITSUB()
                         }
                     // 14.06.2022 H22019932 Mansarda LavSp_YpSx,Dx, LavSp_CasoMansarda senza MdF_Load_COMANDO2 = 1
                      // Con MdF_Load_COMANDO2=1 funziona correttamente
                      // Se arrivo qui con MdF_Cambiato Dim* non posso uscire
                      //mdf_ADD_Reg_Interat_Exit1 = 1
                      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "Dim*") != 1)
                         {
                          // 12.12.2024 Con piu vani rientro
                          if (VAR_VAL(idx_att, "MdF_VanoY2") < 50)
                             {
                              // 20.03.2025 H. 201048401
                              MdF_WITH_ALIAS_att("mdf_FerrPostCtrlDim", "MdF_CerBat", idx_att)
                              GOSUB MdF_Ctrl_idx_Battuta_SXDX_PCD

                              mdf_ADD_Reg_Interat_Exit1 = 1
                             }
                         }
                      else
                         { mdf_ADD_Reg_Interat_Exit1 = -2 }

                      EXITSUB()
                     }
                 }
             }
          if (VAR_EXIST(idx_att, "MdF_Eliminato") )
             {
              DEL_VAR(idx_att, "MdF_Eliminato")
             }
         }
   }

   PROCEDURA mdf_ADD_Reg_Interat_3
   {
      // Non va bene. Problema ACTION 3 anche con RICALCOLA_UNA da Bdm
      // se Load_pers $MdF_Load_pers_CMD=0
      if ( IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "Dim*") != 1
         & IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "mdf_Load_save_prec") != 1
         )
         {
          // 02.03.2017
          if (VAR_EXIST(idx_att, "MDFSys_Load_ini") != 1)  { GOSUB MdF_Var_Ini }

          if ( IS_MATCH(MDFSys_Load_ini, "OnMacro*") == 1
             | STRLEN(MDFSys_Load_ini) < 1
             )
             {
              if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "mdf_Load_save_prec") != 1)
                 {
                  if (STRLEN(VAR_VAL_STR(-1, "MdF_Load_att")) == 0)  { EXITSUB() }

                  // 13.03.2025 H Il flusso non era tanto lineare. Avendo sistemato MdF_Var_Ini non passa piu di qua
                  // Prima chiama MdF_CamMdFrontali pertanto impostava $MdF_Utente quindi la MdF_Var_Ini usciva subito
                  // e MDFSys_Load_ini rimaneva sempre vuota. Ci passa se effettivamente MdF_Load è vuota su cam.ini
                  if (STRCMP(VAR_VAL_STR(-1, "MdF_Load_att"), "OnLoadedOrder") == 0)
                     {
                      // 22.06.2018
                      if (mdf_onInterat_sat == 0)
                         {
                          mdf_ADD_Reg_Int_entry3 = 1
                          mdf_ADD_Reg_Interat_Exit3 = 1
                          EXITSUB()
                         }
                     }
                 }
             }
         // 13.03.2025 H Il flusso non era tanto lineare. Vedi commento sopra
          if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "mdf_Load_save_prec") != 1)
             {
              if (STRCMP(MDFSys_Load_ini, "NoOnLoadedOrder") == 0)
                 {
                  if (mdf_onInterat_sat == 0)
                     {
                      if (VAR_EXIST(idx_att, "mdf_ADD_Reg_Interat_Entry3") != 1)
                         { mdf_ADD_Reg_Interat_Entry3 = 0 }
                      mdf_ADD_Reg_Interat_Entry3 = mdf_ADD_Reg_Interat_Entry3+1

                      if (mdf_ADD_Reg_Interat_Entry3 <= 2)  { mdf_ADD_Reg_Interat_Exit3 = 2 }

                     // 28.04.2025 Ca2515108 Se ci passo 2 volte allora li aggiungo. Poi arrivati ad oggi 2025 sarebbero da aggiungere sempre e basta
                      // Poi al rienrto successivo ci pensa mdf_ADD_Reg_Interat_Exit1=1
                      if (mdf_ADD_Reg_Interat_Entry3 == 2)
                         {
                          MdF_WITH_ALIAS_att("mdf_FerrInteratE3", "MdF_CAM", idx_att)
                          if (mdf_FerrInteratE3 == 0)
                             {
                              mdf_ADD_Reg_Interat_Exit3 = -2
                             }
                         }
                     }
                 }
             }
         }
   }

   PROCEDURA mdf_ADD_Reg_Interat_4
   {
      // Per le collisioni al momento lo lascio entrare per ACTION 2
      //if (ACTION() == 2)     { EXITSUB() }

      // 07.07.2020 SN01822
      if (VAR_VAL(idx_att, "mdf_ctrl_Change_Apertura") > 0)
         {
          mdf_ADD_Reg_Interat_Exit4 = -1
          EXITSUB()
         }

      if ( IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "Dim*") != 1
         & IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "mdf_Load_save_prec") != 1
         // 24.01.2019
         & VAR_VAL(idx_att, "mdf_aperInit_Vuota") == 0
         )
         {
          if ( VAR_VAL(idx_att, "mdf_add_PostControl") == 0
            // 02.12.2019
             & STRCMP(VAR_VAL_STR(idx_att, "MdF_Visualize_sat"), VAR_VAL_STR(idx_att, "MdF_Visualize_sat_prec")) == 0
             )
             {
              if (mdf_onInterat_sat == 0)
                 {
                  mdf_cmd_ins = CMD()
                  if (CMD() != 0)
                     {
                      if (ACTION() != 2)
                         {
                          mdf_ADD_Reg_Interat_Exit4 = 1
                          EXITSUB()
                         }
                     }
                 }
              if (mdf_onInterat_sat == 3)
                 {
                  if (ACTION() != 3)
                     {
                      if (CMD() != 0)
                         {
                         // 22.01.2021
                          if (VAR_VAL(-1, "MdF_LoadOrder") != 0)
                             {
                             // 23.10.2024 Flusso Feb in inserimento Base con anta da Listino
                              // Prima Veste anche il _Frontale e dopo mette l' MdF_
                              if (ACTION() == 2)
                                 { mdf_ADD_Reg_Interat_Exit4 = 2.1 }
                              // 16.07.2024 PK 2021OVB609565_Pol. Passa per ACTION() 1
                              // 12.12.2024
                              //COMPONENTI2("mdf_FerrInterat4", idx_att, "MdF_*")
                              MdF_WITH_ALIAS_att("mdf_FerrInterat4", "MdF_CAM", idx_att)
                              if (mdf_FerrInterat4 > 0)
                                 {
                                  // 12.12.2024 Con piu vani rientro
                                  if (VAR_VAL(idx_att, "MdF_VanoY2") < 50)
                                     { mdf_ADD_Reg_Interat_Exit4 = 2 }
                                  else
                                     {
                                      COMPONENTI2("mdf_CerVaniY", idx_att, "MdF_CerniereBattVY*")
                                      if (mdf_CerVaniY > 0)
                                         { mdf_ADD_Reg_Interat_Exit4 = 2.2 }
                                     }
                                  EXITSUB()
                                 }
                             }
                         }
                     }
                  else
                     {
                      // 29.11.2018
                      mdf_cmd_caric = CMD()
                      mdf_act_caric = ACTION()
                      if (mdf_cmd_caric != 0  &  mdf_cmd_caric != 1)  { EXITSUB() }
                      //DISPLAY2(STRCAT("mdf_cmd_caric=", STR(mdf_cmd_caric), " act_caric=", STR(mdf_act_caric)))
                      if (mdf_cmd_caric == 1)
                         {
                         // 15.11.2021
                          mdf_inser_daLis = 0
                          if (VAR_EXIST(idx_att, "mdf_aperInit_Vuota") != 1)
                             {
                              mdf_inser_daLis = 0.1
                              if ( STR_INDEX_OF(VAR_VAL_STR(idx_att, "MdF_Ctrl_var_gest"), 0, "base") > -1
                                 | STR_INDEX_OF(VAR_VAL_STR(idx_att, "MdF_Ctrl_var_gest"), 0, "alto") > -1
                                 )
                                 { mdf_inser_daLis = 1 }
                             }
                          if (mdf_inser_daLis <= 0)
                             {
                              // 15.11.2024 Per avere meno variabili sugli elementi
                              //COMPONENTI2("mdf_FerSat_CMD1_ACT3", idx_att, "MdF_*")
                              MdF_WITH_ALIAS_att("mdf_FerSat_CMD1_ACT3", "MdF_CAM", idx_att)
                             // 02.09.2024
                              mdf_Ferr_presentCM1A3 = 0
                              iSa=1
                              while (iSa <= mdf_FerSat_CMD1_ACT3)
                                 {
                                  if ( HAS_ALIAS(mdf_FerSat_CMD1_ACT3[iSa], "MdF_CAM")
                                     & IS_MATCH(NOME(PADRE(mdf_FerSat_CMD1_ACT3[iSa], 1)), "MECCANISM*_UTENTE*") != 1
                                     & IS_MATCH(NOME(mdf_FerSat_CMD1_ACT3[iSa]), "MECCANISM*_UTENTE*") != 1
                                     )
                                     {
                                      mdf_Ferr_presentCM1A3 = 1
                                      mdf_Ferr_presCM1A3_idx = mdf_FerSat_CMD1_ACT3[iSa]
                                     }
                                  iSa = iSa+1
                                 }

                              //if (mdf_FerSat_CMD1_ACT3 > 0)
                              if (mdf_Ferr_presentCM1A3 > 0)
                                 {
                                  mdf_ADD_Reg_Interat_Exit4 = 3
                                  EXITSUB()
                                 }
                             }
                         }
                     }
                 }
             }
         }
   }

   // 26.07.2019 AOES001178
   PROCEDURA mdf_verify_Battuta_X
   {
      if (ACTION() != 3)  { EXITSUB() }

      // 07.10.2019 H18004799 troppo presto e non ha la Battuta_X perche non trova Fianchi_vic.
      // Avendo aggiunto MdF_Ctrl_Post_RELATIVE_ADD alla fine di MdF_ADD_Reg_Interat non funzionava piu
      //if (ABS(VAR_VAL(idx_att, "Battuta_X")) < 11)  { EXITSUB() }
      if (VAR_EXIST(idx_att, "Battuta_X") != 1)  { EXITSUB() }

      mdf_idx_BattutaFiaDx = VAR_VAL(idx_att, "exitBattuta_DX")
      mdf_idx_BattutaFiaSx = VAR_VAL(idx_att, "exitBattuta_SX")
      mdf_verify_Battuta_X = 0
      if (ABS(VAR_VAL(idx_att, "Battuta_X")) >= 11)
         {
          if (IS_IDX(mdf_idx_BattutaFiaSx) )
             {
              if ( ABS(VAR_VAL(idx_att, "Battuta_X")) > VAR_VAL(mdf_idx_BattutaFiaSx, "X")
                 & ABS(VAR_VAL(idx_att, "Battuta_X")) > 20
                 )
                 { mdf_verify_Battuta_X = 1 }

             // 25.01.2021 Ca2048039 riprovo solo un' altra volta a calcolare la Battuta_X
              // Teoricamente con un Fianco sp.25 l' anta va circa a metà fianco altrimenti difficilmente si apre con una Battuta_X di 23.2
              // o dovresti avere delle cerniere particolari
              // In ogni caso tento solo di ricalcolare/ricontrollare la Battuta
              if ( VAR_VAL(mdf_idx_BattutaFiaSx, "X") > 22
                 & ABS(VAR_VAL(idx_att, "Battuta_X")) > 22
                 // ho solo un fianco perche sono anta doppia
                 & VAR_VAL(idx_att, "Battuta_DX") == 0
                 & VAR_EXIST(idx_att, "mdf_ctrl_BattutaX_2Time") != 1
                 )
                 {
                  mdf_ctrl_BattutaX_2Time = 1
                  mdf_verify_Battuta_X = 1.1
                 }
             }
          if (IS_IDX(mdf_idx_BattutaFiaDx) )
             {
              if ( ABS(VAR_VAL(idx_att, "Battuta_X")) > VAR_VAL(mdf_idx_BattutaFiaDx, "X")
                 & ABS(VAR_VAL(idx_att, "Battuta_X")) > 20
                 )
                 { mdf_verify_Battuta_X = 2 }
             }
         }
      // 07.10.2019 H18004799 troppo presto e non ha la Battuta_X perche non trova Fianchi_vic.
      // Avendo aggiunto MdF_Ctrl_Post_RELATIVE_ADD alla fine di MdF_ADD_Reg_Interat non funzionava piu
      // In ogni caso può rimanere per sicurezza
      if (VAR_VAL(idx_att, "Battuta_X") == 0)
         {
          if (VAR_EXIST(idx_att, "MdF_Apertura") == 1)
             {
              if (VAR_VAL(idx_att, "mdf_add_now_MdF_ADD_Reg_Interat") > 0)
                 { mdf_verify_Battuta_X = 3 }
             }
         }

      if (mdf_verify_Battuta_X > 0)  { GOSUB MdF_KeyFam_Battuta_X }
   }

   PROCEDURA mdf_ADD_Reg_Interat_6
   {
      // 15.11.2024 Per avere meno variabili sugli elementi
      //COMPONENTI3("mdf_FerrE6", idx_att, "MdF_*")
      MdF_WITH_ALIAS_att_ESCL("mdf_FerrE6", "MdF_CAM", idx_att)
      // 31.07.2024 Non va bene se su Frontale ANP ho gli MdF_Sat* gia aggiunti dall' altro Frontale
      // Strano non sia mai uscito prima
      mdf_Ferr_present = 0
      iSa=1
      while (iSa <= mdf_FerrE6)
         {
          if ( HAS_ALIAS(mdf_FerrE6[iSa], "MdF_CAM")
             // 02.09.2024
             & IS_MATCH(NOME(PADRE(mdf_FerrE6[iSa], 1)), "MECCANISM*_UTENTE*") != 1
             & IS_MATCH(NOME(mdf_FerrE6[iSa]), "MECCANISM*_UTENTE*") != 1
             )
             {
              mdf_Ferr_present = 1
              mdf_FerrE6_pres_idx = mdf_FerrE6[iSa]
             }
          iSa = iSa+1
         }

      //if (mdf_Ferr > 0)
      if (mdf_Ferr_present > 0)
         {
         // 16.02.2017
         // 17.05.2024 In realta è già filtrato nella procedura, quindi non dovrebbe nemmeno esserci il controllo su ACTION()
         // 06.06.2024 NO!!! mdf_ADD_Reg_Interat_1 controlla gia ACTION() 1, quindi se la rifaccio qui me la potrebbe portare a 0
         // A068310 Frigo autoportante
          if (ACTION() == 3)  { GOSUB MdF_ctrl_Change_Apertura_GEST }

          if (ACTION() == 1)
             {
              if (VAR_VAL(idx_att, "mdf_ctrl_Change_Apertura") == 0)
                  { GOSUB MdF_ctrl_Change_Apertura_GEST }
             }

          // 25.10.2019
          if (VAR_VAL(idx_att, "MdF_offz_REL_ADD") != VAR_VAL(idx_att, "MdF_offz_REL_ADD_prec"))
             {
              MdF_Cambiato = "Dim_MdF_offz_REL_ADD"
              MdF_offz_REL_ADD_prec = VAR_VAL(idx_att, "MdF_offz_REL_ADD")
             }

         // 13.03.2017
          GOSUB MdF_Elimina_x_Dim_Change

          //DISPLAY2(STRCAT("mdf_ctrl_Change_Apertura=", STR(mdf_ctrl_Change_Apertura)))

          // 20.02.2019 Se MdF_ salvati nel rit esempio MdF_Utente="CerBat"
          mdf_add_Reg_action_cmd = 0
          if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "mdf_Load_save_prec") == 1)
             {
              if (ACTION() > 0  &  ACTION() != 2  &  CMD() == 1)
                 { mdf_add_Reg_action_cmd = ACTION() }
             }

          if ( VAR_VAL(idx_att, "mdf_ctrl_Change_Apertura") == 0
            // 20.02.2019 Se MdF_ salvati nel rit esempio MdF_Utente="CerBat"
             & mdf_add_Reg_action_cmd == 0
             )
             {
             // 13.03.2017
             // 21.11.2024 Ottimizzazione Var
              //COMPONENTI3("mdf_FerrPostCtrlDim", idx_att, "MdF_*")
              MdF_WITH_ALIAS_att_ESCL("mdf_FerrPostCtrlDim", "MdF_CAM", idx_att)
             // 17.10.2024
              mdf_vaniY_E6 = 0
             // 02.09.2024
              mdf_Ferr_presentCD = 0
              iSa=1
              while (iSa <= mdf_FerrPostCtrlDim)
                 {
                  if ( HAS_ALIAS(mdf_FerrPostCtrlDim[iSa], "MdF_CAM")
                     & IS_MATCH(NOME(PADRE(mdf_FerrPostCtrlDim[iSa], 1)), "MECCANISM*_UTENTE*") != 1
                     & IS_MATCH(NOME(mdf_FerrPostCtrlDim[iSa]), "MECCANISM*_UTENTE*") != 1
                     )
                     {
                      mdf_Ferr_presentCD = 1
                      mdf_FerrPCD_pres_idx = mdf_FerrPostCtrlDim[iSa]
                      // 21.11.2024 solo per debug dopo Macro CAM
                      if (VAR_VAL_STR(mdf_FerrPostCtrlDim[iSa], "KeyFamRegFacc_CerBat") != VAR_VAL_STR(idx_att, "KeyFamRegFacc_CerBat") )
                         {
                          mdf_Ferr_presentCD = -1
                          mdf_FerrPCD_pres_idx_NO = mdf_FerrPostCtrlDim[iSa]
                         }
                     }
                  if (IS_MATCH(NOME(mdf_FerrPostCtrlDim[iSa]), "MdF_CerniereBattV*") )
                     {
                      mdf_vaniY_E6 = mdf_vaniY_E6+1
                     }
                  iSa = iSa+1
                 }

              //if (mdf_FerrPostCtrlDim > 0)
              if (mdf_Ferr_presentCD > 0)
                 {
                 // 03.08.2023 La010468 Visto che è capitato adesso per ora faccio solo per ACTION() 28
                  if (ACTION() == 28)  { GOSUB MdF_ctrl_Change_Apertura_GEST }
                 // 12.06.2024 A OCL079796. Da ottimizzazioni Bdm, un RICALCOLA_UNA in meno quindi non trovava il Fianco di Battuta corretta
                  GOSUB MdF_Ctrl_idx_Battuta_SXDX_PCD

                  mdf_ADD_Reg_Interat_Exit6 = 1

                 // 17.10.2024
                  if (VAR_VAL(idx_att, "MdF_VanoY1") > 50)
                     {
                      if (mdf_vaniY_E6 == 0)  { mdf_ADD_Reg_Interat_Exit6 = -1 }
                     }

                  EXITSUB()
                 }
             }
         }
      else
         {
          // 28.01.2020 Se cerniere escluse in caricamento Ordine MCB_Escl_Cer>0
          // E poi voglio cambiare la variante che le attiva
          if (CAM_loadOrder == 0)
             {
              if (ACTION() == 3)
                 { GOSUB MdF_ctrl_Change_Apertura_GEST }
             }
         }
   }

   PROCEDURA MdF_Ctrl_idx_Battuta_SXDX_PCD
   {
      // 14.06.2024
      if (VAR_EXIST(PADRE(idx_att, -1), "copied__") == 1)  { EXITSUB() }
      // Se dà problemi provare ad aggiungere solo per CMD()==1
      imES=1
      while (imES <= mdf_FerrPostCtrlDim)
         {
          if (IS_IDX(mdf_FerrPostCtrlDim[imES]) )
             {
              if ( VAR_VAL(mdf_FerrPostCtrlDim[imES], "escluso") != 1
                 & VAR_VAL(PADRE(mdf_FerrPostCtrlDim[imES], 1), "escluso") != 1
                 & HAS_ALIAS(mdf_FerrPostCtrlDim[imES], "MdF_CAM")
                 & VAR_EXIST(mdf_FerrPostCtrlDim[imES], "mdf_idx_Battuta_SX")
                 )
                 {
                  mdf_ric_idx_Batt = 0
                  if ( VAR_VAL(mdf_FerrPostCtrlDim[imES], "mdf_idx_Battuta_SX") != VAR_VAL(idx_att, "exitBattuta_SX")
                     & IS_IDX(VAR_VAL(idx_att, "exitBattuta_SX"))
                     )
                     { mdf_ric_idx_Batt = 1 }

                  if ( VAR_VAL(mdf_FerrPostCtrlDim[imES], "mdf_idx_Battuta_DX") != VAR_VAL(idx_att, "exitBattuta_DX")
                     & IS_IDX(VAR_VAL(idx_att, "exitBattuta_DX"))
                     )
                     { mdf_ric_idx_Batt = 2 }

                  if (mdf_ric_idx_Batt > 0)
                     {
                      COMANDO2(STRCAT("RICALCOLA_UNA ", STR(mdf_FerrPostCtrlDim[imES]), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " da=", STR(idx_att), " idxScocca=", STR(PADRE(idx_att, -1)), " x idx_Battuta MdF_ mdf_ADD_Reg_Interat_6"))
                     }
                  else
                     {
                      // 20.03.2025 H 21048401
                      if ( VAR_VAL(mdf_FerrPostCtrlDim[imES], "mdf_idx_Battuta_SX") != VAR_VAL(idx_att, "exitBattuta_SX")
                         & IS_IDX(VAR_VAL(mdf_FerrPostCtrlDim[imES], "mdf_idx_Battuta_SX"))
                         & VAR_VAL(idx_att, "exitBattuta_SX") != 1
                         & VAR_VAL(mdf_FerrPostCtrlDim[imES], "Battuta_X") == 0
                         )
                         { mdf_ric_idx_Batt = 1.1 }

                      if ( VAR_VAL(mdf_FerrPostCtrlDim[imES], "mdf_idx_Battuta_DX") != VAR_VAL(idx_att, "exitBattuta_DX")
                         & IS_IDX(VAR_VAL(mdf_FerrPostCtrlDim[imES], "mdf_idx_Battuta_DX"))
                         & VAR_VAL(idx_att, "exitBattuta_DX") != 1
                         & VAR_VAL(mdf_FerrPostCtrlDim[imES], "Battuta_X") == 0
                         )
                         { mdf_ric_idx_Batt = 2.1 }

                      if (mdf_ric_idx_Batt > 0)
                         {
                          if (VAR_EXIST(idx_att, "mdf_ric_idx_Batt_Post") != 1)
                             { mdf_ric_idx_Batt_Post = 0 }

                          mdf_ric_idx_Batt_Post = mdf_ric_idx_Batt_Post+1
                          if (mdf_ric_idx_Batt_Post <= 1)
                             {
                              COMANDO2(STRCAT("RICALCOLA_UNA ", STR(mdf_FerrPostCtrlDim[imES]), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " da=", STR(idx_att), " idxScocca=", STR(PADRE(idx_att, -1)), " x idx_Battuta MdF_ mdf_ADD_Reg_Interat_6 2"))
                             }
                         }
                     }
                 }
             }
          imES = imES+1
         }
   }

  // 29.11.2018
   // Vedi anche copied__
   PROCEDURA MdF_Ctrl_IS_IDX_sat
   {
      if (CAM_loadOrder != 0)  { EXITSUB() }

      COMPONENTI2("mdf_sat_ctrl", PADRE(idx_att, -1), "MdF_Sat*")

     // 10.10.2023 AOCL121763
      if (VAR_VAL(idx_att, "MdF_sat_Basetta_Attrezzata") > 0)
         {
          GOSUB MdF_fia_doppioBattutaX
          if (mdf_fia_doppioBattutaX > 0)
             {
              BOX_MODE(0)
              NEAR_GLOBALE("mdf_sat_ctrl", idx_att, 10, 1, "MdF_Sat*")
             }
         }

      iS=1
      while (iS <= mdf_sat_ctrl)
         {
          if (IS_MATCH(NOME(mdf_sat_ctrl[iS]), "MdF_Sat_Pis*") )
             {
              idx_Pis_c = VAR_VAL(mdf_sat_ctrl[iS], "idx_Pis")
              if (IS_IDX(mdf_sat_ctrl[iS])  &  IS_IDX(idx_Pis_c) )
                 {
                  // 26.04.2021 61645, vedi anche 2015FIT070101
                  idxsatToCtrl = PADRE(mdf_sat_ctrl[iS], -1)
                  idx_ToCtrl = PADRE(idx_Pis_c, -1)
                  idxFroCamMdFrontali = idx_att
                  if (VAR_EXIST(mdf_sat_ctrl[iS], "idx_CamMdF") )
                     {
                      idxFroCamMdFrontali = VAR_VAL(mdf_sat_ctrl[iS], "idx_CamMdF")
                     }
                  if (IS_MATCH(NOME(mdf_sat_ctrl[iS]), "MdF_Sat_PisFia*") )
                     {
                      idxsatPis = mdf_sat_ctrl[iS]
                      if (VAR_EXIST(idxsatPis, "idx_CamMdF") )
                         {
                          if (IS_IDX(VAR_VAL(idxsatPis, "idx_CamMdF")) )
                             {
                              idxsatToCtrl = VAR_VAL(idxsatPis, "idx_CamMdF")
                              idx_ToCtrl = idx_att
                              // Se ho un' anta che copre piu scocche e ho un' AntaFittizia che rimane attiva perche si porta dietro il Ripiano
                              if (PADRE(idxsatToCtrl, -1) != PADRE(idx_att, -1))
                                 {
                                  if (VAR_VAL(idxsatToCtrl, "X")-10 > VAR_VAL(PADRE(idx_att, -1), "X"))
                                     {
                                      x_CamMdFSat = VAR_VAL(idxsatToCtrl, "X")
                                      idx_ToCtrl = idxsatToCtrl
                                     }
                                 // VAPI, VAPS
                                  if (VAR_VAL(idxsatToCtrl, "Y")+50 < VAR_VAL(PADRE(idx_att, -1), "Y"))
                                     {
                                      y_CamMdFSat = VAR_VAL(idxsatToCtrl, "Y")
                                      idx_ToCtrl = idxsatToCtrl
                                     }
                                 }
                             }
                         }
                     }

                 // 19.02.2025 MN-Rib il copiato cancella l' MdF_ perchè cambiano le misure, o meglio Bdm errato fa partire l' anta con misure errate
                  // quindi non servirebbero queste modifiche, ma le lascio perchè forse vanno bene lo stesso
                  mdf_in_copying = 0
                  if ( VAR_EXIST(PADRE(idx_att, -1), "copied__") == 1
                     | VAR_EXIST(PADRE(idxFroCamMdFrontali, -1), "copied__") == 1
                     )
                     {
                      mdf_in_copying = 1
                      if (idx_att != idxFroCamMdFrontali)
                         { mdf_in_copying = 2 }
                     }

                  if ( PADRE(mdf_sat_ctrl[iS], -1) != PADRE(idx_Pis_c, -1)
                     & idxsatToCtrl != idx_ToCtrl
                     )
                     {
                      mdf_sat_ctrl_canc = mdf_sat_ctrl[iS]
                      //COMANDO(STRCAT("LOGMSG ", STR(mdf_sat_ctrl[iS]), " // MdF_Ctrl_IS_IDX_sat 1 idx_att=", STR(idx_att), " idxsatToCtrl=", STR(idxsatToCtrl), " idx_ToCtrl=", STR(idx_ToCtrl)))
                      if (mdf_in_copying == 0)
                         { COMANDO(STRCAT("CANCELLA ", STR(mdf_sat_ctrl[iS]), " // MdF_Ctrl_IS_IDX_sat 1 ", STR(idx_att), " idxsatToCtrl=", STR(idxsatToCtrl), " idx_ToCtrl=", STR(idx_ToCtrl))) }
                      else
                         {
                          if (mdf_in_copying == 1)
                             { COMANDO2(STRCAT("CANCELLA ", STR(mdf_sat_ctrl[iS]), " // ", NOME(mdf_sat_ctrl[iS]), " MdF_Ctrl_IS_IDX_sat 1 idx_att=", STR(idx_att), " idxsatToCtrl=", STR(idxsatToCtrl), " idx_ToCtrl=", STR(idx_ToCtrl))) }
                         }
                     }
                 }
              if (IS_IDX(mdf_sat_ctrl[iS]) )
                 {
                  if (idx_Pis_c > 0  &  IS_IDX(idx_Pis_c) != 1)
                     {
                      COMANDO(STRCAT("CANCELLA ", STR(mdf_sat_ctrl[iS]), " // MdF_Ctrl_IS_IDX_sat 2 ", STR(idx_att)))
                     }
                 }
             }
          // 26.05.2020
          if (IS_MATCH(NOME(mdf_sat_ctrl[iS]), "MdF_Sat_Bas*") )
             {
             // 10.10.2023 AOCL121763 Autoportante con sovrapensile al secondo giro GEST_930 != "005" quindi MdF_Visualize_sat rimane "No"
              //if ( STRCMP(VAR_VAL_STR(idx_att, "MdF_Visualize_sat"), "OnInterat") == 0
              //   & VAR_VAL(idx_att, "escluso") == 0
              //   )
              if (VAR_VAL(idx_att, "escluso") == 0)
                 {
                  // 04.06.2020 se su MdF_Sat ancora non esiste la gestione con idx_MdFgraf
                  if (VAR_EXIST(mdf_sat_ctrl[iS], "idx_MdFgraf") )
                     {
                      idx_MdFgraf_c = VAR_VAL(mdf_sat_ctrl[iS], "idx_MdFgraf")

                      deb_Ctrl_IS_IDX_sat_id4 = PADRE(mdf_sat_ctrl[iS], 4)

                      if ( PADRE(mdf_sat_ctrl[iS], 4) != idx_att
                         // altrimenti sto cancellando le basette dell' altra anta
                         & HAS_ALIAS(PADRE(mdf_sat_ctrl[iS], 4), "CamMdFrontali") != 1
                         )
                         {
                          if (IS_IDX(idx_MdFgraf_c) != 1)
                             {
                              COMANDO2(STRCAT("ELIMINA ", STR(mdf_sat_ctrl[iS]), " // da=", STR(idx_att), " figlio di ", STR(PADRE(mdf_sat_ctrl[iS], 1)), " MdF_Ctrl_IS_IDX_sat"))
                             }
                          else
                             {
                              if ( VAR_VAL(idx_MdFgraf_c, "escluso") != 0
                                 | VAR_VAL(PADRE(idx_MdFgraf_c, 1), "escluso") != 0
                                 | VAR_VAL(PADRE(idx_MdFgraf_c, 2), "escluso") != 0
                                 )
                                 { COMANDO2(STRCAT("ELIMINA ", STR(mdf_sat_ctrl[iS]), " // escl da=", STR(idx_att), " figlio di ", STR(PADRE(mdf_sat_ctrl[iS], 1)), " MdF_Ctrl_IS_IDX_sat")) }
                             }
                         }
                      else
                         {
                          if ( PADRE(mdf_sat_ctrl[iS], 1) != VAR_VAL(idx_MdFgraf_c, "idx_To_ReAdd")
                             & idx_MdFgraf_c > -1
                             )
                             { COMANDO2(STRCAT("ELIMINA ", STR(mdf_sat_ctrl[iS]), " // idx_To_ReAdd da=", STR(idx_att), " figlio di ", STR(PADRE(mdf_sat_ctrl[iS], 1)), " MdF_Ctrl_IS_IDX_sat")) }
                         }
                     }
                 }
             }
          iS=iS+1
         }
   }

   PROCEDURA MdF_Ctrl_copied
   {
      if (VAR_EXIST(PADRE(idx_att, -1), "copied__") != 1)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "mdf_Ctrl_copied") == 1)  { EXITSUB() }

      if ( VAR_EXIST(idx_att, "exitBattuta_SX") == 1
         | VAR_EXIST(idx_att, "exitBattuta_DX") == 1
         )
         {
          mdf_Ctrl_copied = 1
          DEL_VAR(idx_att, "exitBattuta_*")
          Battuta_X = 0

          COMPONENTI2("mdf_sat_ctrl", PADRE(idx_att, -1), "MdF_Sat*")
          iS=1
          while (iS <= mdf_sat_ctrl)
             {
              // 19.05.2020
              if (IS_MATCH(NOME(mdf_sat_ctrl[iS]), "MdF_Sat_Bas*") )
                 {
                  // 21.02.2025 Se non Elimina senza apparente motivo e idx_MdFgraf_c=-2 probabilmente manca idx_MdFgraf -1 su MdF_Sat_BasBat MdF_Sat.inc
                  if (VAR_EXIST(mdf_sat_ctrl[iS], "idx_MdFgraf") != 1)
                     { idx_MdFgraf_c = -2 }
                  else
                     { idx_MdFgraf_c = VAR_VAL(mdf_sat_ctrl[iS], "idx_MdFgraf") }

                  if (IS_IDX(mdf_sat_ctrl[iS]) & IS_IDX(idx_MdFgraf_c))
                     {
                      if (PADRE(mdf_sat_ctrl[iS], -1) != PADRE(idx_MdFgraf_c, -1) )
                         {
                          COMANDO2(STRCAT("ELIMINA ", STR(mdf_sat_ctrl[iS]), " // da=", STR(idx_att), " idx_MdFgraf_c=", STR(idx_MdFgraf_c), " MdF_Ctrl_copied"))
                         }
                     }
                  if (IS_IDX(mdf_sat_ctrl[iS]) )
                     {
                      if (idx_MdFgraf_c > 0  &  IS_IDX(idx_MdFgraf_c) != 1)
                         {
                          COMANDO2(STRCAT("ELIMINA ", STR(mdf_sat_ctrl[iS]), " // da=", STR(idx_att), " idx_MdFgraf_c=", STR(idx_MdFgraf_c), " MdF_Ctrl_copied"))
                         }
                     }
                 }
              iS=iS+1
             }
         // 22.11.2021 altrimenti con mdf_ADD_Reg_Interat_Exit6=1 Battuta_X rimane 0
          GOSUB MdF_KeyFam_Battuta_X
         }
   }

   PROCEDURA MdF_Ctrl_MdF_Visualize_sat
   {
     // 03.07.2024
      if ( VAR_VAL_STR(idx_att, "MdF_Visualize_sat") == "No"
         & VAR_EXIST(idx_att, "MdF_Visualize_sat_prec") != 1
         )
         {
          MdF_Ctrl_MdF_Visualize_sat = -99
          EXITSUB()
         }

      if (STRCMP(VAR_VAL_STR(idx_att, "MdF_Visualize_sat"), VAR_VAL_STR(idx_att, "MdF_Visualize_sat_prec")) != 0)
         {
          MdF_Visualize_sat_prec = MdF_Visualize_sat
          MdF_Ctrl_MdF_Visualize_sat = -1

          WITH_VAR_LOCAL(idx_att, "mdf_Cam_ChangeVisSat", "mdf_nomeFile_sat", 3, 0, "0")
          mdf_cam_i = 1
          mdf_Ctrl_MdF_Visualize_Pis = -1
          while (mdf_cam_i <= mdf_Cam_ChangeVisSat)
             {
              MdF_Ctrl_MdF_Visualize_sat = 1
              mdf_cam_idx_VisSat = mdf_Cam_ChangeVisSat[mdf_cam_i]

              if (IS_MATCH(NOME(mdf_cam_idx_VisSat), "MdF_Pist*") )  { mdf_Ctrl_MdF_Visualize_Pis = mdf_cam_idx_VisSat }
              else
                 {
                  MdF_Ctrl_MdF_Visualize_sat = 2
                  if (mdf_Load_COMANDO2 == 0)
                     { COMANDO(STRCAT("RICALCOLA_UNA ", STR(mdf_cam_idx_VisSat), " no_ridisegna no_agganciati", " // ", NOME(mdf_cam_idx_VisSat), " da MdF_ADD_Reg_Interat per cambio MdF_Visualize_sat")) }
                  else
                     { COMANDO2(STRCAT("RICALCOLA_UNA ", STR(mdf_cam_idx_VisSat), " no_ridisegna no_agganciati", " // ", NOME(mdf_cam_idx_VisSat), " da MdF_ADD_Reg_Interat per cambio MdF_Visualize_sat")) }
                 }

              mdf_cam_i = mdf_cam_i+1
             }
          if (IS_IDX(mdf_Ctrl_MdF_Visualize_Pis) )
             {
              // Gli MdF_Sat hanno gestione escluso 1 se MdF_Visualize diventa "No"
              if (mdf_Load_COMANDO2 == 0)
                 { COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(mdf_Ctrl_MdF_Visualize_Pis, 5)), " no_agganciati", " // ", NOME(mdf_cam_idx_VisSat), " da MdF_ADD_Reg_Interat per cambio MdF_Visualize_sat")) }
              else
                 { COMANDO2(STRCAT("RICALCOLA_UNA ", STR(PADRE(mdf_Ctrl_MdF_Visualize_Pis, 5)), " no_agganciati", " // ", NOME(mdf_cam_idx_VisSat), " da MdF_ADD_Reg_Interat per cambio MdF_Visualize_sat")) }
             }
         }
   }

  // 24.01.2019
   PROCEDURA MdF_Ctrl_Apertura_Init
   {
      mdf_aperInit_Vuota = 0
      if (VAR_VAL(idx_att, "mdf_prosegui_action1") == 33)  { mdf_prosegui_action1 = 0 }

     // 26.02.2019 in inserimento da Listino
      if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "On*") == 1)
         {
          if (VAR_EXIST(idx_att, "MdF_Apertura") != 1)
             { mdf_aperInit_Vuota = 1 }

         // 14.03.2025 mdf_onInterat_sat=0
          if ( VAR_EXIST(idx_att, "MdF_Apertura") == 1
             & STRLEN(VAR_VAL_STR(idx_att, "MdF_Apertura")) < 1
             )
             {
              mdf_aperInit_entry = 1.01
              mdf_aperInit_Vuota = 1.01
             }
         }
     // 08.04.2019 H007438
     if (CAM_loadOrder == 0)
        {
         if (VAR_EXIST(idx_att, "MdF_Apertura") != 1)
            {
             // 16.05.2019 H19014940
             if (VAR_EXIST(idx_att, "mdf_ctrl_Aper_Control") != 1)
                {
                 // 16.04.2019 PCP011901
                 // 06.05.2019 Sn050601
                 mdf_ctrl_Aper_Control = 1
                 // 04.11.2019 con il flusso corretto PCP001676 ora funziona, quindi aggiungo l' if che vale solo per questo
                 // 06.08.2020 Sn02183 problema MdF_ caricati prima di spostamento elementi per riempitivo

                 // 01.09.2020 Vedi mdf_Ctrl_add_correct su Bdm Sn OnLoadOrder2=1
                 // perche' per esempio in La non andava bene la gestione OnLoadOrder2
                 if (mdf_ctrl_Aper_Control > 0)
                    {
                     if (ACTION() == 1  |  ACTION() == 3)
                        {
                         mcmd_Exit1 = CMD()
                         if (mcmd_Exit1 == 1)  { mdf_aperInit_Vuota = 1.1 }
                        // 04.02.2021 Ce
                        // 0 Comando Interattivo: esempio inserimento codice da Listino
                         if (mcmd_Exit1 == 0)  { mdf_aperInit_Vuota = 1.12 }
                        }
                    }
                }
             else
                {
                 if (ACTION() == 1  |  ACTION() == 3)  { mdf_aperInit_Vuota = 1.2 }
                }
            }
        }

      // 13.02.2019
      if (STRLEN(VAR_VAL_STR(idx_att, "MdF_Apertura")) > 0)
         {
          if (VAR_EXIST(idx_att, "MdF_Eliminato") )  { EXITSUB() }

          // 13.02.2019
           if (ACTION() == 1)
              {
               if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnLoadPers*") == 1)
                  {
                  // 02.02.2022
                   if (VAR_EXIST(idx_att, "MdF_Ctrl_Reg_Interat") == 1)  { mdf_aperInit_Vuota = 1.5 }

                   EXITSUB()
                  }
              }

          // 15.11.2024 Per avere meno variabili sugli elementi
          //COMPONENTI2("mdf_FerrCtrlApIn", idx_att, "MdF_*")
          MdF_WITH_ALIAS_att("mdf_FerrCtrlApIn", "MdF_CAM", idx_att)
          if (mdf_FerrCtrlApIn > 0)
             {
              // 20.02.2019
              GOSUB MdF_Ctrl_indice_Ferr_4Reg

              EXITSUB()
             }
          else
             {
              mdf_aperInit_Vuota = 2
              mdf_prosegui_action1 = 33
             }
         }

      if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnLoadPers*") != 1)
         {
          if (IS_MATCH(VAR_VAL_STR(idx_att, "mdf_prosegui_action"), "MDF_CucP_PostControl*") == 1)
             {
              // 14.03.2019
              if (ACTION() == 3)
                 {
                  // In questo caso MdF_Apertura puo anche non esistere
                  mdf_aperInit_Vuota = -1
                  mdf_prosegui_action1 = 33
                 }
             }
         }
      if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnLoadPers*") != 1)  { EXITSUB() }

      if ( VAR_EXIST(idx_att, "MdF_Apertura")
         & STRLEN(VAR_VAL_STR(idx_att, "MdF_Apertura")) == 0
         )
         {
          mdf_aperInit_Vuota = 1
          mdf_prosegui_action1 = 33
         }
   }

  // 15.11.2019
   PROCEDURA MdF_ricalcola_escl_Incl
   {
      if (mdf_Ferr_eleIn == 0)                                { EXITSUB() }
      if (VAR_VAL(idx_att, "mdf_ctrl_Change_Apertura") == 0)  { EXITSUB() }

      // O prima erano esclusi e devo riabilitarli
      if ( VAR_VAL(mdf_Ferr_eleIn[1], "escluso") == 1
         // oppure sono abilitati e li devo escludere
         | STRLEN(VAR_VAL_STR(idx_att, "KeyFamRegFacc")) < 1
         )
         {
          mdf_idx_ricEsc = mdf_Ferr_eleIn[1]
          if (mdf_Load_COMANDO2 == 0)
             {
              //COMANDO("SHOW Abilita On   // MdF_ricalcola_escl_Incl")
              COMANDO(STRCAT("RICALCOLA_UNA ", STR(mdf_idx_ricEsc), " no_ridisegna no_agganciati", " // ", NOME(mdf_idx_ricEsc), " MdF_ricalcola_escl_Incl per cambio var"))
             }
          else
             {
              //COMANDO2("SHOW Abilita On   // MdF_ricalcola_escl_Incl")
              COMANDO2(STRCAT("RICALCOLA_UNA ", STR(mdf_idx_ricEsc), " no_ridisegna no_agganciati", " // ", NOME(mdf_idx_ricEsc), " MdF_ricalcola_escl_Incl per cambio var"))
             }
         }
   }

   // 07.07.2020
   PROCEDURA MdF_ELIMINA_x_NoKey
   {
      if (mdf_Ferr_eleIn == 0)                                { EXITSUB() }
      if (VAR_VAL(idx_att, "mdf_ctrl_Change_Apertura") == 0)  { EXITSUB() }

      if ( VAR_VAL(mdf_Ferr_eleIn[1], "escluso") == 1
         | STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", tLav))) < 1
         )
         {
          mdf_idx_ricEsc = mdf_Ferr_eleIn[1]
          if (mdf_Load_COMANDO2 == 0)
             {
              COMANDO(STRCAT("ELIMINA ", STR(mdf_idx_ricEsc), " no_ridisegna no_agganciati", " // ", NOME(mdf_idx_ricEsc), " MdF_ELIMINA_x_NoKey per cambio var mdf_ctrl_Change_Apertura=", STR(VAR_VAL(idx_att, "mdf_ctrl_Change_Apertura"))))
             }
          else
             {
              COMANDO2(STRCAT("ELIMINA ", STR(mdf_idx_ricEsc), " no_ridisegna no_agganciati", " // ", NOME(mdf_idx_ricEsc), " MdF_ELIMINA_x_NoKey per cambio var ctrl_Change_Apertura=", STR(VAR_VAL(idx_att, "mdf_ctrl_Change_Apertura"))))
             }
         }
   }

   PROCEDURA MdF_Ctrl_indice_Ferr_4Reg
   {
      // 20.02.2019 Se MdF_ salvati nel rit esempio MdF_Utente="CerBat"
      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "mdf_Load_save_prec") == 1)
         {
          mdf_quante_RegFacc = 4
          mdf_elemento_4Reg = "MdF_Ferramente_4Reg"
          COMPONENTI2("mdf_Ferr_4RegIn", idx_att, mdf_elemento_4Reg)
          mdf_indice_riga_Ric = 0
          iFe=1
          while (iFe <= mdf_Ferr_4RegIn)
             {
              if (VAR_EXIST(mdf_Ferr_4RegIn[iFe], "indice_riga") == 1)
                 {
                  if (VAR_VAL(mdf_Ferr_4RegIn[iFe], "indice_riga") >= mdf_indice_riga_Ric)
                     {
                      mdf_indice_riga_Ric = VAR_VAL(mdf_Ferr_4RegIn[iFe], "indice_riga")
                     }
                 }
              iFe = iFe+1
             }

          iFe=1
          while (iFe <= mdf_Ferr_4RegIn)
             {
              if (VAR_EXIST(mdf_Ferr_4RegIn[iFe], "indice_riga") != 1)
                 {
                  mdf_indice_riga_Ric = mdf_indice_riga_Ric+1
                  VAR_VALUE_SET(mdf_Ferr_4RegIn[iFe], "indice_riga", mdf_indice_riga_Ric)
                  VAR_VALUE_SET(mdf_Ferr_4RegIn[iFe], "quante_RegFacc", mdf_quante_RegFacc)
                 }
              iFe = iFe+1
             }
         }
   }

  // 21.06.2018
   PROCEDURA MdF_KeyFam_Battuta_X_Post
   {
      mdf_OnInterat_Battuta_X_Post = 0
      // In inserimento nel caso di Anta che prende piu scocche con gestione MdF_Sat
      if ( IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "VA*")
         | IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "RI*")
         )
         {
          if ( VAR_EXIST(idx_att, "exitBattuta_SX") != 1
             | VAR_EXIST(idx_att, "exitBattuta_DX") != 1
             | VAR_VAL(idx_att, "exitBattuta_DX") < 0
             | VAR_VAL(idx_att, "Battuta_DX") == 0
             )
             {
              mdf_OnInterat_Battuta_X_Post = 1
             }
         // 06.12.2019 Sn000235
          // In caricamento ordine un pensile e' sovrapposto alla colonna a destra e solo alla
          // fine del caricamento ordine la grafica si sistema (Stanza angolata angolo 0.900003)
          if (IS_IDX(VAR_VAL(idx_att, "exitBattuta_DX")) )
             {
              mdf_exit_BattDx = VAR_VAL(idx_att, "exitBattuta_DX")
              if ( PADRE(idx_att, 3) != PADRE(mdf_exit_BattDx, 3)
                 & VAR_VAL(idx_att, "Fianchi_vic") > 2
                 )
                 {
                  if ( VAR_VAL(idx_att, "Battuta_DX") > VAR_VAL(mdf_exit_BattDx, "X")/2
                     & VAR_VAL(idx_att, "Battuta_DX")+4 < VAR_VAL(mdf_exit_BattDx, "X")
                     )
                     {
                      mdf_OnInterat_Battuta_X_Post = 2
                     }
                 }
             }
         }
     // 21.04.2021 C2051151 tanto da trace impiega 0 millesimi
      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "*X*") )
         {
          mdf_idx_BattutaFiaDx = VAR_VAL(idx_att, "exitBattuta_DX")
          mdf_idx_BattutaFiaSx = VAR_VAL(idx_att, "exitBattuta_SX")
          if (IS_IDX(mdf_idx_BattutaFiaSx) )
             {
              if ( VAR_VAL(mdf_idx_BattutaFiaSx, "X") > 22
                 & ABS(VAR_VAL(idx_att, "Battuta_X")) > 22
                 )
                 {
                  mdf_OnInterat_Battuta_X_Post = 3
                 }
             // 09.06.2022
              if (VAR_VAL(mdf_idx_BattutaFiaSx, "escluso") != 0)
                 { mdf_OnInterat_Battuta_X_Post = 4.1 }

             // 13.07.2022 H22012545MIS20
              if ( ABS(VAR_VAL(mdf_idx_BattutaFiaSx, "Y") - Y) > 50
                 & VAR_VAL(idx_att, "MdfSys_SbordoYSup") == 0
                 )
                 {
                  mdf_att_SbordoYSup = VAR_VAL(idx_att, "MdfSys_SbordoYSup")
                  mdf_att_SbordoYInf = VAR_VAL(idx_att, "MdfSys_SbordoYInf")
                  yFiaBatSx = VAR_VAL(mdf_idx_BattutaFiaSx, "Y")
                  if (yFiaBatSx+10 < Y-MdfSys_SbordoYSup-MdfSys_SbordoYInf)
                     {
                      mdf_OnInterat_Battuta_X_Post = 6
                     }
                 }
             }
          if (IS_IDX(mdf_idx_BattutaFiaDx) )
             {
              if ( VAR_VAL(mdf_idx_BattutaFiaDx, "X") > 22
                 & ABS(VAR_VAL(idx_att, "Battuta_X")) > 22
                 )
                 {
                  mdf_OnInterat_Battuta_X_Post = 4
                 }
             // 09.06.2022 Ca2209094
              if (VAR_VAL(mdf_idx_BattutaFiaDx, "escluso") != 0)
                 { mdf_OnInterat_Battuta_X_Post = 4.1 }

             // 13.07.2022 H22012545MIS20
              if ( ABS(VAR_VAL(mdf_idx_BattutaFiaDx, "Y") - Y) > 50
                 & VAR_VAL(idx_att, "MdfSys_SbordoYSup") == 0
                 )
                 {
                  mdf_att_SbordoYSup = VAR_VAL(idx_att, "MdfSys_SbordoYSup")
                  mdf_att_SbordoYInf = VAR_VAL(idx_att, "MdfSys_SbordoYInf")
                  yFiaBatDx = VAR_VAL(mdf_idx_BattutaFiaDx, "Y")
                  if (yFiaBatDx+10 < Y-MdfSys_SbordoYSup-MdfSys_SbordoYInf)
                     {
                      mdf_OnInterat_Battuta_X_Post = 6
                     }

                 }
             }
         // 20.03.2025 H 22004734
          if ( VAR_EXIST(idx_att, "Battuta_X")
             & VAR_VAL(idx_att, "Battuta_X") == 0
             & VAR_VAL(idx_att, "MdF_angoloBas") == 0
             )
             {
              if (idx_att != PADRE(idx_att, 1) )
                 {
                  if ( IS_IDX(mdf_idx_BattutaFiaSx) != 1
                     & IS_IDX(mdf_idx_BattutaFiaDx) != 1
                     )
                     {
                      WITH_VAR_LOCAL(idx_att, "mdf_Ele_Battuta_X_0", "Battuta_X", 2, 1, "0")

                      if (mdf_Ele_Battuta_X_0 > 0)
                         {
                          if (VAR_EXIST(idx_att, "mdf_Battuta_X_Post_Zero") != 1)
                             { mdf_Battuta_X_Post_Zero = 0 }

                          mdf_Battuta_X_Post_Zero = mdf_Battuta_X_Post_Zero+1
                          if (mdf_Battuta_X_Post_Zero <= 1)
                             {
                              mdf_OnInterat_Battuta_X_Post = 6.1
                             }
                         }
                     }
                 }
             }

         // 15.07.2021 Po58074 TraversaPonte nell' Armadio a fianco
          if (STRLEN(VAR_VAL_STR(idx_att, "MdF_archetipoFondo")) > 1)
             { mdf_OnInterat_Battuta_X_Post = 5 }

         // 21.04.2023 ScE2023000071 Visto che alcuni Bdm/gestioni grafiche sono contorte, se ho uno SbordoY maggiore di 100 lo ricontrollo sempre
         // 26.04.2023 Sc0121900160
          if ( VAR_VAL(idx_att, "MdfSys_SbordoYInf") > 90
             | VAR_VAL(idx_att, "MdfSys_SbordoYSup") > 90
             )
             {
              mdf_OnInterat_Battuta_X_Post = 6.9
             }

         // 12.01.2023 Sc2022008068 Dato che non e' quasi mai possibile uno SbordoY del genere, ma dipende da come viene ridotta l' anta e spostata
          // Se ho degli sbordi cosi alti provo a ricalcolare, tanto impiega poco e per casi rari
          // Eventualmente si può abbassare il valore di controllo, ma visto che ormai funziona dapperutto lo tengo alto
          if ( VAR_VAL(idx_att, "MdfSys_SbordoYSup") > Y/2+10
             | VAR_VAL(idx_att, "MdfSys_SbordoYInf") > Y/2+10
             )
             {
              mdf_OnInterat_Battuta_X_Post = 7
             }

         // 25.01.2023 VD844937
         // 08.02.2023 VD
          mdf_bas0_offy_fro  = VAR_VAL(idx_att, "base_0_offset.y")
          mdf_bas0_offy_pdr1 = VAR_VAL(PADRE(idx_att, 1), "base_0_offset.y")
          mdf_bas0_offy_pdr2 = VAR_VAL(PADRE(idx_att, 2), "base_0_offset.y")
          if (mdf_bas0_offy_fro < -1  |  mdf_bas0_offy_pdr1 < -1  |  mdf_bas0_offy_pdr2 < -1)
             {
              if (VAR_VAL(idx_att, "MdfSys_SbordoYInf") == 0)
                 { mdf_OnInterat_Battuta_X_Post = 8.1 }
             }
          if (mdf_bas0_offy_fro > 1  |  mdf_bas0_offy_pdr1 > 1  |  mdf_bas0_offy_pdr2 > 1)
             {
              if (VAR_VAL(idx_att, "MdfSys_SbordoYSup") == 0)
                 { mdf_OnInterat_Battuta_X_Post = 8.2 }
             }
         }
     // 07.05.2025 FreePass
      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "*Fis*") )
         {
          if ( IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "D*")
             & VAR_VAL(idx_att, "Battuta_X_Dx") == 0
             )
             { mdf_OnInterat_Battuta_X_Post = 9 }

          if ( IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "S*")
             & VAR_VAL(idx_att, "Battuta_X_Sx") == 0
             )
             { mdf_OnInterat_Battuta_X_Post = 9.1 }
         }

      if (mdf_OnInterat_Battuta_X_Post > 0)  { GOSUB MdF_KeyFam_Battuta_X }
   }

   PROCEDURA MdF_KeyFamReg_CtrlChange
   {
      if (VAR_EXIST(ATTUALE(), "mdf_KeyFamCtCh_idx") != 1)  { mdf_KeyFamCtCh_idx = idx_att }

      if (ACTION() == 1064)                             { EXITSUB() }
      if (ACTION() <= 0)                                { EXITSUB() }
      if (VAR_VAL(mdf_KeyFamCtCh_idx, "escluso") != 0)  { EXITSUB() }

      SET_#(mdf_KeyFamCtCh_idx)
      #mdf_prosegui_action1 = 1

      GOSUB MdF_Var_Ini

      ctrl_solo_chiave = 1

      NewRTA = "1"

      // Se ho un elemento che è sia CamIncidente che CamMdFrontali mi ritrovo le variabili CAM sulla procedura Sub_Cam_Ins_Elementi !
      // Siccome qua sono solo di appoggio non devo avere lo stesso nome con prefisso CAM_
      // anzi potrei far leggere i valori nelle VariabiliMdF (da fare)
      mdF_Lav_offx = 0
      mdF_Lav_offz = 0
      mdF_Lav_offy = 0
      if (IS_MATCH(NewRTA, "1") == 1)  { mdF_Lav_offy = -Y }

      DEL_VAR(mdf_KeyFamCtCh_idx, "Escludi_*")

      if (VAR_EXIST(mdf_KeyFamCtCh_idx, "MdF_offx_REL_ADD") )
         { mdF_Lav_offx = mdF_Lav_offx + VAR_VAL(mdf_KeyFamCtCh_idx, "MdF_offx_REL_ADD") }

      if (VAR_EXIST(mdf_KeyFamCtCh_idx, "MdF_offy_REL_ADD") )
         { mdF_Lav_offy = mdF_Lav_offy + VAR_VAL(mdf_KeyFamCtCh_idx, "MdF_offy_REL_ADD") }

      if (VAR_EXIST(mdf_KeyFamCtCh_idx, "MdF_offz_REL_ADD") )
         { mdF_Lav_offz = mdF_Lav_offz + VAR_VAL(mdf_KeyFamCtCh_idx, "MdF_offz_REL_ADD") }

      mdf_add_now_MdF_ADD_Reg_Interat = 0

      idx_MdF_Var = mdf_KeyFamCtCh_idx
      idx_Fro = mdf_KeyFamCtCh_idx
      GOSUB MdF_VariabiliDaTipoPadri
      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(mdf_KeyFamCtCh_idx, "MdF_addKey_keyGenerica"))
      GOSUB MdF_Variabili
      CHIAVE_TABVAR_MDF = "keyGenericaFro"
      GOSUB MdF_Variabili

      if ( IS_MATCH(VAR_VAL_STR(mdf_KeyFamCtCh_idx, "MdF_Apertura"), "SX*")
         | IS_MATCH(VAR_VAL_STR(mdf_KeyFamCtCh_idx, "MdF_Apertura"), "DX*")
         )
         {
          tLav = "CerBat"
          if (STRLEN(VAR_VAL_STR(mdf_KeyFamCtCh_idx, STRCAT("KeyFamRegFacc_", tLav))) > 0)
             {
              CHIAVE_TABVAR_MDF = "CerBat"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "CerBatFro"
              GOSUB MdF_Variabili

              GOSUB MdF_pos_CerBat
             }
          // 15.12.2016
          tLav = "CerAngLib"
          if (STRLEN(VAR_VAL_STR(mdf_KeyFamCtCh_idx, STRCAT("KeyFamRegFacc_", tLav))) > 0)
             {
              //CHIAVE_TABVAR_MDF = "CerAngLib"
              //GOSUB MdF_Variabili
              //CHIAVE_TABVAR_MDF = "CerAngLibFro"
              //GOSUB MdF_Variabili

              GOSUB MdF_pos_CerAngLib
             }
         }

       tLav = "CerSof"
       if (STRLEN(VAR_VAL_STR(mdf_KeyFamCtCh_idx, STRCAT("KeyFamRegFacc_", tLav))) > 0)
          {
           CHIAVE_TABVAR_MDF = "CerSof"
           GOSUB MdF_Variabili

           if ( IS_MATCH(VAR_VAL_STR(mdf_KeyFamCtCh_idx, "MdF_Apertura"), "SX*SOF*")
              | IS_MATCH(VAR_VAL_STR(mdf_KeyFamCtCh_idx, "MdF_Apertura"), "DX*SOF*")
              )
              {
               GOSUB MdF_pos_CerSof
              }
         }

      if ( STRLEN(VAR_VAL_STR(mdf_KeyFamCtCh_idx, STRCAT("KeyFamRegFacc_", "CerRib"))) > 0
         | STRLEN(VAR_VAL_STR(mdf_KeyFamCtCh_idx, STRCAT("KeyFamRegFacc_", "PisAnta"))) > 0
         | STRLEN(VAR_VAL_STR(mdf_KeyFamCtCh_idx, STRCAT("KeyFamRegFacc_", "PisFia"))) > 0
         )
         {
          // Non serve entrare in VaribailiMdF con sottochiave CerRib se non sono MdF_Apertura VA RI
          // perché qui la MdF_Apertura deve esser già corretta con la keyGenerica
          if ( IS_MATCH(VAR_VAL_STR(mdf_KeyFamCtCh_idx, "MdF_Apertura"), "VA*") == 1
             | IS_MATCH(VAR_VAL_STR(mdf_KeyFamCtCh_idx, "MdF_Apertura"), "RI*") == 1
             )
             {
              CHIAVE_TABVAR_MDF = "CerRib"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "CerRibFro"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "PisAnta"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "PisAntaFro"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "PisFia"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "PisFiaFro"
              GOSUB MdF_Variabili

              GOSUB MdF_pos_CerRib
             }
         }

      tLav = "Par"
      if (STRLEN(VAR_VAL_STR(mdf_KeyFamCtCh_idx, STRCAT("KeyFamRegFacc_", tLav))) > 0)
         {
          CHIAVE_TABVAR_MDF = "Par"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "ParFro"
          GOSUB MdF_Variabili
          GOSUB MdF_pos_Paracolpi
         }
      tLav = "ParInt"
      if (STRLEN(VAR_VAL_STR(mdf_KeyFamCtCh_idx, STRCAT("KeyFamRegFacc_", tLav))) > 0)
         {
          CHIAVE_TABVAR_MDF = "ParInt"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "ParIntFro"
          GOSUB MdF_Variabili
          GOSUB MdF_pos_ParacolpiInt
         }
      tLav = "FerGen"
      if (STRLEN(VAR_VAL_STR(mdf_KeyFamCtCh_idx, STRCAT("KeyFamRegFacc_", tLav))) > 0)
         {
          CHIAVE_TABVAR_MDF = "FerGen"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "FerGenFro"
          GOSUB MdF_Variabili
          GOSUB MdF_pos_FerramenteGen
         }

      tLav = "FerCri"
      if (STRLEN(VAR_VAL_STR(mdf_KeyFamCtCh_idx, STRCAT("KeyFamRegFacc_", tLav))) > 0)
         {
          CHIAVE_TABVAR_MDF = "FerCri"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "FerCriFro"
          GOSUB MdF_Variabili
          GOSUB MdF_pos_FerGenCri
         }

      if ( STRLEN(VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_FerFro")) > 0
         | STRLEN(VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_FerFia")) > 0
         | STRLEN(VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_FerPia")) > 0
         )
         {
          GOSUB MdF_Var_Ferramente
          // In KeyFamRegFacc basta che passi una volta, è in RegFacc che verifica quanti
          // elementi Fer ci sono
          tLav = "FerFro"
          GOSUB MdF_KeyFamRegFacc
          tLav = "FerFia"
          GOSUB MdF_KeyFamRegFacc
          tLav = "FerPia"
          GOSUB MdF_KeyFamRegFacc

          GOSUB MdF_pos_Ferramente
         }
      DEL_VAR(-1, "mdf_*")

      mdF_KeyFam_ctrl_change = ""
      COMPONENTI2("mdf_Ferr_KFCU", mdf_KeyFamCtCh_idx, "MdF_*")
      iFK = 1
      while (iFK <= mdf_Ferr_KFCU)
         {
          if (IS_MATCH(NOME(mdf_Ferr_KFCU[iFK]), "MdF_CerniereBattenti") )
             {
              if (STRCMP(VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc"), VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_CerBat")) != 0)
                 {
                  mdF_KeyFam_ctrl_change = VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc")
                  SET_#(mdf_Ferr_KFCU[iFK])
                  #MdF_Cambiato = "mdF_KeyFam_CtrlChange"
                  //COMANDO(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(mdf_Ferr_KFCU[iFK]), " // mdF_KeyFam_CtrlChange ", mdF_KeyFam_ctrl_change))
                 }
             }
          if (IS_MATCH(NOME(mdf_Ferr_KFCU[iFK]), "MdF_CerniereSoffietto") )
             {
              if (STRCMP(VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc"), VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_CerSof")) != 0)
                 {
                  mdF_KeyFam_ctrl_change = VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc")
                  SET_#(mdf_Ferr_KFCU[iFK])
                  #MdF_Cambiato = "mdF_KeyFam_CtrlChange"
                  //COMANDO(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(mdf_Ferr_KFCU[iFK]), " // mdF_KeyFam_CtrlChange ", mdF_KeyFam_ctrl_change))
                 }
             }
          if (IS_MATCH(NOME(mdf_Ferr_KFCU[iFK]), "MdF_CernierePistoneVasRib") )
             {
              if ( STRCMP(VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc"), VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_CerBat") ) != 0
                 | STRCMP(VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc"), VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_PisAnta")) != 0
                 | STRCMP(VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc"), VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_PisFia") ) != 0
                 )
                 {
                  mdF_KeyFam_ctrl_change = VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc")
                  SET_#(mdf_Ferr_KFCU[iFK])
                  #MdF_Cambiato = "mdF_KeyFam_CtrlChange"
                  //COMANDO(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(mdf_Ferr_KFCU[iFK]), " // mdF_KeyFam_CtrlChange ", mdF_KeyFam_ctrl_change))
                 }
             }
          if (IS_MATCH(NOME(mdf_Ferr_KFCU[iFK]), "MdF_ContParacolpi") )
             {
              if (STRCMP(VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc"), VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_Par")) != 0)
                 {
                  mdF_KeyFam_ctrl_change = VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc")
                  SET_#(mdf_Ferr_KFCU[iFK])
                  #MdF_Cambiato = "mdF_KeyFam_CtrlChange"
                  //COMANDO(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(mdf_Ferr_KFCU[iFK]), " // mdF_KeyFam_CtrlChange ", mdF_KeyFam_ctrl_change))
                 }
             }
          if (IS_MATCH(NOME(mdf_Ferr_KFCU[iFK]), "MdF_ContParacolpiInt") )
             {
              if (STRCMP(VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc"), VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_ParInt")) != 0)
                 {
                  mdF_KeyFam_ctrl_change = VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc")
                  SET_#(mdf_Ferr_KFCU[iFK])
                  #MdF_Cambiato = "mdF_KeyFam_CtrlChange"
                  //COMANDO(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(mdf_Ferr_KFCU[iFK]), " // mdF_KeyFam_CtrlChange ", mdF_KeyFam_ctrl_change))
                 }
             }
          if (IS_MATCH(NOME(mdf_Ferr_KFCU[iFK]), "MdF_FerramenteGeneriche") )
             {
              if STRCMP((VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc"), VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_FerGen")) != 0)
                 {
                  mdF_KeyFam_ctrl_change = VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc")
                  SET_#(mdf_Ferr_KFCU[iFK])
                  #MdF_Cambiato = "mdF_KeyFam_CtrlChange"
                  //COMANDO(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(mdf_Ferr_KFCU[iFK]), " // mdF_KeyFam_CtrlChange ", mdF_KeyFam_ctrl_change))
                 }
             }
          if (IS_MATCH(NOME(mdf_Ferr_KFCU[iFK]), "MdF_FerramenteGenCri") )
             {
              if STRCMP((VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc"), VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_FerCri")) != 0)
                 {
                  mdF_KeyFam_ctrl_change = VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc")
                  SET_#(mdf_Ferr_KFCU[iFK])
                  #MdF_Cambiato = "mdF_KeyFam_CtrlChange"
                  //COMANDO(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(mdf_Ferr_KFCU[iFK]), " // mdF_KeyFam_CtrlChange ", mdF_KeyFam_ctrl_change))
                 }
             }
          if (IS_MATCH(NOME(mdf_Ferr_KFCU[iFK]), "MdF_Ferramente_4Reg") )
             {
              if ( STRCMP(VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc_FerFro"), VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_FerFro")) != 0
                 | STRCMP(VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc_FerFia"), VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_FerFia")) != 0
                 | STRCMP(VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc_FerPia"), VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_FerPia")) != 0
                 )
                 {
                  mdF_KeyFam_ctrl_change = VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc_FerFro")
                  mdF_KeyFam_ctrl_change_Fia = VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc_FerFia")
                  mdF_KeyFam_ctrl_change_Pia = VAR_VAL_STR(mdf_Ferr_KFCU[iFK], "KeyFamRegFacc_FerPia")

                  mdF_KeyFam_change_Pdr = VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_FerFro")
                  mdF_KeyFam_change_Fia_Pdr = VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_FerFia")
                  mdF_KeyFam_change_Pia_Pdr = VAR_VAL_STR(mdf_KeyFamCtCh_idx, "KeyFamRegFacc_FerPia")

                  SET_#(mdf_Ferr_KFCU[iFK])
                  #MdF_Cambiato = "mdF_KeyFam_CtrlChange"
                  //COMANDO(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(mdf_Ferr_KFCU[iFK]), " // mdF_KeyFam_CtrlChange ", mdF_KeyFam_ctrl_change, " ", mdF_KeyFam_ctrl_change_Fia, " ", mdF_KeyFam_ctrl_change_Pia))
                 }
             }
          iFK = iFK+1
         }
      SET_#(mdf_KeyFamCtCh_idx)
      #mdf_prosegui_action1 = 0
   }

  // 21.09.2016
   PROCEDURA MdF_Ctrl_SbordoY
   {
      // Se mio padre è piu piccolo e quindi ho uno sbordo,
      // ma Y-sbordo non è <= di Y_Fianco perché sono entrato prima di avere la dimensione Y corretta
      // ricalcolo la Battuta_X e quindi anche lo SbordoY
      // E' probabile che capiti solo in OnAfterFirstMdFAdd

      if (VAR_EXIST(idx_att, "MdfSys_SbordoYSup") != 1)  { EXITSUB() }
      if (VAR_EXIST(idx_att, "MdF_Apertura") != 1)       { EXITSUB() }

      mdf_sbordoY_ToRicalc = 0
      if (VAR_VAL(PADRE(idx_att, 1), "Y") < VAR_VAL(idx_att, "Y")-10)
         {
          mdf_att_SbordoYSup = MdfSys_SbordoYSup
          mdf_att_SbordoYInf = MdfSys_SbordoYInf
          if (VAR_VAL(idx_att, "exitBattuta_SX") > -1)
             {
              if (VAR_VAL(exitBattuta_SX, "Y")+10 < Y-MdfSys_SbordoYSup-MdfSys_SbordoYInf)
                 {
                  mdf_sbordoY_ToRicalc = 1
                  mdf_sbordoY_ToRicalc_FiaSx = VAR_VAL(exitBattuta_SX, "Y")
                  mdf_sbordoY_ToRicalc_FroSx = Y-MdfSys_SbordoYSup-MdfSys_SbordoYInf
                 }
             }
          if (VAR_VAL(idx_att, "exitBattuta_DX") > -1)
             {
              if (VAR_VAL(exitBattuta_DX, "Y")+10 < Y-MdfSys_SbordoYSup-MdfSys_SbordoYInf)
                 {
                  mdf_sbordoY_ToRicalc = 2
                  mdf_sbordoY_ToRicalc_FiaDx = VAR_VAL(exitBattuta_DX, "Y")
                  mdf_sbordoY_ToRicalc_FroDx = Y-MdfSys_SbordoYSup-MdfSys_SbordoYInf
                 }
             }
         }
     // 04.10.2016
      if ( VAR_VAL(idx_att, "exitBattuta_SX") > -1
         & VAR_EXIST(idx_att, "exitBattuta_SX") == 1
         )
         {
          bas0_BatFiaSx = VAR_VAL(exitBattuta_SX, "base_0.y")
          alt0_BatFiaSx = VAR_VAL(exitBattuta_SX, "alto_0.y")
          if (alt0_BatFiaSx+20 < alto_0.y - MdfSys_SbordoYSup)
             { mdf_sbordoY_ToRicalc = 2 }

          if (bas0_BatFiaSx-20 > base_0.y + MdfSys_SbordoYInf)
             { mdf_sbordoY_ToRicalc = 3 }
         }

      // 04.10.2016
      if ( VAR_VAL(idx_att, "exitBattuta_DX") > -1
         & VAR_EXIST(idx_att, "exitBattuta_DX") == 1
         )
         {
          bas0_BatFiaDx = VAR_VAL(exitBattuta_DX, "base_0.y")
          alt0_BatFiaDx = VAR_VAL(exitBattuta_DX, "alto_0.y")
          if (alt0_BatFiaDx+20 < alto_0.y - MdfSys_SbordoYSup)
             { mdf_sbordoY_ToRicalc = 2 }

          if (bas0_BatFiaDx-20 > base_0.y + MdfSys_SbordoYInf)
             { mdf_sbordoY_ToRicalc = 3 }
         }
      if (mdf_sbordoY_ToRicalc > 0)
         {
          GOSUB MdF_KeyFam_Battuta_X
         }
   }

   PROCEDURA MdF_Ctrl_FianchiBattuta
   {
     // 20.01.2017
      if (VAR_EXIST(idx_att, "MdF_Apertura") != 1)  { EXITSUB() }
      // Se il Fianco è inserito alla fine e la battuta è controllata prima non trova il fianco
      // e se c'è uno sbordoY potrebbe fallire la regola corretta
      mdf_ctrl_FianchiBattuta = 0
      if ( VAR_VAL(idx_att, "exitBattuta_SX") == -1
         & VAR_VAL(idx_att, "exitBattuta_DX") == -1
         )
         {
          if (ACTION() != 2 & ACTION() != 3)
             {
              if (PADRE(idx_att, 1) != PADRE(idx_att, -1))
                 {
                  COMPONENTI2("mdf_CerBat_InsFiaBat", idx_att, "MdF_CerniereBattenti")
                  if (mdf_CerBat_InsFiaBat > 0)
                     {
                      mdf_ctrl_FianchiBattuta = 1
                      GOSUB MdF_KeyFam_Battuta_X
                     }
                 }
             }
         }
   }

   PROCEDURA MdF_ctrl_Change_Apertura_GEST
   {
      // Su VariabiliMdF.txt impostare MdF_Apertura_var_gest
      // esempio MdF_Apertura_var_gest = "GEST_090"

      mdf_ctrl_Change_Apertura = 0

      if ( VAR_EXIST(idx_att, "mdf_Apertura_var_gest_val_prec") != 1
         & VAR_EXIST(idx_att, "MdF_Apertura_var_gest") == 1
         )
         {
          // 17.04.2024 Ottimizzazione. Entra una volta in meno
          //mdf_Apertura_var_gest_val_prec = "empty"
          mdf_Apertura_var_gest = VAR_VAL_STR(idx_att, "MdF_Apertura_var_gest")
          mdf_Apertura_var_gest_val = VAR_VAL_STR(idx_att, mdf_Apertura_var_gest)
          if (STRLEN(mdf_Apertura_var_gest_val) < 2)
             { mdf_Apertura_var_gest_val = VAR_VAL_STR(PADRE(idx_att, 1), mdf_Apertura_var_gest) }
          if (STRLEN(mdf_Apertura_var_gest_val) < 2)
             { mdf_Apertura_var_gest_val = VAR_VAL_STR(PADRE(idx_att, 2), mdf_Apertura_var_gest) }
          if (STRLEN(mdf_Apertura_var_gest_val) < 2)
             { mdf_Apertura_var_gest_val = VAR_VAL_STR(PADRE(idx_att, 3), mdf_Apertura_var_gest) }

          mdf_Apertura_var_gest_val_prec = mdf_Apertura_var_gest_val
         }

      if ( VAR_EXIST(idx_att, "mdf_Ctrl_var_gest_val_prec") != 1
         & VAR_EXIST(idx_att, "MdF_Ctrl_var_gest") == 1
         )
         {
          mdf_Ctrl_var_gest_val_prec = "empty"
          mdf_Ctrl_var_gest_valNum_prec = -1.11
         }

     // 31.01.2025 ScBgn1057149 Cricchetto Pensile spostato a terra deve andare in alto. Lo fa solo ricaricando l' ordine
      if (VAR_EXIST(idx_att, "mdf_Ctrl_base0y_prec") != 1)
         {
          mdf_Ctrl_base0y_prec = VAR_VAL(idx_att, "base_0.y")
         }

      if (VAR_EXIST(idx_att, "mdf_count_change_VarC") ! = 1)  { mdf_count_change_VarC = 0 }
      mdf_count_change_VarC = mdf_count_change_VarC+1

      if (VAR_EXIST(idx_att, "mdf_count_change_VarC_OK") ! = 1)  { mdf_count_change_VarC_OK = 0 }

   // 11.05.2018
   // Lo abilito per sempre, perché se cambiano delle variabili specifiche devo rileggere le tabelle
      if (VAR_EXIST(idx_att, "MdF_Apertura") == 1)
         {
          if (IS_MATCH(MDFSys_Load_ini, "OnMacro*") != 1)
             {
              // 03.08.2023 La010468
              mdf_ctrl_gest_Action28 = 0
              if ( VAR_VAL(idx_att, "MdF_ElePostValido")
                 & ACTION() == 28
                 )
                 { mdf_ctrl_gest_Action28 = 1 }

              // 07.07.2020 SN01822 aggiunto ACTION 1. In ogni caso controlla appunto se e' cambiato qualcosa
              if ( ACTION() == 3  |  ACTION() == 1
                 // 03.08.2023
                 | mdf_ctrl_gest_Action28 > 0
                 )
                 {
                  if (VAR_EXIST(idx_att, "MdF_Apertura_var_gest") == 1)
                     {
                      mdf_Apertura_var_gest = VAR_VAL_STR(idx_att, "MdF_Apertura_var_gest")
                      mdf_Apertura_var_gest_val = VAR_VAL_STR(idx_att, mdf_Apertura_var_gest)
                      if (STRLEN(mdf_Apertura_var_gest_val) < 2)
                         { mdf_Apertura_var_gest_val = VAR_VAL_STR(PADRE(idx_att, 1), mdf_Apertura_var_gest) }
                      if (STRLEN(mdf_Apertura_var_gest_val) < 2)
                         { mdf_Apertura_var_gest_val = VAR_VAL_STR(PADRE(idx_att, 2), mdf_Apertura_var_gest) }
                      if (STRLEN(mdf_Apertura_var_gest_val) < 2)
                         { mdf_Apertura_var_gest_val = VAR_VAL_STR(PADRE(idx_att, 3), mdf_Apertura_var_gest) }

                      if (STRCMP(mdf_Apertura_var_gest_val, mdf_Apertura_var_gest_val_prec) != 0)
                         {
                          mdf_Apertura_var_gest_val_prec = mdf_Apertura_var_gest_val
                          mdf_ctrl_Change_Apertura = 1
                         }
                     }

                  if ( VAR_EXIST(idx_att, "MdF_Ctrl_var_gest") == 1
                     & STRLEN(VAR_VAL_STR(idx_att, "MdF_Ctrl_var_gest"))
                     // 12.02.2018
                     & STR_INDEX_OF(VAR_VAL_STR(idx_att, "MdF_Ctrl_var_gest"), 0, ";") == -1
                     )
                     {
                      mdf_Ctrl_var_gest = VAR_VAL_STR(idx_att, "MdF_Ctrl_var_gest")
                      mdf_Ctrl_var_gest_val = VAR_VAL_STR(idx_att, mdf_Ctrl_var_gest)
                     // 09.05.2023 Ca GEST_CER=0, 1, 2, 3, 4
                      //if (STRLEN(mdf_Ctrl_var_gest_val) < 2)
                      if ( STRLEN(mdf_Ctrl_var_gest_val) == 0
                         | IS_MATCH(mdf_Ctrl_var_gest_val, "_")
                         | IS_MATCH(mdf_Ctrl_var_gest_val, "__")
                         | IS_MATCH(mdf_Ctrl_var_gest_val, " ")
                         | IS_MATCH(mdf_Ctrl_var_gest_val, "  ")
                         )
                         { mdf_Ctrl_var_gest_val = VAR_VAL_STR(PADRE(idx_att, 1), mdf_Ctrl_var_gest) }
                      //if (STRLEN(mdf_Ctrl_var_gest_val) < 2)
                      if ( STRLEN(mdf_Ctrl_var_gest_val) == 0
                         | IS_MATCH(mdf_Ctrl_var_gest_val, "_")
                         | IS_MATCH(mdf_Ctrl_var_gest_val, "__")
                         | IS_MATCH(mdf_Ctrl_var_gest_val, " ")
                         | IS_MATCH(mdf_Ctrl_var_gest_val, "  ")
                         )
                         { mdf_Ctrl_var_gest_val = VAR_VAL_STR(PADRE(idx_att, 2), mdf_Ctrl_var_gest) }
                      //if (STRLEN(mdf_Ctrl_var_gest_val) < 2)
                      if ( STRLEN(mdf_Ctrl_var_gest_val) == 0
                         | IS_MATCH(mdf_Ctrl_var_gest_val, "_")
                         | IS_MATCH(mdf_Ctrl_var_gest_val, "__")
                         | IS_MATCH(mdf_Ctrl_var_gest_val, " ")
                         | IS_MATCH(mdf_Ctrl_var_gest_val, "  ")
                         )
                         { mdf_Ctrl_var_gest_val = VAR_VAL_STR(PADRE(idx_att, 3), mdf_Ctrl_var_gest) }

                      if (STRCMP(mdf_Ctrl_var_gest_val, mdf_Ctrl_var_gest_val_prec) != 0)
                         {
                          mdf_Ctrl_var_gest_val_prec = mdf_Ctrl_var_gest_val
                          mdf_ctrl_Change_Apertura = 2
                         }

                      mdf_varTypeCtrl = VAR_TYPE(idx_att, mdf_Ctrl_var_gest)
                      //mdf_varTypeCtrl_pdr = VAR_TYPE(PADRE(idx_att, 1), mdf_Ctrl_var_gest)
                      // 15.11.2021
                      mdf_varCtrl_punto = 0
                      if ( IS_MATCH(mdf_Ctrl_var_gest, "base_*")
                         | IS_MATCH(mdf_Ctrl_var_gest, "alto_*")
                         )
                         { mdf_varCtrl_punto = 1 }

                      // 15.11.2019
                      if ( VAR_TYPE(idx_att, mdf_Ctrl_var_gest) == 0
                         | VAR_TYPE(PADRE(idx_att, 1), mdf_Ctrl_var_gest) == 0
                         // 09.05.2023
                         | VAR_TYPE(PADRE(idx_att, 2), mdf_Ctrl_var_gest) == 0
                         | mdf_varCtrl_punto == 1
                         )
                         {
                          mdf_Ctrl_var_gest_val = VAR_VAL(idx_att, mdf_Ctrl_var_gest)
                          if (VAR_EXIST(idx_att, mdf_Ctrl_var_gest) != 1)
                             {
                              mdf_Ctrl_var_gest_val = VAR_VAL(PADRE(idx_att, 1), mdf_Ctrl_var_gest)
                             }
                         // 09.05.2023 Ca1929014 NoLav_Cer
                          if (VAR_EXIST(PADRE(idx_att, 1), mdf_Ctrl_var_gest) != 1)
                             {
                              mdf_Ctrl_var_gest_val = VAR_VAL(PADRE(idx_att, 2), mdf_Ctrl_var_gest)
                             }
                          if (mdf_Ctrl_var_gest_val != mdf_Ctrl_var_gest_valNum_prec)
                             {
                              mdf_Ctrl_var_gest_valNum_prec = mdf_Ctrl_var_gest_val
                              mdf_ctrl_Change_Apertura = 2.1
                             }
                         }
                     }

                  // 12.02.2018
                   if (STR_INDEX_OF(VAR_VAL_STR(idx_att, "MdF_Ctrl_var_gest"), 0, ";") > 0)
                      {
                       if (VAR_VAL(idx_att, "mdf_array_var_gest") > 0)
                          {
                           GOSUB MdF_Ctrl_var_gest_prec
                          }
                      }
                 // 05.09.2024 MCB_CassCestInt
                  if (ACTION() != 2)
                     {
                      if (mdf_ctrl_Change_Apertura <= 0)
                         {
                          if (VAR_VAL(idx_att, "mdf_Ctrl_EleToNEAR_maked") == 0)
                             {
                              mdfstr_input = VAR_VAL_STR(idx_att, "MdF_Ctrl_EleToNEAR")
                              GOSUB MdF_EstraiStringhe
                              mdf_Ctrl_EleToNEAR_maked = 0
                              iSE=1
                              while (iSE <= mdf_array_Stringhe)
                                 {
                                  BOX_MODE(0)
                                  NEAR_GLOBALE("mdf_ctrl_EleToSearch", idx_att, 52, 1, mdf_array_Stringhe[iSE])
                                  icc = 1
                                  while (icc <= mdf_ctrl_EleToSearch)
                                     {
                                      // Se cerco *C*s*t* mi trova MdF_ C ernieraBa s e t taBatt
                                      if (IS_MATCH(NOME(mdf_ctrl_EleToSearch[icc]), "MdF_*") != 1)
                                         { mdf_Ctrl_EleToNEAR_maked = mdf_Ctrl_EleToNEAR_maked+1 }

                                      icc = icc+1
                                     }

                                  iSE = iSE+1
                                 }
                              if (mdf_Ctrl_EleToNEAR_maked > 0)  { mdf_ctrl_Change_Apertura = 200 }
                             }
                         }
                     }

                 // 31.01.2025 ScBgn1057149 Cricchetto Pensile spostato a terra deve andare in alto. Lo fa solo ricaricando l' ordine
                  mdf_Ctrl_base0y_change = 0
                  if (VAR_VAL(idx_att, "base_0.y") != mdf_Ctrl_base0y_prec)
                     {
                      mdf_ctrl_Change_Apertura = 10
                      mdf_Ctrl_base0y_prec = VAR_VAL(idx_att, "base_0.y")
                      mdf_Ctrl_base0y_change = mdf_Ctrl_base0y_prec+0.11
                     }

                  if (mdf_ctrl_Change_Apertura > 0)
                     {
                      //COMANDO2(STRCAT("LOGMSG MdF_ctrl_Change_Apertura_GEST cambiamenti utente dopo OnLoadPers: ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
                      mdf_aper_prec = VAR_VAL_STR(idx_att, "MdF_Apertura")
                      idx_MdF_Var = idx_att
                      GOSUB MdF_VariabiliDaTipoPadri
                      CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(idx_att, "MdF_addKey_keyGenerica"))
                      GOSUB MdF_Variabili
                      CHIAVE_TABVAR_MDF = "keyGenericaFro"
                      GOSUB MdF_Variabili
                     // 05.09.2024
                     // 04.04.2025 A 024595 Se mettevo | mdf_ctrl_Change_Apertura == 1 dato che si tratta effettivamente dell' Apertura in realta non passa perchè cambia anche la GEST_930. Adesso con le ottimizzazioni va bene aprire per > 0
                      // Non posso farci niente. Non si può limitare se dopo non funziona! Posso solo mettere per Apertura Battente
                      //if ( mdf_ctrl_Change_Apertura >= 200)
                      //   {
                      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "*X*") )
                         {
                          CHIAVE_TABVAR_MDF = "CerBat"
                          GOSUB MdF_Variabili
                          CHIAVE_TABVAR_MDF = "CerBatFro"
                          GOSUB MdF_Variabili
                          mdf_ctrl_Change_Apertura_CerBat_deb = mdf_ctrl_Change_Apertura
                         // 04.04.2025 A 024595
                          GOSUB MdF_pos_CerBat
                         }

                      //DISPLAY2(VAR_VAL_STR(idx_att, "scriviVarCheTiInteressa"))
                      mdf_ctrl_MdF_Apertura = 1
                      mdf_count_change_VarC_OK = mdf_count_change_VarC_OK+1
                     }
                 }
             }
         }
   }

  // 12.02.2018
   PROCEDURA MdF_Ctrl_var_gest_Init
   {
      if (VAR_VAL(idx_att, "mdf_array_var_gest") > 0)  { EXITSUB() }
      // 25.10.2019
      if (Z > 50)
         {
          if (VAR_EXIST(idx_att, "MdF_Ctrl_var_gest") == 1)
             { MdF_Ctrl_var_gest = STRCAT(MdF_Ctrl_var_gest, ";Z") }
         }

      if (STR_INDEX_OF(VAR_VAL_STR(idx_att, "MdF_Ctrl_var_gest"), 0, ";") > 0)
         {
          mdfstr_input = VAR_VAL_STR(idx_att, "MdF_Ctrl_var_gest")
          GOSUB MdF_EStr_Ctrl_var_gest

          micv = 1
          while (micv <= mdf_array_var_gest)
             {
              mdf_nome_VAR_gest = STRCAT("MdF_Ctrl_VAL_gest", STR(micv))
              mdf_nome_VAR_gest_prec = STRCAT("MdF_Ctrl_VAL_gest", STR(micv), "_prec")
              if (VAR_EXIST(idx_att, mdf_nome_VAR_gest) != 1)
                 {
                  // 05.04.2018
                  if ( VAR_EXIST(idx_att, mdf_array_var_gest[micv]) == 1
                     | VAR_EXIST(PADRE(idx_att, 1), mdf_array_var_gest[micv]) == 1
                     | VAR_EXIST(PADRE(idx_att, 2), mdf_array_var_gest[micv]) == 1
                     | VAR_EXIST(PADRE(idx_att, 3), mdf_array_var_gest[micv]) == 1
                     )
                     {
                      if ( VAR_TYPE(idx_att, mdf_array_var_gest[micv]) == 1
                         | VAR_TYPE(PADRE(idx_att, 1), mdf_array_var_gest[micv]) == 1
                         | VAR_TYPE(PADRE(idx_att, 2), mdf_array_var_gest[micv]) == 1
                         | VAR_TYPE(PADRE(idx_att, 3), mdf_array_var_gest[micv]) == 1
                         )
                         {
                          MdF_Ctrl_VAL_gest = VAR_VAL_STR(idx_att, mdf_array_var_gest[micv])

                          // 06.05.2024 da 2 a 1, perchè possono esserci valori anche da un carattere
                          if (STRLEN(MdF_Ctrl_VAL_gest) < 1 | STRCMP(MdF_Ctrl_VAL_gest, "__") == 0)
                             { MdF_Ctrl_VAL_gest = VAR_VAL_STR(PADRE(idx_att, 1), mdf_array_var_gest[micv]) }

                          if (STRLEN(MdF_Ctrl_VAL_gest) < 1 | STRCMP(MdF_Ctrl_VAL_gest, "__") == 0)
                             { MdF_Ctrl_VAL_gest = VAR_VAL_STR(PADRE(idx_att, 2), mdf_array_var_gest[micv]) }

                          if (STRLEN(MdF_Ctrl_VAL_gest) < 1 | STRCMP(MdF_Ctrl_VAL_gest, "__") == 0)
                             { MdF_Ctrl_VAL_gest = VAR_VAL_STR(PADRE(idx_att, 3), mdf_array_var_gest[micv]) }

                          VAR_CREATE_STR(idx_att, mdf_nome_VAR_gest, MdF_Ctrl_VAL_gest, 0, "")
                          VAR_CREATE_STR(idx_att, mdf_nome_VAR_gest_prec, MdF_Ctrl_VAL_gest, 0, "")
                         }
                      else
                         {
                          MdF_Ctrl_VAL_gest = VAR_VAL(idx_att, mdf_array_var_gest[micv])

                          if (VAR_EXIST(idx_att, mdf_array_var_gest[micv]) != 1)
                             {
                              MdF_Ctrl_VAL_gest = VAR_VAL(PADRE(idx_att, 1), mdf_array_var_gest[micv])
                              if (VAR_EXIST(PADRE(idx_att, 1), mdf_array_var_gest[micv]) != 1)
                                 {
                                  MdF_Ctrl_VAL_gest = VAR_VAL(PADRE(idx_att, 2), mdf_array_var_gest[micv])
                                  if (VAR_EXIST(PADRE(idx_att, 2), mdf_array_var_gest[micv]) != 1)
                                     { MdF_Ctrl_VAL_gest = VAR_VAL(PADRE(idx_att, 3), mdf_array_var_gest[micv]) }
                                 }
                             }

                          VAR_CREATE_NUM(idx_att, mdf_nome_VAR_gest, MdF_Ctrl_VAL_gest, 0, "")
                          VAR_CREATE_NUM(idx_att, mdf_nome_VAR_gest_prec, MdF_Ctrl_VAL_gest, 0, "")
                         }
                     }
                  else
                     {
                      // 15.05.2024 Se non esistono o non esistono al primo giro le creo stringhe NotFound
                      // altrimenti poi non le confronta piu
                      // Non e' un problema se poi sono numeri perchè eventualmente viene sempre fatto il VAR_VAL e il VAR_CREATE_NUM
                      VAR_CREATE_STR(idx_att, mdf_nome_VAR_gest, "NotFound", 0, "")
                      VAR_CREATE_STR(idx_att, mdf_nome_VAR_gest_prec, "NotFound", 0, "")
                      mdf_deb_VAR_gestNotFound=1
                     }
                 }
              micv = micv+1
             }
         }
   }

   PROCEDURA MdF_Ctrl_var_gest_prec
   {
      if (VAR_VAL(idx_att, "mdf_array_var_gest") <= 0)  { EXITSUB() }

      micv = 1
      while (micv <= mdf_array_var_gest)
         {
          mdf_nome_VAR_gest = STRCAT("MdF_Ctrl_VAL_gest", STR(micv))
          mdf_nome_VAR_gest_prec = STRCAT("MdF_Ctrl_VAL_gest", STR(micv), "_prec")

          // 05.04.2018
          if ( VAR_EXIST(idx_att, mdf_array_var_gest[micv]) == 1
             | VAR_EXIST(PADRE(idx_att, 1), mdf_array_var_gest[micv]) == 1
             | VAR_EXIST(PADRE(idx_att, 2), mdf_array_var_gest[micv]) == 1
             | VAR_EXIST(PADRE(idx_att, 3), mdf_array_var_gest[micv]) == 1
             )
             {
              if ( VAR_TYPE(idx_att, mdf_array_var_gest[micv]) == 1
                 | VAR_TYPE(PADRE(idx_att, 1), mdf_array_var_gest[micv]) == 1
                 | VAR_TYPE(PADRE(idx_att, 2), mdf_array_var_gest[micv]) == 1
                 | VAR_TYPE(PADRE(idx_att, 3), mdf_array_var_gest[micv]) == 1
                 )
                 {
                  MdF_Ctrl_VAL_gest = VAR_VAL_STR(idx_att, mdf_array_var_gest[micv])

                 // 06.05.2024 da 2 a 1, perchè possono esserci valori anche da un carattere
                  if (STRLEN(MdF_Ctrl_VAL_gest) < 1 | STRCMP(MdF_Ctrl_VAL_gest, "__") == 0)
                     { MdF_Ctrl_VAL_gest = VAR_VAL_STR(PADRE(idx_att, 1), mdf_array_var_gest[micv]) }

                  if (STRLEN(MdF_Ctrl_VAL_gest) < 1 | STRCMP(MdF_Ctrl_VAL_gest, "__") == 0)
                     { MdF_Ctrl_VAL_gest = VAR_VAL_STR(PADRE(idx_att, 2), mdf_array_var_gest[micv]) }

                  if (STRLEN(MdF_Ctrl_VAL_gest) < 1 | STRCMP(MdF_Ctrl_VAL_gest, "__") == 0)
                     { MdF_Ctrl_VAL_gest = VAR_VAL_STR(PADRE(idx_att, 3), mdf_array_var_gest[micv]) }

                  MdF_Ctrl_VAL_gest_prec = VAR_VAL_STR(idx_att, mdf_nome_VAR_gest_prec)

                  if (STRCMP(MdF_Ctrl_VAL_gest, MdF_Ctrl_VAL_gest_prec) != 0)
                     {
                      mdf_ctrl_Change_varianteVAL_prec = MdF_Ctrl_VAL_gest_prec
                      mdf_ctrl_Change_variante = mdf_array_var_gest[micv]
                      VAR_CREATE_STR(idx_att, mdf_nome_VAR_gest, MdF_Ctrl_VAL_gest, 0, "")
                      VAR_CREATE_STR(idx_att, mdf_nome_VAR_gest_prec, MdF_Ctrl_VAL_gest, 0, "")
                      mdf_ctrl_Change_Apertura = 3
                      //DISPLAY2("change MdF_Ctrl_var_gest_prec")
                     }
                 }
              else
                 {
                  MdF_Ctrl_VAL_gest = VAR_VAL(idx_att, mdf_array_var_gest[micv])

                  if (VAR_EXIST(idx_att, mdf_array_var_gest[micv]) != 1)
                     {
                      MdF_Ctrl_VAL_gest = VAR_VAL(PADRE(idx_att, 1), mdf_array_var_gest[micv])
                      if (VAR_EXIST(PADRE(idx_att, 1), mdf_array_var_gest[micv]) != 1)
                         {
                          MdF_Ctrl_VAL_gest = VAR_VAL(PADRE(idx_att, 2), mdf_array_var_gest[micv])
                          if (VAR_EXIST(PADRE(idx_att, 2), mdf_array_var_gest[micv]) != 1)
                             { MdF_Ctrl_VAL_gest = VAR_VAL(PADRE(idx_att, 3), mdf_array_var_gest[micv]) }
                         }
                     }

                  MdF_Ctrl_VAL_gest_prec = VAR_VAL(idx_att, mdf_nome_VAR_gest_prec)

                  if (MdF_Ctrl_VAL_gest != MdF_Ctrl_VAL_gest_prec)
                     {
                      mdf_ctrl_Change_varianteVAL_prec = MdF_Ctrl_VAL_gest_prec
                      mdf_ctrl_Change_variante = mdf_array_var_gest[micv]
                      VAR_CREATE_NUM(idx_att, mdf_nome_VAR_gest, MdF_Ctrl_VAL_gest, 0, "")
                      VAR_CREATE_NUM(idx_att, mdf_nome_VAR_gest_prec, MdF_Ctrl_VAL_gest, 0, "")
                      mdf_ctrl_Change_Apertura = 3.1
                      //DISPLAY2("change MdF_Ctrl_var_gest_prec")
                     }
                 }
             }
          micv = micv+1
         }
   }

   PROCEDURA MdF_ctrl_Apertura_GEST_def
   {
      if ( VAR_EXIST(idx_att, "mdf_Apertura_var_gest_val_prec") != 1
         & VAR_EXIST(idx_att, "MdF_Apertura_var_gest") == 1
         )
         {
          mdf_Apertura_var_gest = VAR_VAL_STR(idx_att, "MdF_Apertura_var_gest")
          mdf_Apertura_var_gest_val_prec = VAR_VAL_STR(idx_att, mdf_Apertura_var_gest)
          if (STRLEN(mdf_Apertura_var_gest_val_prec) < 2)
             { mdf_Apertura_var_gest_val_prec = VAR_VAL_STR(PADRE(idx_att, 1), mdf_Apertura_var_gest) }
          if (STRLEN(mdf_Apertura_var_gest_val_prec) < 2)
             { mdf_Apertura_var_gest_val_prec = VAR_VAL_STR(PADRE(idx_att, 2), mdf_Apertura_var_gest) }
          if (STRLEN(mdf_Apertura_var_gest_val_prec) < 2)
             { mdf_Apertura_var_gest_val_prec = VAR_VAL_STR(PADRE(idx_att, 3), mdf_Apertura_var_gest) }
          if (STRLEN(mdf_Apertura_var_gest_val_prec) < 2)
             { mdf_Apertura_var_gest_val_prec = "empty" }
         }
   }

   // 02.05.2024
   PROCEDURA MdF_ctrl_Change_Var_CAM
   {
      // Su VariabiliMdF.txt impostare MdF_Ctrl_var_gest_MdF
      mdf_ctrl_Change_Var_CAM = 0
      mdf_ctrl_Change_SbordoY = 0

      if (STRLEN(VAR_VAL_STR(idx_att, "MdF_Apertura")) < 2)
         {
          mdf_ctrl_Change_Var_CAM = 0.5
          EXITSUB()
         }

      if ( VAR_EXIST(idx_att, "mdf_Ctrl_var_gest_MdF_val_prec") != 1
         & VAR_EXIST(idx_att, "MdF_Ctrl_var_gest_MdF") == 1
         )
         {
          mdf_Ctrl_var_gest_MdF_val_prec = "empty"
          mdf_Ctrl_var_gest_MdF_valNum_prec = -1.11
         }

      if (ACTION() == 1064)  { EXITSUB() }

      // Per compatibilita
      if (VAR_EXIST(idx_att, "MdF_Ctrl_var_gest_MdF") != 1)  { mdf_ctrl_Change_Var_CAM = 0.9 }

      if (VAR_VAL(-1, "CAM_CloseOpenTab") > 1)  { mdf_ctrl_Change_Var_CAM = 1000 }

      // 06.05.2024
      if (IS_MATCH(NOME(idx_att), "MdF_CerniereBatt*") )
         {
          mdf_tLav = "CerBat"
          // Era l' MdF che era senza _CerBat. Avendolo aggiunto e' uscito il problema
          //if (VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", mdf_tLav)) != VAR_VAL_STR(PADRE(idx_att, 1), "KeyFamRegFacc") )
          //   { mdf_ctrl_Change_Var_CAM = 99 }
          if (VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", mdf_tLav)) != VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", mdf_tLav)) )
             { mdf_ctrl_Change_Var_CAM = 99 }
         // 15.05.2024 2093PCL024513022
          if (VAR_VAL_STR(idx_att, "KeyFamRegFacc") != VAR_VAL_STR(idx_att, "KeyFamRegFacc_prec") )
             { mdf_ctrl_Change_Var_CAM = 99.1 }
         }

     // 27.06.2024 spostata fuori da MdF_CerniereBatt* giusto per sicurezza
     // 26.06.2024 In gestione utente, se si cambia dimensione e poi SbordoY
      if ( VAR_VAL(idx_att, "MdfSys_SbordoYSup") != VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYSup")
         | VAR_VAL(idx_att, "MdfSys_SbordoYInf") != VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYInf")
         )
         {
          mdf_ctrl_Change_SbordoY = 1
          mdf_ctrl_Change_Var_CAM = 99.2
         }

      if ( VAR_VAL(idx_att, "MdfSys_SbordoYSup_DaCop") != VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYSup_DaCop")
         | VAR_VAL(idx_att, "MdfSys_SbordoYInf_DaFon") != VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYInf_DaFon")
         )
         {
          mdf_ctrl_Change_SbordoY = 2
          mdf_ctrl_Change_Var_CAM = 98.11
         }

      if (IS_MATCH(NOME(idx_att), "MdF_CernierePistoneVasRib*") )
         {
          mdf_tLav = "CerRib"
          if (VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", mdf_tLav)) != VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", mdf_tLav)) )
             { mdf_ctrl_Change_Var_CAM = 99 }

          if (VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", mdf_tLav)) != VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", mdf_tLav, "_prec")) )
             { mdf_ctrl_Change_Var_CAM = 99.1 }

          mdf_tLav = "PisAnta"
          if (VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", mdf_tLav)) != VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", mdf_tLav)) )
             { mdf_ctrl_Change_Var_CAM = 99.2 }

          if (VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", mdf_tLav)) != VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", mdf_tLav, "_prec")) )
             { mdf_ctrl_Change_Var_CAM = 99.21 }

          mdf_tLav = "PisFia"
          if (VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", mdf_tLav)) != VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", mdf_tLav)) )
             { mdf_ctrl_Change_Var_CAM = 99.3 }

          if (VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", mdf_tLav)) != VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", mdf_tLav, "_prec")) )
             { mdf_ctrl_Change_Var_CAM = 99.31 }
         }

     // 17.05.2024
      if ( IS_MATCH(NOME(idx_att), "MdF_FerramenteGenCri*")
         | IS_MATCH(NOME(idx_att), "MdF_ContParacolpi*")
         )
         {
          mdf_tLav = "FerCri"
          if (IS_MATCH(NOME(idx_att), "MdF_ContParacolpi*") )  { mdf_tLav = "Par" }

          if (VAR_VAL_STR(idx_att, "KeyFamRegFacc") != VAR_VAL_STR(PADRE(idx_att, 1), STRCAT("KeyFamRegFacc_", mdf_tLav)) )
             { mdf_ctrl_Change_Var_CAM = 99 }

          if (VAR_VAL_STR(idx_att, "KeyFamRegFacc") != VAR_VAL_STR(idx_att, "KeyFamRegFacc_prec") )
             { mdf_ctrl_Change_Var_CAM = 99.1 }
         }

      if (VAR_EXIST(idx_att, "mdf_count_change_VarC") ! = 1)  { mdf_count_change_VarC = 0 }
      mdf_count_change_VarC = mdf_count_change_VarC+1

      if (VAR_EXIST(idx_att, "mdf_count_change_VarC_OK") ! = 1)  { mdf_count_change_VarC_OK = 0 }

      if (VAR_EXIST(idx_att, "MdF_Apertura") == 1)
         {
          if (IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MDFSys_Load_ini"), "OnMacro*") != 1)
             {
              mdf_ctrl_gest_Action28 = 0
              if (VAR_VAL(PADRE(idx_att, 1), "MdF_ElePostValido") )
                 { mdf_ctrl_gest_Action28 = 1 }

              if ( ACTION() == 3  |  ACTION() == 1
                 | mdf_ctrl_gest_Action28 > 0
                 )
                 {
                  if ( VAR_EXIST(idx_att, "MdF_Ctrl_var_gest_MdF") == 1
                     & STRLEN(VAR_VAL_STR(idx_att, "MdF_Ctrl_var_gest_MdF"))
                     & STR_INDEX_OF(VAR_VAL_STR(idx_att, "MdF_Ctrl_var_gest_MdF"), 0, ";") == -1
                     )
                     {
                      mdf_Ctrl_var_gest_MdF = VAR_VAL_STR(idx_att, "MdF_Ctrl_var_gest_MdF")
                      mdf_Ctrl_var_gest_val_MdF = VAR_VAL_STR(idx_att, mdf_Ctrl_var_gest_MdF)
                      if ( STRLEN(mdf_Ctrl_var_gest_val_MdF) == 0
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, "_")
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, "__")
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, " ")
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, "  ")
                         )
                         { mdf_Ctrl_var_gest_val_MdF = VAR_VAL_STR(PADRE(idx_att, 1), mdf_Ctrl_var_gest_MdF) }

                      if ( STRLEN(mdf_Ctrl_var_gest_val_MdF) == 0
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, "_")
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, "__")
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, " ")
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, "  ")
                         )
                         { mdf_Ctrl_var_gest_val_MdF = VAR_VAL_STR(PADRE(idx_att, 2), mdf_Ctrl_var_gest_MdF) }

                      if ( STRLEN(mdf_Ctrl_var_gest_val_MdF) == 0
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, "_")
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, "__")
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, " ")
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, "  ")
                         )
                         { mdf_Ctrl_var_gest_val_MdF = VAR_VAL_STR(PADRE(idx_att, 3), mdf_Ctrl_var_gest_MdF) }

                      if ( STRLEN(mdf_Ctrl_var_gest_val_MdF) == 0
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, "_")
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, "__")
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, " ")
                         | IS_MATCH(mdf_Ctrl_var_gest_val_MdF, "  ")
                         )
                         { mdf_Ctrl_var_gest_val_MdF = VAR_VAL_STR(PADRE(idx_att, 4), mdf_Ctrl_var_gest_MdF) }

                      if (STRCMP(mdf_Ctrl_var_gest_val_MdF, mdf_Ctrl_var_gest_val_MdF_prec) != 0)
                         {
                          mdf_Ctrl_var_gest_val_MdF_prec = mdf_Ctrl_var_gest_val_MdF
                          mdf_ctrl_Change_Var_CAM = 2
                         }

                      mdf_varTypeCtrl = VAR_TYPE(idx_att, mdf_Ctrl_var_gest)
                      //mdf_varTypeCtrl_pdr = VAR_TYPE(PADRE(idx_att, 1), mdf_Ctrl_var_gest)
                      mdf_varCtrl_punto = 0
                      if ( IS_MATCH(mdf_Ctrl_var_gest_MdF, "base_*")
                         | IS_MATCH(mdf_Ctrl_var_gest_MdF, "alto_*")
                         )
                         { mdf_varCtrl_punto = 1 }

                      if ( VAR_TYPE(idx_att, mdf_Ctrl_var_gest_MdF) == 0
                         | VAR_TYPE(PADRE(idx_att, 1), mdf_Ctrl_var_gest_MdF) == 0
                         | VAR_TYPE(PADRE(idx_att, 2), mdf_Ctrl_var_gest_MdF) == 0
                         | mdf_varCtrl_punto == 1
                         )
                         {
                          mdf_Ctrl_var_gest_val_MdF = VAR_VAL(idx_att, mdf_Ctrl_var_gest)
                          if (VAR_EXIST(idx_att, mdf_Ctrl_var_gest_MdF) != 1)
                             {
                              mdf_Ctrl_var_gest_val_MdF = VAR_VAL(PADRE(idx_att, 1), mdf_Ctrl_var_gest_MdF)
                             }
                          if (VAR_EXIST(PADRE(idx_att, 1), mdf_Ctrl_var_gest_MdF) != 1)
                             {
                              mdf_Ctrl_var_gest_val_MdF = VAR_VAL(PADRE(idx_att, 2), mdf_Ctrl_var_gest_MdF)
                             }
                          if (VAR_EXIST(PADRE(idx_att, 2), mdf_Ctrl_var_gest_MdF) != 1)
                             {
                              mdf_Ctrl_var_gest_val_MdF = VAR_VAL(PADRE(idx_att, 3), mdf_Ctrl_var_gest_MdF)
                             }
                          if (mdf_Ctrl_var_gest_val_MdF != mdf_Ctrl_var_gest_valNum_MdF_prec)
                             {
                              mdf_Ctrl_var_gest_valNum_MdF_prec = mdf_Ctrl_var_gest_val_MdF
                              mdf_ctrl_Change_Var_CAM = 2.1
                             }
                         }
                     }

                   if (STR_INDEX_OF(VAR_VAL_STR(idx_att, "MdF_Ctrl_var_gest_MdF"), 0, ";") > 0)
                      {
                       if (VAR_VAL(idx_att, "mdf_array_var_gest") > 0)
                          {
                           GOSUB MdF_Ctrl_var_cam_prec
                          }
                      }

                  if (mdf_ctrl_Change_Var_CAM > 0.5)
                     {
                      //COMANDO2(STRCAT("LOGMSG MdF_ctrl_Change_Var_CAM cambiamenti utente dopo OnLoadPers: ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
                      mdf_count_change_VarC_OK = mdf_count_change_VarC_OK+1
                      mdf_ctrl_Change_Var_CAM_deb = mdf_ctrl_Change_Var_CAM
                      //DISPLAY2(VAR_VAL_STR(idx_att, "scriviVarCheTiInteressa"))
                     }
                 }
             }
         }

      // 07.06.2024 Col Frigo 80979 MdF_BasettaSXDX su mdf_ADD_sat aveva mdf_idx_Battuta_SX diverso da exitBattuta_SX del CamMdFrontali
      // perchè inizialmente trovava un Fianco di chiusura. Il problema è maggiormente per MdF_sat_Basetta_Attrezzata=1
      // però è bene che siano coerenti sempre
      idx_MdF = idx_att
      if (VAR_EXIST(idx_att, "mdf_idx_Battuta_SX") != 1)  { GOSUB mdf_idx_Battuta_SX }
      if (VAR_EXIST(idx_att, "mdf_idx_Battuta_DX") != 1)  { GOSUB mdf_idx_Battuta_DX }
      if (mdf_ctrl_Change_Var_CAM == 0)
         {
          if (ACTION() != 2)
             {
              if ( VAR_VAL(idx_att, "mdf_idx_Battuta_SX") != VAR_VAL(PADRE(idx_att, 1), "exitBattuta_SX")
                 // 14.10.2024 2024004477 Non mi e' chiaro il perchè di questa if
                 //& VAR_VAL(idx_att, "mdf_idx_Battuta_SX") != idx_att
                 // 06.08.2024 Con la Macro CAM exitBattuta_SX prende il Fianco in basso, mentre prima era quello in alto
                 & VAR_VAL(idx_att, "mdf_idx_Battuta_SX_sec") != VAR_VAL(PADRE(idx_att, 1), "exitBattuta_SX")
                 )
                 {
                  // 14.10.2024 Se prima nemmeno entrava, per ora non serve il ctrl_Change_Var_CAM
                  if (VAR_VAL(idx_att, "mdf_idx_Battuta_SX") != idx_att)
                     { mdf_ctrl_Change_Var_CAM = 150 }
                  GOSUB mdf_idx_Battuta_SX
                 }

              if ( VAR_VAL(idx_att, "mdf_idx_Battuta_DX") != VAR_VAL(PADRE(idx_att, 1), "exitBattuta_DX")
                 // 14.10.2024 2024004477 Non mi e' chiaro il perchè di questa if
                 //& VAR_VAL(idx_att, "mdf_idx_Battuta_DX") != idx_att
                 // 06.08.2024 Con la Macro CAM exitBattuta_DX prende il Fianco in basso, mentre prima era quello in alto
                 & VAR_VAL(idx_att, "mdf_idx_Battuta_DX_sec") != VAR_VAL(PADRE(idx_att, 1), "exitBattuta_DX")
                 )
                 {
                  // 14.10.2024 Se prima nemmeno entrava, per ora non serve il ctrl_Change_Var_CAM
                  if (VAR_VAL(idx_att, "mdf_idx_Battuta_DX") != idx_att)
                     { mdf_ctrl_Change_Var_CAM = 151 }
                  GOSUB mdf_idx_Battuta_DX
                 }
             }
         }

     // 24.05.2024 A questo punto qui vanno aggiunti tutti i casi che non funzionano post ottimizzazoni
      // Purtroppo diventa un po' fuori standard, ma vediamo se sono tanti i casi. Diciamo che arrivati ad oggi si puo anche fare
      // cosi da capire i casi con problemi e perchè hanno problemi con le ottimizzazioni
      // Si potrebbe eseguire una GOSUB globale da fare esternamente per singolo cliente, ma intanto vediamo
      // oppure, meglio, aggiungere una var MdF_Ctrl_EleToNEAR con gli archetipi da ricercare che potrebbero far cambiare le regole
      if (mdf_ctrl_Change_Var_CAM == 0)
         {
          if (ACTION() != 2)
             {
              // 20.06.2024 Sc Base ANP 71020754 in inserimento
              if (VAR_VAL_STR(idx_att, "MdF_Apertura") != VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Apertura"))
                 { mdf_ctrl_Change_Var_CAM = 999 }

              mdf_Ctrl_EleToNEAR_maked = 0
              if (VAR_EXIST(idx_att, "MdF_Ctrl_EleToNEAR") != 1)
                 {
                  if (VAR_VAL(idx_att, "mdf_Ctrl_EleToNEAR_maked") == 0)
                     {
                      if (IS_MATCH(NOME(idx_att), "MdF_CerniereBatt*") )
                         {
                          // AOCL066727 Pan.056
                          var_AlScocca = "MdF_AliasScocca"
                          if (STR_INDEX_OF(VAR_VAL_STR(idx_att, var_AlScocca), 0, "ANP") >- 1)
                             {
                              if (VAR_VAL(idx_att, "mdf_ctrl_FiaVic") == 0)
                                 {
                                  BOX_MODE(0)
                                  NEAR_GLOBALE("mdf_ctrl_FiaVic", idx_att, 4, 1, "*Fia*")
                                  if (mdf_ctrl_FiaVic > 0)
                                     {
                                      //mdf_ctrl_Change_Var_CAM = 100
                                      mdf_Ctrl_EleToNEAR_maked = mdf_Ctrl_EleToNEAR_maked+1
                                     }
                                 }
                             }
                          // 29.05.2024 sostituita da MdF_Ctrl_EleToNEAR
                          //// Sc1023022113 CO80CASSINT2023
                          //if (VAR_EXIST(idx_att, "MdF_CassInt") )
                          //   {
                          //    if (VAR_VAL(idx_att, "mdf_ctrl_CassInt") == 0)
                          //       {
                          //        BOX_MODE(0)
                          //        NEAR_GLOBALE("mdf_ctrl_Cst", idx_att, 7, 1, "*C*s*t*")
                          //        // 28.05.2024 MdF_ C ernieraBa s etta_Ba t t
                          //        mdf_ctrl_CassInt = 0
                          //        icc = 1
                          //        while (icc <= mdf_ctrl_Cst)
                          //           {
                          //            if (IS_MATCH(NOME(mdf_ctrl_Cst[icc]), "MdF_*") != 1)
                          //               { mdf_ctrl_CassInt = mdf_ctrl_CassInt+1 }
                          //
                          //            icc = icc+1
                          //           }
                          //        if (mdf_ctrl_CassInt > 0)
                          //           {
                          //            mdf_ctrl_Change_Var_CAM = 101
                          //            //if (PADRE(idx_att, 1) == 79336)  { DISPLAY2(STRCAT("MdF_ctrl_Change_Var_CAM ", STR(VAR_VAL(idx_att, "mdf_ctrl_Change_Var_CAM")))) }
                          //           }
                          //       }
                          //   }
                         }
                     }
                  if (mdf_Ctrl_EleToNEAR_maked > 0)  { mdf_ctrl_Change_Var_CAM = 100 }
                 }
              else
                 {
                  // Vedi anche Sc1023022113 CO80CASSINT2023
                  // 29.05.2024 Vedi anche se MdF_sat_Basetta_Attrezzata=1 e mdfsys_collY_sposta_idx_MdFgraf
                  // Da impostare su CerBat cosi vale solo per MdF_CerniereBattenti
                  if (VAR_VAL(idx_att, "mdf_Ctrl_EleToNEAR_maked") == 0)
                     {
                      mdfstr_input = VAR_VAL_STR(idx_att, "MdF_Ctrl_EleToNEAR")
                      GOSUB MdF_EstraiStringhe
                      mdf_Ctrl_EleToNEAR_maked = 0
                      iSE=1
                      while (iSE <= mdf_array_Stringhe)
                         {
                          BOX_MODE(0)
                          NEAR_GLOBALE("mdf_ctrl_EleToSearch", idx_att, 52, 1, mdf_array_Stringhe[iSE])
                          icc = 1
                          while (icc <= mdf_ctrl_EleToSearch)
                             {
                              // Se cerco *C*s*t* mi trova MdF_ C ernieraBa s e t taBatt
                              if (IS_MATCH(NOME(mdf_ctrl_EleToSearch[icc]), "MdF_*") != 1)
                                 { mdf_Ctrl_EleToNEAR_maked = mdf_Ctrl_EleToNEAR_maked+1 }

                              icc = icc+1
                             }

                          iSE = iSE+1
                         }
                      // Usato anche per i sat, perchè in questo caso forse non serve controllare/cambiare i sat
                      if (mdf_Ctrl_EleToNEAR_maked > 0)  { mdf_ctrl_Change_Var_CAM = 200 }
                     }
                 }
             }
         }
   }

   PROCEDURA MdF_Ctrl_var_cam_Init
   {
      if (ACTION() == 1064)  { EXITSUB() }

      if (VAR_VAL(idx_att, "mdf_array_var_gest") > 0)  { EXITSUB() }

      if (Z > 50)
         {
          if (VAR_EXIST(idx_att, "MdF_Ctrl_var_gest_MdF") == 1)
             { MdF_Ctrl_var_gest_MdF = STRCAT(MdF_Ctrl_var_gest_MdF, ";Z") }
         }

      if (STR_INDEX_OF(VAR_VAL_STR(idx_att, "MdF_Ctrl_var_gest_MdF"), 0, ";") > 0)
         {
          mdfstr_input = VAR_VAL_STR(idx_att, "MdF_Ctrl_var_gest_MdF")
          GOSUB MdF_EStr_Ctrl_var_gest

          micv = 1
          while (micv <= mdf_array_var_gest)
             {
              mdf_nome_VAR_gest = STRCAT("MdF_Ctrl_VAL_gest", STR(micv))
              mdf_nome_VAR_gest_prec = STRCAT("MdF_Ctrl_VAL_gest", STR(micv), "_prec")
              if (VAR_EXIST(idx_att, mdf_nome_VAR_gest) != 1)
                 {
                  // 05.04.2018
                  if ( VAR_EXIST(idx_att, mdf_array_var_gest[micv]) == 1
                     | VAR_EXIST(PADRE(idx_att, 1), mdf_array_var_gest[micv]) == 1
                     | VAR_EXIST(PADRE(idx_att, 2), mdf_array_var_gest[micv]) == 1
                     | VAR_EXIST(PADRE(idx_att, 3), mdf_array_var_gest[micv]) == 1
                     | VAR_EXIST(PADRE(idx_att, 4), mdf_array_var_gest[micv]) == 1
                     )
                     {
                      if ( VAR_TYPE(idx_att, mdf_array_var_gest[micv]) == 1
                         | VAR_TYPE(PADRE(idx_att, 1), mdf_array_var_gest[micv]) == 1
                         | VAR_TYPE(PADRE(idx_att, 2), mdf_array_var_gest[micv]) == 1
                         | VAR_TYPE(PADRE(idx_att, 3), mdf_array_var_gest[micv]) == 1
                         | VAR_TYPE(PADRE(idx_att, 4), mdf_array_var_gest[micv]) == 1
                         )
                         {
                          MdF_Ctrl_VAL_gest = VAR_VAL_STR(idx_att, mdf_array_var_gest[micv])
                          mdf_idx_Ctrl_gest = idx_att

                          if (STRLEN(MdF_Ctrl_VAL_gest) < 1 | STRCMP(MdF_Ctrl_VAL_gest, "__") == 0)
                             {
                              MdF_Ctrl_VAL_gest = VAR_VAL_STR(PADRE(idx_att, 1), mdf_array_var_gest[micv])
                              mdf_idx_Ctrl_gest = PADRE(idx_att, 1)
                             }

                          if (STRLEN(MdF_Ctrl_VAL_gest) < 1 | STRCMP(MdF_Ctrl_VAL_gest, "__") == 0)
                             {
                              MdF_Ctrl_VAL_gest = VAR_VAL_STR(PADRE(idx_att, 2), mdf_array_var_gest[micv])
                              mdf_idx_Ctrl_gest = PADRE(idx_att, 2)
                             }

                          if (STRLEN(MdF_Ctrl_VAL_gest) < 1 | STRCMP(MdF_Ctrl_VAL_gest, "__") == 0)
                             {
                              MdF_Ctrl_VAL_gest = VAR_VAL_STR(PADRE(idx_att, 3), mdf_array_var_gest[micv])
                              mdf_idx_Ctrl_gest = PADRE(idx_att, 3)
                             }

                          if (STRLEN(MdF_Ctrl_VAL_gest) < 1 | STRCMP(MdF_Ctrl_VAL_gest, "__") == 0)
                             {
                              MdF_Ctrl_VAL_gest = VAR_VAL_STR(PADRE(idx_att, 4), mdf_array_var_gest[micv])
                              mdf_idx_Ctrl_gest = PADRE(idx_att, 4)
                             }

                          VAR_CREATE_STR(idx_att, mdf_nome_VAR_gest, MdF_Ctrl_VAL_gest, 0, "")
                          VAR_CREATE_STR(idx_att, mdf_nome_VAR_gest_prec, MdF_Ctrl_VAL_gest, 0, "")
                         }
                      else
                         {
                          MdF_Ctrl_VAL_gest = VAR_VAL(idx_att, mdf_array_var_gest[micv])

                          if (VAR_EXIST(idx_att, mdf_array_var_gest[micv]) != 1)
                             {
                              MdF_Ctrl_VAL_gest = VAR_VAL(PADRE(idx_att, 1), mdf_array_var_gest[micv])
                              if (VAR_EXIST(PADRE(idx_att, 1), mdf_array_var_gest[micv]) != 1)
                                 {
                                  MdF_Ctrl_VAL_gest = VAR_VAL(PADRE(idx_att, 2), mdf_array_var_gest[micv])
                                  if (VAR_EXIST(PADRE(idx_att, 2), mdf_array_var_gest[micv]) != 1)
                                     {
                                      MdF_Ctrl_VAL_gest = VAR_VAL(PADRE(idx_att, 3), mdf_array_var_gest[micv])
                                      if (VAR_EXIST(PADRE(idx_att, 3), mdf_array_var_gest[micv]) != 1)
                                         { MdF_Ctrl_VAL_gest = VAR_VAL(PADRE(idx_att, 4), mdf_array_var_gest[micv]) }
                                     }
                                 }
                             }

                          VAR_CREATE_NUM(idx_att, mdf_nome_VAR_gest, MdF_Ctrl_VAL_gest, 0, "")
                          VAR_CREATE_NUM(idx_att, mdf_nome_VAR_gest_prec, MdF_Ctrl_VAL_gest, 0, "")
                         }
                     }
                  else
                     {
                      // 15.05.2024 Se non esistono o non esistono al primo giro le creo stringhe NotFound
                      // altrimenti poi non le confronta piu
                      // Non e' un problema se poi sono numeri perchè eventualmente viene sempre fatto il VAR_VAL e il VAR_CREATE_NUM
                      VAR_CREATE_STR(idx_att, mdf_nome_VAR_gest, "NotFound", 0, "")
                      VAR_CREATE_STR(idx_att, mdf_nome_VAR_gest_prec, "NotFound", 0, "")
                      mdf_deb_VAR_gestNotFound=2
                     }
                 }
              micv = micv+1
             }
         }
   }

   PROCEDURA MdF_Ctrl_var_cam_prec
   {
      if (VAR_VAL(idx_att, "mdf_array_var_gest") <= 0)  { EXITSUB() }

      micv = 1
      while (micv <= mdf_array_var_gest)
         {
          mdf_nome_VAR_gest = STRCAT("MdF_Ctrl_VAL_gest", STR(micv))
          mdf_nome_VAR_gest_prec = STRCAT("MdF_Ctrl_VAL_gest", STR(micv), "_prec")

          if ( VAR_EXIST(idx_att, mdf_array_var_gest[micv]) == 1
             | VAR_EXIST(PADRE(idx_att, 1), mdf_array_var_gest[micv]) == 1
             | VAR_EXIST(PADRE(idx_att, 2), mdf_array_var_gest[micv]) == 1
             | VAR_EXIST(PADRE(idx_att, 3), mdf_array_var_gest[micv]) == 1
             | VAR_EXIST(PADRE(idx_att, 4), mdf_array_var_gest[micv]) == 1
             )
             {
              if ( VAR_TYPE(idx_att, mdf_array_var_gest[micv]) == 1
                 | VAR_TYPE(PADRE(idx_att, 1), mdf_array_var_gest[micv]) == 1
                 | VAR_TYPE(PADRE(idx_att, 2), mdf_array_var_gest[micv]) == 1
                 | VAR_TYPE(PADRE(idx_att, 3), mdf_array_var_gest[micv]) == 1
                 | VAR_TYPE(PADRE(idx_att, 4), mdf_array_var_gest[micv]) == 1
                 )
                 {
                  MdF_Ctrl_VAL_gest = VAR_VAL_STR(idx_att, mdf_array_var_gest[micv])

                  mdf_idx_Ctrl_gest = idx_att
                  if (STRLEN(MdF_Ctrl_VAL_gest) < 1 | STRCMP(MdF_Ctrl_VAL_gest, "__") == 0)
                     {
                      MdF_Ctrl_VAL_gest = VAR_VAL_STR(PADRE(idx_att, 1), mdf_array_var_gest[micv])
                      mdf_idx_Ctrl_gest = PADRE(idx_att, 1)
                     }

                  if (STRLEN(MdF_Ctrl_VAL_gest) < 1 | STRCMP(MdF_Ctrl_VAL_gest, "__") == 0)
                     {
                      MdF_Ctrl_VAL_gest = VAR_VAL_STR(PADRE(idx_att, 2), mdf_array_var_gest[micv])
                      mdf_idx_Ctrl_gest = PADRE(idx_att, 2)
                     }

                  if (STRLEN(MdF_Ctrl_VAL_gest) < 1 | STRCMP(MdF_Ctrl_VAL_gest, "__") == 0)
                     {
                      MdF_Ctrl_VAL_gest = VAR_VAL_STR(PADRE(idx_att, 3), mdf_array_var_gest[micv])
                      mdf_idx_Ctrl_gest = PADRE(idx_att, 3)
                     }

                  if (STRLEN(MdF_Ctrl_VAL_gest) < 1 | STRCMP(MdF_Ctrl_VAL_gest, "__") == 0)
                     {
                      MdF_Ctrl_VAL_gest = VAR_VAL_STR(PADRE(idx_att, 4), mdf_array_var_gest[micv])
                      mdf_idx_Ctrl_gest = PADRE(idx_att, 4)
                     }

                  MdF_Ctrl_VAL_gest_prec = VAR_VAL_STR(idx_att, mdf_nome_VAR_gest_prec)

                  if (STRCMP(MdF_Ctrl_VAL_gest, MdF_Ctrl_VAL_gest_prec) != 0)
                     {
                      MdF_Ctrl_VAL_gest_deb = MdF_Ctrl_VAL_gest
                      mdf_ctrl_Change_varianteVAL_prec = MdF_Ctrl_VAL_gest_prec
                      mdf_ctrl_Change_variante = mdf_array_var_gest[micv]

                      VAR_CREATE_STR(idx_att, mdf_nome_VAR_gest, MdF_Ctrl_VAL_gest, 0, "")
                      VAR_CREATE_STR(idx_att, mdf_nome_VAR_gest_prec, MdF_Ctrl_VAL_gest, 0, "")
                      mdf_ctrl_Change_Var_CAM = 3
                      //DISPLAY2("change MdF_Ctrl_var_gest_prec")
                     }
                 }
              else
                 {
                  MdF_Ctrl_VAL_gest = VAR_VAL(idx_att, mdf_array_var_gest[micv])

                  if (VAR_EXIST(idx_att, mdf_array_var_gest[micv]) != 1)
                     {
                      MdF_Ctrl_VAL_gest = VAR_VAL(PADRE(idx_att, 1), mdf_array_var_gest[micv])
                      if (VAR_EXIST(PADRE(idx_att, 1), mdf_array_var_gest[micv]) != 1)
                         {
                          MdF_Ctrl_VAL_gest = VAR_VAL(PADRE(idx_att, 2), mdf_array_var_gest[micv])
                          if (VAR_EXIST(PADRE(idx_att, 2), mdf_array_var_gest[micv]) != 1)
                             {
                              MdF_Ctrl_VAL_gest = VAR_VAL(PADRE(idx_att, 3), mdf_array_var_gest[micv])
                              if (VAR_EXIST(PADRE(idx_att, 3), mdf_array_var_gest[micv]) != 1)
                                 { MdF_Ctrl_VAL_gest = VAR_VAL(PADRE(idx_att, 4), mdf_array_var_gest[micv]) }
                             }
                         }
                     }

                  MdF_Ctrl_VAL_gest_prec = VAR_VAL(idx_att, mdf_nome_VAR_gest_prec)

                  if (MdF_Ctrl_VAL_gest != MdF_Ctrl_VAL_gest_prec)
                     {
                      MdF_Ctrl_VAL_gest_deb = MdF_Ctrl_VAL_gest
                      mdf_ctrl_Change_varianteVAL_prec = MdF_Ctrl_VAL_gest_prec
                      mdf_ctrl_Change_variante = mdf_array_var_gest[micv]
                      VAR_CREATE_NUM(idx_att, mdf_nome_VAR_gest, MdF_Ctrl_VAL_gest, 0, "")
                      VAR_CREATE_NUM(idx_att, mdf_nome_VAR_gest_prec, MdF_Ctrl_VAL_gest, 0, "")
                      mdf_ctrl_Change_Var_CAM = 4
                      //DISPLAY2("change MdF_Ctrl_var_gest_prec")
                     }
                 }
             }
          micv = micv+1
         }
   }

   PROCEDURA MdF_Load_Var
   {
      if (VAR_VAL(idx_att, "MDFSys_Load_Var_ini_maked") > 0)  { EXITSUB() }

      if (ACTION() == 1 & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1)
         {
          if (VAR_VAL(idx_att, "MdFSys_Ctrl_Var") <= 0)  { EXITSUB() }
         }
      if (VAR_VAL(idx_att, "mdf_ricalc_Post_READD") > 0)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "entry_MdF_Load_Var_generica") )
         {
          GOSUB MdF_Load_Var_Generica
          EXITSUB()
         }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
     // 18.01.2021 Posso personalizzare il Load MdF_ svincolandomi dall $OnLoadOrder o $VAR_LOAD_ORDER
      if (VAR_VAL(-1, "MdF_LoadOrder") > -1)  { CAM_loadOrder = $MdF_LoadOrder }

      if (CAM_loadOrder == 1)                { EXITSUB() }
      if (ACTION() <= 0)                     { EXITSUB() }
      if (VAR_VAL(idx_att, "escluso") != 0)  { EXITSUB() }

      GOSUB MdF_Var_Ini

      if (VAR_VAL(idx_att, "MDFSys_Load_Var_ini_maked") == -2)
         {
          if ( IS_MATCH(MDFSys_Load_ini, "OnMacro*") == 1
             & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1
             )
             {
              EXITSUB()
             }
         }

      MDFSys_Load_Var_ini = $MDFSys_Load_Var_ini
      MDFSys_Load_Var_ini_init = MDFSys_Load_Var_ini

      //if (STRLEN(MDFSys_Load_Var_ini) <= 0)  { EXITSUB() }
      // Se MdF_Load è OnMacro decido di entrare nelle tabelle CAM almeno una volta dopo
      // l' OnLoadedOrder così ho almeno i valori di default.
      // Credo servisse piu che altro per la Battuta X. Vedi anche MDFSys_Load_Var_ini_maked = -1
      //if (STRLEN(MDFSys_Load_Var_ini) <= 0)  { MDFSys_Load_Var_ini = "CerBat;CerSof;CerRib;PisAnta;PisFia;Par;FerGen;FerCri;FerFro;FerFia;FerPia" }

     // Per poter avere MdfSys_SbordoYInf,Sup su KeyFamRegFacc vedi MdF_KeyFam_Battuta_X_Gen

      // 04.01.2016 dopo l' ottimizzazione tempi-flusso, devo ripassare se cambia una VariabiliMdF
      // che però posso sapere solo da Bdm. Il problema si dovrebbe presentare solo se Load OnLoadedOrder
      // In realta' dal 2018 impostando le variabili sulla MdF_Ctrl_var_gest in VariabiliMdF.txt non serve piu
      if (VAR_VAL(idx_att, "MDFSys_Load_Var_ini_maked") == -1)  { MDFSys_Load_Var_ini = "CerBat;CerRib" }

      if (IS_MATCH(MDFSys_Load_ini, "OnMacro*") == 1)
         {
          if (VAR_VAL(idx_att, "MDFSys_Load_Var_ini_maked") == -2)  { MDFSys_Load_Var_ini = "CerBat" }
          if (ACTION() == 3  &  VAR_EXIST(idx_att, "MDFSys_Load_Var_ini_maked") == 1)
             { MDFSys_Load_Var_ini = "CerBat;CerSof;CerRib;PisAnta;PisFia;Par;FerGen;FerCri;FerFro;FerFia;FerPia" }
         }

      // Non mi interessa entrare adesso che c'è la gestione MdF_KeyFam_Battuta_X_Gen
      if (STRLEN(MDFSys_Load_Var_ini) <= 0)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "entry_MdF_Load_Var") != 1)  { entry_MdF_Load_Var = 0 }

      COMANDO2(STRCAT("LOGMSG { MdF_Load_Var INIT ACTION=", STR(ACTION()), " idx=", STR(idx_att), " ele=", NOME(idx_att), " ", DATA(0)))

      idx_MdF_Var = idx_att
      if (STRLEN(MDFSys_Load_Var_ini) > 0)
         {
          entry_MdF_Load_Var = entry_MdF_Load_Var+1

          GOSUB MdF_VariabiliDaTipoPadri
          CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(idx_att, "MdF_addKey_keyGenerica"))
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "keyGenericaFro"
          GOSUB MdF_Variabili
         }

      if ( IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "SX*") != 1
         & IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "DX*") != 1
         & IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "VA*") != 1
         & IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "RI*") != 1
         & ACTION() != 2
         )
         {
          GOSUB MdF_Load_Var_Generica
          EXITSUB()
         }

      if (STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "CerBat") > -1)
         {
          if ( IS_MATCH(MdF_Apertura, "SX*")
             | IS_MATCH(MdF_Apertura, "DX*")
             )
             {
              CHIAVE_TABVAR_MDF = "CerBat"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "CerBatFro"
              GOSUB MdF_Variabili

             // 15.12.2016
              //CHIAVE_TABVAR_MDF = "CerAngLib"
              //GOSUB MdF_Variabili
              //CHIAVE_TABVAR_MDF = "CerAngLibFro"
              //GOSUB MdF_Variabili
             }

          GOSUB MdF_KeyFam_Battuta_X
          if ( ACTION() == 1 & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1
             & VAR_VAL(idx_att, "MdFSys_Ctrl_Var") <= 0
             )
             { EXITSUB() }

          if ( IS_MATCH(MdF_Apertura, "SX*")
             | IS_MATCH(MdF_Apertura, "DX*")
             )
             {
              GOSUB MdF_pos_CerBat
             }
         }

      if (STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "CerSof") > -1)
         {
          if ( IS_MATCH(MdF_Apertura, "SX*SOF*")
             | IS_MATCH(MdF_Apertura, "DX*SOF*")
             )
             {
              CHIAVE_TABVAR_MDF = "CerSof"
              GOSUB MdF_Variabili
              GOSUB MdF_pos_CerSof
             }
         }

      if ( STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "CerRib") > -1
         | STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "PisAnta") > -1
         | STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "PisFia") > -1
         )
         {
          if ( IS_MATCH(MdF_Apertura, "VA*")
             | IS_MATCH(MdF_Apertura, "RI*")
             )
             {
              CHIAVE_TABVAR_MDF = "CerRib"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "CerRibFro"
              GOSUB MdF_Variabili

              CHIAVE_TABVAR_MDF = "PisAnta"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "PisAntaFro"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "PisFia"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "PisFiaFro"
              GOSUB MdF_Variabili
              GOSUB MdF_pos_CerRib
             }
         }

      if (STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "Par") > -1)
         {
          if (STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "Par"))) == 0)
             {
              CHIAVE_TABVAR_MDF = "Par"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "ParFro"
              GOSUB MdF_Variabili
              GOSUB MdF_pos_Paracolpi
             }
         }

      if (STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "ParInt") > -1)
         {
          if (STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "ParInt"))) == 0)
             {
              CHIAVE_TABVAR_MDF = "ParInt"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "ParIntFro"
              GOSUB MdF_Variabili
              GOSUB MdF_pos_ParacolpiInt
             }
         }

      if (STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "FerGen") > -1)
         {
          CHIAVE_TABVAR_MDF = "FerGen"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "FerGenFro"
          GOSUB MdF_Variabili
          GOSUB MdF_pos_FerramenteGen
         }

      if (STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "FerCri") > -1)
         {
          CHIAVE_TABVAR_MDF = "FerCri"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "FerCriFro"
          GOSUB MdF_Variabili
          GOSUB MdF_pos_FerGenCri
         }

      if ( STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "FerFro") > -1
         | STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "FerFia") > -1
         | STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "FerPia") > -1
         )
         {
          GOSUB MdF_Var_Ferramente
          tLav = "FerFro"
          GOSUB MdF_KeyFamRegFacc
          tLav = "FerFia"
          GOSUB MdF_KeyFamRegFacc
          tLav = "FerPia"
          GOSUB MdF_KeyFamRegFacc
         }

      MDFSys_Load_Var_ini_maked = 1
     // Per poter avere MdfSys_SbordoYInf,Sup su KeyFamRegFacc
      if ( IS_MATCH(MDFSys_Load_ini, "OnMacro*") != 1
         | IS_MATCH($MdF_Load_att, "OnMacroCancella*") != 1
         )
         {
          MDFSys_Load_Var_ini_maked = 2
         }
      if ( IS_MATCH(MDFSys_Load_ini, "OnMacro*") == 1
         & IS_MATCH($MdF_Load_att, "OnMacroCancella*") != 1
         )
         {
          MDFSys_Load_Var_ini_maked = -2
         }

      mdf_Load_Var_maked = 1
      COMANDO2(STRCAT("LOGMSG } MdF_Load_Var FINE ACTION=", STR(ACTION()), " idx=", STR(idx_att), " ele=", NOME(idx_att), " ", DATA(0)))
   }

   PROCEDURA MdF_Load_Var_Generica
   {
      if (VAR_VAL(idx_att, "MDFSys_Load_Var_ini_maked") > 0)  { EXITSUB() }

      if (ACTION() == 1 & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1)  { EXITSUB() }

      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
     // 18.01.2021 Posso personalizzare il Load MdF_ svincolandomi dall $OnLoadOrder o $VAR_LOAD_ORDER
      if (VAR_VAL(-1, "MdF_LoadOrder") > -1)  { CAM_loadOrder = $MdF_LoadOrder }

      if (CAM_loadOrder == 1)                { EXITSUB() }
      if (ACTION() <= 0)                     { EXITSUB() }
      if (VAR_VAL(idx_att, "escluso") != 0)  { EXITSUB() }

      GOSUB MdF_Var_Ini

      MDFSys_Load_Var_ini = $MDFSys_Load_Var_ini
      MDFSys_Load_Var_ini_init = MDFSys_Load_Var_ini

      // Se MdF_Load è OnMacro decido di entrare nelle tabelle CAM almeno una volta dopo
      // l' OnLoadedOrder così ho almeno i valori di default.
      // In realtà per la MdF_Load_Var_Generica se MdF_Load OnMacro faccio solo la KeyGenerica
      //if (STRLEN(MDFSys_Load_Var_ini) <= 0)  { MDFSys_Load_Var_ini = "Par;FerGen;FerCri;FerFro;FerFia;FerPia" }
      if (STRLEN(MDFSys_Load_Var_ini) <= 0)  { MDFSys_Load_Var_ini = "KeyGenerica" }

      if (IS_MATCH(MDFSys_Load_ini, "OnMacro*") == 1)
         {
          if (VAR_EXIST(idx_att, "MDFSys_Load_Var_ini_maked") == 1)
             { MDFSys_Load_Var_ini = "" }
          if (ACTION() == 3  &  VAR_EXIST(idx_att, "MDFSys_Load_Var_ini_maked") == 1)
             { MDFSys_Load_Var_ini = "Par;ParInt;FerGen;FerCri;FerFro;FerFia;FerPia" }
         }

      if (VAR_EXIST(idx_att, "entry_MdF_Load_Var_generica") != 1)  { entry_MdF_Load_Var_generica = 0 }

      if (VAR_VAL(idx_att, "entry_MdF_Load_Var_generica") > 1)
         { COMANDO2(STRCAT("LOGMSG { MdF_Load_Var_Generica INIT idx=", STR(idx_att), " ele=", NOME(idx_att), " ", DATA(0))) }

      idx_MdF_Var = idx_att
      if (STRLEN(MDFSys_Load_Var_ini) > 0)
         {
          // Se arriva da MdF_Load_Var ho già fatto queste operazioni
          if (VAR_EXIST(idx_att, "entry_MdF_Load_Var") != 1)
             {
              entry_MdF_Load_Var_generica = entry_MdF_Load_Var_generica+1

              GOSUB MdF_VariabiliDaTipoPadri
              CHIAVE_TABVAR_MDF = STRCAT("keyGenerica", VAR_VAL_STR(idx_att, "MdF_addKey_keyGenerica"))
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "keyGenericaFro"
              GOSUB MdF_Variabili
             }
          // Se entro una volta sulla MdF_Load_Var_Generica poi entrera sempre qui
          // quindi cancello la entry_MdF_Load_Var
          DEL_VAR(idx_att, "entry_MdF_Load_Var")
         }

      if (STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "Par") > -1)
         {
          if (STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "Par"))) == 0)
             {
              CHIAVE_TABVAR_MDF = "Par"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "ParFro"
              GOSUB MdF_Variabili
              GOSUB MdF_pos_Paracolpi
             }
         }

      if (STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "ParInt") > -1)
         {
          if (STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", "ParInt"))) == 0)
             {
              CHIAVE_TABVAR_MDF = "ParInt"
              GOSUB MdF_Variabili
              CHIAVE_TABVAR_MDF = "ParIntFro"
              GOSUB MdF_Variabili
              GOSUB MdF_pos_ParacolpiInt
             }
         }

      if (STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "FerGen") > -1)
         {
          CHIAVE_TABVAR_MDF = "FerGen"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "FerGenFro"
          GOSUB MdF_Variabili
          GOSUB MdF_pos_FerramenteGen
         }

      if (STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "FerCri") > -1)
         {
          CHIAVE_TABVAR_MDF = "FerCri"
          GOSUB MdF_Variabili
          CHIAVE_TABVAR_MDF = "FerCriFro"
          GOSUB MdF_Variabili
          GOSUB MdF_pos_FerGenCri
         }

      if ( STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "FerFro") > -1
         | STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "FerFia") > -1
         | STR_INDEX_OF(MDFSys_Load_Var_ini, 0, "FerPia") > -1
         )
         {
          GOSUB MdF_Var_Ferramente
          tLav = "FerFro"
          GOSUB MdF_KeyFamRegFacc
          tLav = "FerFia"
          GOSUB MdF_KeyFamRegFacc
          tLav = "FerPia"
          GOSUB MdF_KeyFamRegFacc
         }

      MDFSys_Load_Var_ini_maked = 1

      mdf_Load_Var_maked = 1
      if (VAR_VAL(idx_att, "entry_MdF_Load_Var_generica") > 2)
         { COMANDO2(STRCAT("LOGMSG } MdF_Load_Var_Generica FINE idx=", STR(idx_att), " ele=", NOME(idx_att), " ", DATA(0))) }
   }

   PROCEDURA MdF_Elimina_x_Dim_Change
   {
      // entra per ACTION 3
      if (ACTION() > 0  &  ACTION() != 2)
         {
          // 12.12.2024 Non esiste piu AttrezzaRegFacc. Da togliere prossimamente
          //if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "Dim_MdF_AttrezzaRegFacc*") )
          //   {
          //    MdF_debug_Change = VAR_VAL_STR(idx_att, "MdF_Cambiato")
          //    if ( IS_MATCH(MDFSys_Load_ini, "OnMacro*") == 1
          //       & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacroCAM") != 1
          //       )
          //       { EXITSUB() }
          //   }

          if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "Dim*") )
             {
              // Con la MdF_Ctrl_Cambiamenti qui non dovrebbe piu entrare se non cambiano le dimensioni
              // del CamMdFrontali e quindi dovrebbe essere piu veloce piuttosto che eliminare e rifare
              // il RELATIVE_ADD rientrando anche in RegFacc
              // Anche perché adesso avendo condizionato il RELATIVE_ADD solo alla KeyFamRegFacc
              // non mi serve piu togliere e rimettere gli MdF se cambia la chiave KeyFam perché
              // quando l'MdF rientra in RegFacc da Reg_pos_* reimposta i posizionamenti dei
              // figli a -999 e quindi i figli restano esclusi
              // 15.11.2024 Per avere meno variabili sugli elementi
              // Qui non c'era il controllo Alias ma in realta doveva esserci senza bisogno dell IS_IDX o del padre di 1 == idx_att
              // ma probabilmente nel 2015 non mi era venuto in mente
              //COMPONENTI3("mdf_Ferr", idx_att, "MdF_*")
              MdF_WITH_ALIAS_att_ESCL("mdf_Ferr", "MdF_CAM", idx_att)
              iE=1
              while (iE <= mdf_Ferr)
                 {
                  // Se ho eliminato un MdF_ di primo livello i suoi figli non sono piu validi
                  if (IS_IDX(mdf_Ferr[iE]) )
                     {
                      // 12.12.2024
                      mdf_ElimDimchange = 1
                      if (IS_MATCH(NOME(mdf_Ferr[iE]), "MECCANISM*_UTENTE*") == 1)
                         { mdf_ElimDimchange = -1 }

                      // 12.12.2024 Se salvato in precedenza, quindi utente, dev' esser l' utente ad eliminarlo
                      if (VAR_VAL(mdf_Ferr[iE], "mdf_save_prec") == 1)
                         {
                          // 14.04.2025 PK 652421 Era pure sbagliato mdf_FerrXY
                          //// Per ora pero, essendo il primo caso, faccio solo per i Vani multipli
                          //if (IS_MATCH(NOME(mdf_FerrXY[iE]), "MdF_CerniereBattV*") )
                          //   { mdf_ElimDimchange = -2 }
                          mdf_ElimDimchange = -2
                         }
                     // 14.04.2025 PK 652421
                      if (mdf_ElimDimchange >= 0)
                         {
                          WITH_VAR_LOCAL(mdf_Ferr[iE], "mdf_posY_Utente0", "posY_Utente", 2, 1, "0")
                          WITH_VAR_LOCAL(mdf_Ferr[iE], "mdf_posY_Utente", "posY_Utente", 2, 0, "0")
                          if (mdf_posY_Utente != mdf_posY_Utente0)
                             {
                              mdf_ElimDimchange = -3
                              COMANDO2(STRCAT("LOGMSG MdF_Elimina_x_Dim_Change posY_Utente da verificare perchè non dovrebbe arrivare qui ", VAR_VAL_STR(-1, "File")))
                             }
                         }

                      // Occhio agli MdF_ figli dei figli
                      if ( PADRE(mdf_Ferr[iE], 1) == idx_att
                         // 12.12.2024
                         & mdf_ElimDimchange > 0
                         )
                         {
                          MdF_Eliminato = 1

                         // Avendo rivisto il flusso con MdF_Post_RELATIVE_ADD_COMANDO2 Mdf_Verify_Flusso_BDM
                         // posso tornare alla gestione originale corretta per tutti
                         // 23.12.2021 VD000106
                          COMANDO2(STRCAT("ELIMINA ", STR(mdf_Ferr[iE]), " // ", NOME(mdf_Ferr[iE]), " MdF_Elimina_x_Dim_Change CamMdFrontale=", STR(idx_att), " ACTION=", STR(ACTION()),  " per Dim cambiate ", VAR_VAL_STR(idx_att, "MdF_Cambiato")))
                          // 11.03.2024 altrimenti esce il messaggio Graphic Error
                          MdFSys_Esegui_Show_Abilita = 1
                         }
                     }
                  iE = iE+1
                 }
              // 12.03.2019
              DEL_VAR(idx_att, "mdf_added_*_daLoadPers")

              DEL_VAR(idx_att, "MdF_Cambiato")
             }
         }
   }

  // 16.07.2020
   PROCEDURA MdF_Elimina_x_DimXY_Change
   {
      mdf_ADD_Reg_Interat_XY_Ch = 0
      if (VAR_VAL(idx_att, "MdF_Load_COMANDO2") != 1)     { EXITSUB() }
      if (VAR_EXIST(idx_att, "mdf_X_Interat_prec") != 1)  { EXITSUB() }

     // 03.03.2025 PK cambio Y cassetto
      if (VAR_VAL(idx_att, "MdF_Eliminato") > 0)  { EXITSUB() }

     // 07.07.2021 PC009112 mdf_Y_Interat_prec vale 596.99. Vedi anche MdF_Ctrl_Dim
      mdf_Elim_x_DimCh = 0
      if ( VAR_VAL(idx_att, "mdf_Y_Interat_prec") != Y
         | VAR_VAL(idx_att, "mdf_X_Interat_prec") != X
         )
         {
          mdf_Elim_x_DimCh = 1
          mdf_Y_Interat_prec_floor = FLOOR(VAR_VAL(idx_att, "mdf_Y_Interat_prec")*100)/100
          mdf_X_Interat_prec_floor = FLOOR(VAR_VAL(idx_att, "mdf_X_Interat_prec")*100)/100
          // 26.04.2023 Se e' la Y diversa ma la X uguale mdf_Elim_x_DimCh mi usciva -0.1. Strano che non mi sia accorto prima
          //if (mdf_Y_Interat_prec_floor+0.01 >= Y  &  mdf_Y_Interat_prec_floor-0.01 <= Y)  { mdf_Elim_x_DimCh = mdf_Elim_x_DimCh-1.1 }
          //if (mdf_X_Interat_prec_floor+0.01 >= X  &  mdf_X_Interat_prec_floor-0.01 <= X)  { mdf_Elim_x_DimCh = mdf_Elim_x_DimCh-1.1 }
          if ( mdf_Y_Interat_prec_floor+0.01 >= Y  &  mdf_Y_Interat_prec_floor-0.01 <= Y
             & mdf_X_Interat_prec_floor+0.01 >= X  &  mdf_X_Interat_prec_floor-0.01 <= X
             )
             { mdf_Elim_x_DimCh = mdf_Elim_x_DimCh-1.1 }
         }
      else
         {
         // 14.12.2021 1021149340base_gola.rit Preventivo
          // L' Anta CamMdFrontali della base angolo fa dei ricalcoli sulle dimensioni,
          // l' MdF_ entra nella procedura ma X e Y sono tornate corrette ma i punti notevoli risultano sfalsati
          // La MdF_Ctrl_Dim in realta ha memorizzato il cambiamento e allora lo controllo qui perchè
          // altrimenti non arriva fino a mdf_ADD_Reg_Interat_6 per fare la MdF_Elimina_x_Dim_Change perchè
          // mdf_ADD_Reg_Interat_Exit1 vale 1
          // 17.10.2024
          mdf_vaniY = 0
          // 15.11.2024 Per avere meno variabili sugli elementi
          //COMPONENTI3("mdf_FerrXY", idx_att, "MdF_*")
          MdF_WITH_ALIAS_att_ESCL("mdf_FerrXY", "MdF_CAM", idx_att)
          iE=1
          while (iE <= mdf_FerrXY)
             {
              if ( HAS_ALIAS(mdf_FerrXY[iE], "MdF_CAM")
                 // 12.12.2024 Con COMPONENTI non trovava MECC*UTENTE
                 & IS_MATCH(NOME(mdf_FerrXY[iE]), "MECCANISM*_UTENTE*") != 1
                 )
                 {
                  if (IS_MATCH(VAR_VAL_STR(mdf_FerrXY[iE], "MdF_Cambiato"), "Dim*") )
                     {
                      mdf_Elim_x_DimCh = 2
                      mdf_FerrXY_Elim2_idx = mdf_FerrXY[iE]
                     }
                  if (IS_MATCH(NOME(mdf_FerrXY[iE]), "MdF_CerniereBattV*") )
                     {
                      mdf_vaniY = mdf_vaniY+1
                      mdf_FerrXY_ElimV_idx = mdf_FerrXY[iE]
                      // 14.04.2025 PK 652421 porto fuori
                      //// 12.12.2024 49446
                      //if (VAR_VAL(mdf_FerrXY[iE], "mdf_save_prec") == 1)
                      //   {
                      //    mdf_Elim_x_DimCh = -2
                      //    iE = mdf_FerrXY+1000
                      //   }
                     }
                  // 14.04.2025 PK 652421 porto fuori
                  if (VAR_VAL(mdf_FerrXY[iE], "mdf_save_prec") == 1)
                     {
                      mdf_Elim_x_DimCh = -2
                      iE = mdf_FerrXY+1000
                     }
                  // 14.04.2025 PK 652421
                  if (mdf_Elim_x_DimCh > 0)
                     {
                      WITH_VAR_LOCAL(mdf_FerrXY[iE], "mdf_posY_UtenteXY0", "posY_Utente", 2, 1, "0")
                      WITH_VAR_LOCAL(mdf_FerrXY[iE], "mdf_posY_UtenteXY", "posY_Utente", 2, 0, "0")
                      if (mdf_posY_UtenteXY != mdf_posY_UtenteXY0)
                         {
                          mdf_ElimDimchange = -3
                          COMANDO2(STRCAT("LOGMSG MdF_Elimina_x_DimXY_Change posY_Utente da verificare perchè non dovrebbe arrivare qui ", VAR_VAL_STR(-1, "File")))
                         }
                     }
                 }
              iE = iE+1
             }
         }

     // 05.09.2024
      if (VAR_VAL(idx_att, "mdf_Zt_Interat_prec") != VAR_VAL(idx_att, "Zt") )
         {
          mdf_Zt_Interat_prec = VAR_VAL(idx_att, "Zt")
          if (VAR_EXIST(idx_att, "MdF_offz_REL_ADD") )
             {
              mdf_Elim_x_DimCh = 3
             }
         }

      if (mdf_Elim_x_DimCh > 0)
         {
          mdf_ADD_Reg_Interat_XY_Ch = 1
          COMPONENTI3("mdf_FerrXY", idx_att, "MdF_*")
          // 16.12.2020
          // Prima di eliminare l' MdF_ controllo se cancellare i Sat relativi su fianco
          iE=1
          while (iE <= mdf_FerrXY)
             {
              // Se ho eliminato un MdF_ di primo livello i suoi figli non sono piu validi
              if (IS_IDX(mdf_FerrXY[iE]) )
                 {
                  if (IS_MATCH(NOME(mdf_FerrXY[iE]), "MdF_Basetta*") )
                     {
                      idx_basCanc = mdf_FerrXY[iE]
                     // 16.07.2024 Ho visto che mancava BOX_MODE
                      BOX_MODE(0)
                      NEAR_GLOBALE("mdf_search_sat", idx_basCanc, 30, 1, "MdF_Sat_Bas*")
                      mis = 1
                      while (mis <= mdf_search_sat)
                         {
                          if ( VAR_VAL(mdf_search_sat[mis], "idx_MdFgraf") == idx_basCanc
                             // attrezzato su fianco
                             & PADRE(mdf_search_sat[mis], 1) != idx_basCanc
                             )
                             {
                              VAR_VALUE_SET(mdf_search_sat[mis], "escluso", 10)
                              VAR_VALUE_SET(mdf_search_sat[mis], "MdF_pdr_NotValid", 10)
                              //COMANDO(STRCAT("CANCELLA ", STR(mdf_search_sat[mis])))
                             }
                          mis = mis+1
                         }
                     }
                 // 16.07.2024
                  if (IS_MATCH(NOME(mdf_FerrXY[iE]), "MdF_PistoneSuFianco*") )
                     {
                      idx_basCanc = mdf_FerrXY[iE]
                      // 07.03.2025 MN se riduco la Y di molto non li trova piu
                      //BOX_MODE(0)
                      //NEAR_GLOBALE("mdf_search_sat", idx_basCanc, 90, 1, "MdF_Sat_PisFia*")
                      WITH_VAR("mdf_search_sat", "idx_Pis", 0, 1, STR(idx_basCanc))
                      mis = 1
                      while (mis <= mdf_search_sat)
                         {
                          if ( VAR_VAL(mdf_search_sat[mis], "idx_Pis") == idx_basCanc
                             // attrezzato su fianco
                             & PADRE(mdf_search_sat[mis], 1) != idx_basCanc
                             )
                             {
                              VAR_VALUE_SET(mdf_search_sat[mis], "escluso", 10)
                              VAR_VALUE_SET(mdf_search_sat[mis], "MdF_pdr_NotValid", 10)
                              //COMANDO(STRCAT("CANCELLA ", STR(mdf_search_sat[mis])))
                             }
                          mis = mis+1
                         }
                     }
                 }
              iE = iE+1
             }

          iE=1
          while (iE <= mdf_FerrXY)
             {
              // Se ho eliminato un MdF_ di primo livello i suoi figli non sono piu validi
              if (IS_IDX(mdf_FerrXY[iE]) )
                 {
                  // Occhio agli MdF_ figli dei figli
                  if (PADRE(mdf_FerrXY[iE], 1) == idx_att)
                     {
                      mdf_str_ChangeXY = STRCAT("Y_prec=", STR(mdf_Y_Interat_prec), " Y_att=", STR(Y), " X_prec=", STR(mdf_X_Interat_prec), " X_att=", STR(X), " x_DimCh=", STR(mdf_Elim_x_DimCh))
                      if (IS_MATCH(VAR_VAL_STR(mdf_FerrXY[iE], "MdF_Cambiato"), "Dim*") != 1)
                         { COMANDO2(STRCAT("ELIMINA ", STR(mdf_FerrXY[iE]), " // ", NOME(mdf_FerrXY[iE]), " MdF_Elimina_x_DimXY_Change CamMdFrontale=", STR(idx_att), " ACTION=", STR(ACTION()), " per ", mdf_str_ChangeXY)) }
                      else
                         {
                         // 14.12.2021 1021149340base_gola.rit Preventivo
                          mdf_str_ChangeXY_Camb =  VAR_VAL_STR(mdf_FerrXY[iE], "MdF_Cambiato")
                          COMANDO2(STRCAT("ELIMINA ", STR(mdf_FerrXY[iE]), " // ", NOME(mdf_FerrXY[iE]), " MdF_Elimina_x_DimXY_Change CamMdFrontale=", STR(idx_att), " ACTION=", STR(ACTION()), " per Camb ", mdf_str_ChangeXY_Camb))
                         }
                     // 11.03.2024 altrimenti esce il messaggio Graphic Error
                      MdFSys_Esegui_Show_Abilita = 2
                     }
                 }
              iE = iE+1
             }
          mdf_X_Interat_prec = X
          mdf_Y_Interat_prec = Y

          DEL_VAR(idx_att, "mdf_added_*_daLoadPers")
          DEL_VAR(idx_att, "MdF_Cambiato")
          // 30.07.2024 PK2024TGM642056 Dopo Taglio_H deve rileggere MdF_Pan_Y
          if ( VAR_EXIST(idx_att, "MdF_Pan_X")
             | VAR_EXIST(idx_att, "MdF_Pan_Y")
             )
             { mdf_read_VDP = 3 }
         }
   }

   PROCEDURA mdf_ctrl_presegui_action
   {
      if (ACTION() != 1)
         {
         // 03.11.2016
          if (VAR_VAL(idx_att, "MdF_NoOnLoadedOrder") == 1)
             {
              mdf_prosegui_action1 = 8
              MdF_NoOnLoadedOrder = 0
             }
          EXITSUB()
         }

      if (STRCMP($MdF_Utente, "") != 0)
         {
          if (VAR_VAL(idx_att, "MdF_Eliminato") > 0)
             {
              mdf_prosegui_action1 = 1.1
              EXITSUB()
             }
          COMPONENTI2("mdf_add_att", idx_att, "MdF_*")
          if (mdf_add_att > 0)
             {
              if ( VAR_EXIST(idx_att, "MdF_Apertura") != 1
                 & STRLEN(VAR_VAL_STR(mdf_add_att[1], "MdF_Apertura")) < 1
                 )
                 {
                  mdf_prosegui_action1 = 1.2
                 }
             }
          if (mdf_add_att == 0)
             {
              if (VAR_EXIST(idx_att, "MdF_Apertura") != 1)
                 {
                  mdf_prosegui_action1 = 1.3
                 }
             }
         }

      // Puo capitare solo se VAR_CHANGE OnLoadedOrder e MdF_ salvato nel rit
      if ( VAR_EXIST(idx_att, "KeyFamRegFacc") != 1
         & STRLEN(VAR_VAL_STR(idx_att, "MdF_Apertura")) > 1
         )
         {
          COMPONENTI2("mdf_add_att", idx_att, "MdF_*")
          if (mdf_add_att > 0)
             {
              if (STRLEN(VAR_VAL_STR(mdf_add_att[1], "MdF_Apertura")) < 1)
                 {
                  mdf_prosegui_action1 = 1
                 }
             }
         }

      if ( VAR_EXIST(idx_att, "KeyFamRegFacc") == 1
         & STRLEN(VAR_VAL_STR(idx_att, "KeyFamRegFacc")) < 2
         )
         {
          COMPONENTI2("mdf_add_att", idx_att, "MdF_*")
          if (mdf_add_att > 0)
             {
              if ( VAR_EXIST(idx_att, "MdF_Apertura") != 1
                 & STRLEN(VAR_VAL_STR(mdf_add_att[1], "MdF_Apertura")) < 1
                 )
                 {
                  mdf_prosegui_action1 = 2
                 }
             }
         }

      if (IS_MATCH(MDFSys_Load_ini, "NoOnLoadedOrder*") == 1)
         {
          if ( IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnLoadedOrder*") == 1
             & IS_MATCH(VAR_VAL_STR(idx_att, "loc_MdF_Load_att"), "OnLoadedOrder*") == 1
             )
             {
              mdf_prosegui_action1 = 3
             }
          if (IS_MATCH(VAR_VAL_STR(idx_att, "mdf_prosegui_action"), "MDF_CucP_PostControl") == 1)
             {
              mdf_prosegui_action1 = 4.1
             }
         }
   }

   PROCEDURA MdF_TABLE_CLOSE
   {
     // 03.04.2018
      if (VAR_VAL(-1, "CAM_CloseOpenTab") <= 1)
         {
          if (VAR_VAL(-1, "CAM_Visualize") <= 0)  { EXITSUB() }
         }

      GOSUB MdF_TABLE_CLOSE_all

      $MdF_display_err = 0
   }

   PROCEDURA MdF_TABLE_CLOSE_all
   {
      if ($MdF_TABLE_RegFacc >= 0)        { TABLE_CLOSE($MdF_TABLE_RegFacc) }
      if ($MdF_TABLE_KeyFamRegFacc >= 0)  { TABLE_CLOSE($MdF_TABLE_KeyFamRegFacc) }
      if ($MdF_TABLE_Var >= 0)            { TABLE_CLOSE($MdF_TABLE_Var) }
      if ($MdF_TABLE_Var_DTP >= 0)        { TABLE_CLOSE($MdF_TABLE_Var_DTP) }

      $MdF_TABLE_RegFacc = -2
      $MdF_TABLE_KeyFamRegFacc = -2
      $MdF_TABLE_Var = -2
      $MdF_TABLE_Var_DTP = -2
   }

   PROCEDURA MdF_Battuta_X
   {
      if (VAR_VAL(idx_att, "escluso") != 0)  { EXITSUB() }

      DEL_VAR(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
      DEL_VAR(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
      DEL_VAR(idx_att, "MdfSys_Battuta_SX_Cn")
      DEL_VAR(idx_att, "MdfSys_Battuta_DX_Cn")

      GOSUB MdF_Battuta_X_After_RegFacc

      if (mdf_Battuta_X_After_RegFacc > 0)
         {
          // 08.05.2024 Aggiunta come sotto. Strano non sia mai uscito prima il problema, forse perchè gli SbordoY sono sempre piu usati
          if ( VAR_EXIST(idx_att, "MdfSys_SbordoYSup") != 1
             // 15.11.2024 Sc1024076550
             | VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYSup") != VAR_VAL(idx_att, "MdfSys_SbordoYSup")
             | VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYInf") != VAR_VAL(idx_att, "MdfSys_SbordoYInf")
             | VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYSup_DaCop") != VAR_VAL(idx_att, "MdfSys_SbordoYSup_DaCop")
             | VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYInf_DaFon") != VAR_VAL(idx_att, "MdfSys_SbordoYInf_DaFon")
             )
             {
              if (VAR_EXIST(PADRE(idx_att, 1), "MdfSys_SbordoYSup") )
                 { MdfSys_SbordoYSup = VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYSup") }

              if (VAR_EXIST(PADRE(idx_att, 1), "MdfSys_SbordoYInf") )
                 { MdfSys_SbordoYInf = VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYInf") }

              if (VAR_EXIST(PADRE(idx_att, 1), "MdfSys_SbordoYSup_DaCop") )
                 { MdfSys_SbordoYSup_DaCop = VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYSup_DaCop") }

              if (VAR_EXIST(PADRE(idx_att, 1), "MdfSys_SbordoYInf_DaFon") )
                 { MdfSys_SbordoYInf_DaFon = VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYInf_DaFon") }
             }
          EXITSUB()
         }

      mdf_aperture_NoBatt = 0
      mdf_ctrl_Battuta_NoBatt = 0
      if ( IS_MATCH(MdF_Apertura, "S*") != 1
         & IS_MATCH(MdF_Apertura, "D*") != 1
         )
         {
          mdf_aperture_NoBatt = 1
         }

      if ( VAR_EXIST(PADRE(idx_att, 1), "Battuta_X")
         & VAR_EXIST(PADRE(idx_att, 1), "Battuta_SX")
         & VAR_EXIST(PADRE(idx_att, 1), "Battuta_DX")
         & VAR_EXIST(PADRE(idx_att, 1), "Battuta_X_Sx")
         & VAR_EXIST(PADRE(idx_att, 1), "Battuta_X_Dx")
         )
         {
          // 09.05.2019 L010101
          // Cosi lo faccio solo una volta
          if (VAR_VAL(idx_att, "mdf_forza_ctrl_Battuta") == 4)
             {
              mdf_forza_ctrl_Battuta_debug = 1
              if (ACTION() == 1)  { EXITSUB() }
             }

          Battuta_X    = VAR_VAL(PADRE(idx_att, 1), "Battuta_X")
          Battuta_SX   = VAR_VAL(PADRE(idx_att, 1), "Battuta_SX")
          Battuta_DX   = VAR_VAL(PADRE(idx_att, 1), "Battuta_DX")
          Battuta_X_Sx = VAR_VAL(PADRE(idx_att, 1), "Battuta_X_Sx")
          Battuta_X_Dx = VAR_VAL(PADRE(idx_att, 1), "Battuta_X_Dx")
          Battuta_Z    = VAR_VAL(PADRE(idx_att, 1), "Battuta_Z")

         // 20.07.2023
          Battuta_Z_Sx = VAR_VAL(PADRE(idx_att, 1), "Battuta_Z_Sx")
          Battuta_Z_Dx = VAR_VAL(PADRE(idx_att, 1), "Battuta_Z_Dx")

          if ( VAR_VAL(idx_att, "mdf_forza_ctrl_Battuta") == 0
             | VAR_EXIST(idx_att, "MdfSys_SbordoYSup") != 1
             )
             {
              if (VAR_EXIST(PADRE(idx_att, 1), "MdfSys_SbordoYSup") )
                 { MdfSys_SbordoYSup = VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYSup") }

              if (VAR_EXIST(PADRE(idx_att, 1), "MdfSys_SbordoYInf") )
                 { MdfSys_SbordoYInf = VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYInf") }

              if (VAR_EXIST(PADRE(idx_att, 1), "MdfSys_SbordoYSup_DaCop") )
                 { MdfSys_SbordoYSup_DaCop = VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYSup_DaCop") }

              if (VAR_EXIST(PADRE(idx_att, 1), "MdfSys_SbordoYInf_DaFon") )
                 { MdfSys_SbordoYInf_DaFon = VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYInf_DaFon") }
             }

          GOSUB MdF_ctrl_Post_Battuta_X

          if ( Battuta_X > 0
             | Battuta_SX > 0
             | Battuta_DX > 0
             | Battuta_X_Sx > 0
             | Battuta_X_Dx > 0
             )
             {
              // 04.02.2016
              // Problema Bdm Grafica non Lineare (fatto male). Un Modulo a giorno sotto ad un Pensile
              // si ritrova dentro appunto al pensile sopra di mm pari all' altezza piedini (Alt_Zoc)
              // che vengono esclusi e quindi il Pensile riposizionato correttamente solo
              // dopo l' OnLoadedOrder e di conseguenza dopo la MdF_CamMdFrontali_Load_pers
              // Siccome difficilmente ha senso uno Sbordo piu grande di metà e un quinto della
              // propria altezza, in questo caso ricontrontrollo la Battuta
              mdf_forza_ctrl_Battuta = 0
              if ( VAR_VAL(idx_att, "MdfSys_SbordoYSup") > Y/2 + Y/5
                 | VAR_VAL(idx_att, "MdfSys_SbordoYInf") > Y/2 + Y/5
                 )
                 {
                  if (STR_INDEX_OF($MdF_Load_pers, 0, "CerBat") > -1)
                     {
                      COMANDO2(STRCAT("LOGMSG MdF_Battuta_X Protezione-CAM per GraficaBdm nonostante MdF_CamMdFrontali_Load_pers sia alla fine dell' OnLoadedOrder:", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
                      mdf_forza_ctrl_Battuta = 1
                     }
                 }

              // 26.02.2016 In casi rarissimi la MdF_KeyFam_Battuta_X_Gen sbaglia la Battuta
              // perché il Frontale arriva troppo presto con la X ancora a 0 perché magari la deve prendere da Gestionale
              if (Battuta_X_Sx < 0 & ABS(Battuta_X_Sx) < 2 & VAR_VAL(PADRE(idx_att, 1), "X_Fro_KeyFam_Batt") < 30  & VAR_EXIST(PADRE(idx_att, 1), "X_Fro_KeyFam_Batt"))  { mdf_forza_ctrl_Battuta = 2 }
              if (Battuta_X_Dx < 0 & ABS(Battuta_X_Dx) < 2 & VAR_VAL(PADRE(idx_att, 1), "X_Fro_KeyFam_Batt") < 30  & VAR_EXIST(PADRE(idx_att, 1), "X_Fro_KeyFam_Batt"))  { mdf_forza_ctrl_Battuta = 3 }

              if (mdf_forza_ctrl_Battuta == 2  |  mdf_forza_ctrl_Battuta == 3)
                 {
                  if (VAR_EXIST(idx_att, "mdf_log_X_0") != 1)
                     { COMANDO2(STRCAT("LOGMSG MdF_Battuta_X Protezione-CAM per problema GraficaBdm per X Frontale=0 nonostante MdF_CamMdFrontali_Load_pers sia alla fine dell' OnLoadedOrder: ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0))) }
                  mdf_log_X_0 = 1
                 }

             // 09.05.2019 L010101
             // 30.09.2024
              if (VAR_EXIST(PADRE(idx_att, 1), "MdF_Pan_X") )
                 {
                  if (VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X") < VAR_VAL(PADRE(idx_att, 1), "X"))
                     {
                      if (VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD") > 10)
                         {
                          if ( VAR_VAL(PADRE(idx_att, 1), "offx_Battuta_Sx") == 0
                             & VAR_VAL(PADRE(idx_att, 1), "offx_Battuta_Dx") == 0
                             )
                             { mdf_forza_ctrl_Battuta = 4 }
                         }
                      // 30.09.2024 Sc1056665 EM Obl
                      mdf_diff_X_pan = VAR_VAL(PADRE(idx_att, 1), "X")-VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X")
                      if ( Battuta_X > 10+mdf_diff_X_pan
                         & Battuta_X > 18
                         & IS_MATCH(MdF_Apertura, "S*") != 1
                         )
                         { mdf_forza_ctrl_Battuta = 4.1 }
                     }
                 }


              // 20.09.2019 C1928082    // 03.06.2020 MdF_Pan_X < X mdf_forza_ctrl_Battuta=4 quindi non serve passare di qua
              if (ACTION() == 1  &  VAR_VAL(idx_att, "mdf_forza_ctrl_Battuta") == 0)
                 {
                  if ( VAR_VAL(PADRE(idx_att, 1), "exitBattuta_SX") == -1
                     & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Apertura"), "SX*")
                     // 03.06.2020
                     & VAR_VAL(PADRE(idx_att, 1), "Battuta_SX") != 17.111
                     // 16.11.2023 ScBROWSER2001945 Se è LIBMAN per forza non ha la Battuta Sx
                     & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Apertura"), "SX*LIB*MAN*") != 1
                     )
                     {
                      if (ABS(VAR_VAL(idx_att, "MdF_angoloBas")) != 90)
                         {
                          mdf_forza_ctrl_Battuta = 5.1
                          COMANDO(STRCAT("LOGMSG MdF_Battuta_X Caso-raro Fianco graficato tardi. idx=", STR(idx_att), " ACTION", STR(ACTION()), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
                         }
                     }

                  if ( VAR_VAL(PADRE(idx_att, 1), "exitBattuta_DX") == -1
                     & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Apertura"), "DX*")
                     // 03.06.2020
                     & VAR_VAL(PADRE(idx_att, 1), "Battuta_DX") != 17.111
                     // 16.11.2023 ScBROWSER2001945 Se è LIBMAN per forza non ha la Battuta Sx
                     & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Apertura"), "DX*LIB*MAN*") != 1
                     )
                     {
                      if (ABS(VAR_VAL(idx_att, "MdF_angoloBas")) != 90)
                         {
                          mdf_forza_ctrl_Battuta = 6.1
                          COMANDO(STRCAT("LOGMSG MdF_Battuta_X Caso-raro Fianco graficato tardi. idx=", STR(idx_att), " ACTION", STR(ACTION()), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
                         }
                     }
                 }

              if ( VAR_VAL(PADRE(idx_att, 1), "MdF_offx_Battuta_Sx") == 0
                 & VAR_VAL(PADRE(idx_att, 1), "MdF_offx_Battuta_Dx") == 0
                 & mdf_forza_ctrl_Battuta == 0
                 )
                 {
                  if (VAR_VAL(-1, "CAM_Visualize") <= 1)
                     {
                      EXITSUB()
                     }
                 }
             }
         }

     // 11.07.2019 SN000096
      if ( VAR_VAL(PADRE(idx_att, 1), "Battuta_X") == 0
         & VAR_VAL(PADRE(idx_att, 1), "Battuta_SX") == 0
         & VAR_VAL(PADRE(idx_att, 1), "Battuta_DX") == 0
         & VAR_VAL(PADRE(idx_att, 1), "Battuta_X_Sx") == 0
         & VAR_VAL(PADRE(idx_att, 1), "Battuta_X_Dx") == 0
         )
         {
          if (ACTION() == 1)
             {
              if (VAR_EXIST(PADRE(idx_att, 1), "Fianchi_vic_##1") )
                 {
                  mdf_dNBF = VAR_VAL(PADRE(idx_att, 1), "MdF_distNearBatFia")
                  if (mdf_dNBF > 11)
                     {
                      if ( VAR_VAL(PADRE(idx_att, 1), "exitBattuta_SX") == -1
                         & IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Apertura"), "SX*")
                         )
                         { mdf_forza_ctrl_Battuta = 5 }

                      if ( VAR_VAL(PADRE(idx_att, 1), "exitBattuta_SX") == -1
                         & VAR_VAL(PADRE(idx_att, 1), "exitBattuta_DX") == -1
                         )
                         { mdf_forza_ctrl_Battuta = 6 }

                      COMANDO(STRCAT("LOGMSG MdF_Battuta_X Caso-rarissimo MdF_distNearBatFia=", STR(mdf_dNBF), " idx=", STR(idx_att), " ACTION", STR(ACTION()), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
                     }
                 }
             }
         }

      // 09.05.2019 L010101 l'if per ACTION()==1 c'e' da sempre
      if (VAR_VAL(idx_att, "mdf_forza_ctrl_Battuta") < 4)
         {
          if (ACTION() == 1 & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1)  { EXITSUB() }
         }

      mdF_archetipo_Fia = "Fia*"
      mdF_archetipo_Fia_2 = "Div*"
      if (VAR_EXIST(PADRE(idx_att, 1), "archetipo_Fia") )    { mdF_archetipo_Fia = VAR_VAL_STR(PADRE(idx_att, 1), "archetipo_Fia") }
      if (VAR_EXIST(PADRE(idx_att, 1), "archetipo_Fia_2") )  { mdF_archetipo_Fia_2 = VAR_VAL_STR(PADRE(idx_att, 1), "archetipo_Fia_2") }
      // Gestione corretta da VariabiliMdF
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_archetipo_Fia") )    { mdF_archetipo_Fia = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_archetipo_Fia") }
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_archetipo_Fia_2") )  { mdF_archetipo_Fia_2 = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_archetipo_Fia_2") }
      mdF_archetipo_Fia_3 = ""
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_archetipo_Fia_3") )  { mdF_archetipo_Fia_3 = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_archetipo_Fia_3") }
     // 19.05.2021 FiancoChiusura in accosto a Colonne Slide che hanno la Battuta_X a 71 sul FiancoInterno
      mdF_arch_NO_BatFia   = ""
      mdF_arch_NO_BatFia_2 = ""
      if (VAR_EXIST(idx_att, "MdF_arch_NO_BatFia") )    { mdF_arch_NO_BatFia   = VAR_VAL_STR(idx_att, "MdF_arch_NO_BatFia") }
      if (VAR_EXIST(idx_att, "MdF_arch_NO_BatFia_2") )  { mdF_arch_NO_BatFia_2 = VAR_VAL_STR(idx_att, "MdF_arch_NO_BatFia_2") }

      Battuta_X = 0
      Battuta_X_Sx = Battuta_X
      Battuta_X_Dx = Battuta_X
      exitBattuta_SX = -1
      exitBattuta_DX = -1
      X_FiaBatSX_Cn = 0
      X_FiaBatDX_Cn = 0
      DEL_VAR(idx_att, "Fianchi_vic_*")
      DEL_VAR(idx_att, "mdf_Battuta_X_Sx")
      DEL_VAR(idx_att, "mdf_Battuta_X_Dx")
      Battuta_SX = 0
      Battuta_DX = 0

      BOX_MODE(0)
      mdf_distNearBatFia = 10
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_distNearBatFia") )  { mdf_distNearBatFia = VAR_VAL(PADRE(idx_att, 1), "MdF_distNearBatFia") }
      NEAR_GLOBALE("Fianchi_vic", idx_att, mdf_distNearBatFia, 1, mdF_archetipo_Fia)
      if (Fianchi_vic == 0)
         {
          mdF_archetipo_Fia = "*Fia*"
          NEAR_GLOBALE("Fianchi_vic", idx_att, mdf_distNearBatFia, 1, mdF_archetipo_Fia)
         }
      // 30.01.2019
      mdf_doppio_fiaSx_inY_Battuta_X = -1
      mdf_doppio_fiaDx_inY_Battuta_X = -1
      // 08.02.2019
      mdf_doppio_fiaSx_inY_basso = -1
      mdf_doppio_fiaSx_inY_alto = -1
      mdf_doppio_fiaDx_inY_basso = -1
      mdf_doppio_fiaDx_inY_alto = -1
      // 12.05.2022
      mdf_ctrl_Fia_2 = 0
      mdf_doppio_fiaSx_Battuta_X = -1
      mdf_doppio_fiaDx_Battuta_X = -1

      GOSUB MdF_while_X
      GOSUB MdF_Battuta_Z
      //DISPLAY2(STRCAT("1.MdF_Battuta_X - Fianchi_vic=", STR(Fianchi_vic), " mdF_archetipo_Fia=", mdF_archetipo_Fia))

      mdf_ctrl_Fia_Batt = 0
      if (exitBattuta_SX == -1  &  exitBattuta_DX == -1)
         { mdf_ctrl_Fia_Batt = 1 }
     // 10.07.2019 O18622001
      if (exitBattuta_SX == -1  &  IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "SX*") )
         { mdf_ctrl_Fia_Batt = 1.1 }
      if (exitBattuta_DX == -1  &  IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "DX*") )
         { mdf_ctrl_Fia_Batt = 1.2 }

      if (Fianchi_vic > 0)
         {
          if (Battuta_X != 0)
             {
              if ( VAR_EXIST(idx_att, "exitBattuta_SX")
                 & IS_IDX(VAR_VAL(idx_att, "exitBattuta_SX") )
                 )
                 {
                 // Lascio commentato. Preso da MdF_KeyFam_Battuta_X_Gen..MdF_KeyFam_Battuta_X
                  //y_Fro = VAR_VAL(idx_att, "Y")
                  //mdf_ctrl_Bay_Fia = VAR_VAL(exitBattuta_SX, "base_0.y")
                  //mdf_ctrl_Aly_Fia = VAR_VAL(exitBattuta_SX, "alto_0.y")
                  //mdf_ctrl_diff_BaFBaMy = mdf_ctrl_Bay_Fia - base_0.y
                  //mdf_ctrl_diff_AlMAlFy = alto_0.y - mdf_ctrl_Aly_Fia
                  //if (ABS(mdf_ctrl_diff_BaFBaMy)+ABS(mdf_ctrl_diff_AlMAlFy) > y_Fro/2-1)
                  //   {
                  //    mdf_exitBattuta_SX_att = exitBattuta_SX
                  //    exitBattuta_SX = -1
                  //    mdf_ctrl_Fia_Batt = 2
                  //   }
                 // Caso di Elementi Angolo Anta Diagonale con nomi archetipi Fianco e Cmp_FiaAng
                  // trova prima il Fianco con Battuta -18.4 e poi non cerca piu Cmp_FiaAng
                  if (Battuta_X < 0)
                     {
                      if (ABS(Battuta_X) > VAR_VAL(idx_att, "X_FiaBatSX")+0.1)
                         {
                          mdf_exitBattuta_SX_att = exitBattuta_SX
                          exitBattuta_SX = -1
                          mdf_ctrl_Fia_Batt = 3
                         }
                     }
                 }
              if ( VAR_EXIST(idx_att, "exitBattuta_DX")
                 & IS_IDX(VAR_VAL(idx_att, "exitBattuta_DX") )
                 )
                 {
                 // Lascio commentato. Preso da MdF_KeyFam_Battuta_X_Gen..MdF_KeyFam_Battuta_X
                  //y_Fro = VAR_VAL(idx_att, "Y")
                  //mdf_ctrl_Bay_Fia = VAR_VAL(exitBattuta_DX, "base_0.y")
                  //mdf_ctrl_Aly_Fia = VAR_VAL(exitBattuta_DX, "alto_0.y")
                  //mdf_ctrl_diff_BaFBaMy = mdf_ctrl_Bay_Fia - base_0.y
                  //mdf_ctrl_diff_AlMAlFy = alto_0.y - mdf_ctrl_Aly_Fia
                  //if (ABS(mdf_ctrl_diff_BaFBaMy)+ABS(mdf_ctrl_diff_AlMAlFy) > y_Fro/2-1)
                  //   {
                  //    mdf_exitBattuta_DX_att = exitBattuta_DX
                  //    exitBattuta_DX = -1
                  //    mdf_ctrl_Fia_Batt = 2.1
                  //   }
                 // Caso di Elementi Angolo Anta Diagonale con nomi archetipi Fianco e Cmp_FiaAng
                  // trova prima il Fianco con Battuta -18.4 e poi non cerca piu Cmp_FiaAng
                  if (Battuta_X < 0)
                     {
                      if (ABS(Battuta_X) > VAR_VAL(idx_att, "X_FiaBatDX")+0.1)
                         {
                          mdf_exitBattuta_DX_att = exitBattuta_DX
                          exitBattuta_DX = -1
                          mdf_ctrl_Fia_Batt = 3.1
                         }
                     }
                 }
             }
         }
     // 25.01.2017
      // Con mdF_archetipo_Fia = "Fia*" trovo un FiaLib vicino ma a quel punto non vado piu in cerca dei Cuc_Fia
      // con mdF_archetipo_Fia = "*Fia*" perchè Fianchi_vic è > 0
      if (mdf_ctrl_Fia_Batt > 0)
         {
          if (Fianchi_vic > 0)
             {
              mdF_archetipo_Fia = "*Fia*"
              NEAR_GLOBALE("Fianchi_vic", idx_att, mdf_distNearBatFia, 1, mdF_archetipo_Fia)
              if (Fianchi_vic > 2)
                 {
                  GOSUB MdF_while_X
                  GOSUB MdF_Battuta_Z
                 }

             // 30.06.2017
              if (exitBattuta_SX == -1  &  VAR_EXIST(idx_att, "mdf_exitBattuta_SX_att") )
                 { exitBattuta_SX = VAR_VAL(idx_att, "mdf_exitBattuta_SX_att") }

              if (exitBattuta_DX == -1  &  VAR_EXIST(idx_att, "mdf_exitBattuta_DX_att") )
                 { exitBattuta_DX = VAR_VAL(idx_att, "mdf_exitBattuta_DX_att") }
             }
         }

      if (mdf_aperture_NoBatt > 0)
         {
          if (VAR_EXIST(idx_att, "Battuta_X_Sx") )
             {
              if (Battuta_X_Sx == 0)
                 { mdf_ctrl_Battuta_NoBatt = 1 }
             }
          if (VAR_EXIST(idx_att, "Battuta_X_Dx") )
             {
              if (Battuta_X_Dx == 0)
                 { mdf_ctrl_Battuta_NoBatt = 2 }
             }
         }
      if (exitBattuta_SX == -1  |  exitBattuta_DX == -1)
         {
          NEAR_GLOBALE("Fianchi_vic", idx_att, mdf_distNearBatFia, 1, mdF_archetipo_Fia_2)
          if (Fianchi_vic == 0)
             {
              mdF_archetipo_Fia_2 = "*Div*"
              NEAR_GLOBALE("Fianchi_vic", idx_att, mdf_distNearBatFia, 1, mdF_archetipo_Fia_2)
             }
          if (Fianchi_vic > 0)
             {
             // 13.05.2022
              mdf_ctrl_Fia_2 = 1
              GOSUB MdF_while_X
              GOSUB MdF_Battuta_Z
             }
         }

      if (exitBattuta_SX == -1  |  exitBattuta_DX == -1)
         {
          if (STRLEN(mdF_archetipo_Fia_3) > 0)
             {
              NEAR_GLOBALE("Fianchi_vic", idx_att, mdf_distNearBatFia, 1, mdF_archetipo_Fia_3)
              if (Fianchi_vic > 0)
                 {
                  GOSUB MdF_while_X
                  GOSUB MdF_Battuta_Z
                 }
             }
         }

      GOSUB MdF_ctrl_Post_Battuta_X
   }

  // 27.09.2018
   PROCEDURA MdF_Battuta_X_byFather
   {
      if (VAR_VAL(idx_att, "escluso") != 0)  { EXITSUB() }

      DEL_VAR(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
      DEL_VAR(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
      DEL_VAR(idx_att, "MdfSys_Battuta_SX_Cn")
      DEL_VAR(idx_att, "MdfSys_Battuta_DX_Cn")

      GOSUB MdF_Battuta_X_After_RegFacc

      if (mdf_Battuta_X_After_RegFacc > 0)  { EXITSUB() }

      mdf_aperture_NoBatt = 0
      mdf_ctrl_Battuta_NoBatt = 0
      if ( IS_MATCH(MdF_Apertura, "S*") != 1
         & IS_MATCH(MdF_Apertura, "D*") != 1
         )
         {
          mdf_aperture_NoBatt = 1
         }

      if ( VAR_EXIST(PADRE(idx_att, 1), "Battuta_X")
         & VAR_EXIST(PADRE(idx_att, 1), "Battuta_SX")
         & VAR_EXIST(PADRE(idx_att, 1), "Battuta_DX")
         & VAR_EXIST(PADRE(idx_att, 1), "Battuta_X_Sx")
         & VAR_EXIST(PADRE(idx_att, 1), "Battuta_X_Dx")
         )
         {
          Battuta_X    = VAR_VAL(PADRE(idx_att, 1), "Battuta_X")
          Battuta_SX   = VAR_VAL(PADRE(idx_att, 1), "Battuta_SX")
          Battuta_DX   = VAR_VAL(PADRE(idx_att, 1), "Battuta_DX")
          Battuta_X_Sx = VAR_VAL(PADRE(idx_att, 1), "Battuta_X_Sx")
          Battuta_X_Dx = VAR_VAL(PADRE(idx_att, 1), "Battuta_X_Dx")
          Battuta_Z    = VAR_VAL(PADRE(idx_att, 1), "Battuta_Z")

         // 20.07.2023
          Battuta_Z_Sx = VAR_VAL(PADRE(idx_att, 1), "Battuta_Z_Sx")
          Battuta_Z_Dx = VAR_VAL(PADRE(idx_att, 1), "Battuta_Z_Dx")

          if ( VAR_VAL(idx_att, "mdf_forza_ctrl_Battuta") == 0
             | VAR_EXIST(idx_att, "MdfSys_SbordoYSup") != 1
             )
             {
              if (VAR_EXIST(PADRE(idx_att, 1), "MdfSys_SbordoYSup") )
                 { MdfSys_SbordoYSup = VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYSup") }

              if (VAR_EXIST(PADRE(idx_att, 1), "MdfSys_SbordoYInf") )
                 { MdfSys_SbordoYInf = VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYInf") }

              if (VAR_EXIST(PADRE(idx_att, 1), "MdfSys_SbordoYSup_DaCop") )
                 { MdfSys_SbordoYSup_DaCop = VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYSup_DaCop") }

              if (VAR_EXIST(PADRE(idx_att, 1), "MdfSys_SbordoYInf_DaFon") )
                 { MdfSys_SbordoYInf_DaFon = VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYInf_DaFon") }
             }

          GOSUB MdF_ctrl_Post_Battuta_X

          if ( Battuta_X > 0
             | Battuta_SX > 0
             | Battuta_DX > 0
             | Battuta_X_Sx > 0
             | Battuta_X_Dx > 0
             )
             {
              // 04.02.2016
              // Problema Bdm Grafica non Lineare (fatto male). Un Modulo a giorno sotto ad un Pensile
              // si ritrova dentro appunto al pensile sopra di mm pari all' altezza piedini (Alt_Zoc)
              // che vengono esclusi e quindi il Pensile riposizionato correttamente solo
              // dopo l' OnLoadedOrder e di conseguenza dopo la MdF_CamMdFrontali_Load_pers
              // Siccome difficilmente a senso uno Sbordo piu grande di metà e un quinto della
              // propria altezza, in questo caso ricontrontrollo la Battuta
              mdf_forza_ctrl_Battuta = 0
              if ( VAR_VAL(idx_att, "MdfSys_SbordoYSup") > Y/2 + Y/5
                 | VAR_VAL(idx_att, "MdfSys_SbordoYInf") > Y/2 + Y/5
                 )
                 {
                  if (STR_INDEX_OF($MdF_Load_pers, 0, "CerBat") > -1)
                     {
                      COMANDO2(STRCAT("LOGMSG MdF_Battuta_X Protezione-CAM per GraficaBdm nonostante MdF_CamMdFrontali_Load_pers sia alla fine dell' OnLoadedOrder:", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
                      mdf_forza_ctrl_Battuta = 1
                     }
                 }

              // 26.02.2016 In casi rarissimi la MdF_KeyFam_Battuta_X_Gen sbaglia la Battuta
              // perché il Frontale arriva troppo presto con la X ancora a 0 perché magari la deve prendere da Gestionale
              if (Battuta_X_Sx < 0 & ABS(Battuta_X_Sx) < 2 & VAR_VAL(PADRE(idx_att, 1), "X_Fro_KeyFam_Batt") < 30  & VAR_EXIST(PADRE(idx_att, 1), "X_Fro_KeyFam_Batt"))  { mdf_forza_ctrl_Battuta = 2 }
              if (Battuta_X_Dx < 0 & ABS(Battuta_X_Dx) < 2 & VAR_VAL(PADRE(idx_att, 1), "X_Fro_KeyFam_Batt") < 30  & VAR_EXIST(PADRE(idx_att, 1), "X_Fro_KeyFam_Batt"))  { mdf_forza_ctrl_Battuta = 3 }

              if (mdf_forza_ctrl_Battuta == 2  |  mdf_forza_ctrl_Battuta == 3)
                 {
                  if (VAR_EXIST(idx_att, "mdf_log_X_0") != 1)
                     { COMANDO2(STRCAT("LOGMSG MdF_Battuta_X Protezione-CAM per problema GraficaBdm per X Frontale=0 nonostante MdF_CamMdFrontali_Load_pers sia alla fine dell' OnLoadedOrder: ", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0))) }
                  mdf_log_X_0 = 1
                 }

              if ( VAR_VAL(PADRE(idx_att, 1), "MdF_offx_Battuta_Sx") == 0
                 & VAR_VAL(PADRE(idx_att, 1), "MdF_offx_Battuta_Dx") == 0
                 & mdf_forza_ctrl_Battuta == 0
                 )
                 {
                  if (VAR_VAL(-1, "CAM_Visualize") <= 1)
                     {
                      EXITSUB()
                     }
                 }
             }
         }
   }

   // 05.10.2016
   PROCEDURA MdF_Ctrl_SbordoY_padre
   {
      if (VAR_EXIST(idx_att, "MdfSys_SbordoYSup") != 1)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "MdfSys_SbordoYSup_prec") != 1)  { MdfSys_SbordoYSup_prec = MdfSys_SbordoYSup }
      if (VAR_EXIST(idx_att, "MdfSys_SbordoYInf_prec") != 1)  { MdfSys_SbordoYInf_prec = MdfSys_SbordoYInf }

      if (VAR_EXIST(idx_att, "MdfSys_SbordoYSup_DaCop_prec") != 1)  { MdfSys_SbordoYSup_DaCop_prec = MdfSys_SbordoYSup_DaCop }
      if (VAR_EXIST(idx_att, "MdfSys_SbordoYInf_DaFon_prec") != 1)  { MdfSys_SbordoYInf_DaFon_prec = MdfSys_SbordoYInf_DaFon }

      if (VAR_EXIST(idx_att, "MdfSys_SbordoYSup_prec") == 1)
         {
          if (MdfSys_SbordoYSup_prec != MdfSys_SbordoYSup)
             {
              MdfSys_SbordoYSup_prec = MdfSys_SbordoYSup
              mdf_ricalc_Post_READD = 0
              px_CerBat1 = 0
             }
         }
      if (VAR_EXIST(idx_att, "MdfSys_SbordoYInf_prec") == 1)
         {
          if (MdfSys_SbordoYInf_prec != MdfSys_SbordoYInf)
             {
              MdfSys_SbordoYInf_prec = MdfSys_SbordoYInf
              mdf_ricalc_Post_READD = 0
              px_CerBat1 = 0
             }
         }
      MdfSys_SbordoYSup_DaCop = VAR_VAL(idx_att, "MdfSys_SbordoYSup_DaCop")
      MdfSys_SbordoYInf_DaFon = VAR_VAL(idx_att, "MdfSys_SbordoYInf_DaFon")
   }

   PROCEDURA MdF_Battuta_X_After_RegFacc
   {
      mdf_Battuta_X_After_RegFacc = 0
      if (VAR_VAL(idx_att, "escluso") != 0)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "CAM_angoloBas") )
         {
          if (ABS(CAM_angoloBas) == 90)
             {
              Battuta_X = -0.5
              mdf_Battuta_X_After_RegFacc = 1
             }
         }

      if (VAR_VAL(idx_att, "Battuta_X_CerBat1") != 0)
         {
          Battuta_X = VAR_VAL(idx_att, "Battuta_X_CerBat1")
          mdf_Battuta_X_After_RegFacc = 2
         }

     // 08.05.2024 BaseSat
      if (VAR_VAL(idx_att, "MCB_ForzaBattutaX") != 0)
         {
          Battuta_X = MCB_ForzaBattutaX
          mdf_Battuta_X_After_RegFacc = 2.1
         }

      if (VAR_VAL(idx_att, "Battuta_X_CerRib1") != 0)
         {
          Battuta_X = VAR_VAL(idx_att, "Battuta_X_CerRib1")
          Battuta_X_Sx = Battuta_X
          Battuta_X_Dx = Battuta_X

          mdf_Battuta_X_After_RegFacc = 3
         }

      if (VAR_VAL(idx_att, "Battuta_X_PisFia1") != 0)
         {
          Battuta_X = VAR_VAL(idx_att, "Battuta_X_PisFia1")
          Battuta_X_Sx = Battuta_X
          Battuta_X_Dx = Battuta_X
          // Gestione per forzatura Battuta diversa tra Sx e Dx per moduli inclinati
          if (VAR_VAL(idx_att, "Battuta_X_PisFia2") != 0)
             { Battuta_X_Dx = VAR_VAL(idx_att, "Battuta_X_PisFia2") }

          mdf_Battuta_X_After_RegFacc = 4
         }

      // Regola Sx è la 1 ma è esclusa
      if (VAR_EXIST(idx_att, "Battuta_X_PisFia1") != 1)
         {
          if (VAR_VAL(idx_att, "Battuta_X_PisFia2") != 0)
             {
              Battuta_X_Dx = VAR_VAL(idx_att, "Battuta_X_PisFia2")
              mdf_Battuta_X_After_RegFacc = 4.1
             }
         }

      if (VAR_VAL(idx_att, "Battuta_X_FerFia1") != 0)
         {
          Battuta_X_Sx = VAR_VAL(idx_att, "Battuta_X_FerFia1")
          if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "SX*") )
             { Battuta_X = VAR_VAL(idx_att, "Battuta_X_FerFia1") }

          if (VAR_VAL(PADRE(idx_att, 1), "Battuta_X_Dx") > -20)
             { Battuta_X_Dx = VAR_VAL(PADRE(idx_att, 1), "Battuta_X_Dx") }

          // Gestione per forzatura Battuta diversa tra Sx e Dx per Elementi ANP
          if (VAR_VAL(idx_att, "Battuta_X_FerFia2") != 0)
             {
              Battuta_X_Dx = VAR_VAL(idx_att, "Battuta_X_FerFia2")
              if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "DX*") )
                 { Battuta_X = VAR_VAL(idx_att, "Battuta_X_FerFia2") }
             }

          mdf_Battuta_X_After_RegFacc = 5
         }

      // Regola Sx è la 1 ma è esclusa
      if (VAR_EXIST(idx_att, "Battuta_X_FerFia1") != 1)
         {
          if (VAR_VAL(idx_att, "Battuta_X_FerFia2") != 0)
             {
              Battuta_X_Dx = VAR_VAL(idx_att, "Battuta_X_FerFia2")
              if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "DX*") )
                 { Battuta_X = VAR_VAL(idx_att, "Battuta_X_FerFia2") }
              mdf_Battuta_X_After_RegFacc = 5.1
             }
         }
     // 07.10.2020 Sn Se ho sbordo solo a destra potrei quindi avere Battuta_X_FerFia1=0
      // altrimenti devo far uscire una Battuta a 17 sul sinistro per far in modo che il sistema prenda la BattutaDx
      // Al momento resta solo commento, cioe' non e' mai stata abilita questa gestione, resta che se ci sono sbordi sx,dx
      // e si vuole usare la Battuta RegFacc si devono scrivere 3 righe
      // Sx        01_1 regola std
      // PisFia Sx 01_2 MdF_SbordDx>0 Battuta_X 17
      // PisFia Sx 01_3 MdF_SbordSx>0 Battuta_X MdF_BordoSx
      // Dx        02_1 regola std
      // PisFia Dx 02_2 MdF_SbordSx>0 Battuta_X 17
      // PisFia Dx 02_3 MdF_SbordDx>0 Battuta_X MdF_BordoDx
      //if (VAR_VAL(idx_att, "Battuta_X_FerFia2") != 0)
      //   {
      //    Battuta_X_Dx = VAR_VAL(idx_att, "Battuta_X_FerFia2")
      //   }
   }

   PROCEDURA MdF_ctrl_Post_Battuta_X
   {
      if (mdf_aperture_NoBatt > 0)
         {
          if ( VAR_EXIST(idx_att, "Battuta_X_Sx")
             & VAR_VAL(idx_att, "Battuta_X_Sx") == 0
             )
             { Battuta_X_Sx = Battuta_DX }

          if ( VAR_EXIST(idx_att, "Battuta_X_Dx")
             & VAR_VAL(idx_att, "Battuta_X_Dx") == 0
             )
             { Battuta_X_Dx = Battuta_SX }
         }

      GOSUB MdF_offx_Battuta_X
   }

   PROCEDURA MdF_offx_Battuta_X
   {
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_offx_Battuta_Sx") )
         {
          mdf_offx_Battuta_Sx = VAR_VAL(PADRE(idx_att, 1), "MdF_offx_Battuta_Sx")
          if (Battuta_SX == 0  &  ABS(Battuta_DX) < 19)
             { Battuta_SX = Battuta_DX }
          Battuta_SX = Battuta_SX + mdf_offx_Battuta_Sx
          if (IS_MATCH(MdF_Apertura, "S*") == 1)
             { Battuta_X = Battuta_SX }
         }
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_offx_Battuta_Dx") )
         {
          if (Battuta_DX == 0  &  ABS(Battuta_SX) < 19)
             { Battuta_DX = Battuta_SX }
          mdf_offx_Battuta_Dx = VAR_VAL(PADRE(idx_att, 1), "MdF_offx_Battuta_Dx")
          Battuta_DX = Battuta_DX + mdf_offx_Battuta_Dx
          if (IS_MATCH(MdF_Apertura, "D*") == 1)
             { Battuta_X = Battuta_DX }
         }
   }

   PROCEDURA MdF_Battuta_Y
   {
      if (VAR_VAL(idx_att, "escluso") != 0)  { EXITSUB() }

      if (VAR_VAL(idx_att, "Battuta_Y_CerRib1") != 0)
         {
          Battuta_Y = VAR_VAL(idx_att, "Battuta_Y_CerRib1")
          EXITSUB()
         }

     // 16.12.2019 992627 VASINF, se CernieraBasetta tra ante non ha senso la Battuta sul Ripiano/Cop intermedio
      if (VAR_VAL(idx_att, "MCR_angoloBas") == 90)  { EXITSUB() }

      mdF_archetipo_Rip = "Rip*"
      mdF_archetipo_Rip_2 = "Pia*"
     // 11.09.2023
      mdF_archetipo_Rip_3 = ""
      mdF_archetipo_Cop = "Cop*"
      mdF_archetipo_Fon = "Fon*"
      if (VAR_EXIST(PADRE(idx_att, 1), "archetipo_Rip") )    { mdF_archetipo_Rip = VAR_VAL_STR(PADRE(idx_att, 1), "archetipo_Rip") }
      if (VAR_EXIST(PADRE(idx_att, 1), "archetipo_Rip_2") )  { mdF_archetipo_Rip_2 = VAR_VAL_STR(PADRE(idx_att, 1), "archetipo_Rip_2") }
      if (VAR_EXIST(PADRE(idx_att, 1), "archetipo_Cop") )    { mdF_archetipo_Cop = VAR_VAL_STR(PADRE(idx_att, 1), "archetipo_Cop") }
      if (VAR_EXIST(PADRE(idx_att, 1), "archetipo_Fon") )    { mdF_archetipo_Fon = VAR_VAL_STR(PADRE(idx_att, 1), "archetipo_Fon") }

      // Gestione corretta da VariabiliMdF
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_archetipo_Rip") )    { mdF_archetipo_Rip = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_archetipo_Rip") }
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_archetipo_Rip_2") )  { mdF_archetipo_Rip_2 = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_archetipo_Rip_2") }
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_archetipo_Rip_3") )  { mdF_archetipo_Rip_3 = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_archetipo_Rip_3") }
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_archetipo_Cop") )    { mdF_archetipo_Cop = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_archetipo_Cop") }
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_archetipo_Fon") )    { mdF_archetipo_Fon = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_archetipo_Fon") }

     // 20.09.2024
      if (IS_MATCH(NOME(idx_att), "MECC*UTE*") )
         {
          if (VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Apertura") != VAR_VAL_STR(idx_att, "MdF_Apertura") )
             {
              if (VAR_EXIST(idx_att, "MdF_archetipo_Rip") )    { mdF_archetipo_Rip = VAR_VAL_STR(idx_att, "MdF_archetipo_Rip") }
              if (VAR_EXIST(idx_att, "MdF_archetipo_Rip_2") )  { mdF_archetipo_Rip_2 = VAR_VAL_STR(idx_att, "MdF_archetipo_Rip_2") }
              if (VAR_EXIST(idx_att, "MdF_archetipo_Rip_3") )  { mdF_archetipo_Rip_3 = VAR_VAL_STR(idx_att, "MdF_archetipo_Rip_3") }
              if (VAR_EXIST(idx_att, "MdF_archetipo_Cop") )    { mdF_archetipo_Cop = VAR_VAL_STR(idx_att, "MdF_archetipo_Cop") }
              if (VAR_EXIST(idx_att, "MdF_archetipo_Fon") )    { mdF_archetipo_Fon = VAR_VAL_STR(idx_att, "MdF_archetipo_Fon") }
             }
         }

      Battuta_Y = 0
      BOX_MODE(0)
      NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, mdF_archetipo_Rip)
      if (Rip_vic == 0)  { NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, mdF_archetipo_Rip_2) }
     // 11.09.2023
      if (Rip_vic == 0  &  STRLEN(mdF_archetipo_Rip_3) > 1)  { NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, mdF_archetipo_Rip_3) }

     // 13.02.2023
      if (Rip_vic == 0)
         {
          // Con gola basette non "affogate"
          // 14.01.2025 St943184
          //mcr_distNear_BY = 27.5
          mcr_distNear_BY = 27.7
          NEAR_GLOBALE("Rip_vic", idx_att, mcr_distNear_BY, 1, mdF_archetipo_Rip)
          if (Rip_vic == 0)  { NEAR_GLOBALE("Rip_vic", idx_att, mcr_distNear_BY, 1, mdF_archetipo_Rip_2) }
          if (Rip_vic == 0  &  STRLEN(mdF_archetipo_Rip_3) > 1)  { NEAR_GLOBALE("Rip_vic", idx_att, mcr_distNear_BY, 1, mdF_archetipo_Rip_3) }
         }

      GOSUB MdF_while_Y
      // 12.02.2018 come sotto. Se trova un Rip*Spalla sotto la Battuta_Y sarà pari all' ariaY
      //if (Battuta_Y == 0)
      if (ABS(Battuta_Y) < 2 | exitBattuta_RI_Y == -1)
         {
          if (IS_MATCH(MdF_Apertura, "RI*") == 1)
             {
              NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, mdF_archetipo_Fon)
              // 01.07.2024
              if (Rip_vic == 0  &  mdF_archetipo_Fon != "*Fon*")
                 { NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, "*Fon*") }
              GOSUB MdF_while_Y
              // Cerco anche per il caso se un elemento è fatto erroneamente o
              // non erroneamente da Coperchio+Coperchio
              // e un altro è fatto da Fondo+Fondo potrei rischiare di trovare l'elemento
              // del contenitore subito sotto o subito sopra e sbaglierebbe
              if (Battuta_Y == 0  |  exitBattuta_RI_Y == -1)
                 {
                  NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, mdF_archetipo_Cop)
                  // 01.07.2024
                  if (Rip_vic == 0  &  mdF_archetipo_Cop != "*Cop*")
                     { NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, "*Cop*") }
                  GOSUB MdF_while_Y
                 }
             // 02.03.2021 843267
              if (Battuta_Y == 0  |  exitBattuta_RI_Y == -1)
                 {
                  NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, mdF_archetipo_Rip_2)
                  // 30.07.2024 AOCL123867
                  if (Rip_vic == 0  &  mdF_archetipo_Rip_2 != "*Rip*"  &  STRLEN(mdF_archetipo_Rip_3) < 1)
                     { NEAR_GLOBALE("Rip_vic", idx_att, 3.1, 1, "*Rip*") }
                  GOSUB MdF_while_Y
                 }
             // 11.09.2023
              if (Battuta_Y == 0  |  exitBattuta_RI_Y == -1)
                 {
                  if (STRLEN(mdF_archetipo_Rip_3) )
                     {
                      NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, mdF_archetipo_Rip_3)
                      GOSUB MdF_while_Y
                     }
                 }
             // 05.11.2024 Sc1056852
              if (Battuta_Y == 0  |  exitBattuta_RI_Y == -1)
                 {
                  NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, "Div*")
                  GOSUB MdF_while_Y
                 }
             }
         }

      // Se trova un pensile sopra trova il fondo con battuta pari all' aria Y
      // In ogni caso adesso entro se exitBattuta_VA_Y = -1
      if (ABS(Battuta_Y) < 2  |  exitBattuta_VA_Y == -1)
         {
          if (IS_MATCH(MdF_Apertura, "VA*") == 1)
             {
              NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, mdF_archetipo_Cop)
              // 01.07.2024
              if (Rip_vic == 0  &  mdF_archetipo_Cop != "*Cop*")
                 { NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, "*Cop*") }
              GOSUB MdF_while_Y
              if (Battuta_Y == 0  |  exitBattuta_VA_Y == -1)
                 {
                  NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, mdF_archetipo_Fon)
                  // 01.07.2024
                  if (Rip_vic == 0  &  mdF_archetipo_Fon != "*Fon*")
                     { NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, "*Fon*") }
                  GOSUB MdF_while_Y
                 }
             // 02.03.2021
              if (Battuta_Y == 0  |  exitBattuta_VA_Y == -1)
                 {
                  NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, mdF_archetipo_Rip_2)
                  // 30.07.2024 come Rib
                  if (Rip_vic == 0  &  mdF_archetipo_Rip_2 != "*Rip*"  &  STRLEN(mdF_archetipo_Rip_3) < 1)
                     { NEAR_GLOBALE("Rip_vic", idx_att, 3.1, 1, "*Rip*") }
                  GOSUB MdF_while_Y
                 }
             // 11.09.2023
              if (Battuta_Y == 0  |  exitBattuta_VA_Y == -1)
                 {
                  if (STRLEN(mdF_archetipo_Rip_3) )
                     {
                      NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, mdF_archetipo_Rip_3)
                      GOSUB MdF_while_Y
                     }
                 }
             // 05.11.2024 Sc1056852
              if (Battuta_Y == 0  |  exitBattuta_VA_Y == -1)
                 {
                  NEAR_GLOBALE("Rip_vic", idx_att, 20, 1, "Div*")
                  GOSUB MdF_while_Y
                 }
             }
         }
     // 24.04.2025 Imposto default, ma per ora solo per anta graficata sciolta
      if (Battuta_Y == 0)
         {
          if ( IS_MATCH(NOME(PADRE(idx_att, -1)), "*Anta*")
             | IS_MATCH(NOME(PADRE(idx_att, -1)), "*Fron*")
             | VAR_VAL(PADRE(idx_att, -1), "VAR_vuoto") == 1
             )
             {
              if (PADRE(idx_att, 1) == PADRE(idx_att, -1))
                 { Battuta_Y = 16.511 }
             }
        }
   }

   PROCEDURA MdF_while_X
   {
      fia_Sx = 0
      fia_Dx = 0
      mdf_SbordoYInf_Sx = 0
      mdf_SbordoYSup_Sx = 0
      mdf_SbordoYInf_Dx = 0
      mdf_SbordoYSup_Dx = 0
      MdfSys_SbordoYInf = 0
      MdfSys_SbordoYSup = 0

     // 24.04.2025
      MdfSys_SbordoYInf_DaFon = 0
      MdfSys_SbordoYSup_DaCop = 0

     // 13.09.2024 PH544951
      mdf_SbordoYInf_Sx_Found_Fondo = 0
      mdf_SbordoYInf_Dx_Found_Fondo = 0

     // 21.02.2023 PolK
      mdf_abbassaSbordoSup = 0
      mdf_abbassaSbordoInf = 0
      mdf_offy_REL_wh = VAR_VAL(idx_att, "MdF_offy_REL_ADD")
      mdf_pan_y_wh = VAR_VAL(idx_att, "MdF_Pan_Y")
     // 01.03.2023
      if (mdf_pan_y_wh != 0)
         { mdf_abbassaSbordoSup = Y-mdf_pan_y_wh }

      if (mdf_offy_REL_wh != 0)
         {
          mdf_abbassaSbordoSup = mdf_abbassaSbordoSup-mdf_offy_REL_wh
          mdf_abbassaSbordoInf = mdf_offy_REL_wh
         }

      mdf_offsetY_Sbordo = 0
      if (VAR_EXIST(idx_att, "MdF_offsetY_Sbordo") )            { mdf_offsetY_Sbordo = VAR_VAL(idx_att, "MdF_offsetY_Sbordo") }
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_offsetY_Sbordo") )  { mdf_offsetY_Sbordo = VAR_VAL(PADRE(idx_att, 1), "MdF_offsetY_Sbordo") }

      mdf_LimY_Con_Sbordo = 40
      if (VAR_EXIST(idx_att, "MdF_LimY_Con_Sbordo") )            { mdf_LimY_Con_Sbordo = VAR_VAL(idx_att, "MdF_LimY_Con_Sbordo") }
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_LimY_Con_Sbordo") )  { mdf_LimY_Con_Sbordo = VAR_VAL(PADRE(idx_att, 1), "MdF_LimY_Con_Sbordo") }

      iX = 1

      if (Fianchi_vic > 0)
         {
          mdf_Battuta_X = 0
          mdf_Battuta_SX = 0
          mdf_Battuta_DX = 0
         }

      X_FiaBatSX = 0
      X_FiaBatDX = 0

      mdf_doppio_fiaSx_inY = -1
      mdf_doppio_fiaDx_inY = -1

      // Calcolo Battuta a sinistra
      SORT_POINT(base_1, "Fianchi_vic", "base_1")
      fiancoSx_prec = -1
      while (iX <= Fianchi_vic  &  exitBattuta_SX == -1)
         {
          // 13.05.2020
          mdf_Ingom_fia = 0
          GOSUB MdF_Ingom_Fia

          // Se per caso intercetta MdF_FerramentaSuFianco
          if ( IS_MATCH(NOME(Fianchi_vic[iX]), "MdF_Ferr*") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "MdF_*Fianco") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "MdF_Sat*Fia*") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "_cont_collide*Fia*") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "_cont_collide*Div*") != 1
             // 08.11.2019
             & IS_MATCH(NOME(Fianchi_vic[iX]), "*Fia*collide*") != 1
             // 13.05.2020
             & mdf_Ingom_fia == 0
             )
             {
              fia_Dx = 0
              fia_Sx = 0
              SET_#(Fianchi_vic[iX])

              idx_FiaSx_Ctrl_att = Fianchi_vic[iX]
              GOSUB MdF_get_Battuta_SX
              if (fia_Sx == 1  |  fia_Dx == 0)
                 {
                  if ( IS_MATCH(MdF_Apertura, "S*") == 1
                     & mdf_Battuta_X != 0
                     )
                     { Battuta_X = mdf_Battuta_X }
                  Battuta_SX = mdf_Battuta_SX
                  if (VAR_EXIST(idx_att, "mdf_Battuta_X_Sx") )
                     { Battuta_X_Sx = mdf_Battuta_X_Sx }
                 }
             }
          iX = iX+1
         }
      if (Battuta_SX != 0)
         {
          if ( VAR_EXIST(idx_att, "fiaBatSx")
             & IS_IDX(VAR_VAL(idx_att, "fiaBatSx") )
             )
             {
              exitBattuta_SX = VAR_VAL(idx_att, "fiaBatSx")
              DEL_VAR(idx_att, "fiaBatSx")
             }
         }

      if (IS_IDX(exitBattuta_SX) )
         {
          mdf_alty_FiaSx = VAR_VAL(exitBattuta_SX, "alto_0.y")
          mdf_basy_FiaSx = VAR_VAL(exitBattuta_SX, "base_0.y")

         // 12.05.2022 come Dx Colonna ANP che sborda in Y trova prima il Fia che sta sopra, poi trova mdF_archetipo_Fia_2 MontanteColAngPan
          if (mdf_ctrl_Fia_2 == 1)
             {
              if ( mdf_doppio_fiaSx_inY_basso != -1
                 & mdf_doppio_fiaSx_inY_alto != -1
                 & mdf_doppio_fiaSx_inY_Battuta_X == -1
                 )
                 {
                  mdf_fiaSx_BattutaSX_att_b0_t = VAR_VAL(exitBattuta_SX, "base_0.y")
                  mdf_fiaSx_BattutaSX_att_a0_t = VAR_VAL(exitBattuta_SX, "alto_0.y")
                  mdf_fiaSx_BattutaSX_att_Y    = VAR_VAL(exitBattuta_SX, "Y")
                  mdf_fiaSx_basso_att_b0_t     = VAR_VAL(mdf_doppio_fiaSx_inY_basso, "base_0.y")
                  mdf_fiaSx_alto_att_b0_t      = VAR_VAL(mdf_doppio_fiaSx_inY_alto, "base_0.y")
                  mdf_fiaSx_alto_att_Y         = VAR_VAL(mdf_doppio_fiaSx_inY_alto, "Y")
                  if ( mdf_fiaSx_BattutaSX_att_b0_t+200 < mdf_fiaSx_basso_att_b0_t
                     // se sopra pensile devo considerare Coperchio mio e Fondo sopraPensile
                     & mdf_fiaSx_BattutaSX_att_a0_t+45 > mdf_fiaSx_alto_att_b0_t
                     & mdf_fiaSx_BattutaSX_att_a0_t < mdf_fiaSx_alto_att_b0_t
                     )
                     {
                      if (mdf_fiaSx_BattutaSX_att_Y+mdf_fiaSx_alto_att_Y > 3*y_Fro/4)
                         {
                          mdf_doppio_fiaSx_inY_basso = exitBattuta_SX
                          mdf_doppio_fiaSx_inY_Battuta_X = mdf_doppio_fiaSx_inY_alto
                         // 13.05.2022
                          if ( mdf_doppio_fiaSx_Battuta_X > 5
                             & mdf_doppio_fiaSx_Battuta_X > Battuta_X
                             & mdf_doppio_fiaSx_Battuta_X - Battuta_X < 1.5
                             )
                             { Battuta_X = mdf_doppio_fiaSx_Battuta_X }
                         }
                     }
                 }
             }

          mdf_diff_altalt_Sx = alto_0.y - mdf_alty_FiaSx
          if (mdf_diff_altalt_Sx > mdf_LimY_Con_Sbordo)
             {
              // 03.10.2017 come MdF_while_X_Gen
              //mdf_SbordoYSup_Sx = mdf_diff_altalt_Sx

              // 18.01.2024 A011802 Essendo il primo caso di sempre posso limitarlo; in piu graficamente va a filo
              // in X all' anta del pensile vicino quindi molto improbabile
              // Comunque l' anta è stata sbordata in X di 20mm rispetto alla scocca
              mdf_Ctrl_SbordoSup_Sx = 0
              if (Battuta_X_Sx < 0 & ABS(Battuta_X_Sx) < 2)  { mdf_Ctrl_SbordoSup_Sx = 1 }

              if ( ABS(Battuta_X_Sx) < 2  &  Fianchi_vic >= 3
                 & VAR_VAL(idx_att, "X") > VAR_VAL(PADRE(idx_att, 2), "X")
                 & VAR_VAL(idx_att, "X")-30 < VAR_VAL(PADRE(idx_att, 2), "X")
                 )
                 { mdf_Ctrl_SbordoSup_Sx = 2 }

              //if (Battuta_X_Sx < 0 & ABS(Battuta_X_Sx) < 2)
              if (mdf_Ctrl_SbordoSup_Sx > 0)
                 {
                  if (mdf_diff_altalt_Sx <= Y/3 + Y/9)
                     { mdf_SbordoYSup_Sx = mdf_diff_altalt_Sx }
                 }
              else
                 {
                 // 22.12.2021 come dx
                  mdivsbsup = 3
                 // 29.11.2022 EM1053762
                  if (Y > 900  &  Y < 1100  & mdf_diff_altalt_Sx > Y/2+35)
                     {
                      // base_0_offset.y -511
                      mdf_sbSup_bas0_offy = VAR_VAL(PADRE(idx_att, 1), "base_0_offset.y")
                      mdivsbsup = -45
                     }
                  if (Y < 750  &  Battuta_X_Sx <= 0)  { mdivsbsup = -45 }
                 // 27.01.2025 PK2024TLS111116 Frontalino che sporge sopra
                  if (Y < 119)  { mdivsbsup = 5 }

                  mdf_SbordoYSup_Sx_Y2Y19 = Y/2 + Y/19+mdivsbsup
                  if (mdf_diff_altalt_Sx <= Y/2 + Y/19+mdivsbsup)
                     { mdf_SbordoYSup_Sx = mdf_diff_altalt_Sx }
                  else
                     {
                     // 15.06.2022 19932 per debug
                      mdf_SbordoYSup_Sx_NotValid = mdf_diff_altalt_Sx
                     }
                 // 23.01.2023 H19037315
                  if ( IS_MATCH(NOME(exitBattuta_SX), "*Div*")
                     & mdf_SbordoYSup_Sx > 0
                     )
                     {
                      alty_Div = VAR_VAL(exitBattuta_SX, "alto_0.y")
                      alty_pdr_Div = VAR_VAL(PADRE(exitBattuta_SX, 2), "alto_0.y")
                      mdf_diff_altDiv_pdr = alty_pdr_Div - alty_Div
                      if ( mdf_diff_altDiv_pdr < 35
                         & mdf_diff_altDiv_pdr > 3
                         )
                         { mdf_SbordoYSup_Sx = mdf_SbordoYSup_Sx -mdf_diff_altDiv_pdr }
                     }
                 }
             }

          mdf_diff_basbas_Sx = mdf_basy_FiaSx - base_0.y
          if (mdf_diff_basbas_Sx > mdf_LimY_Con_Sbordo)
             {
              // 03.10.2017 come MdF_while_X_Gen
              //mdf_SbordoYInf_Sx = mdf_diff_basbas_Sx
              if (Battuta_X_Sx < 0 & ABS(Battuta_X_Sx) < 2)
                 {
                  if (mdf_diff_basbas_Sx <= Y/3 + Y/9)
                     { mdf_SbordoYInf_Sx = mdf_diff_basbas_Sx }
                 }
              else
                 {
                  if (mdf_diff_basbas_Sx <= Y/2 + Y/19+3)
                     { mdf_SbordoYInf_Sx = mdf_diff_basbas_Sx }
                 }
             }

         // 27.06.2023 Sc1054754
          mdf_Sbordo_Ctrl_Sx = 0
          if (mdf_SbordoYInf_Sx > 2 & mdf_SbordoYInf_Sx < 25)  { mdf_Sbordo_Ctrl_Sx = 1 }
          if (mdf_SbordoYSup_Sx > 2 & mdf_SbordoYSup_Sx < 25)  { mdf_Sbordo_Ctrl_Sx = 2 }

         // 16.11.2023 Come Dx
          if (PADRE(exitBattuta_SX, -1) == PADRE(idx_att, -1) )
             {
              // 18.11.2024 Vedi Sx Sc1056945
              mdf_SbordoApDx_Ctrl_Sx = 0
              if (IS_IDX(exitBattuta_DX) != 1)  { mdf_SbordoApDx_Ctrl_Sx = 1 }
              else
                 {
                  if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "DX*") )
                     { mdf_SbordoApDx_Ctrl_Sx = 2 }
                 }

              if ( VAR_VAL(exitBattuta_SX, "Y") + 50  < VAR_VAL(PADRE(exitBattuta_SX, -1), "Y")
                 // Per ora limito cosi. caso ANGL
                 // 18.11.2024
                 //& IS_IDX(exitBattuta_DX) != 1
                 & mdf_SbordoApDx_Ctrl_Sx >= 1
                 )
                 {
                  // < 60 perchè devo comunque stare attento che la cerniera ci stia
                  // Potrebbe essere un problema sulle Libro se da una parte ho lo sbordo e nell' altra anta no
                  // con le CerAngLib che sarebbero sfalsate. In quel caso sarebbe da fare una nuova RegFacc
                  // per le CerAngLib
                  if (mdf_SbordoYSup_Sx >= 25 & mdf_SbordoYSup_Sx < 60)
                     {
                      mdf_Sbordo_Ctrl_Sx = 3
                      malty_Sc = VAR_VAL(PADRE(exitBattuta_SX, -1), "alto_0.y")
                      mdfaltyfro = VAR_VAL(idx_att, "alto_0.y")
                      if (mdfaltyfro+20 > malty_Sc)
                         { mdf_SbordoYSup_Sx = 0 }
                     }
                 }
             }

         // 11.09.2018
          if ( IS_MATCH(NOME(exitBattuta_SX), "Div*")
             // 13.05.2022
             | IS_MATCH(NOME(exitBattuta_SX), "*AngPan*")
            // 27.06.2023 Sc1054754
             | mdf_Sbordo_Ctrl_Sx > 0
             )
             {
              mdf_ctrl_sbDiv_SX = 0
              if ( IS_MATCH(MdF_Apertura, "D*") == 1
                 | IS_MATCH(NOME(exitBattuta_SX), "*AngPan*")
                // 25.10.2023 PK00003
                 | IS_MATCH(MdF_Apertura, "") == 1
                 | IS_MATCH(MdF_Apertura, "ES*") == 1
                // 23.02.2024 PK2024TLS111118_12 Base 2Ante Sinistre perchè quella piu a destra Sborda verso destra
                // e non avendo trovato il Fianco Dx di Battuta sbaglia gli sbordi
                 | IS_MATCH(MdF_Apertura, "S*") == 1
                 )
                 {
                  if (IS_MATCH(NOME(PADRE(exitBattuta_SX, 1)), "VanoPorta*") )
                     {
                      // 09.06.2021
                      //mdfxfro = VAR_VAL(idx_att, "X")
                      //if (mdfxfro+100 < VAR_VAL(PADRE(exitBattuta_SX, 2), "X") )
                      //   {
                      //    mdf_SbordoYSup_Sx = 0
                      //   }
                      mdf_ctrl_sbDiv_SX = 1
                     }
                 // 06.11.2019 H19046702 faccio controllo piu generico DivisorioVerticale
                  mdfxfro = VAR_VAL(idx_att, "X")
                  // 12.12.2023 Sn121201 da 130 a 99
                  if (mdfxfro+99 < VAR_VAL(PADRE(exitBattuta_SX, 2), "X") )
                     { mdf_ctrl_sbDiv_SX = 2 }

                 // 14.06.2024 Come Dx
                  mdf_X_pdr2fro = VAR_VAL(PADRE(idx_att, 2), "X")
                  if (mdf_Sbordo_Ctrl_Sx > 0)
                     {
                      if (mdfxfro+150 < mdf_X_pdr2fro)  { mdf_ctrl_sbDiv_SX = 3 }
                     }
                 }

              if (mdf_ctrl_sbDiv_SX > 0)
                 {
                  mdfyfro    = VAR_VAL(idx_att, "Y")
                  mdfbasyfro = VAR_VAL(idx_att, "base_0.y")
                  mdfaltyfro = VAR_VAL(idx_att, "alto_0.y")
                  mdfydiv    = VAR_VAL(exitBattuta_SX, "Y")
                  mdfbasydiv = VAR_VAL(exitBattuta_SX, "base_0.y")
                 // 13.05.2022
                  //if (mdfbasydiv-15 > mdfbasyfro)
                  if (mdfbasydiv-11 > mdfbasyfro)
                     {
                      // 23.02.2024
                      COMPONENTI2("mdf_find_Cop", PADRE(exitBattuta_SX, -1), "*Cop*")
                      if (mdf_find_Cop == 0)  { COMPONENTI2("mdf_find_Cop", PADRE(exitBattuta_SX, -1), "Fusto*") }
                      miSSC = 1
                      alty_Div_ToCtrl = VAR_VAL(exitBattuta_SX, "alto_0.y")
                      alty_Div_OK = 0
                      while (miSSC <= mdf_find_Cop)
                         {
                          alty_Ele = VAR_VAL(mdf_find_Cop[miSSC], "alto_0.y")
                          if ( alty_Ele + 3 > alty_Div_ToCtrl
                             & alty_Ele - 3 < alty_Div_ToCtrl
                             )
                             {
                              // Per ora solo Basi, perchè Coperchio scorrevole potrebbe essere piu in basso
                              if (alty_Div_ToCtrl < 1000)
                                 { alty_Div_OK = 1 }
                             }

                          miSSC = miSSC+1
                         }

                      if (mdfydiv+60 < mdfyfro)
                         {
                          mdf_SbordoYSup_Sx = 0
                          mdf_SbordoYSup_Sx_Case = 1
                         }
                     // 13.07.2022 Sn22071301 montante unico e doppia anta
                      if ( mdfydiv-280 > mdfyfro
                         & mdfbasydiv-1 > mdfbasyfro
                         & mdfbasydiv-20 < mdfbasyfro
                         )
                         {
                          mdf_SbordoYInf_Sx = 0
                         }
                    // 13.05.2022 Sn Montantte AnP
                      if ( mdfydiv+20 < mdfyfro
                         // 13.07.2022 Sn Alzando l'anta di 30mm la cerniera sotto si sposta di 19mm più in alto
                         //& mdfydiv+90 > mdfyfro
                         & mdfydiv+100 > mdfyfro
                         )
                         {
                          // 23.02.2024
                          mdf_SbordoYSup_Sx_Case = mdf_SbordoYSup_Sx
                          if (alty_Div_OK == 0)  { mdf_SbordoYSup_Sx = 0 }

                          mdf_SbordoYInf_Sx = 0
                         }
                     }
                 // 12.01.2023 Sn011201
                  if (mdf_SbordoYSup_Sx < 25)
                     {
                      if (IS_MATCH(NOME(exitBattuta_SX), "*AngPan*") )
                         {
                          mdfaltyfro = VAR_VAL(idx_att, "alto_0.y")
                          mdfaltydiv = VAR_VAL(exitBattuta_SX, "alto_0.y")
                          if (mdfaltydiv+20 > mdfaltyfro)
                             {
                              mdf_SbordoYSup_Sx = 0
                             }
                         }
                     // 31.05.2023 Come Inf
                      if ( IS_MATCH(NOME(exitBattuta_SX), "*AngPan*")
                         | PADRE(exitBattuta_SX, -1) == PADRE(idx_att, -1)
                         )
                         {
                          COMPONENTI2("mdf_find_Cop", PADRE(exitBattuta_SX, -1), "*Cop*")
                         // 23.02.2024
                          if (mdf_find_Cop == 0)  { COMPONENTI2("mdf_find_Cop", PADRE(exitBattuta_SX, -1), "Fusto*") }
                          miSSC = 1
                          while (miSSC <= mdf_find_Cop)
                             {
                              alty_Ele = VAR_VAL(mdf_find_Cop[miSSC], "alto_0.y")
                              if ( alty_Ele + 3 > mdfaltyfro
                                 & alty_Ele - 3 < mdfaltyfro
                                 )
                                 {
                                  mdf_SbordoYSup_Sx_ANP_err = mdf_SbordoYSup_Sx
                                  mdf_SbordoYSup_Sx = 0
                                 }
                              miSSC = miSSC+1
                             }
                         }
                     }
                 // 31.05.2023 Come dx
                  if (mdf_SbordoYInf_Sx < 25)
                     {
                      if ( IS_MATCH(NOME(exitBattuta_SX), "*AngPan*")
                         | PADRE(exitBattuta_SX, -1) == PADRE(idx_att, -1)
                         // 14.06.2024
                         | mdf_ctrl_sbDiv_SX == 3
                         )
                         {
                          COMPONENTI2("mdf_find_Fondo", PADRE(exitBattuta_SX, -1), "*Fon*")
                          miSIF = 1
                          while (miSIF <= mdf_find_Fondo)
                             {
                              basy_SIFon = VAR_VAL(mdf_find_Fondo[miSIF], "base_0.y")
                              if ( basy_SIFon+3 > mdfbasyfro
                                 & basy_SIFon-3 < mdfbasyfro
                                 )
                                 {
                                  mdf_SbordoYInf_Sx_ANP_err = mdf_SbordoYInf_Sx
                                  mdf_SbordoYInf_Sx = 0
                                 }
                              miSIF = miSIF+1
                             }
                          // 14.06.2024 Come Dx
                          if (mdf_ctrl_sbDiv_SX == 3)
                             {
                              BOX_MODE(0)
                              if (mdf_find_Fondo == 0)  { NEAR_GLOBALE("mdf_find_Fondo", idx_att, 3.2, 1, "*Top*") }
                              if (mdf_find_Fondo == 0)  { NEAR_GLOBALE("mdf_find_Fondo", idx_att, 3.2, 1, "*Rip*") }
                              miSIF = 1
                              while (miSIF <= mdf_find_Fondo)
                                 {
                                  basy_SIFon = VAR_VAL(mdf_find_Fondo[miSIF], "base_0.y")
                                  y_SIFon = VAR_VAL(mdf_find_Fondo[miSIF], "Y")
                                  if ( basy_SIFon+y_SIFon/2+0.6 > mdfbasyfro
                                     & basy_SIFon-y_SIFon/2+0.6 < mdfbasyfro
                                     )
                                     {
                                      mdf_SbordoYInf_Sx_Spa2A_err = mdf_SbordoYInf_Sx
                                      mdf_SbordoYInf_Sx = 0
                                     }
                                  miSIF = miSIF+1
                                 }
                             }
                         }
                     }
                 }
             }

          if (IS_IDX(mdf_doppio_fiaSx_inY) )
             {
              // 16.12.2016
              // Non puo essere uno sbordo valido, significa che c'è un anta Sciolta tra 2 fianchi di altre Scocche
              // Puo essere che non entra nell' if successiva perché magari ci sono 3 fianchi
              if (mdf_diff_altalt_Sx > Y/3 + Y/9)
                 {
                 // 15.06.2022 per debug
                  mdf_SbordoYSup_Sx_NotValid = mdf_SbordoYSup_Sx
                  mdf_SbordoYSup_Sx_Y3Y9 = Y/3 + Y/9

                  mdf_SbordoYSup_Sx = 0
                 }

              mdf_alty_FiaSx_2 = VAR_VAL(mdf_doppio_fiaSx_inY, "alto_0.y")
              mdf_basy_FiaSx_2 = VAR_VAL(mdf_doppio_fiaSx_inY, "base_0.y")
              if (mdf_basy_FiaSx_2-10 < mdf_alty_FiaSx  &  mdf_basy_FiaSx_2+10 > mdf_alty_FiaSx)
                 {
                  mdf_Y_FiaSx_2 = VAR_VAL(mdf_doppio_fiaSx_inY, "Y")
                  if (mdf_Y_FiaSx_2 > mdf_SbordoYSup_Sx)
                     {
                      mdf_SbordoYSup_Sx = 0
                     }
                 }
             }
         // 30.01.2019
          if (IS_IDX(mdf_doppio_fiaSx_inY_Battuta_X) )
             {
              mdf_alty_FiaSx_2 = VAR_VAL(mdf_doppio_fiaSx_inY_alto, "alto_0.y")
              mdf_diff_altalt_Sx = alto_0.y - mdf_alty_FiaSx_2
              mdf_SbordoYSup_Sx = 0
              if (mdf_diff_altalt_Sx > mdf_LimY_Con_Sbordo)
                 {
                  mdf_SbordoYSup_Sx = mdf_diff_altalt_Sx
                 }

              mdf_basy_FiaSx_2 = VAR_VAL(mdf_doppio_fiaSx_inY_basso, "base_0.y")
              mdf_diff_basbas_Sx = mdf_basy_FiaSx_2 - base_0.y
              mdf_SbordoYInf_Sx = 0
              if ( mdf_diff_basbas_Sx > mdf_LimY_Con_Sbordo
                 // 30.10.2023 Sn014485 solo commento, in realtà lo sweep Geometria_Fia rompeva le scatole. Potrebbe servir per sicurezza, ma se non è mai servito per ora lo lascio commentato
                 //& mdf_diff_basbas_Sx <= Y/3 + Y/9
                 )
                 {
                  mdf_SbordoYInf_Sx = mdf_diff_basbas_Sx
                 }
             // 13.05.2022
              if (IS_MATCH(NOME(exitBattuta_SX), "*AngPan*") )
                 {
                  if (mdf_SbordoYInf_Sx < 20)  { mdf_SbordoYInf_Sx = 0 }
                 }
             }
         }

      // Calcolo Battuta a destra
      iX = 1
      SORT_POINT(base_2, "Fianchi_vic", "base_2")
      fiancoDx_prec = -1
      while (iX <= Fianchi_vic  &  exitBattuta_DX == -1)
         {
          // 13.05.2020
          // 20.03.2025 spsotata su procedura
          mdf_Ingom_fia = 0
          GOSUB MdF_Ingom_Fia

         // 04.12.2020 1020105054, 10031601
          // Se sono un ANP quindi ABS(MdF_angoloBas) 90 ma il FrontaleFisso si chiama FiancoDivisorio
          // viene trovato come possibile fianco destro anche se poi giustamente non fa la Battuta_X su questo
          // pero avendo trovato la Battuta_X sul Fia sinistro mi imposterebbe lo stesso la Battuta_X
          // perche forse ingiustamente mdf_Battuta_X non la azzero mai
          if (IS_MATCH(MdF_Apertura, "D*") == 1)
             {
              if (ABS(VAR_VAL(idx_att, "MdF_angoloBas")) == 90)
                 { mdf_Battuta_X = 0 }
             }

          // Se per caso intercetta MdF_FerramentaSuFianco
          if ( IS_MATCH(NOME(Fianchi_vic[iX]), "MdF_Ferr*") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "MdF_*Fianco") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "MdF_Sat*Fia*") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "_cont_collide*Fia*") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "_cont_collide*Div*") != 1
             // 08.11.2019
             & IS_MATCH(NOME(Fianchi_vic[iX]), "*Fia*collide*") != 1
             // 13.05.2020
             & mdf_Ingom_fia == 0
             )
             {
              fia_Sx = 0
              fia_Dx = 0
              SET_#(Fianchi_vic[iX])
              //DISPLAY2(STRCAT("MdF_while_X MdF_get_Battuta_DX Fianchi_vic[iX]=", STR(Fianchi_vic[iX]), " idx_att=", STR(idx_att)))

              idx_FiaDx_Ctrl_att = Fianchi_vic[iX]
              GOSUB MdF_get_Battuta_DX
              //DISPLAY2(STRCAT("MdF_while_X DOPO MdF_get_Battuta_DX Fianchi_vic[iX]=", STR(Fianchi_vic[iX]), " idx_att=", STR(idx_att)))
              // Se ho gia calcolato la Battuta sinistra però magari non è corretta
              // comunque qua entro solo se trovo fianchi destri
              if (fia_Dx == 1  |  fia_Sx == 0)
                 {
                  if ( IS_MATCH(MdF_Apertura, "D*") == 1
                     & mdf_Battuta_X != 0
                     )
                     { Battuta_X = mdf_Battuta_X }
                  Battuta_DX = mdf_Battuta_DX
                  if (VAR_EXIST(idx_att, "mdf_Battuta_X_Dx") )
                     { Battuta_X_Dx = mdf_Battuta_X_Dx }
                 }
             }
          iX = iX+1
         }
      if (Battuta_DX != 0)
         {
          if ( VAR_EXIST(idx_att, "fiaBatDx")
             & IS_IDX(VAR_VAL(idx_att, "fiaBatDx") )
             )
             {
              exitBattuta_DX = VAR_VAL(idx_att, "fiaBatDx")
              DEL_VAR(idx_att, "fiaBatDx")
             }
         }

      if (IS_IDX(exitBattuta_DX) )
         {
         // 04.09.2024 EM2024004901 La prima volta per forza non c'è exitBattuta_DX perchè deve ancora farla
          if (VAR_EXIST(idx_att, "mdf_Battuta_X_SX_Pro_Cn_preDX") )
             {
              mdf_Battuta_X_SX_Pro_Cn = mdf_Battuta_X_SX_Pro_Cn_preDX
             }

          mdf_alty_FiaDx = VAR_VAL(exitBattuta_DX, "alto_0.y")
          mdf_basy_FiaDx = VAR_VAL(exitBattuta_DX, "base_0.y")

         // 12.05.2022 Colonna ANP che sborda in Y trova prima il Fia che sta sopra, poi trova mdF_archetipo_Fia_2 MontanteColAngPan
          if (mdf_ctrl_Fia_2 == 1)
             {
              if ( mdf_doppio_fiaDx_inY_basso != -1
                 & mdf_doppio_fiaDx_inY_alto != -1
                 & mdf_doppio_fiaDx_inY_Battuta_X == -1
                 )
                 {
                  mdf_fiaDx_BattutaDX_att_b0_t = VAR_VAL(exitBattuta_DX, "base_0.y")
                  mdf_fiaDx_BattutaDX_att_a0_t = VAR_VAL(exitBattuta_DX, "alto_0.y")
                  mdf_fiaDx_BattutaDX_att_Y    = VAR_VAL(exitBattuta_DX, "Y")
                  mdf_fiaDx_basso_att_b0_t     = VAR_VAL(mdf_doppio_fiaDx_inY_basso, "base_0.y")
                  mdf_fiaDx_alto_att_b0_t      = VAR_VAL(mdf_doppio_fiaDx_inY_alto, "base_0.y")
                  mdf_fiaDx_alto_att_Y         = VAR_VAL(mdf_doppio_fiaDx_inY_alto, "Y")
                  if ( mdf_fiaDx_BattutaDX_att_b0_t+200 < mdf_fiaDx_basso_att_b0_t
                     // se sopra pensile devo considerare Coperchio mio e Fondo sopraPensile
                     & mdf_fiaDx_BattutaDX_att_a0_t+45 > mdf_fiaDx_alto_att_b0_t
                     & mdf_fiaDx_BattutaDX_att_a0_t < mdf_fiaDx_alto_att_b0_t
                     )
                     {
                      if (mdf_fiaDx_BattutaDX_att_Y+mdf_fiaDx_alto_att_Y > 3*y_Fro/4)
                         {
                          mdf_doppio_fiaDx_inY_basso = exitBattuta_DX
                          mdf_doppio_fiaDx_inY_Battuta_X = mdf_doppio_fiaDx_inY_alto
                         // 13.05.2022
                          if ( mdf_doppio_fiaDx_Battuta_X > 5
                             & mdf_doppio_fiaDx_Battuta_X > Battuta_X
                             & mdf_doppio_fiaDx_Battuta_X - Battuta_X < 1.5
                             )
                             { Battuta_X = mdf_doppio_fiaDx_Battuta_X }
                         }
                     }
                 }
             }

          mdf_diff_altalt_Dx = alto_0.y - mdf_alty_FiaDx
          if (mdf_diff_altalt_Dx > mdf_LimY_Con_Sbordo)
             {
              // 03.10.2017
              // come su MdF_while_X_Gen
              //mdf_SbordoYSup_Dx = mdf_diff_altalt_Dx

              // 18.01.2024 A011802 Essendo il primo caso di sempre posso limitarlo; in piu graficamente va a filo
              // in X all' anta del pensile vicino quindi molto improbabile
              // Comunque l' anta è stata sbordata in X di 20mm rispetto alla scocca
              mdf_Ctrl_SbordoSup_Dx = 0
              if (Battuta_X_Dx < 0 & ABS(Battuta_X_Dx) < 2)  { mdf_Ctrl_SbordoSup_Dx = 1 }

              if ( ABS(Battuta_X_Dx) < 2  &  Fianchi_vic >= 3
                 & VAR_VAL(idx_att, "X") > VAR_VAL(PADRE(idx_att, 2), "X")
                 & VAR_VAL(idx_att, "X")-30 < VAR_VAL(PADRE(idx_att, 2), "X")
                 )
                 { mdf_Ctrl_SbordoSup_Dx = 2 }

              //if (Battuta_X_Dx < 0 & ABS(Battuta_X_Dx) < 2)
              if (mdf_Ctrl_SbordoSup_Dx > 0)
                 {
                  if (mdf_diff_altalt_Dx <= Y/3 + Y/9)
                     { mdf_SbordoYSup_Dx = mdf_diff_altalt_Dx }
                 }
              else
                 {
                 // 22.12.2021 SC1021134778 StrutBaseFrigo con fiaDx soggiorno
                  mdivsbsup = 3
                 // 29.11.2022 EM1053762
                  if (Y > 900  &  Y < 1100  & mdf_diff_altalt_Dx > Y/2+35)
                     {
                      // base_0_offset.y -511
                      mdf_sbSup_bas0_offy = VAR_VAL(PADRE(idx_att, 1), "base_0_offset.y")
                      mdivsbsup = -45
                     }
                  if (Y < 750  &  Battuta_X_Dx <= 0)  { mdivsbsup = -45 }
                 // 27.01.2025 PK2024TLS111116 Frontalino che sporge sopra
                  if (Y < 119)  { mdivsbsup = 5 }

                  mdf_SbordoYSup_Dx_Y2Y19 = Y/2 + Y/19+mdivsbsup
                  if (mdf_diff_altalt_Dx <= Y/2 + Y/19+mdivsbsup)
                     { mdf_SbordoYSup_Dx = mdf_diff_altalt_Dx }

                 // 23.01.2023 H19037315
                  if ( IS_MATCH(NOME(exitBattuta_DX), "*Div*")
                     & mdf_SbordoYSup_Dx > 0
                     )
                     {
                      alty_Div = VAR_VAL(exitBattuta_DX, "alto_0.y")
                      alty_pdr_Div = VAR_VAL(PADRE(exitBattuta_DX, 2), "alto_0.y")
                      mdf_diff_altDiv_pdr = alty_pdr_Div - alty_Div
                      if ( mdf_diff_altDiv_pdr < 35
                         & mdf_diff_altDiv_pdr > 3
                         )
                         { mdf_SbordoYSup_Dx = mdf_SbordoYSup_Dx -mdf_diff_altDiv_pdr }
                     }
                 }
             // 30.11.2023 Ce07622
              if (IS_MATCH(MdF_Apertura, "S*") == 1)
                 {
                  // Ho il doppio fianco di Battuta solo a sisnitra perchè la scocca sopra e' piu larga e le 2 ante sotto sbordano per coprirla
                  if ( IS_IDX(mdf_doppio_fiaSx_inY_Battuta_X)
                     & IS_IDX(mdf_doppio_fiaDx_inY_Battuta_X) != 1
                     )
                     {
                      mdf_SbordoYSup_Dx_CtrlDoppioSx = mdf_SbordoYSup_Dx
                      if (mdf_SbordoYSup_Sx == 0)
                         {
                          if (mdf_SbordoYSup_Dx > 0)  { mdf_SbordoYSup_Dx = 0 }
                         }
                     }
                 }
             }

          mdf_diff_basbas_Dx = mdf_basy_FiaDx - base_0.y
          if (mdf_diff_basbas_Dx > mdf_LimY_Con_Sbordo)
             {
              // 03.10.2017
              if (Battuta_X_Dx < 0 & ABS(Battuta_X_Dx) < 2)
                 {
                  if (mdf_diff_basbas_Dx <= Y/3 + Y/9)
                     { mdf_SbordoYInf_Dx = mdf_diff_basbas_Dx }
                 }
              else
                 {
                  if (mdf_diff_basbas_Dx <= Y/2 + Y/19+3)
                     { mdf_SbordoYInf_Dx = mdf_diff_basbas_Dx }
                 }
             }

         // 27.06.2023 Sc1054754
          mdf_Sbordo_Ctrl_Dx = 0
          if (mdf_SbordoYInf_Dx > 2 & mdf_SbordoYInf_Dx < 25)  { mdf_Sbordo_Ctrl_Dx = 1 }
          if (mdf_SbordoYSup_Dx > 2 & mdf_SbordoYSup_Dx < 25)  { mdf_Sbordo_Ctrl_Dx = 2 }

         // 16.11.2023 ScBROWSER2001945 Fia ridotto in Y per scasso o passaggio cavi?
          if (PADRE(exitBattuta_DX, -1) == PADRE(idx_att, -1) )
             {
              // 18.11.2024 Sc1056945
              // Se ho gia il FiancoSX qui non entro, mentre nella parte SX ci entra perchè il fianco di Battuta destra lo trova dopo
              // In questo ordine c' erano sia Apertura SX errata che Apertura DX corretta
              // altrimenti va aggiunto dove serve MdF_ Ctrl_Sbordo_FiaLatoCer=1 su VariabiliMdF.txt
              mdf_SbordoApSx_Ctrl_Dx = 0
              if (IS_IDX(exitBattuta_SX) != 1)  { mdf_SbordoSx_Ctrl_Dx = 1 }
              else
                 {
                  if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "SX*") )
                     { mdf_SbordoApSx_Ctrl_Dx = 2 }
                 }

              if ( VAR_VAL(exitBattuta_DX, "Y") + 50  < VAR_VAL(PADRE(exitBattuta_DX, -1), "Y")
                 // Per ora limito cosi. caso ANGL
                 // 18.11.2024
                 //& IS_IDX(exitBattuta_SX) != 1
                 & mdf_SbordoApSx_Ctrl_Dx >= 1
                 )
                 {
                  // < 60 perchè devo comunque stare attento che la cerniera ci stia
                  // Potrebbe essere un problema sulle Libro se da una parte ho lo sbordo e nell' altra anta no
                  // con le CerAngLib che sarebbero sfalsate. In quel caso sarebbe da fare una nuova RegFacc
                  // per le CerAngLib
                  if (mdf_SbordoYSup_Dx >= 25 & mdf_SbordoYSup_Dx < 60)
                     {
                      mdf_Sbordo_Ctrl_Dx = 3
                      malty_Sc = VAR_VAL(PADRE(exitBattuta_DX, -1), "alto_0.y")
                      mdfaltyfro = VAR_VAL(idx_att, "alto_0.y")
                      if (mdfaltyfro+20 > malty_Sc)
                         { mdf_SbordoYSup_Dx = 0 }
                     }
                 }
             }

         // 11.09.2018
          if ( IS_MATCH(NOME(exitBattuta_DX), "Div*")
             // 13.05.2022
             | IS_MATCH(NOME(exitBattuta_DX), "*AngPan*")
            // 27.06.2023 Sc1054754
             | mdf_Sbordo_Ctrl_Dx > 0
             )
             {
              mdf_ctrl_sbDiv_DX = 0
              if ( IS_MATCH(MdF_Apertura, "S*") == 1
                 | IS_MATCH(NOME(exitBattuta_DX), "*AngPan*")
                // 25.10.2023 PK00003
                 | IS_MATCH(MdF_Apertura, "ES*") == 1
                 | IS_MATCH(MdF_Apertura, "") == 1
                // 23.02.2024 Come Sx
                 | IS_MATCH(MdF_Apertura, "D*") == 1
                 )
                 {
                  if (IS_MATCH(NOME(PADRE(exitBattuta_DX, 1)), "VanoPorta*") )  { mdf_ctrl_sbDiv_DX = 1 }

                  mdfxfro = VAR_VAL(idx_att, "X")
                  // 12.12.2023 Sn121201
                  //if (mdfxfro+130 < VAR_VAL(PADRE(exitBattuta_DX, 2), "X") )
                  if (mdfxfro+99 < VAR_VAL(PADRE(exitBattuta_DX, 2), "X") )
                     { mdf_ctrl_sbDiv_DX = 2 }

                 // 14.06.2024 Sc1056248 Spalla, quindi fianco solitario, ma graficamente come se fosse un pensile 2Ante
                  mdf_X_pdr2fro = VAR_VAL(PADRE(idx_att, 2), "X")
                  if (mdf_Sbordo_Ctrl_Dx > 0)
                     {
                      if (mdfxfro+150 < mdf_X_pdr2fro)  { mdf_ctrl_sbDiv_DX = 3 }
                     }
                 }

              if (mdf_ctrl_sbDiv_DX > 0)
                 {
                  mdfyfro    = VAR_VAL(idx_att, "Y")
                  mdfbasyfro = VAR_VAL(idx_att, "base_0.y")
                  mdfaltyfro = VAR_VAL(idx_att, "alto_0.y")
                  mdfydiv    = VAR_VAL(exitBattuta_DX, "Y")
                  mdfbasydiv = VAR_VAL(exitBattuta_DX, "base_0.y")
                 // 13.05.2022
                  //if (mdfbasydiv-15 > mdfbasyfro)
                  if (mdfbasydiv-11 > mdfbasyfro)
                     {
                      // 23.02.2024
                      COMPONENTI2("mdf_find_Cop", PADRE(exitBattuta_DX, -1), "*Cop*")
                      if (mdf_find_Cop == 0)  { COMPONENTI2("mdf_find_Cop", PADRE(exitBattuta_DX, -1), "Fusto*") }
                      miSSC = 1
                      alty_Div_ToCtrl = VAR_VAL(exitBattuta_DX, "alto_0.y")
                      alty_Div_OK = 0
                      while (miSSC <= mdf_find_Cop)
                         {
                          alty_Ele = VAR_VAL(mdf_find_Cop[miSSC], "alto_0.y")
                          if ( alty_Ele + 3 > alty_Div_ToCtrl
                             & alty_Ele - 3 < alty_Div_ToCtrl
                             )
                             {
                              // Per ora solo Basi, perchè Coperchio scorrevole potrebbe essere piu in basso
                              if (alty_Div_ToCtrl < 1000)
                                 { alty_Div_OK = 1 }
                             }

                          miSSC = miSSC+1
                         }

                      if (mdfydiv+60 < mdfyfro)
                         {
                          mdf_SbordoYSup_Dx = 0
                         }
                     // 13.07.2022 Sn22071301 montante unico e doppia anta
                      if ( mdfydiv-280 > mdfyfro
                         & mdfbasydiv-1 > mdfbasyfro
                         & mdfbasydiv-20 < mdfbasyfro
                         )
                         {
                          mdf_SbordoYInf_Dx = 0
                         }
                    // 13.05.2022 Sn Montantte AnP
                      if ( mdfydiv+20 < mdfyfro
                         // 13.07.2022 Sn Alzando l'anta di 30mm la cerniera sotto si sposta di 19mm più in alto
                         //& mdfydiv+90 > mdfyfro
                         & mdfydiv+100 > mdfyfro
                         )
                         {
                          // 23.02.2024 come Sx
                          if (alty_Div_OK == 0)  { mdf_SbordoYSup_Dx = 0 }

                          mdf_SbordoYInf_Dx = 0
                         }
                     }
                 // 12.01.2023
                  if (mdf_SbordoYSup_Dx < 25)
                     {
                      if (IS_MATCH(NOME(exitBattuta_DX), "*AngPan*") )
                         {
                          mdfaltyfro = VAR_VAL(idx_att, "alto_0.y")
                          mdfaltydiv = VAR_VAL(exitBattuta_DX, "alto_0.y")
                          if (mdfaltydiv+20 > mdfaltyfro)
                             {
                              mdf_SbordoYSup_Dx = 0
                             }
                         }
                     // 31.05.2023 Come Inf
                      if ( IS_MATCH(NOME(exitBattuta_DX), "*AngPan*")
                         | PADRE(exitBattuta_DX, -1) == PADRE(idx_att, -1)
                         )
                         {
                          COMPONENTI2("mdf_find_Cop", PADRE(exitBattuta_DX, -1), "*Cop*")
                          miSSC = 1
                          while (miSSC <= mdf_find_Cop)
                             {
                              alty_Ele = VAR_VAL(mdf_find_Cop[miSSC], "alto_0.y")
                              if ( alty_Ele + 3 > mdfaltyfro
                                 & alty_Ele - 3 < mdfaltyfro
                                 )
                                 {
                                  mdf_SbordoYSup_Dx_ANP_err = mdf_SbordoYSup_Dx
                                  mdf_SbordoYSup_Dx = 0
                                 }
                              miSSC = miSSC+1
                             }
                         }
                     }
                 // 31.05.2023 Sn006046
                  if (mdf_SbordoYInf_Dx < 25)
                     {
                      if ( IS_MATCH(NOME(exitBattuta_DX), "*AngPan*")
                         | PADRE(exitBattuta_DX, -1) == PADRE(idx_att, -1)
                         // 14.06.2024
                         | mdf_ctrl_sbDiv_DX == 3
                         )
                         {
                          COMPONENTI2("mdf_find_Fondo", PADRE(exitBattuta_DX, -1), "*Fon*")
                          miSIF = 1
                          while (miSIF <= mdf_find_Fondo)
                             {
                              basy_SIFon = VAR_VAL(mdf_find_Fondo[miSIF], "base_0.y")
                              if ( basy_SIFon+3 > mdfbasyfro
                                 & basy_SIFon-3 < mdfbasyfro
                                 )
                                 {
                                  mdf_SbordoYInf_Dx_ANP_err = mdf_SbordoYInf_Dx
                                  mdf_SbordoYInf_Dx = 0
                                 }
                              miSIF = miSIF+1
                             }
                          // 14.06.2024 Sc1056248 Spalla, quindi fianco solitario, ma graficamente come se fosse un pensile 2Ante
                          if (mdf_ctrl_sbDiv_DX == 3)
                             {
                              BOX_MODE(0)
                              if (mdf_find_Fondo == 0)  { NEAR_GLOBALE("mdf_find_Fondo", idx_att, 3.2, 1, "*Top*") }
                              if (mdf_find_Fondo == 0)  { NEAR_GLOBALE("mdf_find_Fondo", idx_att, 3.2, 1, "*Rip*") }
                              miSIF = 1
                              while (miSIF <= mdf_find_Fondo)
                                 {
                                  basy_SIFon = VAR_VAL(mdf_find_Fondo[miSIF], "base_0.y")
                                  y_SIFon = VAR_VAL(mdf_find_Fondo[miSIF], "Y")
                                  if ( basy_SIFon+y_SIFon/2+0.6 > mdfbasyfro
                                     & basy_SIFon-y_SIFon/2+0.6 < mdfbasyfro
                                     )
                                     {
                                      mdf_SbordoYInf_Dx_Spa2A_err = mdf_SbordoYInf_Dx
                                      mdf_SbordoYInf_Dx = 0
                                     }
                                  miSIF = miSIF+1
                                 }
                             }
                         }
                     }
                 }
             }

          if (IS_IDX(mdf_doppio_fiaDx_inY) )
             {
              mdf_alty_FiaDx_2 = VAR_VAL(mdf_doppio_fiaDx_inY, "alto_0.y")
              mdf_basy_FiaDx_2 = VAR_VAL(mdf_doppio_fiaDx_inY, "base_0.y")
              if (mdf_basy_FiaDx_2-10 < mdf_alty_FiaDx  &  mdf_basy_FiaDx_2+10 > mdf_alty_FiaDx)
                 {
                  mdf_Y_FiaDx_2 = VAR_VAL(mdf_doppio_fiaDx_inY, "Y")
                  if (mdf_Y_FiaDx_2 > mdf_SbordoYSup_Dx)
                     {
                      mdf_SbordoYSup_Dx = 0
                     }
                 }
             }
         // 30.01.2019
          if (IS_IDX(mdf_doppio_fiaDx_inY_Battuta_X) )
             {
              mdf_alty_FiaDx_2 = VAR_VAL(mdf_doppio_fiaDx_inY_alto, "alto_0.y")
              mdf_diff_altalt_Dx = alto_0.y - mdf_alty_FiaDx_2
              mdf_SbordoYSup_Dx = 0
              if (mdf_diff_altalt_Dx > mdf_LimY_Con_Sbordo)
                 {
                  mdf_SbordoYSup_Dx = mdf_diff_altalt_Dx
                 }

              mdf_basy_FiaDx_2 = VAR_VAL(mdf_doppio_fiaDx_inY_basso, "base_0.y")
              mdf_diff_basbas_Dx = mdf_basy_FiaDx_2 - base_0.y
              mdf_SbordoYInf_Dx = 0
              if (mdf_diff_basbas_Dx > mdf_LimY_Con_Sbordo)
                 {
                  mdf_SbordoYInf_Dx = mdf_diff_basbas_Dx
                 }
             // 13.05.2022
              if (IS_MATCH(NOME(exitBattuta_DX), "*AngPan*") )
                 {
                  if (mdf_SbordoYInf_Dx < 20)  { mdf_SbordoYInf_Dx = 0 }
                 }
             // 30.11.2023 Ce07622
              if (IS_MATCH(MdF_Apertura, "D*") == 1)
                 {
                  mdf_SbordoYSup_Sx_CtrlDoppioDx = mdf_SbordoYSup_Sx
                  // Ho il doppio fianco di Battuta solo a destra perchè la scocca sopra e' piu larga e le 2 ante sotto sbordano per coprirla
                  if ( IS_IDX(mdf_doppio_fiaSx_inY_Battuta_X) != 1
                     & IS_IDX(mdf_doppio_fiaDx_inY_Battuta_X) == 1
                     )
                     {
                      if (mdf_SbordoYSup_Dx == 0)
                         {
                          if (mdf_SbordoYSup_Sx > 0)  { mdf_SbordoYSup_Sx = 0 }
                         }
                     }
                 }
             }
         }
      else
         {
          mdf_ctrl_Dx_Cn = 0
          if (VAR_VAL(idx_att, "mdf_Battuta_DX_Pro") > X_FiaBatDX_Cn)  { mdf_ctrl_Dx_Cn = 1 }
          // 02.02.2024 Sc1052368 Anta Trapezio, exitBattuta_DX -1 ma trova un fianco vicino e imposta mdf_Battuta_DX_Pro però Battuta_DX rimane 0
          if ( VAR_VAL(idx_att, "mdf_Battuta_DX_Pro") < 0.1
             & VAR_VAL(idx_att, "Battuta_DX") == 0
             )
             { mdf_ctrl_Dx_Cn = 2 }

          if ( mdf_ctrl_Dx_Cn > 0
             & VAR_VAL(idx_att, "mdf_Battuta_DX_Pro") < X-X_FiaBatDX_Cn
             & VAR_EXIST(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
             & X_FiaBatDX_Cn > 0
             )
             {
              MdfSys_Battuta_DX_Cn = mdf_Battuta_X_DX_Pro_Cn
              MdfSys_idx_Fia_DX_CnSX = -1
              MdfSys_idx_Fia_DX_CnDX = -1
              if (VAR_EXIST(idx_att, "mdf_idx_FiaBatDX_CnSX") )  { MdfSys_idx_Fia_DX_CnSX = mdf_idx_FiaBatDX_CnSX }
              if (VAR_EXIST(idx_att, "mdf_idx_FiaBatDX_CnDX") )  { MdfSys_idx_Fia_DX_CnDX = mdf_idx_FiaBatDX_CnDX }
             }
         // 15.04.2021 Sn041502
          // Non so se la gestione sopra fosse un refuso o era voluto per non avere Battuta centrale Dx in casi errati
          // Nel caso specifico l' anta sporge in X piu della meta
          if ( VAR_EXIST(idx_att, "mdf_Battuta_DX_Pro") != 1
             & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") > X_FiaBatDX_Cn
             & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") < X-X_FiaBatDX_Cn
            // 04.02.2022 Sn13235
             & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") > X/2-X_FiaBatDX_Cn-X/3
             & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") < X/2+X_FiaBatDX_Cn+X/3
             & VAR_EXIST(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
             // Per ora limito cosi al posto di controllare se IS_IDX(exitBattuta_SX) == 1 perche potrei non avere nemmeno il sinistro, forse.
             & VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") > X/2-X_FiaBatDX_Cn-X/4
             & VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") < X/2+X_FiaBatDX_Cn+X/4
             & X_FiaBatDX_Cn > 0
             )
             {
              MdfSys_Battuta_DX_Cn = mdf_Battuta_X_DX_Pro_Cn
              MdfSys_idx_Fia_DX_CnSX = -1
              MdfSys_idx_Fia_DX_CnDX = -1
              if (VAR_EXIST(idx_att, "mdf_idx_FiaBatDX_CnSX") )  { MdfSys_idx_Fia_DX_CnSX = mdf_idx_FiaBatDX_CnSX }
              if (VAR_EXIST(idx_att, "mdf_idx_FiaBatDX_CnDX") )  { MdfSys_idx_Fia_DX_CnDX = mdf_idx_FiaBatDX_CnDX }
             }
         }

      if (IS_IDX(exitBattuta_SX) != 1)
         {
          // 02.02.2024 come Dx
          mdf_ctrl_Sx_Cn = 0
          if (VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") > X_FiaBatSX_Cn)  { mdf_ctrl_Sx_Cn = 1 }

          if ( VAR_VAL(idx_att, "mdf_Battuta_SX_Pro") < 0.1
             & VAR_VAL(idx_att, "Battuta_SX") == 0
             )
             { mdf_ctrl_Sx_Cn = 2 }

          if ( mdf_ctrl_Sx_Cn > 0
             & VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") < X-X_FiaBatSX_Cn
             & VAR_EXIST(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
             & X_FiaBatSX_Cn > 0
             )
             {
              mdf_Batt_SX_Cn_case = 0.1
              // 05.05.2023 Sn05761 Viste tutte le altre correzioni nei vari mdf_Batt_SX_Cn_case allora anche qui era errato
              //MdfSys_Battuta_SX_Cn = mdf_Battuta_X_SX_Pro_Cn+X_FiaBatSX_Cn
              MdfSys_Battuta_SX_Cn = mdf_Battuta_X_SX_Pro_Cn
              MdfSys_idx_Fia_SX_CnSX = -1
              MdfSys_idx_Fia_SX_CnDX = -1
              if (VAR_EXIST(idx_att, "mdf_idx_FiaBatSX_CnSX") )  { MdfSys_idx_Fia_SX_CnSX = mdf_idx_FiaBatSX_CnSX }
              if (VAR_EXIST(idx_att, "mdf_idx_FiaBatSX_CnDX") )  { MdfSys_idx_Fia_SX_CnDX = mdf_idx_FiaBatSX_CnDX }
             }
         // 05.10.2021 Sn009925 come Dx
          // Non so se la gestione sopra fosse un refuso o era voluto per non avere Battuta centrale Sx in casi errati
          // Nel caso specifico l' anta sporge in X piu della meta
          if ( VAR_EXIST(idx_att, "mdf_Battuta_SX_Pro") != 1
             & VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") > X_FiaBatSX_Cn
             & VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") < X-X_FiaBatSX_Cn
             & VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") > X/2-X_FiaBatSX_Cn-X/4
             & VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") < X/2+X_FiaBatSX_Cn+X/4
             & VAR_EXIST(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
             // Per ora limito cosi al posto di controllare se IS_IDX(exitBattuta_DX) == 1 perche potrei non avere nemmeno il destro, forse.
             & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") > X/2-X_FiaBatSX_Cn-X/4
             & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") < X/2+X_FiaBatSX_Cn+X/4
             & X_FiaBatSX_Cn > 0
             )
             {
              MdfSys_Battuta_SX_Cn_att = VAR_VAL(idx_att, "MdfSys_Battuta_SX_Cn")
              mdf_Battuta_X_SX_Pro_Cn_att = VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
              // 20.02.2023 Sn011287 centrale, in realta quasi centrale Sx 219, Dx 208 X=446 X/2=223
              if ( mdf_Battuta_X_SX_Pro_Cn_att + 15 > X/2
                 // 21.07.2023 Sn009063 centro perfetto Sx 228 e Dx 228, X=446 X/2=223, quindi deve fare mdf_Batt_SX_Cn_case 2
                 //& mdf_Battuta_X_SX_Pro_Cn_att - 15 < X/2
                 & mdf_Battuta_X_SX_Pro_Cn_att < X/2
                 )
                 {
                  mdf_Batt_SX_Cn_case=1
                  MdfSys_Battuta_SX_Cn = mdf_Battuta_X_SX_Pro_Cn
                  MdfSys_idx_Fia_SX_CnSX = -1
                  MdfSys_idx_Fia_SX_CnDX = -1
                  if (VAR_EXIST(idx_att, "mdf_idx_FiaBatSX_CnSX") )  { MdfSys_idx_Fia_SX_CnSX = mdf_idx_FiaBatSX_CnSX }
                  if (VAR_EXIST(idx_att, "mdf_idx_FiaBatSX_CnDX") )  { MdfSys_idx_Fia_SX_CnDX = mdf_idx_FiaBatSX_CnDX }
                 }
              else
                 {
                  mdf_Batt_SX_Cn_case=2
                  // 20.02.2023 Rivisto Sn009925 e VariabiliMdF.txt
                  MdfSys_Battuta_SX_Cn = X-mdf_Battuta_X_SX_Pro_Cn-X_FiaBatSX_Cn
                  MdfSys_idx_Fia_SX_CnSX = -1
                  MdfSys_idx_Fia_SX_CnDX = -1
                  if (VAR_EXIST(idx_att, "mdf_idx_FiaBatSX_CnSX") )  { MdfSys_idx_Fia_SX_CnSX = mdf_idx_FiaBatSX_CnSX }
                  if (VAR_EXIST(idx_att, "mdf_idx_FiaBatSX_CnDX") )  { MdfSys_idx_Fia_SX_CnDX = mdf_idx_FiaBatSX_CnDX }
                 }
             }
         }
     // 08.02.2022 Sn13803 viene sentito un Fianco riempitivo come Battuta SX, quindi Battuta_SX negativa, ma non idonea
      // per i paracolpi e perchè appunto non fa entrare la gestione nella parte Battuta Cn
      if (IS_IDX(exitBattuta_SX) == 1)
         {
          if (mdf_Battuta_SX < 0)
             {
              if ( VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") > X_FiaBatDX_Cn
                 & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") < X-X_FiaBatDX_Cn
                 & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") > X/2-X_FiaBatDX_Cn-X/3
                 & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") < X/2+X_FiaBatDX_Cn+X/3
                 & VAR_EXIST(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
                 & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") < VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
                 & VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") > X/2-X_FiaBatDX_Cn-X/3
                 & VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") < X/2+X_FiaBatDX_Cn+X/3
                 & X_FiaBatDX_Cn > 0
                 )
                 {
                  // 21.02.2023 rivisto Sn20901 e VariabiliMdF. Vedi anche Sn011287 centrale
                  mdf_Batt_SX_Cn_case = 3
                  //MdfSys_Battuta_SX_Cn = mdf_Battuta_X_SX_Pro_Cn+X_FiaBatDX_Cn
                  MdfSys_Battuta_SX_Cn = mdf_Battuta_X_SX_Pro_Cn
                  MdfSys_idx_Fia_SX_CnSX = -1
                  MdfSys_idx_Fia_SX_CnDX = -1
                  if (VAR_EXIST(idx_att, "mdf_idx_FiaBatSX_CnSX") )  { MdfSys_idx_Fia_SX_CnSX = mdf_idx_FiaBatSX_CnSX }
                  if (VAR_EXIST(idx_att, "mdf_idx_FiaBatSX_CnDX") )  { MdfSys_idx_Fia_SX_CnDX = mdf_idx_FiaBatSX_CnDX }
                 }
             }
         }
     // Come qui sopra per SX
      if (IS_IDX(exitBattuta_DX) == 1)
         {
          if (mdf_Battuta_DX < 0)
             {
              if ( VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") > X_FiaBatSX_Cn
                 & VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") < X-X_FiaBatSX_Cn
                 & VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") > X/2-X_FiaBatSX_Cn-X/3
                 & VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") < X/2+X_FiaBatSX_Cn+X/3
                 & VAR_EXIST(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
                 & VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") < VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
                 & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") > X/2-X_FiaBatSX_Cn-X/3
                 & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") < X/2+X_FiaBatSX_Cn+X/3
                 & X_FiaBatSX_Cn > 0
                 )
                 {
                 // 09.02.2022 Sn020901 ordine di test sx,dx
                  MdfSys_Battuta_DX_Cn = mdf_Battuta_X_DX_Pro_Cn
                  MdfSys_idx_Fia_DX_CnSX = -1
                  MdfSys_idx_Fia_DX_CnDX = -1
                  if (VAR_EXIST(idx_att, "mdf_idx_FiaBatDX_CnSX") )  { MdfSys_idx_Fia_DX_CnSX = mdf_idx_FiaBatDX_CnSX }
                  if (VAR_EXIST(idx_att, "mdf_idx_FiaBatDX_CnDX") )  { MdfSys_idx_Fia_DX_CnDX = mdf_idx_FiaBatDX_CnDX }
                 }
             }
         }

     // 02.11.2016
      if (VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_Scocca") >= 1)
         {
          mdf_Ctrl_Sbordo_Sx_frat = 0
          if (IS_IDX(exitBattuta_SX) != 1  &  IS_IDX(exitBattuta_DX) )
             {
              COMPONENTI2("mdf_find_FiaSx_frat", PADRE(exitBattuta_DX, -1), STRCAT(STRMID(0,3,NOME(exitBattuta_DX)), "*"))
              if (mdf_find_FiaSx_frat <= 1)
                 {
                  mdf_Ctrl_Sbordo_Sx_frat = 1
                  NEAR_GLOBALE("mdf_find_FiaSx_frat", PADRE(idx_att, -1), mdf_distNearBatFia, 1, STRCAT(STRMID(0,3,NOME(exitBattuta_DX)), "*"))
                 }
             }

          mdf_Ctrl_Sbordo_my_pdr = 0
          mdf_alty_CopSc = 0
          mdf_basy_FonSc = 0
          // 22.03.2019
          mdf_prosegui_Ctrl_Scocca_ApSx_FiDx = 1
          mdf_Ctrl_Sbordo_FiaLatoCer = VAR_VAL(PADRE(idx_att, 1), "MdF_Ctrl_Sbordo_FiaLatoCer")
          if (VAR_EXIST(idx_att, "MdF_Ctrl_Sbordo_FiaLatoCer") )  { mdf_Ctrl_Sbordo_FiaLatoCer = VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_FiaLatoCer") }
          if ( mdf_Ctrl_Sbordo_FiaLatoCer > 0
             & IS_MATCH(MdF_Apertura, "S*") == 1
             )
             { mdf_prosegui_Ctrl_Scocca_ApSx_FiDx = 0 }

          if ( IS_IDX(exitBattuta_DX)
             // 22.03.2019
             & mdf_prosegui_Ctrl_Scocca_ApSx_FiDx == 1
             )
             {
              // 16.11.2018
              mcb_LimCop_SboSc = 60
              if (VAR_EXIST(idx_att, "MdF_LimY_Con_Sbordo") )  { mcb_LimCop_SboSc = VAR_VAL(idx_att, "MdF_LimY_Con_Sbordo") }

            // 21.07.2023 P292374
             mdf_pros_Sbordo_Scocca3 = 0
             if (VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_Scocca") >= 3)
                {
                 if (IS_MATCH(NOME(exitBattuta_DX), "Fia*Ter*") )
                    { mdf_pros_Sbordo_Scocca3 = 1 }

                // 06.05.2024 502249
                // 08.08.2024 479754 da 10 a 15
                 if ( base_0.y < 15
                    & VAR_VAL(exitBattuta_DX, "base_0.y") < 15
                    )
                    { mdf_pros_Sbordo_Scocca3 = 2 }
                }

             // 28.03.2025 St945165 COANP Fianco a Terra e Anta a terra. Deve trovare Sbordo da Fondo. Non ha senso dover cambiare MdF_Ctrl_Sbordo_Scocca a 3
              if ( VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_Scocca") >= 1
                 & mdf_pros_Sbordo_Scocca3 < 2
                 )
                 {
                  if ( base_0.y < 15
                     & VAR_VAL(exitBattuta_DX, "base_0.y") < 15
                     & mdf_SbordoYInf_Sx == 0
                     & mdf_SbordoYInf_Dx == 0
                     )
                     {
                      mdf_pros_Sbordo_Scocca3 = 3
                     }
                 }

              if ( PADRE(exitBattuta_DX, -1) != PADRE(idx_att, -1)
                 // 21.07.2023 P292374
                 | mdf_pros_Sbordo_Scocca3 > 0
                 )
                 {
                  COMPONENTI2("mdf_Cop", PADRE(idx_att, -1), "Cop*")
                  // 03.12.2018
                  if ( VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_Scocca") >= 2
                     // 28.03.2025 St945165 COANP Fianco a Terra e Anta a terra. Deve trovare Sbordo da Fondo
                     | mdf_pros_Sbordo_Scocca3 >= 3
                     )
                     {
                      if (mdf_Cop == 0)
                         { NEAR_GLOBALE("mdf_Cop", idx_att, 1.6, 1, "Cop*") }

                     // 06.05.2024 St502249
                      //NEAR_GLOBALE("mdf_Fon", idx_att, 1.6, 1, "Fon*")
                     // 28.03.2025 St945165
                      //NEAR_GLOBALE("mdf_Fon", idx_att, 3, 1, "Fon*")
                      NEAR_GLOBALE("mdf_Fon", idx_att, 3.02, 1, "Fon*")
                     // 15.07.2021 Po58074
                      if (mdf_Fon == 0)
                         {
                          mdF_archetipoFondo = VAR_VAL_STR(idx_att, "MdF_archetipoFondo")
                          // 28.03.2025 St945165 COANP Fianco a Terra e Anta a terra. Deve trovare Sbordo da Fondo
                          if (STRLEN(mdF_archetipoFondo) < 1  &  mdf_pros_Sbordo_Scocca3 >= 2)  { mdF_archetipoFondo = "*Fon*" }

                          if (STRLEN(mdF_archetipoFondo) > 1)
                             {
                              NEAR_GLOBALE("mdf_Fon", idx_att, 10.6, 1, mdF_archetipoFondo)
                              if (mdf_Fon > 0)
                                 {
                                  if ( VAR_VAL(mdf_Fon[1], "base_0.y") - mcb_LimCop_SboSc - 0.1 < VAR_VAL(idx_att, "base_0.y")
                                     & VAR_VAL(mdf_Fon[1], "alto_0.y") > VAR_VAL(idx_att, "base_0.y")
                                     )
                                     {
                                      mdf_SbordoYInf_Sx = 0
                                      // 13.09.2024 PH544951
                                      mdf_SbordoYInf_Sx_Found_Fondo = 1
                                      mdf_SbordoYInf_Dx = 0
                                     }
                                 }
                             }
                         }
                      if (mdf_Fon > 0)
                         {
                          if (VAR_VAL(mdf_Fon[1], "base_0.y") - 150 > VAR_VAL(idx_att, "base_0.y") )
                             {
                              mdf_Ctrl_Sbordo_my_pdr = 1
                              mdf_basy_FonSc = VAR_VAL(mdf_Fon[1], "base_0.y")
                             }
                         // 06.05.2024 St502249
                          if ( VAR_VAL(mdf_Fon[1], "base_0.y") - 50 > VAR_VAL(idx_att, "base_0.y")
                             & VAR_VAL(mdf_Fon[1], "base_0.y") - 180 < VAR_VAL(idx_att, "base_0.y")
                             )
                             {
                              mdf_Ctrl_Sbordo_my_pdr = 1
                              mdf_basy_FonSc = VAR_VAL(mdf_Fon[1], "base_0.y")
                             }
                         }
                     }
                 // 19.04.2021 H21010429
                  iCo=1
                  while (iCo <= mdf_Cop)
                     {
                      if ( VAR_VAL(mdf_Cop[iCo], "alto_0.y") + mcb_LimCop_SboSc < VAR_VAL(idx_att, "alto_0.y")
                         // 19.04.2021
                         & VAR_VAL(mdf_Cop[iCo], "alto_0.y") - 1 > VAR_VAL(idx_att, "base_0.y")
                         )
                         {
                          mdf_Ctrl_Sbordo_my_pdr = 1
                          mdf_alty_CopSc = VAR_VAL(mdf_Cop[iCo], "alto_0.y")
                         }
                      iCo = iCo+1
                     }
                 }
             }

          if (mdf_Ctrl_Sbordo_my_pdr == 1)
             {
              mdf_alty_FiaSx = VAR_VAL(PADRE(idx_att, -1), "alto_0.y")
              mdf_basy_FiaSx = VAR_VAL(PADRE(idx_att, -1), "base_0.y")

              Bay_KFBX = base_0.y
              Aly_KFBX = alto_0.y

              mdf_diff_altalt_Sx = Aly_KFBX - mdf_alty_FiaSx
              mdf_diff_basbas_Sx = mdf_basy_FiaSx - Bay_KFBX

              // 10.09.2018
              if (mdf_diff_altalt_Sx == 0)
                 {
                  if (mdf_alty_CopSc < mdf_alty_FiaSx)
                     {
                     // 03.12.2018
                      mdf_limaltyCop = 150
                      if (VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_Scocca") >= 2)  { mdf_limaltyCop = 300 }
                      if (mdf_alty_CopSc+mdf_limaltyCop > Aly_KFBX)
                         {
                          mdf_diff_altalt_Sx = Aly_KFBX - mdf_alty_CopSc
                         }
                     }
                 }
              // 03.12.2018
              // 06.05.2024 St502249
              //if (mdf_basy_FonSc > 150)
              if (mdf_basy_FonSc > 100)
                 {
                  if (mdf_Fon > 0)
                     { mdf_diff_basbas_Sx = mdf_basy_FonSc - Bay_KFBX }
                 }

              if ( mdf_diff_altalt_Sx > mdf_LimY_Con_Sbordo
                 & mdf_diff_altalt_Sx <= Y/3 + Y/9
                 )
                 { mdf_SbordoYSup_Sx = mdf_diff_altalt_Sx }

              if ( mdf_diff_basbas_Sx > mdf_LimY_Con_Sbordo
                 & mdf_diff_basbas_Sx <= Y/3 + Y/9
                 )
                 { mdf_SbordoYInf_Sx = mdf_diff_basbas_Sx }

             // 03.12.2018
              if (VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_Scocca") >= 2)
                 {
                  if ( mdf_diff_basbas_Sx > mdf_LimY_Con_Sbordo
                     & mdf_diff_basbas_Sx <= Y/2 + Y/9
                     )
                     { mdf_SbordoYInf_Sx = mdf_diff_basbas_Sx }
                 }
             }
         // 29.10.2018
          if ( mdf_Ctrl_Sbordo_my_pdr != 1
             & mdf_Ctrl_Sbordo_Sx_frat > 0
             )
             {
              mdf_idxFia_ToSearch = PADRE(idx_att, -1)
              if (mdf_find_FiaSx_frat > 2)
                 {
                  mdf_idxFia_ToSearch = PADRE(idx_att, 1)
                  if (IS_MATCH(NOME(idx_att), "MdF_*") == 1)
                     { mdf_idxFia_ToSearch = PADRE(idx_att, 2) }
                 }

              if (mdf_find_FiaSx_frat <= 1  |  mdf_find_FiaSx_frat > 2)
                 {
                  NEAR_GLOBALE("mdf_find_FiaSx_frat", mdf_idxFia_ToSearch, mdf_distNearBatFia+140, 1, mdF_archetipo_Fia_2)
                  if (mdf_find_FiaSx_frat == 0)
                     { NEAR_GLOBALE("mdf_find_FiaSx_frat", mdf_idxFia_ToSearch, mdf_distNearBatFia+140, 1, "*Div*") }

                 // 05.08.2024 PKH 2024OVB545146_SxDx. Se doppia anta e una ha il fianco che tocca terra e una no, devo avere lo Sbordo dell' altra anta
                  // altrimenti le cerniere tra un' anta e l' altra risulterebbero sfalsate
                  if ( mdf_find_FiaSx_frat == 0
                     & mdf_prosegui_Ctrl_Scocca_ApSx_FiDx == 1
                     & IS_IDX(exitBattuta_SX) != 1
                     )
                     {
                      NEAR_GLOBALE("mdf_find_FiaSx_frat", mdf_idxFia_ToSearch, mdf_distNearBatFia, 1, STRCAT(STRMID(0,3,NOME(exitBattuta_DX)), "*"))
                     }
                 }

              mdf_exitBattuta_SX_frat = -1
              mdf_ifi = 1
              while (mdf_ifi <= mdf_find_FiaSx_frat)
                 {
                  if ( mdf_find_FiaSx_frat[mdf_ifi] != exitBattuta_DX
                     & IS_MATCH(NOME(mdf_find_FiaSx_frat[mdf_ifi]), "Diva*") != 1
                     )
                     {
                      yDiv = VAR_VAL(mdf_find_FiaSx_frat[mdf_ifi], "Y")
                      yFro = VAR_VAL(idx_att, "Y")
                      // 07.08.2020 PH 592070 Se divisorio interno non lo devo considerare come elemento di Battuta-fratello
                      if ( VAR_VAL(idx_att, "X")+100 > VAR_VAL(PADRE(idx_att, -1), "X")
                         // 15.11.2024 PH 2024OVB209544
                         & VAR_VAL(idx_att, "X")+100 > VAR_VAL(PADRE(mdf_find_FiaSx_frat[mdf_ifi], -1), "X")
                         & yDiv > 2*yFro/3
                         )
                         {
                          mdf_exitBattuta_SX_frat = mdf_find_FiaSx_frat[mdf_ifi]
                         }
                     }
                  mdf_ifi = mdf_ifi+1
                 }

             // 05.08.2024 PKH 2024OVB545146_SxDx. Se doppia anta e una ha il fianco che tocca terra e una no, devo avere lo Sbordo dell' altra anta
              // altrimenti le cerniere tra un' anta e l' altra risulterebbero sfalsate
              if (IS_IDX(mdf_exitBattuta_SX_frat) != 1)
                 {
                  mdf_ifi = 1
                  while (mdf_ifi <= mdf_find_FiaSx_frat)
                     {
                      if ( mdf_find_FiaSx_frat[mdf_ifi] != exitBattuta_DX
                         & IS_MATCH(NOME(mdf_find_FiaSx_frat[mdf_ifi]), "Diva*") != 1
                         )
                         {
                          if ( mdf_prosegui_Ctrl_Scocca_ApSx_FiDx == 1
                             & IS_IDX(exitBattuta_SX) != 1
                             // 13.09.2024 PH544951
                             & mdf_SbordoYInf_Sx_Found_Fondo == 0
                             )
                             {
                              COMPONENTI2("mdf_nAnte_SX_frat", mdf_idxFia_ToSearch, NOME(idx_att))
                              if (mdf_nAnte_SX_frat == 2)
                                 {
                                  iASf = 1
                                  while (iASf <= mdf_nAnte_SX_frat)
                                     {
                                      if (mdf_nAnte_SX_frat[iASf] != idx_att)
                                         {
                                          mdf_idxFro_ToSearch = mdf_nAnte_SX_frat[iASf]
                                         // 02.09.2024 PH 2023OVB516711
                                          if ( IS_IDX(VAR_VAL(mdf_idxFro_ToSearch, "exitBattuta_SX")) == 1
                                             // 21.01.2025 H24000043 altrimenti VAR_VAL dà 0
                                             & VAR_EXIST(mdf_idxFro_ToSearch, "exitBattuta_SX")
                                             )
                                             {
                                              mdf_exitBattuta_SX_frat = VAR_VAL(mdf_idxFro_ToSearch, "exitBattuta_SX")
                                             }
                                          else
                                             {
                                              NEAR_GLOBALE("mdf_find_FiaSx_frat_FromFro", mdf_idxFro_ToSearch, mdf_distNearBatFia, 1, STRCAT(STRMID(0,3,NOME(exitBattuta_DX)), "*"))
                                              if (mdf_find_FiaSx_frat_FromFro > 0)
                                                 {
                                                  mdf_exitBattuta_SX_frat = mdf_find_FiaSx_frat_FromFro[1]
                                                 }
                                             }
                                         }
                                      iASf = iASf+1
                                     }
                                 }
                             }
                         }
                      mdf_ifi = mdf_ifi+1
                     }
                 }

              if (IS_IDX(mdf_exitBattuta_SX_frat) )
                 {
                  mdf_alty_FiaSx = VAR_VAL(mdf_exitBattuta_SX_frat, "alto_0.y")
                  mdf_basy_FiaSx = VAR_VAL(mdf_exitBattuta_SX_frat, "base_0.y")

                  Bay_KFBX = base_0.y
                  Aly_KFBX = alto_0.y

                  mdf_diff_altalt_Sx = Aly_KFBX - mdf_alty_FiaSx
                  if ( mdf_diff_altalt_Sx > mdf_LimY_Con_Sbordo
                     & mdf_diff_altalt_Sx <= Y/3 + Y/9
                     )
                     { mdf_SbordoYSup_Sx = mdf_diff_altalt_Sx }

                  mdf_diff_basbas_Sx = mdf_basy_FiaSx - Bay_KFBX
                  if ( mdf_diff_basbas_Sx > mdf_LimY_Con_Sbordo
                     & mdf_diff_basbas_Sx <= Y/3 + Y/9
                     )
                     { mdf_SbordoYInf_Sx = mdf_diff_basbas_Sx }
                 }
             }
          mdf_Ctrl_Sbordo_Dx_frat = 0
          if (IS_IDX(exitBattuta_SX)  &  IS_IDX(exitBattuta_DX) != 1)
             {
              COMPONENTI2("mdf_find_FiaDx_frat", PADRE(exitBattuta_SX, -1), STRCAT(STRMID(0,3,NOME(exitBattuta_SX)), "*"))
              if (mdf_find_FiaDx_frat <= 1)
                 {
                  mdf_Ctrl_Sbordo_Dx_frat = 1
                  NEAR_GLOBALE("mdf_find_FiaDx_frat", PADRE(idx_att, -1), mdf_distNearBatFia, 1, STRCAT(STRMID(0,3,NOME(exitBattuta_SX)), "*"))
                 }
             }

          mdf_Ctrl_Sbordo_my_pdr = 0
          mdf_alty_CopSc = 0
          mdf_basy_FonSc = 0
          // 22.03.2019
          mdf_prosegui_Ctrl_Scocca_ApDx_FiSx = 1
          mdf_Ctrl_Sbordo_FiaLatoCer = VAR_VAL(PADRE(idx_att, 1), "MdF_Ctrl_Sbordo_FiaLatoCer")
          if (VAR_EXIST(idx_att, "MdF_Ctrl_Sbordo_FiaLatoCer") )  { mdf_Ctrl_Sbordo_FiaLatoCer = VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_FiaLatoCer") }
          if ( mdf_Ctrl_Sbordo_FiaLatoCer > 0
             & IS_MATCH(MdF_Apertura, "D*") == 1
             )
             { mdf_prosegui_Ctrl_Scocca_ApDx_FiSx = 0 }

          if ( IS_IDX(exitBattuta_SX)
             // 22.03.2019
             & mdf_prosegui_Ctrl_Scocca_ApDx_FiSx == 1
             )
             {
              // 16.11.2018
              mcb_LimCop_SboSc = 60
              if (VAR_EXIST(idx_att, "MdF_LimY_Con_Sbordo") )  { mcb_LimCop_SboSc = VAR_VAL(idx_att, "MdF_LimY_Con_Sbordo") }

            // 21.07.2023 P292374
             mdf_pros_Sbordo_Scocca3 = 0
             if (VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_Scocca") >= 3)
                {
                 if (IS_MATCH(NOME(exitBattuta_SX), "Fia*Ter*") )
                    { mdf_pros_Sbordo_Scocca3 = 1 }

                // 06.05.2024 502249
                // 08.08.2024 479754 da 10 a 15
                 if ( base_0.y < 15
                    & VAR_VAL(exitBattuta_SX, "base_0.y") < 15
                    )
                    { mdf_pros_Sbordo_Scocca3 = 2 }
                }

             // 28.03.2025 St945165 COANP Fianco a Terra e Anta a terra. Deve trovare Sbordo da Fondo. Non ha senso dover cambiare MdF_Ctrl_Sbordo_Scocca a 3
              if ( VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_Scocca") >= 1
                 & mdf_pros_Sbordo_Scocca3 < 2
                 )
                 {
                  if ( base_0.y < 15
                     & VAR_VAL(exitBattuta_SX, "base_0.y") < 15
                     & mdf_SbordoYInf_Sx == 0
                     & mdf_SbordoYInf_Dx == 0
                     )
                     {
                      mdf_pros_Sbordo_Scocca3 = 3
                     }
                 }

              if ( PADRE(exitBattuta_SX, -1) != PADRE(idx_att, -1)
                 // 21.07.2023 P292374
                 | mdf_pros_Sbordo_Scocca3 > 0
                 )
                 {
                  COMPONENTI2("mdf_Cop", PADRE(idx_att, -1), "Cop*")
                  // 03.12.2018
                  if ( VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_Scocca") >= 2
                     // 28.03.2025 St945165 COANP Fianco a Terra e Anta a terra. Deve trovare Sbordo da Fondo
                     | mdf_pros_Sbordo_Scocca3 >= 3
                     )
                     {
                      if (mdf_Cop == 0)
                         { NEAR_GLOBALE("mdf_Cop", idx_att, 1.6, 1, "Cop*") }

                     // 06.05.2024 St502249
                      //NEAR_GLOBALE("mdf_Fon", idx_att, 1.6, 1, "Fon*")
                     // 28.03.2025 St945165
                      //NEAR_GLOBALE("mdf_Fon", idx_att, 3, 1, "Fon*")
                      NEAR_GLOBALE("mdf_Fon", idx_att, 3.02, 1, "Fon*")
                     // 15.07.2021 Po58074
                      if (mdf_Fon == 0)
                         {
                          mdF_archetipoFondo = VAR_VAL_STR(idx_att, "MdF_archetipoFondo")
                          // 28.03.2025 St945165 COANP Fianco a Terra e Anta a terra. Deve trovare Sbordo da Fondo
                          if (STRLEN(mdF_archetipoFondo) < 1  &  mdf_pros_Sbordo_Scocca3 >= 2)  { mdF_archetipoFondo = "*Fon*" }

                          if (STRLEN(mdF_archetipoFondo) > 1)
                             {
                              NEAR_GLOBALE("mdf_Fon", idx_att, 10.6, 1, mdF_archetipoFondo)
                              if (mdf_Fon > 0)
                                 {
                                  if ( VAR_VAL(mdf_Fon[1], "base_0.y") - mcb_LimCop_SboSc - 0.1 < VAR_VAL(idx_att, "base_0.y")
                                     & VAR_VAL(mdf_Fon[1], "alto_0.y") > VAR_VAL(idx_att, "base_0.y")
                                     )
                                     {
                                      mdf_SbordoYInf_Dx = 0
                                      // 13.09.2024 PH544951
                                      mdf_SbordoYInf_Dx_Found_Fondo = 1
                                      mdf_SbordoYInf_Sx = 0
                                     }
                                 }
                             }
                         }
                      if (mdf_Fon > 0)
                         {
                          if (VAR_VAL(mdf_Fon[1], "base_0.y") - 150 > VAR_VAL(idx_att, "base_0.y") )
                             {
                              mdf_Ctrl_Sbordo_my_pdr = 1
                              mdf_basy_FonSc = VAR_VAL(mdf_Fon[1], "base_0.y")
                             }
                         // 06.05.2024 St502249
                          if ( VAR_VAL(mdf_Fon[1], "base_0.y") - 50 > VAR_VAL(idx_att, "base_0.y")
                             & VAR_VAL(mdf_Fon[1], "base_0.y") - 180 < VAR_VAL(idx_att, "base_0.y")
                             )
                             {
                              mdf_Ctrl_Sbordo_my_pdr = 1
                              mdf_basy_FonSc = VAR_VAL(mdf_Fon[1], "base_0.y")
                             }
                         }
                     }
                 // 19.04.2021 H21010429
                  iCo=1
                  while (iCo <= mdf_Cop)
                     {
                      if ( VAR_VAL(mdf_Cop[iCo], "alto_0.y") + mcb_LimCop_SboSc < VAR_VAL(idx_att, "alto_0.y")
                         // 19.04.2021
                         & VAR_VAL(mdf_Cop[iCo], "alto_0.y") - 1 > VAR_VAL(idx_att, "base_0.y")
                         )
                         {
                          mdf_Ctrl_Sbordo_my_pdr = 1
                          mdf_alty_CopSc = VAR_VAL(mdf_Cop[iCo], "alto_0.y")
                         }
                      iCo = iCo+1
                     }
                 }
             }

          if (mdf_Ctrl_Sbordo_my_pdr == 1)
             {
              mdf_alty_FiaDx = VAR_VAL(PADRE(idx_att, -1), "alto_0.y")
              mdf_basy_FiaDx = VAR_VAL(PADRE(idx_att, -1), "base_0.y")

              Bay_KFBX = base_0.y
              Aly_KFBX = alto_0.y

              mdf_diff_altalt_Dx = Aly_KFBX - mdf_alty_FiaDx
              mdf_diff_basbas_Dx = mdf_basy_FiaDx - Bay_KFBX

              // 10.09.2018
              if (mdf_diff_altalt_Dx == 0)
                 {
                  if (mdf_alty_CopSc < mdf_alty_FiaDx)
                     {
                     // 03.12.2018
                      mdf_limaltyCop = 150
                      if (VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_Scocca") >= 2)  { mdf_limaltyCop = 300 }
                      if (mdf_alty_CopSc+mdf_limaltyCop > Aly_KFBX)
                         {
                          mdf_diff_altalt_Dx = Aly_KFBX - mdf_alty_CopSc
                         }
                     }
                 }
              // 03.12.2018
              // 06.05.2024 St502249
              //if (mdf_basy_FonSc > 150)
              if (mdf_basy_FonSc > 100)
                 {
                  if (mdf_Fon > 0)
                     { mdf_diff_basbas_Dx = mdf_basy_FonSc - Bay_KFBX }
                 }

              if ( mdf_diff_altalt_Dx > mdf_LimY_Con_Sbordo
                 & mdf_diff_altalt_Dx <= Y/3 + Y/9
                 )
                 { mdf_SbordoYSup_Dx = mdf_diff_altalt_Dx }

              if ( mdf_diff_basbas_Dx > mdf_LimY_Con_Sbordo
                 & mdf_diff_basbas_Dx <= Y/3 + Y/9
                 )
                 { mdf_SbordoYInf_Dx = mdf_diff_basbas_Dx }

             // 03.12.2018
              if (VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_Scocca") >= 2)
                 {
                  if ( mdf_diff_basbas_Dx > mdf_LimY_Con_Sbordo
                     & mdf_diff_basbas_Dx <= Y/2 + Y/9
                     )
                     { mdf_SbordoYInf_Dx = mdf_diff_basbas_Dx }
                 }
             }
             // 29.10.2018
          if ( mdf_Ctrl_Sbordo_my_pdr != 1
             & mdf_Ctrl_Sbordo_Dx_frat > 0
             )
             {
              mdf_idxFia_ToSearch = PADRE(idx_att, -1)
              if (mdf_find_FiaDx_frat > 2)
                 {
                  mdf_idxFia_ToSearch = PADRE(idx_att, 1)
                  if (IS_MATCH(NOME(idx_att), "MdF_*") == 1)
                     { mdf_idxFia_ToSearch = PADRE(idx_att, 2) }
                 }
              if (mdf_find_FiaDx_frat <= 1  |  mdf_find_FiaDx_frat > 2)
                 {
                  mdf_distNearBatFia_deb = mdf_distNearBatFia
                  NEAR_GLOBALE("mdf_find_FiaDx_frat", mdf_idxFia_ToSearch, mdf_distNearBatFia, 1, mdF_archetipo_Fia_2)
                  if (mdf_find_FiaDx_frat == 0)
                     { NEAR_GLOBALE("mdf_find_FiaDx_frat", mdf_idxFia_ToSearch, mdf_distNearBatFia, 1, "*Div*") }

                 // 05.08.2024 PKH 2024OVB545146_SxDx Come DX
                  if ( mdf_find_FiaDx_frat == 0
                     & mdf_prosegui_Ctrl_Scocca_ApDx_FiSx == 1
                     & IS_IDX(exitBattuta_DX) != 1
                     )
                     {
                      NEAR_GLOBALE("mdf_find_FiaDx_frat", mdf_idxFia_ToSearch, mdf_distNearBatFia, 1, STRCAT(STRMID(0,3,NOME(exitBattuta_SX)), "*"))
                     }
                 }
              mdf_exitBattuta_DX_frat = -1
              mdf_ifi = 1
              while (mdf_ifi <= mdf_find_FiaDx_frat)
                 {
                  if ( mdf_find_FiaDx_frat[mdf_ifi] != exitBattuta_SX
                     & IS_MATCH(NOME(mdf_find_FiaDx_frat[mdf_ifi]), "Diva*") != 1
                     )
                     {
                      yDiv = VAR_VAL(mdf_find_FiaDx_frat[mdf_ifi], "Y")
                      yFro = VAR_VAL(idx_att, "Y")
                      // 07.08.2020 Po592070 Se divisorio interno non lo devo considerare come elemento di Battuta-fratello
                      if ( VAR_VAL(idx_att, "X")+100 > VAR_VAL(PADRE(idx_att, -1), "X")
                         // 15.11.2024 PH 2024OVB209544
                         & VAR_VAL(idx_att, "X")+100 > VAR_VAL(PADRE(mdf_find_FiaDx_frat[mdf_ifi], -1), "X")
                         & yDiv > 2*yFro/3
                         )
                         {
                          mdf_exitBattuta_DX_frat = mdf_find_FiaDx_frat[mdf_ifi]
                         }
                     }
                  mdf_ifi = mdf_ifi+1
                 }

             // 05.08.2024 PKH 2024OVB545146_SxDx Come DX
              if (IS_IDX(mdf_exitBattuta_DX_frat) != 1)
                 {
                  mdf_ifi = 1
                  while (mdf_ifi <= mdf_find_FiaDx_frat)
                     {
                      if ( mdf_find_FiaDx_frat[mdf_ifi] != exitBattuta_SX
                         & IS_MATCH(NOME(mdf_find_FiaDx_frat[mdf_ifi]), "Diva*") != 1
                         )
                         {
                          if ( mdf_prosegui_Ctrl_Scocca_ApDx_FiSx == 1
                             & IS_IDX(exitBattuta_DX) != 1
                             // 13.09.2024 PH544951
                             & mdf_SbordoYInf_Dx_Found_Fondo == 0
                             )
                             {
                              COMPONENTI2("mdf_nAnte_DX_frat", mdf_idxFia_ToSearch, NOME(idx_att))
                              if (mdf_nAnte_DX_frat == 2)
                                 {
                                  iADf = 1
                                  while (iADf <= mdf_nAnte_DX_frat)
                                     {
                                      if (mdf_nAnte_DX_frat[iADf] != idx_att)
                                         {
                                          mdf_idxFro_ToSearch = mdf_nAnte_DX_frat[iADf]
                                         // 02.09.2024 PH 2023OVB516711
                                          if ( IS_IDX(VAR_VAL(mdf_idxFro_ToSearch, "exitBattuta_DX")) == 1
                                             // 21.01.2025 H24000043 altrimenti VAR_VAL dà 0
                                             & VAR_EXIST(mdf_idxFro_ToSearch, "exitBattuta_DX")
                                             )
                                             {
                                              mdf_exitBattuta_DX_frat = VAR_VAL(mdf_idxFro_ToSearch, "exitBattuta_DX")
                                             }
                                          else
                                             {
                                              NEAR_GLOBALE("mdf_find_FiaDx_frat_FromFro", mdf_idxFro_ToSearch, mdf_distNearBatFia, 1, STRCAT(STRMID(0,3,NOME(exitBattuta_SX)), "*"))
                                              if (mdf_find_FiaDx_frat_FromFro > 0)
                                                 {
                                                  mdf_exitBattuta_DX_frat = mdf_find_FiaDx_frat_FromFro[1]
                                                 }
                                             }
                                         }
                                      iADf = iADf+1
                                     }
                                 }
                             }
                         }
                      mdf_ifi = mdf_ifi+1
                     }
                 }

              if (IS_IDX(mdf_exitBattuta_DX_frat) )
                 {
                  mdf_alty_FiaDx = VAR_VAL(mdf_exitBattuta_DX_frat, "alto_0.y")
                  mdf_basy_FiaDx = VAR_VAL(mdf_exitBattuta_DX_frat, "base_0.y")

                  Bay_KFBX = base_0.y
                  Aly_KFBX = alto_0.y

                  mdf_diff_altalt_Dx = Aly_KFBX - mdf_alty_FiaDx
                  if ( mdf_diff_altalt_Dx > mdf_LimY_Con_Sbordo
                     & mdf_diff_altalt_Dx <= Y/3 + Y/9
                     )
                     { mdf_SbordoYSup_Dx = mdf_diff_altalt_Dx }

                  mdf_diff_basbas_Dx = mdf_basy_FiaDx - Bay_KFBX
                  if ( mdf_diff_basbas_Dx > mdf_LimY_Con_Sbordo
                     & mdf_diff_basbas_Dx <= Y/3 + Y/9
                     )
                     { mdf_SbordoYInf_Dx = mdf_diff_basbas_Dx }
                 }
             }

          // 07.08.2020 per Ante soffietto che non hanno fianco di Battuta
          if (IS_IDX(exitBattuta_SX) != 1  &  IS_IDX(exitBattuta_DX) != 1)
             {
              idx_att_SbAperSD = idx_att
              GOSUB mdf_Ctrl_Sbordo_Scocca_AperSX
              GOSUB mdf_Ctrl_Sbordo_Scocca_AperDX
             }
         }

     // 13.04.2017
      if (IS_IDX(exitBattuta_SX) != 1)
         {
          if (IS_MATCH(MdF_Apertura, "S*") == 1)
             {
              if (VAR_VAL(idx_att, "MdF_Mans_LavSp_YpSx") > 2)
                 {
                  mdf_SbordoYSup_Sx = Y - VAR_VAL(idx_att, "MdF_Mans_LavSp_YpSx")
                 }
             }
         }
      if (IS_IDX(exitBattuta_DX) != 1)
         {
          if (IS_MATCH(MdF_Apertura, "D*") == 1)
             {
              if (VAR_VAL(idx_att, "MdF_Mans_LavSp_YpDx") > 2)
                 {
                  mdf_SbordoYSup_Dx = Y - VAR_VAL(idx_att, "MdF_Mans_LavSp_YpDx")
                 }
             }
         }

      if (IS_MATCH(MdF_Apertura, "S*") == 1)
         {
          MdfSys_SbordoYInf = mdf_SbordoYInf_Sx
          MdfSys_SbordoYSup = mdf_SbordoYSup_Sx
         }
      if (IS_MATCH(MdF_Apertura, "D*") == 1)
         {
          MdfSys_SbordoYInf = mdf_SbordoYInf_Dx
          MdfSys_SbordoYSup = mdf_SbordoYSup_Dx
         }
      // Devo farlo indipendente dall' MdF_Apertura perché se sborda sull altro fianco devo tener conto del fianco "peggiore"
      // 13.09.2016
      // In realtà dipende cosa vuol fare il cliente
      mdf_aper_noBatt = 0
      if ( IS_MATCH(MdF_Apertura, "S*") != 1
         & IS_MATCH(MdF_Apertura, "D*") != 1
         )
         { mdf_aper_noBatt = 1 }

      mdf_ctrl_Sbordo_noBatt = 0
     // 29.09.2017 dipende se entra CamMdFrontali o l' MdF_
      mdf_Ctrl_Sbordo_FiaLatoCer = VAR_VAL(PADRE(idx_att, 1), "MdF_Ctrl_Sbordo_FiaLatoCer")
      if (VAR_EXIST(idx_att, "MdF_Ctrl_Sbordo_FiaLatoCer") )  { mdf_Ctrl_Sbordo_FiaLatoCer = VAR_VAL(idx_att, "MdF_Ctrl_Sbordo_FiaLatoCer") }

      if ( mdf_Ctrl_Sbordo_FiaLatoCer > 0
         & mdf_aper_noBatt == 1
         )
         { mdf_ctrl_Sbordo_noBatt = 1 }

      if ( mdf_Ctrl_Sbordo_FiaLatoCer == 0
         | mdf_ctrl_Sbordo_noBatt > 0
         )
         {
         // 17.10.2017
          mdf_graficataSciolta = 0
          if ( IS_MATCH(NOME(PADRE(idx_att, -1)), "*Anta*")
             // 18.02.2025 solo perche mi son accorto
             | IS_MATCH(NOME(PADRE(idx_att, -1)), "*Fron*")
             )
             {
              // se non sento un fianco e ne sento uno che magari non è nemmeno riferito al lato Cerniere,
              // probabile che sono posizionata erroneamente vicino ad una scocca
              if (IS_IDX(exitBattuta_SX) != 1 | IS_IDX(exitBattuta_DX) != 1)
                 {
                  if (ABS(Battuta_X) < 10)
                     { mdf_graficataSciolta = 1 }
                 }
             }
         // 12.02.2019
          mdf_ignora_sbordoY_div_Sx = 0
         // 18.02.2025
          mdf_considera_sbordoY_Sx_ANP = 0
          if (IS_MATCH(MdF_Apertura, "D*") == 1  &  IS_IDX(exitBattuta_DX) != 1)
             { mdf_considera_sbordoY_Sx_ANP = 1 }

          if ( IS_IDX(exitBattuta_SX) == 1
             & mdf_considera_sbordoY_Sx_ANP == 0
             )
             {
              // 28.03.2019 A30409
              // 29.03.2019 H12522 FiancoSpalla posizionato in mezzo
              // significa presenza di Divisorio per attrezzatura interna che non ha niente a che vedere con la Battuta_X
              if (VAR_VAL(idx_att, "X")+100 < VAR_VAL(PADRE(idx_att, -1), "X") )
                 {
                  if ( mdf_SbordoYInf_Sx > 280
                     | mdf_SbordoYSup_Sx > 280
                     )
                     {
                      mdf_ignora_sbordoY_div_Sx = 1
                     }
                 }
             }
          mdf_ignora_sbordoY_div_Dx = 0
         // 18.02.2025 A007106 Strano non sia uscito prima. Forse andava MdF_Ctrl_Sbordo_Scocca=1 per questo caso, ma mi
          // sembrava funzionasse da altre parti, forse perchè lo sbordo era sempre < di 280 e forse era per quello che
          // quella volta avevo messo > 280 perchè non mi convinceva appieno
          mdf_considera_sbordoY_Dx_ANP = 0
          if (IS_MATCH(MdF_Apertura, "S*") == 1  &  IS_IDX(exitBattuta_SX) != 1)
             { mdf_considera_sbordoY_Dx_ANP = 1 }

          if ( IS_IDX(exitBattuta_DX) == 1
             // 18.02.2025 A007106
             & mdf_considera_sbordoY_Dx_ANP == 0
             )
             {
              // 28.03.2019 A30409
              // 29.03.2019 H12522 Fianco
              // significa presenza di Divisorio per attrezzatura interna che non ha niente a che vedere con la Battuta_X
              if (VAR_VAL(idx_att, "X")+100 < VAR_VAL(PADRE(idx_att, -1), "X") )
                 {
                  if ( mdf_SbordoYInf_Dx > 280
                     | mdf_SbordoYSup_Dx > 280
                     )
                     {
                      mdf_ignora_sbordoY_div_Dx = 1
                     }
                 }
             }

          if (mdf_graficataSciolta == 0)
             {
             // 12.02.2019
              if (mdf_ignora_sbordoY_div_Sx == 0  &  mdf_ignora_sbordoY_div_Dx == 0)
                 {
                  if (mdf_SbordoYInf_Sx > mdf_SbordoYInf_Dx)
                     { MdfSys_SbordoYInf = mdf_SbordoYInf_Sx }
                  else
                     { MdfSys_SbordoYInf = mdf_SbordoYInf_Dx }

                  if (mdf_SbordoYSup_Sx > mdf_SbordoYSup_Dx)
                     { MdfSys_SbordoYSup = mdf_SbordoYSup_Sx }
                  else
                     { MdfSys_SbordoYSup = mdf_SbordoYSup_Dx }
                 }
             }
         }
      if (MdfSys_SbordoYInf > 0)
         { MdfSys_SbordoYInf = MdfSys_SbordoYInf + mdf_offsetY_Sbordo }

      if (MdfSys_SbordoYSup > 0)
         { MdfSys_SbordoYSup = MdfSys_SbordoYSup + mdf_offsetY_Sbordo }

     // 21.02.2023 PolK
      if (mdf_abbassaSbordoInf != 0)
         {
          MdfSys_SbordoYInf = MdfSys_SbordoYInf-mdf_abbassaSbordoInf
          if (MdfSys_SbordoYInf <= mdf_LimY_Con_Sbordo)
             { MdfSys_SbordoYInf = 0 }
         }

      if (mdf_abbassaSbordoSup != 0)
         {
          MdfSys_SbordoYSup = MdfSys_SbordoYSup-mdf_abbassaSbordoSup
          if (MdfSys_SbordoYSup <= mdf_LimY_Con_Sbordo)
             { MdfSys_SbordoYSup = 0 }
         }

     // 24.04.2025
      idx_SbFoCo = idx_att
      GOSUB MdF_SbordoY_DaFonCop

     // 06.04.2023
      mdf_id_ForzaBatt = idx_att
     // 17.01.2025
      if (VAR_VAL(idx_att, "Battuta_X") == 0)
         {
          if ( IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "S*")
             | IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "D*")
             )
             {
              if (VAR_EXIST(mdf_id_ForzaBatt, "MCB_BattutaX_minima") != 1)  { mdf_id_ForzaBatt = PADRE(idx_att, 1) }
              if (VAR_VAL(mdf_id_ForzaBatt, "MCB_BattutaX_minima") > 4)
                 {
                  if (VAR_VAL(idx_att, "MdF_angoloBas") == 0)
                     {
                      COMPONENTI2("mdf_fia_pres", PADRE(idx_att, -1), "*Fia*")
                      COMPONENTI3("mdf_fia_escl", PADRE(idx_att, -1), "*Fia*")
                      if (mdf_fia_pres == 0  &  mdf_fia_escl > 0)
                         {
                          Battuta_X = VAR_VAL(mdf_id_ForzaBatt, "MCB_BattutaX_minima")
                         }
                     }
                 }
             }
         }

     // 11.02.2025 Sc1057073 Devo reimpostarlo altrimenti se non esiste MCB_BattutaX_minima lo imposta a PADRE di 1 qui sopra
      mdf_id_ForzaBatt = idx_att
      if (VAR_EXIST(mdf_id_ForzaBatt, "MCB_ForzaBattutaX") != 1)  { mdf_id_ForzaBatt = PADRE(idx_att, 1) }
      if ( VAR_VAL(mdf_id_ForzaBatt, "MCB_ForzaBattutaX") != 0
         // 02.08.2024 solo per sicurezza
         & ABS(VAR_VAL(mdf_id_ForzaBatt, "MCB_ForzaBattutaX")) > 10
         )
         {
          Battuta_X = VAR_VAL(mdf_id_ForzaBatt, "MCB_ForzaBattutaX")
         }
     // 10.10.2023 Vedi anche MPF_ForzaBattutaX_Sx, Dx
   }

   PROCEDURA mdf_Ctrl_Sbordo_Scocca_AperSX
   {
      mdf_Ctrl_Sbordo_my_pdr = 0
      mdf_alty_CopSc = 0
      mdf_basy_FonSc = 0
      mdf_prosegui_Ctrl_Scocca_ApSx_FiDx = 1
      mdf_Ctrl_Sbordo_FiaLatoCer = VAR_VAL(PADRE(idx_att_SbAperSD, 1), "MdF_Ctrl_Sbordo_FiaLatoCer")
      if (VAR_EXIST(idx_att_SbAperSD, "MdF_Ctrl_Sbordo_FiaLatoCer") )  { mdf_Ctrl_Sbordo_FiaLatoCer = VAR_VAL(idx_att_SbAperSD, "MdF_Ctrl_Sbordo_FiaLatoCer") }
      if ( mdf_Ctrl_Sbordo_FiaLatoCer > 0
         & IS_MATCH(MdF_Apertura, "S*") == 1
         )
         { mdf_prosegui_Ctrl_Scocca_ApSx_FiDx = 0 }

      if (mdf_prosegui_Ctrl_Scocca_ApSx_FiDx == 1)
         {
          mcb_LimCop_SboSc = 60
          if (VAR_EXIST(idx_att_SbAperSD, "MdF_LimY_Con_Sbordo") )  { mcb_LimCop_SboSc = VAR_VAL(idx_att_SbAperSD, "MdF_LimY_Con_Sbordo") }

          COMPONENTI2("mdf_Cop", PADRE(idx_att_SbAperSD, -1), "Cop*")
          if (VAR_VAL(idx_att_SbAperSD, "MdF_Ctrl_Sbordo_Scocca") >= 2)
             {
              if (mdf_Cop == 0)
                 { NEAR_GLOBALE("mdf_Cop", idx_att_SbAperSD, 1.6, 1, "Cop*") }

              // 06.05.2024
              //NEAR_GLOBALE("mdf_Fon", idx_att_SbAperSD, 1.6, 1, "Fon*")
              NEAR_GLOBALE("mdf_Fon", idx_att_SbAperSD, 3, 1, "Fon*")
             // 15.07.2021 Po58074
              if (mdf_Fon == 0)
                 {
                  mdF_archetipoFondo = VAR_VAL_STR(idx_att_SbAperSD, "MdF_archetipoFondo")
                  if (STRLEN(mdF_archetipoFondo) > 1)
                     {
                      NEAR_GLOBALE("mdf_Fon", idx_att_SbAperSD, 10.6, 1, mdF_archetipoFondo)
                      if (mdf_Fon > 0)
                         {
                          if ( VAR_VAL(mdf_Fon[1], "base_0.y") - mcb_LimCop_SboSc - 0.1 < VAR_VAL(idx_att_SbAperSD, "base_0.y")
                             & VAR_VAL(mdf_Fon[1], "alto_0.y") > VAR_VAL(idx_att_SbAperSD, "base_0.y")
                             )
                             {
                              mdf_SbordoYInf_Sx = 0
                              // 13.09.2024 PH544951
                              mdf_SbordoYInf_Sx_Found_Fondo = 1
                              mdf_SbordoYInf_Dx = 0
                             }
                         }
                     }
                 }
              if (mdf_Fon > 0)
                 {
                  if (VAR_VAL(mdf_Fon[1], "base_0.y") - 150 > VAR_VAL(idx_att_SbAperSD, "base_0.y") )
                     {
                      mdf_Ctrl_Sbordo_my_pdr = 1
                      mdf_basy_FonSc = VAR_VAL(mdf_Fon[1], "base_0.y")
                     }
                 // 06.05.2024 St502249
                  if ( VAR_VAL(mdf_Fon[1], "base_0.y") - 50 > VAR_VAL(idx_att_SbAperSD, "base_0.y")
                     & VAR_VAL(mdf_Fon[1], "base_0.y") - 180 < VAR_VAL(idx_att_SbAperSD, "base_0.y")
                     )
                     {
                      mdf_Ctrl_Sbordo_my_pdr = 1
                      mdf_basy_FonSc = VAR_VAL(mdf_Fon[1], "base_0.y")
                     }
                 }
             }
         // 19.04.2021 H21010429
          iCo=1
          while (iCo <= mdf_Cop)
             {
              if ( VAR_VAL(mdf_Cop[iCo], "alto_0.y") + mcb_LimCop_SboSc < VAR_VAL(idx_att_SbAperSD, "alto_0.y")
                 // 19.04.2021
                 & VAR_VAL(mdf_Cop[iCo], "alto_0.y") - 1 > VAR_VAL(idx_att_SbAperSD, "base_0.y")
                 )
                 {
                  mdf_Ctrl_Sbordo_my_pdr = 1
                  mdf_alty_CopSc = VAR_VAL(mdf_Cop[iCo], "alto_0.y")
                 }
              iCo = iCo+1
             }
         }

      if (mdf_Ctrl_Sbordo_my_pdr == 1)
         {
          mdf_alty_FiaSx = VAR_VAL(PADRE(idx_att_SbAperSD, -1), "alto_0.y")
          mdf_basy_FiaSx = VAR_VAL(PADRE(idx_att_SbAperSD, -1), "base_0.y")

          Bay_KFBX = VAR_VAL(idx_att_SbAperSD, "base_0.y")
          Aly_KFBX = VAR_VAL(idx_att_SbAperSD, "alto_0.y")

          mdf_diff_altalt_Sx = Aly_KFBX - mdf_alty_FiaSx
          mdf_diff_basbas_Sx = mdf_basy_FiaSx - Bay_KFBX

          // 10.09.2018
          if (mdf_diff_altalt_Sx == 0)
             {
              if (mdf_alty_CopSc < mdf_alty_FiaSx)
                 {
                 // 03.12.2018
                  mdf_limaltyCop = 150
                  if (VAR_VAL(idx_att_SbAperSD, "MdF_Ctrl_Sbordo_Scocca") >= 2)  { mdf_limaltyCop = 300 }
                  if (mdf_alty_CopSc+mdf_limaltyCop > Aly_KFBX)
                     {
                      mdf_diff_altalt_Sx = Aly_KFBX - mdf_alty_CopSc
                     }
                 }
             }
          // 03.12.2018
          // 06.05.2024
          //if (mdf_basy_FonSc > 150)
          if (mdf_basy_FonSc > 100)
             {
              if (mdf_Fon > 0)
                 { mdf_diff_basbas_Sx = mdf_basy_FonSc - Bay_KFBX }
             }

          Y_SbAperSD = VAR_VAL(idx_att_SbAperSD, "Y")
          if ( mdf_diff_altalt_Sx > mdf_LimY_Con_Sbordo
             & mdf_diff_altalt_Sx <= Y_SbAperSD/3 + Y_SbAperSD/9
             )
             { mdf_SbordoYSup_Sx = mdf_diff_altalt_Sx }

          if ( mdf_diff_basbas_Sx > mdf_LimY_Con_Sbordo
             & mdf_diff_basbas_Sx <= Y_SbAperSD/3 + Y_SbAperSD/9
             )
             { mdf_SbordoYInf_Sx = mdf_diff_basbas_Sx }

          if (VAR_VAL(idx_att_SbAperSD, "MdF_Ctrl_Sbordo_Scocca") >= 2)
             {
              if ( mdf_diff_basbas_Sx > mdf_LimY_Con_Sbordo
                 & mdf_diff_basbas_Sx <= Y_SbAperSD/2 + Y_SbAperSD/9
                 )
                 { mdf_SbordoYInf_Sx = mdf_diff_basbas_Sx }
             }
         }
   }

   PROCEDURA mdf_Ctrl_Sbordo_Scocca_AperDX
   {
      mdf_Ctrl_Sbordo_my_pdr = 0
      mdf_alty_CopSc = 0
      mdf_basy_FonSc = 0
      mdf_prosegui_Ctrl_Scocca_ApDx_FiSx = 1
      mdf_Ctrl_Sbordo_FiaLatoCer = VAR_VAL(PADRE(idx_att_SbAperSD, 1), "MdF_Ctrl_Sbordo_FiaLatoCer")
      if (VAR_EXIST(idx_att_SbAperSD, "MdF_Ctrl_Sbordo_FiaLatoCer") )  { mdf_Ctrl_Sbordo_FiaLatoCer = VAR_VAL(idx_att_SbAperSD, "MdF_Ctrl_Sbordo_FiaLatoCer") }
      if ( mdf_Ctrl_Sbordo_FiaLatoCer > 0
         & IS_MATCH(MdF_Apertura, "D*") == 1
         )
         { mdf_prosegui_Ctrl_Scocca_ApDx_FiSx = 0 }

      if (mdf_prosegui_Ctrl_Scocca_ApDx_FiSx == 1)
         {
          mcb_LimCop_SboSc = 60
          if (VAR_EXIST(idx_att_SbAperSD, "MdF_LimY_Con_Sbordo") )  { mcb_LimCop_SboSc = VAR_VAL(idx_att_SbAperSD, "MdF_LimY_Con_Sbordo") }

          COMPONENTI2("mdf_Cop", PADRE(idx_att_SbAperSD, -1), "Cop*")
          if (VAR_VAL(idx_att_SbAperSD, "MdF_Ctrl_Sbordo_Scocca") >= 2)
             {
              if (mdf_Cop == 0)
                 { NEAR_GLOBALE("mdf_Cop", idx_att_SbAperSD, 1.6, 1, "Cop*") }

              // 06.05.2024
              //NEAR_GLOBALE("mdf_Fon", idx_att_SbAperSD, 1.6, 1, "Fon*")
              NEAR_GLOBALE("mdf_Fon", idx_att_SbAperSD, 3, 1, "Fon*")
             // 15.07.2021 Po58074
              if (mdf_Fon == 0)
                 {
                  mdF_archetipoFondo = VAR_VAL_STR(idx_att_SbAperSD, "MdF_archetipoFondo")
                  if (STRLEN(mdF_archetipoFondo) > 1)
                     {
                      NEAR_GLOBALE("mdf_Fon", idx_att_SbAperSD, 10.6, 1, mdF_archetipoFondo)
                      if (mdf_Fon > 0)
                         {
                          if ( VAR_VAL(mdf_Fon[1], "base_0.y") - mcb_LimCop_SboSc - 0.1 < VAR_VAL(idx_att_SbAperSD, "base_0.y")
                             & VAR_VAL(mdf_Fon[1], "alto_0.y") > VAR_VAL(idx_att_SbAperSD, "base_0.y")
                             )
                             {
                              mdf_SbordoYInf_Dx = 0
                              // 13.09.2024 PH544951
                              mdf_SbordoYInf_Dx_Found_Fondo = 1
                              mdf_SbordoYInf_Sx = 0
                             }
                         }
                     }
                 }
              if (mdf_Fon > 0)
                 {
                  if (VAR_VAL(mdf_Fon[1], "base_0.y") - 150 > VAR_VAL(idx_att_SbAperSD, "base_0.y") )
                     {
                      mdf_Ctrl_Sbordo_my_pdr = 1
                      mdf_basy_FonSc = VAR_VAL(mdf_Fon[1], "base_0.y")
                     }
                 // 06.05.2024 St502249
                  if ( VAR_VAL(mdf_Fon[1], "base_0.y") - 50 > VAR_VAL(idx_att_SbAperSD, "base_0.y")
                     & VAR_VAL(mdf_Fon[1], "base_0.y") - 180 < VAR_VAL(idx_att_SbAperSD, "base_0.y")
                     )
                     {
                      mdf_Ctrl_Sbordo_my_pdr = 1
                      mdf_basy_FonSc = VAR_VAL(mdf_Fon[1], "base_0.y")
                     }
                 }
             }
         // 19.04.2021 H21010429
          iCo=1
          while (iCo <= mdf_Cop)
             {
              if ( VAR_VAL(mdf_Cop[iCo], "alto_0.y") + mcb_LimCop_SboSc < VAR_VAL(idx_att_SbAperSD, "alto_0.y")
                 // 19.04.2021
                 & VAR_VAL(mdf_Cop[iCo], "alto_0.y") - 1 > VAR_VAL(idx_att_SbAperSD, "base_0.y")
                 )
                 {
                  mdf_Ctrl_Sbordo_my_pdr = 1
                  mdf_alty_CopSc = VAR_VAL(mdf_Cop[iCo], "alto_0.y")
                 }
              iCo = iCo+1
             }
         }

      if (mdf_Ctrl_Sbordo_my_pdr == 1)
         {
          mdf_alty_FiaDx = VAR_VAL(PADRE(idx_att_SbAperSD, -1), "alto_0.y")
          mdf_basy_FiaDx = VAR_VAL(PADRE(idx_att_SbAperSD, -1), "base_0.y")

          Bay_KFBX = VAR_VAL(idx_att_SbAperSD, "base_0.y")
          Aly_KFBX = VAR_VAL(idx_att_SbAperSD, "alto_0.y")

          mdf_diff_altalt_Dx = Aly_KFBX - mdf_alty_FiaDx
          mdf_diff_basbas_Dx = mdf_basy_FiaDx - Bay_KFBX

          if (mdf_diff_altalt_Dx == 0)
             {
              if (mdf_alty_CopSc < mdf_alty_FiaDx)
                 {
                  mdf_limaltyCop = 150
                  if (VAR_VAL(idx_att_SbAperSD, "MdF_Ctrl_Sbordo_Scocca") >= 2)  { mdf_limaltyCop = 300 }
                  if (mdf_alty_CopSc+mdf_limaltyCop > Aly_KFBX)
                     {
                      mdf_diff_altalt_Dx = Aly_KFBX - mdf_alty_CopSc
                     }
                 }
             }
          // 06.05.2024
          //if (mdf_basy_FonSc > 150)
          if (mdf_basy_FonSc > 100)
             {
              if (mdf_Fon > 0)
                 { mdf_diff_basbas_Dx = mdf_basy_FonSc - Bay_KFBX }
             }

          Y_SbAperSD = VAR_VAL(idx_att_SbAperSD, "Y")
          if ( mdf_diff_altalt_Dx > mdf_LimY_Con_Sbordo
             & mdf_diff_altalt_Dx <= Y_SbAperSD/3 + Y_SbAperSD/9
             )
             { mdf_SbordoYSup_Dx = mdf_diff_altalt_Dx }

          if ( mdf_diff_basbas_Dx > mdf_LimY_Con_Sbordo
             & mdf_diff_basbas_Dx <= Y_SbAperSD/3 + Y_SbAperSD/9
             )
             { mdf_SbordoYInf_Dx = mdf_diff_basbas_Dx }

          if (VAR_VAL(idx_att_SbAperSD, "MdF_Ctrl_Sbordo_Scocca") >= 2)
             {
              if ( mdf_diff_basbas_Dx > mdf_LimY_Con_Sbordo
                 & mdf_diff_basbas_Dx <= Y_SbAperSD/2 + Y_SbAperSD/9
                 )
                 { mdf_SbordoYInf_Dx = mdf_diff_basbas_Dx }
             }
         }
   }

   PROCEDURA MdF_get_Battuta_SX
   {
      CAM_Ang = ANG_TOT2(idx_att)
      Ba0_att = [base_0.x, 0, base_0.z]
      Ba0_att_allung = [base_0.x-100*COSENO(CAM_Ang), 0, base_0.z+100*SENO(CAM_Ang)]
      Ba3_att = [base_3.x, 0, base_3.z]
      Ba3_att_allung = [base_3.x+100*COSENO(CAM_Ang), 0, base_3.z-100*SENO(CAM_Ang)]

      Ba1_att = [base_1.x, 0, base_1.z]

      //- punti dell'elemento  trovato
      Ba0_fia = [#base_0.x, 0, #base_0.z]
      Ba1_fia = [#base_1.x, 0, #base_1.z]
      Ba2_fia = [#base_2.x, 0, #base_2.z]
      Ba3_fia = [#base_3.x, 0, #base_3.z]
      Bay_Fia = #base_0.y
      Aly_Fia = #alto_0.y

      // 16.05.2024 Come DX 009424
      // Sempre stato 5, ma in quest caso c'è una maniglia gola con un PanLatFineCompo da 12
      // Quindi Battuta_X 29.01
      // 23.05.2024 NM002921 potrebbe esserci il Taglio45 e se non c'è MdF_offx_REL_ADD non lo trova
      //X_add_Limite = 5+6.01
      X_add_Limite = 5+10+6.01

      dist_02 = DISTANZA(Ba0_att, Ba2_fia)
      dist_31 = DISTANZA(Ba3_att, Ba1_fia)

      Z_Fia = VAR_VAL(Fianchi_vic[iX], "Z")
      X_FiaVic = VAR_VAL(Fianchi_vic[iX], "X")
      X_Fia_BatSx = X_FiaVic
      CAM_AngFia = ANG_TOT2(Fianchi_vic[iX])

      if (dist_02 < dist_31)  { fia_Sx = 1 }
      else                    { fia_Dx = 1 }

      diff_BaFBaMy = Bay_Fia - base_0.y
      diff_BaFAlMy = Bay_Fia - alto_0.y
      diff_AlMBaFy = alto_0.y - Bay_Fia

      // +60 -> Se sporge appena. Piu che altro dipendente dalla grafica dei pezzi
      // esempio su fianco Ponte fatto da 2 pezzi una parte sotto magari metallica e la
      // parte sopra legno.
      // In ogni caso se un fianco ha solo 60mm in Y di battuta non può esser il fianco di battuta
      //diff_BaMAlFy = base_0.y - Aly_Fia
      diff_BaMAlFy = base_0.y - Aly_Fia + 60
      // 27.01.2025 PK2024TLS111116 Frontalino che sporge sopra
      if (Y < 129)
         {
          diff_BaMAlFy = base_0.y - Aly_Fia + 39
          // 28.01.2025
          if (Y < 99)
             { diff_BaMAlFy = base_0.y - Aly_Fia + 30 }
         }

      if (ABS(diff_BaFAlMy) < 10  |  ABS(diff_AlMBaFy) < 10)  { EXITSUB() }

      if (diff_BaMAlFy > 0)                                   { EXITSUB() }

     // 07.07.2023 Sc0122301986 MdF_ distNearBatFia 33.5 trova il pensile sopra che comunque avrebbe trovato anche con 10
      // solo che in questo caso il problema era che non calcolava lo SbordoYInf
      if (Bay_Fia-0.1 > alto_0.y)
         {
          if (Fianchi_vic > 1)
             {
              mdf_ErrBatt_FiaSupSx = Fianchi_vic[iX]
              EXITSUB()
             }
         }

      // Fianco inizia da sotto quindi tipo Ponte può andar bene ma non arriva a filo alto
      // Se fatalità metà Fianco parte sotto e arriva fino a metà dell' elemento che sta
      // verificando tale fianco, le condizioni precedenti non sono sufficienti
      mdf_FiaSxsfalsato = 0
      if (Bay_Fia+150 < base_0.y  &  Aly_Fia+150 < alto_0.y)
         { mdf_FiaSxsfalsato = 1 }

      if (Bay_Fia-150 > base_0.y  &  Aly_Fia-150 > alto_0.y)
         {
          mdf_FiaSxsfalsato = 2
          // 20.05.2020 anta inf colonna base_0_offset.y -165, ma anche cassettoInf H.536
          y_Fro = VAR_VAL(idx_att, "Y")
          if (y_Fro/3 > 150)
             {
              if (Bay_Fia-y_Fro/3 <= base_0.y  &  Aly_Fia > alto_0.y)
                 { mdf_FiaSxsfalsato = -2 }
             }
         }

      if (Bay_Fia+2 >= base_0.y  &  Aly_Fia-3 <= alto_0.y)
         {
          diff_AlMAlFy = alto_0.y - Aly_Fia
          y_Fro = VAR_VAL(idx_att, "Y")
         // Non ha senso uno sbordo di più di metaFrontale, perché l'anta sarebbe sbilanciata, significa che non è il fianco corretto da considerare
         // 03.02.2017 ma solo se l' anta sta in basso, altrimenti potrei essere un' anta mansardata
          if (base_0.y < 1000)
             {
              if (ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/2+1)
                 {
                  // 30.01.2019
                  mdf_ctrl_dFBS = idx_att
                  GOSUB MdF_Ctrl_doppioFia_Battuta_SX
                  if (mdf_doppio_fiaSx_inY_Battuta_X <= -1)
                     { EXITSUB() }
                 }
             }
          else
             {
              // 08.04.2019 C84331
              if ( ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/2+1
                 & ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) < y_Fro-50
                 )
                 {
                  mdf_ctrl_dFBS = idx_att
                  GOSUB MdF_Ctrl_doppioFia_Battuta_SX
                 }
             // 28.03.2025 A33574 Anta 1194, Fianco sotto 720, Fianco sopra 480. Deve trovare il fianco in basso come doppio fianco
              if ( ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/3-30
                 // 118 limite per farci stare una cerniera sarebbe 107, ma non ha senso impegnare un vano cosi piccolo per metterci anche la cerniera/basetta che occupa spazio.
                 // Se uno fa 2 scocche H.120 e anta unica non è apposto, ma comunque entrerebbe nel y_Fro/2
                 & ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) < y_Fro-118
                 & Fianchi_vic > 1
                 )
                 {
                  // Non servirebbe questa if ma la tengo
                  if (mdf_doppio_fiaSx_inY_Battuta_X == -1)
                     {
                      diff_BaFBaMy_diff_AlMAlFy = ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy)
                      mdf_ctrl_dFBS = idx_att
                      GOSUB MdF_Ctrl_doppioFia_Battuta_SX
                     }
                 }
              if (ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/2+y_Fro/20)
                 {
                  // 26.03.2019
                  mdf_ctrl_dFBS = idx_att
                  GOSUB MdF_Ctrl_doppioFia_Battuta_SX
                  if (mdf_doppio_fiaSx_inY_Battuta_X <= -1)
                     { EXITSUB() }
                 }
             }
         }

      if (mdf_FiaSxsfalsato > 0
         // Conttrollo che comunque non sia l' unico Fianco trovato perché magari c'è
         // una composizione Parete particolare e fatalità potrebbe rientrare in questa situazione
         & Fianchi_vic > 1
         )
         {
          mdf_sporgente = 0
          if (Fianchi_vic >= 2)
             {
              alty_Sc = VAR_VAL(PADRE(idx_att, -1), "alto_0.y")
              basy_Sc = VAR_VAL(PADRE(idx_att, -1), "base_0.y")
              if (alto_0.y-8 > alty_Sc)
                 {
                  mdf_sporgente = 1
                 }
              if (base_0.y+8 < basy_Sc)
                 {
                  mdf_sporgente = 2
                 }
              if (mdf_FiaSxsfalsato == 2)  { mdf_doppio_fiaSx_inY = Fianchi_vic[iX] }
              // 28.10.2020
              if (Aly_Fia-90 > base_0.y)
                 {
                  y_Fro = VAR_VAL(idx_att, "Y")
                  mdf_ctrl_dFBS = idx_att
                  GOSUB MdF_Ctrl_doppioFia_Battuta_SX
                 }
             }
          if (mdf_sporgente == 0)
             { EXITSUB() }
         }

      if (fia_Sx)
         {
          mdf_Battuta_SX_att = mdf_Battuta_SX

          Ba2_fia_MdF = [#base_2.x, 0, #base_2.z]
          mdf_Battuta_SX_dist = DISTANZA(Ba0_att, Ba2_fia_MdF)
          PointInterf_Sx = INTERFERISCI(Ba2_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
          // Bifacciale
          if (ABS(CAM_Ang-CAM_AngFia) == 180)
             {
              PointInterf_Sx = INTERFERISCI(Ba0_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
             }
          if (PointInterf_Sx.x>-1000001 & PointInterf_Sx.y>-1000001 & PointInterf_Sx.z>-1000001)
             {
              dist_0Pro_sx = DISTANZA(Ba0_att, PointInterf_Sx)
              dist_3Pro_dx = DISTANZA(Ba3_att, PointInterf_Sx)

              dist_0Pro_sx_SX = dist_0Pro_sx
              dist_3Pro_dx_SX = dist_3Pro_dx

              Proiez_fia_Sx = 0
              Proiez_fia_Dx = 0
              if (dist_0Pro_sx < dist_3Pro_dx)  { Proiez_fia_Sx = 1 }
              else                              { Proiez_fia_Dx = 1 }

             // 20.05.2025 Ca2518151
              if (Proiez_fia_Dx)
                 {
                  if ( dist_0Pro_sx > 50
                     & dist_3Pro_dx > 50
                     )
                     {
                      _deb_Proiez_fia_Sx = 1
                      // Se in RegFacc uso sempre Battuta_X_Sx devo mantenere il lato corretto
                      // SE_NUM(MdF_Verso=="SX",Battuta_X_Sx,X-Battuta_X_Dx-12)
                      // MdF_Apertura FISSO
                      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Verso"), "S*") )
                         {
                          // Vuol dire che il fianco è vicino al centro e probabilmente ne avrò 1 solo appunto al centro
                          // (può essere che trova piu di un Fianchi_vic perchè trova il figlio)
                          // Teoricamente questa if andrebbe tolta, ma per ora la tengo essendo il primo caso di sempre
                          // E forse nemmeno il controllo su MdF_Verso perchè comunque la Battuta_Sx è sempre da sinistra
                          // Anche se questa sarebbe piu una Battuta centrale e in altri Ambienti viene usata la Battuta centrale
                          if (dist_0Pro_sx-80 < dist_3Pro_dx)
                             {
                              _deb_Proiez_fia_Sx = 2
                              Proiez_fia_Sx = 1
                             }
                         }
                     }
                 }

             // 01.10.2020 Sn004005 Nel caso il Fianco non sia vicino al centro ma l' anta sborda (esempio di 82mm) dalla parte push
              // per chiudere un pilastro o un vano caldaia.
              // Tra l' altro nella procedura DX non c'e questo controllo e nemmeno nella SX_Gen
              //if ( dist_0Pro_sx-0.01-X/2-10 < dist_3Pro_dx
              //   & dist_0Pro_sx+0.01+X/2+10 > dist_3Pro_dx
              if ( dist_0Pro_sx-0.01 -4*X/5 -15 < dist_3Pro_dx
                 & dist_0Pro_sx+0.01 +4*X/5 +15 > dist_3Pro_dx
                 )
                 {
                  if ( dist_0Pro_sx < VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
                     | VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") == 0
                     )
                     {
                      if (dist_0Pro_sx > 30)
                         {
                          X_FiaBatDX_Cn = VAR_VAL(Fianchi_vic[iX], "X")
                          mdf_Battuta_X_DX_Pro_Cn = dist_0Pro_sx - X_FiaBatDX_Cn +0.01
                          mdf_idx_FiaBatDX_CnSX = Fianchi_vic[iX]
                         }
                     }

                  if ( dist_3Pro_dx < VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
                     | VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") == 0
                     )
                     {
                      if (dist_3Pro_dx > 30)
                         {
                          mdf_Battuta_X_SX_Pro_Cn = dist_3Pro_dx +0.01
                          X_FiaBatSX_Cn = VAR_VAL(Fianchi_vic[iX], "X")
                          mdf_idx_FiaBatSX_CnSX = Fianchi_vic[iX]
                         }
                     }
                 }

             // 04.03.2024 Sc1016058295
              mdf_find_SX_Cn = 0
              // Significa che ho 2 Fianchi centrali vicini a destra e entra quello piu esterno
              if ( dist_0Pro_sx < VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
                 & dist_0Pro_sx+50 < VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
                 )
                 {
                 // Per ora limitato e non come Dx perchè è il primo caso da 7 anni
                  if ( ABS(CAM_Ang-CAM_AngFia) == 180
                     | VAR_VAL(idx_att, "exitBattuta_DX") == -1
                     )
                     {
                      dist_0Pro_sx_att = dist_0Pro_sx
                      mdf_Battuta_X_SX_Pro_Cn_debSX = VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
                      mdf_Battuta_X_DX_Pro_Cn_debSX = VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
                      mdf_idx_FiaBatSX_CnSX_att = VAR_VAL(idx_att, "mdf_idx_FiaBatSX_CnSX")
                      mdf_find_SX_Cn = 2
                     // 04.09.2024 EM2024004901 La prima volta per forza non c'è exitBattuta_DX perchè deve ancora farla
                      if (VAR_VAL(idx_att, "exitBattuta_DX") == -1)
                         {
                          if (ABS(CAM_Ang-CAM_AngFia) != 180)
                             {
                              mdf_Battuta_X_SX_Pro_Cn_preDX = VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
                             }
                         }
                     }
                 }

              if (mdf_find_SX_Cn > 0)
                 {
                  if (dist_0Pro_sx > 30)
                     {
                      if (dist_0Pro_sx < X/2-80)
                         {
                          mdf_Battuta_X_SX_Pro_Cn_deb2 = mdf_Battuta_X_SX_Pro_Cn
                          mdf_idx_FiaBatSX_CnSX_att = VAR_VAL(idx_att, "mdf_idx_FiaBatSX_CnSX")
                          mdf_Battuta_X_SX_Pro_Cn = dist_0Pro_sx +0.01
                          mdf_idx_FiaBatSX_CnSX = Fianchi_vic[iX]
                          mdf_find_SX_Cn_att = mdf_find_SX_Cn
                         }
                     }
                 }
              // 04.03.2024 Sc1016058295
              if ( VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") < X/2
                 & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn")-1  < VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
                 & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn")+31 > VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
                 & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") > 30
                 & VAR_VAL(idx_att, "exitBattuta_DX") == -1
                 // Per ora limito a questo
                 & ABS(CAM_Ang-CAM_AngFia) == 180
                 )
                 {
                  X_FiaBatDX_Cn = VAR_VAL(Fianchi_vic[iX], "X")
                  mdf_Battuta_X_DX_Pro_Cn_attS = mdf_Battuta_X_DX_Pro_Cn
                  mdf_Battuta_X_DX_Pro_Cn_deb1S = mdf_Battuta_X_DX_Pro_Cn
                  dist_3Pro_dx_debS = dist_3Pro_dx
                  mdf_idx_FiaBatDX_CnSX = Fianchi_vic[iX]
                  mdf_Battuta_X_DX_Pro_Cn = dist_3Pro_dx +0.01
                 }

              if (Proiez_fia_Sx)
                 {
                  mdf_Battuta_X_Sx_Pro = dist_0Pro_sx +0.01

                  // Attenzione Ante interne ai fianchi
                  mdf_Battuta_SX_Pro = dist_0Pro_sx + 0.01

                  // 26.07.2017
                  // Avendo migliorato l' INTERFERISCI in Motore-M4 il risultato ora è piu preciso quindi se un elemento
                  // è a filo il risultato è effettivamente 0
                  // Il problema è che in M4 un valore è 0 se la fabs(result-parse_e())<0.01
                  // quindi se vale 0.01 in realtà l' if == 0 è vera perché appunto 0.01 è in realtà
                  // 0.00999999977648258209228515625
                  if (mdf_Battuta_X_Sx_Pro == 0)  { mdf_Battuta_X_Sx_Pro = mdf_Battuta_X_Sx_Pro + 0.000000001 }
                  if (mdf_Battuta_SX_Pro == 0)    { mdf_Battuta_SX_Pro = mdf_Battuta_SX_Pro + 0.000000001 }

                  if (dist_3Pro_dx > X)
                     {
                      mdf_Battuta_X_Sx_Pro = -1*mdf_Battuta_X_Sx_Pro
                      mdf_Battuta_SX_Pro = -1*mdf_Battuta_SX_Pro
                     }
                  // Attenzione angoli con anta interna
                  // ma anche per grafica anta sempre su angoli un po "a caso"
                  // Forse potrebbe anche entrare sempre se c'è l' interferisci
                  // ma proteggo per eventuali valori troppo grandi che non avrebbero senso
                  //if (ABS(mdf_Battuta_SX_Pro) <= #X+0.1)
                  if (ABS(mdf_Battuta_SX_Pro) <= X_FiaVic+X_add_Limite)
                     {
                      _debug_Pro_camang = CAM_Ang
                      _debug_Pro_camangfia = CAM_AngFia
                      _debug_Pro_fiaBatSx = Fianchi_vic[iX]

                      mdf_Sx_Pro_entra = 1
                      if ( ABS(mdf_Battuta_SX_Pro) < ABS(mdf_Battuta_SX)
                         & mdf_Battuta_SX_Pro < 0
                         & ABS(mdf_Battuta_SX) <= X_FiaVic+0.01
                         )
                         {
                          mdf_Sx_Pro_entra = -0.01
                         }

                      // 28.07.2020 preso da DX per Ce34363 e' presente una SchAttrez_Lamin che fa da Fianco e viene sentito il
                      // Fianco vicino che però parte 93mm piu in alto creado cosi uno SbordoYInf
                      if ( mdf_Battuta_SX == 0
                         & mdf_Battuta_SX_Pro < 0
                         & ABS(mdf_Battuta_SX_Pro) < 2
                         )
                         {
                          mdf_antTerm = 0
                          if ( ABS(CAM_Ang-CAM_AngFia) > 15
                             & ABS(CAM_Ang-CAM_AngFia) < 75
                             )
                             { mdf_antTerm = 1 }

                          mdf_antaInterna = 0
                          if (ABS(CAM_Ang-CAM_AngFia) == 0)
                             {
                              mdf_dist_12 = DISTANZA(Ba1_att, Ba2_fia)
                              mdf_dist_02 = DISTANZA(Ba0_att, Ba2_fia)
                              if (mdf_dist_12 < mdf_dist_02)
                                 {
                                  // Se c'e piu di 1.5 significa che non e' il mio fianco di Battuta interna, probabilmente non e' della mia scocca
                                  if (ABS(mdf_Battuta_SX_Pro) < 1.5)  { mdf_antaInterna = 1 }
                                  if (PADRE(idx_att, -1) == PADRE(Fianchi_vic[iX], -1))
                                     { mdf_antaInterna = 1.1 }
                                 }
                              // interna ma circa a meta rispetto allo spigolo fianco
                              if ( mdf_dist_12 < 15  &  mdf_dist_02 < 15
                                 & mdf_dist_12 > 5   &  mdf_dist_02 > 5
                                 )
                                 { mdf_antaInterna = 2 }

                              mdf_dist_01 = DISTANZA(Ba0_att, Ba1_fia)
                              if ( mdf_dist_02 == dist_0Pro_sx
                                 & mdf_dist_12 > X_FiaVic/2
                                 & mdf_dist_12 <= X_FiaVic-mdf_dist_02
                                 )
                                 { mdf_antaInterna = 3 }

                              // 04.12.2020
                              mdf_anp = 0
                              if (mdf_dist_12 < 2  &  mdf_dist_02 > 18  &   X_FiaVic > 100)  { mdf_anp = 1 }
                              if (mdf_dist_12 < 2  &  mdf_dist_02 > 18  &   X_FiaVic > 100)  { mdf_anp = 2 }
                              if (mdf_anp > 0)  { mdf_antaInterna = 0 }
                             }

                          if (mdf_antTerm == 0  &  mdf_antaInterna == 0)
                             { mdf_Sx_Pro_entra = -0.02 }
                         }

                      // Se ho gia trovato la battuta su un fianco e ne trovo
                      // un altro deve vincere quello piu vicino
                      if (VAR_EXIST(idx_att, "fiaBatSx") )
                         {
                          if (IS_IDX(fiaBatSx) )
                             {
                              if ( ABS(mdf_Battuta_SX_Pro) < ABS(mdf_Battuta_SX)
                                 & mdf_Battuta_SX_Pro < 0
                                 )
                                 {
                                  if (X_FiaBatSX > 1)
                                     {
                                      // 2 Fianchi di elementi diversi, quindi fianchi
                                      // con X diversa, la if sopra ABS(mdf_Battuta_SX) <= #X+0.01
                                      // potrebbe fallire
                                      if ( ABS(mdf_Battuta_SX) <= X_FiaBatSX+0.01
                                         & X_FiaVic + 1 < X_FiaBatSX
                                         )
                                         {
                                          mdf_Sx_Pro_entra = -0.03
                                          _deb_X_FiaSx_entra_X = X_FiaVic
                                          _deb_mdf_Battuta_SX_entra_X = mdf_Battuta_SX
                                         }
                                     }
                                 }
                              // 20.11.2023 H23000089_LIVINGROOM18 Ante a ELLE parte Sx piu grande parte Dx
                              // 2 Fianchi di elementi diversi con X diversa, uno sopra l' altro, ma non e' un doppio fianco di Battuta. Lo sente perchè l' ingombro a ELLE prende tutta la Y sia a dx che sx
                              if ( mdf_Battuta_SX_Pro+1 < mdf_Battuta_SX
                                 & mdf_Battuta_SX_Pro > X_FiaBatSX/2-1
                                 & mdf_Battuta_SX > X_FiaBatSX/2
                                 & X_FiaBatSX > 5
                                 & X_FiaVic + 1 < X_FiaBatSX
                                 // Visto che e' il primo caso lo limito
                                 & PADRE(Fianchi_vic[iX], -1) != PADRE(fiaBatSx, -1)
                                 & PADRE(fiaBatSx, -1) == PADRE(idx_att, -1)
                                 )
                                 {
                                  mdf_Sx_Pro_entra = -0.041
                                  _deb_X_FiaSx_entra_X = X_FiaVic
                                  _deb_mdf_Battuta_SX_entra_X = mdf_Battuta_SX
                                 }

                             // 03.06.2024 A 68413 come DX
                              if ( mdf_Battuta_SX_Pro+1 < mdf_Battuta_SX
                                 & mdf_Battuta_SX_Pro > X_FiaBatSX/2
                                 & mdf_Battuta_SX > X_FiaBatSX/2
                                 & X_FiaBatSX > 5
                                 & X_FiaVic <= X_FiaBatSX
                                 & PADRE(Fianchi_vic[iX], -1) != PADRE(fiaBatSx, -1)
                                 & PADRE(fiaBatSx, -1) == PADRE(idx_att, -1)
                                 )
                                 {
                                  mdf_Sx_Pro_entra = -0.042
                                  _deb_X_FiaSx_entra_X = X_FiaVic
                                  _deb_mdf_Battuta_SX_entra_X = mdf_Battuta_SX
                                 }

                             // 11.07.2024 A050222 come DX
                              if ( mdf_Battuta_SX_Pro+1 < mdf_Battuta_SX
                                 & mdf_Battuta_SX_Pro > X_FiaBatSX/2-3
                                 & mdf_Battuta_SX_Pro < X_FiaBatSX/2+1
                                 & mdf_Battuta_SX > X_FiaBatSX/2
                                 & X_FiaBatSX > 5
                                 & X_FiaVic <= X_FiaBatSX
                                 & mdf_Battuta_SX < X_FiaBatSX
                                 & PADRE(Fianchi_vic[iX], -1) != PADRE(fiaBatSx, -1)
                                 & PADRE(fiaBatSx, -1) == PADRE(idx_att, -1)
                                 )
                                 {
                                  mdf_Sx_Pro_entra = -0.043
                                  _deb_X_FiaSx_entra_X = X_FiaVic
                                  _deb_mdf_Battuta_SX_entra_X = mdf_Battuta_SX
                                 }

                              if ( ABS(mdf_Battuta_SX_Pro) > ABS(mdf_Battuta_SX)
                                 & mdf_Battuta_SX_Pro < 0
                                 & mdf_Battuta_SX > 1
                                 )
                                 {
                                  if ( X_FiaBatSX > 1
                                     & ABS(mdf_Battuta_SX_Pro) > X_FiaBatSX/2
                                     & ABS(mdf_Battuta_SX) < X_FiaBatSX/2
                                     )
                                     {
                                      mdf_Sx_Pro_entra = -0.04
                                      _deb_X_FiaSx_entra_X2 = X_FiaVic
                                      _deb_mdf_Battuta_SX_entra_X2 = mdf_Battuta_SX
                                     }
                                  // 04.03.2020 S000643 Battuta_SX
                                  // mdf_distNearBatFia = 28.1 nel caso di GolaVert, ma composizione un po' subdola
                                  // e quindi trova anche il Fianco vicino del riempitivo e si accorge che ha gia un Fianco di Battuta corretto
                                  if ( X_FiaBatSX > 1
                                     & ABS(mdf_Battuta_SX_Pro) > X_FiaBatSX+0.1
                                     & ABS(mdf_Battuta_SX) <= X_FiaBatSX+0.1
                                     & ABS(mdf_Battuta_SX) > X_FiaBatSX/2
                                     & mdf_Battuta_SX_Pro < -X_FiaBatSX/2
                                     )
                                     {
                                      mdf_Sx_Pro_entra = -0.05
                                      _deb_X_FiaSx_entra_distNear = X_FiaVic
                                      _deb_mdf_Battuta_SX_entra_distNear = mdf_Battuta_SX
                                     }
                                 }

                              if ( ABS(mdf_Battuta_SX_Pro) > X_FiaVic-1
                                 & ABS(mdf_Battuta_SX) < X_FiaVic/2
                                 & ABS(mdf_Battuta_SX_Pro - mdf_Battuta_SX) < X_FiaVic+0.01
                                 )
                                 {
                                  // 23.11.2020 Come Gen anche se qui non si presentava
                                  if (ABS(mdf_Battuta_SX_Pro) > X_FiaVic+mdf_Battuta_SX+0.02)
                                     {
                                      mdf_Sx_Pro_entra = -0.06
                                      _deb_mdf_Battuta_SX_entra1 = mdf_Battuta_SX
                                      _deb_mdf_Battuta_SX_Pro_entra1 = mdf_Battuta_SX_Pro
                                      _deb_idx_Sx_Pro_entra1 = Fianchi_vic[iX]
                                     }
                                 }
                              if ( ABS(mdf_Battuta_SX_Pro) > X_FiaVic+0.02
                                 & ABS(mdf_Battuta_SX) < X_FiaVic/2
                                 )
                                 {
                                  // 23.11.2020 Come Gen anche se qui non si presentava
                                  if (ABS(mdf_Battuta_SX_Pro) > X_FiaVic+mdf_Battuta_SX+0.02)
                                     {
                                      mdf_Sx_Pro_entra = -0.07
                                      _deb_X_Fia_entra2 = X_FiaVic
                                      _deb_mdf_Battuta_SX_Pro_entra2 = mdf_Battuta_SX_Pro
                                      _deb_idx_Sx_Pro_entra2 = Fianchi_vic[iX]
                                      // 20.05.2025 A079453 entra prima il fianco piu a destra e battuta è -1.50902
                                      // L' anta però sborda leggermente fuori al Fianco corretto
                                      if ( mdf_Battuta_SX < 0
                                         & mdf_Battuta_SX_Pro > X_FiaVic
                                         // Arrivo gia che ABS(mdf_Battuta_SX_Pro) <= X_FiaVic+X_add_Limite, quindi piuttosto di prendere Battuta negativa meglio positiva
                                         )
                                         {
                                          if (ABS(CAM_Ang-CAM_AngFia) < 1)
                                             {
                                              mdf_Sx_Pro_entra = 1.07
                                             }
                                         }
                                     }
                                 }
                              // 01.09.2020 Come DX
                              if ( ABS(mdf_Battuta_SX_Pro - mdf_Battuta_SX) <= X_FiaVic+0.1
                                 & mdf_Battuta_SX > X_FiaVic/2+1
                                 & mdf_Battuta_SX_Pro < X_FiaVic/2-1
                                 & mdf_Battuta_SX_Pro > 0
                                 )
                                 {
                                  mdf_Sx_Pro_entra = -0.08
                                  _deb_mdf_Battuta_SX_entra4 = mdf_Battuta_SX
                                  _deb_mdf_Battuta_SX_Pro_entra4 = mdf_Battuta_SX_Pro
                                  _deb_idx_Sx_Pro_entra4 = Fianchi_vic[iX]
                                 }

                             // 23.03.2023 La03678
                              mdf_offx_REL_ADD_att = VAR_VAL(idx_att, "MdF_offx_REL_ADD")
                              if (IS_MATCH(NOME(idx_att), "MdF*") )
                                 {
                                  if (mdf_offx_REL_ADD_att == 0)
                                     {
                                      mdf_offx_REL_ADD_att = VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD")
                                     }
                                 }

                              // 01.09.2020
                              if ( ABS(mdf_Battuta_SX_Pro - mdf_Battuta_SX) <= X_FiaVic+0.1+2.5+mdf_offx_REL_ADD_att
                                 & mdf_Battuta_SX > X_FiaVic/2+1
                                 & mdf_Battuta_SX_Pro < 1
                                // 23.03.2023 La03678
                                 //& mdf_Battuta_SX_Pro >= 0
                                 & mdf_Battuta_SX_Pro >= -1.6
                                 )
                                 {
                                  mdf_Sx_Pro_entra = -0.09
                                  _deb_mdf_Battuta_SX_entra5 = mdf_Battuta_SX
                                  _deb_mdf_Battuta_SX_Pro_entra5 = mdf_Battuta_SX_Pro
                                  _deb_idx_Sx_Pro_entra5 = Fianchi_vic[iX]
                                 }

                             // 06.03.2018
                              cam_ang_Fro = ANG_TOT(idx_att)
                              cam_ang_Fia = ANG_TOT(Fianchi_vic[iX])
                              cam_case_angFroFia = 0
                              if (ABS(cam_ang_Fro-cam_ang_Fia) > 15  &  ABS(cam_ang_Fro-cam_ang_Fia) < 75)
                                 { cam_case_angFroFia = 1 }
                             // 27.11.2019
                              if (cam_ang_Fro < -180  &  cam_ang_Fia > 0)
                                 {
                                  if (ABS(cam_ang_Fia+cam_ang_Fro) > 15  &  ABS(cam_ang_Fia+cam_ang_Fro) < 75)
                                     { cam_case_angFroFia = 2 }

                                  // MO0189254 angolo tra Fia e Fro 135, non ha senso
                                  if (ABS(cam_ang_Fia+cam_ang_Fro) > 105  &  ABS(cam_ang_Fia+cam_ang_Fro) < 165)
                                     {
                                      cam_case_angFroFia = 3
                                      if ( ABS(mdf_Battuta_SX_Pro) > VAR_VAL(idx_att, "X_FiaBatSX")/2
                                         & mdf_Battuta_SX < -1
                                         & ABS(mdf_Battuta_SX) < ABS(mdf_Battuta_SX_Pro)
                                         & ABS(mdf_Battuta_SX) < VAR_VAL(idx_att, "X_FiaBatSX")
                                         )
                                         {
                                          if (dist_3Pro_dx > X*ABS(SENO(CAM_Ang-CAM_AngFia)) )
                                             {
                                              mdf_Sx_Pro_entra = -2.1
                                              _debSx_dist_3Pro_dx = dist_3Pro_dx
                                              _debSx_seno_X = X*ABS(SENO(CAM_Ang-CAM_AngFia))
                                             }
                                         }
                                     }
                                 }

                              if (cam_case_angFroFia > 0)
                                 {
                                  if ( ABS(mdf_Battuta_SX_Pro) > VAR_VAL(idx_att, "X_FiaBatSX")
                                     & mdf_Battuta_SX < -1
                                     & ABS(mdf_Battuta_SX) < ABS(mdf_Battuta_SX_Pro)
                                     & ABS(mdf_Battuta_SX) < VAR_VAL(idx_att, "X_FiaBatSX")
                                     )
                                     {
                                      if ( dist_3Pro_dx > X*ABS(SENO(CAM_Ang-CAM_AngFia))
                                         & ABS(mdf_Battuta_SX_Pro) > mdf_distNearBatFia+3
                                         )
                                         {
                                          mdf_Sx_Pro_entra = -2
                                          _deb_X_Fia_entraAng = #X
                                          _deb_mdf_Battuta_SX_Pro_entraAng = mdf_Battuta_SX_Pro
                                          _deb_idx_Sx_Pro_entraAng = Fianchi_vic[iX]
                                         }
                                     }
                                 }
                              // 16.05.2019 H19019537 vedi DX
                              // In pratica, come ingombri, fianchi sovrapposti in y
                              if (ABS(mdf_Battuta_SX_Pro) == ABS(mdf_Battuta_SX) )
                                 {
                                  mdf_basy_FroSx = VAR_VAL(idx_att, "base_0.y")
                                  mdf_alty_FroSx = VAR_VAL(idx_att, "alto_0.y")
                                  mdf_basy_fiaBatSx = VAR_VAL(fiaBatSx, "base_0.y")
                                  mdf_alty_fiaBatSx = VAR_VAL(fiaBatSx, "alto_0.y")
                                  mdf_basyFia_ctrl_Sx = VAR_VAL(Fianchi_vic[iX], "base_0.y")
                                  mdf_altyFia_ctrl_Sx = VAR_VAL(Fianchi_vic[iX], "alto_0.y")

                                  //DISPLAY2(STRCAT("fiaBatSx ", STR(fiaBatSx), " Fianchi_vic[iX]=", STR(Fianchi_vic[iX])))
                                  if ( mdf_basy_fiaBatSx+200 > mdf_basy_FroSx
                                     & mdf_alty_fiaBatSx-200 < mdf_alty_FroSx
                                     & mdf_alty_fiaBatSx+200 > mdf_alty_FroSx
                                     & mdf_basy_fiaBatSx-200 > mdf_basyFia_ctrl_Sx
                                     )
                                     {
                                      if (mdf_basyFia_ctrl_Sx+200 < mdf_basy_FroSx)
                                         {
                                          // 13.04.2023 Sc1023019579 positivo contro negativa ma fatalita uguali per ricerca MdF_ distNearBatFia 33.5
                                          if (mdf_Battuta_SX_Pro <= mdf_Battuta_SX)
                                             {
                                              mdf_Sx_Pro_entra = -3
                                              _deb_mdf_Battuta_SX_Pro_sovrap_sfals = mdf_Battuta_SX_Pro
                                              _deb_idx_Sx_Pro_entra_sovrap_sfals = Fianchi_vic[iX]
                                             }
                                         }
                                     }
                                 }
                              // 06.11.2019 1018047858 come procedura _Gen
                              if ( mdf_Battuta_SX > mdf_Battuta_SX_Pro
                                 & mdf_Battuta_SX <= VAR_VAL(fiaBatSx, "X")+0.1
                                 & mdf_Battuta_SX > VAR_VAL(fiaBatSx, "X")/2
                                 & ABS(mdf_Battuta_SX_Pro) < 1.1
                                 & mdf_Battuta_SX_Pro > 0
                                 )
                                 { mdf_Sx_Pro_entra = -4 }

                              // 31.07.2020 simile a dx
                              // Fianchetto riempitivo, per qualche motivo calcola una Battuta di 5.83116
                              // Comunque deve vincere il fianco piu interno se ho gia una Battuta interna
                              if ( mdf_Battuta_SX > VAR_VAL(idx_att, "X_FiaBatSX")/2
                                 & mdf_Battuta_SX < VAR_VAL(idx_att, "X_FiaBatSX")
                                 & mdf_Battuta_SX_Pro > 1
                                 & mdf_Battuta_SX_Pro < mdf_Battuta_SX/2
                                 & mdf_Battuta_SX_Pro < X_FiaVic/2
                                 )
                                 { mdf_Sx_Pro_entra = -5 }

                              // 15.07.2022 St270954 Pens anta diag sente i 2 fianchi a sinistra che non sono a tutta altezza e quindi trovava uno SbordoYInf
                              if ( mdf_Battuta_SX_Pro < 0
                                 & mdf_Battuta_SX > X_FiaVic
                                 & mdf_Battuta_SX < X_FiaVic+4
                                 )
                                 {
                                  if (ABS(cam_ang_Fro-cam_ang_Fia) > 30  &  ABS(cam_ang_Fro-cam_ang_Fia) < 60)
                                     { mdf_Sx_Pro_entra = -5.1 }
                                 }
                             }
                         }

                      // Problema sweep figlio di Fiancone
                      // Non può esistere una Battuta>50
                      if (ABS(mdf_Battuta_SX_Pro) > mdf_distNearBatFia+50)
                         {
                          _debug_fiaBatSx_sweep = Fianchi_vic[iX]
                          mdf_Sx_Pro_entra = -1
                         }
                     // 23.11.2023 AOCL162757 capita in fase di caricamento ordine, ma non puo essere anche perche la X Fiancone poi la vedo a 18.
                      // La Battuta mdf_Battuta_SX_Pro semmai doveva essere negativa -1.5
                      // sente la ScoccaT_BaseFianco (Fiancone) 30.51 > 10+15
                      if ( ABS(mdf_Battuta_SX_Pro) > mdf_distNearBatFia+15
                         & ABS(mdf_Battuta_SX_Pro) > mdf_Battuta_SX
                         & mdf_Battuta_SX > 10
                         & mdf_Battuta_SX < mdf_distNearBatFia+15
                         )
                         {
                          _debug_fiaBatSx_Fiancone = Fianchi_vic[iX]
                          mdf_Sx_Pro_entra = -1.1
                         }

                     // 24.11.2023 Ce004158 Se trova la Battuta da mdf_proseg_BattSxDist e poi arriva il Fianco piu esterno
                      // con Battuta_X -1.5 sopra ABS(mdf_Battuta_SX) <= #X+0.01 fallisce perchè mdf_distNearBatFia e' stata
                      // impostata con valore maggiore di X_Fia
                      // Capita se mdf_distNearBatFia > 20
                      // Con Battuta_X_Sx < 2 poi rientrava in MdF_KeyFam_Battuta_X impostando mdf_ctrl_Fia_VaRi=1
                      // e quindi ritentava di calcolare la Battuta_X ma comunque senza successo
                      if ( mdf_Battuta_SX_Pro < 0
                         & mdf_Battuta_SX > mdf_distNearBatFia-10
                         & mdf_Battuta_SX < mdf_distNearBatFia+5
                         // Cosi so che entra qui se non e' gia entrato negli altri controlli
                         & mdf_Sx_Pro_entra > 0
                         )
                         {
                          _debug_fiaBatSx_FiaVic = Fianchi_vic[iX]
                          mdf_Sx_Pro_entra = -1.2
                         }

                     // 16.03.2022 Anta che sporge sotto ma di sostituzione con Fianco Scocca Sost che non sporge sotto come il fianco attivo della Scocca vicina
                      if (STRCMP(VAR_VAL_STR(PADRE(Fianchi_vic[iX], -1), "ORD_SOSTP"), "1") == 0)
                         {
                          if ( STRCMP(VAR_VAL_STR(Fianchi_vic[iX], "ORD_SOST"), "0") == 0
                             | STRCMP(VAR_VAL_STR(Fianchi_vic[iX], "ORD_SOST"), "") == 0
                             )
                             {
                              if (Fianchi_vic > 2)
                                 {
                                 // 06.06.2022 S049859, Sc0322019595 contro EM1052473
                                  if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "SX*") )
                                     {
                                      // 29.07.2022 Sc1021159019
                                      //if ( VAR_VAL(idx_att, "Y") > 500
                                      if ( VAR_VAL(idx_att, "Y") > 800
                                         & VAR_VAL(idx_att, "base_0.y") < 250
                                         )
                                         { mdf_Sx_Pro_entra = -6 }
                                     }
                                 }
                             }
                         }

                      if ( mdf_Battuta_SX == 0
                         | mdf_Sx_Pro_entra > 0
                         )
                         {
                          // 28.07.2020 Ce34363 e' presente una SchAttrez_Lamin che fa da Fianco e viene sentito il
                          // Fianco vicino che però parte 93mm piu in alto creado cosi uno SbordoYInf
                          mdf_Battuta_SX_OK = 1
                          if ( mdf_Battuta_SX == 0
                             & mdf_Sx_Pro_entra < 0
                             & ABS(mdf_Battuta_SX_Pro) < 2
                             & mdf_Battuta_SX_Pro < 0
                             )
                             {
                              // 04.02.2021 Per ora e' puntuale. In pratica in H mi dicono che puo esserci una Battuta di -1.5 o -2
                              // quindi il caso di Ce34363 devo rivederlo. Si risolverebbe mettendo SchAttrez_Lamin come MCB_archetipo_Fia_2 o 3
                              NEAR_GLOBALE("SchFia_vic", idx_att, 3, 1, "SchAttr*")
                              miSc = 1
                              mSch_Fia = 0
                              while (miSc <= SchFia_vic)
                                 {
                                  mbasySF = VAR_VAL(SchFia_vic[miSc], "base_0.y")
                                  maltySF = VAR_VAL(SchFia_vic[miSc], "alto_0.y")

                                  if ( mbasySF-20 < base_0.y
                                     & maltySF+20 > alto_0.y
                                     )
                                     { mSch_Fia = 1 }

                                  miSc = miSc+1
                                 }
                              if (mSch_Fia == 1)  { mdf_Battuta_SX_OK = 0 }
                             }

                          // 06.08.2020 come dx
                          // mdf_distNearBatFia 28.1 per trovare fianco Gola, ma grafica colonna errata senza fianco, trova il Fianco della Colonna accanto
                          // 18.07.2023 se c'e un fianchetto in mezzo anche se non considerato come archetipo Battuta la distanza con l' altro fianco era di -17.xx e quindi veniva presa quella al posto di + 16.51
                          // Potrei fare anche -1*(2*X_FiaVic/3), ma dato che e' la prima volta dopo il 2020 tengo un po' di margine
                          //if (mdf_Battuta_SX_Pro < -1*(X_FiaVic+1.5))
                          if (mdf_Battuta_SX_Pro < -1*(X_FiaVic-1.6))
                             { mdf_Battuta_SX_OK = mdf_Battuta_SX_Pro }

                         // 21.02.2022 HN22004734
                          if ( mdf_Battuta_SX_Pro+6 > X_Fia_BatSx/2
                             & mdf_Battuta_SX_Pro-6 < X_Fia_BatSx/2
                             )
                             {
                              if ( ABS(VAR_VAL(idx_att, "MdF_angoloBas")) > 89
                                 & ABS(VAR_VAL(idx_att, "MdF_angoloBas")) < 91
                                 )
                                 {
                                  mdf_idxFiaSx_ctrl = Fianchi_vic[iX]
                                  mdfxfro = VAR_VAL(idx_att, "X")
                                  // MdF_distNearBatFia è a 11.05
                                  // Tramezza o Divisorio attrezzatura interna
                                  // 12.12.2023 da 130 a 99
                                  if (mdfxfro+99 < VAR_VAL(PADRE(mdf_idxFiaSx_ctrl, 2), "X") )
                                     {
                                      NEAR_GLOBALE("mdf_TramDiv", idx_att, 9.5, 1, NOME(mdf_idxFiaSx_ctrl))
                                      if (mdf_TramDiv == 0)
                                         { mdf_Battuta_SX_OK = -999 }
                                     }
                                 }
                             }

                         // 25.02.2022 Sc1052368 come Dx
                          if (mdf_Sx_Pro_entra == -0.02)
                             {
                              mbasyF = VAR_VAL(Fianchi_vic[iX], "base_0.y")
                              maltyF = VAR_VAL(Fianchi_vic[iX], "alto_0.y")

                              mbasyatt = VAR_VAL(idx_att, "base_0.y")
                              maltyatt = VAR_VAL(idx_att, "alto_0.y")

                              if ( mbasyF-80 > mbasyatt
                                 & maltyF+80 < maltyatt
                                 )
                                 { mdf_Battuta_SX_OK = mdf_Sx_Pro_entra }
                             }

                          // 16.10.2024 PK2024OVB646900 come DX
                          // 30.10.2024 M012978 Cabina, anta Diagonale Battuta_X -11
                          if (ABS(CAM_Ang-CAM_AngFia) < 1)
                             {
                              // 08.04.2025 H25011841 anta interna fianco solo da una parte
                              //if (mdf_Battuta_SX_Pro <= -2)  { mdf_Battuta_SX_OK = -222 }
                              if (mdf_Battuta_SX_Pro <= -2.5)  { mdf_Battuta_SX_OK = -222 }
                             }

                          if (mdf_Battuta_SX_OK > 0)
                             {
                              _debug_camang = CAM_Ang
                              _debug_camangfia = CAM_AngFia
                              _debug_fiaBatSx = Fianchi_vic[iX]
                              fiaBatSx = Fianchi_vic[iX]
                              X_FiaBatSX = VAR_VAL(Fianchi_vic[iX], "X")
                              mdf_Battuta_SX = mdf_Battuta_SX_Pro
                              // 24.05.2019 per Ferramente, vedi 21.03.2019
                              if ( ABS(Battuta_X_Sx) > mdf_Battuta_SX
                                 // 20.07.2020 Sn001820, Ca1851074, Ca1823076
                                 //& ABS(Battuta_X_Sx) > 30
                                 & ABS(Battuta_X_Sx) > X_FiaBatSX+1
                                 )
                                 {
                                  Battuta_X_Sx = mdf_Battuta_SX
                                  mdf_Battuta_X = mdf_Battuta_SX
                                 }
                             // 20.01.2025 Come Dx
                              if ( Battuta_X_Sx == 0
                                 & mdf_Battuta_SX < X_FiaBatSX+1
                                 & mdf_Battuta_SX > 1
                                 )
                                 {
                                  Battuta_X_Sx = mdf_Battuta_SX
                                 }
                             // 24.11.2021 ScEM2021007619 MdF_distNearBatFia 33.5 in caso di Fia gola, quindi pensile meno profonodo in z trova anche
                              // il Fianco colonna vicino piu profondo. Per sfiga la Battuta_X e' uguale ma negativa.
                              // Vedi commento nella proc globale
                              if (ABS(Battuta_X_Sx) == ABS(mdf_Battuta_SX) )
                                 {
                                  if ( mdf_Battuta_SX > 10
                                     & Battuta_X_Sx < 10
                                     )
                                     {
                                      Battuta_X_Sx = mdf_Battuta_SX
                                      mdf_Battuta_X = mdf_Battuta_SX
                                     }
                                 }

                             // 28.10.2016
                              PointInterf_Sx_Z = INTERFERISCI(Ba1_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
                              // Bifacciale
                              if (ABS(CAM_Ang-CAM_AngFia) == 180)
                                 {
                                  PointInterf_Sx_Z = INTERFERISCI(Ba3_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
                                  // 02.03.2020
                                  dist_3Pro_sx_Z_180 = DISTANZA(Ba3_fia, PointInterf_Sx_Z)
                                 // 20.07.2023
                                  if (dist_3Pro_sx_Z_180 < 40  &  dist_3Pro_sx_Z_180 > 0)  { Battuta_Z_Sx = dist_3Pro_sx_Z_180 }
                                  if (dist_3Pro_sx_Z_180 < 3   &  dist_3Pro_sx_Z_180 > 0)  { Battuta_Z    = dist_3Pro_sx_Z_180 }
                                 }
                              if (PointInterf_Sx_Z.x>-1000001 & PointInterf_Sx_Z.y>-1000001 & PointInterf_Sx_Z.z>-1000001)
                                 {
                                  dist_1Pro_sx_Z = DISTANZA(Ba1_fia, PointInterf_Sx_Z)
                                 // 20.07.2023
                                  if (dist_1Pro_sx_Z < 40)  { Battuta_Z_Sx = dist_1Pro_sx_Z }

                                  if (dist_1Pro_sx_Z < 3)
                                     {
                                      Battuta_Z = dist_1Pro_sx_Z
                                     }
                                  else
                                     {
                                      // 19.01.2021
                                      // Fianchi ridotti con GolaVert
                                      if (IS_IDX(Fianchi_vic[iX]) )
                                         {
                                          mZF = VAR_VAL(Fianchi_vic[iX], "Z")
                                          mZFia = VAR_VAL(Fianchi_vic[iX], "ZFia")
                                          mZ_ori = VAR_VAL(Fianchi_vic[iX], "Z_ori")
                                          mORD_Z = VAR_VAL(Fianchi_vic[iX], "ORD_Z")

                                          mZfiaOrig_ToCtrl = mZFia
                                          if (mZfiaOrig_ToCtrl == 0)  { mZfiaOrig_ToCtrl = mZ_ori }
                                          if (mZfiaOrig_ToCtrl > 100)
                                             {
                                              mdiff_ZGola = mZfiaOrig_ToCtrl-mZF
                                             // 20.07.2023
                                              if (ABS(dist_1Pro_sx_Z-mdiff_ZGola) < 40)  { Battuta_Z_Sx = dist_1Pro_sx_Z-mdiff_ZGola }
                                              if (ABS(dist_1Pro_sx_Z-mdiff_ZGola) < 3)   { Battuta_Z    = dist_1Pro_sx_Z-mdiff_ZGola }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                  else
                     {
                      // 21.03.2019
                      // Anta Armadio non-battente che sporge di 55mm. Si vuole avere la BattutaX su Fianco
                      mdf_proseg_BattSxDist = -0.1
                      if ( ABS(mdf_Battuta_SX_Pro) < mdf_distNearBatFia+20
                         & ABS(mdf_Battuta_SX_Pro) > 35
                         & mdf_distNearBatFia > 40
                         )
                         { mdf_proseg_BattSxDist = 1 }

                      // 19.05.2021
                      if (VAR_VAL(idx_att, "MdF_Battuta_X_SbordoX") >= 30)
                         { mdf_proseg_BattSxDist = 2 }

                      if (mdf_proseg_BattSxDist > 0)
                         {
                          // 08.01.2024 doppio Fianco sx. Esempio anta trapezio che prende piu scocche, ci sono FiaDx e FiaSx vicini di scocche diverse
                          mdf_proseg_BattSx_Trap = 0
                          if ( mdf_Battuta_SX > 50
                             & mdf_Battuta_SX_Pro > mdf_Battuta_SX
                             & mdf_Battuta_SX_Pro-30 < mdf_Battuta_SX
                             )
                             {
                              mdf_proseg_BattSx_Trap = 1
                             }

                          // 11.10.2023 A142585 Anta Pensile Cappa con Riempitivi ai lati senza fianchi. Se prima trovava i Fianchi dei pensili vicini
                          // con battuta negativa poi non entrava piu qui
                          //if (mdf_Battuta_SX == 0)
                          if ( mdf_Battuta_SX <= 0
                             | mdf_proseg_BattSx_Trap > 0
                             )
                             {
                              if (X_FiaVic < 50)
                                 {
                                  mdf_proseg_BattSxDist = 0
                                  if ( IS_MATCH(MdF_Apertura, "S*") != 1
                                     & IS_MATCH(MdF_Apertura, "D*") != 1
                                     )
                                     { mdf_proseg_BattSxDist = 1 }

                                  // 19.05.2021
                                  if (VAR_VAL(idx_att, "MdF_Battuta_X_SbordoX") >= 30)
                                     { mdf_proseg_BattSxDist = 2 }

                                 // 23.02.2024 Come Dx
                                  if (ABS(mdf_Battuta_SX_Pro) < mdf_distNearBatFia+5)
                                     {
                                      // Per ora limito, perchè altrimenti sarebbe una Battuta centrale.
                                      // Eventualmente impostare MdF_Battuta_X_SbordoX su VariabiliMdF cosi entra nella riga sopra
                                      // 20.01.2025
                                      //if ( mdf_Battuta_SX_Pro < 60
                                      // 22.01.2025 PK2024OVB648129 Finche non fa casino aumento
                                      //if ( mdf_Battuta_SX_Pro < 70
                                      if ( mdf_Battuta_SX_Pro < 95
                                         // 16.12.2024 PK2023TGM629534_2412 troppo negativa non ha senso, il Fianco non sta dietro all' anta
                                         & mdf_Battuta_SX_Pro > -40
                                         )
                                         { mdf_proseg_BattSxDist = 3 }
                                     }

                                  if (mdf_proseg_BattSxDist > 0)
                                     {
                                      _debug_fiaSxdistNear = Fianchi_vic[iX]
                                      fiaBatSx = Fianchi_vic[iX]
                                      X_FiaBatSX = VAR_VAL(Fianchi_vic[iX], "X")

                                      mdf_Battuta_SX = mdf_Battuta_SX_Pro
                                      mdf_Battuta_X = mdf_Battuta_SX
                                      mdf_Battuta_X_Sx = mdf_Battuta_SX

                                      PointInterf_Sx_Z = INTERFERISCI(Ba1_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
                                      // Bifacciale
                                      if (ABS(CAM_Ang-CAM_AngFia) == 180)
                                         {
                                          PointInterf_Sx_Z = INTERFERISCI(Ba3_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
                                          // 02.03.2020
                                          dist_3Pro_sx_Z_180 = DISTANZA(Ba3_fia, PointInterf_Sx_Z)
                                             // 20.07.2023
                                          if (dist_3Pro_sx_Z_180 < 40  &  dist_3Pro_sx_Z_180 > 0)  { Battuta_Z_Sx = dist_3Pro_sx_Z_180 }
                                          if (dist_3Pro_sx_Z_180 < 3   &  dist_3Pro_sx_Z_180 > 0)  { Battuta_Z    = dist_3Pro_sx_Z_180 }
                                         }
                                      if (PointInterf_Sx_Z.x>-1000001 & PointInterf_Sx_Z.y>-1000001 & PointInterf_Sx_Z.z>-1000001)
                                         {
                                          dist_1Pro_sx_Z = DISTANZA(Ba1_fia, PointInterf_Sx_Z)
                                         // 20.07.2023
                                          if (dist_1Pro_sx_Z < 40)  { Battuta_Z_Sx = dist_1Pro_sx_Z }
                                          if (dist_1Pro_sx_Z < 3)   { Battuta_Z    = dist_1Pro_sx_Z }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
              else
                 {
                  // 20.09.2019
                  // Fianco al centro. Si vuole avere la BattutaX su Fianco per le Ferramente
                  if ( ABS(mdf_Battuta_SX_dist) < mdf_distNearBatFia+70
                     & ABS(mdf_Battuta_SX_dist) > 35
                     & ABS(mdf_Battuta_SX_dist) > X/2
                     & mdf_distNearBatFia > X/4
                     )
                     {
                      if ( mdf_Battuta_SX == 0
                         & VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") > 0
                         )
                         {
                          xfia = VAR_VAL(Fianchi_vic[iX], "X")
                          if (xfia < 50)
                             {
                              if ( IS_MATCH(MdF_Apertura, "S*") != 1
                                 & IS_MATCH(MdF_Apertura, "D*") != 1
                                 )
                                 {
                                  _debug_fiaSxdistNear = Fianchi_vic[iX]
                                  fiaBatSx = Fianchi_vic[iX]
                                  X_FiaBatSX = VAR_VAL(Fianchi_vic[iX], "X")

                                  mdf_Battuta_SX = mdf_Battuta_X_SX_Pro_Cn + X_FiaBatSX
                                  mdf_Battuta_X = mdf_Battuta_SX
                                  mdf_Battuta_X_Sx = mdf_Battuta_SX

                                  PointInterf_Sx_Z = INTERFERISCI(Ba1_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
                                  // Bifacciale
                                  if (ABS(CAM_Ang-CAM_AngFia) == 180)
                                     {
                                      PointInterf_Sx_Z = INTERFERISCI(Ba3_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
                                      // 02.03.2020
                                      dist_3Pro_sx_Z_180 = DISTANZA(Ba3_fia, PointInterf_Sx_Z)
                                     // 20.07.2023
                                      if (dist_3Pro_sx_Z_180 < 40  &  dist_3Pro_sx_Z_180 > 0)  { Battuta_Z_Sx = dist_3Pro_sx_Z_180 }
                                      if (dist_3Pro_sx_Z_180 < 3   &  dist_3Pro_sx_Z_180 > 0)  { Battuta_Z    = dist_3Pro_sx_Z_180 }
                                     }
                                  if (PointInterf_Sx_Z.x>-1000001 & PointInterf_Sx_Z.y>-1000001 & PointInterf_Sx_Z.z>-1000001)
                                     {
                                      dist_1Pro_sx_Z = DISTANZA(Ba1_fia, PointInterf_Sx_Z)
                                     // 20.07.2023
                                      if (dist_1Pro_sx_Z < 40)  { Battuta_Z_Sx = dist_1Pro_sx_Z }
                                      if (dist_1Pro_sx_Z < 3)   { Battuta_Z    = dist_1Pro_sx_Z }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
          else
             {
              if ( ABS(mdf_Battuta_SX_dist) < #X+2  &  mdf_Battuta_SX_dist != 0  &  mdf_Battuta_SX_dist > Battuta_SX
                 & mdf_Battuta_SX_dist < 90
                 // 25.05.2017
                 & X_FiaVic < 100
                 )
                 {
                 // 13.12.2018
                  dist_32 = DISTANZA(Ba3_att, Ba2_fia)
                  mdf_diff_ang = CAM_Ang+CAM_AngFia
                  mdf_fia_gir_err = -0.1

                  if (ABS(mdf_diff_ang-360) > 85  &  ABS(mdf_diff_ang-360) < 175)
                     {
                      if ( Battuta_SX > 9  &  Battuta_SX < 18.1
                         & mdf_Battuta_SX_dist > Battuta_SX
                         )
                         { mdf_fia_gir_err = idx_FiaSx_Ctrl_att }
                     }

                  // 08.04.2019 H007438
                  if (ABS(CAM_Ang-CAM_AngFia) > 85  &  ABS(CAM_Ang-CAM_AngFia) < 95)
                     {
                      if (mdf_Battuta_SX_dist > #X  &  Fianchi_vic > 1)
                         { mdf_fia_gir_err = idx_FiaSx_Ctrl_att }
                     }

                  if (mdf_fia_gir_err == -0.1)
                     {
                      _debug_dist_fiaBatSx = idx_FiaSx_Ctrl_att
                      mdf_Battuta_SX = mdf_Battuta_SX_dist
                     }
                 }
             }
         }

      if ( IS_MATCH(MdF_Apertura, "S*") == 1
         & mdf_Battuta_SX != 0
         )
         {
          // Nel caso di Apertura dichiarata sinistra non deve controllare se
          // maggiore di mdf_Battuta_X che potrebbe essere la battuta destra
          //if ( mdf_Battuta_SX < #X+5  &  ABS(mdf_Battuta_SX) > ABS(mdf_Battuta_X)
          if ( mdf_Battuta_SX < X_FiaVic+X_add_Limite  &  ABS(mdf_Battuta_SX) > ABS(mdf_Battuta_SX_att)
             & ABS(mdf_Battuta_SX) < 50
             // 21.02.2024 A179338
             & ABS(CAM_Ang-CAM_AngFia) != 90
             )
             {
              _debug_AperSX_fiaBatSx = idx_FiaSx_Ctrl_att
              _debug_AperSX_BattutaSx = mdf_Battuta_SX
              mdf_Battuta_X = mdf_Battuta_SX
             }
         // 10.06.2020 >= perche se mdf_Battuta_SX_att negativa e mdf_Battuta_SX positiva ma con lo stesso valore non entra
          // Per protezione nel caso di elementi *Fia* figli di Fia*
          if ( mdf_Battuta_SX < X_Fia_BatSx+1  &  ABS(mdf_Battuta_SX) >= ABS(mdf_Battuta_SX_att)
             & mdf_Battuta_SX > -X_Fia_BatSx/3
             & ABS(mdf_Battuta_SX) <= X_Fia_BatSx/2 +1
             & mdf_Battuta_SX_att < -3
             )
             {
              _debug_AperSX2_fiaBatSx = idx_FiaSx_Ctrl_att
              _debug_AperSX2_BattutaSx = mdf_Battuta_SX
              mdf_Battuta_X = mdf_Battuta_SX
             }

          // 20.03.2019
          // Se per caso entra prima il fianco piu a sinistra che tra l' altro ha una X=22
          // e poi entra per il fianco corretto che ha X=25 trovandosi con la Battuta a -14.96
          // non entra piu nell' if precedente
          // Tra l' altro MdF_distNearBatFia in questo caso è > 10
          // -14.76  10.26  in questi casi per cosi dire ambigui o a meta strada, deve vincere il positivo
          // In realta questa situazione capita nella MdF_get_Battuta_SX_Gen mentre qui trova i fianchi in ordine invertito
          if ( mdf_Battuta_SX > X_FiaVic/3+1  &  ABS(mdf_Battuta_SX) < ABS(mdf_Battuta_SX_att)
             & ABS(mdf_Battuta_SX) < X_FiaVic/2+1
             & mdf_Battuta_SX_att < -X_FiaVic/3-1
             )
             {
              _debug_AperSX_fiaSovrapp_oXdif = 1
              mdf_Battuta_X = mdf_Battuta_SX
             }
         }

      if (fia_Sx  |  fia_Dx == 0)
         {
          // Faccio l'Assegnazione di mdf_Battuta_X solo nel caso sono Apertura non-SX
          // così ce l'ho impostata lo stesso dato che può servire anche alla ferramente
          // di Frontali Battenti e dato che adesso il calcolo è comunque corretto
          if (IS_MATCH(MdF_Apertura, "S*") != 1)
             {
             // 17.01.2025 Come DX
              mdf_Battuta_SX_NotValid = 0
              if (ABS(CAM_Ang-CAM_AngFia) < 1)
                 {
                  if (IS_MATCH(MdF_Apertura, "D*") == 1)
                     {
                      if (mdf_Battuta_SX < -1)  { mdf_Battuta_SX_NotValid = 1 }
                     }
                 }

              if ( mdf_Battuta_SX < X_FiaVic+X_add_Limite  &  ABS(mdf_Battuta_SX) > ABS(mdf_Battuta_X)
                 & ABS(mdf_Battuta_SX) < 50
                 & mdf_Battuta_SX != 0
                // 17.01.2025
                 & mdf_Battuta_SX_NotValid == 0
                 )
                 { mdf_Battuta_X = mdf_Battuta_SX }
             }

          if ( mdf_Battuta_SX < X_FiaVic+X_add_Limite  &  ABS(mdf_Battuta_SX) < 50  &  mdf_Battuta_SX != 0
             // 21.02.2024
             & ABS(CAM_Ang-CAM_AngFia) != 90
             )
             {
              if (ABS(mdf_Battuta_SX) >= ABS(mdf_Battuta_X) )
                 {
                  mdf_Battuta_X_Sx_idx = Fianchi_vic[iX]
                  mdf_Battuta_X_Sx = mdf_Battuta_SX
                 }
             }
         }
   }

   PROCEDURA MdF_get_Battuta_DX
   {
      CAM_Ang = ANG_TOT2(idx_att)
      Ba0_att = [base_0.x, 0, base_0.z]
      Ba0_att_allung = [base_0.x-100*COSENO(CAM_Ang), 0, base_0.z+100*SENO(CAM_Ang)]
      Ba3_att = [base_3.x, 0, base_3.z]
      Ba3_att_allung = [base_3.x+100*COSENO(CAM_Ang), 0, base_3.z-100*SENO(CAM_Ang)]

      Ba2_att = [base_2.x, 0, base_2.z]

      //- punti dell'elemento  trovato
      Ba1_fia = [#base_1.x, 0, #base_1.z]
      Ba2_fia = [#base_2.x, 0, #base_2.z]
      Ba3_fia = [#base_3.x, 0, #base_3.z]
      Bay_Fia = #base_0.y
      Aly_Fia = #alto_0.y

      // 16.05.2024 009424
      // Sempre stato 5, ma in questo caso c'è una maniglia gola con un PanLatFineCompo da 12
      // A Fianco c'è una base piu bassa quindi prendeva il Fianco di questa base e faceva uno SbordoYSup
      // tra l' altro sul Fianco non cerniere perchè siamo appunto nel lato Maniglia
      // Quindi Battuta_X 29.01
      // 23.05.2024 NM002921 potrebbe esserci il Taglio45 e se non c'è MdF_offx_REL_ADD non lo trova
      X_add_Limite = 5+10+6.01

      dist_02 = DISTANZA(Ba0_att, Ba2_fia)
      dist_31 = DISTANZA(Ba3_att, Ba1_fia)

      Z_Fia = VAR_VAL(Fianchi_vic[iX], "Z")
      X_FiaVic = VAR_VAL(Fianchi_vic[iX], "X")
      X_Fia_BatDx = X_FiaVic
      CAM_AngFia = ANG_TOT2(Fianchi_vic[iX])

      if (dist_02 < dist_31)  { fia_Sx = 1 }
      else                    { fia_Dx = 1 }

      diff_BaFBaMy = Bay_Fia - base_0.y
      diff_BaFAlMy = Bay_Fia - alto_0.y
      diff_AlMBaFy = alto_0.y - Bay_Fia

      // +60 -> Se sporge appena. Piu che altro dipendente dalla grafica dei pezzi
      // esempio su fianco Ponte fatto da 2 pezzi una parte sotto magari metallica e la
      // parte sopra legno.
      // In ogni caso se un fianco ha solo 60mm in Y di battuta non può esser il fianco di battuta
      //diff_BaMAlFy = base_0.y - Aly_Fia
      diff_BaMAlFy = base_0.y - Aly_Fia + 60
      if (Y < 129)
         {
          diff_BaMAlFy = base_0.y - Aly_Fia + 39
          // 28.01.2025
          if (Y < 99)
             { diff_BaMAlFy = base_0.y - Aly_Fia + 30 }
         }

      if (ABS(diff_BaFAlMy) < 10  |  ABS(diff_AlMBaFy) < 10)  { EXITSUB() }
      if (diff_BaMAlFy > 0)                                   { EXITSUB() }

     // 07.07.2023 Sc0122301986 MdF_ distNearBatFia 33.5 trova il pensile sopra che comunque avrebbe trovato anche con 10
      // solo che in questo caso il problema era che non calcolava lo SbordoYInf
      if (Bay_Fia-0.1 > alto_0.y)
         {
          if (Fianchi_vic > 1)
             {
              mdf_ErrBatt_FiaSup = Fianchi_vic[iX]
              EXITSUB()
             }
         }

      // Fianco inizia da sotto quindi tipo Ponte può andar bene ma non arriva a filo alto
      // Se fatalità metà Fianco parte sotto e arriva fino a metà dell' elemento che sta
      // verificando tale fianco, le condizioni precedenti non sono sufficienti
      mdf_FiaDxsfalsato = 0
      if (Bay_Fia+150 < base_0.y  &  Aly_Fia+150 < alto_0.y)
         { mdf_FiaDxsfalsato = 1 }

      if (Bay_Fia-150 > base_0.y  &  Aly_Fia-150 > alto_0.y)
         {
          mdf_FiaDxsfalsato = 2
          // 20.05.2020 anta inf colonna base_0_offset.y -165, ma anche cassettoInf H.536
          y_Fro = VAR_VAL(idx_att, "Y")
          if (y_Fro/3 > 150)
             {
              if (Bay_Fia-y_Fro/3 <= base_0.y  &  Aly_Fia > alto_0.y)
                 { mdf_FiaDxsfalsato = -2 }
             }
         }

     // 21.11.2016
      if (Bay_Fia+2 >= base_0.y  &  Aly_Fia-3 <= alto_0.y)
         {
          diff_AlMAlFy = alto_0.y - Aly_Fia
          y_Fro = VAR_VAL(idx_att, "Y")
         // Non ha senso uno sbordo di più di metaFrontale, perché l'anta sarebbe sbilanciata, significa che non è il fianco corretto da considerare
         // 03.02.2017 ma solo se l' anta sta in basso, altrimenti potrei essere un' anta mansardata
          if (base_0.y < 1000)
             {
              if (ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/2+1)
                 {
                  // 30.01.2019
                  mdf_ctrl_dFBD = idx_att
                  GOSUB MdF_Ctrl_doppioFia_Battuta_DX
                  if (mdf_doppio_fiaDx_inY_Battuta_X <= -1)
                     { EXITSUB() }
                 }
             }
          else
             {
              // 08.04.2019 C84331
              if ( ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/2+1
                 & ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) < y_Fro-50
                 )
                 {
                  mdf_ctrl_dFBD = idx_att
                  GOSUB MdF_Ctrl_doppioFia_Battuta_DX
                 }
             // 28.03.2025 A33574 Anta 1194, Fianco sotto 720, Fianco sopra 480. Deve trovare il fianco in basso come doppio fianco
              if ( ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/3-30
                 // 118 limite per farci stare una cerniera sarebbe 107, ma non ha senso impegnare un vano cosi piccolo per metterci anche la cerniera/basetta che occupa spazio.
                 // Se uno fa 2 scocche H.120 e anta unica non è apposto, ma comunque entrerebbe nel y_Fro/2
                 & ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) < y_Fro-118
                 & Fianchi_vic > 1
                 )
                 {
                  // Non servirebbe questa if ma la tengo
                  if (mdf_doppio_fiaDx_inY_Battuta_X == -1)
                     {
                      diff_BaFBaMy_diff_AlMAlFy = ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy)
                      mdf_ctrl_dFBD = idx_att
                      GOSUB MdF_Ctrl_doppioFia_Battuta_DX
                     }
                 }

              // 26.03.2019
              //if (ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/2+y_Fro/20)  { EXITSUB() }
              if (ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/2+y_Fro/20)
                 {
                  mdf_ctrl_dFBD = idx_att
                  GOSUB MdF_Ctrl_doppioFia_Battuta_DX
                  if (mdf_doppio_fiaDx_inY_Battuta_X <= -1)
                     { EXITSUB() }
                 }
             }
         }

      if (mdf_FiaDxsfalsato > 0
         // Conttrollo che comunque non sia l' unico Fianco trovato perché magari c'è
         // una composizione Parete particolare e fatalità potrebbe rientrare in questa situazione
         & Fianchi_vic > 1
         )
         {
          mdf_sporgente = 0
          if (Fianchi_vic >= 2)
             {
              // Attenzione che sto facendo riferimento ai punti del padre di -1 dell' MdF_
              // e non del padre del Fianco o del Fianco-stesso
              alty_Sc = VAR_VAL(PADRE(idx_att, -1), "alto_0.y")
              basy_Sc = VAR_VAL(PADRE(idx_att, -1), "base_0.y")
              if (alto_0.y-8 > alty_Sc)
                 {
                  mdf_sporgente = 1
                 }
              if (base_0.y+8 < basy_Sc)
                 {
                  mdf_sporgente = 2
                 }
              if (mdf_FiaDxsfalsato == 2)  { mdf_doppio_fiaDx_inY = Fianchi_vic[iX] }
              // 28.10.2020 SN05081
              if (Aly_Fia-90 > base_0.y)
                 {
                  y_Fro = VAR_VAL(idx_att, "Y")
                  mdf_ctrl_dFBD = idx_att
                  GOSUB MdF_Ctrl_doppioFia_Battuta_DX
                 }
             }
          if (mdf_sporgente == 0)
             { EXITSUB() }
         }

      if (Bay_Fia-Y/3+50 > base_0.y  &  Aly_Fia+Y/3-50 < alto_0.y)
         { mdf_FiaDxsfalsato = 3 }

      if (fia_Dx)
         {
          mdf_Battuta_DX_att = mdf_Battuta_DX

          Ba1_fia_MdF = [#base_1.x, 0, #base_1.z]
          mdf_Battuta_DX_dist = DISTANZA(Ba3_att, Ba1_fia_MdF)
          PointInterf_Pro = INTERFERISCI(Ba1_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
          // Bifacciale
          if (ABS(CAM_Ang-CAM_AngFia) == 180)
             {
              // Non devo cambiare i punti anta perché essendo girata di 180gradi mi va bene considerare
              // sempre Ba3_att_allung
              //PointInterf_Pro = INTERFERISCI(Ba3_fia, CAM_AngFia+90, Ba0_att_allung, Ba3_att)
              PointInterf_Pro = INTERFERISCI(Ba3_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
             }

          if (PointInterf_Pro.x>-1000001 & PointInterf_Pro.y>-1000001 & PointInterf_Pro.z>-1000001)
             {
              dist_0Pro_sx = DISTANZA(Ba0_att, PointInterf_Pro)
              dist_3Pro_dx = DISTANZA(Ba3_att, PointInterf_Pro)

              Proiez_fia_Sx = 0
              Proiez_fia_Dx = 0
              if (dist_0Pro_sx < dist_3Pro_dx)  { Proiez_fia_Sx = 1 }
              else                              { Proiez_fia_Dx = 1 }

             // 20.05.2025 Ca2518151
              if (Proiez_fia_Sx)
                 {
                  if ( dist_0Pro_sx > 50
                     & dist_3Pro_dx > 50
                     )
                     {
                      _deb_Proiez_fia_Dx = 1
                      // Se in RegFacc uso sempre Battuta_X_Sx devo mantenere il lato corretto
                      // SE_NUM(MdF_Verso=="SX",Battuta_X_Sx,X-Battuta_X_Dx-12)
                      // MdF_Apertura FISSO
                      if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Verso"), "D*") )
                         {
                          // Vuol dire che il fianco è vicino al centro e probabilmente ne avrò 1 solo appunto al centro
                          // (può essere che trova piu di un Fianchi_vic perchè trova il figlio)
                          // Teoricamente questa if andrebbe tolta, ma per ora la tengo essendo il primo caso di sempre
                          // E forse nemmeno il controllo su MdF_Verso perchè comunque la Battuta_Dx è sempre da destra
                          // Anche se questa sarebbe piu una Battuta centrale e in altri Ambienti viene usata la Battuta centrale
                          if (dist_0Pro_sx+80 > dist_3Pro_dx)
                             {
                              _deb_Proiez_fia_Dx = 2
                              Proiez_fia_Dx = 1
                             }
                         }
                     }
                 }

              if ( dist_0Pro_sx < VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
                 | VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") == 0
                 )
                 {
                  if (dist_0Pro_sx > 30)
                     {
                      X_FiaBatDX_Cn = VAR_VAL(Fianchi_vic[iX], "X")
                      mdf_Battuta_X_DX_Pro_Cn = dist_0Pro_sx +0.01
                      mdf_idx_FiaBatDX_CnDX = Fianchi_vic[iX]
                     }
                 }

              if ( dist_3Pro_dx < X-VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
                 | VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") == 0
                 )
                 {
                  if (dist_3Pro_dx > 30)
                     {
                      X_FiaBatSX_Cn = VAR_VAL(Fianchi_vic[iX], "X")
                      mdf_Battuta_X_SX_Pro_Cn = X-dist_3Pro_dx +0.01
                      mdf_idx_FiaBatSX_CnDX = Fianchi_vic[iX]
                     // 05.10.2021 Sn009925
                      if ( dist_3Pro_dx < X/2
                         & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") == 0
                         )
                         {
                         // Alb 22/04/2025 ColArc 1881243
                          // Strano sia uscito dopo quasi 4 anni
                          // Forse la var debug era solo per vedere che passava di qua perchè se & == 0 vale per forza 0
                          //mdf_Battuta_X_DX_Pro_Cn_deb1 = mdf_Battuta_X_DX_Pro_Cn
                          mdf_Battuta_X_DX_Pro_Cn_deb1 = VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
                          mdf_Battuta_X_DX_Pro_Cn = dist_3Pro_dx - X_FiaBatSX_Cn +0.01
                         }
                     }
                 }
             // 01.12.2023 Sn120101 Vas che sborda sia a sx che dx
              mdf_find_DX_Cn = 0
              // Significa che ho 2 Fianchi centrali
              if (VAR_EXIST(idx_att, "mdf_idx_FiaBatDX_CnDX") != 1)             { mdf_find_DX_Cn = 1 }
              // Significa che ho 2 Fianchi centrali vicini a destra e entra quello piu esterno
              if ( dist_3Pro_dx < VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
                 & dist_3Pro_dx+50 < VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
                 )
                 {
                 // 28.02.2024 Sn000681 Non deve entrare per lo stesso fianco, altrimenti inverte la Battuta_X_Cn
                  if ( VAR_VAL(idx_att, "mdf_idx_FiaBatDX_CnDX") != Fianchi_vic[iX]
                     // Vedi anche Sc1021085007 che invece deve entrare perche ante retro
                     | ABS(CAM_Ang-CAM_AngFia) == 180
                     | VAR_VAL(idx_att, "exitBattuta_SX") == -1
                     )
                     {
                      dist_3Pro_dx_att = dist_3Pro_dx
                      mdf_Battuta_X_SX_Pro_Cn_debDX = VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn")
                      mdf_Battuta_X_DX_Pro_Cn_debDX = VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
                      mdf_idx_FiaBatDX_CnDX_att = VAR_VAL(idx_att, "mdf_idx_FiaBatDX_CnDX")
                      if (dist_3Pro_dx != VAR_VAL(idx_att, "mdf_Battuta_X_SX_Pro_Cn") )
                         { mdf_find_DX_Cn = 2 }
                     }
                 }

              // Sn019224
              // Significa che ho 2 Fianchi centrali vicini a destra e entra quello piu interno
              if ( dist_3Pro_dx-50 < VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
                 & dist_3Pro_dx > VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn")
                 )
                 { mdf_find_DX_Cn = 3 }

              if (mdf_find_DX_Cn > 0)
                 {
                  if (dist_3Pro_dx > 30)
                     {
                      // Sembra funzionare anche senza il -80, ma per ora lo limito per non rischiare quando il Fianco e' molto vicino al centro che gia funziona
                      if (dist_3Pro_dx < X/2-80)
                         {
                          mdf_Battuta_X_DX_Pro_Cn_deb2 = mdf_Battuta_X_DX_Pro_Cn
                          mdf_idx_FiaBatDX_CnDX_att = VAR_VAL(idx_att, "mdf_idx_FiaBatDX_CnDX")
                          mdf_Battuta_X_DX_Pro_Cn = dist_3Pro_dx +0.01
                          // Problema uscito con la gestione sat VAS
                          mdf_idx_FiaBatDX_CnDX = Fianchi_vic[iX]
                          mdf_find_DX_Cn_att = mdf_find_DX_Cn
                         }
                     }
                 }

              if (Proiez_fia_Dx)
                 {
                  mdf_Battuta_X_Dx_Pro = dist_3Pro_dx +0.01

                  mdf_Battuta_DX_Pro = dist_3Pro_dx + 0.01
                  // 26.07.2017
                  // Avendo migliorato l' INTERFERISCI in Motore-M4 il risultato ora è piu preciso quindi se un elemento
                  // è a filo il risultato è effettivamente 0
                  // Il problema è che in M4 un valore è 0 se la fabs(result-parse_e())<0.01
                  // quindi se vale 0.01 in realtà l' if == 0 è vera perché appunto 0.01 è in realtà
                  // 0.00999999977648258209228515625
                  if (mdf_Battuta_X_Dx_Pro == 0)  { mdf_Battuta_X_Dx_Pro = mdf_Battuta_X_Dx_Pro + 0.000000001 }
                  if (mdf_Battuta_DX_Pro == 0)    { mdf_Battuta_DX_Pro = mdf_Battuta_DX_Pro + 0.000000001 }

                  if (dist_0Pro_sx > X)
                     {
                      mdf_Battuta_X_Dx_Pro = -1*mdf_Battuta_X_Dx_Pro
                      mdf_Battuta_DX_Pro = -1*mdf_Battuta_DX_Pro
                     }

                  if (ABS(mdf_Battuta_DX_Pro) <= X_FiaVic+X_add_Limite)
                     {
                      _debug_Pro_Dx_camang = CAM_Ang
                      _debug_Pro_Dx_camangfia = CAM_AngFia
                      _debug_Pro_fiaBatDx = Fianchi_vic[iX]

                      mdf_Dx_Pro_entra = 1
                      if ( ABS(mdf_Battuta_DX_Pro) < ABS(mdf_Battuta_DX)
                         & mdf_Battuta_DX_Pro < 0
                         & ABS(mdf_Battuta_DX) <= X_FiaVic+0.01
                         )
                         {
                          mdf_Dx_Pro_entra = -0.01
                         }

                      // 22.02.2019
                      // Non ho ancora trovato niente, ma ho un fianco a destra
                      // esempio stanza a 1.7 gradi PensileAngolo con grafica fianchi ysweep_3p
                      // A sinistra l' anta a Libro non ha fianchi
                      // E' uscito adesso, perche' prima il cliente non avevano la
                      // gestione SbordoY e il problema e' uscito sui paracolpi
                      if ( mdf_Battuta_DX == 0
                         & mdf_Battuta_DX_Pro < 0
                         & ABS(mdf_Battuta_DX_Pro) < 2
                         )
                         {
                          // 27.03.2019
                          mdf_antTerm = 0
                          if ( ABS(CAM_Ang-CAM_AngFia) > 15
                             & ABS(CAM_Ang-CAM_AngFia) < 75
                             )
                             { mdf_antTerm = 1 }

                          // 05.04.2019
                          mdf_antaInterna = 0
                          if (ABS(CAM_Ang-CAM_AngFia) == 0)
                             {
                              mdf_dist_21 = DISTANZA(Ba2_att, Ba1_fia)
                              mdf_dist_31 = DISTANZA(Ba3_att, Ba1_fia)
                              if (mdf_dist_21 < mdf_dist_31)  { mdf_antaInterna = 1 }
                              // interna ma circa a meta rispetto allo spigolo fianco
                              if ( mdf_dist_21 < 15  &  mdf_dist_31 < 15
                                 & mdf_dist_21 > 5   &  mdf_dist_31 > 5
                                 )
                                 { mdf_antaInterna = 2 }
                              // 01.06.2020 Scn0931
                              mdf_dist_32 = DISTANZA(Ba3_att, Ba2_fia)
                              if ( mdf_dist_31 == dist_3Pro_dx
                                 & mdf_dist_21 > X_FiaVic/2
                                 & mdf_dist_21 <= X_FiaVic-mdf_dist_31
                                 )
                                 { mdf_antaInterna = 3 }

                              // 04.12.2020
                              mdf_anp = 0
                              if (mdf_dist_21 < 2  &  mdf_dist_31 > 18  &   X_FiaVic > 100)  { mdf_anp = 1 }
                              if (mdf_dist_31 < 2  &  mdf_dist_21 > 18  &   X_FiaVic > 100)  { mdf_anp = 2 }
                              if (mdf_anp > 0)  { mdf_antaInterna = 0 }
                             }

                          if (mdf_antTerm == 0  &  mdf_antaInterna == 0)
                             { mdf_Dx_Pro_entra = -0.02 }
                         }

                     // 23.01.2019 F-0086135
                      // Eventualmente c'e' anche il fatto che mdf_Battuta_DX_dist=240
                      // perche' e' un pensile vicino ad una colonna con profondita maggiore
                      // ma anche se fossero con la stessa profondita non dovrebbe entrare
                      // in inserimento da Listino trova per ultimo il Fianco sinistro della colonna
                      // mentre in caricamento ordine no, infatti sulla MdF_get_Battuta_DX_Gen
                      // non ho riportato questa condizione
                      if ( ABS(mdf_Battuta_DX_Pro) < ABS(mdf_Battuta_DX)
                         & mdf_Battuta_DX_Pro < 0
                         & ABS(mdf_Battuta_DX) <= X_FiaVic+0.01 + ABS(VAR_VAL(idx_att, "MdF_offx_REL_ADD"))
                         & ABS(VAR_VAL(idx_att, "MdF_offx_REL_ADD")) < 2
                         )
                         {
                          mdf_Dx_Pro_entra = -0.03
                         }

                      // Se ho gia trovato la battuta su un fianco e ne trovo
                      // un altro deve vincere quello piu vicino
                      if (VAR_EXIST(idx_att, "fiaBatDx") )
                         {
                          if (IS_IDX(fiaBatDx) )
                             {
                              if ( ABS(mdf_Battuta_DX_Pro) < ABS(mdf_Battuta_DX)
                                 & mdf_Battuta_DX_Pro < 0
                                 )
                                 {
                                  if (X_FiaBatDX > 1)
                                     {
                                      // 2 Fianchi di elementi diversi, quindi fianchi
                                      // con X diversa, la if sopra ABS(mdf_Battuta_DX) <= #X+0.01
                                      // potrebbe fallire
                                      if ( ABS(mdf_Battuta_DX) <= X_FiaBatDX+0.01
                                         & X_FiaVic + 1 < X_FiaBatDX
                                         )
                                         {
                                          mdf_Dx_Pro_entra = -0.04
                                          _deb_X_FiaDx_entra_X = X_FiaVic
                                          _deb_mdf_Battuta_DX_entra_X = mdf_Battuta_DX
                                         }
                                     }
                                 }

                              // 20.11.2023 H23000089_LIVINGROOM18 Ante a ELLE parte Sx piu grande parte Dx
                              // 2 Fianchi di elementi diversi con X diversa, uno sopra l' altro, ma non e' un doppio fianco di Battuta. Lo sente perchè l' ingombro a ELLE prende tutta la Y sia a dx che sx
                              if ( mdf_Battuta_DX_Pro+1 < mdf_Battuta_DX
                                 & mdf_Battuta_DX_Pro > X_FiaBatDX/2-1
                                 & mdf_Battuta_DX > X_FiaBatDX/2
                                 & X_FiaBatDX > 5
                                 & X_FiaVic + 1 < X_FiaBatDX
                                 // Visto che e' il primo caso lo limito
                                 & PADRE(Fianchi_vic[iX], -1) != PADRE(fiaBatDx, -1)
                                 & PADRE(fiaBatDx, -1) == PADRE(idx_att, -1)
                                 )
                                 {
                                  mdf_Dx_Pro_entra = -0.041
                                  _deb_X_FiaDx_entra_X = X_FiaVic
                                  _deb_mdf_Battuta_DX_entra_X = mdf_Battuta_DX
                                 }

                             // 03.06.2024 A 68413 Trova sbordiY con fianco pensile vicino sovrapposto di ben 14.97
                              if ( mdf_Battuta_DX_Pro+1 < mdf_Battuta_DX
                                 & mdf_Battuta_DX_Pro > X_FiaBatDX/2
                                 & mdf_Battuta_DX > X_FiaBatDX/2
                                 & X_FiaBatDX > 5
                                 & X_FiaVic <= X_FiaBatDX
                                 & PADRE(Fianchi_vic[iX], -1) != PADRE(fiaBatDx, -1)
                                 & PADRE(fiaBatDx, -1) == PADRE(idx_att, -1)
                                 )
                                 {
                                  mdf_Dx_Pro_entra = -0.042
                                  _deb_X_FiaDx_entra_X = X_FiaVic
                                  _deb_mdf_Battuta_DX_entra_X = mdf_Battuta_DX
                                 }

                             // 11.07.2024 A050222 sormonto di 10mm
                              if ( mdf_Battuta_DX_Pro+1 < mdf_Battuta_DX
                                 & mdf_Battuta_DX_Pro > X_FiaBatDX/2-3
                                 & mdf_Battuta_DX_Pro < X_FiaBatDX/2+1
                                 & mdf_Battuta_DX > X_FiaBatDX/2
                                 & mdf_Battuta_DX < X_FiaBatDX
                                 & X_FiaBatDX > 5
                                 & X_FiaVic <= X_FiaBatDX
                                 & PADRE(Fianchi_vic[iX], -1) != PADRE(fiaBatDx, -1)
                                 & PADRE(fiaBatDx, -1) == PADRE(idx_att, -1)
                                 )
                                 {
                                  mdf_Dx_Pro_entra = -0.043
                                  _deb_X_FiaDx_entra_X = X_FiaVic
                                  _deb_mdf_Battuta_DX_entra_X = mdf_Battuta_DX
                                 }

                              if ( ABS(mdf_Battuta_DX_Pro) > ABS(mdf_Battuta_DX)
                                 & mdf_Battuta_DX_Pro < 0
                                 & mdf_Battuta_DX > 1
                                 )
                                 {
                                  if ( X_FiaBatDX > 1
                                     & ABS(mdf_Battuta_DX_Pro) > X_FiaBatDX/2
                                     & ABS(mdf_Battuta_DX) < X_FiaBatDX/2
                                     )
                                     {
                                      mdf_Dx_Pro_entra = -0.05
                                      _deb_X_FiaDx_entra_X2 = X_FiaVic
                                      _deb_mdf_Battuta_DX_entra_X2 = mdf_Battuta_DX
                                     }
                                  // 04.03.2020 S000643 Battuta_SX
                                  // mdf_distNearBatFia = 28.1 nel caso di GolaVert, ma composizione un po' subdola
                                  // e quindi trova anche il Fianco vicino del riempitivo e si accorge che ha gia un Fianco di Battuta corretto
                                  if ( X_FiaBatDX > 1
                                     & ABS(mdf_Battuta_DX_Pro) > X_FiaBatDX+0.1
                                     & ABS(mdf_Battuta_DX) <= X_FiaBatDX+0.1
                                     & ABS(mdf_Battuta_DX) > X_FiaBatDX/2
                                     & mdf_Battuta_DX_Pro < -X_FiaBatDX/2
                                     )
                                     {
                                      mdf_Dx_Pro_entra = -0.06
                                      _deb_X_FiaDx_entra_distNear = X_FiaVic
                                      _deb_mdf_Battuta_DX_entra_distNear = mdf_Battuta_DX
                                     }
                                 }

                              if ( ABS(mdf_Battuta_DX_Pro) > X_FiaVic-1
                                 & ABS(mdf_Battuta_DX) < X_FiaVic/2
                                 & ABS(mdf_Battuta_DX_Pro - mdf_Battuta_DX) < #X+0.01
                                 )
                                 {
                                  // 24.09.2018
                                  // Fianchi leggermente sovrapposti
                                  // Non poteva capitare. Ingombri un po' sbagliati lato Bdm, vedi base_0 diversa dagli altri punti
                                  mdf_Dx_sovrapp_legger = 0
                                  if ( ABS(mdf_Battuta_DX_Pro) <= X_FiaVic+0.011
                                     & ABS(mdf_Battuta_DX) < 2
                                     & mdf_Battuta_DX > 0
                                     )
                                     { mdf_Dx_sovrapp_legger = 1 }

                                  if (mdf_Dx_sovrapp_legger == 0
                                     // 03.09.2020 in funzione della modfica 01.09, se trova prima l' altro Fianco non entra piu sul fianco corretto
                                     & ABS(mdf_Battuta_DX_Pro) > X_FiaVic+mdf_Battuta_DX+0.02
                                     )
                                     {
                                      mdf_Dx_Pro_entra = -0.07
                                      _deb_mdf_Battuta_DX_entra1 = mdf_Battuta_DX
                                      _deb_mdf_Battuta_DX_Pro_entra1 = mdf_Battuta_DX_Pro
                                      _deb_idx_Dx_Pro_entra1 = Fianchi_vic[iX]
                                     }
                                 }
                              if ( ABS(mdf_Battuta_DX_Pro) > X_FiaVic+0.02
                                 & ABS(mdf_Battuta_DX) < X_FiaVic/2
                                 )
                                 {
                                  // 03.09.2020 in funzione della modfica 01.09, se trova prima l' altro Fianco non entra piu sul fianco corretto
                                  if (ABS(mdf_Battuta_DX_Pro) > X_FiaVic+mdf_Battuta_DX+0.02)
                                     {
                                      mdf_Dx_Pro_entra = -0.08
                                      _deb_X_Fia_entra2 = X_FiaVic
                                      _deb_mdf_Battuta_DX_Pro_entra2 = mdf_Battuta_DX_Pro
                                      _deb_idx_Dx_Pro_entra2 = Fianchi_vic[iX]
                                      // 20.05.2025 A079453 entra prima il fianco piu a destra e battuta è -1.50902
                                      // L' anta però sborda leggermente fuori al Fianco corretto
                                      if ( mdf_Battuta_DX < 0
                                         & mdf_Battuta_DX_Pro > X_FiaVic
                                         // Arrivo gia che ABS(mdf_Battuta_DX_Pro) <= X_FiaVic+X_add_Limite, quindi piuttosto di prendere Battuta negativa meglio positiva
                                         )
                                         {
                                          if (ABS(CAM_Ang-CAM_AngFia) < 1)
                                             {
                                              mdf_Dx_Pro_entra = 1.08
                                             }
                                         }
                                     }
                                 }
                              // 24.11
                              if ( ABS(mdf_Battuta_DX_Pro - mdf_Battuta_DX) > X_FiaVic+0.1
                                 & mdf_Battuta_DX > X_FiaVic/2-1
                                 & mdf_Battuta_DX_Pro < 0
                                 )
                                 {
                                  mdf_Dx_Pro_entra = -0.09
                                  _deb_mdf_Battuta_DX_entra3 = mdf_Battuta_DX
                                  _deb_mdf_Battuta_DX_Pro_entra3 = mdf_Battuta_DX_Pro
                                  _deb_idx_Dx_Pro_entra3 = Fianchi_vic[iX]
                                 }
                              // 01.09.2020 La12709 Deve vincere quello piu interno. Qui giustamente e primo caso assoluto l' anta sporge leggermente di 1.5 sul fianco vicino
                              if ( ABS(mdf_Battuta_DX_Pro - mdf_Battuta_DX) <= X_FiaVic+0.1
                                 & mdf_Battuta_DX > X_FiaVic/2+1
                                 & mdf_Battuta_DX_Pro < X_FiaVic/2-1
                                 & mdf_Battuta_DX_Pro > 0
                                 )
                                 {
                                  mdf_Dx_Pro_entra = -0.011
                                  _deb_mdf_Battuta_DX_entra4 = mdf_Battuta_DX
                                  _deb_mdf_Battuta_DX_Pro_entra4 = mdf_Battuta_DX_Pro
                                  _deb_idx_Dx_Pro_entra4 = Fianchi_vic[iX]
                                 }
                              // 01.09.2020 La12534 Deve vincere quello piu interno.
                              if ( ABS(mdf_Battuta_DX_Pro - mdf_Battuta_DX) <= X_FiaVic+0.1+2.5+VAR_VAL(idx_att, "MdF_offx_REL_ADD")
                                 & mdf_Battuta_DX > X_FiaVic/2+1
                                 & mdf_Battuta_DX_Pro < 1
                                 & mdf_Battuta_DX_Pro >= 0
                                 )
                                 {
                                  mdf_Dx_Pro_entra = -0.012
                                  _deb_mdf_Battuta_DX_entra5 = mdf_Battuta_DX
                                  _deb_mdf_Battuta_DX_Pro_entra5 = mdf_Battuta_DX_Pro
                                  _deb_idx_Dx_Pro_entra5 = Fianchi_vic[iX]
                                 }
                             // 06.03.2018
                              cam_ang_Fro = ANG_TOT(idx_att)
                              cam_ang_Fia = ANG_TOT(Fianchi_vic[iX])
                              if (ABS(cam_ang_Fro-cam_ang_Fia) > 15  &  ABS(cam_ang_Fro-cam_ang_Fia) < 75)
                                 {
                                  if ( ABS(mdf_Battuta_DX_Pro) > VAR_VAL(idx_att, "X_FiaBatDX")
                                     & mdf_Battuta_DX < -1
                                     & ABS(mdf_Battuta_DX) < ABS(mdf_Battuta_DX_Pro)
                                     & ABS(mdf_Battuta_DX) < VAR_VAL(idx_att, "X_FiaBatDX")
                                     )
                                     {
                                      if ( dist_0Pro_sx > X*ABS(SENO(CAM_Ang-CAM_AngFia))
                                         & ABS(mdf_Battuta_DX_Pro) > mdf_distNearBatFia+3
                                         )
                                         {
                                          mdf_Dx_Pro_entra = -0.013
                                          _deb_X_Fia_entraAng = X_FiaVic
                                          _deb_mdf_Battuta_DX_Pro_entraAng = mdf_Battuta_DX_Pro
                                          _deb_idx_Dx_Pro_entraAng = Fianchi_vic[iX]
                                         }
                                     }
                                 }

                              // 16.05.2019 H19019537 FiancoPonte a C ridotto per avere la C sotto,
                              // ma la Y totale FiancoPonte per la parte sopra in legno si sovrapponeva
                              // al vero fianco di Battuta ed essendo preso dopo veniva considerato questo
                              // In pratica, come ingombri, fianchi sovrapposti in y
                              if (ABS(mdf_Battuta_DX_Pro) == ABS(mdf_Battuta_DX) )
                                 {
                                  mdf_basy_FroDx = VAR_VAL(idx_att, "base_0.y")
                                  mdf_alty_FroDx = VAR_VAL(idx_att, "alto_0.y")
                                  mdf_basy_fiaBatDx = VAR_VAL(fiaBatDx, "base_0.y")
                                  mdf_alty_fiaBatDx = VAR_VAL(fiaBatDx, "alto_0.y")
                                  mdf_basyFia_ctrl_Dx = VAR_VAL(Fianchi_vic[iX], "base_0.y")
                                  mdf_altyFia_ctrl_Dx = VAR_VAL(Fianchi_vic[iX], "alto_0.y")

                                  //DISPLAY2(STRCAT("fiaBatDx ", STR(fiaBatDx), " Fianchi_vic[iX]=", STR(Fianchi_vic[iX])))
                                  // fiaBatDx         1768    2964
                                  // Fianchi_vic[iX]  552     3056
                                  // Fianchi_vic[iX]  0       2596
                                  // Fro              1713.5  2962.5
                                  if ( mdf_basy_fiaBatDx+200 > mdf_basy_FroDx
                                     & mdf_alty_fiaBatDx-200 < mdf_alty_FroDx
                                     & mdf_alty_fiaBatDx+200 > mdf_alty_FroDx
                                     & mdf_basy_fiaBatDx-200 > mdf_basyFia_ctrl_Dx
                                     )
                                     {
                                      if (mdf_basyFia_ctrl_Dx+200 < mdf_basy_FroDx)
                                         {
                                          // 13.04.2023 come Sx
                                          if (mdf_Battuta_DX_Pro <= mdf_Battuta_DX)
                                             {
                                              mdf_Dx_Pro_entra = -0.014
                                              _deb_mdf_Battuta_DX_Pro_sovrap_sfals = mdf_Battuta_DX_Pro
                                              _deb_idx_Dx_Pro_entra_sovrap_sfals = Fianchi_vic[iX]
                                             }
                                         }
                                     }
                                 }

                              // 05.11.2019 PCL01111 Composizione ang89.5
                              if ( mdf_Battuta_DX > mdf_Battuta_DX_Pro
                                 & mdf_Battuta_DX <= VAR_VAL(idx_att, "X_FiaBatDX")+mdf_Battuta_DX_Pro+0.1
                                 & mdf_Battuta_DX > VAR_VAL(idx_att, "X_FiaBatDX")/2
                                 // 02.12.2019 1019098450 pensii leggermente sovrapposti di 1.3
                                 //& ABS(mdf_Battuta_DX_Pro) < 1.1
                                 & ABS(mdf_Battuta_DX_Pro) < 1.4
                                 & mdf_Battuta_DX_Pro > 0
                                 )
                                 { mdf_Dx_Pro_entra = -4 }

                              // 31.07.2020 Sn02323
                              // Fianchetto riempitivo, per qualche motivo calcola una Battuta di 5.83116
                              // Comunque deve vincere il fianco piu interno se ho gia una Battuta interna
                              if ( mdf_Battuta_DX > VAR_VAL(idx_att, "X_FiaBatDX")/2
                                 & mdf_Battuta_DX < VAR_VAL(idx_att, "X_FiaBatDX")
                                 & mdf_Battuta_DX_Pro > 1
                                 & mdf_Battuta_DX_Pro < mdf_Battuta_DX/2
                                 & mdf_Battuta_DX_Pro < X_FiaVic/2
                                 )
                                 { mdf_Dx_Pro_entra = -5 }

                             // 15.07.2022 come sx
                              if ( mdf_Battuta_DX_Pro < 0
                                 & mdf_Battuta_DX > X_FiaVic
                                 & mdf_Battuta_DX < X_FiaVic+4
                                 )
                                 {
                                  if (ABS(cam_ang_Fro-cam_ang_Fia) > 30  &  ABS(cam_ang_Fro-cam_ang_Fia) < 60)
                                     { mdf_Dx_Pro_entra = -5.1 }
                                 }
                             }
                         }

                      // Problema sweep figlio di Fiancone
                      // Non può esistere una Battuta>mdf_distNearBatFia+40
                      if (ABS(mdf_Battuta_DX_Pro) > mdf_distNearBatFia+40)
                         {
                          _debug_fiaBatDx_sweep = Fianchi_vic[iX]
                          mdf_Dx_Pro_entra = -1
                         }
                     // 23.11.2023 come Sx
                      if ( ABS(mdf_Battuta_DX_Pro) > mdf_distNearBatFia+15
                         & ABS(mdf_Battuta_DX_Pro) > mdf_Battuta_DX
                         & mdf_Battuta_DX > 10
                         & mdf_Battuta_DX < mdf_distNearBatFia+15
                         )
                         {
                          _debug_fiaBatDx_Fiancone = Fianchi_vic[iX]
                          mdf_Dx_Pro_entra = -1.1
                         }

                     // 24.11.2023 Come Sx Ce004158
                      if ( mdf_Battuta_DX_Pro < 0
                         & mdf_Battuta_DX > mdf_distNearBatFia-10
                         & mdf_Battuta_DX < mdf_distNearBatFia+5
                         // Cosi so che entra qui se non e' gia entrato negli altri controlli
                         & mdf_Dx_Pro_entra > 0
                         )
                         {
                          _debug_fiaBatDx_FiaVic = Fianchi_vic[iX]
                          mdf_Dx_Pro_entra = -1.2
                         }

                     // 16.03.2022 Anta che sporge sotto ma di sostituzione con Fianco Scocca Sost che non sporge sotto come il fianco attivo della Scocca vicina
                      if (STRCMP(VAR_VAL_STR(PADRE(Fianchi_vic[iX], -1), "ORD_SOSTP"), "1") == 0)
                         {
                          if ( STRCMP(VAR_VAL_STR(Fianchi_vic[iX], "ORD_SOST"), "0") == 0
                             | STRCMP(VAR_VAL_STR(Fianchi_vic[iX], "ORD_SOST"), "") == 0
                             )
                             {
                              if (Fianchi_vic > 2)
                                 {
                                 // 06.06.2022 S049859, Sc0322019595 contro EM1052473
                                  if (IS_MATCH(VAR_VAL_STR(idx_att, "MdF_Apertura"), "DX*") )
                                     {
                                      // 29.07.2022 Sc1021159019
                                      //if ( VAR_VAL(idx_att, "Y") > 500
                                      if ( VAR_VAL(idx_att, "Y") > 800
                                         & VAR_VAL(idx_att, "base_0.y") < 250
                                         )
                                         { mdf_Dx_Pro_entra = -6 }
                                     }
                                 }
                             }
                         }

                      if ( mdf_Battuta_DX == 0
                         | mdf_Dx_Pro_entra > 0
                         )
                         {
                          // 22.02.2019
                          mdf_Battuta_DX_OK = 1
                          if ( mdf_Battuta_DX == 0
                             & mdf_Dx_Pro_entra < 0
                             & ABS(mdf_Battuta_DX_Pro) < 2
                             & mdf_Battuta_DX_Pro < 0
                             )
                             {
                              // 04.02.2021 Come SX
                              NEAR_GLOBALE("SchFia_vic", idx_att, 3, 1, "SchAttr*")
                              miSc = 1
                              mSch_Fia = 0
                              while (miSc <= SchFia_vic)
                                 {
                                  mbasySF = VAR_VAL(SchFia_vic[miSc], "base_0.y")
                                  maltySF = VAR_VAL(SchFia_vic[miSc], "alto_0.y")

                                  if ( mbasySF-20 < base_0.y
                                     & maltySF+20 > alto_0.y
                                     )
                                     { mSch_Fia = 1 }

                                  miSc = miSc+1
                                 }
                              if (mSch_Fia == 1)  { mdf_Battuta_DX_OK = 0 }
                             }

                          // 06.08.2020 Sn01820
                          // mdf_distNearBatFia 28.1 per trovare fianco Gola, ma grafica colonna errata senza fianco, trova il Fianco della Colonna accanto
                          // 18.07.2023 come Sx
                          //if (mdf_Battuta_DX_Pro < -1*(X_FiaVic+1.5))
                          if (mdf_Battuta_DX_Pro < -1*(X_FiaVic-1.6))
                             { mdf_Battuta_DX_OK = mdf_Battuta_DX_Pro }

                         // 21.02.2022 Come SX
                          if ( mdf_Battuta_DX_Pro+6 > X_Fia_BatDx/2
                             & mdf_Battuta_DX_Pro-6 < X_Fia_BatDx/2
                             )
                             {
                              if ( ABS(VAR_VAL(idx_att, "MdF_angoloBas")) > 89
                                 & ABS(VAR_VAL(idx_att, "MdF_angoloBas")) < 91
                                 )
                                 {
                                  mdf_idxFiaDx_ctrl = Fianchi_vic[iX]
                                  mdfxfro = VAR_VAL(idx_att, "X")
                                  // MdF_distNearBatFia è a 11.05
                                  // Tramezza o Divisorio attrezzatura interna
                                  // 12.12.2023 da 130 a 99
                                  if (mdfxfro+99 < VAR_VAL(PADRE(mdf_idxFiaDx_ctrl, 2), "X") )
                                     {
                                      NEAR_GLOBALE("mdf_TramDiv", idx_att, 9.5, 1, NOME(mdf_idxFiaDx_ctrl))
                                      if (mdf_TramDiv == 0)
                                         { mdf_Battuta_DX_OK = -999 }
                                     }
                                 }
                             }

                         // 25.02.2022 Sc1052368 Anta inclinata con a destra piu pensili, ma sfalsato, non trovando nessun
                          // altro fianco prendeva questo e faceva uno SbordYInf
                          if (mdf_Dx_Pro_entra == -0.02)
                             {
                              mbasyF = VAR_VAL(Fianchi_vic[iX], "base_0.y")
                              maltyF = VAR_VAL(Fianchi_vic[iX], "alto_0.y")

                              mbasyatt = VAR_VAL(idx_att, "base_0.y")
                              maltyatt = VAR_VAL(idx_att, "alto_0.y")

                              if ( mbasyF-80 > mbasyatt
                                 & maltyF+80 < maltyatt
                                 )
                                 { mdf_Battuta_DX_OK = mdf_Dx_Pro_entra }
                             }

                          // 16.10.2024 PK2024OVB646900 Negativa non va quasi mai bene. Essendo il primo caso da anni metto -2
                          // E' sbagliato che sia MdF_Apertura DX, doveva essere SCOMPDX
                          // Comunque, molto strano non sia mai uscito prima un Fianco a -2
                          // 30.10.2024 M012978 Cabina, anta Diagonale Battuta_X -11
                          if (ABS(CAM_Ang-CAM_AngFia) < 1)
                             {
                              // 08.04.2025 H25011841 anta interna fianco solo da una parte
                              //if (mdf_Battuta_DX_Pro <= -2)  { mdf_Battuta_DX_OK = -222 }
                              if (mdf_Battuta_DX_Pro <= -2.5)  { mdf_Battuta_DX_OK = -222 }
                             }

                          if (mdf_Battuta_DX_OK > 0)
                             {
                              _debug_Dx_camang = CAM_Ang
                              _debug_Dx_camangfia = CAM_AngFia
                              _debug_fiaBatDx = Fianchi_vic[iX]
                              fiaBatDx = Fianchi_vic[iX]
                              X_FiaBatDX = VAR_VAL(Fianchi_vic[iX], "X")
                              mdf_Battuta_DX = mdf_Battuta_DX_Pro
                              _debug_Battuta_X_Dx = Battuta_X_Dx
                              _debug_mdf_Battuta_DX = mdf_Battuta_DX
                              // 24.05.2019 per Ferramente, vedi 21.03.2019
                              if ( ABS(Battuta_X_Dx) > mdf_Battuta_DX
                                 // 20.07.2020 Sn001820, Ca1851074, Ca1823076
                                 //& ABS(Battuta_X_Dx) > 30
                                 & ABS(Battuta_X_Dx) > X_FiaBatDX+1
                                 )
                                 {
                                  Battuta_X_Dx = mdf_Battuta_DX
                                  mdf_Battuta_X = mdf_Battuta_DX
                                 }
                             // 20.01.2025 sporge a Sx e Dx. Stranamente non era mai usicto il problema
                              // Vedi mdf_aperture_NoBatt alla fine se Battuta_X_Dx = 0 allora Battuta_X_Dx = Battuta_SX
                              if ( Battuta_X_Dx == 0
                                 & mdf_Battuta_DX < X_FiaBatDX+1
                                 & mdf_Battuta_DX > 1
                                 )
                                 {
                                  Battuta_X_Dx = mdf_Battuta_DX
                                 }

                             // 24.11.2021 come SX
                              if (ABS(Battuta_X_Dx) == ABS(mdf_Battuta_DX) )
                                 {
                                  if ( mdf_Battuta_DX > 10
                                     & Battuta_X_Dx < 10
                                     )
                                     {
                                      Battuta_X_Dx = mdf_Battuta_DX
                                      mdf_Battuta_X = mdf_Battuta_DX
                                     }
                                 }

                             // 28.10.2016
                              PointInterf_Pro_Dx_Z = INTERFERISCI(Ba2_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
                              // Bifacciale
                              if (ABS(CAM_Ang-CAM_AngFia) == 180)
                                 {
                                  // Non devo cambiare i punti anta perché essendo girata di 180gradi mi va bene considerare
                                  // sempre Ba3_att_allung
                                  PointInterf_Pro_Dx_Z = INTERFERISCI(Ba0_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
                                  // 02.03.2020
                                  dist_0Pro_dx_Z_180 = DISTANZA(Ba0_fia, PointInterf_Pro_Dx_Z)
                                  if (dist_0Pro_dx_Z_180 < 40  &  dist_0Pro_dx_Z_180 > 0)  { Battuta_Z_Dx = dist_0Pro_dx_Z_180 }
                                  if (dist_0Pro_dx_Z_180 < 3   &  dist_0Pro_dx_Z_180 > 0)  { Battuta_Z    = dist_0Pro_dx_Z_180 }
                                 }

                              if (PointInterf_Pro_Dx_Z.x>-1000001 & PointInterf_Pro_Dx_Z.y>-1000001 & PointInterf_Pro_Dx_Z.z>-1000001)
                                 {
                                  dist_2Pro_dx_Z = DISTANZA(Ba2_fia, PointInterf_Pro_Dx_Z)
                                    // 20.07.2023
                                  if (dist_2Pro_dx_Z < 40)  { Battuta_Z_Dx = dist_2Pro_dx_Z }

                                  if (dist_2Pro_dx_Z < 3)
                                     {
                                      if (Battuta_Z == 0)  { Battuta_Z = dist_2Pro_dx_Z }
                                     }
                                  else
                                     {
                                      // 19.01.2021
                                      // Fianchi ridotti con GolaVert
                                      if (IS_IDX(Fianchi_vic[iX]) )
                                         {
                                          mZF = VAR_VAL(Fianchi_vic[iX], "Z")
                                          mZFia = VAR_VAL(Fianchi_vic[iX], "ZFia")
                                          mZ_ori = VAR_VAL(Fianchi_vic[iX], "Z_ori")
                                          mORD_Z = VAR_VAL(Fianchi_vic[iX], "ORD_Z")

                                          mZfiaOrig_ToCtrl = mZFia
                                          if (mZfiaOrig_ToCtrl == 0)  { mZfiaOrig_ToCtrl = mZ_ori }
                                          if (mZfiaOrig_ToCtrl > 100)
                                             {
                                              mdiff_ZGola = mZfiaOrig_ToCtrl-mZF
                                             // 20.07.2023
                                              if (ABS(dist_2Pro_dx_Z-mdiff_ZGola) < 40)  { Battuta_Z_Dx = dist_2Pro_dx_Z-mdiff_ZGola }
                                              if (ABS(dist_2Pro_dx_Z-mdiff_ZGola) < 3)   { Battuta_Z = dist_2Pro_dx_Z-mdiff_ZGola }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                  else
                     {
                      // 21.03.2019
                      // Anta Armadio non-battente che sporge di 55mm. Si vuole avere la BattutaX su Fianco
                      mdf_proseg_BattDxDist = -0.1
                      if ( ABS(mdf_Battuta_DX_Pro) < mdf_distNearBatFia+20
                         & ABS(mdf_Battuta_DX_Pro) > 35
                         & mdf_distNearBatFia > 40
                         )
                         { mdf_proseg_BattDxDist = 1 }

                      // 19.05.2021
                      if (VAR_VAL(idx_att, "MdF_Battuta_X_SbordoX") >= 30)
                         { mdf_proseg_BattDxDist = 2 }

                      if (mdf_proseg_BattDxDist > 0)
                         {
                          // 08.01.2024 Sn19224 doppio Fianco destro. Esempio anta trapezio che prende piu scocche, ci sono FiaSx e FiaDx vicini di scocche diverse
                          mdf_proseg_BattDx_Trap = 0
                          if ( mdf_Battuta_DX > 50
                             & mdf_Battuta_DX_Pro > mdf_Battuta_DX
                             & mdf_Battuta_DX_Pro-30 < mdf_Battuta_DX
                             )
                             {
                              mdf_proseg_BattDx_Trap = 1
                             }

                          // 11.10.2023 A142585 Anta Pensile Cappa con Riempitivi ai lati senza fianchi
                          //if (mdf_Battuta_DX == 0)
                          if ( mdf_Battuta_DX <= 0
                             | mdf_proseg_BattDx_Trap > 0
                             )
                             {
                              if (X_FiaVic < 50)
                                 {
                                  mdf_proseg_BattDxDist = 0
                                  if ( IS_MATCH(MdF_Apertura, "S*") != 1
                                     & IS_MATCH(MdF_Apertura, "D*") != 1
                                     )
                                     { mdf_proseg_BattDxDist = 1 }

                                  // 19.05.2021
                                  if (VAR_VAL(idx_att, "MdF_Battuta_X_SbordoX") >= 30)
                                     { mdf_proseg_BattDxDist = 2 }

                                 // 23.02.2024 PK2024TLS111118_12 Base 2Ante Sinistre perchè quella piu a destra Sborda verso destra
                                  // Fino a 100 Ba0_att_allung o Ba3_att_allung trova la Proiez_fia_Dx
                                  if (ABS(mdf_Battuta_DX_Pro) < mdf_distNearBatFia+5)
                                     {
                                      // Per ora limito, perchè altrimenti sarebbe una Battuta centrale.
                                      // Eventualmente impostare MdF_Battuta_X_SbordoX su VariabiliMdF cos entra nella riga sopra
                                      // 20.01.2025 70 è il limite, impostare MdF_Battuta_X_SbordoX su VariabiliMdF
                                      //if ( mdf_Battuta_DX_Pro < 60
                                      // 22.01.2025 PK2024OVB648129 Finche non fa casino aumento
                                      //if ( mdf_Battuta_DX_Pro < 70
                                      if ( mdf_Battuta_DX_Pro < 95
                                         // 16.12.2024
                                         & mdf_Battuta_DX_Pro > -40
                                         )
                                         { mdf_proseg_BattDxDist = 3 }
                                     }

                                  if (mdf_proseg_BattDxDist > 0)
                                     {
                                      _debug_fiaDxdistNear = Fianchi_vic[iX]
                                      fiaBatDx = Fianchi_vic[iX]
                                      X_FiaBatDX = VAR_VAL(Fianchi_vic[iX], "X")

                                      mdf_Battuta_DX = mdf_Battuta_DX_Pro
                                      mdf_Battuta_X = mdf_Battuta_DX
                                      mdf_Battuta_X_Dx = mdf_Battuta_DX

                                      PointInterf_Pro_Dx_Z = INTERFERISCI(Ba2_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
                                      // Bifacciale
                                      if (ABS(CAM_Ang-CAM_AngFia) == 180)
                                         {
                                          // Non devo cambiare i punti anta perché essendo girata di 180gradi mi va bene considerare
                                          // sempre Ba3_att_allung
                                          PointInterf_Pro_Dx_Z = INTERFERISCI(Ba0_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
                                          // 02.03.2020
                                          dist_0Pro_dx_Z_180 = DISTANZA(Ba0_fia, PointInterf_Pro_Dx_Z)
                                          if (dist_0Pro_dx_Z_180 < 40  &  dist_0Pro_dx_Z_180 > 0)  { Battuta_Z_Dx = dist_0Pro_dx_Z_180 }
                                          if (dist_0Pro_dx_Z_180 < 3   &  dist_0Pro_dx_Z_180 > 0)  { Battuta_Z    = dist_0Pro_dx_Z_180 }
                                         }

                                      if (PointInterf_Pro_Dx_Z.x>-1000001 & PointInterf_Pro_Dx_Z.y>-1000001 & PointInterf_Pro_Dx_Z.z>-1000001)
                                         {
                                          dist_2Pro_dx_Z = DISTANZA(Ba2_fia, PointInterf_Pro_Dx_Z)
                                          if (dist_2Pro_dx_Z < 40)  { Battuta_Z_Dx = dist_2Pro_dx_Z }

                                          if (dist_2Pro_dx_Z < 3)
                                             {
                                              if (Battuta_Z == 0)
                                                 { Battuta_Z = dist_2Pro_dx_Z }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
              else
                 {
                  // 20.09.2019
                  // Fianco al centro. Si vuole avere la BattutaX su Fianco per le Ferramente
                  if ( ABS(mdf_Battuta_DX_dist) < mdf_distNearBatFia+70
                     & ABS(mdf_Battuta_DX_dist) > 35
                     & ABS(mdf_Battuta_DX_dist) > X/2
                     & mdf_distNearBatFia > X/4
                     )
                     {
                      if ( mdf_Battuta_DX == 0
                         & VAR_VAL(idx_att, "mdf_Battuta_X_DX_Pro_Cn") > 0
                         )
                         {
                          if (X_FiaVic < 50)
                             {
                              if ( IS_MATCH(MdF_Apertura, "S*") != 1
                                 & IS_MATCH(MdF_Apertura, "D*") != 1
                                 )
                                 {
                                  _debug_fiaDxdistNear = Fianchi_vic[iX]
                                  fiaBatDx = Fianchi_vic[iX]
                                  X_FiaBatDX = VAR_VAL(Fianchi_vic[iX], "X")

                                  mdf_Battuta_DX = mdf_Battuta_X_DX_Pro_Cn + X_FiaBatDX
                                  mdf_Battuta_X = mdf_Battuta_DX
                                  mdf_Battuta_X_Dx = mdf_Battuta_DX

                                  PointInterf_Pro_Dx_Z = INTERFERISCI(Ba2_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
                                  // Bifacciale
                                  if (ABS(CAM_Ang-CAM_AngFia) == 180)
                                     {
                                      // Non devo cambiare i punti anta perché essendo girata di 180gradi mi va bene considerare
                                      // sempre Ba3_att_allung
                                      PointInterf_Pro_Dx_Z = INTERFERISCI(Ba0_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
                                      // 02.03.2020
                                      dist_0Pro_dx_Z_180 = DISTANZA(Ba0_fia, PointInterf_Pro_Dx_Z)
                                      if (dist_0Pro_dx_Z_180 < 40  &  dist_0Pro_dx_Z_180 > 0)  { Battuta_Z_Dx = dist_0Pro_dx_Z_180 }
                                      if (dist_0Pro_dx_Z_180 < 3   &  dist_0Pro_dx_Z_180 > 0)  { Battuta_Z    = dist_0Pro_dx_Z_180 }
                                     }

                                  if (PointInterf_Pro_Dx_Z.x>-1000001 & PointInterf_Pro_Dx_Z.y>-1000001 & PointInterf_Pro_Dx_Z.z>-1000001)
                                     {
                                      dist_2Pro_dx_Z = DISTANZA(Ba2_fia, PointInterf_Pro_Dx_Z)
                                      if (dist_2Pro_dx_Z < 40)  { Battuta_Z_Dx = dist_2Pro_dx_Z }

                                      if (dist_2Pro_dx_Z < 3)
                                         {
                                          if (Battuta_Z == 0)
                                             { Battuta_Z = dist_2Pro_dx_Z }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
          else
             {
              if ( ABS(mdf_Battuta_DX_dist) < #X+2  &  mdf_Battuta_DX_dist != 0  &  mdf_Battuta_DX_dist > Battuta_DX
                 & mdf_Battuta_DX_dist < 90
                 // 25.05.2017
                 & X_FiaVic < 100
                 )
                 {
                 // 13.12.2018
                  dist_32 = DISTANZA(Ba3_att, Ba2_fia)
                  mdf_diff_ang = CAM_Ang+CAM_AngFia
                  mdf_fia_gir_err = -0.1
                  if (ABS(mdf_diff_ang-360) > 85  &  ABS(mdf_diff_ang-360) < 175)
                     {
                      if ( Battuta_DX > 9  &  Battuta_DX < 18.1
                         & mdf_Battuta_DX_dist > Battuta_DX
                         )
                         { mdf_fia_gir_err = idx_FiaDx_Ctrl_att }
                     }

                  if (mdf_fia_gir_err == -0.1)
                     {
                      _debug_dist_fiaBatDx = idx_FiaDx_Ctrl_att
                      mdf_Battuta_DX = mdf_Battuta_DX_dist
                     }
                 }
             }
          //DISPLAY2(STRCAT("6.MdF_get_Battuta_DX - mdf_Battuta_DX=", STR(mdf_Battuta_DX)))
         }

      if ( IS_MATCH(MdF_Apertura, "D*") == 1
         & mdf_Battuta_DX != 0
         )
         {
          // Nel caso di Apertura dichiarata destra non deve controllare se
          // maggiore di mdf_Battuta_X che potrebbe essere la battuta sinistra
          //if ( mdf_Battuta_DX < #X+5  &  ABS(mdf_Battuta_DX) > ABS(mdf_Battuta_X)
          if ( mdf_Battuta_DX < X_FiaVic+X_add_Limite  &  ABS(mdf_Battuta_DX) > ABS(mdf_Battuta_DX_att)
             & ABS(mdf_Battuta_DX) < 50
             // 21.02.2024 A179338
             & ABS(CAM_Ang-CAM_AngFia) != 90
             )
             {
              // 02.01.2019
              mdf_AperDX_fiaSovrapp = 0
              // X Fianco 19
              // -9.42   7.51
              if (mdf_Battuta_DX < -X_FiaVic/3  &  mdf_Battuta_DX_att > X_FiaVic/3)
                 { mdf_AperDX_fiaSovrapp = 1 }

              if (mdf_AperDX_fiaSovrapp == 0)
                 {
                  _debug_AperDX_mdf_Battuta_DX_att = mdf_Battuta_DX_att
                  _debug_AperDX_fiaBatDx = idx_FiaDx_Ctrl_att
                  _debug_AperDX_BattutaDx = mdf_Battuta_DX
                  mdf_Battuta_X = mdf_Battuta_DX
                 }
             }
          // 10.06.2020 >= perche se mdf_Battuta_SX_att negativa e mdf_Battuta_SX positiva ma con lo stesso valore non entra
           // Per protezione nel caso di elementi *Fia* figli di Fia*
           if ( mdf_Battuta_DX < X_Fia_BatDx+1  &  ABS(mdf_Battuta_DX) >= ABS(mdf_Battuta_DX_att)
              & mdf_Battuta_DX > -X_Fia_BatDx/3
              & ABS(mdf_Battuta_DX) <= X_Fia_BatDx/2 +1
              & mdf_Battuta_DX_att < -3
              )
              {
               _debug_AperDX2_fiaBatDx = idx_FiaDx_Ctrl_att
               _debug_AperDX2_BattutaDx = mdf_Battuta_DX
               mdf_Battuta_X = mdf_Battuta_DX
              }

          // 02.01.2019
          // Protezione grafica non corretta. Fianco da 19. Vedi MdF_get_Battuta_DX_Gen
          // 7.51   -9.42
          if ( mdf_Battuta_DX > X_FiaVic/3  &  ABS(mdf_Battuta_DX) < ABS(mdf_Battuta_DX_att)
             & ABS(mdf_Battuta_DX) < X_FiaVic/2+1
             & mdf_Battuta_DX_att < -X_FiaVic/3
             )
             {
              _debug_AperDX_fiaSovrapp = 1
              mdf_Battuta_X = mdf_Battuta_DX
             }
         }

      if (fia_Dx  |  fia_Sx == 0)
         {
          // Faccio l'Assegnazione di mdf_Battuta_X solo nel caso sono Apertura non-DX
          // così ce l'ho impostata lo stesso dato che può servire anche alla ferramente
          // di Frontali Battenti e dato che adesso il calcolo è comunque corretto
          if (IS_MATCH(MdF_Apertura, "D*") != 1)
             {
             // 17.01.2025 PK2024OVB648179
              mdf_Battuta_DX_NotValid = 0
              if (ABS(CAM_Ang-CAM_AngFia) < 1)
                 {
                  if (IS_MATCH(MdF_Apertura, "S*") == 1)
                     {
                      if (mdf_Battuta_DX < -1)  { mdf_Battuta_DX_NotValid = 1 }
                     }
                 }
              if ( mdf_Battuta_DX < X_FiaVic+X_add_Limite  &  ABS(mdf_Battuta_DX) > ABS(mdf_Battuta_X)
                 & ABS(mdf_Battuta_DX) < 50
                 & mdf_Battuta_DX != 0
                // 17.01.2025 PK2024OVB648179
                 & mdf_Battuta_DX_NotValid == 0
                 )
                 { mdf_Battuta_X = mdf_Battuta_DX }
             }

          if ( mdf_Battuta_DX < X_FiaVic+X_add_Limite  &  ABS(mdf_Battuta_DX) < 50  &  mdf_Battuta_DX != 0
             // 21.02.2024
             & ABS(CAM_Ang-CAM_AngFia) != 90
             )
             {
              // If per protezione se elementi un po sovrapposti, ma non servirebbe
              // Devo consentire una battuta destra anche meta rispetto alla sinistra
              // ma se c'è troppa differenza significa che sto prendendo un fianco
              // del contenitore vicino che è un po sovrapposto al Contenitore che mi
              // interessa
              if (ABS(mdf_Battuta_DX) >= ABS(mdf_Battuta_X)/2 - ABS(mdf_Battuta_X)/6 )
                 {
                  _debug_mdf_Battuta_X_Dx = VAR_VAL(idx_att, "mdf_Battuta_X_Dx")
                  mdf_Battuta_X_Dx_idx = Fianchi_vic[iX]
                  mdf_Battuta_X_Dx = mdf_Battuta_DX
                 }
             }
         }
   }

  // 30.01.2019
   PROCEDURA MdF_Ctrl_doppioFia_Battuta_SX
   {
      mdf_b0_dFBS = VAR_VAL(mdf_ctrl_dFBS, "base_0.y")
      mdf_a0_dFBS = VAR_VAL(mdf_ctrl_dFBS, "alto_0.y")
      if (Aly_Fia-110 > mdf_b0_dFBS  &  Bay_Fia+110 < mdf_a0_dFBS)
         {
          if (fia_Sx)
             {
              X_mdf_ctrl_dFBS = VAR_VAL(mdf_ctrl_dFBS, "X")
              mdf_doppio_fiaSx_prosegui = 0
              PointInterf_Sx = INTERFERISCI(Ba2_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
              // Bifacciale
              if (ABS(CAM_Ang-CAM_AngFia) == 180)
                 {
                  PointInterf_Sx = INTERFERISCI(Ba0_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
                 }
              if (PointInterf_Sx.x>-1000001 & PointInterf_Sx.y>-1000001 & PointInterf_Sx.z>-1000001)
                 {
                  dist_0Pro_sx = DISTANZA(Ba0_att, PointInterf_Sx)
                  dist_3Pro_dx = DISTANZA(Ba3_att, PointInterf_Sx)

                  Proiez_fia_Sx = 0
                  Proiez_fia_Dx = 0
                  if (dist_0Pro_sx < dist_3Pro_dx)  { Proiez_fia_Sx = 1 }
                  else                              { Proiez_fia_Dx = 1 }

                  if (Proiez_fia_Sx)
                     {
                      mdf_Battuta_X_Sx_Pro = dist_0Pro_sx +0.01

                      // Attenzione Ante interne ai fianchi
                      mdf_Battuta_SX_Pro = dist_0Pro_sx + 0.01

                      if (mdf_Battuta_X_Sx_Pro == 0)  { mdf_Battuta_X_Sx_Pro = mdf_Battuta_X_Sx_Pro + 0.000000001 }
                      if (mdf_Battuta_SX_Pro == 0)    { mdf_Battuta_SX_Pro = mdf_Battuta_SX_Pro + 0.000000001 }

                      if (dist_3Pro_dx > X_mdf_ctrl_dFBS)
                         {
                          mdf_Battuta_X_Sx_Pro = -1*mdf_Battuta_X_Sx_Pro
                          mdf_Battuta_SX_Pro = -1*mdf_Battuta_SX_Pro
                         }

                      if (mdf_Battuta_SX_Pro > X_FiaVic/2  &  ABS(mdf_Battuta_SX_Pro) <= X_FiaVic+3)
                         {
                          mdf_doppio_fiaSx_prosegui = 1
                          // 20.11.2023 H23000089_LIVINGROOM18 Ante a ELLE parte Sx piu grande parte Dx
                          if (mdf_Battuta_SX > 10)
                             {
                              if (mdf_Battuta_SX_Pro+1 < mdf_Battuta_SX)
                                 {
                                  mdf_doppio_fiaSx_prosegui = -1
                                 }
                             }
                         }
                      // 16.12.2024 PK2023TGM629534_2412
                      if (mdf_doppio_fiaSx_prosegui == 0)
                         {
                          if ( ABS(mdf_Battuta_SX_Pro) < mdf_distNearBatFia+20
                             & ABS(mdf_Battuta_SX_Pro) > 35
                             & mdf_distNearBatFia > 40
                             // 19.12.2024
                             & mdf_Battuta_SX_Pro > -15
                             )
                             {
                              mdf_doppio_fiaSx_prosegui = 1.1
                              // 30.01.2025 PK 633532 Fianco Cassettiera piu interno
                              if (mdf_Battuta_SX > 18)
                                 {
                                  if (mdf_Battuta_SX_Pro-1 > mdf_Battuta_SX)
                                     {
                                      mdf_doppio_fiaSx_prosegui = -1.1
                                      mdf_doppio_fiaSx_proseguiNO_idx = Fianchi_vic[iX]
                                     }
                                 }
                             }
                         }
                     }
                 }

              if (mdf_doppio_fiaSx_prosegui > 0)
                 {
                  mdf_doppio_fiaSx_inY_b0 = VAR_VAL(Fianchi_vic[iX], "base_0.y")
                  mdf_doppio_fiaSx_inY_a0 = VAR_VAL(Fianchi_vic[iX], "alto_0.y")
                  if (mdf_doppio_fiaSx_inY_basso == -1)  { mdf_doppio_fiaSx_inY_basso = Fianchi_vic[iX] }
                  if (mdf_doppio_fiaSx_inY_alto == -1)   { mdf_doppio_fiaSx_inY_alto = Fianchi_vic[iX] }
                 // 13.05.2022
                  mdf_doppio_fiaSx_Battuta_X = mdf_Battuta_SX_Pro

                  mdFd_s = 1
                  while (mdFd_s <= Fianchi_vic)
                     {
                      // 30.10.2023 Sn14485
                      mdf_Ingom_fia = 0
                      // 17.10.2024 Come MdF_while_X. Dal 2.1 c'era gia
                      if ( IS_MATCH(NOME(PADRE(Fianchi_vic[mdFd_s], 1)), "*Fia*") == 1
                         & PADRE(Fianchi_vic[mdFd_s], 1) != Fianchi_vic[mdFd_s]
                         )
                         {
                          if ( IS_MATCH(NOME(Fianchi_vic[mdFd_s]), "Ingombro*Fianco*") == 1
                             | IS_MATCH(NOME(Fianchi_vic[mdFd_s]), "*Fia*Ctrl*") == 1
                             | IS_MATCH(NOME(Fianchi_vic[mdFd_s]), "Mas*Fia*") == 1
                             | STR_INDEX_OF(NOME(Fianchi_vic[mdFd_s]), 0, NOME(PADRE(Fianchi_vic[mdFd_s], 1))) > -1
                             | IS_MATCH(NOME(Fianchi_vic[mdFd_s]), "*Fia*graf*") == 1
                             )
                             { mdf_Ingom_fia = 1 }

                          if (IS_MATCH(NOME(PADRE(Fianchi_vic[mdFd_s], 1)), "Fia*") == 1)
                             {
                               if (IS_MATCH(NOME(Fianchi_vic[mdFd_s]), "grf_Fia*") == 1)
                                  { mdf_Ingom_fia = 1.1 }
                             }
                         }
                      if (IS_MATCH(NOME(Fianchi_vic[mdFd_s]), "Graf*Fia*") == 1  &  VAR_VAL(Fianchi_vic[mdFd_s], "X") < 6)
                         {
                          if (IS_MATCH(NOME(PADRE(Fianchi_vic[mdFd_s], 2)), "*Fia*") == 1)
                             { mdf_Ingom_fia = 2 }
                         }

                      if (IS_MATCH(NOME(Fianchi_vic[mdFd_s]), "Geom*Fia*") == 1)
                         {
                          forma = FORMA(Fianchi_vic[mdFd_s])
                          if ( IS_MATCH(NOME(PADRE(Fianchi_vic[mdFd_s], 1)), "*Fia*") == 1
                             // 2=sweep Per ora aggiungo anche controllo su forma, ma probabilmente non serve
                             & forma == 2
                             )
                             { mdf_Ingom_fia = 2.1 }
                         }
                     // 17.01.2025
                      if ( IS_MATCH(NOME(Fianchi_vic[mdFd_s]), "*Copri*ia*") == 1
                         | IS_MATCH(NOME(PADRE(Fianchi_vic[mdFd_s], 1)), "*Copri*ia*") == 1
                         )
                         {
                          if (VAR_VAL(Fianchi_vic[mdFd_s], "X") <= 12)
                             { mdf_Ingom_fia = 2.2 }
                         }
                      // 14.10.2024 Come MdF_while_X Vedi Sc1055930 Basette sotto non escono
                      // FiancoChiusura in accosto a Colonne Slide che hanno la Battuta_X a 71 sul FiancoInterno
                      if (STRLEN(mdF_arch_NO_BatFia) > 2)
                         {
                          if (IS_MATCH(NOME(Fianchi_vic[mdFd_s]), mdF_arch_NO_BatFia) == 1)
                             { mdf_Ingom_fia = 3 }

                          // Se è usato l' archetipo fianco in Scocche che non dovrebbe fare da Fianco Battuta, esempio Riempitivi
                          if (IS_MATCH(NOME(PADRE(Fianchi_vic[mdFd_s], 1)), mdF_arch_NO_BatFia) == 1)
                             { mdf_Ingom_fia = 4 }
                         }
                      if (VAR_VAL(Fianchi_vic[mdFd_s], "X") < 5)  { mdf_Ingom_fia = 5 }

                      // 08.11.2019 SC1048554,1048696
                      if ( IS_MATCH(NOME(Fianchi_vic[mdFd_s]), "MdF_Ferr*") != 1
                         & IS_MATCH(NOME(Fianchi_vic[mdFd_s]), "MdF_*Fianco") != 1
                         & IS_MATCH(NOME(Fianchi_vic[mdFd_s]), "MdF_Sat*Fia*") != 1
                         & IS_MATCH(NOME(Fianchi_vic[mdFd_s]), "_cont_collide*Fia*") != 1
                         & IS_MATCH(NOME(Fianchi_vic[mdFd_s]), "_cont_collide*Div*") != 1
                         & IS_MATCH(NOME(Fianchi_vic[mdFd_s]), "*Fia*collide*") != 1
                         // 30.10.2023 Sn14485
                         & mdf_Ingom_fia == 0
                         )
                         {
                          // 13.02.2019 per M4 vecchio su XP
                          mdfba0_fia_x = VAR_VAL(Fianchi_vic[mdFd_s], "base_1.x")
                          mdfba0_fia_z = VAR_VAL(Fianchi_vic[mdFd_s], "base_1.z")
                          Ba0_fia_int = [mdfba0_fia_x, 0, mdfba0_fia_z]
                          mdfba1_fia_x = VAR_VAL(Fianchi_vic[mdFd_s], "base_1.x")
                          mdfba1_fia_z = VAR_VAL(Fianchi_vic[mdFd_s], "base_1.z")
                          Ba1_fia_int = [mdfba1_fia_x, 0, mdfba1_fia_z]
                          mdfba2_fia_x = VAR_VAL(Fianchi_vic[mdFd_s], "base_2.x")
                          mdfba2_fia_z = VAR_VAL(Fianchi_vic[mdFd_s], "base_2.z")
                          Ba2_fia_int = [mdfba2_fia_x, 0, mdfba2_fia_z]
                          mdfba3_fia_x = VAR_VAL(Fianchi_vic[mdFd_s], "base_3.x")
                          mdfba3_fia_z = VAR_VAL(Fianchi_vic[mdFd_s], "base_3.z")
                          Ba3_fia_int = [mdfba3_fia_x, 0, mdfba3_fia_z]
                          Bay_Fia_int = VAR_VAL(Fianchi_vic[mdFd_s], "base_0.y")
                          Aly_Fia_int = VAR_VAL(Fianchi_vic[mdFd_s], "alto_0.y")
                          dist_02_int = DISTANZA(Ba0_att, Ba2_fia_int)
                          dist_31_int = DISTANZA(Ba3_att, Ba1_fia_int)

                          CAM_AngFia_int = ANG_TOT2(Fianchi_vic[mdFd_s])

                          fia_Sx_int = 0
                          fia_Dx_int = 0
                          if (dist_02_int < dist_31_int)  { fia_Sx_int = 1 }
                          else                            { fia_Dx_int = 1 }

                          if (fia_Sx_int)
                             {
                              // 27.03.2019
                              // Devo ricontrollare se il fianco_int e' effettivamente corretto per Battuta_SX
                              mdf_doppio_fiaSx_prosegui = -0.5
                              PointInterf_Sx = INTERFERISCI(Ba2_fia_int, CAM_AngFia_int+90, Ba3_att, Ba0_att_allung)
                              // Bifacciale
                              if (ABS(CAM_Ang-CAM_AngFia_int) == 180)
                                 {
                                  PointInterf_Sx = INTERFERISCI(Ba0_fia_int, CAM_AngFia_int+90, Ba3_att, Ba0_att_allung)
                                 }
                              if (PointInterf_Sx.x>-1000001 & PointInterf_Sx.y>-1000001 & PointInterf_Sx.z>-1000001)
                                 {
                                  dist_0Pro_sx = DISTANZA(Ba0_att, PointInterf_Sx)
                                  dist_3Pro_dx = DISTANZA(Ba3_att, PointInterf_Sx)

                                  Proiez_fia_Sx = 0
                                  Proiez_fia_Dx = 0
                                  if (dist_0Pro_sx < dist_3Pro_dx)  { Proiez_fia_Sx = 1 }
                                  else                              { Proiez_fia_Dx = 1 }

                                  if (Proiez_fia_Sx)
                                     {
                                      mdf_Battuta_X_Sx_Pro = dist_0Pro_sx +0.01

                                      // Attenzione Ante interne ai fianchi
                                      mdf_Battuta_SX_Pro = dist_0Pro_sx + 0.01

                                      if (mdf_Battuta_X_Sx_Pro == 0)  { mdf_Battuta_X_Sx_Pro = mdf_Battuta_X_Sx_Pro + 0.000000001 }
                                      if (mdf_Battuta_SX_Pro == 0)    { mdf_Battuta_SX_Pro = mdf_Battuta_SX_Pro + 0.000000001 }

                                      if (dist_3Pro_dx > X_mdf_ctrl_dFBS)
                                         {
                                          mdf_Battuta_X_Sx_Pro = -1*mdf_Battuta_X_Sx_Pro
                                          mdf_Battuta_SX_Pro = -1*mdf_Battuta_SX_Pro
                                         }

                                      if (mdf_Battuta_SX_Pro > X_FiaVic/3  &  ABS(mdf_Battuta_SX_Pro) <= X_FiaVic+3)
                                         { mdf_doppio_fiaSx_prosegui = 2 }

                                      // 16.12.2024 PK2023TGM629534_2412
                                      if ( ABS(mdf_Battuta_SX_Pro) < mdf_distNearBatFia+18
                                         & ABS(mdf_Battuta_SX_Pro) > 35
                                         & mdf_distNearBatFia > 40
                                         // 18.12.2024 PK059805
                                         & mdf_Battuta_SX_Pro > -15
                                         )
                                         {
                                          mdf_doppio_fiaSx_prosegui = 2.1
                                          mdf_doppio_fiaSx_prosegui_idx = Fianchi_vic[mdFd_s]
                                         }
                                     }
                                 }
                              if (mdf_doppio_fiaSx_prosegui >= 2)
                                 {
                                  mdf_doppio_fiaSx_inY_b0_test = VAR_VAL(Fianchi_vic[mdFd_s], "base_0.y")
                                  mdf_doppio_fiaSx_inY_a0_test = VAR_VAL(Fianchi_vic[mdFd_s], "alto_0.y")

                                 // 31.10.2024 A177579 Triplo fianco di Battuta
                                  // Nel caso precedente 17.10.2024 Ce10363 il problema non era uscito perchè il fianco in mezzo era il Pannello
                                  // e quindi non considerato. La modifica del 17.10 era corretta ma incompleta
                                  mdf_doppio_fiaSx_inY_b0_att = mdf_doppio_fiaSx_inY_b0
                                  if (IS_IDX(mdf_doppio_fiaSx_inY_basso) )
                                     {
                                      mdf_doppio_fiaSx_inY_b0_att = VAR_VAL(mdf_doppio_fiaSx_inY_basso, "base_0.y")
                                     }

                                  //if ( mdf_doppio_fiaSx_inY_b0_test+1 < mdf_doppio_fiaSx_inY_b0
                                  //   & mdf_doppio_fiaSx_inY_a0_test-1 < mdf_doppio_fiaSx_inY_b0
                                  if ( mdf_doppio_fiaSx_inY_b0_test+1 < mdf_doppio_fiaSx_inY_b0_att
                                     & mdf_doppio_fiaSx_inY_a0_test-1 < mdf_doppio_fiaSx_inY_b0_att
                                     & mdf_doppio_fiaSx_inY_a0_test-110 > mdf_b0_dFBS
                                     )
                                     {
                                      mdf_doppio_fiaSx_inY_basso = Fianchi_vic[mdFd_s]
                                      //mdf_doppio_fiaSx_inY_basso_debug = Fianchi_vic[mdFd_s]
                                      mdf_doppio_fiaSx_Battuta_X = mdf_Battuta_SX_Pro
                                     }
                                  if ( mdf_doppio_fiaSx_inY_a0_test-1 > mdf_doppio_fiaSx_inY_a0
                                     & mdf_doppio_fiaSx_inY_b0_test+1 > mdf_doppio_fiaSx_inY_a0
                                     & mdf_doppio_fiaSx_inY_b0_test+110 < mdf_a0_dFBS
                                     )
                                     {
                                      mdf_doppio_fiaSx_inY_alto = Fianchi_vic[mdFd_s]
                                      //mdf_doppio_fiaSx_inY_alto_debug = Fianchi_vic[mdFd_s]
                                      // 20.11.2023 H23000089_LIVINGROOM18 Ante a ELLE parte Sx piu grande parte Dx
                                      //mdf_doppio_fiaSx_Battuta_X = mdf_Battuta_SX_Pro
                                      mdf_doppio_fiaSx_Battuta_OK = 1
                                      mdf_doppio_fiaSx_mdf_Battuta_X_att = mdf_doppio_fiaSx_Battuta_X
                                      if ( mdf_doppio_fiaSx_Battuta_X > 10
                                         & mdf_doppio_fiaSx_Battuta_X > mdf_Battuta_SX_Pro
                                         )
                                         {
                                          mdf_doppio_fiaSx_Battuta_OK = -1
                                         }
                                      if (mdf_doppio_fiaSx_Battuta_OK > 0)
                                         {
                                          mdf_doppio_fiaSx_Battuta_X = mdf_Battuta_SX_Pro
                                          mdf_doppio_fiaSx_B_deb = mdf_doppio_fiaSx_inY_alto
                                         }
                                     }

                                  if ( mdf_doppio_fiaSx_inY_basso > -1  &  mdf_doppio_fiaSx_inY_alto > -1
                                     & mdf_doppio_fiaSx_inY_basso != mdf_doppio_fiaSx_inY_alto
                                     )
                                     {
                                      mdf_y_sx_basso = VAR_VAL(mdf_doppio_fiaSx_inY_basso, "Y")
                                      mdf_y_sx_alto = VAR_VAL(mdf_doppio_fiaSx_inY_alto, "Y")
                                      if (mdf_y_sx_basso+mdf_y_sx_alto > 3*y_Fro/4)
                                         {
                                          mdf_doppio_fiaSx_inY_Battuta_X = Fianchi_vic[iX]
                                         }
                                      else
                                         {
                                          // 17.10.2024 Ce10363 FiancoBase + Pannello + FiancoPensile
                                          // oltre ad essere un caso di triplo Fianco di Battuta_X c'è in mezzo un
                                          // Pannello uso Fianco che però non viene considerato
                                          // In piu c'era uno SbordoYInf di 90
                                          mdf_basy_sx_basso = VAR_VAL(mdf_doppio_fiaSx_inY_basso, "base_0.y")
                                          mdf_alty_sx_alto = VAR_VAL(mdf_doppio_fiaSx_inY_alto, "alto_0.y")
                                          if (mdf_Battuta_SX_Pro > X_FiaVic/2+1  &  ABS(mdf_Battuta_SX_Pro) < X_FiaVic)
                                             {
                                              if ( mdf_alty_sx_alto-mdf_basy_sx_basso +180 > y_Fro
                                                 & mdf_alty_sx_alto-mdf_basy_sx_basso -180 < y_Fro
                                                 )
                                                 {
                                                  mdf_doppio_fiaSx_inY_Battuta_X = mdf_doppio_fiaSx_inY_basso
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                      mdFd_s = mdFd_s+1
                     }
                 }
             }
         }
   }

  // 30.01.2019
   PROCEDURA MdF_Ctrl_doppioFia_Battuta_DX
   {
      mdf_b0_dFBD = VAR_VAL(mdf_ctrl_dFBD, "base_0.y")
      mdf_a0_dFBD = VAR_VAL(mdf_ctrl_dFBD, "alto_0.y")
      if (Aly_Fia-110 > mdf_b0_dFBD  &  Bay_Fia+110 < mdf_a0_dFBD)
         {
          if (fia_Dx)
             {
              X_mdf_ctrl_dFBD = VAR_VAL(mdf_ctrl_dFBD, "X")
              mdf_doppio_fiaDx_prosegui = 0
              PointInterf_Pro = INTERFERISCI(Ba1_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
              // Bifacciale
              if (ABS(CAM_Ang-CAM_AngFia) == 180)
                 {
                  // Non devo cambiare i punti anta perché essendo girata di 180gradi mi va bene considerare
                  // sempre Ba3_att_allung
                  //PointInterf_Pro = INTERFERISCI(Ba3_fia, CAM_AngFia+90, Ba0_att_allung, Ba3_att)
                  PointInterf_Pro = INTERFERISCI(Ba3_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
                 }

              if (PointInterf_Pro.x>-1000001 & PointInterf_Pro.y>-1000001 & PointInterf_Pro.z>-1000001)
                 {
                  dist_0Pro_sx = DISTANZA(Ba0_att, PointInterf_Pro)
                  dist_3Pro_dx = DISTANZA(Ba3_att, PointInterf_Pro)

                  Proiez_fia_Sx = 0
                  Proiez_fia_Dx = 0
                  if (dist_0Pro_sx < dist_3Pro_dx)  { Proiez_fia_Sx = 1 }
                  else                              { Proiez_fia_Dx = 1 }

                  if (Proiez_fia_Dx)
                     {
                      mdf_Battuta_X_Dx_Pro = dist_3Pro_dx +0.01

                      mdf_Battuta_DX_Pro = dist_3Pro_dx + 0.01

                      if (dist_0Pro_sx > X_mdf_ctrl_dFBD)
                         {
                          mdf_Battuta_X_Dx_Pro = -1*mdf_Battuta_X_Dx_Pro
                          mdf_Battuta_DX_Pro = -1*mdf_Battuta_DX_Pro
                         }

                      if (mdf_Battuta_DX_Pro > X_FiaVic/2  &  ABS(mdf_Battuta_DX_Pro) <= X_FiaVic+3)
                         {
                          mdf_doppio_fiaDx_prosegui = 1
                          // 20.11.2023 H23000089_LIVINGROOM18 Ante a ELLE parte Sx piu grande parte Dx
                          if (mdf_Battuta_DX > 10)
                             {
                              if (mdf_Battuta_DX_Pro+1 < mdf_Battuta_DX)
                                 {
                                  mdf_doppio_fiaDx_prosegui = -1
                                 }
                             }
                         }
                      // 16.12.2024 Come Sx
                      if (mdf_doppio_fiaDx_prosegui == 0)
                         {
                          if ( ABS(mdf_Battuta_DX_Pro) < mdf_distNearBatFia+20
                             & ABS(mdf_Battuta_DX_Pro) > 35
                             & mdf_distNearBatFia > 40
                             // 19.12.2024
                             & mdf_Battuta_DX_Pro > -15
                             )
                             {
                              mdf_doppio_fiaDx_prosegui = 1.1
                              // 30.01.2025 PK 633532 Fianco Cassettiera piu interno
                              if (mdf_Battuta_DX > 18)
                                 {
                                  if (mdf_Battuta_DX_Pro-1 > mdf_Battuta_DX)
                                     {
                                      mdf_doppio_fiaDx_prosegui = -1.1
                                     }
                                 }
                             }
                         }
                     }
                 }

              if (mdf_doppio_fiaDx_prosegui > 0)
                 {
                  mdf_doppio_fiaDx_inY_b0 = VAR_VAL(Fianchi_vic[iX], "base_0.y")
                  mdf_doppio_fiaDx_inY_a0 = VAR_VAL(Fianchi_vic[iX], "alto_0.y")
                  if (mdf_doppio_fiaDx_inY_basso == -1)  { mdf_doppio_fiaDx_inY_basso = Fianchi_vic[iX] }
                  if (mdf_doppio_fiaDx_inY_alto == -1)   { mdf_doppio_fiaDx_inY_alto = Fianchi_vic[iX] }
                 // 13.05.2022
                  mdf_doppio_fiaDx_Battuta_X = mdf_Battuta_DX_Pro
                  mdFd_d = 1
                  while (mdFd_d <= Fianchi_vic)
                     {
                      // 30.10.2023 Sn14485
                      mdf_Ingom_fia = 0
                      // 17.10.2024 Come MdF_while_X. Dal 2.1 c'era gia
                      if ( IS_MATCH(NOME(PADRE(Fianchi_vic[mdFd_d], 1)), "*Fia*") == 1
                         & PADRE(Fianchi_vic[mdFd_d], 1) != Fianchi_vic[mdFd_d]
                         )
                         {
                          if ( IS_MATCH(NOME(Fianchi_vic[mdFd_d]), "Ingombro*Fianco*") == 1
                             | IS_MATCH(NOME(Fianchi_vic[mdFd_d]), "*Fia*Ctrl*") == 1
                             | IS_MATCH(NOME(Fianchi_vic[mdFd_d]), "Mas*Fia*") == 1
                             | STR_INDEX_OF(NOME(Fianchi_vic[mdFd_d]), 0, NOME(PADRE(Fianchi_vic[mdFd_d], 1))) > -1
                             | IS_MATCH(NOME(Fianchi_vic[mdFd_d]), "*Fia*graf*") == 1
                             )
                             { mdf_Ingom_fia = 1 }

                          if (IS_MATCH(NOME(PADRE(Fianchi_vic[mdFd_d], 1)), "Fia*") == 1)
                             {
                               if (IS_MATCH(NOME(Fianchi_vic[mdFd_d]), "grf_Fia*") == 1)
                                  { mdf_Ingom_fia = 1.1 }
                             }
                         }
                      if (IS_MATCH(NOME(Fianchi_vic[mdFd_d]), "Graf*Fia*") == 1  &  VAR_VAL(Fianchi_vic[mdFd_d], "X") < 6)
                         {
                          if (IS_MATCH(NOME(PADRE(Fianchi_vic[mdFd_d], 2)), "*Fia*") == 1)
                             { mdf_Ingom_fia = 2 }
                         }
                      if (IS_MATCH(NOME(Fianchi_vic[mdFd_d]), "Geom*Fia*") == 1)
                         {
                          forma = FORMA(Fianchi_vic[mdFd_d])
                          if ( IS_MATCH(NOME(PADRE(Fianchi_vic[mdFd_d], 1)), "*Fia*") == 1
                             // 2=sweep Per ora aggiungo anche controllo su forma, ma probabilmente non serve
                             & forma == 2
                             )
                             { mdf_Ingom_fia = 2.1 }
                         }
                     // 17.01.2025
                      if ( IS_MATCH(NOME(Fianchi_vic[mdFd_d]), "*Copri*ia*") == 1
                         | IS_MATCH(NOME(PADRE(Fianchi_vic[mdFd_d], 1)), "*Copri*ia*") == 1
                         )
                         {
                          if (VAR_VAL(Fianchi_vic[mdFd_d], "X") <= 12)
                             { mdf_Ingom_fia = 2.2 }
                         }
                      // 14.10.2024 Come MdF_while_X. Vedi Sc1055930 Basette sotto non escono
                      // FiancoChiusura in accosto a Colonne Slide che hanno la Battuta_X a 71 sul FiancoInterno
                      if (STRLEN(mdF_arch_NO_BatFia) > 2)
                         {
                          if (IS_MATCH(NOME(Fianchi_vic[mdFd_d]), mdF_arch_NO_BatFia) == 1)
                             { mdf_Ingom_fia = 3 }

                          // Se è usato l' archetipo fianco in Scocche che non dovrebbe fare da Fianco Battuta, esempio Riempitivi
                          if (IS_MATCH(NOME(PADRE(Fianchi_vic[mdFd_d], 1)), mdF_arch_NO_BatFia) == 1)
                             { mdf_Ingom_fia = 4 }
                         }
                      if (VAR_VAL(Fianchi_vic[mdFd_d], "X") < 5)  { mdf_Ingom_fia = 5 }

                      // 08.11.2019 SC1048554,1048696
                      if ( IS_MATCH(NOME(Fianchi_vic[mdFd_d]), "MdF_Ferr*") != 1
                         & IS_MATCH(NOME(Fianchi_vic[mdFd_d]), "MdF_*Fianco") != 1
                         & IS_MATCH(NOME(Fianchi_vic[mdFd_d]), "MdF_Sat*Fia*") != 1
                         & IS_MATCH(NOME(Fianchi_vic[mdFd_d]), "_cont_collide*Fia*") != 1
                         & IS_MATCH(NOME(Fianchi_vic[mdFd_d]), "_cont_collide*Div*") != 1
                         & IS_MATCH(NOME(Fianchi_vic[mdFd_d]), "*Fia*collide*") != 1
                         // 30.10.2023 Sn14485
                         & mdf_Ingom_fia == 0
                         )
                         {
                          // 13.02.2019 per M4 vecchio su XP
                          mdfba1_fia_x = VAR_VAL(Fianchi_vic[mdFd_d], "base_1.x")
                          mdfba1_fia_z = VAR_VAL(Fianchi_vic[mdFd_d], "base_1.z")
                          Ba1_fia_int = [mdfba1_fia_x, 0, mdfba1_fia_z]
                          mdfba2_fia_x = VAR_VAL(Fianchi_vic[mdFd_d], "base_2.x")
                          mdfba2_fia_z = VAR_VAL(Fianchi_vic[mdFd_d], "base_2.z")
                          Ba2_fia_int = [mdfba2_fia_x, 0, mdfba2_fia_z]
                          mdfba3_fia_x = VAR_VAL(Fianchi_vic[mdFd_d], "base_3.x")
                          mdfba3_fia_z = VAR_VAL(Fianchi_vic[mdFd_d], "base_3.z")
                          Ba3_fia_int = [mdfba3_fia_x, 0, mdfba3_fia_z]
                          Bay_Fia_int = VAR_VAL(Fianchi_vic[mdFd_d], "base_0.y")
                          Aly_Fia_int = VAR_VAL(Fianchi_vic[mdFd_d], "alto_0.y")
                          dist_02_int = DISTANZA(Ba0_att, Ba2_fia_int)
                          dist_31_int = DISTANZA(Ba3_att, Ba1_fia_int)

                          CAM_AngFia_int = ANG_TOT2(Fianchi_vic[mdFd_d])

                          fia_Sx_int = 0
                          fia_Dx_int = 0
                          if (dist_02_int < dist_31_int)  { fia_Sx_int = 1 }
                          else                            { fia_Dx_int = 1 }

                          if (fia_Dx_int)
                             {
                              // 27.03.2019
                              // Devo ricontrollare se il fianco_int e' effettivamente corretto per Battuta_DX
                              mdf_doppio_fiaDx_prosegui = -0.5
                              PointInterf_Pro = INTERFERISCI(Ba1_fia_int, CAM_AngFia_int+90, Ba0_att, Ba3_att_allung)
                              // Bifacciale
                              if (ABS(CAM_Ang-CAM_AngFia_int) == 180)
                                 {
                                  // Non devo cambiare i punti anta perché essendo girata di 180gradi mi va bene considerare
                                  // sempre Ba3_att_allung
                                  //PointInterf_Pro = INTERFERISCI(Ba3_fia, CAM_AngFia+90, Ba0_att_allung, Ba3_att)
                                  PointInterf_Pro = INTERFERISCI(Ba3_fia_int, CAM_AngFia_int+90, Ba0_att, Ba3_att_allung)
                                 }

                              if (PointInterf_Pro.x>-1000001 & PointInterf_Pro.y>-1000001 & PointInterf_Pro.z>-1000001)
                                 {
                                  dist_0Pro_sx = DISTANZA(Ba0_att, PointInterf_Pro)
                                  dist_3Pro_dx = DISTANZA(Ba3_att, PointInterf_Pro)

                                  Proiez_fia_Sx = 0
                                  Proiez_fia_Dx = 0
                                  if (dist_0Pro_sx < dist_3Pro_dx)  { Proiez_fia_Sx = 1 }
                                  else                              { Proiez_fia_Dx = 1 }

                                  if (Proiez_fia_Dx)
                                     {
                                      mdf_Battuta_X_Dx_Pro = dist_3Pro_dx +0.01

                                      mdf_Battuta_DX_Pro = dist_3Pro_dx + 0.01

                                      if (dist_0Pro_sx > X_mdf_ctrl_dFBD)
                                         {
                                          mdf_Battuta_X_Dx_Pro = -1*mdf_Battuta_X_Dx_Pro
                                          mdf_Battuta_DX_Pro = -1*mdf_Battuta_DX_Pro
                                         }

                                      if (mdf_Battuta_DX_Pro > X_FiaVic/3  &  ABS(mdf_Battuta_DX_Pro) <= X_FiaVic+3)
                                         { mdf_doppio_fiaDx_prosegui = 2 }

                                      // 16.12.2024
                                      if ( ABS(mdf_Battuta_DX_Pro) < mdf_distNearBatFia+18
                                         & ABS(mdf_Battuta_DX_Pro) > 35
                                         & mdf_distNearBatFia > 40
                                         // 18.12.2024 PK059805
                                         & mdf_Battuta_DX_Pro > -15
                                         )
                                         {
                                          mdf_doppio_fiaDx_prosegui = 2.1
                                          mdf_doppio_fiaDx_prosegui_idx = Fianchi_vic[mdFd_d]
                                         }
                                     }
                                 }

                              if (mdf_doppio_fiaDx_prosegui >= 2)
                                 {
                                  mdf_doppio_fiaDx_inY_b0_test = VAR_VAL(Fianchi_vic[mdFd_d], "base_0.y")
                                  mdf_doppio_fiaDx_inY_a0_test = VAR_VAL(Fianchi_vic[mdFd_d], "alto_0.y")

                                 // 31.10.2024 A177579 Triplo fianco di Battuta
                                  // Nel caso precedente 17.10.2024 Ce10363 il problema non era uscito perchè il fianco in mezzo era il Pannello
                                  // e quindi non considerato. La modifica del 17.10 era corretta ma incompleta
                                  mdf_doppio_fiaDx_inY_b0_att = mdf_doppio_fiaDx_inY_b0
                                  if (IS_IDX(mdf_doppio_fiaDx_inY_basso) )
                                     {
                                      mdf_doppio_fiaDx_inY_b0_att = VAR_VAL(mdf_doppio_fiaDx_inY_basso, "base_0.y")
                                     }

                                  //if ( mdf_doppio_fiaDx_inY_b0_test+1 < mdf_doppio_fiaDx_inY_b0
                                  //   & mdf_doppio_fiaDx_inY_a0_test-1 < mdf_doppio_fiaDx_inY_b0
                                  if ( mdf_doppio_fiaDx_inY_b0_test+1 < mdf_doppio_fiaDx_inY_b0_att
                                     & mdf_doppio_fiaDx_inY_a0_test-1 < mdf_doppio_fiaDx_inY_b0_att
                                     & mdf_doppio_fiaDx_inY_a0_test-110 > mdf_b0_dFBD
                                     )
                                     {
                                      mdf_doppio_fiaDx_inY_basso = Fianchi_vic[mdFd_d]
                                      //mdf_doppio_fiaDx_inY_basso_debug = Fianchi_vic[mdFd_d]
                                      mdf_doppio_fiaDx_Battuta_X = mdf_Battuta_DX_Pro
                                     }

                                  if ( mdf_doppio_fiaDx_inY_a0_test-1 > mdf_doppio_fiaDx_inY_a0
                                     & mdf_doppio_fiaDx_inY_b0_test+1 > mdf_doppio_fiaDx_inY_a0
                                     & mdf_doppio_fiaDx_inY_b0_test+110 < mdf_a0_dFBD
                                     )
                                     {
                                      mdf_doppio_fiaDx_inY_alto = Fianchi_vic[mdFd_d]
                                      //mdf_doppio_fiaDx_inY_alto_debug = Fianchi_vic[mdFd_d]
                                      // 20.11.2023 H23000089_LIVINGROOM18 Ante a ELLE parte Sx piu grande parte Dx
                                      mdf_doppio_fiaDx_Battuta_OK = 1
                                      mdf_doppio_fiaDx_mdf_Battuta_X_att = mdf_doppio_fiaDx_Battuta_X
                                      if ( mdf_doppio_fiaDx_Battuta_X > 10
                                         & mdf_doppio_fiaDx_Battuta_X > mdf_Battuta_DX_Pro
                                         )
                                         {
                                          mdf_doppio_fiaDx_Battuta_OK = -1
                                         }

                                      if (mdf_doppio_fiaDx_Battuta_OK > 0)
                                         {
                                          mdf_doppio_fiaDx_Battuta_X = mdf_Battuta_DX_Pro
                                          mdf_doppio_fiaDx_B_deb = mdf_doppio_fiaDx_inY_alto
                                         }
                                     }

                                  if ( mdf_doppio_fiaDx_inY_basso > -1  &  mdf_doppio_fiaDx_inY_alto > -1
                                     & mdf_doppio_fiaDx_inY_basso != mdf_doppio_fiaDx_inY_alto
                                     )
                                     {
                                      mdf_y_dx_basso = VAR_VAL(mdf_doppio_fiaDx_inY_basso, "Y")
                                      mdf_y_dx_alto = VAR_VAL(mdf_doppio_fiaDx_inY_alto, "Y")
                                      if (mdf_y_dx_basso+mdf_y_dx_alto > 3*y_Fro/4)
                                         {
                                          mdf_doppio_fiaDx_inY_Battuta_X = Fianchi_vic[iX]
                                         }
                                      else
                                         {
                                          // 17.10.2024 Ce10363 FiancoBase + Pannello + FiancoPensile
                                          // oltre ad essere un caso di triplo Fianco di Battuta_X c'è in mezzo un
                                          // Pannello uso Fianco che però non viene considerato
                                          // In piu c'era uno SbordoYInf di 90
                                          mdf_basy_dx_basso = VAR_VAL(mdf_doppio_fiaDx_inY_basso, "base_0.y")
                                          mdf_alty_dx_alto = VAR_VAL(mdf_doppio_fiaDx_inY_alto, "alto_0.y")
                                          if (mdf_Battuta_DX_Pro > X_FiaVic/2+1  &  ABS(mdf_Battuta_DX_Pro) < X_FiaVic)
                                             {
                                              if ( mdf_alty_dx_alto-mdf_basy_dx_basso +180 > y_Fro
                                                 & mdf_alty_dx_alto-mdf_basy_dx_basso -180 < y_Fro
                                                 )
                                                 {
                                                  mdf_doppio_fiaDx_inY_Battuta_X = mdf_doppio_fiaDx_inY_basso
                                                 }
                                             }
                                         }
                                     }
                                 }
                             }
                         }

                      mdFd_d = mdFd_d+1
                     }
                 }
             }
         }
   }

   PROCEDURA MdF_SbordoY_DaFonCop
   {
      mdf_Ctrl_Sbordo_FonCop = 0
      mdf_alty_CopSco = 0
      mdf_basy_FonSco = 0
      mdf_SbordoYInf_Sc = 0
      mdf_SbordoYSup_Sc = 0

      mdf_CopS = 0
      mdf_FonS = 0

      mcb_LimCon_Sbo_FonCop = 15
      if (VAR_EXIST(idx_SbFoCo, "MdF_LimY_Con_Sbordo") )  { mcb_LimCon_Sbo_FonCop = VAR_VAL(idx_SbFoCo, "MdF_LimY_Con_Sbordo") }

      if (MdfSys_SbordoYSup == 0)
         {
          COMPONENTI2("mdf_CopS", PADRE(idx_SbFoCo, -1), "Cop*")
          BOX_MODE(0)
          if (mdf_CopS == 0)
             { NEAR_GLOBALE("mdf_CopS", idx_SbFoCo, 1.6, 1, "Cop*") }
          iCo=1
          while (iCo <= mdf_CopS)
             {
              if ( VAR_VAL(mdf_CopS[iCo], "alto_0.y") + mcb_LimCon_Sbo_FonCop < VAR_VAL(idx_SbFoCo, "alto_0.y")
                 & VAR_VAL(mdf_CopS[iCo], "alto_0.y") - 1 > VAR_VAL(idx_SbFoCo, "base_0.y")
                 )
                 {
                  mdf_Ctrl_Sbordo_FonCop = 1
                  mdf_alty_CopSco = VAR_VAL(mdf_CopS[iCo], "alto_0.y")
                 }
              iCo = iCo+1
             }
         }

      if (MdfSys_SbordoYInf == 0)
         {
          NEAR_GLOBALE("mdf_FonS", idx_SbFoCo, 3.02, 1, "Fon*")
          if (mdf_FonS == 0)
             {
              mdF_archetipoFondo = VAR_VAL_STR(idx_SbFoCo, "MdF_archetipoFondo")
              // COANP Fianco a Terra e Anta a terra.
              if (STRLEN(mdF_archetipoFondo) < 1)  { mdF_archetipoFondo = "*Fon*" }

              if (STRLEN(mdF_archetipoFondo) > 1)
                 {
                  NEAR_GLOBALE("mdf_FonS", idx_SbFoCo, 10.6, 1, mdF_archetipoFondo)
                  if (mdf_FonS > 0)
                     {
                      if ( VAR_VAL(mdf_FonS[1], "base_0.y") - mcb_LimCon_Sbo_FonCop - 0.1 < VAR_VAL(idx_SbFoCo, "base_0.y")
                         & VAR_VAL(mdf_FonS[1], "alto_0.y") > VAR_VAL(idx_SbFoCo, "base_0.y")
                         )
                         {
                          mdf_Ctrl_Sbordo_FonCop = 1
                          mdf_basy_FonSco = VAR_VAL(mdf_FonS[1], "base_0.y")
                         }
                     }
                 }
             }
          iFo = 1
          while (iFo <= mdf_FonS)
             {
              if (VAR_VAL(mdf_FonS[iFo], "base_0.y") - 150 > VAR_VAL(idx_SbFoCo, "base_0.y") )
                 {
                  mdf_Ctrl_Sbordo_FonCop = 1
                  mdf_basy_FonSco = VAR_VAL(mdf_FonS[iFo], "base_0.y")
                 }
              if ( VAR_VAL(mdf_FonS[iFo], "base_0.y") - 50 > VAR_VAL(idx_SbFoCo, "base_0.y")
                 & VAR_VAL(mdf_FonS[iFo], "base_0.y") - 180 < VAR_VAL(idx_SbFoCo, "base_0.y")
                 )
                 {
                  mdf_Ctrl_Sbordo_FonCop = 1
                  mdf_basy_FonSco = VAR_VAL(mdf_FonS[iFo], "base_0.y")
                 }
              iFo = iFo+1
             }
         }

      if (mdf_Ctrl_Sbordo_FonCop == 1)
         {
          mdf_alty_FiaSc = VAR_VAL(PADRE(idx_SbFoCo, -1), "alto_0.y")
          mdf_basy_FiaSc = VAR_VAL(PADRE(idx_SbFoCo, -1), "base_0.y")

          Bay_KFSb = VAR_VAL(idx_SbFoCo, "base_0.y")
          Aly_KFSb = VAR_VAL(idx_SbFoCo, "alto_0.y")
          Y_KFSb = VAR_VAL(idx_SbFoCo, "Y")

          mdf_diff_altalt_Sc = Aly_KFSb - mdf_alty_FiaSc
          mdf_diff_basbas_Sc = mdf_basy_FiaSc - Bay_KFSb

          if (mdf_CopS > 0)
             {
              if ( mdf_alty_CopSco < mdf_alty_FiaSc
                 & mdf_alty_CopSco > 10
                 )
                 {
                  mdf_limaltyCop = 300
                  if (mdf_alty_CopSco+mdf_limaltyCop > Aly_KFSb)
                     {
                      mdf_diff_altalt_Sc = Aly_KFSb - mdf_alty_CopSco
                     }
                 }

              if ( mdf_diff_altalt_Sc > mdf_LimY_Con_Sbordo
                 & mdf_diff_altalt_Sc <= Y_KFSb/3 + Y_KFSb/9
                 & mdf_diff_altalt_Sc > 0
                 )
                 { mdf_SbordoYSup_Sc = mdf_diff_altalt_Sc }
             }

          if (mdf_FonS > 0)
             {
              if ( mdf_basy_FonSco > mdf_basy_FiaSc
                 & mdf_basy_FonSco > 0
                 )
                 {
                  mdf_limbasyFon = 300
                  if (mdf_basy_FonSco-mdf_limbasyFon < Bay_KFSb)
                     { mdf_diff_basbas_Sc = mdf_basy_FonSco - Bay_KFSb }
                 }

              if ( mdf_diff_basbas_Sc > mdf_LimY_Con_Sbordo
                 & mdf_diff_basbas_Sc <= Y_KFSb/3 + Y_KFSb/9
                 & mdf_diff_basbas_Sc > 0
                 )
                 { mdf_SbordoYInf_Sc = mdf_diff_basbas_Sc }
             }
         }

      mdf_diff_FiaFC = 0.5
      if (MdfSys_SbordoYInf == 0  &  mdf_SbordoYInf_Sc > 0)
         {
          MdfSys_SbordoYInf_DaFon = mdf_SbordoYInf_Sc + mdf_offsetY_Sbordo-mdf_diff_FiaFC
         }
      if (MdfSys_SbordoYSup == 0  &  mdf_SbordoYSup_Sc > 0)
         {
          MdfSys_SbordoYSup_DaCop = mdf_SbordoYSup_Sc + mdf_offsetY_Sbordo-mdf_diff_FiaFC-mdf_abbassaSbordoSup
         }
      if (ATTUALE() != idx_SbFoCo)
         {
          // SET_#(idx_SbFoCo)
          // In teoria se è chiamata con MdF_while_X_Gen c'è già il SET_#(mdf_idx_KFBX)
          if (MdfSys_SbordoYInf == 0  &  mdf_SbordoYInf_Sc > 0)
             {
              #MdfSys_SbordoYInf_DaFon = mdf_SbordoYInf_Sc + mdf_offsetY_Sbordo-mdf_diff_FiaFC
             }
          if (MdfSys_SbordoYSup == 0  &  mdf_SbordoYSup_Sc > 0)
             {
              #MdfSys_SbordoYSup_DaCop = mdf_SbordoYSup_Sc + mdf_offsetY_Sbordo-mdf_diff_FiaFC-mdf_abbassaSbordoSup
             }
         }
   }

   PROCEDURA MdF_while_X_Gen
   {
      fia_Sx = 0
      fia_Dx = 0
      mdf_SbordoYInf_Sx = 0
      mdf_SbordoYSup_Sx = 0
      mdf_SbordoYInf_Dx = 0
      mdf_SbordoYSup_Dx = 0
      MdfSys_SbordoYInf = 0
      MdfSys_SbordoYSup = 0

     // 24.04.2025
      MdfSys_SbordoYInf_DaFon = 0
      MdfSys_SbordoYSup_DaCop = 0

      mdf_SbordoYInf_Sx_Found_Fondo = 0
      mdf_SbordoYInf_Dx_Found_Fondo = 0

     // 21.02.2023 PolK
      mdf_abbassaSbordoSup = 0
      mdf_abbassaSbordoInf = 0
      mdf_offy_REL_wh = VAR_VAL(mdf_idx_KFBX, "MdF_offy_REL_ADD")
      mdf_pan_y_wh = VAR_VAL(mdf_idx_KFBX, "MdF_Pan_Y")
     // 01.03.2023
      if (mdf_pan_y_wh != 0)
         { mdf_abbassaSbordoSup = VAR_VAL(mdf_idx_KFBX, "Y")-mdf_pan_y_wh }

      if (mdf_offy_REL_wh != 0)
         {
          mdf_abbassaSbordoSup = mdf_abbassaSbordoSup-mdf_offy_REL_wh
          mdf_abbassaSbordoInf = mdf_offy_REL_wh
         }

      mdf_offsetY_Sbordo = 0
      if (VAR_EXIST(mdf_idx_KFBX, "MdF_offsetY_Sbordo") )            { mdf_offsetY_Sbordo = VAR_VAL(mdf_idx_KFBX, "MdF_offsetY_Sbordo") }
      if (VAR_EXIST(PADRE(mdf_idx_KFBX, 1), "MdF_offsetY_Sbordo") )  { mdf_offsetY_Sbordo = VAR_VAL(PADRE(mdf_idx_KFBX, 1), "MdF_offsetY_Sbordo") }

      mdf_LimY_Con_Sbordo = 40
      if (VAR_EXIST(mdf_idx_KFBX, "MdF_LimY_Con_Sbordo") )            { mdf_LimY_Con_Sbordo = VAR_VAL(mdf_idx_KFBX, "MdF_LimY_Con_Sbordo") }
      if (VAR_EXIST(PADRE(mdf_idx_KFBX, 1), "MdF_LimY_Con_Sbordo") )  { mdf_LimY_Con_Sbordo = VAR_VAL(PADRE(mdf_idx_KFBX, 1), "MdF_LimY_Con_Sbordo") }

      iX = 1

      if (Fianchi_vic > 0)
         {
          mdf_Battuta_X = 0
          mdf_Battuta_SX = 0
          mdf_Battuta_DX = 0
          mdf_Battuta_X_Sx = -9999.99
          mdf_Battuta_X_Dx = -9999.99
         }

      X_FiaBatSX = 0
      X_FiaBatDX = 0

      mdf_doppio_fiaSx_inY = -1
      mdf_doppio_fiaDx_inY = -1

      mdf_fiaBatSx_Gen = -1
      mdf_fiaBatDx_Gen = -1

      mdf_Battuta_X_SX_Pro_Cn_preDX = 0

      // Calcolo Battuta a sinistra
      while (iX <= Fianchi_vic  &  exitBattuta_SX == -1)
         {
          // 13.05.2020
          mdf_Ingom_fia = 0
          if ( IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 1)), "*Fia*") == 1
             // 10.06.2020
             & PADRE(Fianchi_vic[iX], 1) != Fianchi_vic[iX]
             )
             {
              if ( IS_MATCH(NOME(Fianchi_vic[iX]), "Ingombro*Fianco*") == 1
                 | IS_MATCH(NOME(Fianchi_vic[iX]), "*Fia*Ctrl*") == 1
                 // 01.06.2020
                 | IS_MATCH(NOME(Fianchi_vic[iX]), "Mas*Fia*") == 1
                 // 10.06.2020
                 | STR_INDEX_OF(NOME(Fianchi_vic[iX]), 0, NOME(PADRE(Fianchi_vic[iX], 1))) > -1
                 // 10.07.2020
                 | IS_MATCH(NOME(Fianchi_vic[iX]), "*Fia*graf*") == 1
                 )
                 { mdf_Ingom_fia = 1 }
             }
          // 06.08.2020
          if (IS_MATCH(NOME(Fianchi_vic[iX]), "Graf*Fia*") == 1  &  VAR_VAL(Fianchi_vic[iX], "X") < 6)
             {
              if (IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 2)), "*Fia*") == 1)
                 { mdf_Ingom_fia = 2 }
             }
         // 23.06.2023
          if (IS_MATCH(NOME(Fianchi_vic[iX]), "Geom*Fia*") == 1)
             {
              forma = FORMA(Fianchi_vic[iX])
              if ( IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 1)), "*Fia*") == 1
                 // Per ora aggiungo anche controllo su forma, ma probabilmente non serve
                 & forma == 2
                 )
                 { mdf_Ingom_fia = 2.1 }
             }
         // 17.01.2025
          if ( IS_MATCH(NOME(Fianchi_vic[iX]), "*Copri*ia*") == 1
             | IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 1)), "*Copri*ia*") == 1
             )
             {
              if (VAR_VAL(Fianchi_vic[iX], "X") <= 12)
                 { mdf_Ingom_fia = 2.2 }
             }
         // 19.05.2021 FiancoChiusura in accosto a Colonne Slide che hanno la Battuta_X a 71 sul FiancoInterno
          if (STRLEN(mdF_arch_NO_BatFia) > 2)
             {
              if (IS_MATCH(NOME(Fianchi_vic[iX]), mdF_arch_NO_BatFia) == 1)
                 { mdf_Ingom_fia = 3 }

             // 09.02.2024 Se è usato l' archetipo fianco in Scocche che non dovrebbe fare da Fianco Battuta, esempio Riempitivi
              if (IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 1)), mdF_arch_NO_BatFia) == 1)
                 { mdf_Ingom_fia = 4 }
             }
         // 13.02.2024
          if (VAR_VAL(Fianchi_vic[iX], "X") < 5)  { mdf_Ingom_fia = 5 }

          // Se per caso intercetta MdF_FerramentaSuFianco
          if ( IS_MATCH(NOME(Fianchi_vic[iX]), "MdF_Ferr*") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "MdF_*Fianco") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "MdF_Sat*Fia*") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "_cont_collide*Fia*") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "_cont_collide*Div*") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "*Fia*collide*") != 1
             // 13.05.2020
             & mdf_Ingom_fia == 0
             )
             {
              fia_Dx = 0
              fia_Sx = 0
              SET_#(Fianchi_vic[iX])

              idx_FiaSx_Ctrl_att = Fianchi_vic[iX]
              GOSUB MdF_get_Battuta_SX_Gen
              if (fia_Sx == 1  |  fia_Dx == 0)
                 {
                  if ( IS_MATCH(MdF_Apertura, "S*") == 1
                     & mdf_Battuta_X != 0
                     )
                     { Battuta_X = mdf_Battuta_X }

                  // 04.01.2016 Dopo aver sistemato il flusso con meno ricalcoli e meno MdF_Load_Var
                  // Problema Apertura Bdm di default imposta DX e poi cambiata troppo tardi
                  // dopo l' OnLoadedOrder. Andrebbe cambiato/sistemato quel default Bdm !
                  // Se terminale e grafica anta un po' errata sente un solo Fianchi_vic
                  // quindi non fa nemmeno la battuta destra

                  // 05.02.2020 H19037315 occhio a mdf_Add_ctrl = 9
                  mdf_scarta_Battuta_Sx = 0
                  if ( VAR_VAL(mdf_idx_KFBX, "Battuta_X") != 0
                     & IS_MATCH(NOME(Fianchi_vic[iX]), "Div*") == 1
                     )
                     { mdf_scarta_Battuta_Sx = 1 }

                  if ( IS_MATCH(MdF_Apertura, "S*") != 1
                     & mdf_Battuta_X != 0
                     & Fianchi_vic == 1
                     & ABS(VAR_VAL(mdf_idx_KFBX, "MdF_angoloBas")) != 90
                     // Se prima trovo il Fianco Dx e poi il Divisorio Sx Fianchi_vic=1, ma non deve entrare!
                     // Se ho battute diverse Sx, Dx poteva non fare l'incidenza sul fia Dx
                     & exitBattuta_DX == -1
                     & VAR_EXIST(mdf_idx_KFBX, "MdF_offx_Battuta_Sx") != 1
                     & VAR_EXIST(mdf_idx_KFBX, "MdF_CerAng") != 1
                     // 05.02.2020
                     & mdf_scarta_Battuta_Sx == 0
                     )
                     { Battuta_X = mdf_Battuta_X }

                  Battuta_SX = mdf_Battuta_SX

                  //if (mdf_idx_KFBX == 1511)  { DISPLAY2(STRCAT("MdF_while_X_Gen-ciclo mdf_idx_KFBX=", STR(mdf_idx_KFBX), " forma=", STR(forma), " idx=", STR(Fianchi_vic[iX]), " ", STR(X_FiaBatSX), " mdf_Battuta_SX=",STR(mdf_Battuta_SX))) }

                  if (mdf_Battuta_X_Sx > -9999.99)
                     { Battuta_X_Sx = mdf_Battuta_X_Sx }
                 }
             }
          iX = iX+1
         }
      if (Battuta_SX != 0)
         {
          if (IS_IDX(mdf_fiaBatSx_Gen) )
             {
              exitBattuta_SX = mdf_fiaBatSx_Gen
             }
         }

      if (IS_IDX(exitBattuta_SX) )
         {
          mdf_alty_FiaSx = VAR_VAL(exitBattuta_SX, "alto_0.y")
          mdf_basy_FiaSx = VAR_VAL(exitBattuta_SX, "base_0.y")

         // 12.05.2022 come proc nonGen Colonna ANP che sborda in Y trova prima il Fia che sta sopra, poi trova mdF_archetipo_Fia_2 MontanteColAngPan
          if (mdf_ctrl_Fia_2 == 1)
             {
              if ( mdf_doppio_fiaSx_inY_basso != -1
                 & mdf_doppio_fiaSx_inY_alto != -1
                 & mdf_doppio_fiaSx_inY_Battuta_X == -1
                 )
                 {
                  mdf_fiaSx_BattutaSX_att_b0_t = VAR_VAL(exitBattuta_SX, "base_0.y")
                  mdf_fiaSx_BattutaSX_att_a0_t = VAR_VAL(exitBattuta_SX, "alto_0.y")
                  mdf_fiaSx_BattutaSX_att_Y    = VAR_VAL(exitBattuta_SX, "Y")
                  mdf_fiaSx_basso_att_b0_t     = VAR_VAL(mdf_doppio_fiaSx_inY_basso, "base_0.y")
                  mdf_fiaSx_alto_att_b0_t      = VAR_VAL(mdf_doppio_fiaSx_inY_alto, "base_0.y")
                  mdf_fiaSx_alto_att_Y         = VAR_VAL(mdf_doppio_fiaSx_inY_alto, "Y")
                  if ( mdf_fiaSx_BattutaSX_att_b0_t+200 < mdf_fiaSx_basso_att_b0_t
                     // se sopra pensile devo considerare Coperchio mio e Fondo sopraPensile
                     & mdf_fiaSx_BattutaSX_att_a0_t+45 > mdf_fiaSx_alto_att_b0_t
                     & mdf_fiaSx_BattutaSX_att_a0_t < mdf_fiaSx_alto_att_b0_t
                     )
                     {
                      if (mdf_fiaSx_BattutaSX_att_Y+mdf_fiaSx_alto_att_Y > 3*y_Fro/4)
                         {
                          mdf_doppio_fiaSx_inY_basso = exitBattuta_SX
                          mdf_doppio_fiaSx_inY_Battuta_X = mdf_doppio_fiaSx_inY_alto
                         // 13.05.2022
                          if ( mdf_doppio_fiaSx_Battuta_X > 5
                             & mdf_doppio_fiaSx_Battuta_X > Battuta_X
                             & mdf_doppio_fiaSx_Battuta_X - Battuta_X < 1.5
                             )
                             { Battuta_X = mdf_doppio_fiaSx_Battuta_X }
                         }
                     }
                 }
             }

          SET_#(mdf_idx_KFBX)
          Bay_KFBX = #base_0.y
          Aly_KFBX = #alto_0.y
          y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")

          mdf_diff_altalt_Sx = Aly_KFBX - mdf_alty_FiaSx

          if (mdf_diff_altalt_Sx > mdf_LimY_Con_Sbordo)
             {
              // 27.03.2017
              // 18.01.2024 A011802 Essendo il primo caso di sempre posso limitarlo; in piu graficamente va a filo
              // in X all' anta del pensile vicino quindi molto improbabile
              // Comunque l' anta è stata sbordata in X di 20mm rispetto alla scocca
              mdf_Ctrl_SbordoSup_Sx = 0
              if (Battuta_X_Sx < 0 & ABS(Battuta_X_Sx) < 2)  { mdf_Ctrl_SbordoSup_Sx = 1 }

              if ( ABS(Battuta_X_Sx) < 2  &  Fianchi_vic >= 3
                 & VAR_VAL(mdf_idx_KFBX, "X") > VAR_VAL(PADRE(mdf_idx_KFBX, 2), "X")
                 & VAR_VAL(mdf_idx_KFBX, "X")-30 < VAR_VAL(PADRE(mdf_idx_KFBX, 2), "X")
                 )
                 { mdf_Ctrl_SbordoSup_Sx = 2 }

              //if (Battuta_X_Sx < 0 & ABS(Battuta_X_Sx) < 2)
              if (mdf_Ctrl_SbordoSup_Sx > 0)
                 {
                  if (mdf_diff_altalt_Sx <= y_Fro/3 + y_Fro/9)
                     { mdf_SbordoYSup_Sx = mdf_diff_altalt_Sx }
                 }
              else
                 {
                 // 03.10.2017
                  //if (mdf_diff_altalt_Sx <= y_Fro/2 + y_Fro/20)
                 // 22.12.2021
                  mdivsbsup = 3
                 // 29.11.2022 EM1053762
                  if (y_Fro > 900  &  y_Fro < 1100  & mdf_diff_altalt_Sx > y_Fro/2+35)
                     {
                      mdf_sbSup_bas0_offy = VAR_VAL(PADRE(mdf_idx_KFBX, 1), "base_0_offset.y")
                      mdivsbsup = -45
                     }
                  if (y_Fro < 750  &  Battuta_X_Sx <= 0)  { mdivsbsup = -45 }
                 // 27.01.2025
                  if (y_Fro < 119)  { mdivsbsup = 5 }

                  if (mdf_diff_altalt_Sx <= y_Fro/2 + y_Fro/19+mdivsbsup)
                     { mdf_SbordoYSup_Sx = mdf_diff_altalt_Sx }

                 // 23.01.2023 come non-glob
                  if ( IS_MATCH(NOME(exitBattuta_SX), "*Div*")
                     & mdf_SbordoYSup_Sx > 0
                     )
                     {
                      alty_Div = VAR_VAL(exitBattuta_SX, "alto_0.y")
                      alty_pdr_Div = VAR_VAL(PADRE(exitBattuta_SX, 2), "alto_0.y")
                      mdf_diff_altDiv_pdr = alty_pdr_Div - alty_Div
                      if ( mdf_diff_altDiv_pdr < 35
                         & mdf_diff_altDiv_pdr > 3
                         )
                         { mdf_SbordoYSup_Sx = mdf_SbordoYSup_Sx -mdf_diff_altDiv_pdr }
                     }
                 }
             }

          mdf_diff_basbas_Sx = mdf_basy_FiaSx - Bay_KFBX
          if (mdf_diff_basbas_Sx > mdf_LimY_Con_Sbordo)
             {
              // 27.03.2017
              if (Battuta_X_Sx < 0 & ABS(Battuta_X_Sx) < 2)
                 {
                  if (mdf_diff_basbas_Sx <= y_Fro/3 + y_Fro/9)
                     { mdf_SbordoYInf_Sx = mdf_diff_basbas_Sx }
                 }
              else
                 {
                 // 03.10.2017
                  //if (mdf_diff_basbas_Sx <= y_Fro/2 + y_Fro/20)
                  if (mdf_diff_basbas_Sx <= y_Fro/2 + y_Fro/19+3)
                     { mdf_SbordoYInf_Sx = mdf_diff_basbas_Sx }
                 }
             }

         // 27.06.2023 Sc1054754
          mdf_Sbordo_Ctrl_Sx = 0
          if (mdf_SbordoYInf_Sx > 2 & mdf_SbordoYInf_Sx < 25)  { mdf_Sbordo_Ctrl_Sx = 1 }
          if (mdf_SbordoYSup_Sx > 2 & mdf_SbordoYSup_Sx < 25)  { mdf_Sbordo_Ctrl_Sx = 2 }

         // 16.11.2023 Come Dx
          if (PADRE(exitBattuta_SX, -1) == PADRE(mdf_idx_KFBX, -1) )
             {
              // 18.11.2024 Vedi Sx Sc1056945
              mdf_SbordoApDx_Ctrl_Sx = 0
              if (IS_IDX(exitBattuta_DX) != 1)  { mdf_SbordoApDx_Ctrl_Sx = 1 }
              else
                 {
                  if (IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura"), "DX*") )
                     { mdf_SbordoApDx_Ctrl_Sx = 2 }
                 }

              if ( VAR_VAL(exitBattuta_SX, "Y") + 50  < VAR_VAL(PADRE(exitBattuta_SX, -1), "Y")
                 // Per ora limito cosi. caso ANGL
                 //& IS_IDX(exitBattuta_DX) != 1
                 & mdf_SbordoApDx_Ctrl_Sx >= 1
                 )
                 {
                  // < 60 perchè devo comunque stare attento che la cerniera ci stia
                  // Potrebbe essere un problema sulle Libro se da una parte ho lo sbordo e nell' altra anta no
                  // con le CerAngLib che sarebbero sfalsate. In quel caso sarebbe da fare una nuova RegFacc
                  // per le CerAngLib
                  if (mdf_SbordoYSup_Sx >= 25 & mdf_SbordoYSup_Sx < 60)
                     {
                      mdf_Sbordo_Ctrl_Sx = 3
                      malty_Sc = VAR_VAL(PADRE(exitBattuta_SX, -1), "alto_0.y")
                      mdfaltyfro = VAR_VAL(mdf_idx_KFBX, "alto_0.y")
                      if (mdfaltyfro+20 > malty_Sc)
                         { mdf_SbordoYSup_Sx = 0 }
                     }
                 }
             }

         // 11.09.2018
          if ( IS_MATCH(NOME(exitBattuta_SX), "Div*")
             // 13.05.2022
             | IS_MATCH(NOME(exitBattuta_SX), "*AngPan*")
            // 27.06.2023 Sc1054754
             | mdf_Sbordo_Ctrl_Sx > 0
             )
             {
              mdf_ctrl_sbDiv_SX = 0
              if ( IS_MATCH(MdF_Apertura, "D*") == 1
                 | IS_MATCH(NOME(exitBattuta_SX), "*AngPan*")
                // 25.10.2023 PK00003
                 | IS_MATCH(MdF_Apertura, "ES*") == 1
                 | IS_MATCH(MdF_Apertura, "") == 1
                // 23.02.2024 PK2024TLS111118_12 Base 2Ante Sinistre perchè quella piu a destra Sborda verso destra
                // e non avendo trovato il Fianco Dx di Battuta sbaglia gli sbordi
                 | IS_MATCH(MdF_Apertura, "S*") == 1
                 )
                 {
                  if (IS_MATCH(NOME(PADRE(exitBattuta_SX, 1)), "VanoPorta*") )
                     {
                      mdf_ctrl_sbDiv_SX = 1
                     }
                 // 06.11.2019 H19046702 faccio controllo piu generico DivisorioVerticale
                  mdfxfro = VAR_VAL(mdf_idx_KFBX, "X")
                 // 12.12.2023 Sn121201 da 130 a 99
                  if (mdfxfro+99 < VAR_VAL(PADRE(exitBattuta_SX, 2), "X") )
                     { mdf_ctrl_sbDiv_SX = 2 }

                 // 14.06.2024 Come Dx
                  mdf_X_pdr2fro = VAR_VAL(PADRE(mdf_idx_KFBX, 2), "X")
                  if (mdf_Sbordo_Ctrl_Sx > 0)
                     {
                      if (mdfxfro+150 < mdf_X_pdr2fro)  { mdf_ctrl_sbDiv_SX = 3 }
                     }
                 }

              if (mdf_ctrl_sbDiv_SX > 0)
                 {
                  mdfxfro = VAR_VAL(mdf_idx_KFBX, "X")
                  mdfyfro    = VAR_VAL(mdf_idx_KFBX, "Y")
                  mdfbasyfro = VAR_VAL(mdf_idx_KFBX, "base_0.y")
                  mdfaltyfro = VAR_VAL(mdf_idx_KFBX, "alto_0.y")
                  mdfydiv    = VAR_VAL(exitBattuta_SX, "Y")
                  mdfbasydiv = VAR_VAL(exitBattuta_SX, "base_0.y")
                 // 13.05.2022
                  //if (mdfbasydiv-15 > mdfbasyfro)
                  if (mdfbasydiv-11 > mdfbasyfro)
                     {
                      // 23.02.2024
                      COMPONENTI2("mdf_find_Cop", PADRE(exitBattuta_SX, -1), "*Cop*")
                      if (mdf_find_Cop == 0)  { COMPONENTI2("mdf_find_Cop", PADRE(exitBattuta_SX, -1), "Fusto*") }
                      miSSC = 1
                      alty_Div_ToCtrl = VAR_VAL(exitBattuta_SX, "alto_0.y")
                      alty_Div_OK = 0
                      while (miSSC <= mdf_find_Cop)
                         {
                          alty_Ele = VAR_VAL(mdf_find_Cop[miSSC], "alto_0.y")
                          if ( alty_Ele + 3 > alty_Div_ToCtrl
                             & alty_Ele - 3 < alty_Div_ToCtrl
                             )
                             {
                              // Per ora solo Basi, perchè Coperchio scorrevole potrebbe essere piu in basso
                              if (alty_Div_ToCtrl < 1000)
                                 { alty_Div_OK = 1 }
                             }

                          miSSC = miSSC+1
                         }
                      if (mdfydiv+60 < mdfyfro)
                         {
                          mdf_SbordoYSup_Sx = 0
                         }
                     // 13.07.2022 Sn22071301 montante unico e doppia anta
                      if ( mdfydiv-280 > mdfyfro
                         & mdfbasydiv-1 > mdfbasyfro
                         & mdfbasydiv-20 < mdfbasyfro
                         )
                         {
                          mdf_SbordoYInf_Sx = 0
                         }
                    // 13.05.2022 Sn Montantte AnP
                      if ( mdfydiv+20 < mdfyfro
                         // 13.07.2022 Sn Alzando l'anta di 30mm la cerniera sotto si sposta di 19mm più in alto
                         //& mdfydiv+90 > mdfyfro
                         & mdfydiv+100 > mdfyfro
                         )
                         {
                          // 23.02.2024
                          if (alty_Div_OK == 0)  { mdf_SbordoYSup_Sx = 0 }

                          mdf_SbordoYInf_Sx = 0
                         }
                     }
                 // 12.01.2023
                  if (mdf_SbordoYSup_Sx < 25)
                     {
                      if (IS_MATCH(NOME(exitBattuta_SX), "*AngPan*") )
                         {
                          mdfaltyfro = VAR_VAL(mdf_idx_KFBX, "alto_0.y")
                          mdfaltydiv = VAR_VAL(exitBattuta_SX, "alto_0.y")
                          if (mdfaltydiv+20 > mdfaltyfro)
                             {
                              mdf_SbordoYSup_Sx = 0
                             }
                         }
                     // 31.05.2023
                      if ( IS_MATCH(NOME(exitBattuta_SX), "*AngPan*")
                         | PADRE(exitBattuta_SX, -1) == PADRE(mdf_idx_KFBX, -1)
                         )
                         {
                          COMPONENTI2("mdf_find_Cop", PADRE(exitBattuta_SX, -1), "*Cop*")
                          miSSC = 1
                          while (miSSC <= mdf_find_Cop)
                             {
                              alty_Ele = VAR_VAL(mdf_find_Cop[miSSC], "alto_0.y")
                              if ( alty_Ele + 3 > mdfaltyfro
                                 & alty_Ele - 3 < mdfaltyfro
                                 )
                                 {
                                  mdf_SbordoYSup_Sx_ANP_err = mdf_SbordoYSup_Sx
                                  mdf_SbordoYSup_Sx = 0
                                 }
                              miSSC = miSSC+1
                             }
                         }
                     }
                 // 31.05.2023 Come dx
                  if (mdf_SbordoYInf_Sx < 25)
                     {
                      if ( IS_MATCH(NOME(exitBattuta_SX), "*AngPan*")
                         | PADRE(exitBattuta_SX, -1) == PADRE(mdf_idx_KFBX, -1)
                         // 14.06.2024
                         | mdf_ctrl_sbDiv_SX == 3
                         )
                         {
                          COMPONENTI2("mdf_find_Fondo", PADRE(exitBattuta_SX, -1), "*Fon*")
                          miSIF = 1
                          while (miSIF <= mdf_find_Fondo)
                             {
                              basy_SIFon = VAR_VAL(mdf_find_Fondo[miSIF], "base_0.y")
                              if ( basy_SIFon+3 > mdfbasyfro
                                 & basy_SIFon-3 < mdfbasyfro
                                 )
                                 {
                                  mdf_SbordoYInf_Sx_ANP_err = mdf_SbordoYInf_Sx
                                  mdf_SbordoYInf_Sx = 0
                                 }
                              miSIF = miSIF+1
                             }
                          // 14.06.2024 Come Dx
                          if (mdf_ctrl_sbDiv_SX == 3)
                             {
                              BOX_MODE(0)
                              if (mdf_find_Fondo == 0)  { NEAR_GLOBALE("mdf_find_Fondo", mdf_idx_KFBX, 3.2, 1, "*Top*") }
                              if (mdf_find_Fondo == 0)  { NEAR_GLOBALE("mdf_find_Fondo", mdf_idx_KFBX, 3.2, 1, "*Rip*") }
                              miSIF = 1
                              while (miSIF <= mdf_find_Fondo)
                                 {
                                  basy_SIFon = VAR_VAL(mdf_find_Fondo[miSIF], "base_0.y")
                                  y_SIFon = VAR_VAL(mdf_find_Fondo[miSIF], "Y")
                                  if ( basy_SIFon+y_SIFon/2+0.6 > mdfbasyfro
                                     & basy_SIFon-y_SIFon/2+0.6 < mdfbasyfro
                                     )
                                     {
                                      mdf_SbordoYInf_Sx_Spa2A_err = mdf_SbordoYInf_Sx
                                      mdf_SbordoYInf_Sx = 0
                                     }
                                  miSIF = miSIF+1
                                 }
                             }
                         }
                     }
                 }
             }

          if (IS_IDX(mdf_doppio_fiaSx_inY) )
             {
              mdf_alty_FiaSx_2 = VAR_VAL(mdf_doppio_fiaSx_inY, "alto_0.y")
              mdf_basy_FiaSx_2 = VAR_VAL(mdf_doppio_fiaSx_inY, "base_0.y")

              // 16.12.2016
              // Non puo essere uno sbordo valido, significa che c'è un anta Sciolta tra 2 fianchi di altre Scocche
              // Puo essere che non entra nell' if successiva perché magari ci sono 3 fianchi
              if (mdf_diff_altalt_Sx > y_Fro/3 + y_Fro/9)
                 { mdf_SbordoYSup_Sx = 0 }

              if (mdf_basy_FiaSx_2-10 < mdf_alty_FiaSx  &  mdf_basy_FiaSx_2+10 > mdf_alty_FiaSx)
                 {
                  mdf_Y_FiaSx_2 = VAR_VAL(mdf_doppio_fiaSx_inY, "Y")
                  if (mdf_Y_FiaSx_2 > mdf_SbordoYSup_Sx)
                     { mdf_SbordoYSup_Sx = 0 }
                 }
             }
         // 30.01.2019
          if (IS_IDX(mdf_doppio_fiaSx_inY_Battuta_X) )
             {
              mdf_alty_FiaSx_2 = VAR_VAL(mdf_doppio_fiaSx_inY_alto, "alto_0.y")
              mdf_diff_altalt_Sx = Aly_KFBX - mdf_alty_FiaSx_2
              mdf_SbordoYSup_Sx = 0
              if (mdf_diff_altalt_Sx > mdf_LimY_Con_Sbordo)
                 {
                  mdf_SbordoYSup_Sx = mdf_diff_altalt_Sx
                 }

              mdf_basy_FiaSx_2 = VAR_VAL(mdf_doppio_fiaSx_inY_basso, "base_0.y")
              mdf_diff_basbas_Sx = mdf_basy_FiaSx_2 - Bay_KFBX
              mdf_SbordoYInf_Sx = 0
              if (mdf_diff_basbas_Sx > mdf_LimY_Con_Sbordo)
                 {
                  mdf_SbordoYInf_Sx = mdf_diff_basbas_Sx
                 }
             // 13.05.2022
              if (IS_MATCH(NOME(exitBattuta_SX), "*AngPan*") )
                 {
                  if (mdf_SbordoYInf_Sx < 20)  { mdf_SbordoYInf_Sx = 0 }
                 }
             }
         }

      // Calcolo Battuta a destra
      iX = 1
      //SORT_POINT(base_2, "Fianchi_vic", "base_2")
      fiancoDx_prec = -1
      while (iX <= Fianchi_vic  &  exitBattuta_DX == -1)
         {
          // 13.05.2020
          mdf_Ingom_fia = 0
          if ( IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 1)), "*Fia*") == 1
             // 10.06.2020
             & PADRE(Fianchi_vic[iX], 1) != Fianchi_vic[iX]
             )
             {
              if ( IS_MATCH(NOME(Fianchi_vic[iX]), "Ingombro*Fianco*") == 1
                 | IS_MATCH(NOME(Fianchi_vic[iX]), "*Fia*Ctrl*") == 1
                 // 01.06.2020
                 | IS_MATCH(NOME(Fianchi_vic[iX]), "Mas*Fia*") == 1
                 // 10.06.2020
                 | STR_INDEX_OF(NOME(Fianchi_vic[iX]), 0, NOME(PADRE(Fianchi_vic[iX], 1))) > -1
                 // 10.07.2020
                 | IS_MATCH(NOME(Fianchi_vic[iX]), "*Fia*graf*") == 1
                 )
                 { mdf_Ingom_fia = 1 }
             }
          // 06.08.2020
          if (IS_MATCH(NOME(Fianchi_vic[iX]), "Graf*Fia*") == 1  &  VAR_VAL(Fianchi_vic[iX], "X") < 6)
             {
              if (IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 2)), "*Fia*") == 1)
                 { mdf_Ingom_fia = 2 }
             }
         // 23.06.2023
          if (IS_MATCH(NOME(Fianchi_vic[iX]), "Geom*Fia*") == 1)
             {
              forma = FORMA(Fianchi_vic[iX])
              if ( IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 1)), "*Fia*") == 1
                 // Per ora aggiungo anche controllo su forma, ma probabilmente non serve
                 & forma == 2
                 )
                 { mdf_Ingom_fia = 2.1 }
             }
         // 17.01.2025
          if ( IS_MATCH(NOME(Fianchi_vic[iX]), "*Copri*ia*") == 1
             | IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 1)), "*Copri*ia*") == 1
             )
             {
              if (VAR_VAL(Fianchi_vic[iX], "X") <= 12)
                 { mdf_Ingom_fia = 2.2 }
             }
         // 19.05.2021 FiancoChiusura in accosto a Colonne Slide che hanno la Battuta_X a 71 sul FiancoInterno
          if (STRLEN(mdF_arch_NO_BatFia) > 2)
             {
              if (IS_MATCH(NOME(Fianchi_vic[iX]), mdF_arch_NO_BatFia) == 1)
                 { mdf_Ingom_fia = 3 }

             // 09.02.2024 Se è usato l' archetipo fianco in Scocche che non dovrebbe fare da Fianco Battuta, esempio Riempitivi
              if (IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 1)), mdF_arch_NO_BatFia) == 1)
                 { mdf_Ingom_fia = 4 }
             }
         // 13.02.2024
          if (VAR_VAL(Fianchi_vic[iX], "X") < 5)  { mdf_Ingom_fia = 5 }

         // 04.12.2020 1020105054, 10031601
          // Se sono un ANP quindi ABS(MdF_angoloBas) 90 ma il FrontaleFisso si chiama FiancoDivisorio
          // viene trovato come possibile fianco destro anche se poi giustamente non fa la Battuta_X su questo
          // pero avendo trovato la Battuta_X sul Fia sinistro mi imposterebbe lo stesso la Battuta_X
          // perche forse ingiustamente mdf_Battuta_X non la azzero mai
          if (IS_MATCH(MdF_Apertura, "D*") == 1)
             {
              if (ABS(VAR_VAL(mdf_idx_KFBX, "MdF_angoloBas")) == 90)
                 { mdf_Battuta_X = 0 }
             }

          // Se per caso intercetta MdF_FerramentaSuFianco
          if ( IS_MATCH(NOME(Fianchi_vic[iX]), "MdF_Ferr*") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "MdF_*Fianco") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "MdF_Sat*Fia*") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "_cont_collide*Fia*") != 1
             & IS_MATCH(NOME(Fianchi_vic[iX]), "_cont_collide*Div*") != 1
             // 08.11.2019
             & IS_MATCH(NOME(Fianchi_vic[iX]), "*Fia*collide*") != 1
             // 13.05.2020
             & mdf_Ingom_fia == 0
             )
             {
              fia_Sx = 0
              fia_Dx = 0
              SET_#(Fianchi_vic[iX])
              //DISPLAY2(STRCAT("MdF_while_X MdF_get_Battuta_DX Fianchi_vic[iX]=", STR(Fianchi_vic[iX]), " mdf_idx_KFBX=", STR(mdf_idx_KFBX)))

              idx_FiaDx_Ctrl_att = Fianchi_vic[iX]
              GOSUB MdF_get_Battuta_DX_Gen
              //DISPLAY2(STRCAT("MdF_while_X DOPO MdF_get_Battuta_DX Fianchi_vic[iX]=", STR(Fianchi_vic[iX]), " mdf_idx_KFBX=", STR(mdf_idx_KFBX)))
              // Se ho gia calcolato la Battuta sinistra però magari non è corretta
              // comunque qua entro solo se trovo fianchi destri
              if (fia_Dx == 1  |  fia_Sx == 0)
                 {
                  if ( IS_MATCH(MdF_Apertura, "D*") == 1
                     & mdf_Battuta_X != 0
                     )
                     { Battuta_X = mdf_Battuta_X }
                  Battuta_DX = mdf_Battuta_DX

                  if (mdf_Battuta_X_Dx > -9999.99)
                     { Battuta_X_Dx = mdf_Battuta_X_Dx }
                 }
             }
          iX = iX+1
         }
      if (Battuta_DX != 0)
         {
          if (IS_IDX(mdf_fiaBatDx_Gen) )
             {
              exitBattuta_DX = mdf_fiaBatDx_Gen
             }
         }

      if (IS_IDX(exitBattuta_DX) )
         {
         // 04.09.2024 EM2024004901 La prima volta per forza non c'è exitBattuta_DX perchè deve ancora farla
          if (mdf_Battuta_X_SX_Pro_Cn_preDX != 0)
             {
              mdf_Battuta_X_SX_Pro_Cn = mdf_Battuta_X_SX_Pro_Cn_preDX
             }

          mdf_alty_FiaDx = VAR_VAL(exitBattuta_DX, "alto_0.y")
          mdf_basy_FiaDx = VAR_VAL(exitBattuta_DX, "base_0.y")

         // 12.05.2022 come proc nonGen Colonna ANP che sborda in Y trova prima il Fia che sta sopra, poi trova mdF_archetipo_Fia_2 MontanteColAngPan
          if (mdf_ctrl_Fia_2 == 1)
             {
              if ( mdf_doppio_fiaDx_inY_basso != -1
                 & mdf_doppio_fiaDx_inY_alto != -1
                 & mdf_doppio_fiaDx_inY_Battuta_X == -1
                 )
                 {
                  mdf_fiaDx_BattutaDX_att_b0_t = VAR_VAL(exitBattuta_DX, "base_0.y")
                  mdf_fiaDx_BattutaDX_att_a0_t = VAR_VAL(exitBattuta_DX, "alto_0.y")
                  mdf_fiaDx_BattutaDX_att_Y    = VAR_VAL(exitBattuta_DX, "Y")
                  mdf_fiaDx_basso_att_b0_t     = VAR_VAL(mdf_doppio_fiaDx_inY_basso, "base_0.y")
                  mdf_fiaDx_alto_att_b0_t      = VAR_VAL(mdf_doppio_fiaDx_inY_alto, "base_0.y")
                  mdf_fiaDx_alto_att_Y         = VAR_VAL(mdf_doppio_fiaDx_inY_alto, "Y")
                  if ( mdf_fiaDx_BattutaDX_att_b0_t+200 < mdf_fiaDx_basso_att_b0_t
                     // se sopra pensile devo considerare Coperchio mio e Fondo sopraPensile
                     & mdf_fiaDx_BattutaDX_att_a0_t+45 > mdf_fiaDx_alto_att_b0_t
                     & mdf_fiaDx_BattutaDX_att_a0_t < mdf_fiaDx_alto_att_b0_t
                     )
                     {
                      if (mdf_fiaDx_BattutaDX_att_Y+mdf_fiaDx_alto_att_Y > 3*y_Fro/4)
                         {
                          mdf_doppio_fiaDx_inY_basso = exitBattuta_DX
                          mdf_doppio_fiaDx_inY_Battuta_X = mdf_doppio_fiaDx_inY_alto
                         // 13.05.2022
                          if ( mdf_doppio_fiaDx_Battuta_X > 5
                             & mdf_doppio_fiaDx_Battuta_X > Battuta_X
                             & mdf_doppio_fiaDx_Battuta_X - Battuta_X < 1.5
                             )
                             { Battuta_X = mdf_doppio_fiaDx_Battuta_X }
                         }
                     }
                 }
             }

          SET_#(mdf_idx_KFBX)
          Bay_KFBX = #base_0.y
          Aly_KFBX = #alto_0.y
          y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")

          mdf_diff_altalt_Dx = Aly_KFBX - mdf_alty_FiaDx

          if (mdf_diff_altalt_Dx > mdf_LimY_Con_Sbordo)
             {
              // 27.03.2017
              // 18.01.2024 A011802 Essendo il primo caso di sempre posso limitarlo; in piu graficamente va a filo
              // in X all' anta del pensile vicino quindi molto improbabile
              // Comunque l' anta è stata sbordata in X di 20mm rispetto alla scocca
              mdf_Ctrl_SbordoSup_Dx = 0
              if (Battuta_X_Dx < 0 & ABS(Battuta_X_Dx) < 2)  { mdf_Ctrl_SbordoSup_Dx = 1 }

              if ( ABS(Battuta_X_Dx) < 2  &  Fianchi_vic >= 3
                 & VAR_VAL(mdf_idx_KFBX, "X") > VAR_VAL(PADRE(mdf_idx_KFBX, 2), "X")
                 & VAR_VAL(mdf_idx_KFBX, "X")-30 < VAR_VAL(PADRE(mdf_idx_KFBX, 2), "X")
                 )
                 { mdf_Ctrl_SbordoSup_Dx = 2 }

              //if (Battuta_X_Dx < 0 & ABS(Battuta_X_Dx) < 2)
              if (mdf_Ctrl_SbordoSup_Dx > 0)
                 {
                  if (mdf_diff_altalt_Dx <= y_Fro/3 + y_Fro/9)
                     { mdf_SbordoYSup_Dx = mdf_diff_altalt_Dx }
                 }
              else
                 {
                 // 03.10.2017
                  // anta Y=661 sbordo 367
                  //if (mdf_diff_altalt_Dx <= y_Fro/2 + y_Fro/20)
                 // 22.12.2021 SC1021134778 StrutBaseFrigo con fiaDx soggiorno
                  mdivsbsup = 3
                 // 29.11.2022 EM1053762
                  if (y_Fro > 900  &  y_Fro < 1100  & mdf_diff_altalt_Dx > y_Fro/2+35)
                     {
                      mdf_sbSup_bas0_offy = VAR_VAL(PADRE(mdf_idx_KFBX, 1), "base_0_offset.y")
                      mdivsbsup = -45
                     }
                  if (y_Fro < 750  &  Battuta_X_Dx <= 0)  { mdivsbsup = -45 }
                 // 27.01.2025
                  if (y_Fro < 119)  { mdivsbsup = 5 }

                  if (mdf_diff_altalt_Dx <= y_Fro/2 + y_Fro/19+mdivsbsup)
                     { mdf_SbordoYSup_Dx = mdf_diff_altalt_Dx }

                 // 23.01.2023 come non-glob
                  if ( IS_MATCH(NOME(exitBattuta_DX), "*Div*")
                     & mdf_SbordoYSup_Dx > 0
                     )
                     {
                      alty_Div = VAR_VAL(exitBattuta_DX, "alto_0.y")
                      alty_pdr_Div = VAR_VAL(PADRE(exitBattuta_DX, 2), "alto_0.y")
                      mdf_diff_altDiv_pdr = alty_pdr_Div - alty_Div
                      if ( mdf_diff_altDiv_pdr < 35
                         & mdf_diff_altDiv_pdr > 3
                         )
                         { mdf_SbordoYSup_Dx = mdf_SbordoYSup_Dx -mdf_diff_altDiv_pdr }
                     }
                 }
             // 30.11.2023 Ce07622
              if (IS_MATCH(MdF_Apertura, "S*") == 1)
                 {
                  // Ho il doppio fianco di Battuta solo a sisnitra perchè la scocca sopra e' piu larga e le 2 ante sotto sbordano per coprirla
                  if ( IS_IDX(mdf_doppio_fiaSx_inY_Battuta_X)
                     & IS_IDX(mdf_doppio_fiaDx_inY_Battuta_X) != 1
                     )
                     {
                      mdf_SbordoYSup_Dx_CtrlDoppioSx = mdf_SbordoYSup_Dx
                      if (mdf_SbordoYSup_Sx == 0)
                         {
                          if (mdf_SbordoYSup_Dx > 0)  { mdf_SbordoYSup_Dx = 0 }
                         }
                     }
                 }
             }

          mdf_diff_basbas_Dx = mdf_basy_FiaDx - Bay_KFBX
          if (mdf_diff_basbas_Dx > mdf_LimY_Con_Sbordo)
             {
              // 27.03.2017
              if (Battuta_X_Dx < 0 & ABS(Battuta_X_Dx) < 2)
                 {
                  if (mdf_diff_basbas_Dx <= y_Fro/3 + y_Fro/9)
                     { mdf_SbordoYInf_Dx = mdf_diff_basbas_Dx }
                 }
              else
                 {
                 // 03.10.2017
                  if (mdf_diff_basbas_Dx <= y_Fro/2 + y_Fro/19+3)
                     { mdf_SbordoYInf_Dx = mdf_diff_basbas_Dx }
                 }
             }

         // 27.06.2023 Sc1054754
          mdf_Sbordo_Ctrl_Dx = 0
          if (mdf_SbordoYInf_Dx > 2 & mdf_SbordoYInf_Dx < 25)  { mdf_Sbordo_Ctrl_Dx = 1 }
          if (mdf_SbordoYSup_Dx > 2 & mdf_SbordoYSup_Dx < 25)  { mdf_Sbordo_Ctrl_Dx = 2 }

         // 16.11.2023 ScBROWSER2001945 Fia ridotto in Y per scasso o passaggio cavi?
          if (PADRE(exitBattuta_DX, -1) == PADRE(mdf_idx_KFBX, -1) )
             {
              // 18.11.2024 Sc1056945
              mdf_SbordoApSx_Ctrl_Dx = 0
              if (IS_IDX(exitBattuta_SX) != 1)  { mdf_SbordoSx_Ctrl_Dx = 1 }
              else
                 {
                  if (IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura"), "SX*") )
                     { mdf_SbordoApSx_Ctrl_Dx = 2 }
                 }
              if ( VAR_VAL(exitBattuta_DX, "Y") + 50  < VAR_VAL(PADRE(exitBattuta_DX, -1), "Y")
                 // Per ora limito cosi. caso ANGL
                 //18.11.2024 & IS_IDX(exitBattuta_SX) != 1
                 & mdf_SbordoApSx_Ctrl_Dx >= 1
                 )
                 {
                  // < 60 perchè devo comunque stare attento che la cerniera ci stia
                  // Potrebbe essere un problema sulle Libro se da una parte ho lo sbordo e nell' altra anta no
                  // con le CerAngLib che sarebbero sfalsate. In quel caso sarebbe da fare una nuova RegFacc
                  // per le CerAngLib
                  if (mdf_SbordoYSup_Dx >= 25 & mdf_SbordoYSup_Dx < 60)
                     {
                      mdf_Sbordo_Ctrl_Dx = 3
                      malty_Sc = VAR_VAL(PADRE(exitBattuta_DX, -1), "alto_0.y")
                      mdfaltyfro = VAR_VAL(mdf_idx_KFBX, "alto_0.y")
                      if (mdfaltyfro+20 > malty_Sc)
                         { mdf_SbordoYSup_Dx = 0 }
                     }
                 }
             }

         // 11.09.2018
          if ( IS_MATCH(NOME(exitBattuta_DX), "Div*")
             // 13.05.2022
             | IS_MATCH(NOME(exitBattuta_DX), "*AngPan*")
            // 27.06.2023 Sc1054754
             | mdf_Sbordo_Ctrl_Dx > 0
             )
             {
              mdf_ctrl_sbDiv_DX = 0
              if ( IS_MATCH(MdF_Apertura, "S*") == 1
                 | IS_MATCH(NOME(exitBattuta_DX), "*AngPan*")
                // 25.10.2023 PK00003
                 | IS_MATCH(MdF_Apertura, "ES*") == 1
                 | IS_MATCH(MdF_Apertura, "") == 1
                // 23.02.2024 Come Sx
                 | IS_MATCH(MdF_Apertura, "D*") == 1
                 )
                 {
                  if (IS_MATCH(NOME(PADRE(exitBattuta_DX, 1)), "VanoPorta*") )
                     {
                      // 09.06.2021
                      mdf_ctrl_sbDiv_DX = 1
                     }
                  mdfxfro = VAR_VAL(mdf_idx_KFBX, "X")
                 // 12.12.2023 Sn121201 da 130 a 99
                  if (mdfxfro+99 < VAR_VAL(PADRE(exitBattuta_DX, 2), "X") )
                     { mdf_ctrl_sbDiv_DX = 2 }

                 // 14.06.2024 Cpome att
                  mdf_X_pdr2fro = VAR_VAL(PADRE(mdf_idx_KFBX, 2), "X")
                  if (mdf_Sbordo_Ctrl_Dx > 0)
                     {
                      if (mdfxfro+150 < mdf_X_pdr2fro)  { mdf_ctrl_sbDiv_DX = 3 }
                     }
                 }
              if (mdf_ctrl_sbDiv_DX > 0)
                 {
                  mdfxfro = VAR_VAL(mdf_idx_KFBX, "X")
                  mdfyfro    = VAR_VAL(mdf_idx_KFBX, "Y")
                  mdfbasyfro = VAR_VAL(mdf_idx_KFBX, "base_0.y")
                  mdfaltyfro = VAR_VAL(mdf_idx_KFBX, "alto_0.y")
                  mdfydiv    = VAR_VAL(exitBattuta_DX, "Y")
                  mdfbasydiv = VAR_VAL(exitBattuta_DX, "base_0.y")
                 // 13.05.2022
                  //if (mdfbasydiv-15 > mdfbasyfro)
                  if (mdfbasydiv-11 > mdfbasyfro)
                     {
                      // 23.02.2024
                      COMPONENTI2("mdf_find_Cop", PADRE(exitBattuta_DX, -1), "*Cop*")
                      if (mdf_find_Cop == 0)  { COMPONENTI2("mdf_find_Cop", PADRE(exitBattuta_DX, -1), "Fusto*") }
                      miSSC = 1
                      alty_Div_ToCtrl = VAR_VAL(exitBattuta_DX, "alto_0.y")
                      alty_Div_OK = 0
                      while (miSSC <= mdf_find_Cop)
                         {
                          alty_Ele = VAR_VAL(mdf_find_Cop[miSSC], "alto_0.y")
                          if ( alty_Ele + 3 > alty_Div_ToCtrl
                             & alty_Ele - 3 < alty_Div_ToCtrl
                             )
                             {
                              // Per ora solo Basi, perchè Coperchio scorrevole potrebbe essere piu in basso
                              if (alty_Div_ToCtrl < 1000)
                                 { alty_Div_OK = 1 }
                             }

                          miSSC = miSSC+1
                         }
                      if (mdfydiv+60 < mdfyfro)
                         {
                          mdf_SbordoYSup_Dx = 0
                         }
                     // 13.07.2022 Sn22071301 montante unico e doppia anta
                      if ( mdfydiv-280 > mdfyfro
                         & mdfbasydiv-1 > mdfbasyfro
                         & mdfbasydiv-20 < mdfbasyfro
                         )
                         {
                          mdf_SbordoYInf_Dx = 0
                         }
                    // 13.05.2022 Sn Montantte AnP
                      if ( mdfydiv+20 < mdfyfro
                         // 13.07.2022 Sn Alzando l'anta di 30mm la cerniera sotto si sposta di 19mm più in alto
                         //& mdfydiv+90 > mdfyfro
                         & mdfydiv+100 > mdfyfro
                         )
                         {
                          // 23.02.2024 come Sx
                          if (alty_Div_OK == 0)  { mdf_SbordoYSup_Dx = 0 }

                          mdf_SbordoYInf_Dx = 0
                         }
                     }
                 // 12.01.2023
                  if (mdf_SbordoYSup_Dx < 25)
                     {
                      if (IS_MATCH(NOME(exitBattuta_DX), "*AngPan*") )
                         {
                          mdfaltyfro = VAR_VAL(mdf_idx_KFBX, "alto_0.y")
                          mdfaltydiv = VAR_VAL(exitBattuta_DX, "alto_0.y")
                          if (mdfaltydiv+20 > mdfaltyfro)
                             {
                              mdf_SbordoYSup_Dx = 0
                             }
                         }
                     // 31.05.2023 Come Inf
                      if ( IS_MATCH(NOME(exitBattuta_DX), "*AngPan*")
                         | PADRE(exitBattuta_DX, -1) == PADRE(mdf_idx_KFBX, -1)
                         )
                         {
                          COMPONENTI2("mdf_find_Cop", PADRE(exitBattuta_DX, -1), "*Cop*")
                          miSSC = 1
                          while (miSSC <= mdf_find_Cop)
                             {
                              alty_Ele = VAR_VAL(mdf_find_Cop[miSSC], "alto_0.y")
                              if ( alty_Ele + 3 > mdfaltyfro
                                 & alty_Ele - 3 < mdfaltyfro
                                 )
                                 {
                                  mdf_SbordoYSup_Dx_ANP_err = mdf_SbordoYSup_Dx
                                  mdf_SbordoYSup_Dx = 0
                                 }
                              miSSC = miSSC+1
                             }
                         }
                     }
                 // 31.05.2023 Sn006046
                  if (mdf_SbordoYInf_Dx < 25)
                     {
                      if ( IS_MATCH(NOME(exitBattuta_DX), "*AngPan*")
                         | PADRE(exitBattuta_DX, -1) == PADRE(mdf_idx_KFBX, -1)
                         // 14.06.2024
                         | mdf_ctrl_sbDiv_DX == 3
                         )
                         {
                          COMPONENTI2("mdf_find_Fondo", PADRE(exitBattuta_DX, -1), "*Fon*")
                          miSIF = 1
                          while (miSIF <= mdf_find_Fondo)
                             {
                              basy_SIFon = VAR_VAL(mdf_find_Fondo[miSIF], "base_0.y")
                              if ( basy_SIFon+3 > mdfbasyfro
                                 & basy_SIFon-3 < mdfbasyfro
                                 )
                                 {
                                  mdf_SbordoYInf_Dx_ANP_err = mdf_SbordoYInf_Dx
                                  mdf_SbordoYInf_Dx = 0
                                 }
                              miSIF = miSIF+1
                             }
                          // 14.06.2024 Sc1056248 Spalla, quindi fianco solitario, ma graficamente come se fosse un pensile 2Ante
                          if (mdf_ctrl_sbDiv_DX == 3)
                             {
                              BOX_MODE(0)
                              if (mdf_find_Fondo == 0)  { NEAR_GLOBALE("mdf_find_Fondo", mdf_idx_KFBX, 3.2, 1, "*Top*") }
                              if (mdf_find_Fondo == 0)  { NEAR_GLOBALE("mdf_find_Fondo", mdf_idx_KFBX, 3.2, 1, "*Rip*") }
                              miSIF = 1
                              while (miSIF <= mdf_find_Fondo)
                                 {
                                  basy_SIFon = VAR_VAL(mdf_find_Fondo[miSIF], "base_0.y")
                                  y_SIFon = VAR_VAL(mdf_find_Fondo[miSIF], "Y")
                                  if ( basy_SIFon+y_SIFon/2+0.6 > mdfbasyfro
                                     & basy_SIFon-y_SIFon/2+0.6 < mdfbasyfro
                                     )
                                     {
                                      mdf_SbordoYInf_Dx_Spa2A_err = mdf_SbordoYInf_Dx
                                      mdf_SbordoYInf_Dx = 0
                                     }
                                  miSIF = miSIF+1
                                 }
                             }
                         }
                     }
                 }
             }

          if (IS_IDX(mdf_doppio_fiaDx_inY) )
             {
              mdf_alty_FiaDx_2 = VAR_VAL(mdf_doppio_fiaDx_inY, "alto_0.y")
              mdf_basy_FiaDx_2 = VAR_VAL(mdf_doppio_fiaDx_inY, "base_0.y")
              if (mdf_basy_FiaDx_2-10 < mdf_alty_FiaDx  &  mdf_basy_FiaDx_2+10 > mdf_alty_FiaDx)
                 {
                  mdf_Y_FiaDx_2 = VAR_VAL(mdf_doppio_fiaDx_inY, "Y")
                  if (mdf_Y_FiaDx_2 > mdf_SbordoYSup_Dx)
                     {
                      mdf_SbordoYSup_Dx = 0
                     }
                 }
             }
         // 30.01.2019
          if (IS_IDX(mdf_doppio_fiaDx_inY_Battuta_X) )
             {
              mdf_alty_FiaDx_2 = VAR_VAL(mdf_doppio_fiaDx_inY_alto, "alto_0.y")
              mdf_diff_altalt_Dx = Aly_KFBX - mdf_alty_FiaDx_2
              mdf_SbordoYSup_Dx = 0
              if (mdf_diff_altalt_Dx > mdf_LimY_Con_Sbordo)
                 {
                  mdf_SbordoYSup_Dx = mdf_diff_altalt_Dx
                 }

              mdf_basy_FiaDx_2 = VAR_VAL(mdf_doppio_fiaDx_inY_basso, "base_0.y")
              mdf_diff_basbas_Dx = mdf_basy_FiaDx_2 - Bay_KFBX
              mdf_SbordoYInf_Dx = 0
              if (mdf_diff_basbas_Dx > mdf_LimY_Con_Sbordo)
                 {
                  mdf_SbordoYInf_Dx = mdf_diff_basbas_Dx
                 }
             // 13.05.2022
              if (IS_MATCH(NOME(exitBattuta_DX), "*AngPan*") )
                 {
                  if (mdf_SbordoYInf_Dx < 20)  { mdf_SbordoYInf_Dx = 0 }
                 }
             // 30.11.2023 Ce07622
              if (IS_MATCH(MdF_Apertura, "D*") == 1)
                 {
                  mdf_SbordoYSup_Sx_CtrlDoppioDx = mdf_SbordoYSup_Sx
                  // Ho il doppio fianco di Battuta solo a destra perchè la scocca sopra e' piu larga e le 2 ante sotto sbordano per coprirla
                  if ( IS_IDX(mdf_doppio_fiaSx_inY_Battuta_X) != 1
                     & IS_IDX(mdf_doppio_fiaDx_inY_Battuta_X) == 1
                     )
                     {
                      if (mdf_SbordoYSup_Dx == 0)
                         {
                          if (mdf_SbordoYSup_Sx > 0)  { mdf_SbordoYSup_Sx = 0 }
                         }
                     }
                 }
             }
         }
     // 02.11.2016
      if (VAR_VAL(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_Scocca") >= 1)
         {
          mdf_Ctrl_Sbordo_Sx_frat = 0
          // 29.10.2018
          // Se caso con fianco Sx alto come il dx che fa come da chiusura-parete qui non entra perché esiste exitBattuta_SX
          if (IS_IDX(exitBattuta_SX) != 1  &  IS_IDX(exitBattuta_DX) )
             {
              COMPONENTI2("mdf_find_FiaSx_frat", PADRE(exitBattuta_DX, -1), STRCAT(STRMID(0,3,NOME(exitBattuta_DX)), "*"))
              if (mdf_find_FiaSx_frat <= 1)
                 {
                  mdf_Ctrl_Sbordo_Sx_frat = 1
                  NEAR_GLOBALE("mdf_find_FiaSx_frat", PADRE(mdf_idx_KFBX, -1), mdf_distNearBatFia, 1, STRCAT(STRMID(0,3,NOME(exitBattuta_DX)), "*"))
                 }
             }
          mdf_Ctrl_Sbordo_my_pdr = 0
          mdf_alty_CopSc = 0
          mdf_basy_FonSc = 0
          // 22.03.2019
          mdf_prosegui_Ctrl_Scocca_ApSx_FiDx = 1
          mdf_Ctrl_Sbordo_FiaLatoCer = VAR_VAL(PADRE(mdf_idx_KFBX, 1), "MdF_Ctrl_Sbordo_FiaLatoCer")
          if (VAR_EXIST(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_FiaLatoCer") )  { mdf_Ctrl_Sbordo_FiaLatoCer = VAR_VAL(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_FiaLatoCer") }
          if ( mdf_Ctrl_Sbordo_FiaLatoCer > 0
             & IS_MATCH(MdF_Apertura, "S*") == 1
             )
             { mdf_prosegui_Ctrl_Scocca_ApSx_FiDx = 0 }

          if ( IS_IDX(exitBattuta_DX)
             // 22.03.2019
             & mdf_prosegui_Ctrl_Scocca_ApSx_FiDx == 1
             )
             {
              // 16.11.2018
              mcb_LimCop_SboSc = 60
              if (VAR_EXIST(mdf_idx_KFBX, "MdF_LimY_Con_Sbordo") )  { mcb_LimCop_SboSc = VAR_VAL(mdf_idx_KFBX, "MdF_LimY_Con_Sbordo") }

              // 06.05.2024 mancava rispetto a gestione att
              mdf_pros_Sbordo_Scocca3 = 0
              if (VAR_VAL(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_Scocca") >= 3)
                 {
                  if (IS_MATCH(NOME(exitBattuta_DX), "Fia*Ter*") )
                     { mdf_pros_Sbordo_Scocca3 = 1 }

                  // 08.08.2024 479754 da 10 a 15
                  if ( VAR_VAL(mdf_idx_KFBX, "base_0.y") < 15
                     & VAR_VAL(exitBattuta_DX, "base_0.y") < 15
                     )
                     { mdf_pros_Sbordo_Scocca3 = 2 }
                 }
             // 28.03.2025 St945165 COANP Fianco a Terra e Anta a terra. Deve trovare Sbordo da Fondo. Non ha senso dover cambiare MdF_Ctrl_Sbordo_Scocca a 3
              if ( VAR_VAL(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_Scocca") >= 1
                 & mdf_pros_Sbordo_Scocca3 < 2
                 )
                 {
                  if ( VAR_VAL(mdf_idx_KFBX, "base_0.y") < 15
                     & VAR_VAL(exitBattuta_DX, "base_0.y") < 15
                     & mdf_SbordoYInf_Sx == 0
                     & mdf_SbordoYInf_Dx == 0
                     )
                     {
                      mdf_pros_Sbordo_Scocca3 = 3
                     }
                 }

              if ( PADRE(exitBattuta_DX, -1) != PADRE(mdf_idx_KFBX, -1)
                 | mdf_pros_Sbordo_Scocca3 > 0
                 )
                 {
                  COMPONENTI2("mdf_Cop", PADRE(mdf_idx_KFBX, -1), "Cop*")
                  // 03.12.2018
                  if ( VAR_VAL(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_Scocca") >= 2
                     // 28.03.2025 St945165 COANP Fianco a Terra e Anta a terra. Deve trovare Sbordo da Fondo
                     | mdf_pros_Sbordo_Scocca3 >= 3
                     )
                     {
                      if (mdf_Cop == 0)
                         { NEAR_GLOBALE("mdf_Cop", mdf_idx_KFBX, 1.6, 1, "Cop*") }

                      // 06.05.2024
                      //NEAR_GLOBALE("mdf_Fon", mdf_idx_KFBX, 1.6, 1, "Fon*")
                      //NEAR_GLOBALE("mdf_Fon", mdf_idx_KFBX, 3, 1, "Fon*")
                      NEAR_GLOBALE("mdf_Fon", mdf_idx_KFBX, 3.02, 1, "Fon*")
                      // 13.09.2024 come proc non-globale solo perche ho visto che non era come la non-glob
                      if (mdf_Fon == 0)
                         {
                          mdF_archetipoFondo = VAR_VAL_STR(mdf_idx_KFBX, "MdF_archetipoFondo")
                          // 28.03.2025 St945165 COANP Fianco a Terra e Anta a terra. Deve trovare Sbordo da Fondo
                          if (STRLEN(mdF_archetipoFondo) < 1  &  mdf_pros_Sbordo_Scocca3 >= 2)  { mdF_archetipoFondo = "*Fon*" }

                          if (STRLEN(mdF_archetipoFondo) > 1)
                             {
                              NEAR_GLOBALE("mdf_Fon", mdf_idx_KFBX, 10.6, 1, mdF_archetipoFondo)
                              if (mdf_Fon > 0)
                                 {
                                  if ( VAR_VAL(mdf_Fon[1], "base_0.y") - mcb_LimCop_SboSc - 0.1 < VAR_VAL(mdf_idx_KFBX, "base_0.y")
                                     & VAR_VAL(mdf_Fon[1], "alto_0.y") > VAR_VAL(mdf_idx_KFBX, "base_0.y")
                                     )
                                     {
                                      mdf_SbordoYInf_Sx = 0
                                      // 13.09.2024 PH544951
                                      mdf_SbordoYInf_Sx_Found_Fondo = 1
                                      mdf_SbordoYInf_Dx = 0
                                     }
                                 }
                             }
                         }
                      if (mdf_Fon > 0)
                         {
                          if (VAR_VAL(mdf_Fon[1], "base_0.y") - 150 > VAR_VAL(mdf_idx_KFBX, "base_0.y") )
                             {
                              mdf_Ctrl_Sbordo_my_pdr = 1
                              mdf_basy_FonSc = VAR_VAL(mdf_Fon[1], "base_0.y")
                             }
                         // 06.05.2024
                          if ( VAR_VAL(mdf_Fon[1], "base_0.y") - 50 > VAR_VAL(mdf_idx_KFBX, "base_0.y")
                             & VAR_VAL(mdf_Fon[1], "base_0.y") - 180 < VAR_VAL(mdf_idx_KFBX, "base_0.y")
                             )
                             {
                              mdf_Ctrl_Sbordo_my_pdr = 1
                              mdf_basy_FonSc = VAR_VAL(mdf_Fon[1], "base_0.y")
                             }
                         }
                     }
                  if (mdf_Cop > 0)
                     {
                      if (VAR_VAL(mdf_Cop[1], "alto_0.y") + mcb_LimCop_SboSc < VAR_VAL(mdf_idx_KFBX, "alto_0.y") )
                         {
                          mdf_Ctrl_Sbordo_my_pdr = 1
                          mdf_alty_CopSc = VAR_VAL(mdf_Cop[1], "alto_0.y")
                         }
                     }
                 }
             }
          y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")

          //DISPLAY2(STRCAT("mdf_Ctrl_Sbordo_my_pdr=", STR(mdf_Ctrl_Sbordo_my_pdr), " idx=", STR(mdf_idx_KFBX)))
          if (mdf_Ctrl_Sbordo_my_pdr == 1)
             {
              mdf_alty_FiaSx = VAR_VAL(PADRE(mdf_idx_KFBX, -1), "alto_0.y")
              mdf_basy_FiaSx = VAR_VAL(PADRE(mdf_idx_KFBX, -1), "base_0.y")

              Bay_KFBX = VAR_VAL(mdf_idx_KFBX, "base_0.y")
              Aly_KFBX = VAR_VAL(mdf_idx_KFBX, "alto_0.y")

              mdf_diff_altalt_Sx = Aly_KFBX - mdf_alty_FiaSx
              mdf_diff_basbas_Sx = mdf_basy_FiaSx - Bay_KFBX

              //DISPLAY2(STRCAT("Aly_KFBX=", STR(Aly_KFBX), " y_Fro/3 + y_Fro/9=", STR(y_Fro/3+y_Fro/9)))

              // 10.09.2018
              if (mdf_diff_altalt_Sx == 0)
                 {
                  if (mdf_alty_CopSc < mdf_alty_FiaSx)
                     {
                     // 03.12.2018
                      mdf_limaltyCop = 150
                      if (VAR_VAL(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_Scocca") >= 2)  { mdf_limaltyCop = 300 }
                      // Al momento per sicurezza. Sopra dovrei controllare se effettivamente c'è solo un elemento coperchio e che sia in alto
                      // Dovrebbe essere un caso limite. Il problema è che la scocca ha alto_0.y uguale all' Armadio e non uguale al coperchio
                      // anche se comunque -1 di mdf_idx_KFBX è l' Armadio quindi in ogni caso non funzionava
                      if (mdf_alty_CopSc+mdf_limaltyCop > Aly_KFBX)
                         {
                          mdf_diff_altalt_Sx = Aly_KFBX - mdf_alty_CopSc
                         }
                     }
                 }
              // 03.12.2018
              // 06.05.2024
              //if (mdf_basy_FonSc > 150)
              if (mdf_basy_FonSc > 100)
                 {
                  if (mdf_Fon > 0)
                     { mdf_diff_basbas_Sx = mdf_basy_FonSc - Bay_KFBX }
                 }

              if ( mdf_diff_altalt_Sx > mdf_LimY_Con_Sbordo
                 // 21.12.2016
                 & mdf_diff_altalt_Sx <= y_Fro/3 + y_Fro/9
                 )
                 { mdf_SbordoYSup_Sx = mdf_diff_altalt_Sx }

              if ( mdf_diff_basbas_Sx > mdf_LimY_Con_Sbordo
                 // 21.12.2016
                 & mdf_diff_basbas_Sx <= y_Fro/3 + y_Fro/9
                 )
                 { mdf_SbordoYInf_Sx = mdf_diff_basbas_Sx }

             // 03.12.2018
              if (VAR_VAL(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_Scocca") >= 2)
                 {
                  if ( mdf_diff_basbas_Sx > mdf_LimY_Con_Sbordo
                     & mdf_diff_basbas_Sx <= y_Fro/2 + y_Fro/9
                     )
                     { mdf_SbordoYInf_Sx = mdf_diff_basbas_Sx }
                 }
             }
         // 29.10.2018
          if ( mdf_Ctrl_Sbordo_my_pdr != 1
             & mdf_Ctrl_Sbordo_Sx_frat > 0
             )
             {
              mdf_idxFia_ToSearch = PADRE(mdf_idx_KFBX, -1)
              if (mdf_find_FiaSx_frat > 2)  { mdf_idxFia_ToSearch = PADRE(mdf_idx_KFBX, 1) }
              if (mdf_find_FiaSx_frat <= 1  |  mdf_find_FiaSx_frat > 2)
                 {
                  NEAR_GLOBALE("mdf_find_FiaSx_frat", mdf_idxFia_ToSearch, mdf_distNearBatFia, 1, mdF_archetipo_Fia_2)
                  if (mdf_find_FiaSx_frat == 0)
                     { NEAR_GLOBALE("mdf_find_FiaSx_frat", mdf_idxFia_ToSearch, mdf_distNearBatFia, 1, "*Div*") }

                 // 05.08.2024 PKH 2024OVB545146_Come non gen
                  if ( mdf_find_FiaSx_frat == 0
                     & mdf_prosegui_Ctrl_Scocca_ApSx_FiDx == 1
                     & IS_IDX(exitBattuta_SX) != 1
                     )
                     {
                      NEAR_GLOBALE("mdf_find_FiaSx_frat", mdf_idxFia_ToSearch, mdf_distNearBatFia, 1, STRCAT(STRMID(0,3,NOME(exitBattuta_DX)), "*"))
                     }
                 }

              mdf_exitBattuta_SX_frat = -1
              mdf_ifi = 1
              while (mdf_ifi <= mdf_find_FiaSx_frat)
                 {
                  if ( mdf_find_FiaSx_frat[mdf_ifi] != exitBattuta_DX
                     & IS_MATCH(NOME(mdf_find_FiaSx_frat[mdf_ifi]), "Diva*") != 1
                     )
                     {
                      yDiv = VAR_VAL(mdf_find_FiaSx_frat[mdf_ifi], "Y")
                      yFro = VAR_VAL(mdf_idx_KFBX, "Y")
                      // 07.08.2020 Po592070 come non glob Se divisorio interno non lo devo considerare come elemento di Battuta-fratello
                      if ( VAR_VAL(mdf_idx_KFBX, "X")+100 > VAR_VAL(PADRE(mdf_idx_KFBX, -1), "X")
                         // 15.11.2024 PH 2024OVB209544
                         & VAR_VAL(mdf_idx_KFBX, "X")+100 > VAR_VAL(PADRE(mdf_find_FiaSx_frat[mdf_ifi], -1), "X")
                         & yDiv > 2*yFro/3
                         )
                         {
                          mdf_exitBattuta_SX_frat = mdf_find_FiaSx_frat[mdf_ifi]
                         }
                     }
                  mdf_ifi = mdf_ifi+1
                 }

             // 05.08.2024 PKH 2024OVB545146_Come non gen
              if (IS_IDX(mdf_exitBattuta_SX_frat) != 1)
                 {
                  mdf_ifi = 1
                  while (mdf_ifi <= mdf_find_FiaSx_frat)
                     {
                      if ( mdf_find_FiaSx_frat[mdf_ifi] != exitBattuta_DX
                         & IS_MATCH(NOME(mdf_find_FiaSx_frat[mdf_ifi]), "Diva*") != 1
                         )
                         {
                          if ( mdf_prosegui_Ctrl_Scocca_ApSx_FiDx == 1
                             & IS_IDX(exitBattuta_SX) != 1
                             // 13.09.2024 PH544951
                             & mdf_SbordoYInf_Sx_Found_Fondo == 0
                             )
                             {
                              COMPONENTI2("mdf_nAnte_SX_frat", mdf_idxFia_ToSearch, NOME(mdf_idx_KFBX))
                              if (mdf_nAnte_SX_frat == 2)
                                 {
                                  iASf = 1
                                  while (iASf <= mdf_nAnte_SX_frat)
                                     {
                                      if (mdf_nAnte_SX_frat[iASf] != mdf_idx_KFBX)
                                         {
                                          mdf_idxFro_ToSearch = mdf_nAnte_SX_frat[iASf]
                                         // 02.09.2024 PH 2023OVB516711
                                          if ( IS_IDX(VAR_VAL(mdf_idxFro_ToSearch, "exitBattuta_SX")) == 1
                                             // 21.01.2025 H24000043 altrimenti VAR_VAL dà 0
                                             & VAR_EXIST(mdf_idxFro_ToSearch, "exitBattuta_SX")
                                             )
                                             {
                                              mdf_exitBattuta_SX_frat = VAR_VAL(mdf_idxFro_ToSearch, "exitBattuta_SX")
                                             }
                                          else
                                             {
                                              NEAR_GLOBALE("mdf_find_FiaSx_frat_FromFro", mdf_idxFro_ToSearch, mdf_distNearBatFia, 1, STRCAT(STRMID(0,3,NOME(exitBattuta_DX)), "*"))
                                              if (mdf_find_FiaSx_frat_FromFro > 0)
                                                 {
                                                  mdf_exitBattuta_SX_frat = mdf_find_FiaSx_frat_FromFro[1]
                                                 }
                                             }
                                         }
                                      iASf = iASf+1
                                     }
                                 }
                             }
                         }
                      mdf_ifi = mdf_ifi+1
                     }
                 }

              if (IS_IDX(mdf_exitBattuta_SX_frat) )
                 {
                  mdf_alty_FiaSx = VAR_VAL(mdf_exitBattuta_SX_frat, "alto_0.y")
                  mdf_basy_FiaSx = VAR_VAL(mdf_exitBattuta_SX_frat, "base_0.y")

                  Bay_KFBX = VAR_VAL(mdf_idx_KFBX, "base_0.y")
                  Aly_KFBX = VAR_VAL(mdf_idx_KFBX, "alto_0.y")

                  mdf_diff_altalt_Sx = Aly_KFBX - mdf_alty_FiaSx
                  if ( mdf_diff_altalt_Sx > mdf_LimY_Con_Sbordo
                     // 21.12.2016
                     & mdf_diff_altalt_Sx <= y_Fro/3 + y_Fro/9
                     )
                     { mdf_SbordoYSup_Sx = mdf_diff_altalt_Sx }

                  mdf_diff_basbas_Sx = mdf_basy_FiaSx - Bay_KFBX
                  if ( mdf_diff_basbas_Sx > mdf_LimY_Con_Sbordo
                     & mdf_diff_basbas_Sx <= y_Fro/3 + y_Fro/9
                     )
                     { mdf_SbordoYInf_Sx = mdf_diff_basbas_Sx }
                 }
             }
          mdf_Ctrl_Sbordo_Dx_frat = 0
          if (IS_IDX(exitBattuta_SX)  &  IS_IDX(exitBattuta_DX) != 1)
             {
              COMPONENTI2("mdf_find_FiaDx_frat", PADRE(exitBattuta_SX, -1), STRCAT(STRMID(0,3,NOME(exitBattuta_SX)), "*"))
              if (mdf_find_FiaDx_frat <= 1)
                 {
                  mdf_Ctrl_Sbordo_Dx_frat = 1
                  NEAR_GLOBALE("mdf_find_FiaDx_frat", PADRE(mdf_idx_KFBX, -1), mdf_distNearBatFia, 1, STRCAT(STRMID(0,3,NOME(exitBattuta_SX)), "*"))
                 }
              }

          mdf_Ctrl_Sbordo_my_pdr = 0
          mdf_alty_CopSc = 0
          mdf_basy_FonSc = 0
          // 22.03.2019
          mdf_prosegui_Ctrl_Scocca_ApDx_FiSx = 1
          mdf_Ctrl_Sbordo_FiaLatoCer = VAR_VAL(PADRE(mdf_idx_KFBX, 1), "MdF_Ctrl_Sbordo_FiaLatoCer")
          if (VAR_EXIST(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_FiaLatoCer") )  { mdf_Ctrl_Sbordo_FiaLatoCer = VAR_VAL(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_FiaLatoCer") }
          if ( mdf_Ctrl_Sbordo_FiaLatoCer > 0
             & IS_MATCH(MdF_Apertura, "D*") == 1
             )
             { mdf_prosegui_Ctrl_Scocca_ApDx_FiSx = 0 }

          if ( IS_IDX(exitBattuta_SX)
             // 22.03.2019
             & mdf_prosegui_Ctrl_Scocca_ApDx_FiSx == 1
             )
             {
              // 16.11.2018
              mcb_LimCop_SboSc = 60
              if (VAR_EXIST(mdf_idx_KFBX, "MdF_LimY_Con_Sbordo") )  { mcb_LimCop_SboSc = VAR_VAL(mdf_idx_KFBX, "MdF_LimY_Con_Sbordo") }

              // 06.05.2024 mancava rispetto a gestione att
              mdf_pros_Sbordo_Scocca3 = 0
              if (VAR_VAL(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_Scocca") >= 3)
                 {
                  if (IS_MATCH(NOME(exitBattuta_SX), "Fia*Ter*") )
                     { mdf_pros_Sbordo_Scocca3 = 1 }

                  // 08.08.2024 479754 da 10 a 15
                  if ( VAR_VAL(mdf_idx_KFBX, "base_0.y") < 15
                     & VAR_VAL(exitBattuta_SX, "base_0.y") < 15
                     )
                     { mdf_pros_Sbordo_Scocca3 = 2 }
                 }
             // 28.03.2025 St945165 COANP Fianco a Terra e Anta a terra. Deve trovare Sbordo da Fondo. Non ha senso dover cambiare MdF_Ctrl_Sbordo_Scocca a 3
              if ( VAR_VAL(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_Scocca") >= 1
                 & mdf_pros_Sbordo_Scocca3 < 2
                 )
                 {
                  if ( VAR_VAL(mdf_idx_KFBX, "base_0.y") < 15
                     & VAR_VAL(exitBattuta_SX, "base_0.y") < 15
                     & mdf_SbordoYInf_Sx == 0
                     & mdf_SbordoYInf_Dx == 0
                     )
                     {
                      mdf_pros_Sbordo_Scocca3 = 3
                     }
                 }

              if ( PADRE(exitBattuta_SX, -1) != PADRE(mdf_idx_KFBX, -1)
                 | mdf_pros_Sbordo_Scocca3 > 0
                 )
                 {
                  COMPONENTI2("mdf_Cop", PADRE(mdf_idx_KFBX, -1), "Cop*")
                  // 03.12.2018
                  if ( VAR_VAL(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_Scocca") >= 2
                     // 28.03.2025 St945165 COANP Fianco a Terra e Anta a terra. Deve trovare Sbordo da Fondo
                     | mdf_pros_Sbordo_Scocca3 >= 3
                     )
                     {
                      if (mdf_Cop == 0)
                         { NEAR_GLOBALE("mdf_Cop", mdf_idx_KFBX, 1.6, 1, "Cop*") }

                      // 06.05.2024
                      //NEAR_GLOBALE("mdf_Fon", mdf_idx_KFBX, 1.6, 1, "Fon*")
                      //NEAR_GLOBALE("mdf_Fon", mdf_idx_KFBX, 3, 1, "Fon*")
                      NEAR_GLOBALE("mdf_Fon", mdf_idx_KFBX, 3.02, 1, "Fon*")
                     // 23.01.2023 come proc non-globale solo perche ho visto che non era come la non-glob
                      if (mdf_Fon == 0)
                         {
                          mdF_archetipoFondo = VAR_VAL_STR(mdf_idx_KFBX, "MdF_archetipoFondo")
                          // 28.03.2025 St945165 COANP Fianco a Terra e Anta a terra. Deve trovare Sbordo da Fondo
                          if (STRLEN(mdF_archetipoFondo) < 1  &  mdf_pros_Sbordo_Scocca3 >= 2)  { mdF_archetipoFondo = "*Fon*" }

                          if (STRLEN(mdF_archetipoFondo) > 1)
                             {
                              NEAR_GLOBALE("mdf_Fon", mdf_idx_KFBX, 10.6, 1, mdF_archetipoFondo)
                              if (mdf_Fon > 0)
                                 {
                                  if ( VAR_VAL(mdf_Fon[1], "base_0.y") - mcb_LimCop_SboSc - 0.1 < VAR_VAL(mdf_idx_KFBX, "base_0.y")
                                     & VAR_VAL(mdf_Fon[1], "alto_0.y") > VAR_VAL(mdf_idx_KFBX, "base_0.y")
                                     )
                                     {
                                      mdf_SbordoYInf_Dx = 0
                                      // 13.09.2024 PH544951
                                      mdf_SbordoYInf_Dx_Found_Fondo = 1
                                      mdf_SbordoYInf_Sx = 0
                                     }
                                 }
                             }
                         }
                      if (mdf_Fon > 0)
                         {
                          if (VAR_VAL(mdf_Fon[1], "base_0.y") - 150 > VAR_VAL(mdf_idx_KFBX, "base_0.y") )
                             {
                              mdf_Ctrl_Sbordo_my_pdr = 1
                              mdf_basy_FonSc = VAR_VAL(mdf_Fon[1], "base_0.y")
                             }
                         // 06.05.2024
                          if ( VAR_VAL(mdf_Fon[1], "base_0.y") - 50 > VAR_VAL(mdf_idx_KFBX, "base_0.y")
                             & VAR_VAL(mdf_Fon[1], "base_0.y") - 180 < VAR_VAL(mdf_idx_KFBX, "base_0.y")
                             )
                             {
                              mdf_Ctrl_Sbordo_my_pdr = 1
                              mdf_basy_FonSc = VAR_VAL(mdf_Fon[1], "base_0.y")
                             }
                         }
                     }
                 // 23.01.2023 solo perche ho visto che non era come la non-glob
                  iCo=1
                  while (iCo <= mdf_Cop)
                     {
                      if ( VAR_VAL(mdf_Cop[iCo], "alto_0.y") + mcb_LimCop_SboSc < VAR_VAL(mdf_idx_KFBX, "alto_0.y")
                         & VAR_VAL(mdf_Cop[iCo], "alto_0.y") - 1 > VAR_VAL(mdf_idx_KFBX, "base_0.y")
                         )
                         {
                          mdf_Ctrl_Sbordo_my_pdr = 1
                          mdf_alty_CopSc = VAR_VAL(mdf_Cop[iCo], "alto_0.y")
                         }
                      iCo = iCo+1
                     }
                 }
             }

          y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")
          if (mdf_Ctrl_Sbordo_my_pdr == 1)
             {
              mdf_alty_FiaDx = VAR_VAL(PADRE(mdf_idx_KFBX, -1), "alto_0.y")
              mdf_basy_FiaDx = VAR_VAL(PADRE(mdf_idx_KFBX, -1), "base_0.y")

              Bay_KFBX = VAR_VAL(mdf_idx_KFBX, "base_0.y")
              Aly_KFBX = VAR_VAL(mdf_idx_KFBX, "alto_0.y")

              mdf_diff_altalt_Dx = Aly_KFBX - mdf_alty_FiaDx
              mdf_diff_basbas_Dx = mdf_basy_FiaDx - Bay_KFBX

              // 10.09.2018
              //DISPLAY2(STRCAT("mdf_diff_altalt_Dx=", STR(mdf_diff_altalt_Dx), " y_Fro/3 + y_Fro/9=", STR(y_Fro/3+y_Fro/9)))
              if (mdf_diff_altalt_Dx == 0)
                 {
                  if (mdf_alty_CopSc < mdf_alty_FiaDx)
                     {
                     // 03.12.2018
                      mdf_limaltyCop = 150
                      if (VAR_VAL(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_Scocca") >= 2)  { mdf_limaltyCop = 300 }
                      // Al momento per sicurezza. Sopra dovrei controllare se effettivamente c'è solo un elemento coperchio e che sia in alto
                      // Dovrebbe essere un caso limite. Il problema è che la scocca ha alto_0.y uguale all' Armadio e non uguale al coperchio
                      // anche se comunque -1 di mdf_idx_KFBX è l' Armadio quindi in ogni caso non funzionava
                      if (mdf_alty_CopSc+mdf_limaltyCop > Aly_KFBX)
                         {
                          mdf_diff_altalt_Dx = Aly_KFBX - mdf_alty_CopSc
                         }
                     }
                 }
              // 03.12.2018
              // 06.05.2024
              //if (mdf_basy_FonSc > 150)
              if (mdf_basy_FonSc > 100)
                 {
                  if (mdf_Fon > 0)
                     { mdf_diff_basbas_Dx = mdf_basy_FonSc - Bay_KFBX }
                 }

              if ( mdf_diff_altalt_Dx > mdf_LimY_Con_Sbordo
                 & mdf_diff_altalt_Dx <= y_Fro/3 + y_Fro/9
                 )
                 { mdf_SbordoYSup_Dx = mdf_diff_altalt_Dx }

              if ( mdf_diff_basbas_Dx > mdf_LimY_Con_Sbordo
                 // 21.12.2016
                 & mdf_diff_basbas_Dx <= y_Fro/3 + y_Fro/9
                 )
                 { mdf_SbordoYInf_Dx = mdf_diff_basbas_Dx }

             // 03.12.2018
              if (VAR_VAL(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_Scocca") >= 2)
                 {
                  if ( mdf_diff_basbas_Dx > mdf_LimY_Con_Sbordo
                     & mdf_diff_basbas_Dx <= y_Fro/2 + y_Fro/9
                     )
                     { mdf_SbordoYInf_Dx = mdf_diff_basbas_Dx }
                 }
             }
         // 29.10.2018
          if ( mdf_Ctrl_Sbordo_my_pdr != 1
             & mdf_Ctrl_Sbordo_Dx_frat > 0
             )
             {
              mdf_idxFia_ToSearch = PADRE(mdf_idx_KFBX, -1)
              if (mdf_find_FiaDx_frat > 2)  { mdf_idxFia_ToSearch = PADRE(mdf_idx_KFBX, 1) }
              if (mdf_find_FiaDx_frat <= 1  |  mdf_find_FiaDx_frat > 2)
                 {
                  NEAR_GLOBALE("mdf_find_FiaDx_frat", mdf_idxFia_ToSearch, mdf_distNearBatFia, 1, mdF_archetipo_Fia_2)
                  if (mdf_find_FiaDx_frat == 0)
                     { NEAR_GLOBALE("mdf_find_FiaDx_frat", mdf_idxFia_ToSearch, mdf_distNearBatFia, 1, "*Div*") }

                 // 05.08.2024 PKH 2024OVB545146_SxDx Come non gen
                  if ( mdf_find_FiaDx_frat == 0
                     & mdf_prosegui_Ctrl_Scocca_ApDx_FiSx == 1
                     & IS_IDX(exitBattuta_DX) != 1
                     )
                     {
                      NEAR_GLOBALE("mdf_find_FiaDx_frat", mdf_idxFia_ToSearch, mdf_distNearBatFia, 1, STRCAT(STRMID(0,3,NOME(exitBattuta_SX)), "*"))
                     }
                 }
              mdf_exitBattuta_DX_frat = -1
              mdf_ifi = 1
              while (mdf_ifi <= mdf_find_FiaDx_frat)
                 {
                  if ( mdf_find_FiaDx_frat[mdf_ifi] != exitBattuta_SX
                     // 21.12.2016
                     & IS_MATCH(NOME(mdf_find_FiaDx_frat[mdf_ifi]), "Diva*") != 1
                     )
                     {
                      yDiv = VAR_VAL(mdf_find_FiaDx_frat[mdf_ifi], "Y")
                      yFro = VAR_VAL(mdf_idx_KFBX, "Y")
                      // 07.08.2020 Po592070 come non glob Se divisorio interno non lo devo considerare come elemento di Battuta-fratello
                      if ( VAR_VAL(mdf_idx_KFBX, "X")+100 > VAR_VAL(PADRE(mdf_idx_KFBX, -1), "X")
                         // 15.11.2024 PH 2024OVB209544
                         & VAR_VAL(mdf_idx_KFBX, "X")+100 > VAR_VAL(PADRE(mdf_find_FiaDx_frat[mdf_ifi], -1), "X")
                         & yDiv > 2*yFro/3
                         )
                         {
                          mdf_exitBattuta_DX_frat = mdf_find_FiaDx_frat[mdf_ifi]
                         }
                     }
                  mdf_ifi = mdf_ifi+1
                 }

             // 05.08.2024 PKH 2024OVB545146_SxDx Come non gen
              if (IS_IDX(mdf_exitBattuta_DX_frat) != 1)
                 {
                  mdf_ifi = 1
                  while (mdf_ifi <= mdf_find_FiaDx_frat)
                     {
                      if ( mdf_find_FiaDx_frat[mdf_ifi] != exitBattuta_SX
                         & IS_MATCH(NOME(mdf_find_FiaDx_frat[mdf_ifi]), "Diva*") != 1
                         )
                         {
                          if ( mdf_prosegui_Ctrl_Scocca_ApDx_FiSx == 1
                             & IS_IDX(exitBattuta_DX) != 1
                             // 13.09.2024 PH544951
                             & mdf_SbordoYInf_Dx_Found_Fondo == 0
                             )
                             {
                              COMPONENTI2("mdf_nAnte_DX_frat", mdf_idxFia_ToSearch, NOME(mdf_idx_KFBX))
                              if (mdf_nAnte_DX_frat == 2)
                                 {
                                  iADf = 1
                                  while (iADf <= mdf_nAnte_DX_frat)
                                     {
                                      if (mdf_nAnte_DX_frat[iADf] != mdf_idx_KFBX)
                                         {
                                          mdf_idxFro_ToSearch = mdf_nAnte_DX_frat[iADf]
                                         // 02.09.2024 PH 2023OVB516711
                                          if (IS_IDX(VAR_VAL(mdf_idxFro_ToSearch, "exitBattuta_DX")) == 1
                                             // 21.01.2025 H24000043 altrimenti VAR_VAL dà 0
                                             & VAR_EXIST(mdf_idxFro_ToSearch, "exitBattuta_DX")
                                             )
                                             {
                                              mdf_exitBattuta_DX_frat = VAR_VAL(mdf_idxFro_ToSearch, "exitBattuta_DX")
                                             }
                                          else
                                             {
                                              NEAR_GLOBALE("mdf_find_FiaDx_frat_FromFro", mdf_idxFro_ToSearch, mdf_distNearBatFia, 1, STRCAT(STRMID(0,3,NOME(exitBattuta_SX)), "*"))
                                              if (mdf_find_FiaDx_frat_FromFro > 0)
                                                 {
                                                  mdf_exitBattuta_DX_frat = mdf_find_FiaDx_frat_FromFro[1]
                                                 }
                                             }
                                         }
                                      iADf = iADf+1
                                     }
                                 }
                             }
                         }
                      mdf_ifi = mdf_ifi+1
                     }
                 }

              if (IS_IDX(mdf_exitBattuta_DX_frat) )
                 {
                  mdf_alty_FiaDx = VAR_VAL(mdf_exitBattuta_DX_frat, "alto_0.y")
                  mdf_basy_FiaDx = VAR_VAL(mdf_exitBattuta_DX_frat, "base_0.y")

                  Bay_KFBX = VAR_VAL(mdf_idx_KFBX, "base_0.y")
                  Aly_KFBX = VAR_VAL(mdf_idx_KFBX, "alto_0.y")

                  mdf_diff_altalt_Dx = Aly_KFBX - mdf_alty_FiaDx
                  if ( mdf_diff_altalt_Dx > mdf_LimY_Con_Sbordo
                     & mdf_diff_altalt_Dx <= y_Fro/3 + y_Fro/9
                     )
                     { mdf_SbordoYSup_Dx = mdf_diff_altalt_Dx }

                  mdf_diff_basbas_Dx = mdf_basy_FiaDx - Bay_KFBX
                  if (mdf_diff_basbas_Dx > mdf_LimY_Con_Sbordo
                     & mdf_diff_basbas_Dx <= y_Fro/3 + y_Fro/9
                     )
                     { mdf_SbordoYInf_Dx = mdf_diff_basbas_Dx }
                 }
             }

          // 07.08.2020 per Ante soffietto che non hanno fianco di Battuta
          if (IS_IDX(exitBattuta_SX) != 1  &  IS_IDX(exitBattuta_DX) != 1)
             {
              idx_att_SbAperSD = mdf_idx_KFBX
              GOSUB mdf_Ctrl_Sbordo_Scocca_AperSX
              GOSUB mdf_Ctrl_Sbordo_Scocca_AperDX
             }
         }
     // 13.04.2017
      if (IS_IDX(exitBattuta_SX) != 1)
         {
          if (IS_MATCH(MdF_Apertura, "S*") == 1)
             {
              if (VAR_VAL(mdf_idx_KFBX, "MdF_Mans_LavSp_YpSx") > 2)
                 {
                  y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")
                  mdf_SbordoYSup_Sx = y_Fro - VAR_VAL(mdf_idx_KFBX, "MdF_Mans_LavSp_YpSx")
                 }
             }
         }
      if (IS_IDX(exitBattuta_DX) != 1)
         {
          if (IS_MATCH(MdF_Apertura, "D*") == 1)
             {
              if (VAR_VAL(mdf_idx_KFBX, "MdF_Mans_LavSp_YpDx") > 2)
                 {
                  y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")
                  mdf_SbordoYSup_Dx = y_Fro - VAR_VAL(mdf_idx_KFBX, "MdF_Mans_LavSp_YpDx")
                 }
             }
         }

      if (IS_MATCH(MdF_Apertura, "S*") == 1)
         {
          MdfSys_SbordoYInf = mdf_SbordoYInf_Sx
          MdfSys_SbordoYSup = mdf_SbordoYSup_Sx
         }
      if (IS_MATCH(MdF_Apertura, "D*") == 1)
         {
          MdfSys_SbordoYInf = mdf_SbordoYInf_Dx
          MdfSys_SbordoYSup = mdf_SbordoYSup_Dx
         }

      // Devo farlo indipendente dall' MdF_Apertura perché se sborda sull altro fianco devo tener conto del fianco "peggiore"
      // 13.09.2016
      // In realtà dipende cosa vuol fare il cliente
      mdf_aper_noBatt = 0
      if ( IS_MATCH(MdF_Apertura, "S*") != 1
         & IS_MATCH(MdF_Apertura, "D*") != 1
         )
         { mdf_aper_noBatt = 1 }

      mdf_ctrl_Sbordo_noBatt = 0
      if ( VAR_VAL(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_FiaLatoCer") > 0
         & mdf_aper_noBatt == 1
         )
         { mdf_ctrl_Sbordo_noBatt = 1 }

      if ( VAR_VAL(mdf_idx_KFBX, "MdF_Ctrl_Sbordo_FiaLatoCer") == 0
         | mdf_ctrl_Sbordo_noBatt > 0
         )
         {
         // 17.10.2017
          mdf_graficataSciolta = 0
          if ( IS_MATCH(NOME(PADRE(mdf_idx_KFBX, -1)), "*Anta*")
             | IS_MATCH(NOME(PADRE(mdf_idx_KFBX, -1)), "*Fron*")
             )
             {
              // se non sento un fianco e ne sento uno che magari non è nemmeno riferito al lato Cerniere,
              // probabile che sono posizionata erroneamente vicino ad una scocca
              if (IS_IDX(exitBattuta_SX) != 1 | IS_IDX(exitBattuta_DX) != 1)
                 {
                  if (ABS(Battuta_X) < 10)
                     { mdf_graficataSciolta = 1 }
                 }
             }
         // 12.02.2019
          mdf_ignora_sbordoY_div_Sx = 0
         // 18.02.2025
          mdf_considera_sbordoY_Sx_ANP = 0
          if (IS_MATCH(MdF_Apertura, "D*") == 1  &  IS_IDX(exitBattuta_DX) != 1)
             { mdf_considera_sbordoY_Sx_ANP = 1 }

          if ( IS_IDX(exitBattuta_SX) == 1
             & mdf_considera_sbordoY_Sx_ANP == 0
             )
             {
              // 28.03.2019 A30409
              // 29.03.2019 H12522 Fianco
              // significa presenza di Divisorio per attrezzatura interna che non ha niente a che vedere con la Battuta_X
              if (VAR_VAL(mdf_idx_KFBX, "X")+100 < VAR_VAL(PADRE(mdf_idx_KFBX, -1), "X") )
                 {
                  if ( mdf_SbordoYInf_Sx > 280
                     | mdf_SbordoYSup_Sx > 280
                     )
                     {
                      mdf_ignora_sbordoY_div_Sx = 1
                     }
                 }
             }
          mdf_ignora_sbordoY_div_Dx = 0
         // 18.02.2025 A007106 Strano non sia uscito prima. Forse andava MdF_Ctrl_Sbordo_Scocca=1 per questo caso, ma mi
          // sembrava funzionasse da altre parti, forse perchè lo sbordo era sempre < di 280 e forse era per quello che
          // quella volta avevo messo > 280 perchè non mi convinceva appieno
          mdf_considera_sbordoY_Dx_ANP = 0
          if (IS_MATCH(MdF_Apertura, "S*") == 1  &  IS_IDX(exitBattuta_SX) != 1)
             { mdf_considera_sbordoY_Dx_ANP = 1 }

          if ( IS_IDX(exitBattuta_DX) == 1
             // 18.02.2025 A007106
             & mdf_considera_sbordoY_Dx_ANP == 0
             )
             {
              // 28.03.2019 A30409
              // 29.03.2019 H12522 Fianco
              // significa presenza di Divisorio per attrezzatura interna che non ha niente a che vedere con la Battuta_X
              if (VAR_VAL(mdf_idx_KFBX, "X")+100 < VAR_VAL(PADRE(mdf_idx_KFBX, -1), "X") )
                 {
                  if ( mdf_SbordoYInf_Dx > 280
                     | mdf_SbordoYSup_Dx > 280
                     )
                     {
                      mdf_ignora_sbordoY_div_Dx = 1
                     }
                 }
             }

          if (mdf_graficataSciolta == 0)
             {
             // 12.02.2019
              if (mdf_ignora_sbordoY_div_Sx == 0  &  mdf_ignora_sbordoY_div_Dx == 0)
                 {
                  if (mdf_SbordoYInf_Sx > mdf_SbordoYInf_Dx)
                     { MdfSys_SbordoYInf = mdf_SbordoYInf_Sx }
                  else
                     { MdfSys_SbordoYInf = mdf_SbordoYInf_Dx }

                  if (mdf_SbordoYSup_Sx > mdf_SbordoYSup_Dx)
                     { MdfSys_SbordoYSup = mdf_SbordoYSup_Sx }
                  else
                     { MdfSys_SbordoYSup = mdf_SbordoYSup_Dx }
                 }
             }
         }
      if (MdfSys_SbordoYInf > 0)
         { MdfSys_SbordoYInf = MdfSys_SbordoYInf + mdf_offsetY_Sbordo }

      if (MdfSys_SbordoYSup > 0)
         { MdfSys_SbordoYSup = MdfSys_SbordoYSup + mdf_offsetY_Sbordo }

     // 21.02.2023 PolK
      if (mdf_abbassaSbordoInf != 0)
         {
          MdfSys_SbordoYInf = MdfSys_SbordoYInf-mdf_abbassaSbordoInf
          if (MdfSys_SbordoYInf <= mdf_LimY_Con_Sbordo)
             { MdfSys_SbordoYInf = 0 }
         }

      if (mdf_abbassaSbordoSup != 0)
         {
          MdfSys_SbordoYSup = MdfSys_SbordoYSup-mdf_abbassaSbordoSup
          if (MdfSys_SbordoYSup <= mdf_LimY_Con_Sbordo)
             { MdfSys_SbordoYSup = 0 }
         }

     // 06.04.2023
      mdf_id_ForzaBatt = mdf_idx_KFBX
     // 17.01.2025
      if (Battuta_X == 0)
         {
          if ( IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura"), "S*")
             | IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura"), "D*")
             )
             {
              if (VAR_EXIST(mdf_id_ForzaBatt, "MCB_BattutaX_minima") != 1)  { mdf_id_ForzaBatt = PADRE(mdf_idx_KFBX, 1) }
              if (VAR_VAL(mdf_id_ForzaBatt, "MCB_BattutaX_minima") > 4)
                 {
                  if (VAR_VAL(mdf_idx_KFBX, "MdF_angoloBas") == 0)
                     {
                      COMPONENTI2("mdf_fia_pres", PADRE(mdf_idx_KFBX, -1), "*Fia*")
                      COMPONENTI3("mdf_fia_escl", PADRE(mdf_idx_KFBX, -1), "*Fia*")
                      if (mdf_fia_pres == 0  &  mdf_fia_escl > 0)
                         {
                          Battuta_X = VAR_VAL(mdf_id_ForzaBatt, "MCB_BattutaX_minima")
                         }
                     }
                 }
             }
         }

     // 11.02.2025 Sc1057073 Devo reimpostarlo altrimenti se non esiste MCB_BattutaX_minima lo imposta a PADRE di 1 qui sopra
      mdf_id_ForzaBatt = mdf_idx_KFBX
      if (VAR_EXIST(mdf_id_ForzaBatt, "MCB_ForzaBattutaX") != 1)  { mdf_id_ForzaBatt = PADRE(mdf_idx_KFBX, 1) }
      if ( VAR_VAL(mdf_id_ForzaBatt, "MCB_ForzaBattutaX") != 0
         // 02.08.2024 solo per sicurezza
         & ABS(VAR_VAL(mdf_id_ForzaBatt, "MCB_ForzaBattutaX")) > 10
         )
         {
          Battuta_X = VAR_VAL(mdf_id_ForzaBatt, "MCB_ForzaBattutaX")
         }
     // 10.10.2023 Vedi anche MPF_ForzaBattutaX_Sx, Dx

      SET_#(mdf_idx_KFBX)
      #MdfSys_SbordoYSup = MdfSys_SbordoYSup
      #MdfSys_SbordoYInf = MdfSys_SbordoYInf
      #Battuta_X    = Battuta_X
      #Battuta_SX   = Battuta_SX
      #Battuta_DX   = Battuta_DX
      #Battuta_X_Sx = Battuta_X_Sx
      #Battuta_X_Dx = Battuta_X_Dx

      #exitBattuta_SX = exitBattuta_SX
      #exitBattuta_DX = exitBattuta_DX

      if ( mdf_Battuta_X_SX_Pro_Cn > X_FiaBatSX_Cn  &  mdf_Battuta_X_SX_Pro_Cn < VAR_VAL(mdf_idx_KFBX, "X")-X_FiaBatSX_Cn
         & X_FiaBatSX_Cn > 0
         & Battuta_SX == 0
         )
         {
          // 05.05.2023 Sn05761 mdf_Batt_SX_Cn_case=0.1
          //#MdfSys_Battuta_SX_Cn = mdf_Battuta_X_SX_Pro_Cn+X_FiaBatSX_Cn
          #MdfSys_Battuta_SX_Cn = mdf_Battuta_X_SX_Pro_Cn
          // 05.05.2023 Sn009925 comunque era errata quella globale. Vedi mdf_Batt_SX_Cn_case=2
          if ( mdf_Battuta_X_SX_Pro_Cn > VAR_VAL(mdf_idx_KFBX, "X")/2 + X_FiaBatSX_Cn+1
             & mdf_Battuta_X_SX_Pro_Cn+1 > mdf_Battuta_X_DX_Pro_Cn
            // 13.06.2023 ScBROWSER1965723
            // 04.07.2023 Sc1022023362
             //& mdf_Battuta_X_SX_Pro_Cn-1 < mdf_Battuta_X_DX_Pro_Cn
             & mdf_Battuta_X_SX_Pro_Cn-40 < mdf_Battuta_X_DX_Pro_Cn
             )
             {
              #MdfSys_Battuta_SX_Cn = VAR_VAL(mdf_idx_KFBX, "X")-mdf_Battuta_X_SX_Pro_Cn-X_FiaBatSX_Cn
             }

          #MdfSys_idx_Fia_SX_CnSX = mdf_idx_FiaBatSX_CnSX
          #MdfSys_idx_Fia_SX_CnDX = mdf_idx_FiaBatSX_CnDX
         }

      if ( mdf_Battuta_X_DX_Pro_Cn > X_FiaBatDX_Cn  &  mdf_Battuta_X_DX_Pro_Cn < VAR_VAL(mdf_idx_KFBX, "X")-X_FiaBatDX_Cn
         & X_FiaBatDX_Cn > 0
         & Battuta_DX == 0
         )
         {
          #MdfSys_Battuta_DX_Cn = mdf_Battuta_X_DX_Pro_Cn
          #MdfSys_idx_Fia_DX_CnSX = mdf_idx_FiaBatDX_CnSX
          #MdfSys_idx_Fia_DX_CnDX = mdf_idx_FiaBatDX_CnDX
         }

     // 24.04.2025
      #MdfSys_SbordoYInf_DaFon = 0
      #MdfSys_SbordoYSup_DaCop = 0
      idx_SbFoCo = mdf_idx_KFBX
      GOSUB MdF_SbordoY_DaFonCop
   }

   PROCEDURA MdF_get_Battuta_SX_Gen
   {
      CAM_Ang = ANG_TOT2(mdf_idx_KFBX)
      SET_#(mdf_idx_KFBX)
      Ba0_att = [#base_0.x, 0, #base_0.z]
      Ba0_att_allung = [#base_0.x-100*COSENO(CAM_Ang), 0, #base_0.z+100*SENO(CAM_Ang)]
      Ba3_att = [#base_3.x, 0, #base_3.z]
      Ba3_att_allung = [#base_3.x+100*COSENO(CAM_Ang), 0, #base_3.z-100*SENO(CAM_Ang)]

      Ba1_att = [#base_1.x, 0, #base_1.z]

      Bay_KFBX = #base_0.y
      Aly_KFBX = #alto_0.y
      X_KFBX = #X
      Y_KFBX = #Y

      //- punti dell'elemento  trovato
      SET_#(Fianchi_vic[iX])
      Ba0_fia = [#base_0.x, 0, #base_0.z]
      Ba1_fia = [#base_1.x, 0, #base_1.z]
      Ba2_fia = [#base_2.x, 0, #base_2.z]
      Ba3_fia = [#base_3.x, 0, #base_3.z]
      Bay_Fia = #base_0.y
      Aly_Fia = #alto_0.y

      // 16.05.2024 Come att 009424
      // Sempre stato 5, ma in quest caso c'è una maniglia gola con un PanLatFineCompo da 12
      // Quindi Battuta_X 29.01
      // 23.05.2024 NM002921 potrebbe esserci il Taglio45 e se non c'è MdF_offx_REL_ADD non lo trova
      //X_add_Limite = 5+6.01
      X_add_Limite = 5+10+6.01

      dist_02 = DISTANZA(Ba0_att, Ba2_fia)
      dist_31 = DISTANZA(Ba3_att, Ba1_fia)

      X_FiaVic = VAR_VAL(Fianchi_vic[iX], "X")
      Z_Fia = VAR_VAL(Fianchi_vic[iX], "Z")
      Y_Fia = VAR_VAL(Fianchi_vic[iX], "Y")
      CAM_AngFia = ANG_TOT2(Fianchi_vic[iX])

      if (dist_02 < dist_31)  { fia_Sx = 1 }
      else                    { fia_Dx = 1 }

      diff_BaFBaMy = Bay_Fia - Bay_KFBX
      diff_BaFAlMy = Bay_Fia - Aly_KFBX
      diff_AlMBaFy = Aly_KFBX - Bay_Fia

      // +60 -> Se sporge appena. Piu che altro dipendente dalla grafica dei pezzi
      // esempio su fianco Ponte fatto da 2 pezzi una parte sotto magari metallica e la
      // parte sopra legno.
      // In ogni caso se un fianco ha solo 60mm in Y di battuta non può esser il fianco di battuta
      //diff_BaMAlFy = base_0.y - Aly_Fia
      diff_BaMAlFy = Bay_KFBX - Aly_Fia + 60
      // 27.01.2025
      if (Y_KFBX < 129)
         {
          diff_BaMAlFy = Bay_KFBX - Aly_Fia + 39
          if (Y_KFBX < 99)
             { diff_BaMAlFy = Bay_KFBX - Aly_Fia + 30 }
         }

      if (ABS(diff_BaFAlMy) < 10  |  ABS(diff_AlMBaFy) < 10)  { EXITSUB() }

      if (diff_BaMAlFy > 0)                                   { EXITSUB() }

     // 07.07.2023 Sc0122301986 MdF_ distNearBatFia 33.5 trova il pensile sopra che comunque avrbbe trovato anche con 10
      // solo che in questo caso il problema era che non calcolava lo SbordoYInf
      if (Bay_Fia-0.1 > Aly_KFBX)
         {
          if (Fianchi_vic > 1)
             {
              mdf_ErrBatt_FiaSupSx = Fianchi_vic[iX]
              EXITSUB()
             }
         }

      // Fianco inizia da sotto quindi tipo Ponte può andar bene ma non arriva a filo alto
      // Se fatalità metà Fianco parte sotto e arriva fino a metà dell' elemento che sta
      // verificando tale fianco, le condizioni precedenti non sono sufficienti
      mdf_FiaSxsfalsato = 0
      if (Bay_Fia+150 < Bay_KFBX  &  Aly_Fia+150 < Aly_KFBX)
         { mdf_FiaSxsfalsato = 1 }

      if (Bay_Fia-150 > Bay_KFBX  &  Aly_Fia-150 > Aly_KFBX)
         {
          mdf_FiaSxsfalsato = 2
          // 20.05.2020 anta inf colonna base_0_offset.y -165, ma anche cassettoInf H.536
          y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")
          if (y_Fro/3 > 150)
             {
              if (Bay_Fia-y_Fro/3 <= Bay_KFBX  &  Aly_Fia > Aly_KFBX)
                 { mdf_FiaSxsfalsato = -2 }
             }
         }

      if (Bay_Fia-150 > Bay_KFBX  &  Aly_Fia+150 < Aly_KFBX)
         {
          y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")
          // O significa che c'è un fianchetto in mezzo all' altezzaFrontale, improbabile
          // oppure, come nel caso riscontrato, con Load_pers, la colonna si sta ancora configurando
          // e quindi vengono presi gli elementi non posizionati,dimensionati correttamente
          if (Bay_Fia-y_Fro/3 > Bay_KFBX  &  Aly_Fia+y_Fro/3 < Aly_KFBX)
             {
              if (ABS(diff_BaFAlMy) > y_Fro/3  &  ABS(diff_AlMBaFy) > y_Fro/3)  { EXITSUB() }
             }
         }

      // E' possibile esempio Armadio con 2 Ante in larghezza quindi centralmente non c'è niente
      // a parte un fianchetto cassettiera
      // 21.11.2016
      //if (Bay_Fia+2 >= Bay_KFBX  &  Aly_Fia-2 <= Aly_KFBX)
      if (Bay_Fia+2 >= Bay_KFBX  &  Aly_Fia-3 <= Aly_KFBX)
         {
          diff_AlMAlFy = Aly_KFBX - Aly_Fia
          y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")
         // Non ha senso uno sbordo di più di metaFrontale, perché l'anta sarebbe sbilanciata, significa che non è il fianco corretto da considerare
         // 03.02.2017 ma solo se l' anta sta in basso, altrimenti potrei essere un' anta mansardata
          if (Bay_KFBX < 1000)
             {
              if (ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/2+1)
                 {
                  // 30.01.2019
                  mdf_ctrl_dFBS = mdf_idx_KFBX
                  GOSUB MdF_Ctrl_doppioFia_Battuta_SX
                  if (mdf_doppio_fiaSx_inY_Battuta_X <= -1)
                     { EXITSUB() }
                 }
             }
          else
             {
              // 08.04.2019 C84331
              if ( ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/2+1
                 & ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) < y_Fro-50
                 )
                 {
                  mdf_ctrl_dFBS = mdf_idx_KFBX
                  GOSUB MdF_Ctrl_doppioFia_Battuta_SX
                 }
             // 28.03.2025 A33574 Anta 1194, Fianco sotto 720, Fianco sopra 480. Deve trovare il fianco in basso come doppio fianco
              if ( ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/3-30
                 // 118 limite per farci stare una cerniera sarebbe 107, ma non ha senso impegnare un vano cosi piccolo per metterci anche la cerniera/basetta che occupa spazio.
                 // Se uno fa 2 scocche H.120 e anta unica non è apposto, ma comunque entrerebbe nel y_Fro/2
                 & ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) < y_Fro-118
                 & Fianchi_vic > 1
                 )
                 {
                  // Non servirebbe questa if ma la tengo
                  if (mdf_doppio_fiaSx_inY_Battuta_X == -1)
                     {
                      mdf_ctrl_dFBS = mdf_idx_KFBX
                      GOSUB MdF_Ctrl_doppioFia_Battuta_SX
                     }
                 }

              if (ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/2+y_Fro/20)
                 {
                  // 26.03.2019
                  mdf_ctrl_dFBS = mdf_idx_KFBX
                  GOSUB MdF_Ctrl_doppioFia_Battuta_SX
                  if (mdf_doppio_fiaSx_inY_Battuta_X <= -1)
                     { EXITSUB() }
                 }
             }
         }

      if (mdf_FiaSxsfalsato > 0
         // Conttrollo che comunque non sia l' unico Fianco trovato perché magari c'è
         // una composizione Parete particolare e fatalità potrebbe rientrare in questa situazione
         & Fianchi_vic > 1
         )
         {
          mdf_sporgente = 0
          if (Fianchi_vic >= 2)
             {
              alty_Sc = VAR_VAL(PADRE(mdf_idx_KFBX, -1), "alto_0.y")
              basy_Sc = VAR_VAL(PADRE(mdf_idx_KFBX, -1), "base_0.y")
              if (Aly_KFBX-8 > alty_Sc)
                 {
                  mdf_sporgente = 1
                 }
              if (Bay_KFBX+8 < basy_Sc)
                 {
                  mdf_sporgente = 2
                 }
              if (mdf_FiaSxsfalsato == 2)  { mdf_doppio_fiaSx_inY = Fianchi_vic[iX] }
              // 28.10.2020
              if (Aly_Fia-90 > Bay_KFBX)
                 {
                  y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")
                  mdf_ctrl_dFBS = mdf_idx_KFBX
                  GOSUB MdF_Ctrl_doppioFia_Battuta_SX
                 }
             }
          if (mdf_sporgente == 0)
             { EXITSUB() }
         }

      if (fia_Sx)
         {
          mdf_Battuta_SX_att = mdf_Battuta_SX

          Ba2_fia_MdF = [#base_2.x, 0, #base_2.z]
          mdf_Battuta_SX_dist = DISTANZA(Ba0_att, Ba2_fia_MdF)
          PointInterf_Sx = INTERFERISCI(Ba2_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
          // Bifacciale
          if (ABS(CAM_Ang-CAM_AngFia) == 180)
             {
              PointInterf_Sx = INTERFERISCI(Ba0_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
             }
          if (PointInterf_Sx.x>-1000001 & PointInterf_Sx.y>-1000001 & PointInterf_Sx.z>-1000001)
             {
              dist_0Pro_sx = DISTANZA(Ba0_att, PointInterf_Sx)
              dist_3Pro_dx = DISTANZA(Ba3_att, PointInterf_Sx)

              Proiez_fia_Sx = 0
              Proiez_fia_Dx = 0
              if (dist_0Pro_sx < dist_3Pro_dx)  { Proiez_fia_Sx = 1 }
              else                              { Proiez_fia_Dx = 1 }

             // 20.05.2025 Ca2518151
              if (Proiez_fia_Dx)
                 {
                  if ( dist_0Pro_sx > 50
                     & dist_3Pro_dx > 50
                     )
                     {
                      _deb_Proiez_fia_Sx = 1
                      // Se in RegFacc uso sempre Battuta_X_Sx devo mantenere il lato corretto
                      // SE_NUM(MdF_Verso=="SX",Battuta_X_Sx,X-Battuta_X_Dx-12)
                      // MdF_Apertura FISSO
                      if (IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Verso"), "S*") )
                         {
                          // Vuol dire che il fianco è vicino al centro e probabilmente ne avrò 1 solo appunto al centro
                          // (può essere che trova piu di un Fianchi_vic perchè trova il figlio)
                          // Teoricamente questa if andrebbe tolta, ma per ora la tengo essendo il primo caso di sempre
                          // E forse nemmeno il controllo su MdF_Verso perchè comunque la Battuta_Sx è sempre da sinistra
                          // Anche se questa sarebbe piu una Battuta centrale e in altri Ambienti viene usata la Battuta centrale
                          if (dist_0Pro_sx-80 < dist_3Pro_dx)
                             {
                              _deb_Proiez_fia_Sx = 2
                              Proiez_fia_Sx = 1
                             }
                         }
                     }
                 }

              if ( dist_0Pro_sx < mdf_Battuta_X_DX_Pro_Cn
                 | mdf_Battuta_X_DX_Pro_Cn == 0
                 )
                 {
                  if (dist_0Pro_sx > 30)
                     {
                      X_FiaBatDX_Cn = VAR_VAL(Fianchi_vic[iX], "X")
                      mdf_Battuta_X_DX_Pro_Cn = dist_0Pro_sx - X_FiaBatDX_Cn +0.01
                      mdf_idx_FiaBatDX_CnSX = Fianchi_vic[iX]
                      // 25.09.2019
                      VAR_VALUE_SET(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn", mdf_Battuta_X_DX_Pro_Cn)
                     }
                 }

              if ( dist_3Pro_dx < X_KFBX-mdf_Battuta_X_SX_Pro_Cn
                 | mdf_Battuta_X_SX_Pro_Cn == 0
                 )
                 {
                  if (dist_3Pro_dx > 30)
                     {
                      mdf_Battuta_X_SX_Pro_Cn = dist_3Pro_dx +0.01
                      X_FiaBatSX_Cn = VAR_VAL(Fianchi_vic[iX], "X")
                      mdf_idx_FiaBatSX_CnSX = Fianchi_vic[iX]
                      // 25.09.2019
                      VAR_VALUE_SET(mdf_idx_KFBX, "mdf_Battuta_X_SX_Pro_Cn", mdf_Battuta_X_SX_Pro_Cn)
                     }
                 }

             // 04.03.2024 Sc1016058295
              mdf_find_SX_Cn = 0
              // Significa che ho 2 Fianchi centrali vicini a destra e entra quello piu esterno, oppure che trova piu Fianchi per via dei figli con nome archetipo Fia
              if ( dist_0Pro_sx < VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_SX_Pro_Cn")
                 & dist_0Pro_sx+50 < VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_SX_Pro_Cn")
                 )
                 {
                 // Per ora limitato e non come Sx perchè è il primo caso da 7 anni
                  if ( ABS(CAM_Ang-CAM_AngFia) == 180
                     | VAR_VAL(mdf_idx_KFBX, "exitBattuta_DX") == -1
                     )
                     {
                      dist_0Pro_sx_att = dist_0Pro_sx
                      mdf_Battuta_X_SX_Pro_Cn_debSX = VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_SX_Pro_Cn")
                      mdf_Battuta_X_DX_Pro_Cn_debSX = VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn")
                      mdf_idx_FiaBatSX_CnSX_att = VAR_VAL(mdf_idx_KFBX, "mdf_idx_FiaBatSX_CnSX")
                      mdf_find_SX_Cn = 2
                     // 04.09.2024 EM2024004901 La prima volta per forza non c'è exitBattuta_DX perchè deve ancora farla
                      if (VAR_VAL(mdf_idx_KFBX, "exitBattuta_DX") == -1)
                         {
                          if (ABS(CAM_Ang-CAM_AngFia) != 180)
                             {
                              mdf_Battuta_X_SX_Pro_Cn_preDX = VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_SX_Pro_Cn")
                             }
                         }
                     }
                 }

              if (mdf_find_SX_Cn > 0)
                 {
                  if (dist_0Pro_sx > 30)
                     {
                      if (dist_0Pro_sx < VAR_VAL(mdf_idx_KFBX,"X")/2-80)
                         {
                          mdf_Battuta_X_SX_Pro_Cn_deb2 = mdf_Battuta_X_SX_Pro_Cn
                          mdf_idx_FiaBatSX_CnSX_att = VAR_VAL(mdf_idx_KFBX, "mdf_idx_FiaBatSX_CnSX")
                          mdf_Battuta_X_SX_Pro_Cn = dist_0Pro_sx +0.01
                          mdf_idx_FiaBatSX_CnSX = Fianchi_vic[iX]
                          mdf_find_SX_Cn_att = mdf_find_SX_Cn
                          VAR_VALUE_SET(mdf_idx_KFBX, "mdf_Battuta_X_SX_Pro_Cn", mdf_Battuta_X_SX_Pro_Cn)
                         }
                     }
                 }
              // 04.03.2024 Sc1016058295
              if ( VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn") < VAR_VAL(mdf_idx_KFBX,"X")/2
                 & VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn")-1  < VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_SX_Pro_Cn")
                 & VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn")+31 > VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_SX_Pro_Cn")
                 & VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn") > 30
                 & VAR_VAL(mdf_idx_KFBX, "exitBattuta_DX") == -1
                 // Per ora limito a questo
                 & ABS(CAM_Ang-CAM_AngFia) == 180
                 )
                 {
                  X_FiaBatDX_Cn = VAR_VAL(Fianchi_vic[iX], "X")
                  mdf_Battuta_X_DX_Pro_Cn_attS = mdf_Battuta_X_DX_Pro_Cn
                  mdf_Battuta_X_DX_Pro_Cn_deb1S = mdf_Battuta_X_DX_Pro_Cn
                  dist_3Pro_dx_debS = dist_3Pro_dx
                  mdf_idx_FiaBatDX_CnSX = Fianchi_vic[iX]
                  mdf_Battuta_X_DX_Pro_Cn = dist_3Pro_dx +0.01
                  VAR_VALUE_SET(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn", mdf_Battuta_X_DX_Pro_Cn)
                 }

              if (Proiez_fia_Sx)
                 {
                  mdf_Battuta_X_Sx_Pro = dist_0Pro_sx +0.01

                  // Attenzione Ante interne ai fianchi
                  mdf_Battuta_SX_Pro = dist_0Pro_sx + 0.01

                  if (dist_3Pro_dx > X_KFBX)
                     {
                      mdf_Battuta_X_Sx_Pro = -1*mdf_Battuta_X_Sx_Pro
                      mdf_Battuta_SX_Pro = -1*mdf_Battuta_SX_Pro
                     }

                  // Attenzione angoli con anta interna
                  // ma anche per grafica anta sempre su angoli un po "a caso"
                  // Forse potrebbe anche entrare sempre se c'è l' interferisci
                  // ma proteggo per eventuali valori troppo grandi che non avrebbero senso
                  //if (ABS(mdf_Battuta_SX_Pro) <= #X+0.1)
                  if (ABS(mdf_Battuta_SX_Pro) <= X_FiaVic+X_add_Limite)
                     {
                      _debug_Pro_camang = CAM_Ang
                      _debug_Pro_camangfia = CAM_AngFia
                      _debug_Pro_fiaBatSx = Fianchi_vic[iX]

                      mdf_Sx_Pro_entra = 1
                      if ( ABS(mdf_Battuta_SX_Pro) < ABS(mdf_Battuta_SX)
                         & mdf_Battuta_SX_Pro < 0
                         & ABS(mdf_Battuta_SX) <= #X+0.01
                         )
                         {
                          mdf_Sx_Pro_entra = -0.01
                         }

                      // 28.07.2020 preso da DX per Ce34363 e' presente una SchAttrez_Lamin che fa da Fianco e viene sentito il
                      // Fianco vicino che però parte 93mm piu in alto creado cosi uno SbordoYInf
                      if ( mdf_Battuta_SX == 0
                         & mdf_Battuta_SX_Pro < 0
                         & ABS(mdf_Battuta_SX_Pro) < 2
                         )
                         {
                          mdf_antTerm = 0
                          if ( ABS(CAM_Ang-CAM_AngFia) > 15
                             & ABS(CAM_Ang-CAM_AngFia) < 75
                             )
                             { mdf_antTerm = 1 }

                          mdf_antaInterna = 0
                          if (ABS(CAM_Ang-CAM_AngFia) == 0)
                             {
                              mdf_dist_12 = DISTANZA(Ba1_att, Ba2_fia)
                              mdf_dist_02 = DISTANZA(Ba0_att, Ba2_fia)
                              if (mdf_dist_12 < mdf_dist_02)
                                 {
                                  // Se c'e piu di 1.5 significa che non e' il mio fianco di Battuta interna, probabilmente non e' della mia scocca
                                  if (ABS(mdf_Battuta_SX_Pro) < 1.5)  { mdf_antaInterna = 1 }
                                  if (PADRE(mdf_idx_KFBX, -1) == PADRE(Fianchi_vic[iX], -1))
                                     { mdf_antaInterna = 1.1 }
                                 }
                              // interna ma circa a meta rispetto allo spigolo fianco
                              if ( mdf_dist_12 < 15  &  mdf_dist_02 < 15
                                 & mdf_dist_12 > 5   &  mdf_dist_02 > 5
                                 )
                                 { mdf_antaInterna = 2 }

                              mdf_dist_01 = DISTANZA(Ba0_att, Ba1_fia)
                              if ( mdf_dist_02 == dist_0Pro_sx
                                 & mdf_dist_12 > X_FiaVic/2
                                 & mdf_dist_12 <= X_FiaVic-mdf_dist_02
                                 )
                                 { mdf_antaInterna = 3 }

                              // 04.12.2020
                              mdf_anp = 0
                              if (mdf_dist_12 < 2  &  mdf_dist_02 > 18  &   X_FiaVic > 100)  { mdf_anp = 1 }
                              if (mdf_dist_12 < 2  &  mdf_dist_02 > 18  &   X_FiaVic > 100)  { mdf_anp = 2 }
                              if (mdf_anp > 0)  { mdf_antaInterna = 0 }
                             }

                          if (mdf_antTerm == 0  &  mdf_antaInterna == 0)
                             { mdf_Sx_Pro_entra = -0.02 }
                         }

                      // Se ho gia trovato la battuta su un fianco e ne trovo
                      // un altro deve vincere quello piu vicino
                      // 22.04.2016 possibile baco al primo giro con Fiancone
                      if (mdf_fiaBatSx_Gen > -1)
                         {
                          //fiaBatSx = VAR_VAL(mdf_idx_KFBX, "fiaBatSx")
                          fiaBatSx = mdf_fiaBatSx_Gen
                          //DISPLAY2(STRCAT("mdf_idx_KFBX=", STR(mdf_idx_KFBX), " fiaBatSx=", STR(fiaBatSx), "mdf_Battuta_SX=", STR(mdf_Battuta_SX), " mdf_Battuta_SX_Pro=", STR(mdf_Battuta_SX_Pro)))

                          if (IS_IDX(fiaBatSx) )
                             {
                              if ( ABS(mdf_Battuta_SX_Pro) < ABS(mdf_Battuta_SX)
                                 & mdf_Battuta_SX_Pro < 0
                                 )
                                 {
                                  if (X_FiaBatSX > 1)
                                     {
                                      // 2 Fianchi di elementi diversi, quindi fianchi
                                      // con X diversa, la if sopra ABS(mdf_Battuta_SX) <= #X+0.01
                                      // potrebbe fallire
                                      if ( ABS(mdf_Battuta_SX) <= X_FiaBatSX+0.01
                                         & #X + 1 < X_FiaBatSX
                                         )
                                         {
                                          mdf_Sx_Pro_entra = -0.03
                                          _deb_X_FiaSx_entra_X = #X
                                          _deb_mdf_Battuta_SX_entra_X = mdf_Battuta_SX
                                         }
                                     }
                                 }
                              // 20.11.2023 H23000089_LIVINGROOM18 Ante a ELLE parte Sx piu grande parte Dx
                              // 2 Fianchi di elementi diversi con X diversa, uno sopra l' altro, ma non e' un doppio fianco di Battuta. Lo sente perchè l' ingombro a ELLE prende tutta la Y sia a dx che sx
                              if ( mdf_Battuta_SX_Pro+1 < mdf_Battuta_SX
                                 & mdf_Battuta_SX_Pro > X_FiaBatSX/2-1
                                 & mdf_Battuta_SX > X_FiaBatSX/2
                                 & X_FiaBatSX > 5
                                 & X_FiaVic + 1 < X_FiaBatSX
                                 // Visto che e' il primo caso lo limito
                                 & PADRE(Fianchi_vic[iX], -1) != PADRE(fiaBatSx, -1)
                                 & PADRE(fiaBatSx, -1) == PADRE(mdf_idx_KFBX, -1)
                                 )
                                 {
                                  mdf_Sx_Pro_entra = -0.041
                                  _deb_X_FiaSx_entra_X = X_FiaVic
                                  _deb_mdf_Battuta_SX_entra_X = mdf_Battuta_SX
                                 }

                             // 03.06.2024 A 68413 come DX
                              if ( mdf_Battuta_SX_Pro+1 < mdf_Battuta_SX
                                 & mdf_Battuta_SX_Pro > X_FiaBatSX/2
                                 & mdf_Battuta_SX > X_FiaBatSX/2
                                 & X_FiaBatSX > 5
                                 & X_FiaVic <= X_FiaBatSX
                                 & PADRE(Fianchi_vic[iX], -1) != PADRE(fiaBatSx, -1)
                                 & PADRE(fiaBatSx, -1) == PADRE(mdf_idx_KFBX, -1)
                                 )
                                 {
                                  mdf_Sx_Pro_entra = -0.042
                                  _deb_X_FiaSx_entra_X = X_FiaVic
                                  _deb_mdf_Battuta_SX_entra_X = mdf_Battuta_SX
                                 }

                             // 11.07.2024 A050222 come DX
                              if ( mdf_Battuta_SX_Pro+1 < mdf_Battuta_SX
                                 & mdf_Battuta_SX_Pro > X_FiaBatSX/2-3
                                 & mdf_Battuta_SX_Pro < X_FiaBatSX/2+1
                                 & mdf_Battuta_SX > X_FiaBatSX/2
                                 & X_FiaBatSX > 5
                                 & X_FiaVic <= X_FiaBatSX
                                 & mdf_Battuta_SX < X_FiaBatSX
                                 & PADRE(Fianchi_vic[iX], -1) != PADRE(fiaBatSx, -1)
                                 & PADRE(fiaBatSx, -1) == PADRE(mdf_idx_KFBX, -1)
                                 )
                                 {
                                  mdf_Sx_Pro_entra = -0.043
                                  _deb_X_FiaSx_entra_X = X_FiaVic
                                  _deb_mdf_Battuta_SX_entra_X = mdf_Battuta_SX
                                 }

                              // 24.05.2016
                              if ( ABS(mdf_Battuta_SX_Pro) >= ABS(mdf_Battuta_SX)
                                 & ABS(mdf_Battuta_SX_Pro)-1.01 <= ABS(mdf_Battuta_SX)
                                 )
                                 {
                                  if (X_FiaBatSX > 1)
                                     {
                                      // Ho gia trovato un fianco e ne trovo un altro con una battuta
                                      // molto simile ma sfalsato, quindi con un eventuale sbordo, situazione impossibile
                                      // Puo capitare solo in Load_pers con OnInterat
                                      if (Bay_Fia-150 > Bay_KFBX  |  Aly_Fia+150 < Aly_KFBX)
                                         {
                                          mdf_Sx_Pro_entra = -0.031
                                          _deb_X_FiaSx_entra_X = #X
                                          _deb_mdf_Battuta_SX_entra_X = mdf_Battuta_SX
                                          mdf_doppio_fiaSx_inY = Fianchi_vic[iX]
                                         }
                                     }
                                 }

                              if ( ABS(mdf_Battuta_SX_Pro) > ABS(mdf_Battuta_SX)
                                 & mdf_Battuta_SX_Pro < 0
                                 & mdf_Battuta_SX > 1
                                 )
                                 {
                                  if ( X_FiaBatSX > 1
                                     & ABS(mdf_Battuta_SX_Pro) > X_FiaBatSX/2
                                     & ABS(mdf_Battuta_SX) < X_FiaBatSX/2
                                     )
                                     {
                                      mdf_Sx_Pro_entra = -0.04
                                      _deb_X_FiaSx_entra_X2 = #X
                                      _deb_mdf_Battuta_SX_entra_X2 = mdf_Battuta_SX
                                     }
                                  // 04.03.2020 come MdF_get_Battuta_SX
                                  if ( X_FiaBatSX > 1
                                     & ABS(mdf_Battuta_SX_Pro) > X_FiaBatSX+0.1
                                     & ABS(mdf_Battuta_SX) <= X_FiaBatSX+0.1
                                     & ABS(mdf_Battuta_SX) > X_FiaBatSX/2
                                     & mdf_Battuta_SX_Pro < -X_FiaBatSX/2
                                     )
                                     {
                                      mdf_Sx_Pro_entra = -0.05
                                      _deb_X_FiaSx_entra_distNear = #X
                                      _deb_mdf_Battuta_SX_entra_distNear = mdf_Battuta_SX
                                     }
                                 }

                              if ( ABS(mdf_Battuta_SX_Pro) > X_FiaVic-1
                                 & ABS(mdf_Battuta_SX) < X_FiaVic/2
                                 & ABS(mdf_Battuta_SX_Pro - mdf_Battuta_SX) < X_FiaVic+0.01
                                 )
                                 {
                                  // 23.11.2020 La24361
                                  if (ABS(mdf_Battuta_SX_Pro) > X_FiaVic+mdf_Battuta_SX+0.02)
                                     {
                                      mdf_Sx_Pro_entra = -0.06
                                      _deb_mdf_Battuta_SX_entra1 = mdf_Battuta_SX
                                      _deb_mdf_Battuta_SX_Pro_entra1 = mdf_Battuta_SX_Pro
                                      _deb_idx_Sx_Pro_entra1 = Fianchi_vic[iX]
                                     }
                                 }

                              if ( ABS(mdf_Battuta_SX_Pro) > X_FiaVic+0.02
                                 & ABS(mdf_Battuta_SX) < X_FiaVic/2
                                 )
                                 {
                                  // 23.11.2020 Come dx, caso La24361
                                  if (ABS(mdf_Battuta_SX_Pro) > X_FiaVic+mdf_Battuta_SX+0.02)
                                     {
                                      mdf_Sx_Pro_entra = -0.07
                                      _deb_X_Fia_entra2 = X_FiaVic
                                      _deb_mdf_Battuta_SX_Pro_entra2 = mdf_Battuta_SX_Pro
                                      _deb_idx_Sx_Pro_entra2 = Fianchi_vic[iX]
                                      // 20.05.2025 A079453 entra prima il fianco piu a destra e battuta è -1.50902
                                      // L' anta però sborda leggermente fuori al Fianco corretto
                                      if ( mdf_Battuta_SX < 0
                                         & mdf_Battuta_SX_Pro > X_FiaVic
                                         // Arrivo gia che ABS(mdf_Battuta_SX_Pro) <= X_FiaVic+X_add_Limite, quindi piuttosto di prendere Battuta negativa meglio positiva
                                         )
                                         {
                                          if (ABS(CAM_Ang-CAM_AngFia) < 1)
                                             {
                                              mdf_Sx_Pro_entra = 1.07
                                             }
                                         }
                                     }
                                 }

                              // 01.09.2020 Come DX
                              if ( ABS(mdf_Battuta_SX_Pro - mdf_Battuta_SX) <= X_FiaVic+0.1
                                 & mdf_Battuta_SX > X_FiaVic/2+1
                                 & mdf_Battuta_SX_Pro < X_FiaVic/2-1
                                 & mdf_Battuta_SX_Pro > 0
                                 )
                                 {
                                  mdf_Sx_Pro_entra = -0.08
                                  _deb_mdf_Battuta_SX_entra4 = mdf_Battuta_SX
                                  _deb_mdf_Battuta_SX_Pro_entra4 = mdf_Battuta_SX_Pro
                                  _deb_idx_Sx_Pro_entra4 = Fianchi_vic[iX]
                                 }

                             // 23.03.2023 La03678
                              mdf_offx_REL_ADD_att = VAR_VAL(mdf_idx_KFBX, "MdF_offx_REL_ADD")
                              if (IS_MATCH(NOME(mdf_idx_KFBX), "MdF*") )
                                 {
                                  if (mdf_offx_REL_ADD_att == 0)
                                     {
                                      mdf_offx_REL_ADD_att = VAR_VAL(PADRE(mdf_idx_KFBX, 1), "MdF_offx_REL_ADD")
                                     }
                                 }

                              // 01.09.2020 Come DX
                              if ( ABS(mdf_Battuta_SX_Pro - mdf_Battuta_SX) <= X_FiaVic+0.1+2.5+mdf_offx_REL_ADD_att
                                 & mdf_Battuta_SX > X_FiaVic/2+1
                                 & mdf_Battuta_SX_Pro < 1
                                // 23.03.2023 La03678
                                 //& mdf_Battuta_SX_Pro >= 0
                                 & mdf_Battuta_SX_Pro >= -1.6
                                 )
                                 {
                                  mdf_Sx_Pro_entra = -0.09
                                  _deb_mdf_Battuta_SX_entra5 = mdf_Battuta_SX
                                  _deb_mdf_Battuta_SX_Pro_entra5 = mdf_Battuta_SX_Pro
                                  _deb_idx_Sx_Pro_entra5 = Fianchi_vic[iX]
                                 }
                             // 06.03.2018
                              cam_ang_Fro = ANG_TOT(mdf_idx_KFBX)
                              cam_ang_Fia = ANG_TOT(Fianchi_vic[iX])
                              cam_case_angFroFia = 0
                              if (ABS(cam_ang_Fro-cam_ang_Fia) > 15  &  ABS(cam_ang_Fro-cam_ang_Fia) < 75)
                                 { cam_case_angFroFia = 1 }
                             // 27.11.2019
                              if (cam_ang_Fro < -180  &  cam_ang_Fia > 0)
                                 {
                                  if (ABS(cam_ang_Fia+cam_ang_Fro) > 15  &  ABS(cam_ang_Fia+cam_ang_Fro) < 75)
                                     { cam_case_angFroFia = 2 }

                                  // MO0189254 angolo tra Fia e Fro 135, non ha senso
                                  if (ABS(cam_ang_Fia+cam_ang_Fro) > 105  &  ABS(cam_ang_Fia+cam_ang_Fro) < 165)
                                     {
                                      cam_case_angFroFia = 3
                                      if ( ABS(mdf_Battuta_SX_Pro) > VAR_VAL(mdf_fiaBatSx_Gen, "X")/2
                                         & mdf_Battuta_SX < -1
                                         & ABS(mdf_Battuta_SX) < ABS(mdf_Battuta_SX_Pro)
                                         & ABS(mdf_Battuta_SX) < VAR_VAL(mdf_fiaBatSx_Gen, "X")
                                         )
                                         {
                                          if (dist_3Pro_dx > X_KFBX*ABS(SENO(CAM_Ang-CAM_AngFia)) )
                                             {
                                              mdf_Sx_Pro_entra = -2.1
                                              _debSx_dist_3Pro_dx = dist_3Pro_dx
                                              _debSx_seno_X = X_KFBX*ABS(SENO(CAM_Ang-CAM_AngFia))
                                             }
                                         }
                                     }
                                 }

                              if (cam_case_angFroFia > 0)
                                 {
                                  if ( ABS(mdf_Battuta_SX_Pro) > VAR_VAL(mdf_fiaBatSx_Gen, "X")
                                     & mdf_Battuta_SX < -1
                                     & ABS(mdf_Battuta_SX) < ABS(mdf_Battuta_SX_Pro)
                                     & ABS(mdf_Battuta_SX) < VAR_VAL(mdf_fiaBatSx_Gen, "X")
                                     )
                                     {
                                      if ( dist_3Pro_dx > X_KFBX*ABS(SENO(CAM_Ang-CAM_AngFia))
                                         & ABS(mdf_Battuta_SX_Pro) > mdf_distNearBatFia+3
                                         )
                                         {
                                          mdf_Sx_Pro_entra = -2
                                          _deb_X_Fia_entraAng = #X
                                          _deb_mdf_Battuta_SX_Pro_entraAng = mdf_Battuta_SX_Pro
                                          _deb_idx_Sx_Pro_entraAng = Fianchi_vic[iX]
                                         }
                                     }
                                 }

                             // 15.07.2016
                              if ( ABS(mdf_Battuta_SX_Pro) < ABS(mdf_Battuta_SX)
                                 & mdf_Battuta_SX_Pro > 0  &  mdf_Battuta_SX_Pro < 1
                                 )
                                 {
                                  if (Y_Fia+50 < VAR_VAL(fiaBatSx, "Y") )
                                     {
                                      // 27.03.2019  LTEX000041
                                      mdf_Battuta_Sx_equivoco = 0
                                      if (mdf_Battuta_SX < -#X-0.5)
                                         { mdf_Battuta_Sx_equivoco = 1 }

                                      if (mdf_Battuta_Sx_equivoco == 0)
                                         {
                                          mdf_Sx_Pro_entra = 0
                                          _deb_Y_Fia_entra = #Y
                                         }
                                     }
                                 }
                              // 16.05.2019 H19019537 vedi DX
                              // In pratica, come ingombri, fianchi sovrapposti in y
                              if (ABS(mdf_Battuta_SX_Pro) == ABS(mdf_Battuta_SX) )
                                 {
                                  mdf_basy_FroSx = VAR_VAL(mdf_idx_KFBX, "base_0.y")
                                  mdf_alty_FroSx = VAR_VAL(mdf_idx_KFBX, "alto_0.y")
                                  mdf_basy_fiaBatSx = VAR_VAL(fiaBatSx, "base_0.y")
                                  mdf_alty_fiaBatSx = VAR_VAL(fiaBatSx, "alto_0.y")
                                  mdf_basyFia_ctrl_Sx = VAR_VAL(Fianchi_vic[iX], "base_0.y")
                                  mdf_altyFia_ctrl_Sx = VAR_VAL(Fianchi_vic[iX], "alto_0.y")

                                  //DISPLAY2(STRCAT("fiaBatSx ", STR(fiaBatSx), " Fianchi_vic[iX]=", STR(Fianchi_vic[iX])))
                                  if ( mdf_basy_fiaBatSx+200 > mdf_basy_FroSx
                                     & mdf_alty_fiaBatSx-200 < mdf_alty_FroSx
                                     & mdf_alty_fiaBatSx+200 > mdf_alty_FroSx
                                     & mdf_basy_fiaBatSx-200 > mdf_basyFia_ctrl_Sx
                                     )
                                     {
                                      if (mdf_basyFia_ctrl_Sx+200 < mdf_basy_FroSx)
                                         {
                                          // 13.04.2023 Sc1023019579 positivo contro negativa ma fatalita uguali per ricerca MdF_ distNearBatFia 33.5
                                          if (mdf_Battuta_SX_Pro <= mdf_Battuta_SX)
                                             {
                                              mdf_Sx_Pro_entra = -3
                                              _deb_mdf_Battuta_SX_Pro_sovrap_sfals = mdf_Battuta_SX_Pro
                                              _deb_idx_Sx_Pro_entra_sovrap_sfals = Fianchi_vic[iX]
                                             }
                                         }
                                     }
                                 }
                             }
                          // 06.11.2019 1018047858 Fia base accanto leggermente sovraposta
                          if ( mdf_Battuta_SX > mdf_Battuta_SX_Pro
                             & mdf_Battuta_SX <= VAR_VAL(mdf_fiaBatSx_Gen, "X")+0.1
                             & mdf_Battuta_SX > VAR_VAL(mdf_fiaBatSx_Gen, "X")/2
                             & ABS(mdf_Battuta_SX_Pro) < 1.1
                             & mdf_Battuta_SX_Pro > 0
                             )
                             { mdf_Sx_Pro_entra = -4 }

                          // 07.08.2020 Sc54880 Graf*Fia* vetro 5mm, simile a procedura non-globlale
                          if ( mdf_Battuta_SX > VAR_VAL(mdf_fiaBatSx_Gen, "X")/2
                             & mdf_Battuta_SX < VAR_VAL(mdf_fiaBatSx_Gen, "X")
                             & mdf_Battuta_SX_Pro > 1
                             & mdf_Battuta_SX_Pro < mdf_Battuta_SX/2
                             & mdf_Battuta_SX_Pro < X_FiaVic/2
                             )
                             { mdf_Sx_Pro_entra = -5 }

                            // 15.07.2022 St270954 Pens anta diag sente i 2 fianchi a sinistra che non sono a tutta altezza e quindi trovava uno SbordoYInf
                            if ( mdf_Battuta_SX_Pro < 0
                               & mdf_Battuta_SX > X_FiaVic
                               & mdf_Battuta_SX < X_FiaVic+4
                               )
                               {
                                if (ABS(cam_ang_Fro-cam_ang_Fia) > 30  &  ABS(cam_ang_Fro-cam_ang_Fia) < 60)
                                   { mdf_Sx_Pro_entra = -5.1 }
                               }
                         }

                      // Problema sweep figlio di Fiancone
                      // Non può esistere una Battuta>mdf_distNearBatFia+40
                      // Con lo sweep il near_globale lo trova, ma i calcoli non vanno bene con uno sweep
                      if (ABS(mdf_Battuta_SX_Pro) > mdf_distNearBatFia+40)
                         {
                          _debug_fiaBatSx_sweep = Fianchi_vic[iX]
                          mdf_Sx_Pro_entra = -1
                          //DISPLAY2(STRCAT("mdf_idx_KFBX=", STR(mdf_idx_KFBX), " _debug_fiaBatSx_sweep X_FiaBatSX=", STR(X_FiaBatSX), " idx=", STR(Fianchi_vic[iX])))
                         }
                     // 23.11.2023 AOCL162757 capita in fase di caricamento ordine, ma non puo essere anche perche la X Fiancone poi la vedo a 18.
                      // La Battuta mdf_Battuta_SX_Pro semmai doveva essere negativa -1.5
                      // sente la ScoccaT_BaseFianco (Fiancone) 30.51 > 10+15
                      if ( ABS(mdf_Battuta_SX_Pro) > mdf_distNearBatFia+15
                         & ABS(mdf_Battuta_SX_Pro) > mdf_Battuta_SX
                         & mdf_Battuta_SX > 10
                         & mdf_Battuta_SX < mdf_distNearBatFia+15
                         )
                         {
                          _debug_fiaBatSx_Fiancone = Fianchi_vic[iX]
                          mdf_Sx_Pro_entra = -1.1
                         }

                     // 24.11.2023 Ce004158 Se trova la Battuta da mdf_proseg_BattSxDist e poi arriva il Fianco piu esterno
                      // con Battuta_X -1.5 sopra ABS(mdf_Battuta_SX) <= #X+0.01 fallisce perchè mdf_distNearBatFia e' stata
                      // impostata con valore maggiore di X_Fia
                      // Capita se mdf_distNearBatFia > 20
                      // Con Battuta_X_Sx < 2 poi rientrava in MdF_KeyFam_Battuta_X impostando mdf_ctrl_Fia_VaRi=1
                      // e quindi ritentava di calcolare la Battuta_X ma comunque senza successo
                      if ( mdf_Battuta_SX_Pro < 0
                         & mdf_Battuta_SX > mdf_distNearBatFia-10
                         & mdf_Battuta_SX < mdf_distNearBatFia+5
                         // Cosi so che entra qui se non e' gia entrato negli altri controlli
                         & mdf_Sx_Pro_entra > 0
                         )
                         {
                          _debug_fiaBatSx_FiaVic = Fianchi_vic[iX]
                          mdf_Sx_Pro_entra = -1.2
                         }

                     // 16.03.2022 Anta che sporge sotto ma di sostituzione con Fianco Scocca Sost che non sporge sotto come il fianco attivo della Scocca vicina
                      if (STRCMP(VAR_VAL_STR(PADRE(Fianchi_vic[iX], -1), "ORD_SOSTP"), "1") == 0)
                         {
                          if ( STRCMP(VAR_VAL_STR(Fianchi_vic[iX], "ORD_SOST"), "0") == 0
                             | STRCMP(VAR_VAL_STR(Fianchi_vic[iX], "ORD_SOST"), "") == 0
                             )
                             {
                              if (Fianchi_vic > 2)
                                 {
                                 // 06.06.2022 S049859, Sc0322019595 contro EM1052473
                                  if (IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura"), "SX*") )
                                     {
                                      // 29.07.2022 Sc1021159019
                                      //if ( VAR_VAL(mdf_idx_KFBX, "Y") > 500
                                      if ( VAR_VAL(mdf_idx_KFBX, "Y") > 800
                                         & VAR_VAL(mdf_idx_KFBX, "base_0.y") < 250
                                         )
                                         { mdf_Sx_Pro_entra = -6 }
                                     }
                                  }
                             }
                         }

                      if ( mdf_Battuta_SX == 0
                         | mdf_Sx_Pro_entra > 0
                         )
                         {
                          // 28.07.2020 Ce34363 e' presente una SchAttrez_Lamin che fa da Fianco e viene sentito il
                          // Fianco vicino che però parte 93mm piu in alto creado cosi uno SbordoYInf
                          mdf_Battuta_SX_OK = 1
                          if ( mdf_Battuta_SX == 0
                             & mdf_Sx_Pro_entra < 0
                             & ABS(mdf_Battuta_SX_Pro) < 2
                             & mdf_Battuta_SX_Pro < 0
                             )
                             {
                              // 04.02.2021 Per ora e' puntuale. In pratica in H mi dicono che puo esserci una Battuta di -1.5 o -2
                              // quindi il caso di Ce34363 devo rivederlo. Si risolverebbe mettendo SchAttrez_Lamin come MCB_archetipo_Fia_2 o 3
                              NEAR_GLOBALE("SchFia_vic", mdf_idx_KFBX, 3, 1, "SchAttr*")
                              miSc = 1
                              mSch_Fia = 0
                              while (miSc <= SchFia_vic)
                                 {
                                  mbasySF = VAR_VAL(SchFia_vic[miSc], "base_0.y")
                                  maltySF = VAR_VAL(SchFia_vic[miSc], "alto_0.y")

                                  mbasy_at = VAR_VAL(mdf_idx_KFBX, "base_0.y")
                                  malty_at = VAR_VAL(mdf_idx_KFBX, "alto_0.y")

                                  if ( mbasySF-20 < mbasy_at
                                     & maltySF+20 > malty_at
                                     )
                                     { mSch_Fia = 1 }

                                  miSc = miSc+1
                                 }
                              if (mSch_Fia == 1)  { mdf_Battuta_SX_OK = 0 }
                             }

                          // 06.08.2020 come proc non globale
                          // mdf_distNearBatFia 28.1 per trovare fianco Gola, ma grafica colonna errata senza fianco, trova il Fianco della Colonna accanto
                          // 18.07.2023
                          //if (mdf_Battuta_SX_Pro < -1*(X_FiaVic+1.5))
                          if (mdf_Battuta_SX_Pro < -1*(X_FiaVic-1.6))
                             { mdf_Battuta_SX_OK = mdf_Battuta_SX_Pro }

                         // 21.02.2022
                          if ( mdf_Battuta_SX_Pro+6 > X_FiaVic/2
                             & mdf_Battuta_SX_Pro-6 < X_FiaVic/2
                             )
                             {
                              if ( ABS(VAR_VAL(mdf_idx_KFBX, "MdF_angoloBas")) > 89
                                 & ABS(VAR_VAL(mdf_idx_KFBX, "MdF_angoloBas")) < 91
                                 )
                                 {
                                  mdf_idxFiaSx_ctrl = Fianchi_vic[iX]
                                  mdfxfro = VAR_VAL(mdf_idx_KFBX, "X")
                                  // MdF_distNearBatFia è a 11.05
                                  // Tramezza o Divisorio attrezzatura interna
                                  // 12.12.2023 da 130 a 99
                                  if (mdfxfro+99 < VAR_VAL(PADRE(mdf_idxFiaSx_ctrl, 2), "X") )
                                     {
                                      NEAR_GLOBALE("mdf_TramDiv", mdf_idx_KFBX, 9.5, 1, NOME(mdf_idxFiaSx_ctrl))
                                      if (mdf_TramDiv == 0)
                                         { mdf_Battuta_SX_OK = -999 }
                                     }
                                 }
                             }

                         // 25.02.2022
                          if (mdf_Sx_Pro_entra == -0.02)
                             {
                              mbasyF = VAR_VAL(Fianchi_vic[iX], "base_0.y")
                              maltyF = VAR_VAL(Fianchi_vic[iX], "alto_0.y")

                              mbasyatt = VAR_VAL(mdf_idx_KFBX, "base_0.y")
                              maltyatt = VAR_VAL(mdf_idx_KFBX, "alto_0.y")

                              if ( mbasyF-80 > mbasyatt
                                 & maltyF+80 < maltyatt
                                 )
                                 { mdf_Battuta_SX_OK = mdf_Sx_Pro_entra }
                             }

                          // 16.10.2024 PK2024OVB646900 come non Gen
                          // 30.10.2024 M012978 Cabina, anta Diagonale Battuta_X -11
                          if (ABS(CAM_Ang-CAM_AngFia) < 1)
                             {
                              // 08.04.2025 H25011841
                              //if (mdf_Battuta_SX_Pro <= -2)  { mdf_Battuta_SX_OK = -222 }
                              if (mdf_Battuta_SX_Pro <= -2.5)  { mdf_Battuta_SX_OK = -222 }
                             }

                          if (mdf_Battuta_SX_OK > 0)
                             {
                              _debug_camang = CAM_Ang
                              _debug_camangfia = CAM_AngFia
                              _debug_fiaBatSx = Fianchi_vic[iX]
                              mdf_fiaBatSx_Gen = Fianchi_vic[iX]
                              X_FiaBatSX = VAR_VAL(Fianchi_vic[iX], "X")

                              forma = FORMA(Fianchi_vic[iX])
                              mdf_Battuta_SX = mdf_Battuta_SX_Pro
                              //DISPLAY2(STRCAT("mdf_idx_KFBX=", STR(mdf_idx_KFBX), " forma=", STR(forma), " idx=", STR(Fianchi_vic[iX]), " ", STR(X_FiaBatSX), " mdf_Battuta_SX=",STR(mdf_Battuta_SX)))
                              // 24.05.2019 per Ferramente, vedi 21.03.2019
                              if ( ABS(Battuta_X_Sx) > mdf_Battuta_SX
                                 // 20.07.2020 Sn001820, Ca1851074, Ca1823076
                                 //& ABS(Battuta_X_Sx) > 30
                                 & ABS(Battuta_X_Sx) > X_FiaBatSX+1
                                 )
                                 {
                                  Battuta_X_Sx = mdf_Battuta_SX
                                  mdf_Battuta_X = mdf_Battuta_SX
                                 }
                             // 20.01.2025 Come non Gen
                              if ( Battuta_X_Sx == 0
                                 & mdf_Battuta_SX < X_FiaBatSX+1
                                 & mdf_Battuta_SX > 1
                                 )
                                 {
                                  Battuta_X_Sx = mdf_Battuta_SX
                                 }
                             // 24.11.2021 ScEM2021007619 MdF_distNearBatFia 33.5 in caso di Fia gola, quindi pensile meno profonodo in z trova anche
                              // il Fianco colonna vicino piu profondo. Per sfiga la Battuta_X e' uguale ma negativa.
                              // Nella procedura non globale trova prima il fianco corretto e poi scarta quello con battuta negativa entrando
                              // in mdf_Sx_Pro_entra = -3
                              // mentre qui trova prima l' altro fianco ed entra con mdf_Battuta_SX_OK=1 ma non entra qui sopra per
                              // reimpostare la Battuta_X
                              if (ABS(Battuta_X_Sx) == ABS(mdf_Battuta_SX) )
                                 {
                                  if ( mdf_Battuta_SX > 10
                                     & Battuta_X_Sx < 10
                                     )
                                     {
                                      Battuta_X_Sx = mdf_Battuta_SX
                                      mdf_Battuta_X = mdf_Battuta_SX
                                     }
                                 }
                             }

                         // 28.10.2016
                          PointInterf_Sx_Z = INTERFERISCI(Ba1_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
                          // Bifacciale
                          if (ABS(CAM_Ang-CAM_AngFia) == 180)
                             {
                              PointInterf_Sx_Z = INTERFERISCI(Ba3_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
                              // 02.03.2020
                              dist_3Pro_sx_Z_180 = DISTANZA(Ba3_fia, PointInterf_Sx_Z)
                             // 20.07.2023
                              if (dist_3Pro_sx_Z_180 < 40  &  dist_3Pro_sx_Z_180 > 0)  { Battuta_Z_Sx = dist_3Pro_sx_Z_180 }
                              if (dist_3Pro_sx_Z_180 < 3   &  dist_3Pro_sx_Z_180 > 0)  { Battuta_Z    = dist_3Pro_sx_Z_180 }
                             }
                          if (PointInterf_Sx_Z.x>-1000001 & PointInterf_Sx_Z.y>-1000001 & PointInterf_Sx_Z.z>-1000001)
                             {
                              dist_1Pro_sx_Z = DISTANZA(Ba1_fia, PointInterf_Sx_Z)
                             // 20.07.2023
                              if (dist_1Pro_sx_Z < 40)  { Battuta_Z_Sx = dist_1Pro_sx_Z }

                              if (dist_1Pro_sx_Z < 3)
                                 {
                                  Battuta_Z = dist_1Pro_sx_Z
                                 }
                              else
                                 {
                                  // 19.01.2021
                                  // Fianchi ridotti con GolaVert
                                  if (IS_IDX(Fianchi_vic[iX]) )
                                     {
                                      mZF = VAR_VAL(Fianchi_vic[iX], "Z")
                                      mZFia = VAR_VAL(Fianchi_vic[iX], "ZFia")
                                      mZ_ori = VAR_VAL(Fianchi_vic[iX], "Z_ori")
                                      mORD_Z = VAR_VAL(Fianchi_vic[iX], "ORD_Z")

                                      mZfiaOrig_ToCtrl = mZFia
                                      if (mZfiaOrig_ToCtrl == 0)  { mZfiaOrig_ToCtrl = mZ_ori }
                                      if (mZfiaOrig_ToCtrl > 100)
                                         {
                                          mdiff_ZGola = mZfiaOrig_ToCtrl-mZF
                                         // 20.07.2023
                                          if (ABS(dist_1Pro_sx_Z-mdiff_ZGola) < 40)  { Battuta_Z_Sx = dist_1Pro_sx_Z-mdiff_ZGola }
                                          if (ABS(dist_1Pro_sx_Z-mdiff_ZGola) < 3)   { Battuta_Z    = dist_1Pro_sx_Z-mdiff_ZGola }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                  else
                     {
                      // 21.03.2019
                      // Anta Armadio non-battente che sporge di 55mm. Si vuole avere la BattutaX su Fianco
                      mdf_proseg_BattSxDist = -0.1
                      if ( ABS(mdf_Battuta_SX_Pro) < mdf_distNearBatFia+20
                         & ABS(mdf_Battuta_SX_Pro) > 35
                         & mdf_distNearBatFia > 40
                         )
                         { mdf_proseg_BattSxDist = 1 }

                      // 19.05.2021
                      if (VAR_VAL(mdf_idx_KFBX, "MdF_Battuta_X_SbordoX") >= 30)
                         { mdf_proseg_BattSxDist = 2 }

                      if (mdf_proseg_BattSxDist > 0)
                         {
                          // 08.01.2024 doppio Fianco sx. Esempio anta trapezio che prende piu scocche, ci sono FiaDx e FiaSx vicini di scocche diverse
                          mdf_proseg_BattSx_Trap = 0
                          if ( mdf_Battuta_SX > 50
                             & mdf_Battuta_SX_Pro > mdf_Battuta_SX
                             & mdf_Battuta_SX_Pro-30 < mdf_Battuta_SX
                             )
                             {
                              mdf_proseg_BattSx_Trap = 1
                             }

                          // 11.10.2023 A142585 Anta Pensile Cappa con Riempitivi ai lati senza fianchi. Se prima trovava i Fianchi dei pensili vicini
                          // con battuta negativa poi non entrava piu qui
                          //if (mdf_Battuta_SX == 0)
                          if ( mdf_Battuta_SX <= 0
                             | mdf_proseg_BattSx_Trap > 0
                             )
                             {
                              if (#X < 50)
                                 {
                                  mdf_proseg_BattSxDist = 0
                                  if ( IS_MATCH(MdF_Apertura, "S*") != 1
                                     & IS_MATCH(MdF_Apertura, "D*") != 1
                                     )
                                     { mdf_proseg_BattSxDist = 1 }

                                 // 19.05.2021
                                  if (VAR_VAL(mdf_idx_KFBX, "MdF_Battuta_X_SbordoX") >= 30)
                                     { mdf_proseg_BattSxDist = 2 }

                                 // 23.02.2024 Come Dx
                                  if (ABS(mdf_Battuta_SX_Pro) < mdf_distNearBatFia+5)
                                     {
                                      // Per ora limito, perchè altrimenti sarebbe una Battuta centrale.
                                      // Eventualmente impostare MdF_Battuta_X_SbordoX su VariabiliMdF cos entra nella riga sopra
                                      // 20.01.2025
                                      //if ( mdf_Battuta_SX_Pro < 60
                                      // 22.01.2025 PK2024OVB648129 Finche non fa casino aumento
                                      //if ( mdf_Battuta_SX_Pro < 70
                                      if ( mdf_Battuta_SX_Pro < 95
                                         // 16.12.2024 troppo negativa non ha senso, il Fianco non sta dietro all' anta
                                         & mdf_Battuta_SX_Pro > -40
                                         )
                                         { mdf_proseg_BattSxDist = 3 }
                                     }

                                  if (mdf_proseg_BattSxDist > 0)
                                     {
                                      _debug_fiaSxdistNear = Fianchi_vic[iX]
                                      mdf_fiaBatSx_Gen = Fianchi_vic[iX]
                                      SET_#(Fianchi_vic[iX])
                                      X_FiaBatSX = #X

                                      mdf_Battuta_SX = mdf_Battuta_SX_Pro
                                      mdf_Battuta_X = mdf_Battuta_SX
                                      mdf_Battuta_X_Sx = mdf_Battuta_SX

                                      PointInterf_Sx_Z = INTERFERISCI(Ba1_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
                                      // Bifacciale
                                      if (ABS(CAM_Ang-CAM_AngFia) == 180)
                                         {
                                          PointInterf_Sx_Z = INTERFERISCI(Ba3_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
                                          // 02.03.2020
                                          dist_3Pro_sx_Z_180 = DISTANZA(Ba3_fia, PointInterf_Sx_Z)
                                         // 20.07.2023
                                          if (dist_3Pro_sx_Z_180 < 40  &  dist_3Pro_sx_Z_180 > 0)  { Battuta_Z_Sx = dist_3Pro_sx_Z_180 }
                                          if (dist_3Pro_sx_Z_180 < 3   &  dist_3Pro_sx_Z_180 > 0)  { Battuta_Z    = dist_3Pro_sx_Z_180 }
                                         }
                                      if (PointInterf_Sx_Z.x>-1000001 & PointInterf_Sx_Z.y>-1000001 & PointInterf_Sx_Z.z>-1000001)
                                         {
                                          dist_1Pro_sx_Z = DISTANZA(Ba1_fia, PointInterf_Sx_Z)
                                          if (dist_1Pro_sx_Z < 40)  { Battuta_Z_Sx = dist_1Pro_sx_Z }
                                          if (dist_1Pro_sx_Z < 3)   { Battuta_Z    = dist_1Pro_sx_Z }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
              else
                 {
                  // 20.09.2019
                  // Fianco al centro. Si vuole avere la BattutaX su Fianco per le Ferramente
                  if ( ABS(mdf_Battuta_SX_dist) < mdf_distNearBatFia+70
                     & ABS(mdf_Battuta_SX_dist) > 35
                     & ABS(mdf_Battuta_SX_dist) > X_KFBX/2
                     & mdf_distNearBatFia > X_KFBX/4
                     )
                     {
                      if ( mdf_Battuta_SX == 0
                         & VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_SX_Pro_Cn") > 0
                         )
                         {
                          xfia = VAR_VAL(Fianchi_vic[iX], "X")
                          if (xfia < 50)
                             {
                              if ( IS_MATCH(MdF_Apertura, "S*") != 1
                                 & IS_MATCH(MdF_Apertura, "D*") != 1
                                 )
                                 {
                                  _debug_fiaSxdistNear = Fianchi_vic[iX]
                                  fiaBatSx = Fianchi_vic[iX]
                                  X_FiaBatSX = VAR_VAL(Fianchi_vic[iX], "X")

                                  mdf_Battuta_SX = mdf_Battuta_X_SX_Pro_Cn + X_FiaBatSX
                                  mdf_Battuta_X = mdf_Battuta_SX
                                  mdf_Battuta_X_Sx = mdf_Battuta_SX

                                  PointInterf_Sx_Z = INTERFERISCI(Ba1_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
                                  // Bifacciale
                                  if (ABS(CAM_Ang-CAM_AngFia) == 180)
                                     {
                                      PointInterf_Sx_Z = INTERFERISCI(Ba3_fia, CAM_AngFia+90, Ba3_att, Ba0_att_allung)
                                      // 02.03.2020
                                      dist_3Pro_sx_Z_180 = DISTANZA(Ba3_fia, PointInterf_Sx_Z)
                                      if (dist_3Pro_sx_Z_180 < 40  &  dist_3Pro_sx_Z_180 > 0)  { Battuta_Z_Sx = dist_3Pro_sx_Z_180 }
                                      if (dist_3Pro_sx_Z_180 < 3   &  dist_3Pro_sx_Z_180 > 0)  { Battuta_Z    = dist_3Pro_sx_Z_180 }
                                     }
                                  if (PointInterf_Sx_Z.x>-1000001 & PointInterf_Sx_Z.y>-1000001 & PointInterf_Sx_Z.z>-1000001)
                                     {
                                      dist_1Pro_sx_Z = DISTANZA(Ba1_fia, PointInterf_Sx_Z)
                                      if (dist_1Pro_sx_Z < 40)  { Battuta_Z_Sx = dist_1Pro_sx_Z }
                                      if (dist_1Pro_sx_Z < 3)   { Battuta_Z    = dist_1Pro_sx_Z }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
          else
             {
              if ( ABS(mdf_Battuta_SX_dist) < #X+2  &  mdf_Battuta_SX_dist != 0  &  mdf_Battuta_SX_dist > Battuta_SX
                 & mdf_Battuta_SX_dist < 90
                 // 25.05.2017
                 // grafica fianco vetro girato di 90gradi con X 585
                 & #X < 100
                 )
                 {
                 // 13.12.2018
                  dist_32 = DISTANZA(Ba3_att, Ba2_fia)
                  mdf_diff_ang = CAM_Ang+CAM_AngFia
                  mdf_fia_gir_err = -0.1

                  if (ABS(mdf_diff_ang-360) > 85  &  ABS(mdf_diff_ang-360) < 175)
                     {
                      if ( Battuta_SX > 9  &  Battuta_SX < 18.1
                         & mdf_Battuta_SX_dist > Battuta_SX
                         )
                         { mdf_fia_gir_err = idx_FiaSx_Ctrl_att }
                     }

                  // 08.04.2019 H007438
                  if (ABS(CAM_Ang-CAM_AngFia) > 85  &  ABS(CAM_Ang-CAM_AngFia) < 95)
                     {
                      if (mdf_Battuta_SX_dist > #X  &  Fianchi_vic > 1)
                         { mdf_fia_gir_err = idx_FiaSx_Ctrl_att }
                     }

                  if (mdf_fia_gir_err == -0.1)
                     {
                      _debug_dist_fiaBatSx = idx_FiaSx_Ctrl_att
                      mdf_Battuta_SX = mdf_Battuta_SX_dist
                     }
                 }
             }
         }

      if ( IS_MATCH(MdF_Apertura, "S*") == 1
         & mdf_Battuta_SX != 0
         )
         {
          //DISPLAY2(STRCAT("mdf_Battuta_X=", STR(mdf_Battuta_X), " mdf_Battuta_SX_att=", STR(mdf_Battuta_SX_att)))
          // Nel caso di Apertura dichiarata sinistra non deve controllare se
          // maggiore di mdf_Battuta_X che potrebbe essere la battuta destra
          //if ( mdf_Battuta_SX < #X+5  &  ABS(mdf_Battuta_SX) > ABS(mdf_Battuta_X)
          if ( mdf_Battuta_SX < X_FiaVic+X_add_Limite  &  ABS(mdf_Battuta_SX) > ABS(mdf_Battuta_SX_att)
             & ABS(mdf_Battuta_SX) < 50
             // 21.02.2024 A179338
             & ABS(CAM_Ang-CAM_AngFia) != 90
             )
             {
              _debug_AperSX_fiaBatSx = idx_FiaSx_Ctrl_att
              _debug_AperSX_BattutaSx = mdf_Battuta_SX
              mdf_Battuta_X = mdf_Battuta_SX
             }
          // 20.03.2019
          // Se per caso entra prima il fianco piu a sinistra che tra l' altro ha una X=22
          // e poi entra per il fianco corretto che ha X=25 trovandosi con la Battuta a -14.96
          // non entra piu nell' if precedente
          // Tra l' altro MdF_distNearBatFia in questo caso è > 10
          // -14.76  10.26  in questi casi per cosi dire ambigui o a meta strada, deve vincere il positivo
          if ( mdf_Battuta_SX > X_FiaVic/3+1  &  ABS(mdf_Battuta_SX) < ABS(mdf_Battuta_SX_att)
             & ABS(mdf_Battuta_SX) < X_FiaVic/2+1
             & mdf_Battuta_SX_att < -X_FiaVic/3-1
             )
             {
              _debug_AperSX_fiaSovrapp_oXdif = 1
              mdf_Battuta_X = mdf_Battuta_SX
             }

         // 27.03.2019  LTEX000041
          if (mdf_Battuta_SX_att < -X_FiaVic-1)
             {
              // Terminale Sx. Vedi anche mdf_Battuta_Sx_equivoco
              if (mdf_Battuta_SX > -0.5  &  mdf_Battuta_SX < X_FiaVic/2)
                 {
                  mdf_Battuta_X = mdf_Battuta_SX
                 }
             }
         }

      if (fia_Sx  |  fia_Dx == 0)
         {
          // Faccio l'Assegnazione di mdf_Battuta_X solo nel caso sono Apertura non-SX
          // così ce l'ho impostata lo stesso dato che può servire anche alla ferramente
          // di Frontali Battenti e dato che adesso il calcolo è comunque corretto
          if (IS_MATCH(MdF_Apertura, "S*") != 1)
             {
              if ( mdf_Battuta_SX < X_FiaVic+X_add_Limite  &  ABS(mdf_Battuta_SX) > ABS(mdf_Battuta_X)
                 & ABS(mdf_Battuta_SX) < 50
                 & mdf_Battuta_SX != 0
                 )
                 { mdf_Battuta_X = mdf_Battuta_SX }
             }

          if ( mdf_Battuta_SX < X_FiaVic+X_add_Limite  &  ABS(mdf_Battuta_SX) < 50  &  mdf_Battuta_SX != 0
             // 21.02.2024
             & ABS(CAM_Ang-CAM_AngFia) != 90
             )
             {
              if (ABS(mdf_Battuta_SX) >= ABS(mdf_Battuta_X) )
                 {
                  mdf_Battuta_X_Sx_idx = Fianchi_vic[iX]
                  mdf_Battuta_X_Sx = mdf_Battuta_SX
                 }
             }
         }
   }

   PROCEDURA MdF_get_Battuta_DX_Gen
   {
      CAM_Ang = ANG_TOT2(mdf_idx_KFBX)
      SET_#(mdf_idx_KFBX)
      Ba0_att = [#base_0.x, 0, #base_0.z]
      Ba0_att_allung = [#base_0.x-100*COSENO(CAM_Ang), 0, #base_0.z+100*SENO(CAM_Ang)]
      Ba3_att = [#base_3.x, 0, #base_3.z]
      Ba3_att_allung = [#base_3.x+100*COSENO(CAM_Ang), 0, #base_3.z-100*SENO(CAM_Ang)]

      Ba2_att = [#base_2.x, 0, #base_2.z]

      Bay_KFBX = #base_0.y
      Aly_KFBX = #alto_0.y
      X_KFBX = #X
      Y_KFBX = #Y

      //- punti dell'elemento  trovato
      SET_#(Fianchi_vic[iX])
      Ba1_fia = [#base_1.x, 0, #base_1.z]
      Ba2_fia = [#base_2.x, 0, #base_2.z]
      Ba3_fia = [#base_3.x, 0, #base_3.z]
      Bay_Fia = #base_0.y
      Aly_Fia = #alto_0.y

      dist_02 = DISTANZA(Ba0_att, Ba2_fia)
      dist_31 = DISTANZA(Ba3_att, Ba1_fia)

      X_FiaVic = VAR_VAL(Fianchi_vic[iX], "X")
      Z_Fia = VAR_VAL(Fianchi_vic[iX], "Z")
      Y_Fia = VAR_VAL(Fianchi_vic[iX], "Y")
      CAM_AngFia = ANG_TOT2(Fianchi_vic[iX])

      // 16.05.2024 Come att 009424
      // Sempre stato 5, ma in quest caso c'è una maniglia gola con un PanLatFineCompo da 12
      // Quindi Battuta_X 29.01
      // 23.05.2024 NM002921 potrebbe esserci il Taglio45 e se non c'è MdF_offx_REL_ADD non lo trova
      //X_add_Limite = 5+6.01
      X_add_Limite = 5+10+6.01

      if (dist_02 < dist_31)  { fia_Sx = 1 }
      else                    { fia_Dx = 1 }

      diff_BaFBaMy = Bay_Fia - Bay_KFBX
      diff_BaFAlMy = Bay_Fia - Aly_KFBX
      diff_AlMBaFy = Aly_KFBX - Bay_Fia

      // +60 -> Se sporge appena. Piu che altro dipendente dalla grafica dei pezzi
      // esempio su fianco Ponte fatto da 2 pezzi una parte sotto magari metallica e la
      // parte sopra legno.
      // In ogni caso se un fianco ha solo 60mm in Y di battuta non può esser il fianco di battuta
      //diff_BaMAlFy = base_0.y - Aly_Fia
      diff_BaMAlFy = Bay_KFBX - Aly_Fia + 60
      // 27.01.2025
      if (Y_KFBX < 129)
         {
          diff_BaMAlFy = Bay_KFBX - Aly_Fia + 39
          if (Y_KFBX < 99)
             { diff_BaMAlFy = Bay_KFBX - Aly_Fia + 30 }
         }

      if (ABS(diff_BaFAlMy) < 10  |  ABS(diff_AlMBaFy) < 10)  { EXITSUB() }
      if (diff_BaMAlFy > 0)                                   { EXITSUB() }

     // 07.07.2023 Sc0122301986 MdF_ distNearBatFia 33.5 trova il pensile sopra che comunque avrbbe trovato anche con 10
      // solo che in questo caso il problema era che non calcolava lo SbordoYInf
      if (Bay_Fia-0.1 > Aly_KFBX)
         {
          if (Fianchi_vic > 1)
             {
              mdf_ErrBatt_FiaSup = Fianchi_vic[iX]
              EXITSUB()
             }
         }

      // Fianco inizia da sotto quindi tipo Ponte può andar bene ma non arriva a filo alto
      // Se fatalità metà Fianco parte sotto e arriva fino a metà dell' elemento che sta
      // verificando tale fianco, le condizioni precedenti non sono sufficienti
      mdf_FiaDxsfalsato = 0
      if (Bay_Fia+150 < Bay_KFBX  &  Aly_Fia+150 < Aly_KFBX)
         { mdf_FiaDxsfalsato = 1 }

      if (Bay_Fia-150 > Bay_KFBX  &  Aly_Fia-150 > Aly_KFBX)
         {
          mdf_FiaDxsfalsato = 2
          // 20.05.2020 anta inf colonna base_0_offset.y -165, ma anche cassettoInf H.536
          y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")
          if (y_Fro/3 > 150)
             {
              if (Bay_Fia-y_Fro/3 <= Bay_KFBX  &  Aly_Fia > Aly_KFBX)
                 { mdf_FiaDxsfalsato = -2 }
             }
         }

     // 19.05.2016
      if (Bay_Fia-150 > Bay_KFBX  &  Aly_Fia+150 < Aly_KFBX)
         {
          y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")
          // O significa che c'è un fianchetto in mezzo all' altezzaFrontale, improbabile
          // oppure, come nel caso riscontrato, con Load_pers, la colonna si sta ancora configurando
          // e quindi vengono presi gli elementi non posizionati,dimensionati correttamente
          if (Bay_Fia-y_Fro/3 > Bay_KFBX  &  Aly_Fia+y_Fro/3 < Aly_KFBX)
             {
              if (ABS(diff_BaFAlMy) > y_Fro/3  &  ABS(diff_AlMBaFy) > y_Fro/3)  { EXITSUB() }
             }
         }
      // E' possibile esempio Armadio con 2 Ante in larghezza quindi centralmente non c'è niente
      // a parte un fianchetto cassettiera
      // 21.11.2016
      //if (Bay_Fia+2 >= Bay_KFBX  &  Aly_Fia-2 <= Aly_KFBX)
      if (Bay_Fia+2 >= Bay_KFBX  &  Aly_Fia-3 <= Aly_KFBX)
         {
          diff_AlMAlFy = Aly_KFBX - Aly_Fia
          y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")
         // Non ha senso uno sbordo di più di metaFrontale, perché l'anta sarebbe sbilanciata, significa che non è il fianco corretto da considerare
          // 21.11.2016
          //if (ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/2+y_Fro/25)  { EXITSUB() }
         // 03.02.2017 ma solo se l' anta sta in basso, altrimenti potrei essere un' anta mansardata
          if (Bay_KFBX < 1000)
             {
              if (ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/2+1)
                 {
                  // 30.01.2019
                  mdf_ctrl_dFBD = mdf_idx_KFBX
                  GOSUB MdF_Ctrl_doppioFia_Battuta_DX
                  if (mdf_doppio_fiaDx_inY_Battuta_X <= -1)
                     { EXITSUB() }
                 }
             }
          else
             {
              // 08.04.2019 C84331
              if ( ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/2+1
                 & ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) < y_Fro-50
                 )
                 {
                  mdf_ctrl_dFBD = mdf_idx_KFBX
                  GOSUB MdF_Ctrl_doppioFia_Battuta_DX
                 }
             // 28.03.2025 A33574 Anta 1194, Fianco sotto 720, Fianco sopra 480. Deve trovare il fianco in basso come doppio fianco
              if ( ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/3-30
                 // 118 Limite per farci stare una cerniera sarebbe 107, ma non ha senso impegnare un vano cosi piccolo per metterci anche la cerniera/basetta che occupa spazio.
                 // Se uno fa 2 scocche H.120 e anta unica non è apposto, ma comunque entrerebbe nel y_Fro/2
                 & ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) < y_Fro-118
                 & Fianchi_vic > 1
                 )
                 {
                  // Non servirebbe questa if ma la tengo
                  if (mdf_doppio_fiaDx_inY_Battuta_X == -1)
                     {
                      mdf_ctrl_dFBD = mdf_idx_KFBX
                      GOSUB MdF_Ctrl_doppioFia_Battuta_DX
                     }
                 }
              // 26.03.2019
              //if (ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/2+y_Fro/20)  { EXITSUB() }
              if (ABS(diff_BaFBaMy)+ABS(diff_AlMAlFy) > y_Fro/2+y_Fro/20)
                 {
                  mdf_ctrl_dFBD = mdf_idx_KFBX
                  GOSUB MdF_Ctrl_doppioFia_Battuta_DX
                  if (mdf_doppio_fiaDx_inY_Battuta_X <= -1)
                     { EXITSUB() }
                 }
             }
         }

      if (mdf_FiaDxsfalsato > 0
         // Conttrollo che comunque non sia l' unico Fianco trovato perché magari c'è
         // una composizione Parete particolare e fatalità potrebbe rientrare in questa situazione
         & Fianchi_vic > 1
         )
         {
          mdf_sporgente = 0
          if (Fianchi_vic >= 2)
             {
              // Attenzione che sto facendo riferimento ai punti del padre di -1 dell' MdF_
              // e non del padre del Fianco o del Fianco-stesso
              alty_Sc = VAR_VAL(PADRE(mdf_idx_KFBX, -1), "alto_0.y")
              basy_Sc = VAR_VAL(PADRE(mdf_idx_KFBX, -1), "base_0.y")
              if (Aly_KFBX-8 > alty_Sc)
                 {
                  mdf_sporgente = 1
                 }
              if (Bay_KFBX+8 < basy_Sc)
                 {
                  mdf_sporgente = 2
                 }
              if (mdf_FiaDxsfalsato == 2)  { mdf_doppio_fiaDx_inY = Fianchi_vic[iX] }
              // 28.10.2020
              if (Aly_Fia-90 > Bay_KFBX)
                 {
                  y_Fro = VAR_VAL(mdf_idx_KFBX, "Y")
                  mdf_ctrl_dFBD = mdf_idx_KFBX
                  GOSUB MdF_Ctrl_doppioFia_Battuta_DX
                 }
             }
          if (mdf_sporgente == 0)
             { EXITSUB() }
         }

      if (Bay_Fia-Y_KFBX/3+50 > Bay_KFBX  &  Aly_Fia+Y_KFBX/3-50 < Aly_KFBX)
         { mdf_FiaDxsfalsato = 3 }

      if (fia_Dx)
         {
          mdf_Battuta_DX_att = mdf_Battuta_DX

          Ba1_fia_MdF = [#base_1.x, 0, #base_1.z]
          mdf_Battuta_DX_dist = DISTANZA(Ba3_att, Ba1_fia_MdF)
          PointInterf_Pro = INTERFERISCI(Ba1_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
          // Bifacciale
          if (ABS(CAM_Ang-CAM_AngFia) == 180)
             {
              // Non devo cambiare i punti anta perché essendo girata di 180gradi mi va bene considerare
              // sempre Ba3_att_allung
              //PointInterf_Pro = INTERFERISCI(Ba3_fia, CAM_AngFia+90, Ba0_att_allung, Ba3_att)
              PointInterf_Pro = INTERFERISCI(Ba3_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
             }

          if (PointInterf_Pro.x>-1000001 & PointInterf_Pro.y>-1000001 & PointInterf_Pro.z>-1000001)
             {
              dist_0Pro_sx = DISTANZA(Ba0_att, PointInterf_Pro)
              dist_3Pro_dx = DISTANZA(Ba3_att, PointInterf_Pro)

              Proiez_fia_Sx = 0
              Proiez_fia_Dx = 0
              if (dist_0Pro_sx < dist_3Pro_dx)  { Proiez_fia_Sx = 1 }
              else                              { Proiez_fia_Dx = 1 }

             // 20.05.2025 Ca2518151
              if (Proiez_fia_Sx)
                 {
                  if ( dist_0Pro_sx > 50
                     & dist_3Pro_dx > 50
                     )
                     {
                      _deb_Proiez_fia_Dx = 1
                      // Se in RegFacc uso sempre Battuta_X_Sx devo mantenere il lato corretto
                      // SE_NUM(MdF_Verso=="SX",Battuta_X_Sx,X-Battuta_X_Dx-12)
                      // MdF_Apertura FISSO
                      if (IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Verso"), "D*") )
                         {
                          // Vuol dire che il fianco è vicino al centro e probabilmente ne avrò 1 solo appunto al centro
                          // (può essere che trova piu di un Fianchi_vic perchè trova il figlio)
                          // Teoricamente questa if andrebbe tolta, ma per ora la tengo essendo il primo caso di sempre
                          // E forse nemmeno il controllo su MdF_Verso perchè comunque la Battuta_Dx è sempre da destra
                          // Anche se questa sarebbe piu una Battuta centrale e in altri Ambienti viene usata la Battuta centrale
                          if (dist_0Pro_sx+80 > dist_3Pro_dx)
                             {
                              _deb_Proiez_fia_Dx = 2
                              Proiez_fia_Dx = 1
                             }
                         }
                     }
                 }

              if ( dist_0Pro_sx < mdf_Battuta_X_DX_Pro_Cn
                 | mdf_Battuta_X_DX_Pro_Cn == 0
                 )
                 {
                  if (dist_0Pro_sx > 30)
                     {
                      mdf_Battuta_X_DX_Pro_Cn = dist_0Pro_sx +0.01
                      X_FiaBatDX_Cn = VAR_VAL(Fianchi_vic[iX], "X")
                      mdf_idx_FiaBatDX_CnDX = Fianchi_vic[iX]
                      VAR_VALUE_SET(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn", mdf_Battuta_X_DX_Pro_Cn)
                     }
                 }

              if ( dist_3Pro_dx < X_KFBX-mdf_Battuta_X_SX_Pro_Cn
                 | mdf_Battuta_X_SX_Pro_Cn == 0
                 )
                 {
                  if (dist_3Pro_dx > 30)
                     {
                      X_FiaBatSX_Cn = VAR_VAL(Fianchi_vic[iX], "X")
                      mdf_Battuta_X_SX_Pro_Cn = X_KFBX-dist_3Pro_dx +0.01
                      mdf_idx_FiaBatSX_CnDX = Fianchi_vic[iX]
                      VAR_VALUE_SET(mdf_idx_KFBX, "mdf_Battuta_X_SX_Pro_Cn", mdf_Battuta_X_SX_Pro_Cn)
                     // 22.04.2025 Questa parte manca rispetto alla procedura MdF_get_Battuta_DX
                      // Sn009925
                      if ( dist_3Pro_dx < X_KFBX/2
                         & mdf_Battuta_X_DX_Pro_Cn == 0
                         )
                         {
                          mdf_Battuta_X_DX_Pro_Cn_deb1 = mdf_Battuta_X_DX_Pro_Cn
                          mdf_Battuta_X_DX_Pro_Cn = dist_3Pro_dx - X_FiaBatSX_Cn +0.01
                          VAR_VALUE_SET(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn", mdf_Battuta_X_DX_Pro_Cn)
                         }
                     }
                 }

             // 13.02.2024 Sc1021085007 FerGen Come attuale altrimenti con CAM_Visualize>0, CAM_CloseOpenTab>1 e MacroCAM MdF_CamMdFrontali sbaglia
              mdf_find_DX_Cn = 0
              // Significa che ho 2 Fianchi centrali
              if (VAR_EXIST(mdf_idx_KFBX, "mdf_idx_FiaBatDX_CnDX") != 1)             { mdf_find_DX_Cn = 1 }
              // Significa che ho 2 Fianchi centrali vicini a destra e entra quello piu esterno
              if ( dist_3Pro_dx < VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn")
                 & dist_3Pro_dx+50 < VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn")
                 )
                 {
                 // 28.02.2024 Sn000681 Non deve entrare per lo stesso fianco, altrimenti inverte la Battuta_X_Cn
                  if ( VAR_VAL(mdf_idx_KFBX, "mdf_idx_FiaBatDX_CnDX") != Fianchi_vic[iX]
                     // Vedi anche Sc1021085007 che invece deve entrare perche ante retro
                     | ABS(CAM_Ang-CAM_AngFia) == 180
                     | VAR_VAL(mdf_idx_KFBX, "exitBattuta_SX") == -1
                     )
                     {
                      dist_3Pro_dx_att = dist_3Pro_dx
                      mdf_Battuta_X_SX_Pro_Cn_debDX = VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_SX_Pro_Cn")
                      mdf_Battuta_X_DX_Pro_Cn_debDX = VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn")
                      mdf_idx_FiaBatDX_CnDX_att = VAR_VAL(mdf_idx_KFBX, "mdf_idx_FiaBatDX_CnDX")
                      if (dist_3Pro_dx != VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_SX_Pro_Cn") )
                         { mdf_find_DX_Cn = 2 }
                     }
                 }

              // Sn019224
              // Significa che ho 2 Fianchi centrali vicini a destra e entra quello piu interno
              if ( dist_3Pro_dx-50 < VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn")
                 & dist_3Pro_dx > VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn")
                 )
                 { mdf_find_DX_Cn = 3 }

              if (mdf_find_DX_Cn > 0)
                 {
                  if (dist_3Pro_dx > 30)
                     {
                      // Sembra funzionare anche senza il -80, ma per ora lo limito per non rischiare quando il Fianco e' molto vicino al centro che gia funziona
                      if (dist_3Pro_dx < VAR_VAL(mdf_idx_KFBX,"X")/2-80)
                         {
                          mdf_Battuta_X_DX_Pro_Cn_deb2_Gen = mdf_Battuta_X_DX_Pro_Cn
                          mdf_Battuta_X_DX_Pro_Cn = dist_3Pro_dx +0.01
                          mdf_idx_FiaBatDX_CnDX = Fianchi_vic[iX]
                          VAR_VALUE_SET(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn", mdf_Battuta_X_DX_Pro_Cn)
                          VAR_VALUE_SET(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn_deb2_Gen", mdf_Battuta_X_DX_Pro_Cn_deb2_Gen)
                         }
                     }
                 }

              if (Proiez_fia_Dx)
                 {
                  mdf_Battuta_X_Dx_Pro = dist_3Pro_dx +0.01

                  mdf_Battuta_DX_Pro = dist_3Pro_dx + 0.01

                  if (dist_0Pro_sx > X_KFBX)
                     {
                      mdf_Battuta_X_Dx_Pro = -1*mdf_Battuta_X_Dx_Pro
                      mdf_Battuta_DX_Pro = -1*mdf_Battuta_DX_Pro
                     }

                  if (ABS(mdf_Battuta_DX_Pro) <= X_FiaVic+X_add_Limite)
                     {
                      _debug_Pro_Dx_camang = CAM_Ang
                      _debug_Pro_Dx_camangfia = CAM_AngFia
                      _debug_Pro_fiaBatDx = Fianchi_vic[iX]

                      mdf_Dx_Pro_entra = 1
                      if ( ABS(mdf_Battuta_DX_Pro) < ABS(mdf_Battuta_DX)
                         & mdf_Battuta_DX_Pro < 0
                         & ABS(mdf_Battuta_DX) <= #X+0.01
                         )
                         {
                          mdf_Dx_Pro_entra = -0.01
                         }

                      // 22.02.2019
                      // Non ho ancora trovato niente, ma ho un fianco a destra
                      // esempio stanza a 1.7 gradi PensileAngolo con grafica fianchi ysweep_3p
                      // A sinistra l' anta a Libro non ha fianchi
                      // E' uscito adesso, perche' prima il cliente non avevano la
                      // gestione SbordoY e il problema e' uscito sui paracolpi
                      if ( mdf_Battuta_DX == 0
                         & mdf_Battuta_DX_Pro < 0
                         & ABS(mdf_Battuta_DX_Pro) < 2
                         )
                         {
                          // 27.03.2019
                          mdf_antTerm = 0
                          if ( ABS(CAM_Ang-CAM_AngFia) > 15
                             & ABS(CAM_Ang-CAM_AngFia) < 75
                             )
                             { mdf_antTerm = 1 }

                          // 05.04.2019
                          mdf_antaInterna = 0
                          if (ABS(CAM_Ang-CAM_AngFia) == 0)
                             {
                              mdf_dist_21 = DISTANZA(Ba2_att, Ba1_fia)
                              mdf_dist_31 = DISTANZA(Ba3_att, Ba1_fia)
                              if (mdf_dist_21 < mdf_dist_31)  { mdf_antaInterna = 1 }
                              // interna ma circa a meta rispetto allo spigolo fianco
                              if ( mdf_dist_21 < 15  &  mdf_dist_31 < 15
                                 & mdf_dist_21 > 5   &  mdf_dist_31 > 5
                                 )
                                 { mdf_antaInterna = 2 }

                              // 01.06.2020 Scn0931
                              mdf_dist_32 = DISTANZA(Ba3_att, Ba2_fia)
                              if ( mdf_dist_31 == dist_3Pro_dx
                                 & mdf_dist_21 > X_FiaVic/2
                                 & mdf_dist_21 <= X_FiaVic-mdf_dist_31
                                 )
                                 { mdf_antaInterna = 3 }

                              // 04.12.2020
                              mdf_anp = 0
                              if (mdf_dist_21 < 2  &  mdf_dist_31 > 18  &   X_FiaVic > 100)  { mdf_anp = 1 }
                              if (mdf_dist_31 < 2  &  mdf_dist_21 > 18  &   X_FiaVic > 100)  { mdf_anp = 2 }
                              if (mdf_anp > 0)  { mdf_antaInterna = 0 }
                             }

                          if (mdf_antTerm == 0  &  mdf_antaInterna == 0)
                             { mdf_Dx_Pro_entra = -0.02 }
                         }

                      // Se ho gia trovato la battuta su un fianco e ne trovo
                      // un altro deve vincere quello piu vicino
                      if (mdf_fiaBatDx_Gen > -1)
                         {
                          fiaBatDx = mdf_fiaBatDx_Gen
                          //DISPLAY2(STRCAT("mdf_idx_KFBX=", STR(mdf_idx_KFBX), " fiaBatDx=", STR(fiaBatDx), " mdf_Battuta_DX_Pro=", STR(mdf_Battuta_DX_Pro), " Fianchi_vic[iX]=", STR(Fianchi_vic[iX])))
                          if (IS_IDX(fiaBatDx) )
                             {
                              if ( ABS(mdf_Battuta_DX_Pro) < ABS(mdf_Battuta_DX)
                                 & mdf_Battuta_DX_Pro < 0
                                 )
                                 {
                                  if (X_FiaBatDX > 1)
                                     {
                                      // 2 Fianchi di elementi diversi, quindi fianchi
                                      // con X diversa, la if sopra ABS(mdf_Battuta_DX) <= #X+0.01
                                      // potrebbe fallire
                                      if ( ABS(mdf_Battuta_DX) <= X_FiaBatDX+0.01
                                         & #X + 1 < X_FiaBatDX
                                         )
                                         {
                                          mdf_Dx_Pro_entra = -0.03
                                          _deb_X_FiaDx_entra_X = #X
                                          _deb_mdf_Battuta_DX_entra_X = mdf_Battuta_DX
                                         }
                                     }
                                 }
                              // 20.11.2023 H23000089_LIVINGROOM18 Ante a ELLE parte Sx piu grande parte Dx
                              // 2 Fianchi di elementi diversi con X diversa, uno sopra l' altro, ma non e' un doppio fianco di Battuta. Lo sente perchè l' ingombro a ELLE prende tutta la Y sia a dx che sx
                              if ( mdf_Battuta_DX_Pro+1 < mdf_Battuta_DX
                                 & mdf_Battuta_DX_Pro > X_FiaBatDX/2-1
                                 & mdf_Battuta_DX > X_FiaBatDX/2
                                 & X_FiaBatDX > 5
                                 & X_FiaVic + 1 < X_FiaBatDX
                                 // Visto che e' il primo caso lo limito
                                 & PADRE(Fianchi_vic[iX], -1) != PADRE(fiaBatDx, -1)
                                 & PADRE(fiaBatDx, -1) == PADRE(mdf_idx_KFBX, -1)
                                 )
                                 {
                                  mdf_Dx_Pro_entra = -0.041
                                  _deb_X_FiaDx_entra_X = X_FiaVic
                                  _deb_mdf_Battuta_DX_entra_X = mdf_Battuta_DX
                                 }

                             // 03.06.2024 A 68413 Trova sbordiY con fianco pensile vicino sovrapposto di ben 14.97
                              if ( mdf_Battuta_DX_Pro+1 < mdf_Battuta_DX
                                 & mdf_Battuta_DX_Pro > X_FiaBatDX/2
                                 & mdf_Battuta_DX > X_FiaBatDX/2
                                 & X_FiaBatDX > 5
                                 & X_FiaVic <= X_FiaBatDX
                                 & PADRE(Fianchi_vic[iX], -1) != PADRE(fiaBatDx, -1)
                                 & PADRE(fiaBatDx, -1) == PADRE(mdf_idx_KFBX, -1)
                                 )
                                 {
                                  mdf_Dx_Pro_entra = -0.042
                                  _deb_X_FiaDx_entra_X = X_FiaVic
                                  _deb_mdf_Battuta_DX_entra_X = mdf_Battuta_DX
                                 }

                             // 11.07.2024 A050222 sormonto di 10mm
                              if ( mdf_Battuta_DX_Pro+1 < mdf_Battuta_DX
                                 & mdf_Battuta_DX_Pro > X_FiaBatDX/2-3
                                 & mdf_Battuta_DX_Pro < X_FiaBatDX/2+1
                                 & mdf_Battuta_DX > X_FiaBatDX/2
                                 & X_FiaBatDX > 5
                                 & X_FiaVic <= X_FiaBatDX
                                 & mdf_Battuta_DX < X_FiaBatDX
                                 & PADRE(Fianchi_vic[iX], -1) != PADRE(fiaBatDx, -1)
                                 & PADRE(fiaBatDx, -1) == PADRE(mdf_idx_KFBX, -1)
                                 )
                                 {
                                  mdf_Dx_Pro_entra = -0.043
                                  _deb_X_FiaDx_entra_X = X_FiaVic
                                  _deb_mdf_Battuta_DX_entra_X = mdf_Battuta_DX
                                 }

                              if ( ABS(mdf_Battuta_DX_Pro) >= ABS(mdf_Battuta_DX)
                                 & ABS(mdf_Battuta_DX_Pro)-1.01 <= ABS(mdf_Battuta_DX)
                                 )
                                 {
                                  if (X_FiaBatDX > 1)
                                     {
                                      // Ho gia trovato un fianco e ne trovo un altro con una battuta
                                      // molto simile ma sfalsato, quindi con un eventuale sbordo, situazione impossibile
                                      // Puo capitare solo in Load_pers con OnInterat
                                      if (Bay_Fia-150 > Bay_KFBX  |  Aly_Fia+150 < Aly_KFBX)
                                         {
                                          mdf_Dx_Pro_entra = -0.04
                                          _deb_X_FiaDx_entra_X = #X
                                          _deb_mdf_Battuta_DX_entra_X = mdf_Battuta_DX
                                         }
                                     }
                                 }

                              if ( ABS(mdf_Battuta_DX_Pro) > ABS(mdf_Battuta_DX)
                                 & mdf_Battuta_DX_Pro < 0
                                 & mdf_Battuta_DX > 1
                                 )
                                 {
                                  if ( X_FiaBatDX > 1
                                     & ABS(mdf_Battuta_DX_Pro) > X_FiaBatDX/2
                                     & ABS(mdf_Battuta_DX) < X_FiaBatDX/2
                                     )
                                     {
                                      mdf_Dx_Pro_entra = -0.05
                                      _deb_X_FiaDx_entra_X2 = #X
                                      _deb_mdf_Battuta_DX_entra_X2 = mdf_Battuta_DX
                                     }
                                  // 04.03.2020 come MdF_get_Battuta_DX
                                  if ( X_FiaBatDX > 1
                                     & ABS(mdf_Battuta_DX_Pro) > X_FiaBatDX+0.1
                                     & ABS(mdf_Battuta_DX) <= X_FiaBatDX+0.1
                                     & ABS(mdf_Battuta_DX) > X_FiaBatDX/2
                                     & mdf_Battuta_DX_Pro < -X_FiaBatDX/2
                                     )
                                     {
                                      mdf_Dx_Pro_entra = -0.06
                                      _deb_X_FiaDx_entra_distNear = #X
                                      _deb_mdf_Battuta_DX_entra_distNear = mdf_Battuta_DX
                                     }
                                 }

                              if ( ABS(mdf_Battuta_DX_Pro) > #X-1
                                 & ABS(mdf_Battuta_DX) < #X/2
                                 & ABS(mdf_Battuta_DX_Pro - mdf_Battuta_DX) < #X+0.01
                                 )
                                 {
                                  // 24.09.2018
                                  // Fianchi leggermente sovrapposti
                                  // Non poteva capitare. Ingombri un po' sbagliati lato Bdm, vedi base_0 diversa dagli altri punti
                                  mdf_Dx_sovrapp_legger = 0
                                  if ( ABS(mdf_Battuta_DX_Pro) <= X_FiaVic+0.011
                                     & ABS(mdf_Battuta_DX) < 2
                                     & mdf_Battuta_DX > 0
                                     )
                                     { mdf_Dx_sovrapp_legger = 1 }

                                  if (mdf_Dx_sovrapp_legger == 0
                                     // 03.09.2020 in funzione della modfica 01.09, se trova prima l' altro Fianco non entra piu sul finaco corretto
                                     & ABS(mdf_Battuta_DX_Pro) > X_FiaVic+mdf_Battuta_DX+0.02
                                     )
                                     {
                                      mdf_Dx_Pro_entra = -0.07
                                      _deb_mdf_Battuta_DX_entra1 = mdf_Battuta_DX
                                      _deb_mdf_Battuta_DX_Pro_entra1 = mdf_Battuta_DX_Pro
                                      _deb_idx_Dx_Pro_entra1 = Fianchi_vic[iX]
                                     }
                                 }
                              if ( ABS(mdf_Battuta_DX_Pro) > X_FiaVic+0.02
                                 & ABS(mdf_Battuta_DX) < X_FiaVic/2
                                 )
                                 {
                                  // 03.09.2020 in funzione della modfica 01.09, se trova prima l' altro Fianco non entra piu sul finaco corretto
                                  if (ABS(mdf_Battuta_DX_Pro) > X_FiaVic+mdf_Battuta_DX+0.02)
                                     {
                                      mdf_Dx_Pro_entra = -0.08
                                      _deb_X_Fia_entra2 = #X
                                      _deb_mdf_Battuta_DX_Pro_entra2 = mdf_Battuta_DX_Pro
                                      _deb_idx_Dx_Pro_entra2 = Fianchi_vic[iX]
                                      // 20.05.2025 A079453 entra prima il fianco piu a destra e battuta è -1.50902
                                      // L' anta però sborda leggermente fuori al Fianco corretto
                                      if ( mdf_Battuta_DX < 0
                                         & mdf_Battuta_DX_Pro > X_FiaVic
                                         // Arrivo gia che ABS(mdf_Battuta_DX_Pro) <= X_FiaVic+X_add_Limite, quindi piuttosto di prendere Battuta negativa meglio positiva
                                         )
                                         {
                                          if (ABS(CAM_Ang-CAM_AngFia) < 1)
                                             {
                                              mdf_Dx_Pro_entra = 1.08
                                             }
                                         }
                                     }
                                 }
                              // 24.11
                              if ( ABS(mdf_Battuta_DX_Pro - mdf_Battuta_DX) > X_FiaVic+0.1
                                 & mdf_Battuta_DX > X_FiaVic/2-1
                                 & mdf_Battuta_DX_Pro < 0
                                 )
                                 {
                                  mdf_Dx_Pro_entra = -0.09
                                  _deb_mdf_Battuta_DX_entra3 = mdf_Battuta_DX
                                  _deb_mdf_Battuta_DX_Pro_entra3 = mdf_Battuta_DX_Pro
                                  _deb_idx_Dx_Pro_entra3 = Fianchi_vic[iX]
                                 }
                              // 01.09.2020 Deve vincere quello piu interno. Qui giustamente e primo caso assoluto l' anta sporge leggermente di 1.5 sul fianco vicino
                              if ( ABS(mdf_Battuta_DX_Pro - mdf_Battuta_DX) <= X_FiaVic+0.1
                                 & mdf_Battuta_DX > X_FiaVic/2+1
                                 & mdf_Battuta_DX_Pro < X_FiaVic/2-1
                                 & mdf_Battuta_DX_Pro > 0
                                 )
                                 {
                                  mdf_Dx_Pro_entra = -0.011
                                  _deb_mdf_Battuta_DX_entra4 = mdf_Battuta_DX
                                  _deb_mdf_Battuta_DX_Pro_entra4 = mdf_Battuta_DX_Pro
                                  _deb_idx_Dx_Pro_entra4 = Fianchi_vic[iX]
                                 }
                              // 01.09.2020 Deve vincere quello piu interno. Qui giustamente e primo caso assoluto l' anta sporge leggermente di 1.5 sul fianco vicino
                              if ( ABS(mdf_Battuta_DX_Pro - mdf_Battuta_DX) <= X_FiaVic+0.1+2.5+VAR_VAL(mdf_idx_KFBX, "MdF_offx_REL_ADD")
                                 & mdf_Battuta_DX > X_FiaVic/2+1
                                 & mdf_Battuta_DX_Pro < 1
                                 & mdf_Battuta_DX_Pro >= 0
                                 )
                                 {
                                  mdf_Dx_Pro_entra = -0.012
                                  _deb_mdf_Battuta_DX_entra5 = mdf_Battuta_DX
                                  _deb_mdf_Battuta_DX_Pro_entra5 = mdf_Battuta_DX_Pro
                                  _deb_idx_Dx_Pro_entra5 = Fianchi_vic[iX]
                                 }
                             // 06.03.2018
                              cam_ang_Fro = ANG_TOT(mdf_idx_KFBX)
                              cam_ang_Fia = ANG_TOT(Fianchi_vic[iX])
                              if (ABS(cam_ang_Fro-cam_ang_Fia) > 15  &  ABS(cam_ang_Fro-cam_ang_Fia) < 75)
                                 {
                                  if ( ABS(mdf_Battuta_DX_Pro) > VAR_VAL(mdf_fiaBatDx_Gen, "X")
                                     & mdf_Battuta_DX < -1
                                     & ABS(mdf_Battuta_DX) < ABS(mdf_Battuta_DX_Pro)
                                     & ABS(mdf_Battuta_DX) < VAR_VAL(mdf_fiaBatDx_Gen, "X")
                                     )
                                     {
                                      if ( dist_0Pro_sx > X_KFBX*ABS(SENO(CAM_Ang-CAM_AngFia))
                                         & ABS(mdf_Battuta_DX_Pro) > mdf_distNearBatFia+3
                                         )
                                         {
                                          mdf_Dx_Pro_entra = -0.013
                                          _deb_X_Fia_entraAng = #X
                                          _deb_mdf_Battuta_DX_Pro_entraAng = mdf_Battuta_DX_Pro
                                          _deb_idx_Dx_Pro_entraAng = Fianchi_vic[iX]
                                         }
                                     }
                                 }

                              // 16.05.2019 H19019537 FiancoPonte a C ridotto per avere la C sotto,
                              // ma la Y totale FiancoPonte per la parte sopra in legno si sovrapponeva
                              // al vero fianco di Battuta ed essendo preso dopo veniva considerato questo
                              // In pratica, come ingombri, fianchi sovrapposti in y
                              if (ABS(mdf_Battuta_DX_Pro) == ABS(mdf_Battuta_DX) )
                                 {
                                  mdf_basy_FroDx = VAR_VAL(mdf_idx_KFBX, "base_0.y")
                                  mdf_alty_FroDx = VAR_VAL(mdf_idx_KFBX, "alto_0.y")
                                  mdf_basy_fiaBatDx = VAR_VAL(fiaBatDx, "base_0.y")
                                  mdf_alty_fiaBatDx = VAR_VAL(fiaBatDx, "alto_0.y")
                                  mdf_basyFia_ctrl_Dx = VAR_VAL(Fianchi_vic[iX], "base_0.y")
                                  mdf_altyFia_ctrl_Dx = VAR_VAL(Fianchi_vic[iX], "alto_0.y")

                                  //DISPLAY2(STRCAT("fiaBatDx ", STR(fiaBatDx), " Fianchi_vic[iX]=", STR(Fianchi_vic[iX])))
                                  // fiaBatDx         1768    2964
                                  // Fianchi_vic[iX]  552     3056
                                  // Fianchi_vic[iX]  0       2596
                                  // Fro              1713.5  2962.5
                                  if ( mdf_basy_fiaBatDx+200 > mdf_basy_FroDx
                                     & mdf_alty_fiaBatDx-200 < mdf_alty_FroDx
                                     & mdf_alty_fiaBatDx+200 > mdf_alty_FroDx
                                     & mdf_basy_fiaBatDx-200 > mdf_basyFia_ctrl_Dx
                                     )
                                     {
                                      if (mdf_basyFia_ctrl_Dx+200 < mdf_basy_FroDx)
                                         {
                                          // 13.04.2023 come Sx
                                          if (mdf_Battuta_DX_Pro <= mdf_Battuta_DX)
                                             {
                                              mdf_Dx_Pro_entra = -0.014
                                              _deb_mdf_Battuta_DX_Pro_sovrap_sfals = mdf_Battuta_DX_Pro
                                              _deb_idx_Dx_Pro_entra_sovrap_sfals = Fianchi_vic[iX]
                                             }
                                         }
                                     }
                                 }
                              // 02.12.2019 preso dalla locale MdF_get_Battuta_DX
                              // PCL01111 Composizione ang89.5
                              X_FiaDxToCtrl = VAR_VAL(fiaBatDx, "X")
                              if ( mdf_Battuta_DX > mdf_Battuta_DX_Pro
                                 & mdf_Battuta_DX <= X_FiaDxToCtrl+mdf_Battuta_DX_Pro+0.1
                                 & mdf_Battuta_DX > X_FiaDxToCtrl/2
                                 // 1019098450 pensii leggermente sovrapposti di 1.3
                                 & ABS(mdf_Battuta_DX_Pro) < 1.4
                                 & mdf_Battuta_DX_Pro > 0
                                 )
                                 { mdf_Dx_Pro_entra = -4 }

                              // 07.08.2020 Sc54880 Graf*Fia* vetro 5mm, simile a procedura non-globlale
                              if ( mdf_Battuta_DX > VAR_VAL(mdf_fiaBatDx_Gen, "X")/2
                                 & mdf_Battuta_DX < VAR_VAL(mdf_fiaBatDx_Gen, "X")
                                 & mdf_Battuta_DX_Pro > 1
                                 & mdf_Battuta_DX_Pro < mdf_Battuta_DX/2
                                 & mdf_Battuta_DX_Pro < X_FiaVic/2
                                 )
                                 { mdf_Dx_Pro_entra = -5 }

                             // 15.07.2022 come sx
                              if ( mdf_Battuta_DX_Pro < 0
                                 & mdf_Battuta_DX > X_FiaVic
                                 & mdf_Battuta_DX < X_FiaVic+4
                                 )
                                 {
                                  if (ABS(cam_ang_Fro-cam_ang_Fia) > 30  &  ABS(cam_ang_Fro-cam_ang_Fia) < 60)
                                     { mdf_Dx_Pro_entra = -5.1 }
                                 }
                             }
                         }

                      // Problema sweep figlio di Fiancone
                      // Non può esistere una Battuta>mdf_distNearBatFia+40
                      // Con lo sweep il near_globale lo trova, ma i calcoli non vanno bene con uno sweep
                      if (ABS(mdf_Battuta_DX_Pro) > mdf_distNearBatFia+40)
                         {
                          _debug_fiaBatDx_sweep = Fianchi_vic[iX]
                          mdf_Dx_Pro_entra = -1
                         }
                     // 23.11.2023 come Sx
                      if ( ABS(mdf_Battuta_DX_Pro) > mdf_distNearBatFia+15
                         & ABS(mdf_Battuta_DX_Pro) > mdf_Battuta_DX
                         & mdf_Battuta_DX > 10
                         & mdf_Battuta_DX < mdf_distNearBatFia+15
                         )
                         {
                          _debug_fiaBatDx_Fiancone = Fianchi_vic[iX]
                          mdf_Dx_Pro_entra = -1.1
                         }

                     // 24.11.2023 Come Sx Ce004158
                      if ( mdf_Battuta_DX_Pro < 0
                         & mdf_Battuta_DX > mdf_distNearBatFia-10
                         & mdf_Battuta_DX < mdf_distNearBatFia+5
                         // Cosi so che entra qui se non e' gia entrato negli altri controlli
                         & mdf_Dx_Pro_entra > 0
                         )
                         {
                          _debug_fiaBatDx_FiaVic = Fianchi_vic[iX]
                          mdf_Dx_Pro_entra = -1.2
                         }

                     // 16.03.2022 Anta che sporge sotto ma di sostituzione con Fianco Scocca Sost che non sporge sotto come il fianco attivo della Scocca vicina
                      if (STRCMP(VAR_VAL_STR(PADRE(Fianchi_vic[iX], -1), "ORD_SOSTP"), "1") == 0)
                         {
                          if ( STRCMP(VAR_VAL_STR(Fianchi_vic[iX], "ORD_SOST"), "0") == 0
                             | STRCMP(VAR_VAL_STR(Fianchi_vic[iX], "ORD_SOST"), "") == 0
                             )
                             {
                              if (Fianchi_vic > 2)
                                 {
                                 // 06.06.2022 S049859, Sc0322019595 contro EM1052473
                                  if (IS_MATCH(VAR_VAL_STR(mdf_idx_KFBX, "MdF_Apertura"), "DX*") )
                                     {
                                      // 29.07.2022 Sc1021159019
                                      //if ( VAR_VAL(mdf_idx_KFBX, "Y") > 500
                                      if ( VAR_VAL(mdf_idx_KFBX, "Y") > 800
                                         & VAR_VAL(mdf_idx_KFBX, "base_0.y") < 250
                                         )
                                         { mdf_Dx_Pro_entra = -6 }
                                     }
                                 }
                             }
                         }

                       //if (mdf_idx_KFBX == 480)  { DISPLAY2(STRCAT("mdf_Dx_Pro_entra=", STR(mdf_Dx_Pro_entra), " Fianchi_vic[iX]=", STR(Fianchi_vic[iX]))) }

                      if ( mdf_Battuta_DX == 0
                         | mdf_Dx_Pro_entra > 0
                         )
                         {
                          // 22.02.2019
                          mdf_Battuta_DX_OK = 1
                          if ( mdf_Battuta_DX == 0
                             & mdf_Dx_Pro_entra < 0
                             & ABS(mdf_Battuta_DX_Pro) < 2
                             & mdf_Battuta_DX_Pro < 0
                             )
                             {
                              // 04.02.2021 da SX
                              NEAR_GLOBALE("SchFia_vic", mdf_idx_KFBX, 3, 1, "SchAttr*")
                              miSc = 1
                              mSch_Fia = 0
                              while (miSc <= SchFia_vic)
                                 {
                                  mbasySF = VAR_VAL(SchFia_vic[miSc], "base_0.y")
                                  maltySF = VAR_VAL(SchFia_vic[miSc], "alto_0.y")

                                  mbasy_at = VAR_VAL(mdf_idx_KFBX, "base_0.y")
                                  malty_at = VAR_VAL(mdf_idx_KFBX, "alto_0.y")

                                  if ( mbasySF-20 < mbasy_at
                                     & maltySF+20 > malty_at
                                     )
                                     { mSch_Fia = 1 }

                                  miSc = miSc+1
                                 }
                              if (mSch_Fia == 1)  { mdf_Battuta_DX_OK = 0 }
                             }

                          // 06.08.2020 come proc non globale
                          // mdf_distNearBatFia 28.1 per trovare fianco Gola, ma grafica colonna errata senza fianco, trova il Fianco della Colonna accanto
                          // 18.07.2023
                          //if (mdf_Battuta_DX_Pro < -1*(X_FiaVic+1.5))
                          if (mdf_Battuta_DX_Pro < -1*(X_FiaVic-1.6))
                             { mdf_Battuta_DX_OK = mdf_Battuta_DX_Pro }

                         // 21.02.2022
                          if ( mdf_Battuta_DX_Pro+6 > X_FiaVic/2
                             & mdf_Battuta_DX_Pro-6 < X_FiaVic/2
                             )
                             {
                              if ( ABS(VAR_VAL(mdf_idx_KFBX, "MdF_angoloBas")) > 89
                                 & ABS(VAR_VAL(mdf_idx_KFBX, "MdF_angoloBas")) < 91
                                 )
                                 {
                                  mdf_idxFiaDx_ctrl = Fianchi_vic[iX]
                                  mdfxfro = VAR_VAL(mdf_idx_KFBX, "X")
                                  // MdF_distNearBatFia è a 11.05
                                  // Tramezza o Divisorio attrezzatura interna
                                  // 12.12.2023 da 130 a 99
                                  if (mdfxfro+99 < VAR_VAL(PADRE(mdf_idxFiaDx_ctrl, 2), "X") )
                                     {
                                      NEAR_GLOBALE("mdf_TramDiv", mdf_idx_KFBX, 9.5, 1, NOME(mdf_idxFiaDx_ctrl))
                                      if (mdf_TramDiv == 0)
                                         { mdf_Battuta_DX_OK = -999 }
                                     }
                                 }
                             }

                         // 25.02.2022
                          if (mdf_Dx_Pro_entra == -0.02)
                             {
                              mbasyF = VAR_VAL(Fianchi_vic[iX], "base_0.y")
                              maltyF = VAR_VAL(Fianchi_vic[iX], "alto_0.y")

                              mbasyatt = VAR_VAL(mdf_idx_KFBX, "base_0.y")
                              maltyatt = VAR_VAL(mdf_idx_KFBX, "alto_0.y")

                              if ( mbasyF-80 > mbasyatt
                                 & maltyF+80 < maltyatt
                                 )
                                 { mdf_Battuta_DX_OK = mdf_Dx_Pro_entra }
                             }

                          // 16.10.2024 PK2024OVB646900 come non Gen
                          // 30.10.2024 M012978 Cabina, anta Diagonale Battuta_X -11
                          if (ABS(CAM_Ang-CAM_AngFia) < 1)
                             {
                              // 08.04.2025 H25011841
                              //if (mdf_Battuta_DX_Pro <= -2)  { mdf_Battuta_DX_OK = -222 }
                              if (mdf_Battuta_DX_Pro <= -2.5)  { mdf_Battuta_DX_OK = -222 }
                             }

                          if (mdf_Battuta_DX_OK > 0)
                             {
                              _debug_Dx_camang = CAM_Ang
                              _debug_Dx_camangfia = CAM_AngFia
                              _debug_fiaBatDx = Fianchi_vic[iX]
                              mdf_fiaBatDx_Gen = Fianchi_vic[iX]

                              X_FiaBatDX = VAR_VAL(Fianchi_vic[iX], "X")
                              mdf_Battuta_DX = mdf_Battuta_DX_Pro
                              // 24.05.2019 per Ferramente, vedi 21.03.2019
                              if ( ABS(Battuta_X_Dx) > mdf_Battuta_DX
                                 // 20.07.2020 Sn001820, Ca1851074, Ca1823076
                                 //& ABS(Battuta_X_Dx) > 30
                                 & ABS(Battuta_X_Dx) > X_FiaBatDX+1
                                 )
                                 {
                                  Battuta_X_Dx = mdf_Battuta_DX
                                  mdf_Battuta_X = mdf_Battuta_DX
                                 }
                             // 20.01.2025 Come non Gen
                              if ( Battuta_X_Dx == 0
                                 & mdf_Battuta_DX < X_FiaBatDX+1
                                 & mdf_Battuta_DX > 1
                                 )
                                 {
                                  Battuta_X_Dx = mdf_Battuta_DX
                                 }
                             // 24.11.2021 come SX
                              if (ABS(Battuta_X_Dx) == ABS(mdf_Battuta_DX) )
                                 {
                                  if ( mdf_Battuta_DX > 10
                                     & Battuta_X_Dx < 10
                                     )
                                     {
                                      Battuta_X_Dx = mdf_Battuta_DX
                                      mdf_Battuta_X = mdf_Battuta_DX
                                     }
                                 }

                             // 28.10.2016
                              PointInterf_Pro_Dx_Z = INTERFERISCI(Ba2_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
                              // Bifacciale
                              if (ABS(CAM_Ang-CAM_AngFia) == 180)
                                 {
                                  // Non devo cambiare i punti anta perché essendo girata di 180gradi mi va bene considerare
                                  // sempre Ba3_att_allung
                                  PointInterf_Pro_Dx_Z = INTERFERISCI(Ba0_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
                                  // 02.03.2020
                                  dist_0Pro_dx_Z_180 = DISTANZA(Ba0_fia, PointInterf_Pro_Dx_Z)
                                  if (dist_0Pro_dx_Z_180 < 40  &  dist_0Pro_dx_Z_180 > 0)  { Battuta_Z_Dx = dist_0Pro_dx_Z_180 }
                                  if (dist_0Pro_dx_Z_180 < 3   &  dist_0Pro_dx_Z_180 > 0)  { Battuta_Z    = dist_0Pro_dx_Z_180 }
                                 }

                              if (PointInterf_Pro_Dx_Z.x>-1000001 & PointInterf_Pro_Dx_Z.y>-1000001 & PointInterf_Pro_Dx_Z.z>-1000001)
                                 {
                                  dist_2Pro_dx_Z = DISTANZA(Ba2_fia, PointInterf_Pro_Dx_Z)
                                  if (dist_2Pro_dx_Z < 40)  { Battuta_Z_Dx = dist_2Pro_dx_Z }
                                  if (dist_2Pro_dx_Z < 3)
                                     {
                                      if (Battuta_Z == 0)
                                         { Battuta_Z = dist_2Pro_dx_Z }
                                     }
                                  else
                                     {
                                      // 19.01.2021
                                      // Fianchi ridotti con GolaVert
                                      if (IS_IDX(Fianchi_vic[iX]) )
                                         {
                                          mZF = VAR_VAL(Fianchi_vic[iX], "Z")
                                          mZFia = VAR_VAL(Fianchi_vic[iX], "ZFia")
                                          mZ_ori = VAR_VAL(Fianchi_vic[iX], "Z_ori")
                                          mORD_Z = VAR_VAL(Fianchi_vic[iX], "ORD_Z")

                                          mZfiaOrig_ToCtrl = mZFia
                                          if (mZfiaOrig_ToCtrl == 0)  { mZfiaOrig_ToCtrl = mZ_ori }
                                          if (mZfiaOrig_ToCtrl > 100)
                                             {
                                              mdiff_ZGola = mZfiaOrig_ToCtrl-mZF
                                              if (ABS(dist_2Pro_dx_Z-mdiff_ZGola) < 40)  { Battuta_Z_Dx = dist_2Pro_dx_Z-mdiff_ZGola }
                                              if (ABS(dist_2Pro_dx_Z-mdiff_ZGola) < 3)   { Battuta_Z    = dist_2Pro_dx_Z-mdiff_ZGola }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                  else
                     {
                      // 21.03.2019
                      // Anta Armadio non-battente che sporge di 55mm. Si vuole avere la BattutaX su Fianco
                      mdf_proseg_BattDxDist = -0.1
                      if ( ABS(mdf_Battuta_DX_Pro) < mdf_distNearBatFia+20
                         & ABS(mdf_Battuta_DX_Pro) > 35
                         & mdf_distNearBatFia > 40
                         )
                         { mdf_proseg_BattDxDist = 1 }

                      // 19.05.2021
                      if (VAR_VAL(mdf_idx_KFBX, "MdF_Battuta_X_SbordoX") >= 30)
                         { mdf_proseg_BattDxDist = 2 }

                      if (mdf_proseg_BattDxDist > 0)
                         {
                          // 08.01.2024 Sn19224 doppio Fianco destro. Esempio anta trapezio che prende piu scocche, ci sono FiaSx e FiaDx vicini di scocche diverse
                          mdf_proseg_BattDx_Trap = 0
                          if ( mdf_Battuta_DX > 50
                             & mdf_Battuta_DX_Pro > mdf_Battuta_DX
                             & mdf_Battuta_DX_Pro-30 < mdf_Battuta_DX
                             )
                             {
                              mdf_proseg_BattDx_Trap = 1
                             }

                          // 11.10.2023 A142585 Anta Pensile Cappa con Riempitivi ai lati senza fianchi
                          //if (mdf_Battuta_DX == 0)
                          if ( mdf_Battuta_DX <= 0
                             | mdf_proseg_BattDx_Trap > 0
                             )
                             {
                              if (#X < 50)
                                 {
                                  mdf_proseg_BattDxDist = 0
                                  if ( IS_MATCH(MdF_Apertura, "S*") != 1
                                     & IS_MATCH(MdF_Apertura, "D*") != 1
                                     )
                                     { mdf_proseg_BattDxDist = 1 }

                                 // 19.05.2021
                                  if (VAR_VAL(mdf_idx_KFBX, "MdF_Battuta_X_SbordoX") >= 30)
                                     { mdf_proseg_BattDxDist = 2 }

                                 // 23.02.2024
                                  if (ABS(mdf_Battuta_DX_Pro) < mdf_distNearBatFia+5)
                                     {
                                      // Per ora limito, perchè altrimenti sarebbe una Battuta centrale.
                                      // Eventualmente impostare MdF_Battuta_X_SbordoX su VariabiliMdF cos entra nella riga sopra
                                      // 20.01.2025
                                      //if ( mdf_Battuta_DX_Pro < 60
                                      // 22.01.2025 PK2024OVB648129 Finche non fa casino aumento
                                      //if ( mdf_Battuta_DX_Pro < 70
                                      if ( mdf_Battuta_DX_Pro < 95
                                         // 16.12.2024
                                         & mdf_Battuta_DX_Pro > -40
                                         )
                                         { mdf_proseg_BattDxDist = 3 }
                                     }

                                  if (mdf_proseg_BattDxDist > 0)
                                     {
                                      _debug_fiaDxdistNear = Fianchi_vic[iX]
                                      mdf_fiaBatDx_Gen = Fianchi_vic[iX]
                                      X_FiaBatDX = VAR_VAL(Fianchi_vic[iX], "X")

                                      mdf_Battuta_DX = mdf_Battuta_DX_Pro
                                      mdf_Battuta_X = mdf_Battuta_DX
                                      mdf_Battuta_X_Dx = mdf_Battuta_DX

                                      PointInterf_Pro_Dx_Z = INTERFERISCI(Ba2_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
                                      // Bifacciale
                                      if (ABS(CAM_Ang-CAM_AngFia) == 180)
                                         {
                                          // Non devo cambiare i punti anta perché essendo girata di 180gradi mi va bene considerare
                                          // sempre Ba3_att_allung
                                          PointInterf_Pro_Dx_Z = INTERFERISCI(Ba0_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
                                          // 02.03.2020
                                          dist_0Pro_dx_Z_180 = DISTANZA(Ba0_fia, PointInterf_Pro_Dx_Z)
                                          if (dist_0Pro_dx_Z_180 < 40  &  dist_0Pro_dx_Z_180 > 0)  { Battuta_Z_Dx = dist_0Pro_dx_Z_180 }
                                          if (dist_0Pro_dx_Z_180 < 3   &  dist_0Pro_dx_Z_180 > 0)  { Battuta_Z    = dist_0Pro_dx_Z_180 }
                                         }

                                      if (PointInterf_Pro_Dx_Z.x>-1000001 & PointInterf_Pro_Dx_Z.y>-1000001 & PointInterf_Pro_Dx_Z.z>-1000001)
                                         {
                                          dist_2Pro_dx_Z = DISTANZA(Ba2_fia, PointInterf_Pro_Dx_Z)
                                          if (dist_2Pro_dx_Z < 40)  { Battuta_Z_Dx = dist_2Pro_dx_Z }

                                          if (dist_2Pro_dx_Z < 3)
                                             {
                                              if (Battuta_Z == 0)
                                                 { Battuta_Z = dist_2Pro_dx_Z }
                                             }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
              else
                 {
                  // 20.09.2019
                  // Fianco al centro. Si vuole avere la BattutaX su Fianco per le Ferramente
                  if ( ABS(mdf_Battuta_DX_dist) < mdf_distNearBatFia+70
                     & ABS(mdf_Battuta_DX_dist) > 35
                     & ABS(mdf_Battuta_DX_dist) > X_KFBX/2
                     & mdf_distNearBatFia > X_KFBX/4
                     )
                     {
                      if ( mdf_Battuta_DX == 0
                         & VAR_VAL(mdf_idx_KFBX, "mdf_Battuta_X_DX_Pro_Cn") > 0
                         )
                         {
                          xfia = VAR_VAL(Fianchi_vic[iX], "X")
                          if (xfia < 50)
                             {
                              if ( IS_MATCH(MdF_Apertura, "S*") != 1
                                 & IS_MATCH(MdF_Apertura, "D*") != 1
                                 )
                                 {
                                  _debug_fiaDxdistNear = Fianchi_vic[iX]
                                  fiaBatDx = Fianchi_vic[iX]
                                  X_FiaBatDX = VAR_VAL(Fianchi_vic[iX], "X")

                                  mdf_Battuta_DX = mdf_Battuta_X_DX_Pro_Cn + X_FiaBatDX
                                  mdf_Battuta_X = mdf_Battuta_DX
                                  mdf_Battuta_X_Dx = mdf_Battuta_DX

                                  PointInterf_Pro_Dx_Z = INTERFERISCI(Ba2_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
                                  // Bifacciale
                                  if (ABS(CAM_Ang-CAM_AngFia) == 180)
                                     {
                                      // Non devo cambiare i punti anta perché essendo girata di 180gradi mi va bene considerare
                                      // sempre Ba3_att_allung
                                      PointInterf_Pro_Dx_Z = INTERFERISCI(Ba0_fia, CAM_AngFia+90, Ba0_att, Ba3_att_allung)
                                      // 02.03.2020
                                      dist_0Pro_dx_Z_180 = DISTANZA(Ba0_fia, PointInterf_Pro_Dx_Z)
                                      if (dist_0Pro_dx_Z_180 < 40  &  dist_0Pro_dx_Z_180 > 0)  { Battuta_Z_Dx = dist_0Pro_dx_Z_180 }
                                      if (dist_0Pro_dx_Z_180 < 3   &  dist_0Pro_dx_Z_180 > 0)  { Battuta_Z    = dist_0Pro_dx_Z_180 }
                                     }

                                  if (PointInterf_Pro_Dx_Z.x>-1000001 & PointInterf_Pro_Dx_Z.y>-1000001 & PointInterf_Pro_Dx_Z.z>-1000001)
                                     {
                                      dist_2Pro_dx_Z = DISTANZA(Ba2_fia, PointInterf_Pro_Dx_Z)
                                      if (dist_2Pro_dx_Z < 40)  { Battuta_Z_Dx = dist_2Pro_dx_Z }
                                      if (dist_2Pro_dx_Z < 3)
                                         {
                                          if (Battuta_Z == 0)
                                             { Battuta_Z = dist_2Pro_dx_Z }
                                         }
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
          else
             {
              if ( ABS(mdf_Battuta_DX_dist) < #X+2  &  mdf_Battuta_DX_dist != 0  &  mdf_Battuta_DX_dist > Battuta_DX
                 & mdf_Battuta_DX_dist < 90
                 // 25.05.2017
                 // grafica fianco vetro girato di 90gradi con X 585
                 & #X < 100
                 )
                 {
                 // 13.12.2018
                  dist_32 = DISTANZA(Ba3_att, Ba2_fia)
                  mdf_diff_ang = CAM_Ang+CAM_AngFia
                  mdf_fia_gir_err = -0.1
                  if (ABS(mdf_diff_ang-360) > 85  &  ABS(mdf_diff_ang-360) < 175)
                     {
                      if ( Battuta_DX > 9  &  Battuta_DX < 18.1
                         & mdf_Battuta_DX_dist > Battuta_DX
                         )
                         { mdf_fia_gir_err = idx_FiaDx_Ctrl_att }
                     }

                  if (mdf_fia_gir_err == -0.1)
                     {
                      _debug_dist_fiaBatDx = idx_FiaDx_Ctrl_att
                      mdf_Battuta_DX = mdf_Battuta_DX_dist
                     }
                 }
             }
          //DISPLAY2(STRCAT("6.MdF_get_Battuta_DX - mdf_Battuta_DX=", STR(mdf_Battuta_DX)))
         }

      if ( IS_MATCH(MdF_Apertura, "D*") == 1
         & mdf_Battuta_DX != 0
         )
         {
          // Nel caso di Apertura dichiarata destra non deve controllare se
          // maggiore di mdf_Battuta_X che potrebbe essere la battuta sinistra
          if ( mdf_Battuta_DX < X_FiaVic+X_add_Limite  &  ABS(mdf_Battuta_DX) > ABS(mdf_Battuta_DX_att)
             & ABS(mdf_Battuta_DX) < 50
             // 21.02.2024 A179338
             & ABS(CAM_Ang-CAM_AngFia) != 90
             )
             {
              // 02.01.2019
              mdf_AperDX_fiaSovrapp = 0
              // X Fianco 19
              // -9.42   7.51
              if (mdf_Battuta_DX < -X_FiaVic/3  &  mdf_Battuta_DX_att > X_FiaVic/3)
                 { mdf_AperDX_fiaSovrapp = 1 }

              if (mdf_AperDX_fiaSovrapp == 0)
                 {
                  _debug_AperDX_mdf_Battuta_DX_att = mdf_Battuta_DX_att
                  _debug_AperDX_fiaBatDx = idx_FiaDx_Ctrl_att
                  _debug_AperDX_BattutaDx = mdf_Battuta_DX
                  mdf_Battuta_X = mdf_Battuta_DX
                 }
             }

          // 02.01.2019
          // Protezione grafica non corretta. Fianco da 19
          // In realtà in caricamento ordine trova prima un fianco che non c'entra, quindi
          // entra qui ma non imposta mdf_fiaBatDx_Gen quindi rientra perche exitBattuta_DX resta -1
          // e rientrando trova i 2 Fianchi corretti
          // ma essendo rientrato cioe richiama MdF_while_X_Gen imposta mdf_Battuta_DX_att=0 per cui
          // qui sopra mdf_AperDX_fiaSovrapp=0
          // poi pero trovando prima il fianco sbagliato imposta mdf_Battuta_X errata, quando entra con il fianco corretto
          // qui sopra non entra piu pur avendo impostato mdf_fiaBatDx_Gen correttamente e quindi exitBattuta_DX sembrava corretto
          // ma con mdf_Battuta_X errata
          // 7.51   -9.42
          if ( mdf_Battuta_DX > X_FiaVic/3  &  ABS(mdf_Battuta_DX) < ABS(mdf_Battuta_DX_att)
             & ABS(mdf_Battuta_DX) < X_FiaVic/2+1
             & mdf_Battuta_DX_att < -X_FiaVic/3
             )
             {
              _debug_AperDX_fiaSovrapp = 1
              mdf_Battuta_X = mdf_Battuta_DX
             }
         }

      if (fia_Dx  |  fia_Sx == 0)
         {
          // Faccio l'Assegnazione di mdf_Battuta_X solo nel caso sono Apertura non-DX
          // così ce l'ho impostata lo stesso dato che può servire anche alla ferramente
          // di Frontali Battenti e dato che adesso il calcolo è comunque corretto
          if (IS_MATCH(MdF_Apertura, "D*") != 1)
             {
              if ( mdf_Battuta_DX < X_FiaVic+X_add_Limite  &  ABS(mdf_Battuta_DX) > ABS(mdf_Battuta_X)
                 & ABS(mdf_Battuta_DX) < 50
                 & mdf_Battuta_DX != 0
                 )
                 { mdf_Battuta_X = mdf_Battuta_DX }
             }

          if ( mdf_Battuta_DX < X_FiaVic+X_add_Limite  &  ABS(mdf_Battuta_DX) < 50  &  mdf_Battuta_DX != 0
             // 21.02.2024
             & ABS(CAM_Ang-CAM_AngFia) != 90
             )
             {
              // If per protezione se elementi un po sovrapposti, ma non servirebbe
              // Devo consentire una battuta destra anche meta rispetto alla sinistra
              // ma se c'è troppa differenza significa che sto prendendo un fianco
              // del contenitore vicino che è un po sovrapposto al Contenitore che mi
              // interessa
              if (ABS(mdf_Battuta_DX) >= ABS(mdf_Battuta_X)/2 - ABS(mdf_Battuta_X)/6 )
                 {
                  mdf_Battuta_X_Dx_idx = Fianchi_vic[iX]
                  mdf_Battuta_X_Dx = mdf_Battuta_DX
                 }
             }
         }
   }

  // 10.10.2023
   PROCEDURA MdF_fia_doppioBattutaX
   {
      mdf_fia_doppioBattutaX = 0
      if (VAR_EXIST(idx_att, "idx_ToCtrl_fdBX") != 1)  { idx_ToCtrl_fdBX = idx_att }

     // Improbabile ma se entro una volta e poi rientro ma magari idx_att e' cambiato
      if (IS_IDX(idx_ToCtrl_fdBX) != 1)  { idx_ToCtrl_fdBX = idx_att }

     // 17.11.2023 "Dicono" errore parser caricamento da CIC, ma non e' replicabile
      if (IS_IDX(idx_ToCtrl_fdBX) != 1)  { EXITSUB() }

      if (VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaSx_inY_Battuta_X") > -1)
         {
          if ( IS_IDX(VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaSx_inY_Battuta_X"))
             & IS_MATCH(VAR_VAL_STR(idx_ToCtrl_fdBX, "MdF_Apertura"), "SX*")
             )
             {
              mdf_fia_doppioBattutaX = 1
             // 10.05.2024 Vedi anche mdf_y_sx_alto
              // Forse andrebbe invertio il controllo sull' Apertura perchè così e' sui fianchi opposti, poi in teoria
              // Non dovrebbe cambiare
              if ( VAR_EXIST(idx_ToCtrl_fdBX, "mdf_doppio_fiaSx_inY_basso")
                 & IS_IDX(VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaSx_inY_basso"))
                 )
                 {
                  MdfSys_Y_Fianco_Basso = VAR_VAL(mdf_doppio_fiaSx_inY_basso, "Y")
                  MdfSys_Y_Fianco_SX_Basso = MdfSys_Y_Fianco_Basso
                 }
              if ( VAR_EXIST(idx_ToCtrl_fdBX, "mdf_doppio_fiaSx_inY_alto")
                 & IS_IDX(VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaSx_inY_alto"))
                 )
                 {
                  MdfSys_Y_Fianco_Alto = VAR_VAL(mdf_doppio_fiaSx_inY_alto, "Y")
                  MdfSys_Y_Fianco_SX_Alto = MdfSys_Y_Fianco_Alto
                 }
             }
         }
      if (VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaDx_inY_Battuta_X") > -1)
         {
          if ( IS_IDX(VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaDx_inY_Battuta_X"))
             & IS_MATCH(VAR_VAL_STR(idx_ToCtrl_fdBX, "MdF_Apertura"), "DX*")
             )
             {
              mdf_fia_doppioBattutaX = 1
             // 10.05.2024
              if ( VAR_EXIST(idx_ToCtrl_fdBX, "mdf_doppio_fiaDx_inY_basso")
                 & IS_IDX(VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaDx_inY_basso"))
                 )
                 {
                  MdfSys_Y_Fianco_Basso = VAR_VAL(mdf_doppio_fiaDx_inY_basso, "Y")
                  MdfSys_Y_Fianco_DX_Basso = MdfSys_Y_Fianco_Basso
                 }
              if ( VAR_EXIST(idx_ToCtrl_fdBX, "mdf_doppio_fiaDx_inY_alto")
                 & IS_IDX(VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaDx_inY_alto"))
                 )
                 {
                  MdfSys_Y_Fianco_Alto = VAR_VAL(mdf_doppio_fiaDx_inY_alto, "Y")
                  MdfSys_Y_Fianco_DX_Alto = MdfSys_Y_Fianco_Alto
                 }
             }
         }

     // 23.07.2024 Ce06685 per ANP è al contrario
      if (ABS(VAR_VAL(idx_ToCtrl_fdBX, "MdF_angoloBas")) == 90)
         {
          if (VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaDx_inY_Battuta_X") > -1)
             {
              if ( IS_IDX(VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaDx_inY_Battuta_X"))
                 & IS_MATCH(VAR_VAL_STR(idx_ToCtrl_fdBX, "MdF_Apertura"), "SX*")
                 )
                 {
                  mdf_fia_doppioBattutaX = 1
                  if ( VAR_EXIST(idx_ToCtrl_fdBX, "mdf_doppio_fiaDx_inY_basso")
                     & IS_IDX(VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaDx_inY_basso"))
                     )
                     {
                      MdfSys_Y_Fianco_Basso = VAR_VAL(mdf_doppio_fiaDx_inY_basso, "Y")
                      MdfSys_Y_Fianco_DX_Basso = MdfSys_Y_Fianco_Basso
                     }
                  if ( VAR_EXIST(idx_ToCtrl_fdBX, "mdf_doppio_fiaDx_inY_alto")
                     & IS_IDX(VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaDx_inY_alto"))
                     )
                     {
                      MdfSys_Y_Fianco_Alto = VAR_VAL(mdf_doppio_fiaDx_inY_alto, "Y")
                      MdfSys_Y_Fianco_DX_Alto = MdfSys_Y_Fianco_Alto
                     }
                 }
             }
          if (VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaSx_inY_Battuta_X") > -1)
             {
              if ( IS_IDX(VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaSx_inY_Battuta_X"))
                 & IS_MATCH(VAR_VAL_STR(idx_ToCtrl_fdBX, "MdF_Apertura"), "DX*")
                 )
                 {
                  mdf_fia_doppioBattutaX = 1
                  if ( VAR_EXIST(idx_ToCtrl_fdBX, "mdf_doppio_fiaSx_inY_basso")
                     & IS_IDX(VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaSx_inY_basso"))
                     )
                     {
                      MdfSys_Y_Fianco_Basso = VAR_VAL(mdf_doppio_fiaSx_inY_basso, "Y")
                      MdfSys_Y_Fianco_SX_Basso = MdfSys_Y_Fianco_Basso
                     }
                  if ( VAR_EXIST(idx_ToCtrl_fdBX, "mdf_doppio_fiaDx_inY_alto")
                     & IS_IDX(VAR_VAL(idx_ToCtrl_fdBX, "mdf_doppio_fiaSx_inY_alto"))
                     )
                     {
                      MdfSys_Y_Fianco_Alto = VAR_VAL(mdf_doppio_fiaSx_inY_alto, "Y")
                      MdfSys_Y_Fianco_SX_Alto = MdfSys_Y_Fianco_Alto
                     }
                 }
             }
         }
   }


   PROCEDURA MdF_while_Y
   {
      iR = 1
      SORT_POINT(base_1, "Rip_vic", "base_1")
      exitBattuta_RI_Y = -1
      Ba0_att = [base_0.x, 0, base_0.z]
      Ba3_att = [base_3.x, 0, base_3.z]
      while (iR <= Rip_vic  &  exitBattuta_RI_Y == -1)
         {
          SET_#(Rip_vic[iR])
          Y_EleOr = VAR_VAL(Rip_vic[iR], "Y")
          // Problema piani di elementi vicini
          // Non posso controllare se anta e piano hanno lo stesso padre perché ci sono
          // anche Ante che vanno su piu strutture-padri
          //- punti dell'elemento  trovato
          Ba1_rip = [#base_1.x, 0, #base_1.z]
          Ba2_rip = [#base_2.x, 0, #base_2.z]
          Ba0_rip = [#base_0.x, 0, #base_0.z]

          dist_02_Rip = DISTANZA(Ba0_att, Ba2_rip)
          dist_31_Rip = DISTANZA(Ba3_att, Ba1_rip)
         // 07.09.2022
          dist_30_Rip = DISTANZA(Ba3_att, Ba0_rip)

          rip_interno = 1
          if (X < #X)
             {
              // Contenitore con Piano unico e 2 ante, oppure un'anta fino a metà
              rip_interno = 1.1
              if (dist_02_Rip > #X + X/2 + #X/5  |  dist_31_Rip > #X + X/2 + #X/5 )
                 { rip_interno = 0 }
             }
          else
             {
              // Contenitore con Anta che prende 2 piani
              rip_interno = 1.2
              if (dist_02_Rip > X + #X/2 + #X/5  |  dist_31_Rip > X + #X/2 + #X/5)
                 { rip_interno = -1 }
             // 07.09.2022 La23769
              if (dist_02_Rip > 150  & dist_02_Rip < X-10  &  dist_31_Rip > X+30  &  dist_30_Rip > X+100)
                 { rip_interno = -1.2 }
             }

          if ( IS_MATCH(MdF_Apertura, "RI*") == 1
             & rip_interno > 0
             )
             {
              if (#base_0.y-30 < base_0.y)
                 {
                  dist_AB = #alto_0.y - base_0.y
                  if (dist_AB < 50)
                     {
                      Battuta_Y = dist_AB
                      // 18.10.2023 St910528
                      //if (dist_AB > 0  &  dist_AB < #Y+0.1)
                      if (dist_AB > 0  &  dist_AB < Y_EleOr+0.6)
                         {
                          exitBattuta_RI_Y = Rip_vic[iR]
                         }
                     }
                 }
             }
          iR = iR+1
         }
      iR = 1
      SORT_POINT(alto_1, "Rip_vic", "alto_1")
      exitBattuta_VA_Y = -1
      while (iR <= Rip_vic  &  exitBattuta_VA_Y == -1)
         {
          SET_#(Rip_vic[iR])
          Y_EleOrVA = VAR_VAL(Rip_vic[iR], "Y")

          // Problema piani di elementi vicini
          // Non posso controllare se anta e piano hanno lo stesso padre perché ci sono
          // anche Ante che vanno su piu strutture-padri
          //- punti dell'elemento  trovato
          Ba1_rip = [#base_1.x, 0, #base_1.z]
          Ba2_rip = [#base_2.x, 0, #base_2.z]

          dist_02_Rip = DISTANZA(Ba0_att, Ba2_rip)
          dist_31_Rip = DISTANZA(Ba3_att, Ba1_rip)

          rip_interno = 1
          if (X < #X)
             {
              // Contenitore con Piano unico e 2 ante, oppure un'anta fino a metà
              rip_interno = 1.1
              if (dist_02_Rip > #X + X/2 + #X/5  |  dist_31_Rip > #X + X/2 + #X/5)
                 { rip_interno = 0 }
             }
          else
             {
              // Contenitore con Anta che prende 2 piani
              rip_interno = 1.2
              if (dist_02_Rip > X + #X/2 + #X/5  |  dist_31_Rip > X + #X/2 + #X/5)
                 { rip_interno = -1 }
             }

          if ( IS_MATCH(MdF_Apertura, "VA*") == 1
             & rip_interno > 0
             )
             {
              if (#alto_0.y+30 > alto_0.y)
                 {
                  dist_BA = alto_0.y - #base_0.y
                  if (dist_BA < 50)
                     {
                      Battuta_Y = dist_BA
                      // 18.10.2023
                      //if (dist_BA > 0  &  dist_BA < #Y+0.1)
                      if (dist_BA > 0  &  dist_BA < Y_EleOrVA+0.6)
                         {
                          exitBattuta_VA_Y = Rip_vic[iR]
                         }
                     }
                 }
             }
          iR = iR+1
         }
   }

   PROCEDURA MdF_Battuta_Z
   {
      // Se già calcolata nella Battuta X non faccio niente, ma se ho l' anta interna non viene trovata proiezione Z
      // in ogni caso calcolo la Battuta_Z solo se ho già un fianco Battuta_X exitBattuta_SX, DX
      if (Battuta_Z != 0)  { EXITSUB() }

      fia_Sx = 0
      fia_Dx = 0
      iZ = 1

      Ba0_att = [base_0.x, 0, base_0.z]
      Ba3_att = [base_3.x, 0, base_3.z]

      mdf_calc_Battuta_Z_Sx = -1
      if (IS_IDX(exitBattuta_SX) )
         {
          mdf_calc_Battuta_Z_Sx = 1
          //- punti dell'elemento  trovato
          SET_#(exitBattuta_SX)
          Ba0_fia = [#base_0.x, 0, #base_0.z]
          Ba1_fia = [#base_1.x, 0, #base_1.z]
          Ba2_fia = [#base_2.x, 0, #base_2.z]
          Ba3_fia = [#base_3.x, 0, #base_3.z]

          dist_02 = DISTANZA(Ba0_att, Ba2_fia)
          dist_31 = DISTANZA(Ba3_att, Ba1_fia)

          dist_03 = DISTANZA(Ba0_att, Ba3_fia)
          if (dist_03 > #Z - 0.1)
             {
              dist_xx = ABS(base_0.x - #base_1.x)
              dist_zz = ABS(base_0.z - #base_1.z)
              dist_Z = dist_zz
              if (dist_xx < dist_zz-1.5)
                 { dist_Z = dist_xx }
              if (dist_Z < 10)  { Battuta_Z = dist_Z }
             }
          else
             {
              dist_Z = -1*DISTANZA(Ba0_att, Ba2_fia)
              if (dist_Z < Z+1)  { Battuta_Z = dist_Z }
             }
         // 20.07.2023
          Battuta_Z_Sx = Battuta_Z
         }

      mdf_calc_Battuta_Z_Dx = -1
      if (IS_IDX(exitBattuta_DX) )
         {
          mdf_calc_Battuta_Z_Dx = 1
          //- punti dell'elemento  trovato
          SET_#(exitBattuta_DX)
          Ba0_fia = [#base_0.x, 0, #base_0.z]
          Ba1_fia = [#base_1.x, 0, #base_1.z]
          Ba2_fia = [#base_2.x, 0, #base_2.z]
          Ba3_fia = [#base_3.x, 0, #base_3.z]
          dist_30 = DISTANZA(Ba3_att, Ba0_fia)
          if (dist_30 > #Z - 0.1)
             {
              dist_xx = ABS(base_3.x - #base_2.x)
              dist_zz = ABS(base_3.z - #base_2.z)
              dist_Z = dist_zz
              if (dist_xx < dist_zz-1.5)
                 { dist_Z = dist_xx }
              if (dist_Z < 10)  { Battuta_Z = dist_Z }
             }
          else
             {
              dist_Z = -1*DISTANZA(Ba3_att, Ba1_fia)
              if (dist_Z < Z+1)  { Battuta_Z = dist_Z }
             }
         // 20.07.2023
          Battuta_Z_Dx = Battuta_Z
         }
   }

   PROCEDURA MdF_Battuta_Z_Gen
   {
      // Se già calcolata nella Battuta X
      // in ogni caso calcolo la Battuta_Z solo se ho già un fianco Battuta_X mdf_fiaBatSx_Gen, mdf_fiaBatDx_Gen
      if (Battuta_Z != 0)
         {
          SET_#(mdf_idx_KFBX)
          #Battuta_Z = Battuta_Z
          EXITSUB()
         }

      fia_Sx = 0
      fia_Dx = 0
      iZ = 1

      SET_#(mdf_idx_KFBX)
      Ba0_att = [#base_0.x, 0, #base_0.z]
      Ba3_att = [#base_3.x, 0, #base_3.z]
      bas0_x = #base_0.x
      bas0_z = #base_0.z
      bas3_x = #base_3.x
      bas3_z = #base_3.z
      Z_KFBX = #Z

      mdf_calc_Battuta_Z_Sx = -1
      if (IS_IDX(mdf_fiaBatSx_Gen) )
         {
          SET_#(mdf_fiaBatSx_Gen)
          Ba0_fia = [#base_0.x, 0, #base_0.z]
          Ba1_fia = [#base_1.x, 0, #base_1.z]
          Ba2_fia = [#base_2.x, 0, #base_2.z]
          Ba3_fia = [#base_3.x, 0, #base_3.z]

          dist_02 = DISTANZA(Ba0_att, Ba2_fia)
          dist_31 = DISTANZA(Ba3_att, Ba1_fia)

          mdf_calc_Battuta_Z_Sx = 1

          dist_03 = DISTANZA(Ba0_att, Ba3_fia)
          if (dist_03 > #Z - 0.1)
             {
              dist_xx = ABS(bas0_x - #base_1.x)
              dist_zz = ABS(bas0_z - #base_1.z)
              dist_Z = dist_zz
              if (dist_xx < dist_zz-1.5)
                 { dist_Z = dist_xx }
              if (dist_Z < 10)  { Battuta_Z = dist_Z }
             }
          else
             {
              dist_Z = -1*DISTANZA(Ba0_att, Ba2_fia)
              if (dist_Z < Z_KFBX+1)  { Battuta_Z = dist_Z }
             }
          Battuta_Z_Sx = Battuta_Z
         // 20.07.2023
          SET_#(mdf_idx_KFBX)
          #Battuta_Z_Sx = Battuta_Z_Sx
         }

      mdf_calc_Battuta_Z_Dx = -1
      if (IS_IDX(mdf_fiaBatDx_Gen) )
         {
          SET_#(mdf_fiaBatDx_Gen)
          Ba0_fia = [#base_0.x, 0, #base_0.z]
          Ba1_fia = [#base_1.x, 0, #base_1.z]
          Ba2_fia = [#base_2.x, 0, #base_2.z]
          Ba3_fia = [#base_3.x, 0, #base_3.z]

          dist_02 = DISTANZA(Ba0_att, Ba2_fia)
          dist_31 = DISTANZA(Ba3_att, Ba1_fia)

          mdf_calc_Battuta_Z_Dx = 1
          dist_30 = DISTANZA(Ba3_att, Ba0_fia)
          if (dist_30 > #Z - 0.1)
             {
              dist_xx = ABS(bas3_x - #base_2.x)
              dist_zz = ABS(bas3_z - #base_2.z)
              dist_Z = dist_zz
             // 28.10.2016
              //if (dist_xx < dist_zz)
              if (dist_xx < dist_zz-1.5)
                 { dist_Z = dist_xx }
              if (dist_Z < 10)  { Battuta_Z = dist_Z }
             }
          else
             {
              dist_Z = -1*DISTANZA(Ba3_att, Ba1_fia)
              if (dist_Z < Z_KFBX+1)  { Battuta_Z = dist_Z }
             }
          Battuta_Z_Dx = Battuta_Z
          SET_#(mdf_idx_KFBX)
         // 20.07.2023
          #Battuta_Z_Dx = Battuta_Z_Dx
         }

      if (mdf_calc_Battuta_Z_Sx > 0  |  mdf_calc_Battuta_Z_Dx > 0)
         {
          SET_#(mdf_idx_KFBX)
          #Battuta_Z = Battuta_Z

          //if (mdf_calc_Battuta_Z_Dx > 0)  { #dist_30 = dist_30 }
          //if (mdf_calc_Battuta_Z_Sx > 0)  { #dist_03 = dist_03 }
          //#dist_02 = dist_02
          //#dist_31 = dist_31
          //#dist_Z = dist_Z

          //if (Battuta_Z != 0)  { EXITSUB() }
         }

      SET_#(mdf_idx_KFBX)
      #Battuta_Z = Battuta_Z
   }

   PROCEDURA MdF_Ctrl_CAM_Lavorazioni
   {
      $wk_elemento_cam = "CAM_Lavorazioni"
      $wk_idx_inc = idx_att
      COMPONENTI3("ele_cam", $wk_idx_inc, $wk_elemento_cam)
      iE=1
      while (iE <= ele_cam)
         {
          if (PADRE(ele_cam[iE], 1) == $wk_idx_inc)
             { COMANDO2(STRCAT("ELIMINA ", STR(ele_cam[iE]), " // MdF_Ctrl_CAM_Lavorazioni")) }
          iE = iE+1
         }
      if (ele_cam > 0)
         {
          NewRTA = "1"
          SET_#($wk_idx_inc)
          if (IS_MATCH(NewRTA, "1") == 1) { CAM_Lav_offy = CAM_Lav_offy - #Y }

          COMANDO2(STRCAT("RELATIVE_ADD ",STR($wk_idx_inc)," ",$wk_elemento_cam," A ",STR(CAM_Lav_offx)," ",STR(CAM_Lav_offy)," ",STR(CAM_Lav_offz) ," 0"))
          COMANDO2("PROCEDURA CAM_noAUTO")
         }
   }

   PROCEDURA MdF_SetStato_NoGEST
   {
      if (ACTION() <= 0)  { EXITSUB() }

      // Se elemento inserito da Procedura cancella ed è gestionale imposta prima
      // gli stati di NON-Gestionale e poi troppo tardi si imposta senza stato 7 e 8
      // Se MdF_ aggiunti da Procedura cancella è appunto solo se MdF_ è elemento gestionale
      if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacroCancella*") != 1)
         {
          SET_GEST_STATO(idx_att, 7, 1)
          SET_GEST_STATO(idx_att, 8, 1)
         }

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

      if (VAR_EXIST(idx_att, "MdF_AbilitaGEST") )
         {
          if (STRCMP(MdF_AbilitaGEST, "No") != 0)
             {
              SET_GEST_STATO(idx_att, 7, 0)
              SET_GEST_STATO(idx_att, 8, 0)
             }
         }
   }

   PROCEDURA MdF_GEST
   {
      MdF_AbilitaGEST = "NotFound"
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_AbilitaGEST") )
         {
          MdF_AbilitaGEST = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_AbilitaGEST")
         }

      idx_CamMdF = VAR_VAL(PADRE(idx_att, 1), "idx_CamMdF")

      $mdf_sub_GEST = STRCAT("MdF_GEST_", chiave_tabvar_mdf)

      // Caso CerRibPisAnta
      //if ( STRCMP(MdF_AbilitaGEST, chiave_tabvar_mdf) == 0
      if ( STR_INDEX_OF(MdF_AbilitaGEST, 0, chiave_tabvar_mdf) > -1
         | STRCMP(MdF_AbilitaGEST, NOME(idx_att)) == 0
         )
         {
          GOSUB $mdf_sub_GEST
         }

      DEL_VAR(-1, "mdf_sub_GEST")
   }

   PROCEDURA MdF_Ctrl_save_prec
   {
      mdf_save_prec = 0
      // Se io MdF_ sono aggiunto ma mio padre non ha la var KeyFamRegFacc
      // significa che sono venuto su dal RIT
      if ( VAR_EXIST(PADRE(idx_att, 1), "KeyFamRegFacc") != 1
         // 25.11.2020
         | VAR_VAL(PADRE(idx_att, 1), "mdf_Load_save_prec") > 0
         )
         {
          mdf_save_prec = 1
         // 16.05.2017
          // salvato erroneamente nel rit
          if (STRCMP($MdF_Utente, "-1") == 0)
             {
              GOSUB MdF_path_cam_ini
              $MdF_Utente = SUBST_LABEL(READ_INI2("CAMCAB", "MdF_Utente", $MdF_path_camini))
             }

          if (STR_INDEX_OF($MdF_Utente, 0, cam_KeyRegMdF) == -1)
             {
              // 25.11.2020
              //WITH_VAR_LOCAL(idx_att, "mdf_arrayModif", "mdf_modif_Ute", 2, 0, "")
              // Se carico da un altro Metron con cam.ini senza MdF_Utente="CerBat"
              //mdf_save_prec = -1
              //COMANDO2(STRCAT("LOGMSG MdF_Ctrl_save_prec MdF_Cerniere salvate nel rit e caricate da un cam.ini senza MdF_Utente idx=", STR(idx_att), " figlo di=", STR(PADRE(idx_att, 1)) ," ACTION", STR(ACTION()), " ", VAR_VAL_STR(-1, "File")))
              mdf_da_RIT_caminisenzaMdF_Utente = 1
             }
          // salvato erroneamente nel rit
          if (STRCMP(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Cambiato"), "mdf_Load_save_prec") != 0)
             { mdf_save_prec = -1 }
         }
   }

   PROCEDURA MdF_Ctrl_Load_save_prec
   {
      if (STRLEN(MDFSys_Load_ini) > 0)
         {
          // Se ho degli MdF_ ma non ho la var KeyFamRegFacc significa che l' MdF_
          // arriva dal RIT
          WITH_ALIAS("$save_mdf_Fro", "CamMdFrontali")
          $save_mdf_i = 1
          while ($save_mdf_i <= $save_mdf_Fro)
             {
              $mdf_Load_save_prec = 0
              $mdf_idx_Fro = $save_mdf_Fro[$save_mdf_i]

              // Occhio ai Frontali ANP con MdF_Sat, vedi MdF_Ctrl_Load_save_prec_att
              COMPONENTI3("$mdf_Ferr", $mdf_idx_Fro, "MdF_*")
              if ($mdf_Ferr > 0)
                 {
                  if (VAR_EXIST($mdf_idx_Fro, "KeyFamRegFacc") != 1)
                     { $mdf_Load_save_prec = 1 }

                  iFe=1
                  while (iFe <= $mdf_Ferr)
                     {
                      mdf_padre_correct = 0
                      if ( PADRE($mdf_Ferr[iFe], 1) == $mdf_idx_Fro
                         & IS_MATCH(NOME($mdf_Ferr[iFe]), "MdF_Ferramente_4Reg") != 1
                         )
                         { mdf_padre_correct = 1 }

                      if ( IS_MATCH(NOME($mdf_Ferr[iFe]), "MdF_Ferramente_4Reg") == 1
                         & PADRE($mdf_Ferr[iFe], 2) == $mdf_idx_Fro
                         )
                         { mdf_padre_correct = 2 }

                      if (mdf_padre_correct > 0)
                         {
                          if (STRCMP(VAR_VAL_STR($mdf_Ferr[iFe], "KeyFamRegFacc"), "") == 0)
                             { $mdf_Load_save_prec = 2 }
                          else
                             {
                              if (VAR_EXIST($mdf_Ferr[iFe], "KeyFamRegFacc") )
                                 { $mdf_Load_save_prec = -1 }
                             }
                         }
                      iFe = iFe+1
                     }
                 }

              if ($mdf_Load_save_prec > 0)
                 {
                  VAR_CREATE_STR($mdf_idx_Fro, "MdF_Cambiato", "mdf_Load_save_prec", 1, "")
                 }
              $save_mdf_i = $save_mdf_i+1
             }
         }
      DEL_VAR(-1, "mdf_Load_save_prec")
      DEL_VAR(-1, "save_mdf*")
   }

   PROCEDURA MdF_Ctrl_Load_save_prec_att
   {
      if (VAR_VAL(idx_att, "mdf_Load_save_prec") == 0.1)  { EXITSUB() }

      // 15.11.2019
      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
     // 18.01.2021 Posso personalizzare il Load MdF_ svincolandomi dall $OnLoadOrder o $VAR_LOAD_ORDER
      if (VAR_VAL(-1, "MdF_LoadOrder") > -1)  { CAM_loadOrder = $MdF_LoadOrder }
      if (CAM_loadOrder == 0)
         {
         // 28.01.2021 VAR_escludi_cerniere ele inserito da Listino non ha mdf_Load_save_prec
          if (VAR_EXIST(idx_att, "mdf_Load_save_prec") )
             {
              if (VAR_VAL(idx_att, "mdf_Load_save_prec") > -1)
                 { EXITSUB() }
             }
         }

      mdf_Load_save_prec = -1
      if (VAR_EXIST(idx_att, "MDFSys_Load_ini") != 1)  { GOSUB MdF_Var_Ini }

      // 23.04.2020
      if (CAM_loadOrder == 1)  { EXITSUB() }

      // 23.04.2020
      //if (STRLEN(MDFSys_Load_ini) > 0)
      if (VAR_EXIST(idx_att, "MDFSys_Load_ini") == 1)
         {
          if (VAR_EXIST(idx_att, "KeyFamRegFacc") != 1)
             {
              mdf_Load_save_prec = -0.5
              // Se ho degli MdF_ ma non ho la var KeyFamRegFacc significa che l' MdF_
              // arriva dal RIT
              // 31.07.2024 Non va bene se su Frontale ANP ho gli MdF_Sat* gia aggiunti dall' altro Frontale
              // 11.12.2024
              //COMPONENTI3("mdf_FerrSave", idx_att, "MdF_*")
              MdF_WITH_ALIAS_att_ESCL("mdf_FerrSave", "MdF_CAM", idx_att)
              mdf_FerrSave_Cam = 0
              iSa=1
              while (iSa <= mdf_FerrSave)
                 {
                  if ( HAS_ALIAS(mdf_FerrSave[iSa], "MdF_CAM")
                     // 02.09.2024
                     & IS_MATCH(NOME(PADRE(mdf_FerrSave[iSa], 1)), "MECCANISM*_UTENTE*") != 1
                     & IS_MATCH(NOME(mdf_FerrSave[iSa]), "MECCANISM*_UTENTE*") != 1
                     )
                     {
                      mdf_FerrSave_Cam = 1
                      mdf_FerrSave_pres_idx = mdf_FerrSave[iSa]
                     }
                  iSa = iSa+1
                 }
              //if (mdf_FerrSave > 0)
              if (mdf_FerrSave_Cam > 0)
                 {
                  mdf_Load_save_prec = 1
                 }
             }

          if (mdf_Load_save_prec > 0)
             {
              MdF_Cambiato = "mdf_Load_save_prec"
             }
         }
   }

   PROCEDURA MdF_EstraiStringhe
   {
  // in input  : mdfstr_input
  // in output : $mdf_array_Stringhe[...]
      mdfi=1   mdfexit=0  mdfchar = ";"
      if (VAR_EXIST(-1, "mdf_char") )  { mdfchar = $mdf_char }

      while (mdfexit == 0  &  STRCMP(mdfstr_input, "") != 0)
         {
          GOSUB MdF_STR_INDEX_OF_BDM
          if (mdflun < 0)
             {
              mdf_array_Stringhe[mdfi] = mdfstr_input
              mdfexit = 1
              mdfi = mdfi+1
             }
          else
             {
              mdfbuff = STRMID(0, mdflun, mdfstr_input)
              mdf_array_Stringhe[mdfi] = mdfbuff
              mdfstr_input = STRMID(mdflun+1, STRLEN(mdfstr_input)-mdflun-1, mdfstr_input)
              mdfi = mdfi+1
             }
         }
      mdf_array_Stringhe = mdfi-1
   }

   PROCEDURA MdF_EstraiStringheSep
   {
  // in input  : mdfstr_input  mdfchar = ";" "|"
  // in output : $mdf_array_Stringhe[...]
      mdfi=1   mdfexit=0
      if (VAR_EXIST(-1, "mdf_char") )  { mdfchar = $mdf_char }

      while (mdfexit == 0  &  STRCMP(mdfstr_input, "") != 0)
         {
          GOSUB MdF_STR_INDEX_OF_BDM
          if (mdflun < 0)
             {
              mdf_array_Stringhe[mdfi] = mdfstr_input
              mdfexit = 1
              mdfi = mdfi+1
             }
          else
             {
              mdfbuff = STRMID(0, mdflun, mdfstr_input)
              mdf_array_Stringhe[mdfi] = mdfbuff
              mdfstr_input = STRMID(mdflun+1, STRLEN(mdfstr_input)-mdflun-1, mdfstr_input)
              mdfi = mdfi+1
             }
         }
      mdf_array_Stringhe = mdfi-1
   }

   PROCEDURA MdF_STR_INDEX_OF_BDM
   {
  // In Input mdfstr_input;char
  // In output lun
      mdfindk=0   mdfexit_lunStr=0   mdflun = -1
      while (mdfexit_lunStr == 0)
         {
          if (mdfindk >= STRLEN(mdfstr_input) )
             {
              mdflun = -1
              mdfexit_lunStr = 2
             }
           if (STRCMP(STRMID(mdfindk, 1, mdfstr_input), mdfchar) == 0)
              {
               mdfexit_lunStr = 1
              }
          mdfindk = mdfindk+1
         }
      if (mdfexit_lunStr == 1)  { mdflun = mdfindk-1 }
   }

   PROCEDURA MdF_EStr_Ctrl_var_gest
   {
  // in input  : mdfstr_input
  // in output : $mdf_array_Stringhe[...]
      mdfi=1   mdfexit=0  mdfchar = ";"
      if (VAR_EXIST(-1, "mdf_char") )  { mdfchar = $mdf_char }

      while (mdfexit == 0  &  STRCMP(mdfstr_input, "") != 0)
         {
          GOSUB MdF_STR_INDEX_OF_BDM
          if (mdflun < 0)
             {
              mdf_array_var_gest[mdfi] = mdfstr_input
              mdfexit = 1
              mdfi = mdfi+1
             }
          else
             {
              mdfbuff = STRMID(0, mdflun, mdfstr_input)
              mdf_array_var_gest[mdfi] = mdfbuff
              mdfstr_input = STRMID(mdflun+1, STRLEN(mdfstr_input)-mdflun-1, mdfstr_input)
              mdfi = mdfi+1
             }
         }
      mdf_array_var_gest = mdfi-1
   }

   PROCEDURA MdF_EStr_var
   {
  // in input  : mdfstr_input
  // in output : $mdf_array_Stringhe[...]
      mdfi=1   mdfexit=0  mdfchar = ";"
      if (VAR_EXIST(-1, "mdf_char") )  { mdfchar = $mdf_char }

      while (mdfexit == 0  &  STRCMP(mdfstr_input, "") != 0)
         {
          GOSUB MdF_STR_INDEX_OF_BDM
          if (mdflun < 0)
             {
              mdf_array_var[mdfi] = mdfstr_input
              mdfexit = 1
              mdfi = mdfi+1
             }
          else
             {
              mdfbuff = STRMID(0, mdflun, mdfstr_input)
              mdf_array_var[mdfi] = mdfbuff
              mdfstr_input = STRMID(mdflun+1, STRLEN(mdfstr_input)-mdflun-1, mdfstr_input)
              mdfi = mdfi+1
             }
         }
      mdf_array_var = mdfi-1
   }

   PROCEDURA MdF_VAL_VAR_STR_RegFacc
   {
      display_debug = 0
      if (IS_MATCH(var_val, "DISPLAY2(*") == 1)
         {
          display_debug = 1
          var_val = STRMID(9, STRLEN(var_val)-10, var_val)
         }

      if ( IS_MATCH(var_name, "Escludi*")
         | IS_MATCH(var_val, STRCAT("", APICI(), "*", APICI()) )
         )
         {
          // "si" o "no"
          if ( STRLEN(var_val) <= 5
             | IS_MATCH(var_val, STRCAT("", APICI(), "*", APICI()) )
             )
             {
              var_val = STRMID(1,STRLEN(var_val)-2,var_val)
              var_val_gl = var_val
              VAR_CREATE_STR(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)), var_val, 0, "")
              EXITSUB()
             }
         }

      retEval = EVAL(STRCAT("$mdf_wk_", var_name, STR(nReg),"=",var_val))
      var_gl = STRCAT("mdf_wk_", var_name, STR(nReg))
      var_val_gl = VAR_VAL_STR(-1, var_gl)

      // 11.04.2024
      //if (VAR_EXIST(idx_RegF, "Mdf_Count_EVAL_MdF_VAL_VAR_STR_RegFacc") != 1)
      //   { Mdf_Count_EVAL_MdF_VAL_VAR_STR_RegFacc = 1 }
      //Mdf_Count_EVAL_MdF_VAL_VAR_STR_RegFacc = Mdf_Count_EVAL_MdF_VAL_VAR_STR_RegFacc+1

      if (retEval != -1)
         { VAR_CREATE_STR(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)), var_val_gl, 0, "") }
      else
         {
          VAR_CREATE_STR(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)), var_val, 0, "")
          var_name_create = STRCAT(var_name, "_", tLav, STR(nReg))
          errEscludikFm = 0
          if (STRCMP(var_name, "EscludikFm") == 0)
             {
              if ( STRCMP(UPPER(VAR_VAL_STR(idx_RegF, var_name_create)), "SI") != 0
                 & STRCMP(UPPER(VAR_VAL_STR(idx_RegF, var_name_create)), "NO") != 0
                 )
                 { errEscludikFm = 1 }
             }
          if ( STRLEN(VAR_VAL_STR(idx_RegF, var_name_create)) == 0
             | errEscludikFm > 0
             )
             {
              if (VAR_EXIST(-1, "MdF_display_err") != 1)  { $MdF_display_err = -1 }
              $MdF_display_err = $MdF_display_err+1
              if (VAR_VAL(-1, "MdF_display_err") <= 4)
                 {
                  DISPLAY2(STRCAT("MDF-Error ( ", STR($MdF_display_err) ," ) Campo Regola_", STR(nReg), " tipoLav=", tLav, "\n variabile->", var_name, " Non Configurata\n",
                                  "Vedi Var ", var_name_create, " su ",
                                  "Elemento ", NOME(idx_Fro), " idx_RegF=", STR(idx_RegF), "\n\n",
                                  "Controllare KeyFamRegFacc.txt alla riga ", kriga, " CampoValore=", STRMID(0,STRLEN(var_val)/3+10,var_val), "\n",
                                  STRMID(STRLEN(var_val)/3+11,STRLEN(var_val),var_val), "\n\n",
                                  "Eventualmente fare attenzione ai doppi APICI dove necessari\n",
                                  "Attenzione all' uso corretto di == anziché solo = \n",
                                  "Controllare la corretta configurazione anche dei campi di riga precedenti\n\n",
                                  "Se il problema è su DTP_AliasScocca controllare VariabiliDaTipoPadri.txt archetipo=", NOME(PADRE(idx_Fro,-1)), "\n\n",
                                  "FLUSSO DATI: \n",
                                  "Alias CamMdFrontali -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt (Configurare MdF_Apertura) -> KeyFamRegFacc.txt \n",
                                  "Vengono aggiunti gli MdF_ -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt -> RegFacc.txt (CHIAVE_TAB_CAM)\n",
                                  "(CHIAVE_TAB_CAM) VariabiliLavorazione -> lav*.tab"
                                 )
                           )
                 }
             }
          // Devo avere almeno 2 caratteri.. per evitare - o *
          if ( STRLEN(VAR_VAL_STR(idx_RegF, var_name_create)) > 1
             // 15.02.2018
             & errEscludikFm <= 0
             )
             {
              if (VAR_EXIST(-1, "MdF_display_err") != 1)  { $MdF_display_err = -1 }
              $MdF_display_err = $MdF_display_err+1
              if (VAR_VAL(-1, "MdF_display_err") <= 4)
                 {
                  DISPLAY2(STRCAT("MDF-Error ( ", STR($MdF_display_err) ," ) PARSING Regola_", STR(nReg), " tipoLav=", tLav, "\n variabile->", var_name, "=", var_val, "\n\n",
                                  "Elemento ", NOME(idx_Fro), " idx_RegF=", STR(idx_RegF), "\n",
                                  "Controllare esistenza variabili su VariabiliMdF.txt, togliere gli spazi;\n",
                                  "Controllare i doppi APICI se necessari\n",
                                  "usare SE_STR se risultato è stringa, SE_NUM se risultato è numerico\n",
                                  "Controllare la corretta configurazione anche dei campi di riga precedenti\n\n",
                                  "Se il problema è su DTP_AliasScocca controllare VariabiliDaTipoPadri.txt archetipo=", NOME(PADRE(idx_Fro,-1)), "\n\n",
                                  "FLUSSO DATI: \n",
                                  "Alias CamMdFrontali -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt (Configurare MdF_Apertura) -> KeyFamRegFacc.txt \n",
                                  "Vengono aggiunti gli MdF_ -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt -> RegFacc.txt (CHIAVE_TAB_CAM)\n",
                                  "(CHIAVE_TAB_CAM) VariabiliLavorazione -> lav*.tab"
                                 )
                           )
                 }
             }
         }
      if (display_debug > 0)
         {
          DISPLAY2(STRCAT("-DISPLAY DEBUG KFRF-",  STR(idx_MdF_Var), "\n ",
                          kriga, "-> valore_Var_Tab=", var_val, "\n",
                          "valore_Evalizzato=", var_val_gl
                         )
                  )
         }

      DEL_VAR(-1, STRCAT("mdf_wk_", var_name, STR(nReg)))
   }

   PROCEDURA MdF_VAL_VAR_STR_RegFacc_nKEY
   {
      display_debug = 0
      if (IS_MATCH(var_val, "DISPLAY2(*") == 1)
         {
          display_debug = 1
          var_val = STRMID(9, STRLEN(var_val)-10, var_val)
         }

      if ( IS_MATCH(var_name, "Escludi*")
         | IS_MATCH(var_val, STRCAT("", APICI(), "*", APICI()) )
         )
         {
          // "si" o "no"
          if ( STRLEN(var_val) <= 5
             | IS_MATCH(var_val, STRCAT("", APICI(), "*", APICI()) )
             )
             {
              var_val = STRMID(1,STRLEN(var_val)-2,var_val)
              var_val_gl = var_val
              VAR_CREATE_STR(idx_RegF, STRCAT(var_name, "_", mdf_KFRFVY, "_", tLav, STR(nReg)), var_val, 0, "")
              EXITSUB()
             }
         }

      retEval = EVAL(STRCAT("$mdf_wk_", var_name, STR(nReg),"=",var_val))
      var_gl = STRCAT("mdf_wk_", var_name, STR(nReg))
      var_val_gl = VAR_VAL_STR(-1, var_gl)

      if (retEval != -1)
         { VAR_CREATE_STR(idx_RegF, STRCAT(var_name, "_", mdf_KFRFVY, "_", tLav, STR(nReg)), var_val_gl, 0, "") }
      else
         {
          VAR_CREATE_STR(idx_RegF, STRCAT(var_name, "_", mdf_KFRFVY, "_", tLav, STR(nReg)), var_val, 0, "")
          var_name_create = STRCAT(var_name, "_", mdf_KFRFVY, "_", tLav, STR(nReg))
          errEscludikFm = 0
          if (STRCMP(var_name, "EscludikFm") == 0)
             {
              if ( STRCMP(UPPER(VAR_VAL_STR(idx_RegF, var_name_create)), "SI") != 0
                 & STRCMP(UPPER(VAR_VAL_STR(idx_RegF, var_name_create)), "NO") != 0
                 )
                 { errEscludikFm = 1 }
             }
          if ( STRLEN(VAR_VAL_STR(idx_RegF, var_name_create)) == 0
             | errEscludikFm > 0
             )
             {
              if (VAR_EXIST(-1, "MdF_display_err") != 1)  { $MdF_display_err = -1 }
              $MdF_display_err = $MdF_display_err+1
              if (VAR_VAL(-1, "MdF_display_err") <= 4)
                 {
                  DISPLAY2(STRCAT("MDF-nKEY-Error ( ", STR($MdF_display_err) ," ) Campo Regola_", STR(nReg), " tipoLav=", tLav, "\n variabile->", var_name, " Non Configurata\n",
                                  "Vedi Var ", var_name_create, " su ",
                                  "Elemento ", NOME(idx_Fro), " idx_RegF=", STR(idx_RegF), "\n\n",
                                  "Controllare KeyFamRegFacc.txt alla riga ", kriga, " CampoValore=", STRMID(0,STRLEN(var_val)/3+10,var_val), "\n",
                                  STRMID(STRLEN(var_val)/3+11,STRLEN(var_val),var_val), "\n\n",
                                  "Eventualmente fare attenzione ai doppi APICI dove necessari\n",
                                  "Attenzione all' uso corretto di == anziché solo = \n",
                                  "Controllare la corretta configurazione anche dei campi di riga precedenti\n\n",
                                  "Se il problema è su DTP_AliasScocca controllare VariabiliDaTipoPadri.txt archetipo=", NOME(PADRE(idx_Fro,-1)), "\n\n",
                                  "FLUSSO DATI: \n",
                                  "Alias CamMdFrontali -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt (Configurare MdF_Apertura) -> KeyFamRegFacc.txt \n",
                                  "Vengono aggiunti gli MdF_ -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt -> RegFacc.txt (CHIAVE_TAB_CAM)\n",
                                  "(CHIAVE_TAB_CAM) VariabiliLavorazione -> lav*.tab"
                                 )
                           )
                 }
             }
          // Devo avere almeno 2 caratteri.. per evitare - o *
          if ( STRLEN(VAR_VAL_STR(idx_RegF, var_name_create)) > 1
             // 15.02.2018
             & errEscludikFm <= 0
             )
             {
              if (VAR_EXIST(-1, "MdF_display_err") != 1)  { $MdF_display_err = -1 }
              $MdF_display_err = $MdF_display_err+1
              if (VAR_VAL(-1, "MdF_display_err") <= 4)
                 {
                  DISPLAY2(STRCAT("MDF-nKEY-Error ( ", STR($MdF_display_err) ," ) PARSING Regola_", STR(nReg), " tipoLav=", tLav, "\n variabile->", var_name, "=", var_val, "\n\n",
                                  "Elemento ", NOME(idx_Fro), " idx_RegF=", STR(idx_RegF), "\n",
                                  "Controllare esistenza variabili su VariabiliMdF.txt, togliere gli spazi;\n",
                                  "Controllare i doppi APICI se necessari\n",
                                  "usare SE_STR se risultato è stringa, SE_NUM se risultato è numerico\n",
                                  "Controllare la corretta configurazione anche dei campi di riga precedenti\n\n",
                                  "Se il problema è su DTP_AliasScocca controllare VariabiliDaTipoPadri.txt archetipo=", NOME(PADRE(idx_Fro,-1)), "\n\n",
                                  "FLUSSO DATI: \n",
                                  "Alias CamMdFrontali -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt (Configurare MdF_Apertura) -> KeyFamRegFacc.txt \n",
                                  "Vengono aggiunti gli MdF_ -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt -> RegFacc.txt (CHIAVE_TAB_CAM)\n",
                                  "(CHIAVE_TAB_CAM) VariabiliLavorazione -> lav*.tab"
                                 )
                           )
                 }
             }
         }
      if (display_debug > 0)
         {
          DISPLAY2(STRCAT("-DISPLAY DEBUG KFRF-nKEY-",  STR(idx_MdF_Var), "\n ",
                          kriga, "-> valore_Var_Tab=", var_val, "\n",
                          "valore_Evalizzato=", var_val_gl
                         )
                  )
         }

      DEL_VAR(-1, STRCAT("mdf_wk_", var_name, STR(nReg)))
   }

   PROCEDURA MdF_VAL_VAR_RegFacc
   {
      mdf_val_var_simple = 0

      if (IS_MATCH(var_name, "p*") )
         {
          if ( ATOI(var_val) != 0
             & STRLEN(var_val) <= 3
             & STR_INDEX_OF(var_val, 0, "*") == -1
             & STR_INDEX_OF(var_val, 0, "+") == -1
             & STR_INDEX_OF(var_val, 0, "-") == -1
             & STR_INDEX_OF(var_val, 0, "/") == -1
             )
             { mdf_val_var_simple = 1 }
         }
      else
         {
          if ( ATOI(var_val) != 0
             & STRLEN(var_val) <= 4
             & STR_INDEX_OF(var_val, 0, "*") == -1
             & STR_INDEX_OF(var_val, 0, "+") == -1
             & STR_INDEX_OF(var_val, 0, "-") == -1
             & STR_INDEX_OF(var_val, 0, "/") == -1
             )
             { mdf_val_var_simple = 2 }
         }

      if (STRCMP(var_val, "0") == 0)  { mdf_val_var_simple = 3 }

      if (mdf_val_var_simple > 0)
         {
          VAR_CREATE_NUM(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)), ATOI(var_val), 0, "")
          EXITSUB()
         }

      retEval = EVAL(STRCAT("$mdf_wk_", var_name, STR(nReg),"=",var_val))
      var_gl = STRCAT("mdf_wk_", var_name, STR(nReg))
      var_val_gl = VAR_VAL(-1, var_gl)

      // 11.04.2024
      //if (VAR_EXIST(idx_RegF, "Mdf_Count_EVAL_MdF_VAL_VAR_RegFacc") != 1)
      //   { Mdf_Count_EVAL_MdF_VAL_VAR_RegFacc = 1 }
      //Mdf_Count_EVAL_MdF_VAL_VAR_RegFacc = Mdf_Count_EVAL_MdF_VAL_VAR_RegFacc+1

      if (retEval != -1)
         { VAR_CREATE_NUM(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)), var_val_gl, 0, "") }
      else
         {
          if (VAR_EXIST(-1, "MdF_display_err") != 1)  { $MdF_display_err = -1 }
          $MdF_display_err = $MdF_display_err+1
          if (VAR_VAL(-1, "MdF_display_err") < 3)
             {
              DISPLAY2(STRCAT("MDF-Error ( ", STR($MdF_display_err) ," ) PARSING Regola_", STR(nReg), " tipoLav=", tLav, "\n variabile->", var_name, "=", var_val, "\n\n",
                              "Elemento ", NOME(idx_Fro), " idx_RegF=", STR(idx_RegF), "\n",
                              "Controllare esistenza variabili su VariabiliMdF.txt, togliere gli spazi;\n",
                              "usare SE_STR se risultato è stringa, SE_NUM se risultato è numerico\n",
                              "Controllare la corretta configurazione anche dei campi di riga precedenti\n\n",
                              "Se il problema è su DTP_AliasScocca controllare VariabiliDaTipoPadri.txt archetipo=", NOME(PADRE(idx_Fro,-1)), "\n\n",
                              "FLUSSO DATI: \n",
                              "Alias CamMdFrontali -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt (Configurare MdF_Apertura) -> KeyFamRegFacc.txt \n",
                              "Vengono aggiunti gli MdF_ -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt -> RegFacc.txt (CHIAVE_TAB_CAM)\n",
                              "(CHIAVE_TAB_CAM) VariabiliLavorazione -> lav*.tab"
                             )
                       )
             }

          VAR_CREATE_STR(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg), "_Err"), var_val, 0, "")
         }
      //DEL_VAR(-1, STRCAT("mdf_wk_", var_name, "*"))
      DEL_VAR(-1, STRCAT("mdf_wk_", var_name, STR(nReg)))
   }

   PROCEDURA MdF_VAL_VAR_RegFaccTemp
   {
      mdf_VAL_VAR_RegFaccTemp = -1.111
      mdf_val_var_simple = 0

      if (IS_MATCH(var_name, "p*") )
         {
          if ( ATOI(var_val) != 0
             & STRLEN(var_val) <= 3
             & STR_INDEX_OF(var_val, 0, "*") == -1
             & STR_INDEX_OF(var_val, 0, "+") == -1
             & STR_INDEX_OF(var_val, 0, "-") == -1
             & STR_INDEX_OF(var_val, 0, "/") == -1
             )
             { mdf_val_var_simple = 1 }
         }
      else
         {
          if ( ATOI(var_val) != 0
             & STRLEN(var_val) <= 4
             & STR_INDEX_OF(var_val, 0, "*") == -1
             & STR_INDEX_OF(var_val, 0, "+") == -1
             & STR_INDEX_OF(var_val, 0, "-") == -1
             & STR_INDEX_OF(var_val, 0, "/") == -1
             )
             { mdf_val_var_simple = 2 }
         }

      if (STRCMP(var_val, "0") == 0)  { mdf_val_var_simple = 3 }

      if (mdf_val_var_simple > 0)
         {
          //VAR_CREATE_NUM(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)), ATOI(var_val), 0, "")
          mdf_VAL_VAR_RegFaccTemp = ATOI(var_val)
          EXITSUB()
         }

      retEval = EVAL(STRCAT("$mdf_wk_", var_name, STR(nReg),"=",var_val))
      var_gl = STRCAT("mdf_wk_", var_name, STR(nReg))
      var_val_gl = VAR_VAL(-1, var_gl)

      // 11.04.2024
      //if (VAR_EXIST(idx_RegF, "Mdf_Count_EVAL_MdF_VAL_VAR_STR_RegFaccTemp") != 1)
      //   { Mdf_Count_EVAL_MdF_VAL_VAR_STR_RegFaccTemp = 1 }
      //Mdf_Count_EVAL_MdF_VAL_VAR_STR_RegFaccTemp = Mdf_Count_EVAL_MdF_VAL_VAR_STR_RegFaccTemp+1

      if (retEval != -1)
         {
          //VAR_CREATE_NUM(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg)), var_val_gl, 0, "")
          mdf_VAL_VAR_RegFaccTemp = var_val_gl
         }
      else
         {
          if (VAR_EXIST(-1, "MdF_display_err") != 1)  { $MdF_display_err = -1 }
          $MdF_display_err = $MdF_display_err+1
          if (VAR_VAL(-1, "MdF_display_err") < 3)
             {
              DISPLAY2(STRCAT("MDF-Error ( ", STR($MdF_display_err) ," ) PARSING Regola_", STR(nReg), " tipoLav=", tLav, "\n variabile->", var_name, "=", var_val, "\n\n",
                              "Elemento ", NOME(idx_Fro), " idx_RegF=", STR(idx_RegF), "\n",
                              "Controllare esistenza variabili su VariabiliMdF.txt, togliere gli spazi;\n",
                              "usare SE_STR se risultato è stringa, SE_NUM se risultato è numerico\n",
                              "Controllare la corretta configurazione anche dei campi di riga precedenti\n\n",
                              "Se il problema è su DTP_AliasScocca controllare VariabiliDaTipoPadri.txt archetipo=", NOME(PADRE(idx_Fro,-1)), "\n\n",
                              "FLUSSO DATI: \n",
                              "Alias CamMdFrontali -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt (Configurare MdF_Apertura) -> KeyFamRegFacc.txt \n",
                              "Vengono aggiunti gli MdF_ -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt -> RegFacc.txt (CHIAVE_TAB_CAM)\n",
                              "(CHIAVE_TAB_CAM) VariabiliLavorazione -> lav*.tab"
                             )
                       )
             }

          VAR_CREATE_STR(idx_RegF, STRCAT(var_name, "_", tLav, STR(nReg), "_Err"), var_val, 0, "")
         }
      DEL_VAR(-1, STRCAT("mdf_wk_", var_name, STR(nReg)))
   }

   PROCEDURA MdF_CtrlVersioni
   {
      var_name = "Versione_New_Order"
      var_val = TABLE_FIELD_AT(table_CVer, kriga, var_name)

      if (STRLEN(var_val) > 4)
         {
          GOSUB MdF_VAL_VAR_STR_RegFacc

          var_name_Ver = STRCAT(var_name, "_", tLav, STR(nReg))
          if ( STRLEN(VAR_VAL_STR(idx_RegF, var_name_Ver)) > 4
             & VAR_EXIST(-1, "VAR_Versione_CAM_inc_New_Order")
             )
             {
              $mdf_dataRif = VAR_VAL_STR(idx_RegF, var_name_Ver)
              $mdf_dataAtt = $VAR_Versione_CAM_inc_New_Order
              GOSUB MdF_VerificaVersione
              if ($mdf_dataAtt_Magg <= 0)
                 { VAR_CREATE_STR(idx_RegF, name_var_Escludi, $mdf_dataRif, 0, "") }
             }
         }

      var_name = "Versione_Last_Term"
      var_val = TABLE_FIELD_AT(table_CVer, kriga, var_name)
      if (STRLEN(var_val) > 4)
         {
          GOSUB MdF_VAL_VAR_STR_RegFacc

          var_name_Ver = STRCAT(var_name, "_", tLav, STR(nReg))
          if ( STRLEN(VAR_VAL_STR(idx_RegF, var_name_Ver)) > 4
             & VAR_EXIST(-1, "VAR_Versione_CAM_inc_Last_Term")
             )
             {
              $mdf_dataRif = VAR_VAL_STR(idx_RegF, var_name_Ver)
              $mdf_dataAtt = $VAR_Versione_CAM_inc_Last_Term
              GOSUB MdF_VerificaVersione
              if ($mdf_dataAtt_Magg <= 0)
                 { VAR_CREATE_STR(idx_RegF, name_var_Escludi, $mdf_dataRif, 0, "") }
             }
         }
   }

   PROCEDURA MdF_VerificaVersione
   {
      //Ritorna $mdf_dataAtt_Magg=1 se dataAtt è >= di dataRif

      $mdf_dataAtt_Magg=0

      $mdf_RifAnno = ATOI(STRMID(0, 2, $mdf_dataRif))
      $mdf_RifMese = ATOI(STRMID(2, 2, $mdf_dataRif))
      $mdf_RifGior = ATOI(STRMID(4, 2, $mdf_dataRif))
      $mdf_RifLett = STRMID(6, 1, $mdf_dataRif)

      $mdf_InsAnno = ATOI(STRMID(0, 2, $mdf_dataAtt))
      $mdf_InsMese = ATOI(STRMID(2, 2, $mdf_dataAtt))
      $mdf_InsGior = ATOI(STRMID(4, 2, $mdf_dataAtt))
      $mdf_InsLett = STRMID(6, 1, $mdf_dataAtt)

      if ($mdf_InsAnno > $mdf_RifAnno)
         { $mdf_dataAtt_Magg=1 }
      else
         {
          if ( $mdf_InsAnno == $mdf_RifAnno
             & $mdf_InsMese > $mdf_RifMese
             )
             { $mdf_dataAtt_Magg=1 }
          else
             {
              if ( $mdf_InsAnno == $mdf_RifAnno
                 & $mdf_InsMese == $mdf_RifMese
                 & $mdf_InsGior > $mdf_RifGior
                 )
                 { $mdf_dataAtt_Magg=1 }
              else
                 {
                  if ( $mdf_InsAnno == $mdf_RifAnno
                     & $mdf_InsMese == $mdf_RifMese
                     & $mdf_InsGior == $mdf_RifGior
                     & STRCMP($mdf_InsLett, $mdf_RifLett) >= 0
                     )
                     { $mdf_dataAtt_Magg=1 }
                 }
             }
         }
   }

   PROCEDURA MdF_Variabili
   {
      if (ACTION() == 1064)  { EXITSUB() }

      if (VAR_VAL(idx_MdF_Var, "mdf_ricalc_Post_READD") > 0)  { EXITSUB() }

      if (IS_MATCH(NOME(idx_MdF_Var), "MdF_*") )
         {
          if ( ACTION() == 1 & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1
             & VAR_VAL(idx_MdF_Var, "mdf_prosegui_action1") <= 0
             // 04.04.2025 A24595 Con Ottimizzazioni visto che ho mdf_ctrl_Change_Var_CAM, se >= 1 deve passare sempre e comunque
             // 0.5 è se Apertura vuota, 0.9 se non esiste, quindi deve essere < 1
             & VAR_VAL(idx_att, "mdf_ctrl_Change_Var_CAM") < 1
             )
             { EXITSUB() }
         }

      Mdf_Table_Loc = $MdF_TABLE_Var
      if ($MdF_TABLE_Var < 0)
         {
          GOSUB MdF_path_CAMTAB
          $MdF_TABLE_Var = TABLE_OPEN(STRCAT($path_CAMTABMDF, "VariabiliMdF.txt"))
          if (VAR_VAL(-1, "CAM_Visualize") > 0  |  VAR_VAL(-1, "CAM_CloseOpenTab") > 1)
             {
              if ($MdF_TABLE_Var >= 0)
                 {
                  TABLE_CLOSE($MdF_TABLE_Var)
                  $MdF_TABLE_Var = TABLE_OPEN(STRCAT($path_CAMTABMDF, "VariabiliMdF.txt"))
                 }
             }
          Mdf_Table_Loc = $MdF_TABLE_Var
          if ($MdF_TABLE_Var < 0)
             {
              DISPLAY2(STRCAT("Tabella CAM ", $path_CAMTABMDF, " VariabiliMdF.txt NON Aperta!"))
              EXITSUB()
             }
         }

  // 11.04.2024
  //DISPLAY2(STRCAT("VariabiliMdF.txt ", CHIAVE_TABVAR_MDF, " idx=", STR(idx_MdF_Var)))

      // Eventualmente ricordarsi di fare DEL_VAR MCB_collY_sposta_Sup_2 su VariabiliMdF.txt

      iV = 1
      chiave_n = STRCAT(CHIAVE_TABVAR_MDF, "_", STR(iV))
      nome_Var_Bdm = TABLE_FIELD_AT($MdF_TABLE_Var, chiave_n, "NOME_VAR_BDM")

      if (STRLEN(nome_Var_Bdm) > 0)  { $MdF_CntEntry_TABLE_Var = $MdF_CntEntry_TABLE_Var+1 }

      mdf_entry_MdF_Variabili_test = 0

      while (STRLEN(nome_Var_Bdm) > 0)
         {
          mdf_entry_MdF_Variabili_test = 1
          EscTab_VMdF = TABLE_FIELD_AT($MdF_TABLE_Var, chiave_n, "ESCLUDI_VMDF")
          valore_DaEvalizzare = EscTab_VMdF
          //if (IS_MATCH(EscTab_VMdF, STRCAT("", APICI(), "*")) )
          //   {
          //    valore_DaEvalizzare = STRMID(1,STRLEN(valore_DaEvalizzare)-2,valore_DaEvalizzare)
          //   }
          var_name = "Escludi_VMDF"
          mdf_glob_escludi_VMDF = STRMID(1,STRLEN(valore_DaEvalizzare)-2,valore_DaEvalizzare)
          if (STRLEN(EscTab_VMdF) > 4)  { EVAL(STRCAT("mdf_glob_escludi_VMDF=", EscTab_VMdF)) }
          // Creo la variabile solo se il valore non è corretto per fare la gestione errori
          if (STRLEN(mdf_glob_escludi_VMDF) > 4)  { GOSUB MdF_VAL_VAR_STR }

          //if (STRCMP(UPPER(VAR_VAL_STR(idx_MdF_Var, "Escludi_VMDF")), "NO") == 0)
          if (STRCMP(UPPER(mdf_glob_escludi_VMDF), "NO") == 0)
             {
              if (STRCMP(nome_Var_Bdm, "-") != 0)
                 {
                  livello_Var = TABLE_FIELD_AT($MdF_TABLE_Var, chiave_n, "LIVELLO_VAR")

                  if (IS_MATCH(livello_Var, "VAL(*") )
                     {
                      nome_Var_livello_Var = STRMID(4, STRLEN(livello_Var)-5, livello_Var)
                      livello_Var = STR(VAR_VAL(idx_MdF_Var, nome_Var_livello_Var))
                     }

                  if (IS_MATCH(nome_Var_Bdm, "VAL(*") )
                     {
                      nome_Var_Bdm_Val = STRMID(4, STRLEN(nome_Var_Bdm)-5, nome_Var_Bdm)
                      nome_Var_Bdm = VAR_VAL_STR(idx_MdF_Var, nome_Var_Bdm_Val)
                     }

                  mdf_tipo_Var = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "TIPO_VAR")
                  tipo_Var = ATOI(mdf_tipo_Var)
                  if (STRCMP(mdf_tipo_Var, "NUMERIC") == 0)  { tipo_Var = 0 }
                  if (STRCMP(mdf_tipo_Var, "STRING") == 0)   { tipo_Var = 1 }

                  livello_ToCtrl = ATOI(livello_Var)
                  idx_MToCtrl = PADRE(idx_MdF_Var, livello_ToCtrl)
                 // 28.06.2024 Strano non ci fosse mai stato bisogno. Forse perchè utilizzando AliasCamMdFrontali si risolveva sempre
                  if ( STRCMP(livello_Var, "0") == 0
                     | STRCMP(livello_Var, "KEY_LEVEL") == 0
                     )
                     { idx_MToCtrl = idx_MdF_Var }

                  GOSUB MdF_Var_PrimoTrovato
                  GOSUB MdF_Var_Alias
                  GOSUB MdF_Var_FindAllCmp
                  GOSUB MdF_Var_FindAllCmpXXXn
                  GOSUB MdF_Var_FindAllBroth
                  GOSUB MdF_Var_FindAllBrothXXXn

                  funzione_Cam = TABLE_FIELD_AT($MdF_TABLE_Var, chiave_n, "FUNZIONE")
                  if (STRLEN(funzione_Cam) > 1)
                     {
                      $MdF_Sub_TabM4_Var = funzione_Cam
                      GOSUB $MdF_Sub_TabM4_Var
                     }

                  // Se c'è EXIST controllo che la variabile trovata sia di tipo TIPO_VAR
                  // anche se c'è già sulla gestione MdF_Var_PrimoTrovato perché
                  // se per caso non la trovo in nessun padre ma sull' elemento che sto
                  // analizzando ho la variabile ma di tipo errato allora prenderebbe quella
                  // Difficilmente c'è una variabile che in un elemento è stringa e in un
                  // altro è numerica, purtroppo accade alcune volte con la variabile Verso
                  if (STRCMP(TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "VALORE_VAR"), "EXIST") != 0)
                     {
                      if (VAR_EXIST(idx_MToCtrl, nome_Var_Bdm) )
                         {
                          if (VAR_TYPE(idx_MToCtrl, nome_Var_Bdm) == 1)
                             { tipo_Var = 1 }
                         }
                     }

                  val_Var_Bdm = VAR_VAL_STR(idx_MToCtrl, nome_Var_Bdm)
                  if (tipo_Var == 0)
                     { val_Var_Bdm = VAR_VAL(idx_MToCtrl, nome_Var_Bdm) }

                  GOSUB MdF_Var_Valido

                  mdf_tipo_var_tab = mdf_tipo_Var
                  GOSUB MdF_Var_DescVal
                  GOSUB MdF_Var_Exist

                  nome_MdF_Var = TABLE_FIELD_AT($MdF_TABLE_Var, chiave_n, "NOME_VAR_MDF")
                  pref_MdF_Var = TABLE_FIELD_AT($MdF_TABLE_Var, chiave_n, "PREFISSO_VAR")
                  if (STRLEN(nome_MdF_Var) > 1)
                     {
                      nome_MdF_Var = STRCAT(pref_MdF_Var, nome_MdF_Var)

                      mdf_Componenti2 = 0
                      mdf_NearGlobale = 0
                      mdf_livello_var = 0
                      if (IS_MATCH(mdf_tipo_var_tab, "COMPONENTI*") == 1)  { GOSUB MdF_Var_COMPONENTI23 }
                      if (STRCMP(mdf_tipo_var_tab, "NEAR_GLOBALE") == 0)   { GOSUB MdF_Var_NEAR_GLOBALE }
                      if (STRCMP(mdf_tipo_var_tab, "NEAR_GLOBALE2") == 0)  { GOSUB MdF_Var_NEAR_GLOBALE2 }
                      // 27.06.2024
                      if (STRCMP(mdf_tipo_var_tab, "NEAR_GLOBALE3") == 0)  { GOSUB MdF_Var_NEAR_GLOBALE3 }
                      if (STRCMP(mdf_tipo_var_tab, "NEAR_GLOBALESX") == 0) { GOSUB MdF_Var_NEAR_GLOBALESX }
                      if (STRCMP(mdf_tipo_var_tab, "NEAR_GLOBALEDX") == 0) { GOSUB MdF_Var_NEAR_GLOBALEDX }
                      if (STRCMP(mdf_tipo_var_tab, "LIVELLO_VAR") == 0)    { GOSUB MdF_Var_LIVELLO_VAR }
                      if (STRCMP(mdf_tipo_var_tab, "READTAB") == 0)        { GOSUB MdF_Var_READTAB }
                      // 07.11.2024
                      if (STRCMP(mdf_tipo_var_tab, "POINT") == 0)          { GOSUB MdF_Var_Point }

                      if ( mdf_Componenti2 == 0  &  mdf_NearGlobale == 0  &  mdf_livello_var == 0
                         & STRCMP(mdf_tipo_var_tab, "POINT") != 0
                         )
                         {
                          if (tipo_Var == 1)
                             {
                              VAR_CREATE_STR(idx_MdF_Var, nome_MdF_Var, val_Var_Bdm, 0, "")
                              // Così mi crea una variabile globale ma senza dollaro e in keyFamRegFacc
                              // funziona sia se entra la
                              // MdF_CamMdFrontali che prende tutte le strutture CamMdFrontali
                              // sia se entra la
                              // MdF_AttrezzaRegFacc che entra dai Controlli di ogni CamMdFrontali
                              // 11.04.2024
                              if (ATTUALE() == -1)
                                 { retEvalVar = EVAL(STRCAT(nome_MdF_Var, "=", APICI(), val_Var_Bdm, APICI())) }
                              // 11.04.2024 Non e' più usata
                              //if (IS_IDX($MdF_AttrezzaRegFacc))
                              //   {
                              //    if (IS_MATCH(nome_MdF_Var, "CHIAVE_*") )
                              //       { retEvalDel = EVAL(STRCAT("del_var_CHIAVE=", APICI(), nome_MdF_Var, APICI())) }
                              //   }
                             }
                          else
                             {
                              VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, val_Var_Bdm, 0, "")
                              // 11.04.2024
                              if (ATTUALE() == -1)
                                 { retEvalVar = EVAL(STRCAT(nome_MdF_Var, "=", STR(val_Var_Bdm))) }
                             }
                         }
                     }
                 }
              else
                 {
                  mdf_tipo_Var = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "TIPO_VAR")
                  tipo_Var = ATOI(mdf_tipo_Var)
                  if (STRCMP(mdf_tipo_Var, "NUMERIC") == 0)  { tipo_Var = 0 }
                  if (STRCMP(mdf_tipo_Var, "STRING") == 0)   { tipo_Var = 1 }
                  if (STRCMP(mdf_tipo_Var, "POINT") == 0)    { tipo_Var = 2 }
                  if (STRCMP(mdf_tipo_Var, "DISTANZA") == 0) { tipo_Var = 0.1 }

                  funzione_Cam = TABLE_FIELD_AT($MdF_TABLE_Var, chiave_n, "FUNZIONE")
                  if (STRLEN(funzione_Cam) > 1)
                     {
                      $MdF_Sub_TabM4_Var = funzione_Cam
                      GOSUB $MdF_Sub_TabM4_Var
                     }

                  valore_Var = TABLE_FIELD_AT($MdF_TABLE_Var, chiave_n, "VALORE_VAR")

                  if (STR_INDEX_OF(valore_Var, 0, "DISPLAY2(") > -1)
                     {
                      valore_Var = STRMID(9, STRLEN(valore_Var)-10, valore_Var)
                     }

                  valore_DaEvalizzare = valore_Var

                  nome_MdF_Var = TABLE_FIELD_AT($MdF_TABLE_Var, chiave_n, "NOME_VAR_MDF")
                  pref_MdF_Var = TABLE_FIELD_AT($MdF_TABLE_Var, chiave_n, "PREFISSO_VAR")
                  if (STRLEN(nome_MdF_Var) > 1)
                     {
                      nome_MdF_Var = STRCAT(pref_MdF_Var, nome_MdF_Var)
                     }
                  var_name = nome_MdF_Var
                  if (tipo_Var == 1)
                     {
                      GOSUB MdF_VAL_VAR_STR
                      // Così mi crea una variabile globale ma senza dollaro e in keyFamRegFacc
                      // funziona sia se entra la
                      // MdF_CamMdFrontali che prende tutte le strutture CamMdFrontali
                      // sia se entra la
                      // MdF_AttrezzaRegFacc che entra dai Controlli di ogni CamMdFrontali
                      // 11.04.2024
                      if (ATTUALE() == -1)
                         { retEvalVar = EVAL(STRCAT(var_name, "=", valore_DaEvalizzare)) }
                      // 11.04.2024 Non e' più usata
                      //if (IS_IDX($MdF_AttrezzaRegFacc))
                      //   {
                      //    if (IS_MATCH(nome_MdF_Var, "CHIAVE_*") )
                      //       { retEvalDel = EVAL(STRCAT("del_var_CHIAVE=", APICI(), nome_MdF_Var, APICI())) }
                      //   }
                     }
                  if (tipo_Var == 0)
                     {
                      // 11.04.2024
                      mdf_NoSort_Glob = 0
                      if ( ATTUALE() == -1
                         & STR_INDEX_OF(valore_DaEvalizzare, 0 , "SORT") > -1
                         )
                         { mdf_NoSort_Glob = 1 }

                      // 08.11.2024 Con MdF_Var_Point puo rimanere com' era
                      //if (mdf_NoSort_Glob == 0)
                      //   {
                          GOSUB MdF_VAL_VAR
                          if (ATTUALE() == -1)
                             { retEvalVar = EVAL(STRCAT(var_name, "=", valore_DaEvalizzare)) }
                      //   }

                      //if (STR_INDEX_OF(valore_DaEvalizzare, 0 , "SORT") > -1)
                      //   {
                      //    valore_Var_sort011 = STRMID(0, 11, valore_DaEvalizzare)
                      //    valore_Var_sort12n = STRMID(11, STRLEN(valore_DaEvalizzare)-1, valore_DaEvalizzare)
                      //
                      //    valore_DaEvalizzareSort = STRCAT(valore_Var_sort011, "$", valore_Var_sort12n)
                      //    //DISPLAY2(valore_DaEvalizzareSort)
                      //   }
                      //if (mdf_NoSort_Glob == 1)
                      //   {
                      //    // il SORT_POINT se in ATTUALE() -1 ha bisogno che le variabili abbiano il $
                      //    //retEvalVar = EVAL(STRCAT(var_name, "=", valore_DaEvalizzareSort))
                      //    retEvalVar = EVAL(STRCAT(var_name, "=", valore_DaEvalizzare))
                      //   }
                     }
                  if (tipo_Var == 2)
                     {
                      //if ( ATTUALE() != -1
                      //   | HAS_ALIAS(idx_MdF_Var, "CamMdF*") == 1
                      //   )
                      //   { GOSUB MdF_VAL_VAR_Point_Ute }
                      GOSUB MdF_VAL_VAR_Point_Ute

                      //retEvalVar = EVAL(STRCAT(var_name, "=", valore_DaEvalizzare))
                     }
                  if (tipo_Var == 0.1)
                     {
                      // comprende EVAL in ATTUALE() -1
                      GOSUB MdF_VAL_VAR_DISTANZA
                     }
                 }
             }

          chiave_n = STRCAT(CHIAVE_TABVAR_MDF, "_", STR(iV))
          nome_Var_Bdm = TABLE_FIELD_AT($MdF_TABLE_Var, chiave_n, "NOME_VAR_BDM")

          iV = iV+1
         }

      if (VAR_VAL(-1, "CAM_Visualize") > 0  |  VAR_VAL(-1, "CAM_CloseOpenTab") > 1)
         {
          if (mdf_entry_MdF_Variabili_test > 0)
             {
              if (VAR_EXIST(idx_MdF_Var, "mdf_entry_MdF_Variabili") != 1)
                 { VAR_CREATE_NUM(idx_MdF_Var, "mdf_entry_MdF_Variabili", 1, 0, "") }
              else
                 {
                  mdf_entry_MdF_Variabili = VAR_VAL(idx_MdF_Var, "mdf_entry_MdF_Variabili")+1
                  VAR_CREATE_NUM(idx_MdF_Var, "mdf_entry_MdF_Variabili", mdf_entry_MdF_Variabili, 0, "")
                 }
             }
         }

      //DISPLAY2(STRCAT("idx_MdF_Var=", STR(idx_MdF_Var), " mdf_entry_MdF_Variabili=", STR(VAR_VAL(idx_MdF_Var, "mdf_entry_MdF_Variabili"))))
   }

   PROCEDURA MdF_VariabiliDaTipoPadri
   {
      if (ACTION() == 1064)  { EXITSUB() }

      if (VAR_VAL(idx_MdF_Var, "mdf_ricalc_Post_READD") > 0)  { EXITSUB() }

      if (IS_MATCH(NOME(idx_MdF_Var), "MdF_*") )
         {
          if ( ACTION() == 1 & IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1
             & VAR_VAL(idx_MdF_Var, "mdf_prosegui_action1") <= 0
             )
             { EXITSUB() }
         }

     // 12.06.2018
      // Se ho già fatto il CAM quindi MdF_Load_att=OnMacroCAM e inserisco un elemento che ha GOSUB MdF_AttrezzaRegFacc
      // ed ho CAM_Visualize>0 in pratica il CAM_Standard.inc fa CLOSE e OPEN della stessa tabella
      // e quindi avendo lo stesso nome mi chiude anche qui, quindi devo riaprirla
      // il TABLE_FIELD_AT non da errore perché $MdF_TABLE_Var_DTP sarebbe valido, però la tabella in realtà non è accessibile
      // In ogni caso è solo per debug
      // dovrebbe entrare da MdF_AttrezzaRegFacc per MdF_Load_att=OnMacroCAM, ACTION=2, CAM_Visualize>0 e se non esiste Mdf_Table_Loc su idx_MdF_Var
      Mdf_Table_Loc = $MdF_TABLE_Var_DTP
      if ( $MdF_TABLE_Var_DTP < 0
         | VAR_VAL(-1, "CAM_Visualize") > 0  |  VAR_VAL(-1, "CAM_CloseOpenTab") > 0
         )
         {
          GOSUB MdF_path_CAMTAB
          $MdF_TABLE_Var_DTP = TABLE_OPEN(STRCAT($path_CAMTABMDF, "VariabiliDaTipoPadri.txt"))
          if (VAR_VAL(-1, "CAM_Visualize") > 0  |  VAR_VAL(-1, "CAM_CloseOpenTab") > 1)
             {
              if ($MdF_TABLE_Var_DTP >= 0)
                 {
                  TABLE_CLOSE($MdF_TABLE_Var_DTP)
                  $MdF_TABLE_Var_DTP = TABLE_OPEN(STRCAT($path_CAMTABMDF, "VariabiliDaTipoPadri.txt"))
                 }
             }
          Mdf_Table_Loc = $MdF_TABLE_Var_DTP
          if (Mdf_Table_Loc < 0)  { EXITSUB() }
         }

      iP = 1
      if (VAR_VAL(-1, "CAM_Visualize") > 99)  { COMANDO2(STRCAT("LOGMSG { MdF_VariabiliDaTipoPadri ", DATA(0))) }
      while (PADRE(idx_MdF_Var, -1) != PADRE(idx_MdF_Var, iP) )
         {
          iP = iP+1
         }
      dtp_num_padri = iP
      if (PADRE(idx_MdF_Var, -1) == idx_MdF_Var)  { dtp_num_padri = 0 }

      // 0 prende anche l' elemento stesso
      // Parto dal padre piu esterno e vado all' interno così se devo sovrascrivere una variabile
      // per dettagliare un elemento poso farlo in modo corretto
      iP = dtp_num_padri
      iV = 1
      nchar_key = 3
      mdf_Var_To_chiave = NOME(PADRE(idx_MdF_Var, 1))
      if (iP == 0)  { mdf_Var_To_chiave = NOME(idx_MdF_Var) }
      chiave_n = STRCAT(STRMID(0, nchar_key, mdf_Var_To_chiave), "_", STR(iV))
      nome_Var_Bdm = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_BDM")
      if (VAR_VAL(-1, "CAM_Visualize") > 99)  { COMANDO2(STRCAT("LOGMSG MdF_VariabiliDaTipoPadri prima di while NOME ", DATA(0))) }

      mdf_entry_Var_DTP = 0
      // CICLO per NOME PADRI
      while (iP >= 0)
         {
          //DISPLAY2(STRCAT("iNIZIO=", NOME(idx_MdF_Var), " nchar_key=", STR(nchar_key), " nome_Var_Bdm=", nome_Var_Bdm))
          //DISPLAY2(STRCAT("pdr=", STR(PADRE(idx_MdF_Var, iP)), " menouno=", STR(PADRE(idx_MdF_Var, -1))))
          // Come chiave cerco il nome del padre partendo dal terzo carattere
          // se non trovo proseguo aggiungendo un carattere alla volta
          while (nchar_key <= STRLEN(mdf_Var_To_chiave) )
             {
              chiave_n_DTP_nome = chiave_n
              //DISPLAY2(STRCAT("chiave_n_DTP=", chiave_n_DTP))
              while (STRLEN(nome_Var_Bdm) > 0)
                 {
                  mdf_entry_Var_DTP = 1
                  chiave_n_DTP_nome_int = chiave_n
                  //DISPLAY2(STRCAT("chiave_n_DTP_interna=", chiave_n_DTP_interna))
                  EscRigaTab = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "ESCLUDI_RIGA")
                  valore_DaEvalizzare = EscRigaTab
                  var_name = "Escludi_Riga"

                  mdf_glob_escludi_Riga = STRMID(1,STRLEN(valore_DaEvalizzare)-2,valore_DaEvalizzare)
                  if (STRLEN(EscRigaTab) > 4)  { EVAL(STRCAT("mdf_glob_escludi_Riga=", EscRigaTab)) }
                  // Creo la variabile solo se il valore non è corretto per fare la gestione errori
                  if (STRLEN(mdf_glob_escludi_Riga) > 4)  { GOSUB MdF_VAL_VAR_STR }

                  //if (STRCMP(UPPER(VAR_VAL_STR(idx_MdF_Var, "Escludi_Riga")), "NO") == 0)
                  if (STRCMP(UPPER(mdf_glob_escludi_Riga), "NO") == 0)
                     {
                      GOSUB MdF_CreaVariabileDaTipoPadri
                     }

                  mdf_Var_To_chiave = NOME(PADRE(idx_MdF_Var, iP))
                  if (iP == 0)  { mdf_Var_To_chiave = NOME(idx_MdF_Var) }
                  chiave_n = STRCAT(STRMID(0, nchar_key, mdf_Var_To_chiave), "_", STR(iV+1))
                  nome_Var_Bdm = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_BDM")

                  iV = iV+1
                 }
              iV = 1
              // proseguo aggiungendo un carattere alla volta
              nchar_key = nchar_key+1
              mdf_Var_To_chiave = NOME(PADRE(idx_MdF_Var, iP))
              if (iP == 0)  { mdf_Var_To_chiave = NOME(idx_MdF_Var) }
              chiave_n = STRCAT(STRMID(0, nchar_key, mdf_Var_To_chiave), "_", STR(iV))
              nome_Var_Bdm = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_BDM")
             }
          nchar_key = 3
          iV = 1
          iP = iP-1
          mdf_Var_To_chiave = NOME(PADRE(idx_MdF_Var, iP))
          if (iP == 0)  { mdf_Var_To_chiave = NOME(idx_MdF_Var) }
          // Non faccio il ciclo se sono un MdF_ perché non ha senso che ci sia in VariabiliDaTipoPadri
          // così risparmio alcuni millesimi
          if (IS_MATCH(mdf_Var_To_chiave, "MdF_*") )    { iP = iP-1 }
          chiave_n = STRCAT(STRMID(0, nchar_key, mdf_Var_To_chiave), "_", STR(iV))
          nome_Var_Bdm = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_BDM")
         }

      // CICLO per cmp_name PADRI
      iP = dtp_num_padri
      iV = 1
      nchar_key = 3
      mdf_Var_To_chiave = VAR_VAL_STR(PADRE(idx_MdF_Var, iP), "cmp_name")
      if (iP == 0)  { mdf_Var_To_chiave = VAR_VAL_STR(idx_MdF_Var, "cmp_name") }
      chiave_n = STRCAT(STRMID(0, nchar_key, mdf_Var_To_chiave), "_", STR(iV))
      nome_Var_Bdm = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_BDM")

      if (VAR_VAL(-1, "CAM_Visualize") > 99)  { COMANDO2(STRCAT("LOGMSG MdF_VariabiliDaTipoPadri prima di while cmp_name ", DATA(0))) }
      while (iP >= 0)
         {
          // Come chiave cerco il cmp_name del padre partendo dal primo carattere
          // se non trovo proseguo aggiungendo un carattere alla volta
          while (nchar_key <= STRLEN(mdf_Var_To_chiave) )
             {
              chiave_n_DTP_cmp = chiave_n
              while (STRLEN(nome_Var_Bdm) > 0)
                 {
                  mdf_entry_Var_DTP = 2
                  chiave_n_DTP_cmp_int = chiave_n
                  EscRigaTab = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "ESCLUDI_RIGA")
                  valore_DaEvalizzare = EscRigaTab
                  var_name = "Escludi_Riga"

                  mdf_glob_escludi_Riga = STRMID(1,STRLEN(valore_DaEvalizzare)-2,valore_DaEvalizzare)
                  if (STRLEN(EscRigaTab) > 4)  { EVAL(STRCAT("mdf_glob_escludi_Riga=", EscRigaTab)) }
                  // Creo la variabile solo se il valore non è corretto per fare la gestione errori
                  if (STRLEN(mdf_glob_escludi_Riga) > 4)  { GOSUB MdF_VAL_VAR_STR }

                  if (STRCMP(UPPER(mdf_glob_escludi_Riga), "NO") == 0)
                     {
                      GOSUB MdF_CreaVariabileDaTipoPadri
                     }

                  mdf_Var_To_chiave = VAR_VAL_STR(PADRE(idx_MdF_Var, iP), "cmp_name")
                  if (iP == 0)  { mdf_Var_To_chiave = VAR_VAL_STR(idx_MdF_Var, "cmp_name") }
                  chiave_n = STRCAT(STRMID(0, nchar_key, mdf_Var_To_chiave), "_", STR(iV+1))
                  nome_Var_Bdm = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_BDM")

                  iV = iV+1
                 }
              iV = 1
              // proseguo aggiungendo un carattere alla volta
              nchar_key = nchar_key+1
              mdf_Var_To_chiave = VAR_VAL_STR(PADRE(idx_MdF_Var, iP), "cmp_name")
              if (iP == 0)  { mdf_Var_To_chiave = VAR_VAL_STR(idx_MdF_Var, "cmp_name") }
              chiave_n = STRCAT(STRMID(0, nchar_key, mdf_Var_To_chiave), "_", STR(iV))
              nome_Var_Bdm = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_BDM")
             }

          // Se non sono gia arrivato alla fine dei padri riparto con il prossimo padre
          nchar_key = 3
          iV = 1
          iP = iP-1
          mdf_Var_To_chiave = VAR_VAL_STR(PADRE(idx_MdF_Var, iP), "cmp_name")
          if (iP == 0)  { mdf_Var_To_chiave = VAR_VAL_STR(idx_MdF_Var, "cmp_name") }
          chiave_n = STRCAT(STRMID(0, nchar_key, mdf_Var_To_chiave), "_", STR(iV))
          nome_Var_Bdm = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_BDM")
         }

      // CICLO per GEST_CODICE PADRI
      iP = dtp_num_padri
      iV = 1
      nchar_key = 3
      mdf_Var_To_chiave = VAR_VAL_STR(PADRE(idx_MdF_Var, iP), "GEST_CODICE")
      if (iP == 0)  { mdf_Var_To_chiave = VAR_VAL_STR(idx_MdF_Var, "GEST_CODICE") }
      chiave_n = STRCAT(STRMID(0, nchar_key, mdf_Var_To_chiave), "_", STR(iV))
      nome_Var_Bdm = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_BDM")

      while (iP >= 0)
         {
          // Come chiave cerco il GEST_CODICE del padre partendo dal primo carattere
          // se non trovo proseguo aggiungendo un carattere alla volta
          while (nchar_key <= STRLEN(mdf_Var_To_chiave) )
             {
              chiave_n_DTP_cod = chiave_n
              while (STRLEN(nome_Var_Bdm) > 0)
                 {
                  mdf_entry_Var_DTP = 3
                  chiave_n_DTP_cod_int = chiave_n
                  EscRigaTab = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "ESCLUDI_RIGA")
                  valore_DaEvalizzare = EscRigaTab
                  var_name = "Escludi_Riga"

                  mdf_glob_escludi_Riga = STRMID(1,STRLEN(valore_DaEvalizzare)-2,valore_DaEvalizzare)
                  if (STRLEN(EscRigaTab) > 4)  { EVAL(STRCAT("mdf_glob_escludi_Riga=", EscRigaTab)) }
                  // Creo la variabile solo se il valore non è corretto per fare la gestione errori
                  if (STRLEN(mdf_glob_escludi_Riga) > 4)  { GOSUB MdF_VAL_VAR_STR }

                  //if (STRCMP(UPPER(VAR_VAL_STR(idx_MdF_Var, "Escludi_Riga")), "NO") == 0)
                  if (STRCMP(UPPER(mdf_glob_escludi_Riga), "NO") == 0)
                     {
                      GOSUB MdF_CreaVariabileDaTipoPadri
                     }

                  mdf_Var_To_chiave = VAR_VAL_STR(PADRE(idx_MdF_Var, iP), "GEST_CODICE")
                  if (iP == 0)  { mdf_Var_To_chiave = VAR_VAL_STR(idx_MdF_Var, "GEST_CODICE") }
                  chiave_n = STRCAT(STRMID(0, nchar_key, mdf_Var_To_chiave), "_", STR(iV+1))
                  nome_Var_Bdm = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_BDM")

                  iV = iV+1
                 }
              iV = 1
              // proseguo aggiungendo un carattere alla volta
              nchar_key = nchar_key+1
              mdf_Var_To_chiave = VAR_VAL_STR(PADRE(idx_MdF_Var, iP), "GEST_CODICE")
              if (iP == 0)  { mdf_Var_To_chiave = VAR_VAL_STR(idx_MdF_Var, "GEST_CODICE") }
              chiave_n = STRCAT(STRMID(0, nchar_key, mdf_Var_To_chiave), "_", STR(iV))
              nome_Var_Bdm = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_BDM")
             }

          // Se non sono gia arrivato alla fine dei padri riparto con il prossimo padre
          nchar_key = 3
          iV = 1
          iP = iP-1
          mdf_Var_To_chiave = VAR_VAL_STR(PADRE(idx_MdF_Var, iP), "GEST_CODICE")
          if (iP == 0)  { mdf_Var_To_chiave = VAR_VAL_STR(idx_MdF_Var, "GEST_CODICE") }
          chiave_n = STRCAT(STRMID(0, nchar_key, mdf_Var_To_chiave), "_", STR(iV))
          nome_Var_Bdm = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_BDM")
         }

      // Se entra un elemento Alias CamMdFrontali e non gli MdF_ entro in tabella perché può esser utile impostare
      // delle Variabili comuni a tutti i CamMdFrontali
      // Nel caso volessi fare la stessa cosa per gli MdF_ è già sufficiente inserire
      // in tabella MdF_1,2,..
      if (HAS_ALIAS(idx_MdF_Var, "CamMdFrontali") )
         {
          iP = 0
          iV = 1
          chiave_n = STRCAT("AliasCamMdFrontali_", STR(iV))
          nome_Var_Bdm = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_BDM")
          while (STRLEN(nome_Var_Bdm) > 0)
             {
              mdf_entry_Var_DTP = 4
              chiave_n_DTP_interna = chiave_n
              EscRigaTab = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "ESCLUDI_RIGA")
              valore_DaEvalizzare = EscRigaTab
              var_name = "Escludi_Riga"
              mdf_glob_escludi_Riga = STRMID(1,STRLEN(valore_DaEvalizzare)-2,valore_DaEvalizzare)
              if (STRLEN(EscRigaTab) > 4)  { EVAL(STRCAT("mdf_glob_escludi_Riga=", EscRigaTab)) }
              // Creo la variabile solo se il valore non è corretto per fare la gestione errori
              if (STRLEN(mdf_glob_escludi_Riga) > 4)  { GOSUB MdF_VAL_VAR_STR }

              //if (STRCMP(UPPER(VAR_VAL_STR(idx_MdF_Var, "Escludi_Riga")), "NO") == 0)
              if (STRCMP(UPPER(mdf_glob_escludi_Riga), "NO") == 0)
                 {
                  GOSUB MdF_CreaVariabileDaTipoPadri
                 }

              chiave_n = STRCAT("AliasCamMdFrontali_", STR(iV+1))
              nome_Var_Bdm = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_BDM")

              iV = iV+1
             }
         }
      if (mdf_entry_Var_DTP > 0)  { $MdF_CntEntry_TABLE_Var_DTP = $MdF_CntEntry_TABLE_Var_DTP+1 }

      if (VAR_VAL(-1, "CAM_Visualize") > 99)  { COMANDO2(STRCAT("LOGMSG } MdF_VariabiliDaTipoPadri ", DATA(0))) }
   }

   PROCEDURA MdF_CreaVariabileDaTipoPadri
   {
      if (VAR_VAL(-1, "CAM_Visualize") > 99)  { COMANDO2(STRCAT("LOGMSG { MdF_CreaVariabileDaTipoPadri ", DATA(0))) }
      if (STRCMP(nome_Var_Bdm, "-") != 0)
         {
          livello_Var_iniDTP = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "LIVELLO_VAR")
          livello_Var = livello_Var_iniDTP

          if (IS_MATCH(livello_Var, "VAL(*") )
             {
              nome_Var_livello_Var = STRMID(4, STRLEN(livello_Var)-5, livello_Var)
              livello_Var = STR(VAR_VAL(idx_MdF_Var, nome_Var_livello_Var))
             }

         if ( STRCMP(livello_Var, "-") == 0
            | STRCMP(livello_Var, "KEY_LEVEL") == 0
            )
            {
             livello_Var = STR(iP)
            }

          if (IS_MATCH(nome_Var_Bdm, "VAL(*") )
             {
              nome_Var_Bdm_Val = STRMID(4, STRLEN(nome_Var_Bdm)-5, nome_Var_Bdm)
              nome_Var_Bdm = VAR_VAL_STR(idx_MdF_Var, nome_Var_Bdm_Val)
             }

          mdf_tipo_Var = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "TIPO_VAR")
          tipo_Var = ATOI(mdf_tipo_Var)
          if (STRCMP(mdf_tipo_Var, "NUMERIC") == 0)  { tipo_Var = 0 }
          if (STRCMP(mdf_tipo_Var, "STRING") == 0)   { tipo_Var = 1 }

          if (VAR_VAL(-1, "CAM_Visualize") > 99)  { COMANDO2(STRCAT("LOGMSG MdF_CreaVariabileDaTipoPadri nome_Var_Bdm tipo_Var ", DATA(0))) }

          livello_ToCtrl = ATOI(livello_Var)
          idx_MToCtrl = PADRE(idx_MdF_Var, livello_ToCtrl)
          if (livello_ToCtrl == 0)  { idx_MToCtrl = idx_MdF_Var }
          GOSUB MdF_Var_PrimoTrovato
          GOSUB MdF_Var_Alias
          GOSUB MdF_Var_FindAllCmp
          GOSUB MdF_Var_FindAllCmpXXXn
          GOSUB MdF_Var_FindAllBroth
          GOSUB MdF_Var_FindAllBrothXXXn
          if (VAR_VAL(-1, "CAM_Visualize") > 99)  { COMANDO2(STRCAT("LOGMSG MdF_CreaVariabileDaTipoPadri nome_Var_Bdm idx_MToCtrl ", DATA(0))) }

          // Se c'è EXIST controllo che la variabile trovata sia di tipo TIPO_VAR
          // anche se c'è già sulla gestione MdF_Var_PrimoTrovato perché
          // se per caso non la trovo in nessun padre ma sull' elemento che sto
          // analizzando ho la variabile ma di tipo errato allora prenderebbe quella
          // Difficilmente c'è una variabile che in un elemento è stringa e in un
          // altro è nukerica, purtroppo accade alcune volte con la variabile Verso
          if (STRCMP(TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "VALORE_VAR"), "EXIST") != 0)
             {
              if (VAR_EXIST(idx_MToCtrl, nome_Var_Bdm) )
                 {
                  if (VAR_TYPE(idx_MToCtrl, nome_Var_Bdm) == 1)
                     { tipo_Var = 1 }
                 }
             }

          val_Var_Bdm = VAR_VAL_STR(idx_MToCtrl, nome_Var_Bdm)
          if (tipo_Var == 0)
             {
              val_Var_Bdm = VAR_VAL(idx_MToCtrl, nome_Var_Bdm)
             // 28.06.2024 Come CAM_Standard.inc
              if (STRCMP(nome_Var_Bdm, "idx_att") == 0)
                 {
                  if ( STRCMP(livello_Var_iniDTP, "KEY_LEVEL") == 0
                    // Per ora lo limito dato che non e' mai capitato su MdF_ ma dovrebbe andare sempre bene
                     & IS_MATCH(NOME(idx_MToCtrl), "Scocca*")
                     )
                     { val_Var_Bdm = idx_MToCtrl }
                 }
             }

          GOSUB MdF_Var_Valido

          mdf_tipo_var_tab = mdf_tipo_Var
          GOSUB MdF_Var_DescVal
          GOSUB MdF_Var_Exist

          nome_MdF_Var = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_CAM")
          pref_MdF_Var = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "PREFISSO_VAR")
          if (STRLEN(nome_MdF_Var) > 1)
             {
              nome_MdF_Var = STRCAT(pref_MdF_Var, nome_MdF_Var)

              mdf_Componenti2 = 0
              mdf_NearGlobale = 0
              mdf_livello_var = 0
              if (IS_MATCH(mdf_tipo_var_tab, "COMPONENTI*") == 1)  { GOSUB MdF_Var_COMPONENTI23 }
              if (STRCMP(mdf_tipo_var_tab, "NEAR_GLOBALE") == 0)   { GOSUB MdF_Var_NEAR_GLOBALE }
              if (STRCMP(mdf_tipo_var_tab, "NEAR_GLOBALE2") == 0)  { GOSUB MdF_Var_NEAR_GLOBALE2 }
              if (STRCMP(mdf_tipo_var_tab, "NEAR_GLOBALE3") == 0)  { GOSUB MdF_Var_NEAR_GLOBALE3 }
              if (STRCMP(mdf_tipo_var_tab, "NEAR_GLOBALESX") == 0) { GOSUB MdF_Var_NEAR_GLOBALESX }
              if (STRCMP(mdf_tipo_var_tab, "NEAR_GLOBALEDX") == 0) { GOSUB MdF_Var_NEAR_GLOBALEDX }
              if (STRCMP(mdf_tipo_var_tab, "LIVELLO_VAR") == 0)    { GOSUB MdF_Var_LIVELLO_VAR }
              if (STRCMP(mdf_tipo_var_tab, "READTAB") == 0)        { GOSUB MdF_Var_READTAB }
              if (mdf_Componenti2 == 0  &  mdf_NearGlobale == 0  &  mdf_livello_var == 0)
                 {
                  if (tipo_Var == 1)
                     {
                      VAR_CREATE_STR(idx_MdF_Var, nome_MdF_Var, val_Var_Bdm, 0, "")
                      // Così mi crea una variabile globale ma senza dollaro e in keyFamRegFacc
                      // funziona sia se entra la
                      // MdF_CamMdFrontali che prende tutte le stutture CamMdFrontali
                      // sia se entra la
                      // MdF_AttrezzaRegFacc che entra dai Controlli di ogni CamMdFrontali
                      // 11.04.2024
                      if (ATTUALE() == -1)
                         { retEvalVar = EVAL(STRCAT(nome_MdF_Var, "=", APICI(), val_Var_Bdm, APICI())) }
                      // 11.04.2024 Non e' più usata
                      //if (IS_IDX($MdF_AttrezzaRegFacc))
                      //   {
                      //    if (IS_MATCH(nome_MdF_Var, "CHIAVE_*") )
                      //       { retEvalDel = EVAL(STRCAT("del_var_CHIAVE=", APICI(), nome_MdF_Var, APICI())) }
                      //   }
                     }
                  else
                     {
                      VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, val_Var_Bdm, 0, "")
                      // 11.04.2024
                      if (ATTUALE() == -1)
                         { retEvalVar = EVAL(STRCAT(nome_MdF_Var, "=", STR(val_Var_Bdm))) }
                     }
                 }
             }
         }
      else
         {
          mdf_tipo_Var = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "TIPO_VAR")
          tipo_Var = ATOI(mdf_tipo_Var)
          if (STRCMP(mdf_tipo_Var, "NUMERIC") == 0)  { tipo_Var = 0 }
          if (STRCMP(mdf_tipo_Var, "STRING") == 0)   { tipo_Var = 1 }

          if (VAR_VAL(-1, "CAM_Visualize") > 99)  { COMANDO2(STRCAT("LOGMSG MdF_CreaVariabileDaTipoPadri tipo_Var ", DATA(0))) }

          valore_Var = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "VALORE_VAR")
          if (STR_INDEX_OF(valore_Var, 0, "DISPLAY2(") > -1)
             {
              valore_Var = STRMID(9, STRLEN(valore_Var)-10, valore_Var)
             }
          valore_DaEvalizzare = valore_Var

          nome_MdF_Var = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "NOME_VAR_CAM")
          pref_MdF_Var = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "PREFISSO_VAR")
          if (STRLEN(nome_MdF_Var) > 1)
             {
              nome_MdF_Var = STRCAT(pref_MdF_Var, nome_MdF_Var)
             }
          var_name = nome_MdF_Var
          if (tipo_Var == 1)
             {
              GOSUB MdF_VAL_VAR_STR
              // Così mi crea una variabile globale ma senza dollaro e in keyFamRegFacc
              // funziona sia se entra la
              // MdF_CamMdFrontali che prende tutte le strutture CamMdFrontali
              // sia se entra la
              // MdF_AttrezzaRegFacc che entra dai Controlli di ogni CamMdFrontali
              // 11.04.2024
              if (ATTUALE() == -1)
                 { retEvalVar = EVAL(STRCAT(var_name, "=", valore_DaEvalizzare)) }
              // 11.04.2024 Non e' più usata
              //if (IS_IDX($MdF_AttrezzaRegFacc))
              //   {
              //    if (IS_MATCH(nome_MdF_Var, "CHIAVE_*") )
              //       { retEvalDel = EVAL(STRCAT("del_var_CHIAVE=", APICI(), nome_MdF_Var, APICI())) }
              //   }
             }
          if (tipo_Var == 0)
             {
              GOSUB MdF_VAL_VAR
              // 11.04.2024
              if (ATTUALE() == -1)
                 { retEvalVar = EVAL(STRCAT(var_name, "=", valore_DaEvalizzare)) }
             }
         }
      if (VAR_VAL(-1, "CAM_Visualize") > 99)  { COMANDO2(STRCAT("LOGMSG } MdF_CreaVariabileDaTipoPadri ", DATA(0))) }
   }

   PROCEDURA MdF_VAL_VAR_STR
   {
      if (VAR_VAL(-1, "CAM_Visualize") > 99)  { COMANDO2(STRCAT("LOGMSG { MdF_VAL_VAR_STR valore_DaEvalizzare=", valore_DaEvalizzare, " ", DATA(0))) }

      if ( IS_MATCH(var_name, "Escludi*")
         | IS_MATCH(valore_DaEvalizzare, STRCAT("", APICI(), "*", APICI()) )
         )
         {
          // <= 5 "si" o "no"
          if ( STRLEN(valore_DaEvalizzare) <= 5
             | IS_MATCH(valore_DaEvalizzare, STRCAT("", APICI(), "*", APICI()) )
             )
             {
              valore_ToEval = STRMID(1,STRLEN(valore_DaEvalizzare)-2,valore_DaEvalizzare)
              var_val_gl = valore_ToEval
              VAR_CREATE_STR(idx_MdF_Var, var_name, valore_ToEval, 0, "")
              EXITSUB()
             }
         }

      retEval = EVAL(STRCAT("$mdf_wk_", var_name, "=", valore_DaEvalizzare))
      var_gl = STRCAT("mdf_wk_", var_name)
      var_val_gl = VAR_VAL_STR(-1, var_gl)
      if (VAR_VAL(-1, "CAM_Visualize") > 99)  { COMANDO2(STRCAT("LOGMSG MdF_VAL_VAR_STR var_name=", var_name, " var_gl=", var_gl, " ", DATA(0))) }
      if (retEval != -1)
         { VAR_CREATE_STR(idx_MdF_Var, var_name, var_val_gl, 0, "") }
      else
         {
          VAR_CREATE_STR(idx_MdF_Var, var_name, valore_DaEvalizzare, 0, "")
          var_name_create = var_name
          if (STRLEN(VAR_VAL_STR(idx_MdF_Var, var_name_create)) == 0)
             {
              if (VAR_EXIST(-1, "MdF_display_err") != 1)  { $MdF_display_err = -1 }
              $MdF_display_err = $MdF_display_err+1
              if (VAR_VAL(-1, "MdF_display_err") < 3)
                 {
                  DISPLAY2(STRCAT("MDF-Error ( ", STR($MdF_display_err) ," ) Campo Regola_variabile->", var_name, " Non Configurata\n",
                                  "Elemento ", NOME(idx_MdF_Var), " idx_MdF=", STR(idx_MdF_Var), "\n",
                                  "Chiave_TAB = ", chiave_n, "\n\n",
                                  "Attenzione a: doppi APICI dove necessari, no spazi vuoti, TIPO_VAR NUMERIC,STRING,DESC_VAL,LIVELLO_VAR,COMPONENTI2,NEAR_GLOBALE \n\n",
                                  "Controllare la corretta configurazione anche dei campi di riga precedenti\n\n",
                                  "Se il problema è su DTP_AliasScocca controllare VariabiliDaTipoPadri.txt archetipo=", NOME(PADRE(idx_MdF_Var,-1)), "\n\n",
                                  "FLUSSO DATI: \n",
                                  "Alias CamMdFrontali -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt (Configurare MdF_Apertura) -> KeyFamRegFacc.txt \n",
                                  "Vengono aggiunti gli MdF_ -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt -> RegFacc.txt (CHIAVE_TAB_CAM)\n",
                                  "(CHIAVE_TAB_CAM) VariabiliLavorazione -> lav*.tab"
                                 )
                           )
                 }
             }
          // Devo aere almeno 2 caratteri.. per evitare - o *
          if (STRLEN(VAR_VAL_STR(idx_MdF_Var, var_name_create)) > 1)
             {
              if (VAR_EXIST(-1, "MdF_display_err") != 1)  { $MdF_display_err = -1 }
              $MdF_display_err = $MdF_display_err+1
              if (VAR_VAL(-1, "MdF_display_err") < 3)
                 {
                  DISPLAY2(STRCAT("MDF-ErrorSTR ( ", STR($MdF_display_err) ," ) PARSING Regola_variabile->", var_name, "=", valore_DaEvalizzare, "\n\n",
                                  "Elemento ", NOME(idx_MdF_Var), " idx_RegF=", STR(idx_MdF_Var), "\n",
                                  "Chiave_TAB = ", chiave_n, "\n\n",
                                  "Attenzione a: doppi APICI dove necessari, no spazi vuoti, TIPO_VAR NUMERIC,STRING,DESC_VAL,LIVELLO_VAR,COMPONENTI2,NEAR_GLOBALE,COMPONENTI2,NEAR_GLOBALE \n\n",
                                  "usare SE_STR se risultato è stringa, SE_NUM se risultato è numerico",
                                  "Controllare la corretta configurazione anche dei campi di riga precedenti\n\n",
                                  "Se il problema è su DTP_AliasScocca controllare VariabiliDaTipoPadri.txt archetipo=", NOME(PADRE(idx_MdF_Var,-1)), "\n\n",
                                  "FLUSSO DATI: \n",
                                  "Alias CamMdFrontali -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt (Configurare MdF_Apertura) -> KeyFamRegFacc.txt \n",
                                  "Vengono aggiunti gli MdF_ -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt -> RegFacc.txt (CHIAVE_TAB_CAM)\n",
                                  "(CHIAVE_TAB_CAM) VariabiliLavorazione -> lav*.tab"
                                 )
                           )
                 }
             }
         }

      if (IS_MATCH(TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "VALORE_VAR"), "DISPLAY2(*") == 1)
         {
          Mdf_nome_Table_Loc = "cam\Tab\MdF"
          if (Mdf_Table_Loc == $MdF_TABLE_Var)      { Mdf_nome_Table_Loc = "cam\Tab\VariabiliMdF.txt" }
          if (Mdf_Table_Loc == $MdF_TABLE_Var_DTP)  { Mdf_nome_Table_Loc = "cam\Tab\VariabiliDaTipoPadri.txt" }
          valore_Var_Tab = TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "VALORE_VAR")
          if (IS_MATCH(var_name, "Escludi*") != 1)
             {
              DISPLAY2(STRCAT("-DISPLAY DEBUG MeccanismiDaFrontali-", Mdf_nome_Table_Loc, "-", STR(idx_MdF_Var), "\n ",
                              chiave_n, "-> valore_Var_Tab=", valore_Var_Tab, "\n",
                              "valore_Evalizzato=", var_val_gl
                             )
                      )
             }
         }

      DEL_VAR(-1, STRCAT("mdf_wk_", var_name))
      if (VAR_VAL(-1, "CAM_Visualize") > 99)  { COMANDO2(STRCAT("LOGMSG } MdF_VAL_VAR_STR ", DATA(0))) }
   }

   PROCEDURA MdF_VAL_VAR
   {
      retEval = EVAL(STRCAT("$mdf_wk_", var_name, "=", valore_DaEvalizzare))
      var_gl = STRCAT("mdf_wk_", var_name)
      var_val_gl = VAR_VAL(-1, var_gl)
      if (retEval != -1)
         { VAR_CREATE_NUM(idx_MdF_Var, var_name, var_val_gl, 0, "") }
      else
         {
          if (VAR_EXIST(-1, "MdF_display_err") != 1)  { $MdF_display_err = -1 }
          $MdF_display_err = $MdF_display_err+1
          if (VAR_VAL(-1, "MdF_display_err") < 3)
             {
              DISPLAY2(STRCAT("MDF-ErrorNUM ( ", STR($MdF_display_err) ," ) PARSING Regola variabile->", var_name, "=", valore_DaEvalizzare, "\n\n",
                              "Elemento ", NOME(idx_MdF_Var), " idx_MdF=", STR(idx_MdF_Var), "\n",
                              "Chiave_TAB = ", chiave_n, "\n\n",
                              "Attenzione a: doppi APICI dove necessari, no spazi vuoti, TIPO_VAR NUMERIC,STRING,DESC_VAL,LIVELLO_VAR,COMPONENTI2,NEAR_GLOBALE,COMPONENTI2,NEAR_GLOBALE \n\n",
                              "usare SE_STR se risultato è stringa, SE_NUM se risultato è numerico\n",
                              "Controllare la corretta configurazione anche dei campi di riga precedenti\n\n",
                              "Se il problema è su DTP_AliasScocca controllare VariabiliDaTipoPadri.txt archetipo=", NOME(PADRE(idx_MdF_Var,-1)), "\n\n",
                              "FLUSSO DATI: \n",
                              "Alias CamMdFrontali -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt (Configurare MdF_Apertura) -> KeyFamRegFacc.txt \n",
                              "Vengono aggiunti gli MdF_ -> VariabiliDaTipoPadri.txt -> VariabiliMdF.txt -> RegFacc.txt (CHIAVE_TAB_CAM)\n",
                              "(CHIAVE_TAB_CAM) VariabiliLavorazione -> lav*.tab"
                             )
                       )
             }

          VAR_CREATE_STR(idx_MdF_Var, STRCAT(var_name, "_Err"), valore_DaEvalizzare, 0, "")
         }
      DEL_VAR(-1, STRCAT("mdf_wk_", var_name))
   }

   PROCEDURA MdF_Var_PrimoTrovato
   {
      if (IS_MATCH(livello_Var, "PrimoTrovato*") == 1)
         {
          livello_ToCtrl = -1
          idxSearch = idx_MdF_Var
          SearchVar = 1
          while(SearchVar > 0)
             {
              livello_ToCtrl = livello_ToCtrl+1
              nome_Var_Bdm_Punto = nome_Var_Bdm
              if (STR_INDEX_OF(nome_Var_Bdm_Punto, 0, ".") > -1)
                 {
                  mdf_index_punto = STR_INDEX_OF(nome_Var_Bdm_Punto, 0, ".")
                  nome_Var_Bdm_Punto = STRMID(0, mdf_index_punto, nome_Var_Bdm)
                  nome_Var_Bdm_Punto_entr = nome_Var_Bdm_Punto
                 }

              tipo_Var_Punto = 2

              // Se c'è EXIST controllo che la variabile trovata sia di tipo TIPO_VAR
              // altrimenti se la variabile con il tipo corretto è su un padre di
              // livello superiore la funzione si ferma troppo presto tornando l'idx
              // che ha la variabile di tipo errato e se poi quella variabile è usata
              // Difficilmente c'è una variabile che in un elemento è stringa e in un
              // altro è numerica, purtroppo accade alcune volte con la variabile Verso
              // che su Scocca è stringa e su Anta è numerica e non hanno proprio lo stesso
              // significato
              if ( VAR_EXIST(idxSearch, nome_Var_Bdm)
                 // 16.03.2022 Come Cam-Std. Non e' uscito prima perche il problema nasce con base_0_offset.y,
                 // mentre con gli altri punti notevoli, esempio base_0.y, in questa procedura non fa niente e rimane
                 // idx_MToCtrl = PADRE(idx_att, 0). Poi siccome i punti notevoli esistono su tutti gli elementi
                 // viene preso quello di PADRE di 1, quindi circa il primo e quindi preso correttamente il PrimoTrovato e
                 // appunto ha sempre funzionato
                 // Sicomme livello_Var e' PrimoTrovato ATOI(livello_Var) = 0 quindi PADRE(idx_MdF_Var, livello_ToCtrl) = PADRE(idx_att, 1)
                 // perche 0 nella funzione PADRE non avrebbe senso, quindi il minimo considerato e' 1 però tra CamMdFrontali e
                 // il padre i punti notevoli hanno praticamente sempre gli stessi valori
                 | VAR_EXIST(idxSearch, nome_Var_Bdm_Punto)
                 )
                 {
                  if ( tipo_Var == 1
                     | STRCMP(TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "TIPO_VAR"), "DESCVAL") == 0
                     )
                     {
                      mdf_primotrovatoGen = 1
                      mdf_prtr_StrValido = 0
                      if (STRCMP(livello_Var, "PrimoTrovatoNoVuoto") == 0)
                         {
                          mdf_primotrovatoGen = -1
                          if (STRCMP(VAR_VAL_STR(idxSearch, nome_Var_Bdm), "") != 0)
                             {
                              mdf_prtr_StrValido = 1
                             }
                         }
                      if (STRCMP(livello_Var, "PrimoTrovatoValido") == 0)
                         {
                          mdf_primotrovatoGen = -2
                          if ( STRCMP(VAR_VAL_STR(idxSearch, nome_Var_Bdm), "") != 0
                             & STRCMP(VAR_VAL_STR(idxSearch, nome_Var_Bdm), " ") != 0
                             & STRCMP(VAR_VAL_STR(idxSearch, nome_Var_Bdm), "  ") != 0
                             & STRCMP(VAR_VAL_STR(idxSearch, nome_Var_Bdm), "_") != 0
                             & STRCMP(VAR_VAL_STR(idxSearch, nome_Var_Bdm), "__") != 0
                             )
                             {
                              mdf_prtr_StrValido = 2
                             }
                         }

                      if (mdf_primotrovatoGen == 1  |  mdf_prtr_StrValido > 0)
                         {
                          if (STRCMP(TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "VALORE_VAR"), "EXIST") != 0)
                             {
                              idx_MToCtrl = idxSearch
                              SearchVar = -1*idxSearch
                             }
                          else
                             {
                              if (tipo_Var == VAR_TYPE(idxSearch, nome_Var_Bdm))
                                 {
                                  idx_MToCtrl = idxSearch
                                  SearchVar = -1*idxSearch
                                 }
                             }
                         }
                     }
                  else
                     {
                      if (STRCMP(TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "VALORE_VAR"), "EXIST") != 0)
                         {
                          idx_MToCtrl = idxSearch
                          SearchVar = -1*idxSearch
                         }
                      else
                         {
                          if ( tipo_Var == VAR_TYPE(idxSearch, nome_Var_Bdm)
                             | tipo_Var_Punto == VAR_TYPE(idxSearch, nome_Var_Bdm_Punto)
                             )
                             {
                              idx_MToCtrl = idxSearch
                              SearchVar = -1*idxSearch
                             }
                         }
                     }
                 }
              if (INSERIMENTO(idxSearch) == -2)
                 { SearchVar = 0 }
              else
                 { idxSearch = PADRE(idxSearch, 1) }
             }
         }
   }

   PROCEDURA MdF_Var_Valido
   {
      // Se fatalità sull' idx_MToCtrl trovo la variabile devo ricontrollare che abbia valore valido
       if ( STRCMP(livello_Var, "PrimoTrovatoValido") == 0
          & tipo_Var == 1
          )
          {
           if ( STRCMP(val_Var_Bdm, "") == 0
              | STRCMP(val_Var_Bdm, " ") == 0
              | STRCMP(val_Var_Bdm, "  ") == 0
              | STRCMP(val_Var_Bdm, "_") == 0
              | STRCMP(val_Var_Bdm, "__") == 0
              )
              {
               val_Var_Bdm = ""
              }
          }
   }

   PROCEDURA MdF_Var_Alias
   {
      if (IS_MATCH(livello_Var, "Alias*") == 1)
         {
          livello_ToCtrl = -1
          idxSearch = idx_MdF_Var
          SearchVar = 1
          while(SearchVar > 0)
             {
              hasalias = RIGHT(livello_Var, STRLEN(livello_Var)-5)
              livello_ToCtrl = livello_ToCtrl+1
              if (HAS_ALIAS(idxSearch, hasalias) )
                 {
                  idx_MToCtrl = idxSearch
                  SearchVar = -1*idxSearch
                 }
              if (INSERIMENTO(idxSearch) == -2)
                 { SearchVar = 0 }
              else
                 { idxSearch = PADRE(idxSearch, 1) }
             }
         }
   }

   PROCEDURA MdF_Var_FindAllCmp
   {
      if (STRCMP(livello_Var, "FindAllCmp") == 0)
         {
          WITH_VAR_LOCAL(PADRE(idx_MdF_Var, -1), "mdf_arrayVar", nome_Var_Bdm, tipo_Var+2, 0, "")
          if (mdf_arrayVar > 0)
             { idx_MToCtrl = mdf_arrayVar[1] }
          iMa=1
          while(iMa <= mdf_arrayVar)
             {
              // Se stringa prendo la prima non vuota
              if (tipo_Var == 1)
                 {
                  if (STRCMP(VAR_VAL_STR(idx_MToCtrl, nome_Var_Bdm), "") != 0)
                     {
                      idx_MToCtrl = mdf_arrayVar[iMa]
                     }
                 }
              iMa = iMa+1
             }
         }
   }

   PROCEDURA MdF_Var_FindAllCmpXXXn
   {
      if ( IS_MATCH(livello_Var, "FindAllCmp*") == 1
         & STRLEN(livello_Var) > 10
         )
         {
          nchar = 0
          idN = ATOI(RIGHT(livello_Var, STRLEN(livello_Var)-10))
          while (nchar <= STRLEN(livello_Var)-10  &  idN == 0)
             {
              nchar = nchar+1
              idN = ATOI(RIGHT(livello_Var, STRLEN(livello_Var)-10-nchar))
             }

          charId = STRLEN(livello_Var)-10-nchar

          nomeArchToCtrl = ""
          if (STRLEN(livello_Var) > 12)
             { nomeArchToCtrl = STRMID(10, nchar, livello_Var) }

          //DISPLAY2(STRCAT("idN=", STR(idN), "nomeArchToCtrl=", nomeArchToCtrl))
          //idN = ATOI(RIGHT(livello_Var, STRLEN(livello_Var)-10))
          WITH_VAR_LOCAL(PADRE(idx_MdF_Var, -1), "mdf_arrayVar", nome_Var_Bdm, tipo_Var+2, 0, "")
          if (mdf_arrayVar > 0)
             {
              idx_MToCtrl = mdf_arrayVar[1]
              if (STRCMP(nomeArchToCtrl, "") == 0)
                 {
                  if (idN <= mdf_arrayVar)
                     { idx_MToCtrl = mdf_arrayVar[idN] }
                 }
              else
                 {
                  iMd = 1
                  iAr = 0
                  while(iMd <= mdf_arrayVar)
                     {
                      if (IS_MATCH(NOME(mdf_arrayVar[iMd]), STRCAT(nomeArchToCtrl, "*") ) == 1)
                         {
                          // Prendo comunque il primo con nomeArchToCtrl piuttosto che
                          // rimanga il primo del mdf_arrayVar esempio nel caso idN
                          // è maggiore di mdf_arrayVar
                          if (iAr == 0)  { idx_MToCtrl = mdf_arrayVar[iMd] }

                          iAr = iAr+1
                          if (iAr == idN)
                             {
                              idx_MToCtrl = mdf_arrayVar[iMd]
                              iMd = mdf_arrayVar
                             }
                         }
                      iMd = iMd+1
                     }
                 }
             }
         }
   }

   PROCEDURA MdF_Var_FindAllBroth
   {
      if (STRCMP(livello_Var, "FindAllBrother") == 0)
         {
          WITH_VAR_LOCAL(PADRE(idx_MdF_Var, -1), "mdf_arrayVarFAB", nome_Var_Bdm, tipo_Var+2, 0, "")
          if (mdf_arrayVarFAB > 0)
             { idx_MToCtrl = idx_MdF_Var }

          is_broth = 0
          is_child = 0
         // 18.12.2020
          is_uncle = -1.1
          is_att = -1.1
          broth_found = 0
          iMa=1
          while (iMa <= mdf_arrayVarFAB)
             {
              is_broth = 0
              ic=1
              while ( PADRE(mdf_arrayVarFAB[iMa], ic) != PADRE(mdf_arrayVarFAB[iMa], -1)
                    & is_broth == 0
                 )
                 {
                  is_child = 0
                  if (PADRE(mdf_arrayVarFAB[iMa], ic) == idx_MdF_Var)
                     { is_child = 1 }

                  if (PADRE(mdf_arrayVarFAB[iMa], ic) == PADRE(idx_MdF_Var, 1) )
                     {
                      if ( mdf_arrayVarFAB[iMa] != idx_MdF_Var
                         & IS_MATCH(NOME(idx_MdF_Var), "CAM_*") != 1
                         )
                         { is_broth = 1 }
                     }

                  if (PADRE(mdf_arrayVarFAB[iMa], ic) == PADRE(idx_MdF_Var, ic+1) )
                     {
                      if ( mdf_arrayVarFAB[iMa] != PADRE(idx_MdF_Var, 1)
                         & IS_MATCH(NOME(idx_MdF_Var), "CAM_*") == 1
                         )
                         {
                          is_uncle = 1
                          is_broth = 1
                         }
                     }

                  if (PADRE(mdf_arrayVarFAB[iMa], ic) == PADRE(idx_MdF_Var, ic) )
                     {
                      if (IS_MATCH(NOME(idx_MdF_Var), "CAM_*") == 1)
                         { is_broth = 1 }
                     }

                  if (mdf_arrayVarFAB[iMa] == idx_MdF_Var)
                     { is_att = mdf_arrayVarFAB[iMa] }

                  if ( mdf_arrayVarFAB[iMa] == PADRE(idx_MdF_Var, 1)
                     & IS_MATCH(NOME(idx_MdF_Var), "CAM_*") == 1
                     )
                     { is_att = mdf_arrayVarFAB[iMa] }

                  if (is_broth | is_child)
                     {
                      // Se stringa prendo la prima non vuota
                      if (tipo_Var == 1)
                         {
                          if (STRCMP(VAR_VAL_STR(mdf_arrayVarFAB[iMa], nome_Var_Bdm), "") != 0)
                             {
                              broth_found = mdf_arrayVarFAB[iMa]+0.1
                              idx_MToCtrl = mdf_arrayVarFAB[iMa]
                             }
                         }
                      else
                         {
                          broth_found = mdf_arrayVarFAB[iMa]+0.1
                          idx_MToCtrl = mdf_arrayVarFAB[iMa]
                         }

                     }

                  ic = ic+1
                 }

              iMa = iMa+1
             }
          if (broth_found == 0)
             {
              if (IS_IDX(is_att) )
                 {
                  // Se stringa prendo la prima non vuota
                  if (tipo_Var == 1)
                     {
                      if (STRCMP(VAR_VAL_STR(is_att, nome_Var_Bdm), "") != 0)
                         {
                          idx_MToCtrl = is_att
                         }
                     }
                  else
                     { idx_MToCtrl = is_att }
                 }
             }
         }
   }

   PROCEDURA MdF_Var_FindAllBrothXXXn
   {
      if ( IS_MATCH(livello_Var, "FindAllBrother*") == 1
         & STRLEN(livello_Var) > 14
         )
         {
          nchar = 0
          idN = ATOI(RIGHT(livello_Var, STRLEN(livello_Var)-14))
          while (nchar <= STRLEN(livello_Var)-14  &  idN == 0)
             {
              nchar = nchar+1
              idN = ATOI(RIGHT(livello_Var, STRLEN(livello_Var)-14-nchar))
             }

          charId = STRLEN(livello_Var)-14-nchar

          nomeArchToCtrl = ""
          if (STRLEN(livello_Var) > 16)
             { nomeArchToCtrl = STRMID(14, nchar, livello_Var) }

          WITH_VAR_LOCAL(PADRE(idx_MdF_Var, -1), "mdf_arrayVarFAB", nome_Var_Bdm, tipo_Var+2, 0, "")
          if (mdf_arrayVarFAB > 0)
             { idx_MToCtrl = idx_MdF_Var }

          is_broth = 0
          is_child = 0
          is_uncle = -1
          // 17.12.2020 C44961
          // come Cam_VarLav_FindAllBrothXXXn. Stranissimo sia uscito solo adesso
          //is_att = 0
          is_att = -1.1
          broth_found = 0
          iMa=1
          iAr = 0
          while (iMa <= mdf_arrayVarFAB)
             {
              is_broth = 0
              ic=1
              // 17.12.2020 come Cam_VarLav_FindAllBrothXXXn
              // perché altrimenti usciva subito dal while se ho solo un livello prima del padre e non trovo is_uncle
              cam_while_BrothXXXn_exit = 1
              //while ( PADRE(mdf_arrayVarFAB[iMa], ic) != PADRE(mdf_arrayVarFAB[iMa], -1)
              //      & is_broth == 0
              //   )
              while (cam_while_BrothXXXn_exit == 1)
                 {
                  is_child = 0
                  if (PADRE(mdf_arrayVarFAB[iMa], ic) == idx_MdF_Var)
                     { is_child = 1 }

                  if (PADRE(mdf_arrayVarFAB[iMa], ic) == PADRE(idx_MdF_Var, 1) )
                     {
                      if ( mdf_arrayVarFAB[iMa] != idx_MdF_Var
                         & IS_MATCH(NOME(idx_MdF_Var), "CAM_*") != 1
                         )
                         { is_broth = 1 }
                     }

                  if (PADRE(mdf_arrayVarFAB[iMa], ic) == PADRE(idx_MdF_Var, ic+1) )
                     {
                      if ( mdf_arrayVarFAB[iMa] != PADRE(idx_MdF_Var, 1)
                         & IS_MATCH(NOME(idx_MdF_Var), "CAM_*") == 1
                         )
                         {
                          is_uncle = mdf_arrayVarFAB[iMa]
                          is_broth = 1
                         }
                     }

                  if (PADRE(mdf_arrayVarFAB[iMa], ic) == PADRE(idx_MdF_Var, ic) )
                     {
                      if (IS_MATCH(NOME(idx_MdF_Var), "CAM_*") == 1)
                         { is_broth = 1 }
                     }

                  if (mdf_arrayVarFAB[iMa] == idx_MdF_Var)
                     { is_att = mdf_arrayVarFAB[iMa] }

                  if ( mdf_arrayVarFAB[iMa] == PADRE(idx_MdF_Var, 1)
                     & IS_MATCH(NOME(idx_MdF_Var), "CAM_*") == 1
                     )
                     { is_att = mdf_arrayVarFAB[iMa] }

                  if (is_broth | is_child)
                     {
                      // Se stringa prendo la prima non vuota
                      if (tipo_Var == 1)
                         {
                          if (STRCMP(VAR_VAL_STR(mdf_arrayVarFAB[iMa], nome_Var_Bdm), "") != 0)
                             {
                              if (IS_MATCH(NOME(mdf_arrayVarFAB[iMa]), STRCAT(nomeArchToCtrl, "*") ) == 1)
                                 {
                                  // Prendo comunque il primo con nomeArchToCtrl piuttosto che
                                  // rimanga il primo dell'cam_arrayVar esempio nel caso idN
                                  // è maggiore di cam_arrayVar
                                  if (iAr == 0)  { idx_MToCtrl = mdf_arrayVarFAB[iMa] }
                                  broth_found = mdf_arrayVarFAB[iMa]+0.1

                                  iAr = iAr+1
                                  if (iAr == idN)
                                     {
                                      idx_MToCtrl = mdf_arrayVarFAB[iMa]
                                      iMa = mdf_arrayVarFAB
                                      broth_found = mdf_arrayVarFAB[iMa]+0.1
                                     }
                                 }
                             }
                         }
                      else
                         {
                          if (IS_MATCH(NOME(mdf_arrayVarFAB[iMa]), STRCAT(nomeArchToCtrl, "*") ) == 1)
                             {
                              // Prendo comunque il primo con nomeArchToCtrl piuttosto che
                              // rimanga il primo dell'cam_arrayVar esempio nel caso idN
                              // è maggiore di cam_arrayVar
                              if (iAr == 0)  { idx_MToCtrl = mdf_arrayVarFAB[iMa] }
                              broth_found = mdf_arrayVarFAB[iMa]+0.1

                              iAr = iAr+1
                              if (iAr == idN)
                                 {
                                  idx_MToCtrl = mdf_arrayVarFAB[iMa]
                                  iMa = mdf_arrayVarFAB
                                  broth_found = mdf_arrayVarFAB[iMa]+0.1
                                 }
                             }
                         }
                     }

                  ic = ic+1
                 // 17.12.2020
                  if (PADRE(mdf_arrayVarFAB[iMa], ic) == PADRE(mdf_arrayVarFAB[iMa], -1) )
                     { cam_while_BrothXXXn_exit = -1 }

                  if (is_broth > 0)  { cam_while_BrothXXXn_exit = -2 }
                 }

              iMa = iMa+1
             }
          if (broth_found == 0)
             {
              if (IS_IDX(is_att) )
                 {
                  // Se stringa prendo la prima non vuota
                  if (tipo_Var == 1)
                     {
                      if (STRCMP(VAR_VAL_STR(is_att, nome_Var_Bdm), "") != 0)
                         {
                          idx_MToCtrl = is_att
                         }
                     }
                  else
                     { idx_MToCtrl = is_att }
                 }
             }
         }
   }

   PROCEDURA MdF_Var_DescVal
   {
      if (STRCMP(mdf_tipo_var_tab, "DESCVAL") == 0)
         {
          val_Var_Bdm = DESCRIZIONE_VAL_TABDB(idx_MToCtrl, nome_Var_Bdm)
          // 09.02.2023 Se non esiste la var rimane tipo_Var 0 ma con DESCVAL e' sicuramente String
          tipo_Var = 1
         }
   }

   PROCEDURA MdF_Var_Exist
   {
      if (STRCMP(TABLE_FIELD_AT(Mdf_Table_Loc, chiave_n, "VALORE_VAR"), "EXIST") == 0)
         {
          if (VAR_EXIST(idx_MToCtrl, nome_Var_Bdm) != 1)
             {
              if (tipo_Var == 0)  { val_Var_Bdm = -1.111 }
              if (tipo_Var == 1)  { val_Var_Bdm = "-1" }
             }
          else
             {
              if (VAR_TYPE(idx_MToCtrl, nome_Var_Bdm) != tipo_Var)
                 {
                  if (tipo_Var == 0)  { val_Var_Bdm = -2.222 }
                  if (tipo_Var == 1)  { val_Var_Bdm = "-2" }
                 }
             }
         }
   }

   PROCEDURA MdF_Var_COMPONENTI23
   {
      if (STRCMP(mdf_tipo_var_tab, "COMPONENTI2") == 0)
         {
          COMPONENTI2(nome_MdF_Var, idx_MToCtrl, nome_Var_Bdm)
         }
      if (STRCMP(mdf_tipo_var_tab, "COMPONENTI3") == 0)
         {
          COMPONENTI3(nome_MdF_Var, idx_MToCtrl, nome_Var_Bdm)
         }
      if (VAR_VAL(idx_MdF_Var, nome_MdF_Var) > 0)
         { mdf_Componenti2 = 1 }

      if (ATTUALE() == -1)
         {
          if (STRCMP(mdf_tipo_var_tab, "COMPONENTI2") == 0)
             { COMPONENTI2(STRCAT("$", nome_MdF_Var), idx_MToCtrl, nome_Var_Bdm) }
          if (STRCMP(mdf_tipo_var_tab, "COMPONENTI3") == 0)
             { COMPONENTI3(STRCAT("$", nome_MdF_Var), idx_MToCtrl, nome_Var_Bdm) }

          mdf_comp = VAR_VAL(-1, nome_MdF_Var)
          if (mdf_comp > 0)
             {
              VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, mdf_comp, 0, "")
              mdf_Componenti2 = 2
             }
          mci=1
          while (mci <= mdf_comp)
             {
              mdf_val_comp = VAR_VAL(-1, STRCAT(nome_MdF_Var, "_##", STR(mci)))
              mdf_nome_Var_comp = STRCAT(nome_MdF_Var, "_##", STR(mci))
              VAR_CREATE_NUM(idx_MdF_Var, mdf_nome_Var_comp, mdf_val_comp, 0, "")
              mci = mci+1
             }
          DEL_VAR(-1, STRCAT(nome_MdF_Var, "*"))
         }
   }

   PROCEDURA MdF_Var_LIVELLO_VAR
   {
      mdf_livello_var = 1
      VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, livello_ToCtrl, 0, "")
      retEvalVar = EVAL(STRCAT(nome_MdF_Var, "=", STR(livello_ToCtrl)))
   }

   PROCEDURA MdF_Var_NEAR_GLOBALE
   {
      mdf_distNear = 1
      if (VAR_EXIST(idx_MToCtrl, "CamSys_DistNear") )
         {
          mdf_distNear = VAR_VAL(idx_MToCtrl, "CamSys_DistNear")
          // 07.05.2019 PC051703
          // E' appunto sbagliato, vedi MdF_Paracolpi che prende CamSys_DistNear usato dal padre per cercare il Lavello e trova la golaSup
          // Al momento per non cambiare troppo visto che c'e' da 7 anni faccio un piccolo accorgimento
          // poi qui sotto se c'e' in tabella dovrebbe prendere CamSys_DistNear da idx_MdF_Var
          // 09.02.2023 Intanto abbasso da 40 a 30
          // Magari prossima versione tolgo questo pezzo che prende CamSys_DistNear idx_MToCtrl
          //if (mdf_distNear > 40)  { mdf_distNear = 3 }
          if (mdf_distNear > 30)  { mdf_distNear = 3 }
          // 09.02.2023 Per compatibilita non posso toglierlo, altrimenti dovrei verificare tutti CamSys_DistNear su tutti i VariabiliMdF.txt
          // Magari prossima versione tolgo questo pezzo che prende CamSys_DistNear idx_MToCtrl
          if (IS_MATCH(livello_Var, "AliasCamMdF*") == 1)
             {
              if (IS_MATCH(NOME(idx_MdF_Var), "MdF_*") == 1)
                 {
                  if (mdf_distNear > 8)  { mdf_distNear = 3.5 }
                 }
             }
         }
      // Credo sia sempre stata sbagliata la gestione su idx_MToCtrl
      if (VAR_EXIST(idx_MdF_Var, "CamSys_DistNear") )
         {
          mdf_distNear = VAR_VAL(idx_MdF_Var, "CamSys_DistNear")
         }
      BOX_MODE(0)
      NEAR_GLOBALE(nome_MdF_Var, idx_MToCtrl, mdf_distNear, 1, nome_Var_Bdm)

      if (VAR_VAL(idx_MdF_Var, nome_MdF_Var) > 0)
         { mdf_NearGlobale = 1 }

      if (ATTUALE() == -1)
         {
          NEAR_GLOBALE(STRCAT("$", nome_MdF_Var), idx_MToCtrl, mdf_distNear, 1, nome_Var_Bdm)
          mdf_compNear = VAR_VAL(-1, nome_MdF_Var)
          if (mdf_compNear > 0)
             {
              VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, mdf_compNear, 0, "")
              mdf_NearGlobale = 2
             }
          mni=1
          while (mni <= mdf_compNear)
             {
              mdf_val_compNear = VAR_VAL(-1, STRCAT(nome_MdF_Var, "_##", STR(mni)))
              mdf_nome_Var_compNear = STRCAT(nome_MdF_Var, "_##", STR(mni))
              VAR_CREATE_NUM(idx_MdF_Var, mdf_nome_Var_compNear, mdf_val_compNear, 0, "")
              mni = mni+1
             }
          DEL_VAR(-1, STRCAT(nome_MdF_Var, "*"))
         }
   }

   PROCEDURA MdF_Var_NEAR_GLOBALE2
   {
      mdf_distNear = 1
      if (VAR_EXIST(idx_MdF_Var, "CamSys_DistNear") )
         {
          mdf_distNear = VAR_VAL(idx_MdF_Var, "CamSys_DistNear")
         }

      BOX_MODE(0)
      NEAR_GLOBALE(nome_MdF_Var, idx_MToCtrl, mdf_distNear, 1, nome_Var_Bdm)

      if (VAR_VAL(idx_MdF_Var, nome_MdF_Var) > 0)
         {
          mdf_NearGlobale = 1

          cbas0ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_0.x")
          cbas0ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_0.z")
          cbas0ToCtrl = [cbas0ToCtrl_x, 0, cbas0ToCtrl_z]
          cbas1ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_1.x")
          cbas1ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_1.z")
          cbas1ToCtrl = [cbas1ToCtrl_x, 0, cbas1ToCtrl_z]
          cbas2ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_2.x")
          cbas2ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_2.z")
          cbas2ToCtrl = [cbas2ToCtrl_x, 0, cbas2ToCtrl_z]
          cbas3ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_3.x")
          cbas3ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_3.z")
          cbas3ToCtrl = [cbas3ToCtrl_x, 0, cbas3ToCtrl_z]
          cXToCtrl = VAR_VAL(idx_MToCtrl, "X")
          cZToCtrl = VAR_VAL(idx_MToCtrl, "Z")

          cnei=1
          cam_nome_Var_cNear = STRCAT(nome_MdF_Var, "_##", STR(cnei))
          cam_nome_Val_cNear_idx = VAR_VAL(idx_MdF_Var, cam_nome_Var_cNear)

          cbas0Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.x")
          cbas0Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.z")
          cbas0Found = [cbas0Found_x, 0, cbas0Found_z]
          cbas1Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.x")
          cbas1Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.z")
          cbas1Found = [cbas1Found_x, 0, cbas1Found_z]
          cbas2Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.x")
          cbas2Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.z")
          cbas2Found = [cbas2Found_x, 0, cbas2Found_z]
          cbas3Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.x")
          cbas3Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.z")
          cbas3Found = [cbas3Found_x, 0, cbas3Found_z]
          cXFound = VAR_VAL(cam_nome_Val_cNear_idx, "X")
          cZFound = VAR_VAL(cam_nome_Val_cNear_idx, "Z")

          cam_near2_dist01 = DISTANZA(cbas0ToCtrl, cbas1Found)
          cam_near2_dist10 = DISTANZA(cbas1ToCtrl, cbas0Found)
          cam_near2_dist11 = DISTANZA(cbas1ToCtrl, cbas1Found)
          cam_near2_dist22 = DISTANZA(cbas2ToCtrl, cbas2Found)
          cam_near2_dist23 = DISTANZA(cbas2ToCtrl, cbas3Found)
          cam_near2_dist32 = DISTANZA(cbas3ToCtrl, cbas2Found)

          cam_near2_dist03 = DISTANZA(cbas0ToCtrl, cbas3Found)
          cam_near2_dist30 = DISTANZA(cbas3ToCtrl, cbas0Found)

          cZMax = cZToCtrl
          cZMin = cZFound
          if (cZFound > cZToCtrl)
             {
              cZMax = cZFound
              cZMin = cZToCtrl
             }

          cXMax = cXToCtrl
          cXMin = cXFound
          if (cXFound > cXToCtrl)
             {
              cXMax = cXFound
              cXMin = cXToCtrl
             }

          // il trovato esce dietro
          if ( cam_near2_dist10 >= cZMax+cZMin/4
             & cam_near2_dist23 >= cZMax+cZMin/4
             )
             { mdf_NearGlobale = -1 }

          // il trovato esce davanti
          if ( cam_near2_dist01 >= cZMax+cZMin/4
             & cam_near2_dist32 >= cZMax+cZMin/4
             )
             { mdf_NearGlobale = -2 }

          // si trova sulla sinistra ma lo sfiora soltanto
          if ( cam_near2_dist30 >= cXMax+cXMin-0.1
             & cam_near2_dist03 < cXMin
             )
             { mdf_NearGlobale = -3 }

          // si trova sulla destra ma lo sfiora soltanto
          if ( cam_near2_dist03 >= cXMax+cXMin-0.1
             & cam_near2_dist30 < cXMin
             )
             { mdf_NearGlobale = -4 }

          if (mdf_NearGlobale < 0)
             {
              VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, 0, 0, "")
             }
         }

      if (ATTUALE() == -1)
         {
          NEAR_GLOBALE(STRCAT("$", nome_MdF_Var), idx_MToCtrl, mdf_distNear, 1, nome_Var_Bdm)
          cam_compNear = VAR_VAL(-1, nome_MdF_Var)
          if (cam_compNear > 0)
             {
              mdf_NearGlobale = 2
              VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, cam_compNear, 0, "")

             // 27.03.2018
              cbas0ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_0.x")
              cbas0ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_0.z")
              cbas0ToCtrl = [cbas0ToCtrl_x, 0, cbas0ToCtrl_z]
              cbas1ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_1.x")
              cbas1ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_1.z")
              cbas1ToCtrl = [cbas1ToCtrl_x, 0, cbas1ToCtrl_z]
              cbas2ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_2.x")
              cbas2ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_2.z")
              cbas2ToCtrl = [cbas2ToCtrl_x, 0, cbas2ToCtrl_z]
              cbas3ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_3.x")
              cbas3ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_3.z")
              cbas3ToCtrl = [cbas3ToCtrl_x, 0, cbas3ToCtrl_z]
              cXToCtrl = VAR_VAL(idx_MToCtrl, "X")
              cZToCtrl = VAR_VAL(idx_MToCtrl, "Z")

              cnei=1
              cam_nome_Var_cNear = STRCAT("$", nome_MdF_Var, "_##", STR(cnei))
              cam_nome_Val_cNear_idx = VAR_VAL(-1, cam_nome_Var_cNear)

              cbas0Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.x")
              cbas0Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.z")
              cbas0Found = [cbas0Found_x, 0, cbas0Found_z]
              cbas1Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.x")
              cbas1Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.z")
              cbas1Found = [cbas1Found_x, 0, cbas1Found_z]
              cbas2Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.x")
              cbas2Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.z")
              cbas2Found = [cbas2Found_x, 0, cbas2Found_z]
              cbas3Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.x")
              cbas3Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.z")
              cbas3Found = [cbas3Found_x, 0, cbas3Found_z]
              cXFound = VAR_VAL(cam_nome_Val_cNear_idx, "X")
              cZFound = VAR_VAL(cam_nome_Val_cNear_idx, "Z")

              cam_near2_dist01 = DISTANZA(cbas0ToCtrl, cbas1Found)
              cam_near2_dist10 = DISTANZA(cbas1ToCtrl, cbas0Found)
              cam_near2_dist11 = DISTANZA(cbas1ToCtrl, cbas1Found)
              cam_near2_dist22 = DISTANZA(cbas2ToCtrl, cbas2Found)
              cam_near2_dist23 = DISTANZA(cbas2ToCtrl, cbas3Found)
              cam_near2_dist32 = DISTANZA(cbas3ToCtrl, cbas2Found)

              cam_near2_dist03 = DISTANZA(cbas0ToCtrl, cbas3Found)
              cam_near2_dist30 = DISTANZA(cbas3ToCtrl, cbas0Found)

              cZMax = cZToCtrl
              cZMin = cZFound
              if (cZFound > cZToCtrl)
                 {
                  cZMax = cZFound
                  cZMin = cZToCtrl
                 }

              cXMax = cXToCtrl
              cXMin = cXFound
              if (cXFound > cXToCtrl)
                 {
                  cXMax = cXFound
                  cXMin = cXToCtrl
                 }

              // il trovato esce dietro
              if ( cam_near2_dist10 >= cZMax+cZMin/4
                 & cam_near2_dist23 >= cZMax+cZMin/4
                 )
                 { mdf_NearGlobale = -1 }

              // il trovato esce davanti
              if ( cam_near2_dist01 >= cZMax+cZMin/4
                 & cam_near2_dist32 >= cZMax+cZMin/4
                 )
                 { mdf_NearGlobale = -2 }

              // si trova sulla sinistra ma lo sfiora soltanto
              if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                 & cam_near2_dist03 < cXMin
                 )
                 { mdf_NearGlobale = -3 }

              // si trova sulla destra ma lo sfiora soltanto
              if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                 & cam_near2_dist30 < cXMin
                 )
                 { mdf_NearGlobale = -4 }

              if (mdf_NearGlobale < 0)
                 {
                  VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, 0, 0, "")
                 }
             }
          cni=1
          while (cni <= cam_compNear)
             {
              cam_val_compNear = VAR_VAL(-1, STRCAT(nome_MdF_Var, "_##", STR(cni)))
              cam_nome_Var_compNear = STRCAT(nome_MdF_Var, "_##", STR(cni))
              VAR_CREATE_NUM(idx_MdF_Var, cam_nome_Var_compNear, cam_val_compNear, 0, "")
              cni = cni+1
             }
          DEL_VAR(-1, STRCAT(nome_MdF_Var, "*"))
         }
   }

   PROCEDURA MdF_Var_NEAR_GLOBALE3
   {
      mdf_distNear = 1
      if (VAR_EXIST(idx_MdF_Var, "CamSys_DistNear") )
         {
          mdf_distNear = VAR_VAL(idx_MdF_Var, "CamSys_DistNear")
         }

      BOX_MODE(0)
      NEAR_GLOBALE(nome_MdF_Var, idx_MToCtrl, mdf_distNear, 1, nome_Var_Bdm)

      _deb_idx_MToCtrl_NEAR_SX = idx_MToCtrl
      if (VAR_VAL(idx_MdF_Var, nome_MdF_Var) > 0)
         {
          mdf_NearGlobale = 0.5

          cbas0ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_0.x")
          cbas0ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_0.z")
          cbas0ToCtrl = [cbas0ToCtrl_x, 0, cbas0ToCtrl_z]
          cbas1ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_1.x")
          cbas1ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_1.z")
          cbas1ToCtrl = [cbas1ToCtrl_x, 0, cbas1ToCtrl_z]
          cbas2ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_2.x")
          cbas2ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_2.z")
          cbas2ToCtrl = [cbas2ToCtrl_x, 0, cbas2ToCtrl_z]
          cbas3ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_3.x")
          cbas3ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_3.z")
          cbas3ToCtrl = [cbas3ToCtrl_x, 0, cbas3ToCtrl_z]
          cXToCtrl = VAR_VAL(idx_MToCtrl, "X")
          cZToCtrl = VAR_VAL(idx_MToCtrl, "Z")

          cquantiNear = 0
          cnei=1
          cam_nome_Var_cNear = STRCAT(nome_MdF_Var, "_##", STR(cnei))
          while (VAR_EXIST(idx_MdF_Var, cam_nome_Var_cNear) )
             {
              mdf_NearGlobale = 1
              cam_nome_Val_cNear_idx = VAR_VAL(idx_MdF_Var, cam_nome_Var_cNear)

              cbas0Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.x")
              cbas0Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.z")
              cbas0Found = [cbas0Found_x, 0, cbas0Found_z]
              cbas1Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.x")
              cbas1Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.z")
              cbas1Found = [cbas1Found_x, 0, cbas1Found_z]
              cbas2Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.x")
              cbas2Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.z")
              cbas2Found = [cbas2Found_x, 0, cbas2Found_z]
              cbas3Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.x")
              cbas3Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.z")
              cbas3Found = [cbas3Found_x, 0, cbas3Found_z]
              cXFound = VAR_VAL(cam_nome_Val_cNear_idx, "X")
              cZFound = VAR_VAL(cam_nome_Val_cNear_idx, "Z")

              cam_near2_dist01 = DISTANZA(cbas0ToCtrl, cbas1Found)
              cam_near2_dist10 = DISTANZA(cbas1ToCtrl, cbas0Found)
              cam_near2_dist11 = DISTANZA(cbas1ToCtrl, cbas1Found)
              cam_near2_dist22 = DISTANZA(cbas2ToCtrl, cbas2Found)
              cam_near2_dist23 = DISTANZA(cbas2ToCtrl, cbas3Found)
              cam_near2_dist32 = DISTANZA(cbas3ToCtrl, cbas2Found)

              cam_near2_dist03 = DISTANZA(cbas0ToCtrl, cbas3Found)
              cam_near2_dist30 = DISTANZA(cbas3ToCtrl, cbas0Found)
              cam_near2_dist02 = DISTANZA(cbas0ToCtrl, cbas2Found)

              cZMax = cZToCtrl
              cZMin = cZFound
              if (cZFound > cZToCtrl)
                 {
                  cZMax = cZFound
                  cZMin = cZToCtrl
                 }

              cXMax = cXToCtrl
              cXMin = cXFound
              if (cXFound > cXToCtrl)
                 {
                  cXMax = cXFound
                  cXMin = cXToCtrl
                 }

              // il trovato esce dietro
              if ( cam_near2_dist10 >= cZMax+cZMin/4
                 & cam_near2_dist23 >= cZMax+cZMin/4
                 )
                 { mdf_NearGlobale = -1 }

              // il trovato esce davanti
              if ( cam_near2_dist01 >= cZMax+cZMin/4
                 & cam_near2_dist32 >= cZMax+cZMin/4
                 )
                 { mdf_NearGlobale = -2 }

              // si trova sulla sinistra ma lo sfiora soltanto
              if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                 & cam_near2_dist03 < cXMin
                 & cam_near2_dist03 > 0
                 )
                 {
                  mdf_NearGlobale = -3
                  mdf_NearGlobale_deb_idx_M3 = cam_nome_Val_cNear_idx
                 }

             // 27.06.2024 AOCL073203
              if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                 & cam_near2_dist02 < cXMin
                 & cam_near2_dist02 > mdf_distNear
                 & cam_near2_dist03 > 0
                 )
                 {
                  mdf_NearGlobale = -30
                  mdf_NearGlobale3_deb_SX_dist02 = cam_near2_dist02
                  mdf_NearGlobale3_deb_SX_idx_M30 = cam_nome_Val_cNear_idx
                 }

              // si trova sulla destra ma lo sfiora soltanto
              if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                 & cam_near2_dist30 < cXMin
                 & cam_near2_dist30 > 0
                 )
                 { mdf_NearGlobale = -4 }

             // 27.06.2024 AOCL073203
              if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                 & cam_near2_dist30 < cXMin
                 & cam_near2_dist30 > mdf_distNear
                 & cam_near2_dist30 > 0
                 )
                 {
                  mdf_NearGlobale = -40
                  mdf_NearGlobale3_deb_DX_dist30 = cam_near2_dist30
                  mdf_NearGlobale3_deb_DX_idx_M40 = cam_nome_Val_cNear_idx
                 }

              cbasToCtrl_by = VAR_VAL(idx_MToCtrl, "base_0.y")
              cbasToCtrl_ay = VAR_VAL(idx_MToCtrl, "alto_0.y")
              cbasFound_by = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.y")
              cbasFound_ay = VAR_VAL(cam_nome_Val_cNear_idx, "alto_0.y")

              // sfiora in basso
              if (cbasToCtrl_by+0.1>cbasFound_ay)
                 {
                  if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                     & cam_near2_dist03 < cXMin
                     )
                     { mdf_NearGlobale = -3.1 }

                  if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                     & cam_near2_dist30 < cXMin
                     )
                     { mdf_NearGlobale = -4.1 }
                 }
              // sfiora in alto
              if (cbasToCtrl_ay-0.1<cbasFound_by)
                 {
                  if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                     & cam_near2_dist03 < cXMin
                     )
                     { mdf_NearGlobale = -3.2 }

                  if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                     & cam_near2_dist30 < cXMin
                     )
                     { mdf_NearGlobale = -4.2 }
                 }

              if (mdf_NearGlobale > 0)
                 {
                  cquantiNear = cquantiNear+1
                  mdf_NearGlobale_deb = mdf_NearGlobale
                  VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, cquantiNear, 0, "")
                 }

              if ( mdf_NearGlobale < 0
                 & cquantiNear == 0
                 )
                 {
                  mdf_NearGlobale_deb = mdf_NearGlobale
                  VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, 0, 0, "")
                 }
              cnei = cnei+1
              cam_nome_Var_cNear = STRCAT(nome_MdF_Var, "_##", STR(cnei))
             }
         }

      if (ATTUALE() == -1)
         {
          NEAR_GLOBALE(STRCAT("$", nome_MdF_Var), idx_MToCtrl, mdf_distNear, 1, nome_Var_Bdm)
          cam_compNear = VAR_VAL(-1, nome_MdF_Var)
          if (cam_compNear > 0)
             {
              mdf_NearGlobale = 2
              VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, cam_compNear, 0, "")

             // 27.03.2018
              cbas0ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_0.x")
              cbas0ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_0.z")
              cbas0ToCtrl = [cbas0ToCtrl_x, 0, cbas0ToCtrl_z]
              cbas1ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_1.x")
              cbas1ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_1.z")
              cbas1ToCtrl = [cbas1ToCtrl_x, 0, cbas1ToCtrl_z]
              cbas2ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_2.x")
              cbas2ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_2.z")
              cbas2ToCtrl = [cbas2ToCtrl_x, 0, cbas2ToCtrl_z]
              cbas3ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_3.x")
              cbas3ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_3.z")
              cbas3ToCtrl = [cbas3ToCtrl_x, 0, cbas3ToCtrl_z]
              cXToCtrl = VAR_VAL(idx_MToCtrl, "X")
              cZToCtrl = VAR_VAL(idx_MToCtrl, "Z")

              cnei=1
              //cam_nome_Var_cNear = STRCAT("$", nome_MdF_Var, "_##", STR(cnei))
              while (VAR_EXIST(-1, cam_nome_Var_cNear) )
                 {
                  cam_nome_Val_cNear_idx = VAR_VAL(-1, cam_nome_Var_cNear)

                  cbas0Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.x")
                  cbas0Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.z")
                  cbas0Found = [cbas0Found_x, 0, cbas0Found_z]
                  cbas1Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.x")
                  cbas1Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.z")
                  cbas1Found = [cbas1Found_x, 0, cbas1Found_z]
                  cbas2Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.x")
                  cbas2Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.z")
                  cbas2Found = [cbas2Found_x, 0, cbas2Found_z]
                  cbas3Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.x")
                  cbas3Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.z")
                  cbas3Found = [cbas3Found_x, 0, cbas3Found_z]
                  cXFound = VAR_VAL(cam_nome_Val_cNear_idx, "X")
                  cZFound = VAR_VAL(cam_nome_Val_cNear_idx, "Z")

                  cam_near2_dist01 = DISTANZA(cbas0ToCtrl, cbas1Found)
                  cam_near2_dist10 = DISTANZA(cbas1ToCtrl, cbas0Found)
                  cam_near2_dist11 = DISTANZA(cbas1ToCtrl, cbas1Found)
                  cam_near2_dist22 = DISTANZA(cbas2ToCtrl, cbas2Found)
                  cam_near2_dist23 = DISTANZA(cbas2ToCtrl, cbas3Found)
                  cam_near2_dist32 = DISTANZA(cbas3ToCtrl, cbas2Found)

                  cam_near2_dist03 = DISTANZA(cbas0ToCtrl, cbas3Found)
                  cam_near2_dist30 = DISTANZA(cbas3ToCtrl, cbas0Found)
                  cam_near2_dist02 = DISTANZA(cbas0ToCtrl, cbas2Found)

                  cZMax = cZToCtrl
                  cZMin = cZFound
                  if (cZFound > cZToCtrl)
                     {
                      cZMax = cZFound
                      cZMin = cZToCtrl
                     }

                  cXMax = cXToCtrl
                  cXMin = cXFound
                  if (cXFound > cXToCtrl)
                     {
                      cXMax = cXFound
                      cXMin = cXToCtrl
                     }

                  // il trovato esce dietro
                  if ( cam_near2_dist10 >= cZMax+cZMin/4
                     & cam_near2_dist23 >= cZMax+cZMin/4
                     )
                     { mdf_NearGlobale = -1 }

                  // il trovato esce davanti
                  if ( cam_near2_dist01 >= cZMax+cZMin/4
                     & cam_near2_dist32 >= cZMax+cZMin/4
                     )
                     { mdf_NearGlobale = -2 }

                  // si trova sulla sinistra ma lo sfiora soltanto
                  if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                     & cam_near2_dist03 < cXMin
                     // se zero però e' appoggiato
                     & cam_near2_dist03 > 0
                     )
                     { mdf_NearGlobale = -3 }

                 // 27.06.2024 AOCL073203
                  if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                     & cam_near2_dist02 < cXMin
                     & cam_near2_dist02 > mdf_distNear
                     & cam_near2_dist03 > 0
                     )
                     { mdf_NearGlobale = -3.1 }

                  // si trova sulla destra ma lo sfiora soltanto
                  if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                     & cam_near2_dist30 < cXMin
                     // se zero però e' appoggiato
                     & cam_near2_dist30 > 0
                     )
                     { mdf_NearGlobale = -4 }

                  cbasToCtrl_by = VAR_VAL(idx_MToCtrl, "base_0.y")
                  cbasToCtrl_ay = VAR_VAL(idx_MToCtrl, "alto_0.y")
                  cbasFound_by = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.y")
                  cbasFound_ay = VAR_VAL(cam_nome_Val_cNear_idx, "alto_0.y")

                 // 14.07.2022 06415
                  // sfiora in basso
                  if (cbasToCtrl_by+0.1>cbasFound_ay)
                     {
                      if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                         & cam_near2_dist03 < cXMin
                         )
                         { mdf_NearGlobale = -3.1 }

                      if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                         & cam_near2_dist30 < cXMin
                         )
                         { mdf_NearGlobale = -4.1 }
                     }
                  // sfiora in alto
                  if (cbasToCtrl_ay-0.1<cbasFound_by)
                     {
                      if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                         & cam_near2_dist03 < cXMin
                         )
                         { mdf_NearGlobale = -3.2 }

                      if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                         & cam_near2_dist30 < cXMin
                         )
                         { mdf_NearGlobale = -4.2 }
                     }

                  if (mdf_NearGlobale > 0)
                     {
                      cquantiNear = cquantiNear+1
                      mdf_NearGlobale_deb = mdf_NearGlobale
                      VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, cquantiNear, 0, "")
                      // altrimenti in Ambito Globale vale quella creata dal NEAR_GLOBALE di inizio procedura
                      retEvalVar = EVAL(STRCAT(nome_MdF_Var, "=", STR(cquantiNear)))
                     }

                  if ( mdf_NearGlobale < 0
                     & cquantiNear == 0
                     )
                     {
                      mdf_NearGlobale_deb = mdf_NearGlobale
                      VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, 0, 0, "")
                      // altrimenti in Ambito Globale vale quella creata dal NEAR_GLOBALE di inizio procedura
                      retEvalVar = EVAL(STRCAT(nome_MdF_Var, "=", STR(cquantiNear)))
                      VAR_CREATE_NUM(idx_MdF_Var, STRCAT(nome_MdF_Var, "_mdf_NearGlobale"), mdf_NearGlobale, 0, "")
                     }
                  cnei = cnei+1
                  cam_nome_Var_cNear = STRCAT(nome_MdF_Var, "_##", STR(cnei))
                 }
             }
          cni=1
          while (cni <= cam_compNear)
             {
              cam_val_compNear = VAR_VAL(-1, STRCAT(nome_MdF_Var, "_##", STR(cni)))
              cam_nome_Var_compNear = STRCAT(nome_MdF_Var, "_##", STR(cni))
              VAR_CREATE_NUM(idx_MdF_Var, cam_nome_Var_compNear, cam_val_compNear, 0, "")
              cni = cni+1
             }
          DEL_VAR(-1, STRCAT(nome_MdF_Var, "*"))
         }
   }

   PROCEDURA MdF_Var_NEAR_GLOBALESX
   {
      mdf_distNear = 1
      if (VAR_EXIST(idx_MdF_Var, "CamSys_DistNear") )
         {
          mdf_distNear = VAR_VAL(idx_MdF_Var, "CamSys_DistNear")
         }

      BOX_MODE(0)
      NEAR_GLOBALE(nome_MdF_Var, idx_MToCtrl, mdf_distNear, 1, nome_Var_Bdm)

      if (VAR_VAL(idx_MdF_Var, nome_MdF_Var) > 0)
         {
          mdf_NearGlobale = 0.5

          cbas0ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_0.x")
          cbas0ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_0.z")
          cbas0ToCtrl = [cbas0ToCtrl_x, 0, cbas0ToCtrl_z]
          cbas1ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_1.x")
          cbas1ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_1.z")
          cbas1ToCtrl = [cbas1ToCtrl_x, 0, cbas1ToCtrl_z]
          cbas2ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_2.x")
          cbas2ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_2.z")
          cbas2ToCtrl = [cbas2ToCtrl_x, 0, cbas2ToCtrl_z]
          cbas3ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_3.x")
          cbas3ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_3.z")
          cbas3ToCtrl = [cbas3ToCtrl_x, 0, cbas3ToCtrl_z]
          cXToCtrl = VAR_VAL(idx_MToCtrl, "X")
          cZToCtrl = VAR_VAL(idx_MToCtrl, "Z")

          cquantiNear = 0
          cnei=1
          cam_nome_Var_cNear = STRCAT(nome_MdF_Var, "_##", STR(cnei))
          while (VAR_EXIST(idx_MdF_Var, cam_nome_Var_cNear) )
             {
              mdf_NearGlobale = 1
              cam_nome_Val_cNear_idx = VAR_VAL(idx_MdF_Var, cam_nome_Var_cNear)

              cbas0Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.x")
              cbas0Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.z")
              cbas0Found = [cbas0Found_x, 0, cbas0Found_z]
              cbas1Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.x")
              cbas1Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.z")
              cbas1Found = [cbas1Found_x, 0, cbas1Found_z]
              cbas2Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.x")
              cbas2Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.z")
              cbas2Found = [cbas2Found_x, 0, cbas2Found_z]
              cbas3Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.x")
              cbas3Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.z")
              cbas3Found = [cbas3Found_x, 0, cbas3Found_z]
              cXFound = VAR_VAL(cam_nome_Val_cNear_idx, "X")
              cZFound = VAR_VAL(cam_nome_Val_cNear_idx, "Z")

              cam_near2_dist01 = DISTANZA(cbas0ToCtrl, cbas1Found)
              cam_near2_dist10 = DISTANZA(cbas1ToCtrl, cbas0Found)
              cam_near2_dist11 = DISTANZA(cbas1ToCtrl, cbas1Found)
              cam_near2_dist22 = DISTANZA(cbas2ToCtrl, cbas2Found)
              cam_near2_dist23 = DISTANZA(cbas2ToCtrl, cbas3Found)
              cam_near2_dist32 = DISTANZA(cbas3ToCtrl, cbas2Found)

              cam_near2_dist03 = DISTANZA(cbas0ToCtrl, cbas3Found)
              cam_near2_dist30 = DISTANZA(cbas3ToCtrl, cbas0Found)
              cam_near2_dist02 = DISTANZA(cbas0ToCtrl, cbas2Found)

              cZMax = cZToCtrl
              cZMin = cZFound
              if (cZFound > cZToCtrl)
                 {
                  cZMax = cZFound
                  cZMin = cZToCtrl
                 }

              cXMax = cXToCtrl
              cXMin = cXFound
              if (cXFound > cXToCtrl)
                 {
                  cXMax = cXFound
                  cXMin = cXToCtrl
                 }

              cam_near2_dist00 = DISTANZA(cbas0ToCtrl, cbas0Found)
              if ( cam_near2_dist00 > 76
                 & cam_near2_dist02 > 76
                 & cam_near2_dist01 > 76
                 & cam_near2_dist03 > 76
                 )
                 {
                  mdf_NearGlobale = -100
                  mdf_NearGlobale_SX_deb_idx_M100 = cam_nome_Val_cNear_idx
                 }

              // il trovato esce davanti
              if ( cam_near2_dist01 >= cZMax+cZMin/4
                 & cam_near2_dist32 >= cZMax+cZMin/4
                 )
                 { mdf_NearGlobale = -2 }

              // si trova sulla sinistra ma lo sfiora soltanto
              if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                 & cam_near2_dist03 < cXMin
                 & cam_near2_dist03 > 0
                 )
                 {
                  mdf_NearGlobale = -3
                  mdf_NearGlobale_deb_idx_M3 = cam_nome_Val_cNear_idx
                 }

             // 27.06.2024 AOCL073203
              if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                 // 01.07.2024 AOCL66727
                 & cam_near2_dist02+2 < cXMin
                 & cam_near2_dist02 > mdf_distNear
                 & cam_near2_dist03 > 0
                 )
                 {
                  // 12.03.2025 A 18744
                   mdf_NearGlobaleSX_distNear = mdf_distNear
                   mdf_nearSX_spe = VAR_VAL(cam_nome_Val_cNear_idx, "X")
                   if (cam_near2_dist01+cam_near2_dist02 > mdf_nearSX_spe+mdf_distNear-0.5)
                      {
                       mdf_NearGlobale = -30
                       mdf_NearGlobale_deb_SX_dist02 = cam_near2_dist02
                       mdf_NearGlobale_deb_SX_idx_M30 = cam_nome_Val_cNear_idx
                      }
                 }

              // si trova sulla destra ma lo sfiora soltanto
              if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                 & cam_near2_dist30 < cXMin
                 & cam_near2_dist30 > 0
                 )
                 { mdf_NearGlobale = -4 }

              cbasToCtrl_by = VAR_VAL(idx_MToCtrl, "base_0.y")
              cbasToCtrl_ay = VAR_VAL(idx_MToCtrl, "alto_0.y")
              cbasFound_by = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.y")
              cbasFound_ay = VAR_VAL(cam_nome_Val_cNear_idx, "alto_0.y")

              // sfiora in basso
              if (cbasToCtrl_by+0.1>cbasFound_ay)
                 {
                  if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                     & cam_near2_dist03 < cXMin
                     )
                     { mdf_NearGlobale = -3.1 }

                  if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                     & cam_near2_dist30 < cXMin
                     )
                     { mdf_NearGlobale = -4.1 }
                 }
              // sfiora in alto
              if (cbasToCtrl_ay-0.1<cbasFound_by)
                 {
                  if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                     & cam_near2_dist03 < cXMin
                     )
                     { mdf_NearGlobale = -3.2 }

                  if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                     & cam_near2_dist30 < cXMin
                     )
                     { mdf_NearGlobale = -4.2 }
                 }

              if (mdf_NearGlobale > 0)
                 {
                  cquantiNear = cquantiNear+1
                  mdf_NearGlobale_deb = mdf_NearGlobale
                  VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, cquantiNear, 0, "")
                 }

              if ( mdf_NearGlobale < 0
                 & cquantiNear == 0
                 )
                 {
                  mdf_NearGlobale_deb = mdf_NearGlobale
                  VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, 0, 0, "")
                 }
              cnei = cnei+1
              cam_nome_Var_cNear = STRCAT(nome_MdF_Var, "_##", STR(cnei))
             }
         }

      // SX globale
      if (ATTUALE() == -1)
         {
          NEAR_GLOBALE(STRCAT("$", nome_MdF_Var), idx_MToCtrl, mdf_distNear, 1, nome_Var_Bdm)
          cam_compNear = VAR_VAL(-1, nome_MdF_Var)
          if (cam_compNear > 0)
             {
              mdf_NearGlobale = 2
              VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, cam_compNear, 0, "")

             // 27.03.2018
              cbas0ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_0.x")
              cbas0ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_0.z")
              cbas0ToCtrl = [cbas0ToCtrl_x, 0, cbas0ToCtrl_z]
              cbas1ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_1.x")
              cbas1ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_1.z")
              cbas1ToCtrl = [cbas1ToCtrl_x, 0, cbas1ToCtrl_z]
              cbas2ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_2.x")
              cbas2ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_2.z")
              cbas2ToCtrl = [cbas2ToCtrl_x, 0, cbas2ToCtrl_z]
              cbas3ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_3.x")
              cbas3ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_3.z")
              cbas3ToCtrl = [cbas3ToCtrl_x, 0, cbas3ToCtrl_z]
              cXToCtrl = VAR_VAL(idx_MToCtrl, "X")
              cZToCtrl = VAR_VAL(idx_MToCtrl, "Z")

              cquantiNear = 0
              cnei=1
              //cam_nome_Var_cNear = STRCAT("$", nome_MdF_Var, "_##", STR(cnei))
              cam_nome_Var_cNear = STRCAT(nome_MdF_Var, "_##", STR(cnei))
              while (VAR_EXIST(-1, cam_nome_Var_cNear) )
                 {
                  cam_nome_Val_cNear_idx = VAR_VAL(-1, cam_nome_Var_cNear)

                  cbas0Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.x")
                  cbas0Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.z")
                  cbas0Found = [cbas0Found_x, 0, cbas0Found_z]
                  cbas1Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.x")
                  cbas1Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.z")
                  cbas1Found = [cbas1Found_x, 0, cbas1Found_z]
                  cbas2Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.x")
                  cbas2Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.z")
                  cbas2Found = [cbas2Found_x, 0, cbas2Found_z]
                  cbas3Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.x")
                  cbas3Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.z")
                  cbas3Found = [cbas3Found_x, 0, cbas3Found_z]
                  cXFound = VAR_VAL(cam_nome_Val_cNear_idx, "X")
                  cZFound = VAR_VAL(cam_nome_Val_cNear_idx, "Z")

                  cam_near2_dist01 = DISTANZA(cbas0ToCtrl, cbas1Found)
                  cam_near2_dist10 = DISTANZA(cbas1ToCtrl, cbas0Found)
                  cam_near2_dist11 = DISTANZA(cbas1ToCtrl, cbas1Found)
                  cam_near2_dist22 = DISTANZA(cbas2ToCtrl, cbas2Found)
                  cam_near2_dist23 = DISTANZA(cbas2ToCtrl, cbas3Found)
                  cam_near2_dist32 = DISTANZA(cbas3ToCtrl, cbas2Found)

                  cam_near2_dist03 = DISTANZA(cbas0ToCtrl, cbas3Found)
                  cam_near2_dist30 = DISTANZA(cbas3ToCtrl, cbas0Found)
                  cam_near2_dist02 = DISTANZA(cbas0ToCtrl, cbas2Found)

                  cZMax = cZToCtrl
                  cZMin = cZFound
                  if (cZFound > cZToCtrl)
                     {
                      cZMax = cZFound
                      cZMin = cZToCtrl
                     }

                  cXMax = cXToCtrl
                  cXMin = cXFound
                  if (cXFound > cXToCtrl)
                     {
                      cXMax = cXFound
                      cXMin = cXToCtrl
                     }

                  cam_near2_dist00 = DISTANZA(cbas0ToCtrl, cbas0Found)
                  if ( cam_near2_dist00 > 76
                     & cam_near2_dist02 > 76
                     & cam_near2_dist01 > 76
                     & cam_near2_dist03 > 76
                     )
                     {
                      mdf_NearGlobale = -100
                      mdf_NearGlobale_SX_deb_idx_M100 = cam_nome_Val_cNear_idx
                     }

                  // il trovato esce davanti
                  if ( cam_near2_dist01 >= cZMax+cZMin/4
                     & cam_near2_dist32 >= cZMax+cZMin/4
                     )
                     { mdf_NearGlobale = -2 }

                  // si trova sulla sinistra ma lo sfiora soltanto
                  if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                     & cam_near2_dist03 < cXMin
                     // se zero però e' appoggiato
                     & cam_near2_dist03 > 0
                     )
                     { mdf_NearGlobale = -3 }

                 // 27.06.2024 AOCL073203
                  if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                     & cam_near2_dist02+2 < cXMin
                     & cam_near2_dist02 > mdf_distNear
                     & cam_near2_dist03 > 0
                     )
                     {
                     // 12.03.2025 A 18744
                      mdf_NearGlobaleSX_distNear = mdf_distNear
                      mdf_nearSX_spe = VAR_VAL(cam_nome_Val_cNear_idx, "X")
                      if (cam_near2_dist01+cam_near2_dist02 > mdf_nearSX_spe+mdf_distNear-0.5)
                         {
                          mdf_NearGlobale = -30
                          mdf_NearGlobale3_deb_SX_dist02 = cam_near2_dist02
                          mdf_NearGlobale3_deb_SX_idx_M30 = cam_nome_Val_cNear_idx
                         }
                     }

                  // si trova sulla destra ma lo sfiora soltanto
                  if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                     & cam_near2_dist30 < cXMin
                     // se zero però e' appoggiato
                     & cam_near2_dist30 > 0
                     )
                     { mdf_NearGlobale = -4 }

                  cbasToCtrl_by = VAR_VAL(idx_MToCtrl, "base_0.y")
                  cbasToCtrl_ay = VAR_VAL(idx_MToCtrl, "alto_0.y")
                  cbasFound_by = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.y")
                  cbasFound_ay = VAR_VAL(cam_nome_Val_cNear_idx, "alto_0.y")

                 // 14.07.2022 06415
                  // sfiora in basso
                  if (cbasToCtrl_by+0.1>cbasFound_ay)
                     {
                      if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                         & cam_near2_dist03 < cXMin
                         )
                         { mdf_NearGlobale = -3.1 }

                      if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                         & cam_near2_dist30 < cXMin
                         )
                         { mdf_NearGlobale = -4.1 }
                     }
                  // sfiora in alto
                  if (cbasToCtrl_ay-0.1<cbasFound_by)
                     {
                      if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                         & cam_near2_dist03 < cXMin
                         )
                         { mdf_NearGlobale = -3.2 }

                      if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                         & cam_near2_dist30 < cXMin
                         )
                         { mdf_NearGlobale = -4.2 }
                     }

                  if (mdf_NearGlobale > 0)
                     {
                      cquantiNear = cquantiNear+1
                      mdf_NearGlobale_deb = mdf_NearGlobale
                      VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, cquantiNear, 0, "")
                      // altrimenti in Ambito Globale vale quella creata dal NEAR_GLOBALE di inizio procedura
                      retEvalVar = EVAL(STRCAT(nome_MdF_Var, "=", STR(cquantiNear)))
                     }
                  if ( mdf_NearGlobale < 0
                     & cquantiNear == 0
                     )
                     {
                      mdf_NearGlobale_deb = mdf_NearGlobale
                      VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, 0, 0, "")
                      // altrimenti in Ambito Globale vale quella creata dal NEAR_GLOBALE di inizio procedura
                      retEvalVar = EVAL(STRCAT(nome_MdF_Var, "=", STR(0)))
                      VAR_CREATE_NUM(idx_MdF_Var, STRCAT(nome_MdF_Var, "_mdf_NearGlobale"), mdf_NearGlobale, 0, "")
                     }
                  cnei = cnei+1
                  cam_nome_Var_cNear = STRCAT(nome_MdF_Var, "_##", STR(cnei))
                 }
             }
          cni=1
          while (cni <= cam_compNear)
             {
              cam_val_compNear = VAR_VAL(-1, STRCAT(nome_MdF_Var, "_##", STR(cni)))
              cam_nome_Var_compNear = STRCAT(nome_MdF_Var, "_##", STR(cni))
              VAR_CREATE_NUM(idx_MdF_Var, cam_nome_Var_compNear, cam_val_compNear, 0, "")
              cni = cni+1
             }
          DEL_VAR(-1, STRCAT(nome_MdF_Var, "*"))
         }
   }

   PROCEDURA MdF_Var_NEAR_GLOBALEDX
   {
      mdf_distNear = 1
      if (VAR_EXIST(idx_MdF_Var, "CamSys_DistNear") )
         {
          mdf_distNear = VAR_VAL(idx_MdF_Var, "CamSys_DistNear")
         }

      BOX_MODE(0)
      NEAR_GLOBALE(nome_MdF_Var, idx_MToCtrl, mdf_distNear, 1, nome_Var_Bdm)

      _deb_idx_MToCtrl_NEAR_DX = idx_MToCtrl
      if (VAR_VAL(idx_MdF_Var, nome_MdF_Var) > 0)
         {
          mdf_NearGlobale = 0.5

          cbas0ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_0.x")
          cbas0ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_0.z")
          cbas0ToCtrl = [cbas0ToCtrl_x, 0, cbas0ToCtrl_z]
          cbas1ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_1.x")
          cbas1ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_1.z")
          cbas1ToCtrl = [cbas1ToCtrl_x, 0, cbas1ToCtrl_z]
          cbas2ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_2.x")
          cbas2ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_2.z")
          cbas2ToCtrl = [cbas2ToCtrl_x, 0, cbas2ToCtrl_z]
          cbas3ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_3.x")
          cbas3ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_3.z")
          cbas3ToCtrl = [cbas3ToCtrl_x, 0, cbas3ToCtrl_z]
          cXToCtrl = VAR_VAL(idx_MToCtrl, "X")
          cZToCtrl = VAR_VAL(idx_MToCtrl, "Z")

          cquantiNear = 0
          cnei=1
          cam_nome_Var_cNear = STRCAT(nome_MdF_Var, "_##", STR(cnei))
          while (VAR_EXIST(idx_MdF_Var, cam_nome_Var_cNear) )
             {
              mdf_NearGlobale = 1
              cam_nome_Val_cNear_idx = VAR_VAL(idx_MdF_Var, cam_nome_Var_cNear)

              cbas0Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.x")
              cbas0Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.z")
              cbas0Found = [cbas0Found_x, 0, cbas0Found_z]
              cbas1Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.x")
              cbas1Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.z")
              cbas1Found = [cbas1Found_x, 0, cbas1Found_z]
              cbas2Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.x")
              cbas2Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.z")
              cbas2Found = [cbas2Found_x, 0, cbas2Found_z]
              cbas3Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.x")
              cbas3Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.z")
              cbas3Found = [cbas3Found_x, 0, cbas3Found_z]
              cXFound = VAR_VAL(cam_nome_Val_cNear_idx, "X")
              cZFound = VAR_VAL(cam_nome_Val_cNear_idx, "Z")

              cam_near2_dist01 = DISTANZA(cbas0ToCtrl, cbas1Found)
              cam_near2_dist10 = DISTANZA(cbas1ToCtrl, cbas0Found)
              cam_near2_dist11 = DISTANZA(cbas1ToCtrl, cbas1Found)
              cam_near2_dist22 = DISTANZA(cbas2ToCtrl, cbas2Found)
              cam_near2_dist23 = DISTANZA(cbas2ToCtrl, cbas3Found)
              cam_near2_dist32 = DISTANZA(cbas3ToCtrl, cbas2Found)

              cam_near2_dist03 = DISTANZA(cbas0ToCtrl, cbas3Found)
              cam_near2_dist30 = DISTANZA(cbas3ToCtrl, cbas0Found)
              cam_near2_dist02 = DISTANZA(cbas0ToCtrl, cbas2Found)

              cZMax = cZToCtrl
              cZMin = cZFound
              if (cZFound > cZToCtrl)
                 {
                  cZMax = cZFound
                  cZMin = cZToCtrl
                 }

              cXMax = cXToCtrl
              cXMin = cXFound
              if (cXFound > cXToCtrl)
                 {
                  cXMax = cXFound
                  cXMin = cXToCtrl
                 }

              cam_near2_dist31 = DISTANZA(cbas3ToCtrl, cbas1Found)
              cam_near2_dist33 = DISTANZA(cbas3ToCtrl, cbas3Found)
             // 27.06.2024 AOCL073203
              if ( cam_near2_dist30 > 76
                 & cam_near2_dist32 > 76
                 & cam_near2_dist31 > 76
                 & cam_near2_dist33 > 76
                 )
                 {
                  mdf_NearGlobale = -100
                  mdf_NearGlobale_DX_deb_idx_M100 = cam_nome_Val_cNear_idx
                 }

              // il trovato esce davanti
              if ( cam_near2_dist01 >= cZMax+cZMin/4
                 & cam_near2_dist32 >= cZMax+cZMin/4
                 )
                 { mdf_NearGlobale = -2 }

              // si trova sulla sinistra ma lo sfiora soltanto
              if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                 & cam_near2_dist03 < cXMin
                 & cam_near2_dist03 > 0
                 )
                 {
                  mdf_NearGlobale = -3
                  mdf_NearGlobale_deb_idx_M3 = cam_nome_Val_cNear_idx
                 }

              if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                 & cam_near2_dist02+2 < cXMin
                 & cam_near2_dist02 > mdf_distNear
                 & cam_near2_dist03 > 0
                 )
                 { mdf_NearGlobale = -30 }

              // si trova sulla destra ma lo sfiora soltanto
              if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                 & cam_near2_dist30 < cXMin
                 & cam_near2_dist30 > 0
                 )
                 { mdf_NearGlobale = -4 }

             // 27.06.2024 AOCL073203
              if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                 & cam_near2_dist30+2 < cXMin
                 & cam_near2_dist30 > mdf_distNear
                 & cam_near2_dist30 > 0
                 )
                 {
                  mdf_NearGlobale = -40
                  mdf_NearGlobale_deb_DX_dist30 = cam_near2_dist30
                  mdf_NearGlobale_deb_DX_idx_M40 = cam_nome_Val_cNear_idx
                 }

              cbasToCtrl_by = VAR_VAL(idx_MToCtrl, "base_0.y")
              cbasToCtrl_ay = VAR_VAL(idx_MToCtrl, "alto_0.y")
              cbasFound_by = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.y")
              cbasFound_ay = VAR_VAL(cam_nome_Val_cNear_idx, "alto_0.y")

              // sfiora in basso
              if (cbasToCtrl_by+0.1>cbasFound_ay)
                 {
                  if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                     & cam_near2_dist03 < cXMin
                     )
                     { mdf_NearGlobale = -3.1 }

                  if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                     & cam_near2_dist30 < cXMin
                     )
                     { mdf_NearGlobale = -4.1 }
                 }
              // sfiora in alto
              if (cbasToCtrl_ay-0.1<cbasFound_by)
                 {
                  if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                     & cam_near2_dist03 < cXMin
                     )
                     { mdf_NearGlobale = -3.2 }

                  if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                     & cam_near2_dist30 < cXMin
                     )
                     { mdf_NearGlobale = -4.2 }
                 }

              if (mdf_NearGlobale > 0)
                 {
                  cquantiNear = cquantiNear+1
                  mdf_NearGlobale_deb = mdf_NearGlobale
                  VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, cquantiNear, 0, "")
                 }

              if ( mdf_NearGlobale < 0
                 & cquantiNear == 0
                 )
                 {
                  mdf_NearGlobale_deb = mdf_NearGlobale
                  VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, 0, 0, "")
                 }
              cnei = cnei+1
              cam_nome_Var_cNear = STRCAT(nome_MdF_Var, "_##", STR(cnei))
             }
         }

      // DX globale
      if (ATTUALE() == -1)
         {
          NEAR_GLOBALE(STRCAT("$", nome_MdF_Var), idx_MToCtrl, mdf_distNear, 1, nome_Var_Bdm)
          cam_compNear = VAR_VAL(-1, nome_MdF_Var)
          if (cam_compNear > 0)
             {
              mdf_NearGlobale = 2
              VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, cam_compNear, 0, "")

             // 27.03.2018
              cbas0ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_0.x")
              cbas0ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_0.z")
              cbas0ToCtrl = [cbas0ToCtrl_x, 0, cbas0ToCtrl_z]
              VAR_CREATE_XYZ(idx_MdF_Var, "cbas0ToCtrl", cbas0ToCtrl_x, 0, cbas0ToCtrl_z, 0, "")
              cbas1ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_1.x")
              cbas1ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_1.z")
              cbas1ToCtrl = [cbas1ToCtrl_x, 0, cbas1ToCtrl_z]
              VAR_CREATE_XYZ(idx_MdF_Var, "cbas1ToCtrl", cbas1ToCtrl_x, 0, cbas1ToCtrl_z, 0, "")
              cbas2ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_2.x")
              cbas2ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_2.z")
              cbas2ToCtrl = [cbas2ToCtrl_x, 0, cbas2ToCtrl_z]
              VAR_CREATE_XYZ(idx_MdF_Var, "cbas2ToCtrl", cbas2ToCtrl_x, 0, cbas2ToCtrl_z, 0, "")
              cbas3ToCtrl_x = VAR_VAL(idx_MToCtrl, "base_3.x")
              cbas3ToCtrl_z = VAR_VAL(idx_MToCtrl, "base_3.z")
              cbas3ToCtrl = [cbas3ToCtrl_x, 0, cbas3ToCtrl_z]
              VAR_CREATE_XYZ(idx_MdF_Var, "cbas3ToCtrl", cbas3ToCtrl_x, 0, cbas3ToCtrl_z, 0, "")
              cXToCtrl = VAR_VAL(idx_MToCtrl, "X")
              cZToCtrl = VAR_VAL(idx_MToCtrl, "Z")

              cquantiNear = 0
              cnei=1
              //cam_nome_Var_cNear = STRCAT("$", nome_MdF_Var, "_##", STR(cnei))
              cam_nome_Var_cNear = STRCAT(nome_MdF_Var, "_##", STR(cnei))
              while (VAR_EXIST(-1, cam_nome_Var_cNear) )
                 {
                  cam_nome_Val_cNear_idx = VAR_VAL(-1, cam_nome_Var_cNear)

                  cbas0Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.x")
                  cbas0Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.z")
                  cbas0Found = [cbas0Found_x, 0, cbas0Found_z]
                  VAR_CREATE_XYZ(idx_MdF_Var, "cbas0Found", cbas0Found_x, 0, cbas0Found_z, 0, "")
                  cbas1Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.x")
                  cbas1Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_1.z")
                  cbas1Found = [cbas1Found_x, 0, cbas1Found_z]
                  VAR_CREATE_XYZ(idx_MdF_Var, "cbas1Found", cbas1Found_x, 0, cbas1Found_z, 0, "")
                  cbas2Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.x")
                  cbas2Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_2.z")
                  cbas2Found = [cbas2Found_x, 0, cbas2Found_z]
                  VAR_CREATE_XYZ(idx_MdF_Var, "cbas2Found", cbas2Found_x, 0, cbas2Found_z, 0, "")
                  cbas3Found_x = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.x")
                  cbas3Found_z = VAR_VAL(cam_nome_Val_cNear_idx, "base_3.z")
                  cbas3Found = [cbas3Found_x, 0, cbas3Found_z]
                  VAR_CREATE_XYZ(idx_MdF_Var, "cbas3Found", cbas3Found_x, 0, cbas3Found_z, 0, "")
                  cXFound = VAR_VAL(cam_nome_Val_cNear_idx, "X")
                  cZFound = VAR_VAL(cam_nome_Val_cNear_idx, "Z")

                 // vedi anche PCP051002 MAcro CAM errore parser se commento cbas0ToCtrl e lascio solo il VAR_CREATE_XYZ
                  cam_near2_dist01 = DISTANZA(cbas0ToCtrl, cbas1Found)
                  cam_near2_dist10 = DISTANZA(cbas1ToCtrl, cbas0Found)
                  cam_near2_dist11 = DISTANZA(cbas1ToCtrl, cbas1Found)
                  cam_near2_dist22 = DISTANZA(cbas2ToCtrl, cbas2Found)
                  cam_near2_dist23 = DISTANZA(cbas2ToCtrl, cbas3Found)
                  cam_near2_dist32 = DISTANZA(cbas3ToCtrl, cbas2Found)

                  cam_near2_dist03 = DISTANZA(cbas0ToCtrl, cbas3Found)
                  cam_near2_dist30 = DISTANZA(cbas3ToCtrl, cbas0Found)
                  cam_near2_dist02 = DISTANZA(cbas0ToCtrl, cbas2Found)

                  cZMax = cZToCtrl
                  cZMin = cZFound
                  if (cZFound > cZToCtrl)
                     {
                      cZMax = cZFound
                      cZMin = cZToCtrl
                     }

                  cXMax = cXToCtrl
                  cXMin = cXFound
                  if (cXFound > cXToCtrl)
                     {
                      cXMax = cXFound
                      cXMin = cXToCtrl
                     }

                  cam_near2_dist31 = DISTANZA(cbas3ToCtrl, cbas1Found)
                  cam_near2_dist33 = DISTANZA(cbas3ToCtrl, cbas3Found)
                  if ( cam_near2_dist30 > 76
                     & cam_near2_dist32 > 76
                     & cam_near2_dist31 > 76
                     & cam_near2_dist33 > 76
                     )
                     {
                      mdf_NearGlobale = -100
                      mdf_NearGlobale_DX_deb_idx_M100 = cam_nome_Val_cNear_idx
                     }

                  // il trovato esce davanti
                  if ( cam_near2_dist01 >= cZMax+cZMin/4
                     & cam_near2_dist32 >= cZMax+cZMin/4
                     )
                     { mdf_NearGlobale = -2 }

                  // si trova sulla sinistra ma lo sfiora soltanto
                  if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                     & cam_near2_dist03 < cXMin
                     // se zero però e' appoggiato
                     & cam_near2_dist03 > 0
                     )
                     { mdf_NearGlobale = -3 }

                  if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                     & cam_near2_dist02+2 < cXMin
                     & cam_near2_dist02 > mdf_distNear
                     & cam_near2_dist03 > 0
                     )
                     { mdf_NearGlobale = -30 }

                  // si trova sulla destra ma lo sfiora soltanto
                  if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                     & cam_near2_dist30 < cXMin
                     // se zero però e' appoggiato
                     & cam_near2_dist30 > 0
                     )
                     { mdf_NearGlobale = -4 }

                  if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                     & cam_near2_dist30+2 < cXMin
                     & cam_near2_dist30 > mdf_distNear
                     & cam_near2_dist30 > 0
                     )
                     {
                      mdf_NearGlobale = -40
                      mdf_NearGlobale_deb_DX_dist30 = cam_near2_dist30
                      mdf_NearGlobale_deb_DX_idx_M40 = cam_nome_Val_cNear_idx
                     }

                  cbasToCtrl_by = VAR_VAL(idx_MToCtrl, "base_0.y")
                  cbasToCtrl_ay = VAR_VAL(idx_MToCtrl, "alto_0.y")
                  cbasFound_by = VAR_VAL(cam_nome_Val_cNear_idx, "base_0.y")
                  cbasFound_ay = VAR_VAL(cam_nome_Val_cNear_idx, "alto_0.y")

                 // 14.07.2022 06415
                  // sfiora in basso
                  if (cbasToCtrl_by+0.1>cbasFound_ay)
                     {
                      if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                         & cam_near2_dist03 < cXMin
                         )
                         { mdf_NearGlobale = -3.1 }

                      if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                         & cam_near2_dist30 < cXMin
                         )
                         { mdf_NearGlobale = -4.1 }
                     }
                  // sfiora in alto
                  if (cbasToCtrl_ay-0.1<cbasFound_by)
                     {
                      if ( cam_near2_dist30 >= cXMax+cXMin-0.1
                         & cam_near2_dist03 < cXMin
                         )
                         { mdf_NearGlobale = -3.2 }

                      if ( cam_near2_dist03 >= cXMax+cXMin-0.1
                         & cam_near2_dist30 < cXMin
                         )
                         { mdf_NearGlobale = -4.2 }
                     }

                  if (mdf_NearGlobale > 0)
                     {
                      cquantiNear = cquantiNear+1
                      mdf_NearGlobale_deb = mdf_NearGlobale
                      VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, cquantiNear, 0, "")
                      // altrimenti in Ambito Globale vale quella creata dal NEAR_GLOBALE di inizio procedura
                      retEvalVar = EVAL(STRCAT(nome_MdF_Var, "=", STR(cquantiNear)))
                     }

                  if ( mdf_NearGlobale < 0
                     & cquantiNear == 0
                     )
                     {
                      mdf_NearGlobale_deb = mdf_NearGlobale
                      VAR_CREATE_NUM(idx_MdF_Var, nome_MdF_Var, 0, 0, "")
                      // altrimenti in Ambito Globale vale quella creata dal NEAR_GLOBALE di inizio procedura
                      retEvalVar = EVAL(STRCAT(nome_MdF_Var, "=", STR(0)))
                      VAR_CREATE_NUM(idx_MdF_Var, STRCAT(nome_MdF_Var, "_mdf_NearGlobale"), mdf_NearGlobale, 0, "")
                     }
                  cnei = cnei+1
                  cam_nome_Var_cNear = STRCAT(nome_MdF_Var, "_##", STR(cnei))
                 }
             }
          cni=1
          while (cni <= cam_compNear)
             {
              cam_val_compNear = VAR_VAL(-1, STRCAT(nome_MdF_Var, "_##", STR(cni)))
              cam_nome_Var_compNear = STRCAT(nome_MdF_Var, "_##", STR(cni))
              VAR_CREATE_NUM(idx_MdF_Var, cam_nome_Var_compNear, cam_val_compNear, 0, "")
              cni = cni+1
             }
          DEL_VAR(-1, STRCAT(nome_MdF_Var, "*"))
         }
   }

   PROCEDURA MdF_Var_READTAB
   {
      tipo_Var = 1
      mdf_nome_tab = VAR_VAL_STR(idx_MdF_Var, "CamSys_tabName")
      mdf_key_tab = VAR_VAL_STR(idx_MdF_Var, "CamSys_tabKey")
      if (STRLEN(mdf_nome_tab) < 1 & ATTUALE() == -1)
         {
          mdf_nome_tab = VAR_VAL_STR(-1, "CamSys_tabName")
          mdf_key_tab = VAR_VAL_STR(-1, "CamSys_tabKey")
         }
      if (STRLEN(mdf_nome_tab) > 1)
         {
          mdf_path_bdmfiles = VAR_VAL_STR(-1, "path_bdm")
          if (STRLEN(mdf_path_bdmfiles) < 2)
             { mdf_path_bdmfiles = VAR_VAL_STR(-1, "path_files") }
          mdf_path_table = STRCAT(mdf_path_bdmfiles, "Cam\Tab\", mdf_nome_tab)

          mdf_TABLE_pers = TABLE_OPEN(mdf_path_table)
          if (mdf_TABLE_pers <= 0)
             {
              mdf_path_table = STRCAT(mdf_path_bdmfiles, mdf_nome_tab)
              mdf_TABLE_pers = TABLE_OPEN(mdf_path_table)
             }
          if (mdf_TABLE_pers <= 0)
             {
              mdf_path_table = STRCAT($path_CAMTABMDF, mdf_nome_tab)
              mdf_TABLE_pers = TABLE_OPEN(mdf_path_table)
             }
          if ( VAR_VAL(-1, "CAM_Visualize") > 0
             | VAR_VAL(-1, "CAM_CloseOpenTab") > 1
             )
             {
              TABLE_CLOSE(mdf_TABLE_pers)
              mdf_TABLE_pers = TABLE_OPEN(mdf_path_table)
             }
          val_Var_Bdm = TABLE_FIELD_AT(mdf_TABLE_pers, mdf_key_tab, nome_Var_Bdm)

          if (IS_MATCH(val_Var_Bdm, STRCAT("", APICI(), "*")) )
             {
              val_Var_Bdm = STRMID(1,STRLEN(val_Var_Bdm)-2,val_Var_Bdm)
             }
          //DISPLAY2(STRCAT("mdf_key_tab=", mdf_key_tab, " mdf_nome_tab=", mdf_nome_tab, " nome_Var_Bdm=", nome_Var_Bdm))
          if (STRCMP(valore_Var, "UPPER") == 0)
             { val_Var_Bdm = UPPER(val_Var_Bdm) }
         }
      else
         {
          DISPLAY2("MDF-Error Verificare variabile con TIPO_VAR READTAB")
         }
   }

   PROCEDURA MdF_Var_Point
   {
      if (STRCMP(mdf_tipo_Var, "POINT") == 0)
         {
          mdf_point_var = 1
          //if (ATTUALE() == -1)  { EXITSUB() }
          livello_Var = "PrimoTrovato"
          GOSUB MdF_Var_PrimoTrovato
          if (VAR_EXIST(idx_MToCtrl, nome_Var_Bdm) )
             {
              val_Var_Bdm_x = VAR_VAL(idx_MToCtrl, STRCAT(nome_Var_Bdm, ".x"))
              val_Var_Bdm_y = VAR_VAL(idx_MToCtrl, STRCAT(nome_Var_Bdm, ".y"))
              val_Var_Bdm_z = VAR_VAL(idx_MToCtrl, STRCAT(nome_Var_Bdm, ".z"))

              VAR_CREATE_XYZ(idx_MdF_Var, nome_MdF_Var, val_Var_Bdm_x, val_Var_Bdm_y, val_Var_Bdm_z, 0, "")
              // SORT_POINT se in ATTUALE() -1
              //if (ATTUALE() == -1)  { VAR_CREATE_XYZ(-1, nome_MdF_Var, val_Var_Bdm_x, val_Var_Bdm_y, val_Var_Bdm_z, 0, "")  }
              var_point_ToEVAL = STRCAT("[",STR(val_Var_Bdm_x), "," , STR(val_Var_Bdm_y), ",", STR(val_Var_Bdm_z), "]")
              if (ATTUALE() == -1)
                 {
                  valore_DaEvalizzare_point = STRCAT(nome_MdF_Var, "=", var_point_ToEVAL)
                  retEvalPoint = EVAL(valore_DaEvalizzare_point)
                 }
             }
         }
   }

   PROCEDURA MdF_VAL_VAR_Point_Ute
   {
      mdf_point_var = 2

      valore_DaEvalizzare_point = valore_DaEvalizzare
      if ( IS_MATCH(valore_DaEvalizzare_point, "C*")
         | IS_MATCH(valore_DaEvalizzare_point, "M*")
         )
         {
          valore_DaEvalizzare_point = VAR_VAL_STR(idx_MdF_Var, valore_DaEvalizzare_point)
         }
      else
         {
          retEvalPoint = EVAL(STRCAT("$mdf_wk_", var_name, "=", valore_DaEvalizzare))
          var_gl_P = STRCAT("mdf_wk_", var_name)
          valore_DaEvalizzare_point = VAR_VAL_STR(-1, var_gl_P)
          DEL_VAR(-1, STRCAT("mdf_wk_", var_name))
         }

      retEvalPoint = EVAL(STRCAT(nome_MdF_Var, "=", valore_DaEvalizzare_point))
      if (retEvalPoint == -1)
         {
          VAR_CREATE_STR(idx_MdF_Var, var_name, valore_DaEvalizzare, 0, "")
          var_name_create = var_name
          mdf_nome_Table_Loc = "cam\Tab\VariabiliMdF.txt"
          if (STRLEN(VAR_VAL_STR(idx_MdF_Var, var_name_create)) == 0)
             {
              if (VAR_VAL(-1, "MdF_display_err") < 3)
                 {
                  if (VAR_EXIST(-1, "MdF_display_err") != 1)  { $MdF_display_err = 0 }
                  $MdF_display_err = $MdF_display_err+1
                  DISPLAY2(STRCAT("MDF-Error-POINT ( ", STR($MdF_display_err) ," ) Campo Regola_variabile->", var_name, " Non Configurata\n\n",
                                  "Controllare ",  mdf_nome_Table_Loc, "\n\n",
                                  "Chiave_TAB = ", VAR_VAL_STR(idx_MdF_Var, "chiave_n"), "\n\n",
                                  "Elemento ", NOME(idx_MdF_Var), " idx_Cam=", STR(idx_MdF_Var), "\n",
                                  "Attenzione a: var POINT \n\n"
                                 )
                           )
                 }
             }
          // Devo avere almeno 2 caratteri.. per evitare - o *
          if (STRLEN(VAR_VAL_STR(idx_MdF_Var, var_name_create)) > 1)
             {
              // Non voglio che esca l'errore se non trova una variabile globale da cui prendere il valore su VALORE_VAR
              // La variabile potrebbe non esistere per alcune modalita o situazioni, ma eventualmente me ne accorgo subito
              // dal ddp, mentre non posso rischiare che M4 si blocchi su questi errori non sistematici
              if (IS_MATCH(valore_DaEvalizzare, "$*") != 1)
                 {
                  if (VAR_VAL(-1, "MdF_display_err") < 3)
                     {
                      if (VAR_EXIST(-1, "MdF_display_err") != 1)  { $MdF_display_err = 0 }
                      $MdF_display_err = $MdF_display_err+1
                      DISPLAY2(STRCAT("MDF-ErrorSTR-POINT ( ", STR($MdF_display_err) ," ) PARSING Regola_variabile->", var_name, "=", valore_DaEvalizzare, "\n",
                                      "Elemento ", NOME(idx_MdF_Var), " idx_Cam=", STR(idx_MdF_Var), "\n\n",
                                      "Controllare ", mdf_nome_Table_Loc, "\n\n",
                                      "Chiave_TAB = ", VAR_VAL_STR(idx_MdF_Var, "chiave_n"), "\n\n",
                                      "Attenzione a: var POINT \n\n"
                                     )
                               )
                     }
                 }
             }
         }
      DEL_VAR(-1, STRCAT("mdf_wk_", var_name))
   }

   PROCEDURA MdF_VAL_VAR_DISTANZA
   {
      if (STRCMP(mdf_tipo_Var, "DISTANZA") == 0)
         {
          mdf_distanza_var = 1
          GOSUB MdF_VAL_VAR
          if (ATTUALE() == -1)
             { retEvalDist = EVAL(STRCAT(nome_MdF_Var, "=", valore_DaEvalizzare)) }
         }
   }

   PROCEDURA MdF_Ctrl_Post_RELATIVE_ADD
   {
      // Succede soltanto in alcuni casi quando aggiungo gli MdF in modo globale
      // e non per ACTION 2
      // e quindi capita che le misure prese dai Controlli le trovo corrette ma i punti notevoli
      // non rispettano le misure a meno di un ricalcola
      if (VAR_EXIST(idx_CamMdF, "mdf_Obj_ADD_To_Ctrl") )
         {
          mdf_Obj_ADD_To_Ctrl = VAR_VAL_STR(idx_CamMdF, "mdf_Obj_ADD_To_Ctrl")
          if ( STRLEN(mdf_Obj_ADD_To_Ctrl) > 1
             & IS_MATCH(NOME(idx_att), mdf_Obj_ADD_To_Ctrl) != 1
             )
             { EXITSUB() }
         }
     // 07.08.2024
      if (UN_PADRE("MECCANISM*_UTENTE*") )  { EXITSUB() }

      X_CamMdf = VAR_VAL(idx_CamMdF, "X")
      Y_CamMdf = VAR_VAL(idx_CamMdF, "Y")
      calc_dist_X = DISTANZA(base_0, base_3)
      calc_dist_Y = DISTANZA(base_0, alto_0)
      SET_#(PADRE(idx_att, 1))
      calc_dist_X_pdr = DISTANZA(#base_0, base_3)
      calc_dist_Y_pdr = DISTANZA(#base_0, alto_0)

     // 15.03.2024 PK Cassetti Zt 500, Z 22
      calc_Y_Zt = 0
      if ( VAR_VAL(PADRE(idx_att, 1), "Zt")-5 > VAR_VAL(PADRE(idx_att, 1), "Z")
         & VAR_VAL(PADRE(idx_att, 1), "Zt") > 25
         )
         { calc_Y_Zt = 1 }
      // e CassInt Z 500
      if (VAR_VAL(PADRE(idx_att, 1), "Z") > 50)  { calc_Y_Zt = 2 }

      if (calc_Y_Zt > 0)
         {
          calc_dist_Y_pdr = DISTANZA(#base_1, alto_1)
          calc_dist_X_pdr = DISTANZA(#base_1, base_2)
         }

      mdf_action_add = ACTION()
      mdf_ricalc_Post_READD = 0

     // 15.03.2024
      mdf_valdim_Y_ToOK = 0
      if (ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y")) > 0)
         { mdf_valdim_Y_ToOK = mdf_valdim_Y_ToOK + (Y_CamMdf-VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y")) }

      mdf_valdimToOK = 0.2

      // float e interi non sono uguali
      // 07.03.2019 aggiunto +MdF_offx_REL_ADD +MdF_offy_REL_ADD
      if ( ABS(X_CamMdf - calc_dist_X - 0.1) > 0.2 + ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD"))
         // 15.03.2024
         //| ABS(Y_CamMdf - calc_dist_Y - 0.1) > 0.2 + ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD"))
         | ABS(Y_CamMdf - calc_dist_Y - 0.1) > mdf_valdimToOK + mdf_valdim_Y_ToOK + ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD"))
         )
         {
          //..WITH_VAR_LOCAL(idx_att, "mdf_Visualize_loc", "mdf_Visualize_std", 2, 1, "1")
          WITH_VAR_LOCAL(idx_att, "mdf_Visualize_loc", "mdf_Visualize_std", 2, 1, "0")
          mdfdiffX = X_CamMdf - calc_dist_X
          mdfdiffY = Y_CamMdf - calc_dist_Y

          if (mdf_ricalc_Post_READD == 0)
             {
              mdf_ricalc_Post_READD = 1
              mdf_act_Post_READD = ACTION()
              // 03.12
              if (IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Visualize_sat"), "OnInterat") )
                 {
                  //COMPONENTI3("mdf_imp", idx_att, "MdF_ImportSatGenerico")
                  COMPONENTI3("mdf_imp", idx_att, "MdF_*Sat*")
                  if (mdf_imp)  { mdf_Visualize_loc = 0.1 }
                  if (STRLEN(VAR_VAL_STR(idx_att, "MPA_ElementoBdm_PisAnta")) > 3)
                     {
                      COMPONENTI3("mdf_imp_sat", idx_att, VAR_VAL_STR(idx_att, "MPA_ElementoBdm_PisAnta"))
                      if (mdf_imp_sat)  { mdf_Visualize_loc = 0.2 }
                     }
                 // 11.07.2016
                  if (STRLEN(VAR_VAL_STR(idx_att, "MPF_ElementoBdm_PisFia")) > 3)
                     {
                      COMPONENTI3("mdf_imp_sat", idx_att, VAR_VAL_STR(idx_att, "MPF_ElementoBdm_PisFia"))
                      if (mdf_imp_sat)  { mdf_Visualize_loc = 0.2 }
                     }
                 }
              else
                 {
                 // 19.10.2017
                  if (STRLEN(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Load_Interat")) > 0)
                     {
                      if ( IS_MATCH(NOME(PADRE(idx_att, -1)), "Anta*") == 1
                         | IS_MATCH(NOME(PADRE(idx_att, -1)), "Frontale*") == 1
                         )
                         {
                          if (PADRE(idx_att, 2) == PADRE(idx_att, -1) )
                             {
                              mdf_antaSciolta = 1
                              mdf_Visualize_loc = 0.3
                             }
                         }
                     }
                 }

              // La differenza con o senza no_ridisegna è di 0.015sec
              if (mdf_Visualize_loc > 0)
                 {
                  mdf_ricalcola_Import = 0.1
                  // 25.06.2020 provo ad aggiungere no_ridisegna solo su COMANDO2
                  //COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " per punti notevoli, mdfdiffX=", STR(mdfdiffX), " mdfdiffY=", STR(mdfdiffY)))
                  if (VAR_VAL(PADRE(idx_att, 1), "MdF_Load_COMANDO2") == 0)
                     { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " per punti notevoli, mdfdiffX=", STR(mdfdiffX), " mdfdiffY=", STR(mdfdiffY))) }
                  else
                     {
                     // 19.01.2021 da SL CerSof
                      // Se aggiunti da OnMacro non si visualizzano correttamente
                      // Se fosse OnMacroCAM potrebbe non essere un problema anche se in debug potrebbe fare confusione
                      // ma potrebbe anche essere che sia OnMacro qualcos' altro e in quel caso devono essere corretti
                      // Per ora tengo il no_ridisegna se aggiunti da MdF_Load_Interat perchè in quel caso sembra non servire
                     // 25.02.2022 A279_770_02289, Ca2202239
                      if (VAR_VAL(idx_att, "mdfCtrlDim_Ctrl_Flusso") != 1)
                         {
                          if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") != 1)
                             { COMANDO2(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " per punti notevoli, mdfdiffX=", STR(mdfdiffX), " mdfdiffY=", STR(mdfdiffY), " da MdF_Ctrl_Dim 1")) }
                          else
                             { COMANDO2(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " per punti notevoli, mdfdiffX=", STR(mdfdiffX), " mdfdiffY=", STR(mdfdiffY), " da MdF_Ctrl_Dim 2")) }
                         }
                      else
                         {
                         // 17.03.2022 VD-000106, VD-841753
                          if (VAR_VAL(PADRE(idx_att, 1), "MdF_Post_RELATIVE_ADD_COMANDO2") <= 1)
                             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " per punti notevoli, mdfdiffX=", STR(mdfdiffX), " mdfdiffY=", STR(mdfdiffY), " da MdF_Ctrl_Dim 3 COMANDO")) }
                          else
                             {
                              VAR_VALUE_SET(PADRE(idx_att, 1), "Mdf_Verify_Flusso_BDM", 1)
                              COMANDO2(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " per punti notevoli, mdfdiffX=", STR(mdfdiffX), " mdfdiffY=", STR(mdfdiffY), " da MdF_Ctrl_Dim 4 COMANDO2"))
                             }
                         }
                     }
                 }
              else
                 { COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_ridisegna no_agganciati", " // ", NOME(idx_att), " per punti notevoli, mdfdiffX=", STR(mdfdiffX), " mdfdiffY=", STR(mdfdiffY))) }
             }
         }

      if (VAR_VAL(-1, "CAM_Visualize") <= 1)
         {
          mdf_vis_sat_da_var = 0
          mdf_Visualize_sat = VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Visualize_sat")
          if ( STRCMP(mdf_Visualize_sat, "No") != 0
             & STRCMP(mdf_Visualize_sat, "") != 0
             )
             { mdf_vis_sat_da_var = 1 }

          if ( STR_INDEX_OF($MdF_Visualize, 0, "ImportSat") > -1
             | mdf_vis_sat_da_var > 0
             )
             {
              // Se viene aggiunto per ACTION 2 quindi per MdF_AttrezzaRegFacc
              // non passa per MdF_Ctrl_Post_RELATIVE_ADD, ma se passa per MdF_Ctrl_Post_RELATIVE_ADD
              // da OnMacro significa che passa per COMANDO2 e quindi mi sfalsa i comandi
              // Se da OnMacroCAM non mi interessa che i sat siano graficati corretti, perché
              // è solo un problema grafico e non CAM
              if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacroCAM*") != 1)
                 {
                  //COMPONENTI3("mdf_imp", idx_att, "MdF_ImportSatGenerico")
                  COMPONENTI3("mdf_imp", idx_att, "MdF_*Sat*")
                  if ( mdf_imp > 0
                     & VAR_EXIST(idx_att, "mdf_ricalcola_Import") != 1
                     & VAR_VAL(idx_att, "mdf_ricalc_Post_READD") <= 0
                     )
                     {
                      // CMD=1 se sat appena aggiunto da comando Bdm
                      if (ACTION() == 2 | CMD() == 1)
                         {
                          mdf_debug_sat = 1
                          if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacro*") == 1)
                             {
                              mdf_ricalcola_Import = 1
                              mdf_ricalc_Post_READD = 3
                              COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_agganciati", " // ", NOME(idx_att), " draw and pos ACTION 2 MdF_ImportSatGenerico"))
                             }
                          if (VAR_VAL(PADRE(idx_att, 1), "MdF_ADD_Reg_Interat") == 1)
                             {
                              mdf_debug_sat = 2
                             }
                         }
                      else
                         {
                          // 25.06.2020
                          if (VAR_VAL(PADRE(idx_att, 1), "MdF_ADD_Reg_Interat") != 1)
                             {
                              mdf_ricalcola_Import = 1
                              mdf_ricalc_Post_READD = 3
                              COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_agganciati", " // ", NOME(idx_att), " draw and pos MdF_ImportSatGenerico"))
                             }
                         }
                     }
                 }
             }
         }

      if (VAR_EXIST(idx_att, "MdF_offx_REL_ADD_prec") != 1)  { MdF_offx_REL_ADD_prec = VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD") }
      if (VAR_EXIST(idx_att, "MdF_offy_REL_ADD_prec") != 1)  { MdF_offy_REL_ADD_prec = VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD") }
      if (VAR_EXIST(idx_att, "MdF_offz_REL_ADD_prec") != 1)  { MdF_offz_REL_ADD_prec = VAR_VAL(PADRE(idx_att, 1), "MdF_offz_REL_ADD") }

      // 15-18.03.2024 CassInt Z 500 e MdF_ 2mm piu avanti in Z
      mdf_aum_testDiffDim = 0
      if (VAR_VAL(PADRE(idx_att, 1), "Z") > 100)  { mdf_aum_testDiffDim = 3 }

     // 17.07.2024 Pol 2024_POK6_AG100_00442
      mdf_MdF_Pan_X_CambiatoEarly = 0
      if ( ABS(X_CamMdf - calc_dist_X - 0.1) > 0.2
         | ABS(X_CamMdf - calc_dist_X_pdr - 0.1) > 0.3 + mdf_aum_testDiffDim
         )
         {
          if (VAR_EXIST(PADRE(idx_att, 1), "MdF_Pan_X") != 1)
             { mdf_MdF_Pan_X_CambiatoEarly = 1 }
          else
             {
              if (VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X") != X_CamMdf)
                 {
                  if (ABS(X_CamMdf - calc_dist_X_pdr - 0.1) > 0.3 + mdf_aum_testDiffDim)
                     {
                      mdf_diff_X_Pan_deb = ABS(X_CamMdf - calc_dist_X_pdr - 0.1)
                      //DISPLAY2(STRCAT("mdf_diff_X_Pan_deb=", STR(mdf_diff_X_Pan_deb), " da=", STR(PADRE(idx_att, 1))))
                      mdf_MdF_Pan_X_CambiatoEarly = 1
                     }
                 }
             }
         }
      mdf_MdF_Pan_Y_CambiatoEarly = 0
      if ( ABS(Y_CamMdf - calc_dist_Y - 0.1) > 0.2
         | ABS(Y_CamMdf - calc_dist_Y_pdr - 0.1) > 0.3 + mdf_aum_testDiffDim
         )
         {
          if (VAR_EXIST(PADRE(idx_att, 1), "MdF_Pan_Y") != 1)
             { mdf_MdF_Pan_Y_CambiatoEarly = 1 }
          else
             {
              if (VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y") != Y_CamMdf)
                 {
                  if (ABS(Y_CamMdf - calc_dist_Y_pdr - 0.1) > 0.3 + mdf_aum_testDiffDim)
                     {
                      mdf_diff_Y_Pan_deb = ABS(Y_CamMdf - calc_dist_Y_pdr - 0.1)
                      //DISPLAY2(STRCAT("mdf_diff_Y_Pan_deb=", STR(mdf_diff_Y_Pan_deb), " da=", STR(PADRE(idx_att, 1))))
                      mdf_MdF_Pan_Y_CambiatoEarly = 1
                     }
                 }
             }
         }

      // Per sicurezza ricontrollo anche calc_dist_X e calc_dist_Y
      //if ( ABS(X_CamMdf - calc_dist_X - 0.1) > 0.2
      //   | ABS(Y_CamMdf - calc_dist_Y - 0.1) > 0.2
      //   | ABS(X_CamMdf - calc_dist_X_pdr - 0.1) > 0.3 + mdf_aum_testDiffDim
      //   | ABS(Y_CamMdf - calc_dist_Y_pdr - 0.1) > 0.3 + mdf_aum_testDiffDim
      //   | VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD") != MdF_offx_REL_ADD_prec
      //   | VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD") != MdF_offy_REL_ADD_prec
      //   | VAR_VAL(PADRE(idx_att, 1), "MdF_offz_REL_ADD") != MdF_offz_REL_ADD_prec
      //   )
      if ( mdf_MdF_Pan_X_CambiatoEarly == 1
         | mdf_MdF_Pan_Y_CambiatoEarly == 1
         | VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD") != MdF_offx_REL_ADD_prec
         | VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD") != MdF_offy_REL_ADD_prec
         | VAR_VAL(PADRE(idx_att, 1), "MdF_offz_REL_ADD") != MdF_offz_REL_ADD_prec
         )
         {
          MdF_offx_REL_ADD_prec = VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD")
          MdF_offy_REL_ADD_prec = VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD")
          MdF_offz_REL_ADD_prec = VAR_VAL(PADRE(idx_att, 1), "MdF_offz_REL_ADD")

          WITH_VAR("mdf_ADDTooEarly", "MdF_Cambiato", 3, 0, "ADD-TooEarly")

          if (mdf_ricalc_Post_READD == 0)
             {
              MdF_Cambiato = "ADD-TooEarly"
              GOSUB MdF_Ctrl_ADD_TooEarly
             }
         }
   }

   PROCEDURA MdF_Ctrl_ADD_TooEarly
   {
      if (STRCMP(VAR_VAL_STR(idx_att, "MdF_Cambiato"), "ADD-TooEarly") != 0)  { EXITSUB() }
     // 07.08.2024
      if (UN_PADRE("MECCANISM*_UTENTE*") )  { EXITSUB() }

      DEL_VAR(idx_att, "MdF_Cambiato")

      if (VAR_EXIST(idx_att, "X_prec") != 1)  { X_prec = X }
      if (VAR_EXIST(idx_att, "Y_prec") != 1)  { Y_prec = Y }
      if (VAR_EXIST(idx_att, "Z_prec") != 1)  { Z_prec = Z }

      X_CamMdf = VAR_VAL(idx_CamMdF, "X")
      Y_CamMdf = VAR_VAL(idx_CamMdF, "Y")
      calc_dist_X = DISTANZA(base_0, base_3)
      calc_dist_Y = DISTANZA(base_0, alto_0)
      SET_#(PADRE(idx_att, 1))
      calc_dist_X_pdr = DISTANZA(#base_0, base_3)
      calc_dist_Y_pdr = DISTANZA(#base_0, alto_0)

     // 16.04.2024 St2024_PC02_260017795_02474 MdF_offx_REL_ADD=-150
      if (ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD")) > 100)
         {
          if ( alto_0.y-#base_0.y == calc_dist_Y
             & base_0.y == #base_0.y
             )
             { calc_dist_Y_pdr = calc_dist_Y }
         }

     // 15.03.2024 PK Cassetti Zt 500, Z 22
      calc_Y_Zt = 0
      if ( VAR_VAL(PADRE(idx_att, 1), "Zt")-5 > VAR_VAL(PADRE(idx_att, 1), "Z")
         & VAR_VAL(PADRE(idx_att, 1), "Zt") > 25
         )
         { calc_Y_Zt = 1 }
      // e CassInt Z 500
      if (VAR_VAL(PADRE(idx_att, 1), "Z") > 50)  { calc_Y_Zt = 2 }

      if (calc_Y_Zt > 0)
         {
          calc_dist_Y_pdr = DISTANZA(#base_1, alto_1)
          calc_dist_X_pdr = DISTANZA(#base_1, base_2)
         }

      mdfbas0_too = #base_0.y
      mdfbas1_too = #base_1.y
      mdfdiffbasiy01 = ABS(mdfbas0_too-mdfbas1_too)
      // 13.02.2019 aggiunto +MdF_offx_REL_ADD
      // 07.03.2019 aggiunto +MdF_offy_REL_ADD
      // float e interi non sono uguali

      // 03.06.2020
      // Se fa la distanza ma i punti sono leggermente sfalsati tra padre e figlio per offx o offy rischio che 0.3 sia troppo basso
      // Non importa se sto controllando la distanza Y e l' offset ce l' ho solo in x perche' base_0 e alto_0 potrebbero non essere allineati
      // Teoricamente poi con il flusso corretto da febbraio 2020 non dovrebbe piu esserci il problema che entra troppo presto
      mdf_valdimToOK = 0.3
      if (ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD")) > 0)
         {
          // 16.04.2024 St2024_PC02_260017795_02474
          //mdf_valdimToOK = 0.3 + ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD"))/12
          mdf_valdimToOK = 0.3 + ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD"))/9.6
          // Anta curva DX
          if (ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD")) >= X_CamMdf)
             {
              mdf_valdimToOK = 0.3 + ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD"))
             }
         }
      if (ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD")) > 0)
         { mdf_valdimToOK = 0.3 + ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD"))/9.6 }

     // 17.07.2024 PolK 2024_POK6_AG100_00442
      mdf_valdim_X_ToOK = 0
      if (ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X")) > 0)
         { mdf_valdim_X_ToOK = mdf_valdim_X_ToOK + (X_CamMdf-VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X")) }

     // 17-20.02.2023
      mdf_valdim_Y_ToOK = 0
      if (ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y")) > 0)
         { mdf_valdim_Y_ToOK = mdf_valdim_Y_ToOK + (Y_CamMdf-VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y")) }

     // 22.07.2024 2023_pol15_ag100_00117
      if (IS_MATCH(NOME(idx_att), "MdF_CerniereBattVY1") )
         {
          mdf_valdim_Y_ToOK = mdf_valdim_Y_ToOK + (Y_CamMdf-VAR_VAL(PADRE(idx_att, 1), "MdF_VanoY1"))
         }
      if (IS_MATCH(NOME(idx_att), "MdF_CerniereBattVY2") )
         {
          mdf_valdim_Y_ToOK = mdf_valdim_Y_ToOK + (Y_CamMdf-VAR_VAL(PADRE(idx_att, 1), "MdF_VanoY2"))
         }
      if (IS_MATCH(NOME(idx_att), "MdF_CerniereBattVY3") )
         {
          mdf_valdim_Y_ToOK = mdf_valdim_Y_ToOK + (Y_CamMdf-VAR_VAL(PADRE(idx_att, 1), "MdF_VanoY3"))
         }

      if ( ABS(X_CamMdf - calc_dist_X_pdr - 0.1) > mdf_valdimToOK + mdf_valdim_X_ToOK + ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD"))
         | ABS(Y_CamMdf - calc_dist_Y_pdr - 0.1) > mdf_valdimToOK + mdfdiffbasiy01 + mdf_valdim_Y_ToOK + ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD"))
         // Per sicurezza ricontrollo anche calc_dist_X e calc_dist_Y
         | ABS(X_CamMdf - calc_dist_X - 0.1) > mdf_valdimToOK + mdf_valdim_X_ToOK + ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD"))
         | ABS(Y_CamMdf - calc_dist_Y - 0.1) > mdf_valdimToOK + mdfdiffbasiy01 + mdf_valdim_Y_ToOK + ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD"))
         )
         {
          // Per Sicurezza ma dovrebbe già essere che non entra mai qui con OnMacroCAM
          if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacroCAM") != 1)
             {
              if (ACTION() != 8)
                 {
                  COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // MdF_Ctrl_ADD_TooEarly"))
                  // 12.03.2019
                  DEL_VAR(idx_att, "mdf_added_*_daLoadPers")
                 }

              if (ACTION() == 8)
                 {
                  // 31.10.2024 T000287
                  if (VAR_EXIST(PADRE(idx_att, 1), "mdf_Ctrl_ADD_TooEarly_Error") != 1)  { VAR_VALUE_SET(PADRE(idx_att, 1), "mdf_Ctrl_ADD_TooEarly_Error", -1) }
                  mdf_Ctrl_ADD_TooEarly_Error = VAR_VAL(PADRE(idx_att, 1), "mdf_Ctrl_ADD_TooEarly_Error")+1
                  VAR_VALUE_SET(PADRE(idx_att, 1), "mdf_Ctrl_ADD_TooEarly_Error", mdf_Ctrl_ADD_TooEarly_Error)
                  // Potrebbe arrivare piu volte se da Procedura MdF_Ctrl_Post_RELATIVE_ADD generica senza idx
                  if (VAR_VAL(PADRE(idx_att, 1), "mdf_Ctrl_ADD_TooEarly_Error") > 10)
                     {
                      if (VAR_VAL(PADRE(idx_att, 1), "mdf_Ctrl_ADD_TooEarly_Error") < 15)
                         {
                          COMANDO2(STRCAT("LOGMSG MdF_Ctrl_ADD_TooEarly ERRORE MdF GRAVE LOOP, dovuto a ERRORE BDM GRAVE! Controllare dimensioni che corrispondano ai relativi punti notevoli idx=", STR(PADRE(idx_att, 1)), " figlio che innesca msg=", STR(idx_att), " ACTION", STR(ACTION()), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
                          MdF_Cambiato = "ERRORE MdF GRAVE LOOP dovuto a ERRORE BDM GRAVE"
                          #MdF_Cambiato = "ERRORE MdF GRAVE LOOP dovuto a ERRORE BDM GRAVE"
                         }
                      EXIT()
                     }

                  MdF_Cambiato = STRCAT("Dim_MdF_Ctrl_ADD_TooEarly_X_", STR(X), "_Y_", STR(Y), "_X_prec_", STR(X_prec), "_Y_prec_", STR(Y_prec), "_Z_prec_", STR(Z_prec))
                  #MdF_Cambiato = STRCAT("Dim_MdF_Ctrl_ADD_TooEarly_X_", STR(X), "_Y_", STR(Y), "_X_prec_", STR(X_prec), "_Y_prec_", STR(Y_prec), "_Z_prec_", STR(Z_prec))
                  //WITH_VAR_LOCAL(idx_att, "mdf_Visgraf", "escl_Grafica", 2, 1, "0")
                  //WITH_VAR_LOCAL(idx_att, "mdf_Visualize_loc", "mdf_Visualize_std", 2, 1, "1")
                  WITH_VAR_LOCAL(idx_att, "mdf_Visualize_loc", "mdf_Visualize_std", 2, 1, "0")
                  mdfricalc_no_ridis = 0
                  if (VAR_VAL(-1, "CAM_Visualize") <= 0)  { mdfricalc_no_ridis = 1 }
                  if (mdf_Visualize_loc > 0)              { mdfricalc_no_ridis = -1 }

                  if (mdfricalc_no_ridis <= 0)
                     { COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_agganciati", " // ", NOME(idx_att), " per ADD-TooEarly")) }
                 }
             }
         }
   }

   PROCEDURA MdF_Ctrl_Dim
   {
      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
     // 18.01.2021 Posso personalizzare il Load MdF_ svincolandomi dall $OnLoadOrder o $VAR_LOAD_ORDER
      if (VAR_VAL(-1, "MdF_LoadOrder") > -1)  { CAM_loadOrder = $MdF_LoadOrder }
      // Per sicurezza se entro come MdF_ADD_Reg_Interat
      if (CAM_loadOrder == 1)  { EXITSUB() }

      if (VAR_VAL(-1, "MDFSys_Exit_Always") == 1)   { EXITSUB() }

      if (VAR_EXIST(idx_att, "X_prec") != 1)  { X_prec = X }
      if (VAR_EXIST(idx_att, "Y_prec") != 1)  { Y_prec = Y }
      if (VAR_EXIST(idx_att, "Z_prec") != 1)  { Z_prec = Z }

      if (VAR_EXIST(idx_att, "MdF_offx_REL_ADD_prec") != 1)  { MdF_offx_REL_ADD_prec = VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD") }
      if (VAR_EXIST(idx_att, "MdF_offy_REL_ADD_prec") != 1)  { MdF_offy_REL_ADD_prec = VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD") }
      if (VAR_EXIST(idx_att, "MdF_offz_REL_ADD_prec") != 1)  { MdF_offz_REL_ADD_prec = VAR_VAL(PADRE(idx_att, 1), "MdF_offz_REL_ADD") }

     // 20.05.2019
      // Vedi anche mdf_read_VDP
      mdf_MdF_Pan_X_Cambiato = 0
      if (VAR_EXIST(PADRE(idx_att, 1), "MdF_Pan_X") != 1)
         {
          // 04.04.2025 PK652421 spostato qui, gestisce tutto mdf_MdF_Pan_X_Cambiato
          if (ABS(X-X_prec) > 0.2)  { mdf_MdF_Pan_X_Cambiato = 1 }
         }
      else
         {
          if (VAR_EXIST(idx_att, "X_pdr_prec") != 1)  { X_pdr_prec = VAR_VAL(PADRE(idx_att, 1), "X") }
          if (VAR_EXIST(idx_att, "Y_pdr_prec") != 1)  { Y_pdr_prec = VAR_VAL(PADRE(idx_att, 1), "Y") }

          if (VAR_VAL(PADRE(idx_att, 1), "X") != VAR_VAL(idx_att, "X_pdr_prec") )
             {
              mdf_MdF_Pan_X_Cambiato = 2
             }
         }

     // 20.02.2023
      mdf_valdim_Y_ToOK = 0
      if (ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y")) > 0)
         {
          Y_pdr = VAR_VAL(PADRE(idx_att, 1), "Y")
          // 08.02.2024
          if (VAR_VAL(PADRE(idx_att, 1), "MdF_VanoY2") <= 50)
             {
              mdf_valdim_Y_ToOK = Y_pdr-VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y")
             }
         }

     // 12.12.2024 altrimenti ad ogni Ricalcola toglie e rimette nel caso di MdF_CerniereBattVY
      mdf_val_SommaYAltriVani = 0
      mdf_val_YVano1 = VAR_VAL(PADRE(idx_att, 1), "MdF_VanoY1")
      mdf_val_YVano2 = VAR_VAL(PADRE(idx_att, 1), "MdF_VanoY2")
      mdf_val_YVano3 = VAR_VAL(PADRE(idx_att, 1), "MdF_VanoY3")
      mdf_add_offy_Vani = 0
      if (IS_MATCH(NOME(idx_att), "MdF_CerniereBattVY1") )
         {
          //mdf_valdim_YVano_ToOK = Y_pdr-VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_Y")-VAR_VAL(PADRE(idx_att, 1), "MdF_VanoY2")-VAR_VAL(PADRE(idx_att, 1), "MdF_VanoY3")
          mdf_val_SommaYAltriVani = mdf_val_YVano2+VAR_VAL(PADRE(idx_att, 1), "MdF_AriaVaniY")
          if (mdf_val_YVano3 > 50)
             { mdf_val_SommaYAltriVani = mdf_val_SommaYAltriVani+mdf_val_YVano3-VAR_VAL(PADRE(idx_att, 1), "MdF_AriaVaniY") }
         }
      if (IS_MATCH(NOME(idx_att), "MdF_CerniereBattVY2") )
         {
          mdf_add_offy_Vani = VAR_VAL(PADRE(idx_att, 1), "MdF_VanoY1") + VAR_VAL(PADRE(idx_att, 1), "MdF_AriaVaniY")
          mdf_val_SommaYAltriVani = mdf_val_YVano1+VAR_VAL(PADRE(idx_att, 1), "MdF_AriaVaniY")
          if (mdf_val_YVano3 > 50)
             { mdf_val_SommaYAltriVani = mdf_val_SommaYAltriVani+mdf_val_YVano3+VAR_VAL(PADRE(idx_att, 1), "MdF_AriaVaniY") }
         }

      if (IS_MATCH(NOME(idx_att), "MdF_CerniereBattVY3") )
         {
          mdf_val_SommaYAltriVani = mdf_val_YVano2+mdf_val_YVano3+2*VAR_VAL(PADRE(idx_att, 1), "MdF_AriaVaniY")
          mdf_add_offy_Vani = VAR_VAL(PADRE(idx_att, 1), "MdF_VanoY1") + VAR_VAL(PADRE(idx_att, 1), "MdF_VanoY2") + 2*VAR_VAL(PADRE(idx_att, 1), "MdF_AriaVaniY")
         }

      mdf_rel_ADD_bas0y_Error = 0
      mdf_rel_ADD_bas0y_LoadPers_Error = 0
      mdf_Lav_offy_Test_deb = ABS(VAR_VAL(PADRE(idx_att, 1), "mdF_Lav_offy_LoadPers"))-mdf_valdim_Y_ToOK-mdf_val_SommaYAltriVani
      if ( VAR_EXIST(PADRE(idx_att, 1), "mdF_Lav_offy_LoadPers") == 1
         & ABS(VAR_VAL(PADRE(idx_att, 1), "mdF_Lav_offy_LoadPers"))-mdf_valdim_Y_ToOK-mdf_val_SommaYAltriVani != Y
         )
         {
          mdf_Lav_offy_Err_deb = ABS(VAR_VAL(PADRE(idx_att, 1), "mdF_Lav_offy_LoadPers"))-mdf_valdim_Y_ToOK-mdf_val_SommaYAltriVani
          mdf_rel_ADD_bas0y_LoadPers_Error = 1
         }

      mdf_rel_ADD_bas0y_LoadARF_Error = 0
      mdf_Lav_offy_Reg_Test_deb = ABS(VAR_VAL(PADRE(idx_att, 1), "mdF_Lav_offy_LoadAttRegFacc"))-mdf_valdim_Y_ToOK-mdf_val_SommaYAltriVani
      if ( VAR_EXIST(PADRE(idx_att, 1), "mdF_Lav_offy_LoadAttRegFacc") == 1
         & ABS(VAR_VAL(PADRE(idx_att, 1), "mdF_Lav_offy_LoadAttRegFacc"))-mdf_valdim_Y_ToOK-mdf_val_SommaYAltriVani != Y
         )
         {
          mdf_Lav_offy_Reg_Err_deb = ABS(VAR_VAL(PADRE(idx_att, 1), "mdF_Lav_offy_LoadAttRegFacc"))-mdf_valdim_Y_ToOK-mdf_val_SommaYAltriVani

          mdf_rel_ADD_bas0y_LoadARF_Error = 1
          mdf_rel_ADD_bas0y_Error = 1
         // 07.07.2021 PC009112 mdF_Lav_offy_LoadAttRegFacc (Y_prec) vale 596.99 e Y vale 597, Vedi anche MdF_Elimina_x_DimXY_Change
          mdF_Lav_offy_LoadAttRegFaccABS = ABS(VAR_VAL(PADRE(idx_att, 1), "mdF_Lav_offy_LoadAttRegFacc"))
          if (ABS(mdF_Lav_offy_LoadAttRegFaccABS - Y) <= 0.01)
             {
              mdF_Lav_offy_LoadAttRegFacc_floor = FLOOR(VAR_VAL(PADRE(idx_att, 1), "mdF_Lav_offy_LoadAttRegFacc")*100)/100
              y_floor_debug = FLOOR(Y*100)/100
              mdf_Y_prec_floor = FLOOR(VAR_VAL(idx_att, "Y_prec")*1000)/1000

              mdf_rel_ADD_bas0y_LoadARF_Error = 0
              mdf_rel_ADD_bas0y_Error = 0
             }
         }

      // 26.11.2020 VD833221 MdF_ salvato con Y 715.5 ma doveva esere da 718.5 caricato senza MdF_Utente CerBat non lo cancellava
      //if ( STRCMP($MdF_Utente, "") != 0
      if ( VAR_VAL(idx_att, "mdf_save_prec") == 1
         | mdf_rel_ADD_bas0y_LoadPers_Error > 0
         | mdf_rel_ADD_bas0y_LoadARF_Error > 0
         )
         {
          basMdF = base_0.y
         // 21.03.2017
          bas0Fro = VAR_VAL(PADRE(idx_att, 1), "base_0.y")
          // Vedi cliente con base_0.y diversa da base_1,2,3.y :-O
          bas1Fro = VAR_VAL(PADRE(idx_att, 1), "base_1.y")
          mdf_limite_err = ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD")) +1
          if ( ABS(basMdF - bas0Fro - mdf_add_offy_Vani) >= mdf_limite_err
             & ABS(basMdF - bas1Fro - mdf_add_offy_Vani) >= mdf_limite_err
             )
             { mdf_rel_ADD_bas0y_Error = 2 }
          else
             {
              // 21.03.2017
              if (VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD") != 0)
                 {
                  mdf_debug_offy_LoadAttRegFacc = VAR_VAL(PADRE(idx_att, 1), "mdF_Lav_offy_LoadAttRegFacc")
                  mdf_debug_Y_offy_REL_ADD = Y + VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD")
                  if ( ABS(VAR_VAL(PADRE(idx_att, 1), "mdF_Lav_offy_LoadAttRegFacc")) == Y + VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD")
                     // 23.01.2019 MdF_offy_REL_ADD=-1.5
                     // vedi correzione 16.01.2019 MdF_offy_REL_ADD MdF_ADD_Reg_Interat
                     | ABS(VAR_VAL(PADRE(idx_att, 1), "mdF_Lav_offy_LoadAttRegFacc")) == Y + ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD") )
                     )
                     {
                      mdf_rel_ADD_bas0y_Error = 0
                     }
                 // 29.11.2021 gestioni grafiche vecchie imperfette
                  if (VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD") == Y)
                     {
                      if (IS_MATCH(VAR_VAL_STR(PADRE(idx_att, 1), "MdF_Apertura"), "VAPIE*") == 1)
                         { mdf_rel_ADD_bas0y_Error = -0.1 }
                     }
                 }
             }
         }

      // Lo spessore può cambiare ma non serve alla gestione MdF_Cambiato Dim
      // 04.04.2025 PK652421
      // ABS(X-X_prec) devo gestirlo con mdf_MdF_Pan_X_Cambiato
      //if ( ABS(X-X_prec) > 0.2  |  ABS(Y-Y_prec) > 0.2+mdf_valdim_Y_ToOK
      mdf_motivo_entry_Ctrl_Dim = 0
      //if ( ABS(Y-Y_prec) > 0.2+mdf_valdim_Y_ToOK
      //   | VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD") != MdF_offx_REL_ADD_prec
      //   | VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD") != MdF_offy_REL_ADD_prec
      //   | VAR_VAL(PADRE(idx_att, 1), "MdF_offz_REL_ADD") != MdF_offz_REL_ADD_prec
      //   | mdf_rel_ADD_bas0y_Error > 0
      //   // 20.05.2019
      //   | mdf_MdF_Pan_X_Cambiato > 0
      //   )
      if (ABS(Y-Y_prec) > 0.2+mdf_valdim_Y_ToOK)                                    { mdf_motivo_entry_Ctrl_Dim = 1 }
      if (VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD") != MdF_offx_REL_ADD_prec)  { mdf_motivo_entry_Ctrl_Dim = 2+mdf_motivo_entry_Ctrl_Dim }
      if (VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD") != MdF_offy_REL_ADD_prec)  { mdf_motivo_entry_Ctrl_Dim = 4+mdf_motivo_entry_Ctrl_Dim }
      if (VAR_VAL(PADRE(idx_att, 1), "MdF_offz_REL_ADD") != MdF_offz_REL_ADD_prec)  { mdf_motivo_entry_Ctrl_Dim = 8+mdf_motivo_entry_Ctrl_Dim }
      if (mdf_rel_ADD_bas0y_Error > 0)                                              { mdf_motivo_entry_Ctrl_Dim = 16+mdf_motivo_entry_Ctrl_Dim }
      if (mdf_MdF_Pan_X_Cambiato > 0)                                               { mdf_motivo_entry_Ctrl_Dim = 32+mdf_motivo_entry_Ctrl_Dim }

      if (mdf_motivo_entry_Ctrl_Dim > 0)
         {
          // 14.04.2025 PK 652421
          WITH_VAR_LOCAL(idx_att, "mdf_posY_Utente0", "posY_Utente", 2, 1, "0")
          WITH_VAR_LOCAL(idx_att, "mdf_posY_Utente", "posY_Utente", 2, 0, "0")

          if (mdf_posY_Utente != mdf_posY_Utente0)
             {
              Xpdr_Ctrl_Dim = VAR_VAL(PADRE(idx_att, 1), "X")
              MdF_Pan_X_Ctrl_Dim = VAR_VAL(PADRE(idx_att, 1), "MdF_Pan_X")
              // posY_Utente non lo puoi modificare se l' ordine non è caritcato. Se risultasse errato da capire come possa arrivare qui con posizione MdF_ Contenitore errata e posY_Utente diverso da 0
              //COMANDO2(STRCAT("LOGMSG MdF_Ctrl_Dim posY_Utente Non dovrebbe essere un problema se MdF_offx_REL_ADD !=0 perchè su rit il RELATIVE_ADD riporta già gli offset mdf_motivo_entry_Ctrl_Dim=", STR(mdf_motivo_entry_Ctrl_Dim), " ", VAR_VAL_STR(-1, "File")))
              //COMANDO2(STRCAT("LOGMSG MdF_Ctrl_Dim X_pdr_prec=", STR(VAR_VAL(idx_att, "X_pdr_prec")), " Xpdr=", STR(Xpdr_Ctrl_Dim), " MdF_Pan_X=", STR(MdF_Pan_X_Ctrl_Dim)))
             }

          // 13.01.2025 Y_prec 0 non sarebbe possibile a meno che non arrivi troppo presto e MdF_CerniereBattVY sia salvato sul rit
          if ( Y_prec != 0
             & mdf_posY_Utente == mdf_posY_Utente0
             )
             {
              mdf_deb_Cambiato_X_X_prec = ABS(X-X_prec)
              mdf_deb_Cambiato_Y_Y_prec = ABS(Y-Y_prec)
              mdf_deb_Cambiato_MdF_Pan_X_Cambiato = mdf_MdF_Pan_X_Cambiato
              mdf_deb_Cambiato_rel_ADD_bas0y_Error = mdf_rel_ADD_bas0y_Error

              mdf_Y_Interat_prec_floor = FLOOR(VAR_VAL(idx_att, "Y_prec")*1000)/1000
              SET_#(PADRE(idx_att, 1))
              MdF_Cambiato = STRCAT("Dim_MdF_Ctrl_Dim_X_", STR(X), "_Y_", STR(Y), "_X_prec_", STR(X_prec), "_Y_prec_", STR(Y_prec), "_Z_prec_", STR(Z_prec))
              #MdF_Cambiato = STRCAT("Dim_MdF_Ctrl_Dim_X_", STR(X), "_Y_", STR(Y), "_X_prec_", STR(X_prec), "_Y_prec_", STR(Y_prec), "_Z_prec_", STR(Z_prec))
              X_prec = X
              Y_prec = Y
              Z_prec = Z
              MdF_offx_REL_ADD_prec = VAR_VAL(PADRE(idx_att, 1), "MdF_offx_REL_ADD")
              MdF_offy_REL_ADD_prec = VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD")
              MdF_offz_REL_ADD_prec = VAR_VAL(PADRE(idx_att, 1), "MdF_offz_REL_ADD")
             // 20.05.2019
              X_pdr_prec = VAR_VAL(PADRE(idx_att, 1), "X")
              Y_pdr_prec = VAR_VAL(PADRE(idx_att, 1), "Y")

             // 04.10.2016
              if (mdf_rel_ADD_bas0y_Error == 2 & mdf_rel_ADD_bas0y_LoadARF_Error == 1)
                 {
                 // 28.09.2017
                  // Evita i loop.. Un caso in un anno
                  if (VAR_EXIST(idx_att, "mdf_Ctrl_LoadARF_Error") != 1)  { mdf_Ctrl_LoadARF_Error = -1 }
                  mdf_Ctrl_LoadARF_Error = mdf_Ctrl_LoadARF_Error+1
                  if (VAR_VAL(idx_att, "mdf_Ctrl_LoadARF_Error") > 3)  { mdf_Ctrl_LoadARF_Error = 0 }

                 // 24.06.2019
                  // Evita i loop.. Caso in cui la maniglia riduce il pannello, ma i punti notevoli dell' anta non rispettano la Y Frontale
                  SET_#(PADRE(idx_att, 1))
                  if (VAR_EXIST(PADRE(idx_att, 1), "mdf_Ctrl_LoadARF_Error") != 1)  { #mdf_Ctrl_LoadARF_Error = -1 }
                  #mdf_Ctrl_LoadARF_Error = #mdf_Ctrl_LoadARF_Error+1
                  if (VAR_VAL(PADRE(idx_att, 1), "mdf_Ctrl_LoadARF_Error") > 20)
                     {
                       basMdF = base_0.y
                       bas0Fro = VAR_VAL(PADRE(idx_att, 1), "base_0.y")
                       // Vedi cliente con base_0.y diversa da base_1,2,3.y :-O
                       bas1Fro = VAR_VAL(PADRE(idx_att, 1), "base_1.y")
                       mdf_limite_err = ABS(VAR_VAL(PADRE(idx_att, 1), "MdF_offy_REL_ADD")) +1
                       mdf_basMdF_bas1Fro = ABS(basMdF - bas1Fro)
                       mdf_yfro_basErr = VAR_VAL(PADRE(idx_att, 1), "Y")

                       msg_err_loop = STRCAT("ERRORE! Sto andando in Loop perche' \n",
                                       "ABS(basMdF - bas0Fro)=", STR(mdf_basMdF_bas1Fro), " e mdf_limite_err=", STR(mdf_limite_err), "\n",
                                       "Quindi o e' errata la Y Frontale ", STR(PADRE(idx_att, 1)), " Y=", STR(mdf_yfro_basErr) , " ", NOME(PADRE(idx_att, 1)) ," o i punti notevoli .y del Frontale \n",
                                       "oppure va aggiunto il corretto MdF_offy_REL_ADD \n",
                                       "Il messagio potrebbe apparire altre volte, premere OK finche' non si presenta piu'"
                                      )
                       // DISPLAY2(msg_err_loop)
                       COMANDO2(STRCAT("LOGMSG MdF_Ctrl_Dim " , msg_err_loop, " \n", NOME(idx_att), " idx_att=", STR(idx_att), " figlio di ", NOME(PADRE(idx_att, -1)), " ", VAR_VAL_STR(-1, "File"), " ", DATA(0)))
                      // 24.01.2020
                       DEL_VAR(PADRE(idx_att, 1), "MdF_Cambiato")
                       DEL_VAR(idx_att, "MdF_Cambiato")
                       EXIT()
                     }

                  if ( VAR_VAL(idx_att, "mdf_Ctrl_LoadARF_Error") < 3
                     // 24.06.2019
                     & VAR_VAL(PADRE(idx_att, 1), "mdf_Ctrl_LoadARF_Error") < 4
                     )
                     {
                      // 31.07.2018
                      // potrebbero entrare entrambi creando un loop
                      COMPONENTI2("mdf_CerBat_LoadARF", PADRE(idx_att, 1), "MdF_CerniereBattenti")
                      COMPONENTI2("mdf_Par_LoadARF", PADRE(idx_att, 1), "MdF_ContParacolpi")
                      if ( VAR_VAL(idx_att, "mdf_Ctrl_LoadARF_Error") == 0
                         | VAR_VAL(idx_att, "mdf_Ctrl_LoadARF_Error")+1 < mdf_CerBat_LoadARF+mdf_Par_LoadARF
                         )
                         {
                          //DISPLAY2(STRCAT("RICALCOLA_UNA ", NOME(idx_att), " mdf_Ctrl_LoadARF_Error=", STR(mdf_Ctrl_LoadARF_Error), " mdf_CerBat_LoadARF=", STR(mdf_CerBat_LoadARF), " mdf_Par_LoadARF=", STR(mdf_Par_LoadARF)))
                         // 31.07.2018
                          mdf_deb_diff_bas0 = ABS(basMdF - bas0Fro)
                          if (IS_MATCH($MDFSys_Load_ini, "OnMacro*") == 1)
                             {
                              if ( ABS(basMdF - bas0Fro) > 10
                                 & ABS(basMdF - bas1Fro) > 10
                                 )
                                 {
                                  // 12.03.2019
                                  DEL_VAR(idx_att, "mdf_added_*_daLoadPers")

                                  mdf_deb_limY_Con_Sbordo =  VAR_VAL(PADRE(idx_att, 1), "mdf_LimY_Con_Sbordo")
                                  mdf_deb_sbordoYInf = VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYInf")
                                  mdf_deb_sbordoYSup = VAR_VAL(PADRE(idx_att, 1), "MdfSys_SbordoYSup")
                                  if (VAR_VAL(PADRE(idx_att, 1), "MdF_Load_COMANDO2") == 0)
                                     {
                                      COMANDO(STRCAT("ELIMINA ", STR(idx_att), " // ", NOME(idx_att), " cambiato sbordoY trovata diff base_0.y di ", STR(mdf_deb_diff_bas0)))
                                     }
                                 }
                             }

                         // 28.10.2019
                          // Sc Problema se dll fa RICALCOLA_UNA da sola. Oppure se lo fa il Bdm
                          // e quindi va in conflitto con il COMANDO2 di MdF_Elimina_x_Dim_Change
                          // Forse correggendo il flusso ora non serve piu
                          // Eventualmente bisogna mettere una variabile esterna per distinguere le 2 situazioni
                          //if (VAR_VAL(PADRE(idx_att, 1), "MdF_Load_COMANDO2") == 0)
                          //   { COMANDO(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_agganciati", " // ", NOME(idx_att), " per mdf_rel_ADD_bas0y_LoadARF_Error")) }
                          // 23.06.2020 in VD000137 si bloccherebbe su mdf_ADD_Reg_Interat_1 perche alcuni entrano li per ACTION() 1 mentre altri fanno solo ACTION 3 per cui la ignorano
                          if (VAR_VAL(PADRE(idx_att, 1), "MdF_Load_COMANDO2") == 1)
                             {
                              act_LoadError = ACTION()
                              // ACTION() != 1064
                              if (ACTION() == 1)
                                 {
                                  if ( ABS(basMdF - bas0Fro) > 10
                                     & ABS(basMdF - bas1Fro) > 10
                                     )
                                     {
                                     // 22.12.2021 per test vedi 903667
                                      mdfCtrlDim_noRic = 1
                                      if ( IS_MATCH(UPPER(VAR_VAL_STR(idx_att, "KeyFamRegFacc")), "NOCER*")
                                         | STRLEN(VAR_VAL_STR(idx_att, "KeyFamRegFacc")) < 1
                                         )
                                         { mdfCtrlDim_noRic = 0 }

                                     // 22.12.2021 903667
                                      if (mdfCtrlDim_noRic > 0)
                                         {
                                         // 25.02.2022 A279_770_02289, Ca2202239
                                          //COMANDO2(STRCAT("RICALCOLA_UNA ", STR(PADRE(idx_att, 1)), " no_agganciati", " // ", NOME(idx_att), " per mdf_rel_ADD_bas0y_LoadARF_Error, mdf_deb_diff_bas0=", STR(mdf_deb_diff_bas0)))
                                          mdfCtrlDim_Ctrl_Flusso = 1
                                          COMANDO2(STRCAT("LOGMSG Se arrivo qui significa che il Frontale idx=", STR(PADRE(idx_att, 1)), " ha problemi di flusso Bdm-grafica vedi base_0.y ACTION", STR(ACTION()), " mdf_rel_ADD_bas0y_LoadARF_Error=", STR(mdf_rel_ADD_bas0y_LoadARF_Error), " mdf_rel_ADD_bas0y_Error=", STR(mdf_rel_ADD_bas0y_Error)))
                                          // Con COMANDO lo faccio alla fine, perche qui può arrivare solo in caricamento ordine, poi sara' la MdF_Ctrl_Post_RELATIVE_ADD ad occuparsi di fare il RICALCOLA_UNA con COMANDO2 o COMANDO
                                          // Con MdF_Ctrl_ADD_TooEarly non funziona per A279_770_02289 perchè dipende dai ricalcoli che fa il Bdm o la dll in automatico e il momento in cui vengono fatti
                                          // a meno che sulla GOSUB MdF_Ctrl_ADD_TooEarly di MdF_Ctrl_Post_RELATIVE_ADD non si aggiunga l' if VAR_VAL mdfCtrlDim_Ctrl_Flusso ma sarebbe troppo intricato
                                          COMANDO(STRCAT("Procedura MdF_Ctrl_Post_RELATIVE_ADD ", STR(idx_att), " // ", NOME(idx_att), " per mdf_rel_ADD_bas0y_LoadARF_Error, mdf_deb_diff_bas0=", STR(mdf_deb_diff_bas0)))
                                         }
                                      else
                                         { COMANDO2(STRCAT("LOGMSG MdF_Ctrl_Dim se capita segnalare a Tesy RG idxPdr=", STR(PADRE(idx_att, 1)), " ACTION", STR(ACTION()), " mdf_rel_ADD_bas0y_LoadARF_Error=", STR(mdf_rel_ADD_bas0y_LoadARF_Error), " mdf_rel_ADD_bas0y_Error=", STR(mdf_rel_ADD_bas0y_Error))) }
                                      // Il problema forse era la mancanza dell' EXIT perche' dopo la GOSUB MdF_Ctrl_Dim vengono fatte altre operazioni
                                      // ma se l' elemento e' eliminato non devono piu esser fatte
                                      EXIT()
                                     }
                                 }
                             // 27.11.2024 Col TuttaAltezza con 2 scocche. Riduzione da 3000 a 2700
                              mdf_flussoBdm_Error = 0
                              if (ABS(VAR_VAL(idx_att, "mdf_deb_diff_bas0")) > 1)
                                 {
                                  mdf_flussoBdm_Error = 1
                                  // Per ora limito visti i commenti sopra
                                  if (base_0.y < -1  &  Y > 2000)
                                     {
                                      COMANDO2(STRCAT("Procedura MdF_Ctrl_Post_RELATIVE_ADD ", STR(idx_att), " // ", NOME(idx_att), " per mdf_rel_ADD_bas0y_LoadARF_Error flussoBdm mdf_deb_diff_bas0=", STR(mdf_deb_diff_bas0)))
                                      EXIT()
                                     }
                                 }
                             }

                          //COMANDO(STRCAT("LOGMSG MdF_Ctrl_Dim idxPdr=", STR(PADRE(idx_att, 1)), " ACTION", STR(ACTION()), " mdf_rel_ADD_bas0y_LoadARF_Error=", STR(mdf_rel_ADD_bas0y_LoadARF_Error), " mdf_rel_ADD_bas0y_Error=", STR(mdf_rel_ADD_bas0y_Error)))
                         }
                     }
                 }
             }
         }
   }

   PROCEDURA MdF_DEL_VAR
   {
      DEL_VAR(-1, "mdf_*")
      DEL_VAR(-1, "idx_tab_Var")
      // Se si cancella una variabile e poi la si riassegna, questa viene implicitamente creata senza il NoSave.
      // Comunque adesso uso la mdf_path_DDP_gr e path_DDP_gr rimane su CAM_Standard
      //DEL_VAR(-1, "path_DDP_gr")
   }

   PROCEDURA MdF_Cam_Elimina
   {
      COMPONENTI2("cam_lav", idx_att, "CAM_Lavorazioni")
      iC=1
      while (iC <= cam_lav)
         {
          cam_idx_inc = PADRE(cam_lav[iC], 1)
          cam_NomeElemento = "CAM_Lavorazioni"
          // Fa parte del CAM, ma se l' MdF_ ha CAM_Lavorazioni significa che è in una modalità che
          // include CAM_Standard.inc
          if (VAR_VAL(-1, "CAM_Visualize") <= 0)  { GOSUB Cam_Elimina_Loc }
          else                                    { GOSUB Cam_Ricalcola_Loc }

          iC= iC+1
         }
   }

  // Gestione MCB_Ute_spostaCer spostamenti Cerniere da utente
   PROCEDURA MdF_Sort_MCB_Ute_spostaCer
   {
       if ( VAR_EXIST(PADRE(idx_att, 1), "MCB_Ute_spostaCer1") != 1
          & VAR_EXIST(PADRE(idx_att, 2), "MCB_Ute_spostaCer1") != 1
          )
          { EXITSUB() }

       mdf_ies = 1
       COMPONENTI2("MdF_CerBat_att", ATTUALE(), "MdF_CernieraBasetta_Batt")
       while (mdf_ies <= MdF_CerBat_att)
          {
           mdf_py_CerBat_n = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(mdf_ies)))
           VAR_VALUE_SET(idx_att, STRCAT("MdF_py_CerBat_att_##", STR(mdf_ies)), mdf_py_CerBat_n)
           VAR_VALUE_SET(idx_att, STRCAT("MdF_py_CerBat_pos_##", STR(mdf_ies)), mdf_ies)
           mdf_ies = mdf_ies+1
          }

       mdf_ies = 1
       mdf_jnt = 1
       mdf_py_CerBat_ies = 0
       mdf_py_CerBat_jnt = 0
      // ordinamento bubble-sort
       while (mdf_ies < MdF_CerBat_att)
          {
           mdf_jnt = mdf_ies+1
           while (mdf_jnt <= MdF_CerBat_att)
              {
               mdf_py_CerBat_ies = ARRAY("MdF_py_CerBat_att", mdf_ies)
               mdf_py_CerBat_jnt = ARRAY("MdF_py_CerBat_att", mdf_jnt)

               MdF_py_CerBat_pos_ies = ARRAY("MdF_py_CerBat_pos", mdf_ies)
               MdF_py_CerBat_pos_jnt = ARRAY("MdF_py_CerBat_pos", mdf_jnt)

               if (mdf_py_CerBat_ies > mdf_py_CerBat_jnt)
                  {
                   mdf_py_CerBat_appo = mdf_py_CerBat_ies
                   MdF_py_CerBat_pos_appo = MdF_py_CerBat_pos_ies
                   VAR_VALUE_SET(idx_att, STRCAT("MdF_py_CerBat_att_##", STR(mdf_ies)), mdf_py_CerBat_jnt)
                   VAR_VALUE_SET(idx_att, STRCAT("MdF_py_CerBat_att_##", STR(mdf_jnt)), mdf_py_CerBat_appo)

                   VAR_VALUE_SET(idx_att, STRCAT("MdF_py_CerBat_pos_##", STR(mdf_ies)), MdF_py_CerBat_pos_jnt)
                   VAR_VALUE_SET(idx_att, STRCAT("MdF_py_CerBat_pos_##", STR(mdf_jnt)), MdF_py_CerBat_pos_appo)
                  }
               mdf_jnt = mdf_jnt+1
              }
           mdf_ies = mdf_ies+1
          }

       mdf_ies = 1
       mdf_idx_MCB_Ute = PADRE(idx_att, 2)
       if (VAR_EXIST(PADRE(idx_att, 1), "MCB_Ute_spostaCer1") == 1)
          { mdf_idx_MCB_Ute = PADRE(idx_att, 1) }

       while (mdf_ies <= MdF_CerBat_att)
          {
           mdf_pos_py_CerBat_n = VAR_VAL(idx_att, STRCAT("MdF_py_CerBat_pos_##", STR(mdf_ies)))
           MCB_Ute_spostaCer_n = VAR_VAL(mdf_idx_MCB_Ute, STRCAT("MCB_Ute_spostaCer", STR(mdf_ies)))
           VAR_VALUE_SET(idx_att, STRCAT("MCB_Ute_spostaCer", STR(mdf_pos_py_CerBat_n)), MCB_Ute_spostaCer_n)

           mdf_ies = mdf_ies+1
          }
   }

   PROCEDURA mdf_idx_Battuta_SX
   {
      mdf_idx_Battuta_SX = idx_att
      mdf_idx_ToSearch_Bat = idx_MdF
      if ( VAR_EXIST(idx_MdF, "exitBattuta_SX") == 1
         & IS_IDX(VAR_VAL(idx_MdF, "exitBattuta_SX"))
         )
         { mdf_idx_Battuta_SX = VAR_VAL(idx_MdF, "exitBattuta_SX") }

      if ( VAR_EXIST(PADRE(idx_MdF, 1), "exitBattuta_SX") == 1
         & IS_IDX(VAR_VAL(PADRE(idx_MdF, 1), "exitBattuta_SX"))
         )
         {
          mdf_idx_Battuta_SX = VAR_VAL(PADRE(idx_MdF, 1), "exitBattuta_SX")
          mdf_idx_ToSearch_Bat = PADRE(idx_MdF, 1)
         }

     // 21.11.2023
      mdf_idx_Battuta_SX_sec = -1
      if ( VAR_VAL(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaSx_inY_alto") != mdf_idx_Battuta_SX
         & IS_IDX(VAR_VAL(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaSx_inY_alto"))
         // 11.04.2024
         & VAR_EXIST(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaSx_inY_alto")
         )
         {
          mdf_idx_Battuta_SX_sec = VAR_VAL(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaSx_inY_alto")
         }

      if ( VAR_VAL(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaSx_inY_basso") != mdf_idx_Battuta_SX
         & IS_IDX(VAR_VAL(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaSx_inY_basso"))
         // 11.04.2024
         & VAR_EXIST(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaSx_inY_basso")
         )
         {
          mdf_idx_Battuta_SX_sec = VAR_VAL(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaSx_inY_basso")
         }
   }

   PROCEDURA mdf_idx_Battuta_DX
   {
      mdf_idx_Battuta_DX = idx_att
      mdf_idx_ToSearch_Bat = idx_MdF
      if ( VAR_EXIST(idx_MdF, "exitBattuta_DX") == 1
         & IS_IDX(VAR_VAL(idx_MdF, "exitBattuta_DX"))
         )
         { mdf_idx_Battuta_DX = VAR_VAL(idx_MdF, "exitBattuta_DX") }

      if ( VAR_EXIST(PADRE(idx_MdF, 1), "exitBattuta_DX") == 1
         & IS_IDX(VAR_VAL(PADRE(idx_MdF, 1), "exitBattuta_DX"))
         )
         {
          mdf_idx_Battuta_DX = VAR_VAL(PADRE(idx_MdF, 1), "exitBattuta_DX")
          mdf_idx_ToSearch_Bat = PADRE(idx_MdF, 1)
         }

     // 21.11.2023
      mdf_idx_Battuta_DX_sec = -1
      if ( VAR_VAL(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaDx_inY_alto") != mdf_idx_Battuta_DX
         & IS_IDX(VAR_VAL(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaDx_inY_alto"))
         // 11.04.2024 forse ante ricambio non dovrebbe avere MdF_sat_Basetta_Attrezzata=1
         & VAR_EXIST(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaDx_inY_alto")
         )
         {
          mdf_idx_Battuta_DX_sec = VAR_VAL(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaDx_inY_alto")
         }

      if ( VAR_VAL(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaDx_inY_basso") != mdf_idx_Battuta_DX
         & IS_IDX(VAR_VAL(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaDx_inY_basso"))
         // 11.04.2024
         & VAR_EXIST(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaDx_inY_basso")
         )
         {
          mdf_idx_Battuta_DX_sec = VAR_VAL(mdf_idx_ToSearch_Bat, "mdf_doppio_fiaDx_inY_basso")
         }
   }

  // 08.01.2021
   PROCEDURA MdF_CerRibVas_Collision_Find
   {
      if (VAR_VAL(idx_att, "escluso") != 0)  { EXITSUB() }
      if (ACTION() <= 0)                     { EXITSUB() }

      // Se vicino lo trova sempre, l' offset e' passato ai figli quindi devo trovarlo sempre
      mdf_dist_CollX = X/2+1
      if (X < 62)  { mdf_dist_CollX = 62/2+1 }

      MCR_collX_dist_ctrl = 0
      if (VAR_EXIST(PADRE(idx_att, 1), "MCR_collX_dist_ctrl") )
         { MCR_collX_dist_ctrl = VAR_VAL(PADRE(idx_att, 1), "MCR_collX_dist_ctrl") }

      if (MCR_collX_dist_ctrl == 0)  { EXITSUB() }

      MCR_collX_spostaFisso = 0
      if (VAR_EXIST(PADRE(idx_att, 1), "MCR_collX_spostaFisso") )
         { MCR_collX_spostaFisso = VAR_VAL(PADRE(idx_att, 1), "MCR_collX_spostaFisso") }

      mcr_collX_archetipo1 = "*Fia*"
      if (VAR_EXIST(PADRE(idx_att, 1), "MCR_collX_archetipo1") )
         { mcr_collX_archetipo1 = VAR_VAL_STR(PADRE(idx_att, 1), "MCR_collX_archetipo1") }

      mcr_collX_archetipo2 = "*Div*"
      if (VAR_EXIST(PADRE(idx_att, 1), "MCR_collX_archetipo2") )
         { mcr_collX_archetipo2 = VAR_VAL_STR(PADRE(idx_att, 1), "MCR_collX_archetipo2") }

      // Per mettere mcr_distX_minToFound = 0 deve funzionare AOVG871830
      // 25.01.2024 AOVG124523. Funziona anche AOVG871830
      //if (VAR_EXIST(idx_att, "mcr_distX_minToFound") != 1)  { mcr_distX_minToFound = 0 }
      mcr_distX_minToFound = 0

     // 18.03.2022
      mcr_Ele_Found = 0
      BOX_MODE(0)
     // 16.07.2021 AOVG798114 per qualche motivo la cerniera-stessa trova Fianchi che non dovrebbe
      // In ogni caso la distanza è fatta su idx_att, quindi anche se trova piu Fianchi non dovrebbe essere un problema
      //NEAR_GLOBALE("mdf_collXCeRiVa", idx_att, mdf_dist_CollX, 1, mcr_collX_archetipo1)
      NEAR_GLOBALE("mdf_collXCeRiVa", PADRE(idx_att, 1), mdf_dist_CollX, 1, mcr_collX_archetipo1)
      mcr_collX_archetipo_Search = mcr_collX_archetipo1
      GOSUB MdF_CerRibVas_Collision_while

      //NEAR_GLOBALE("mdf_collXCeRiVa", idx_att, mdf_dist_CollX, 1, mcr_collX_archetipo2)
      NEAR_GLOBALE("mdf_collXCeRiVa", PADRE(idx_att, 1), mdf_dist_CollX, 1, mcr_collX_archetipo2)
      mcr_collX_archetipo_Search = mcr_collX_archetipo2
      GOSUB MdF_CerRibVas_Collision_while

      if (mcr_Ele_Found == 0)  { mcr_distX_minToFound = 0 }

     // 15.07.2021 AOVG871830
      // Devo spostare da questo altrimenti i sat non si spostano
     // 28.01.2022 con gestione rivista tolgo e riposiziono i sat con l' offset
     // 25.01.2024 E' sempre 1 da tempo, quindi commento per non far confusione
      //if (mcr_TipoGestioneCollis <= 0)  { base_0.x = base_0.x + mcr_distX_minToFound }

      // Per ora il RICALCOLA lo lascio fare alle Procedure MdF_Ctrl_Cambiamenti, MdF_CerBat_Collision_Post eccetera
      //if (VAR_VAL(idx_att, "mcr_distX_minToFound_prec") != mcr_distX_minToFound)
      //   {
      //    mcr_distX_minToFound_prec = mcr_distX_minToFound
      //    COMANDO(STRCAT("RICALCOLA_UNA ", STR(idx_att), " no_agganciati", " // ", NOME(idx_att), " x MdF_CerRibVas_Collision_Find ", STR(mcr_distX_minToFound)))
      //   }
   }

   PROCEDURA MdF_CerRibVas_Collision_while
   {
      icX = 1
      while (icX <= mdf_collXCeRiVa)
         {
          SET_#(mdf_collXCeRiVa[icX])
          X_ele_collX = VAR_VAL(mdf_collXCeRiVa[icX], "X")
          ba2_ele_collX = [#base_2.x, 0, #base_2.z]
          ba1_ele_collX = [#base_1.x, 0, #base_1.z]
          basy_ele_collX = #base_0.y
          alty_ele_collX = #alto_0.y

          ba0_att       = [base_0.x, 0, base_0.z]
          ba1_att       = [base_1.x, 0, base_1.z]
          ba2_att       = [base_2.x, 0, base_2.z]
          ba3_att       = [base_3.x, 0, base_3.z]
          // centro cerBas
          mdf_distX_1a1e = DISTANZA(ba1_att, ba1_ele_collX)
          mdf_distX_1a2e = DISTANZA(ba1_att, ba2_ele_collX)
         // 19.01.2021 bifacciale
          ba3_ele_collX = [#base_3.x, 0, #base_3.z]
          ba0_ele_collX = [#base_0.x, 0, #base_0.z]
          mdf_distX_1a0e = DISTANZA(ba1_att, ba0_ele_collX)
          mdf_distX_1a3e = DISTANZA(ba1_att, ba3_ele_collX)

          mdf_distX_2a0e = DISTANZA(ba2_att, ba0_ele_collX)
          mdf_distX_2a3e = DISTANZA(ba2_att, ba3_ele_collX)

          CAM_Ang = ANG_TOT2(idx_att)
          ba0_att = [base_0.x, 0, base_0.z]
          ba0_att_allung = [base_0.x-100*COSENO(CAM_Ang), 0, base_0.z+100*SENO(CAM_Ang)]
          ba1_att_allung = [base_1.x-100*COSENO(CAM_Ang), 0, base_1.z+100*SENO(CAM_Ang)]
          ba3_att = [base_3.x, 0, base_3.z]
          ba3_att_allung = [base_3.x+100*COSENO(CAM_Ang), 0, base_3.z-100*SENO(CAM_Ang)]
          ba2_att_allung = [base_2.x+100*COSENO(CAM_Ang), 0, base_2.z-100*SENO(CAM_Ang)]
          ba2_att_allungNeg = [base_2.x-100*COSENO(CAM_Ang), 0, base_2.z-100*SENO(CAM_Ang)]

          CAM_AngFia = ANG_TOT2(mdf_collXCeRiVa[icX])
          ba0_fia = [#base_0.x, 0, #base_0.z]
          ba1_fia = [#base_1.x, 0, #base_1.z]
          ba2_fia = [#base_2.x, 0, #base_2.z]
          ba3_fia = [#base_3.x, 0, #base_3.z]

          PointInterf_Sx = INTERFERISCI(ba1_fia, CAM_AngFia+90, ba2_att, ba1_att_allung)
          PointInterf_Dx = INTERFERISCI(ba2_fia, CAM_AngFia+90, ba1_att, ba2_att_allung)
          if (PointInterf_Dx.x <= -100000  &  PointInterf_Dx.y <= -100000  &  PointInterf_Dx.z <= -100000)
             { PointInterf_Dx = INTERFERISCI(ba2_fia, CAM_AngFia+90, ba1_att, ba2_att_allungNeg) }

          // Bifacciale
          if (ABS(CAM_Ang-CAM_AngFia) == 180)
             {
              PointInterf_Sx = INTERFERISCI(ba0_fia, CAM_AngFia+90, ba1_att, ba2_att_allung)
              PointInterf_Dx = INTERFERISCI(ba3_fia, CAM_AngFia+90, ba2_att, ba1_att_allung)
             }

          if (PointInterf_Sx.x>-1000001 & PointInterf_Sx.y>-1000001 & PointInterf_Sx.z>-1000001)
             {
              dist_2Pro_sx = DISTANZA(ba1_att, PointInterf_Sx)

              if (dist_2Pro_sx-2 < mdf_distX_1a1e  &  dist_2Pro_sx+2 > mdf_distX_1a1e)  { mdf_distX_1a1e = dist_2Pro_sx }

              if (ABS(CAM_Ang-CAM_AngFia) == 180)
                 {
                  if (dist_2Pro_sx-2 < mdf_distX_1a0e  &  dist_2Pro_sx+2 > mdf_distX_1a0e)  { mdf_distX_1a0e = dist_2Pro_sx }
                 }
             }

          if (PointInterf_Dx.x>-1000001 & PointInterf_Dx.y>-1000001 & PointInterf_Dx.z>-1000001)
             {
              dist_1Pro_dx = DISTANZA(ba1_att, PointInterf_Dx)
              dist_2Pro_dx = DISTANZA(ba2_att, PointInterf_Dx)
              dist_3Pro_dx = DISTANZA(ba3_att, PointInterf_Dx)

              if (dist_1Pro_dx-2 < mdf_distX_1a2e  &  dist_1Pro_dx+2 > mdf_distX_1a2e)  { mdf_distX_1a2e = dist_1Pro_dx }

              //if (dist_1Pro_dx-2 < mdf_distX_1a1e  &  dist_1Pro_dx+2 > mdf_distX_1a1e)  { mdf_distX_1a1e = dist_1Pro_dx }

              if (ABS(CAM_Ang-CAM_AngFia) == 180)
                 {
                  if (dist_1Pro_dx-2 < mdf_distX_1a3e  &  dist_1Pro_dx+2 > mdf_distX_1a3e)  { mdf_distX_1a3e = dist_1Pro_dx }
                 }
             }

          mcr_collX_prosegui = 0
          if (mcr_distX_minToFound == 0)  { mcr_collX_prosegui = 1 }
          else
             {
              if (mdf_distX_1a1e < ABS(mcr_distX_minToFound)  &  mdf_distX_1a2e < ABS(mcr_distX_minToFound))
                 { mcr_collX_prosegui = 2 }
             // 19.01.2021 bifacciale
              if (mdf_distX_1a0e < ABS(mcr_distX_minToFound)  &  mdf_distX_1a3e < ABS(mcr_distX_minToFound))
                 { mcr_collX_prosegui = 3 }
             }

         // 01.02.2021 S910528
          mcr_coll_compresoY = 0
          bas0y_rif = base_0.y
          alt0y_rif = alto_0.y
          if (bas0y_rif < 1)
             {
              bas0y_rif = VAR_VAL(PADRE(idx_att, 1), "base_0.y") + 30
              alt0y_rif = VAR_VAL(PADRE(idx_att, 1), "alto_0.y") - 30
             }
          if ( basy_ele_collX-12 < bas0y_rif
             & alty_ele_collX+12 > alt0y_rif
             )
             { mcr_coll_compresoY = 1 }

          if (mcr_coll_compresoY <= 0)  { mcr_collX_prosegui = -1 }

          if (mcr_collX_prosegui > 0)
             {
              if (mdf_distX_1a1e < MCR_collX_dist_ctrl | mdf_distX_1a2e < MCR_collX_dist_ctrl)
                 {
                  if (mdf_distX_1a1e < mdf_distX_1a2e)
                     {
                     // 18.03.2022 spostato fuori perche altrimenti trova anche i Fianchi Sx, Dx della sua scocca
                      NEAR_GLOBALE("mdf_collXCeRiVa2_att", idx_att, mdf_dist_CollX, 1, mcr_collX_archetipo_Search)
                      if (mdf_collXCeRiVa2_att > 0)
                         {
                          mcr_Ele_Found = mdf_collXCeRiVa[icX]
                          mcr_distX_case = 1
                          mcr_distX_minToFound = -1*(MCR_collX_dist_ctrl - mdf_distX_1a1e)
                          mcr_debugC1_idx = mdf_collXCeRiVa[icX]
                          mcr_debugC1_dX1a2e = mdf_distX_1a2e
                          mcr_debugC1_dX1a1e = mdf_distX_1a1e
                         // 22.12.2021 839133
                          if (mdf_distX_1a1e < mdf_distX_1a2e)
                             {
                              if (mdf_collXCeRiVa2_att > 1)
                                 {
                                  mcr_distX_case = 1.1
                                  mcr_distX_minToFound = MCR_collX_dist_ctrl + mdf_distX_1a2e
                                 }
                             }
                         // 20.01.2021
                          if (mdf_distX_1a2e < X_ele_collX)
                             {
                              mcr_distX_case = 2
                              mcr_distX_minToFound = -1*(MCR_collX_dist_ctrl + mdf_distX_1a1e)
                             }
                          if (MCR_collX_spostaFisso != 0)
                             {
                              mcr_distX_minToFound = -MCR_collX_spostaFisso
                             }
                         }
                     }
                  else
                     {
                      NEAR_GLOBALE("mdf_collXCeRiVa2_att", idx_att, mdf_dist_CollX, 1, mcr_collX_archetipo_Search)
                      if (mdf_collXCeRiVa2_att > 0)
                         {
                          mcr_Ele_Found = mdf_collXCeRiVa[icX]
                          mcr_distX_case = 3
                          mcr_distX_minToFound = MCR_collX_dist_ctrl - mdf_distX_1a2e
                          mcr_debugC3_idx = mdf_collXCeRiVa[icX]
                          mcr_debugC3_dX1a2e = mdf_distX_1a2e
                          mcr_debugC3_dX1a1e = mdf_distX_1a1e
                         // 22.12.2021 VD839133
                          if (mdf_distX_1a2e < mdf_distX_1a1e)
                             {
                              mcr_distX_case = 3.1
                              mdf_dist_CollX2 = MCR_collX_dist_ctrl
                             // 25.01.2022
                              if (mdf_collXCeRiVa2_att > 1)
                                 {
                                  mcr_distX_minToFound = -MCR_collX_dist_ctrl -mcr_debugC3_dX1a1e
                                 }
                             }
                         // 20.01.2021
                          if (mdf_distX_1a1e < X_ele_collX)
                             {
                              mcr_distX_case = 4
                              mcr_distX_minToFound = MCR_collX_dist_ctrl + mdf_distX_1a2e
                             }
                          if (MCR_collX_spostaFisso != 0)
                             {
                              mcr_distX_minToFound = MCR_collX_spostaFisso
                             }
                         }
                     }
                 }
              // 19.01.2021 bifacciale
              if (mdf_distX_1a0e < MCR_collX_dist_ctrl | mdf_distX_1a3e < MCR_collX_dist_ctrl)
                 {
                  if (mdf_distX_1a0e < mdf_distX_1a3e)
                     {
                      mdf_distX_1a0e_Case5 = mdf_distX_1a0e
                      mdf_distX_1a3e_Case5 = mdf_distX_1a3e
                      NEAR_GLOBALE("mdf_collXCeRiVa2_att", idx_att, mdf_dist_CollX, 1, mcr_collX_archetipo_Search)
                      if (mdf_collXCeRiVa2_att > 0)
                         {
                          mcr_Ele_Found = mdf_collXCeRiVa[icX]
                          mcr_distX_case = 5
                          // 14.01.2025 AL2025OVG212015
                          //mcr_distX_minToFound = -1*(MCR_collX_dist_ctrl - mdf_distX_1a0e)
                          mdf_distX_2a0e_Case5 = mdf_distX_2a0e
                          mdf_distX_2a3e_Case5 = mdf_distX_2a3e
                          mcr_distX_minToFound = MCR_collX_dist_ctrl + mdf_distX_1a0e
                         // 20.01.2021
                          // 14.01.2025
                          //if (mdf_distX_1a3e < X_ele_collX)
                          if (mdf_distX_2a0e < X_ele_collX  &  mdf_distX_2a0e < mdf_distX_1a0e)
                             {
                              mcr_distX_case = 6
                              mcr_distX_minToFound = -1*(MCR_collX_dist_ctrl + mdf_distX_1a0e)
                             }
                          if (MCR_collX_spostaFisso != 0)
                             {
                              mcr_distX_minToFound = -MCR_collX_spostaFisso
                             }
                         }
                     }
                  else
                     {
                      NEAR_GLOBALE("mdf_collXCeRiVa2_att", idx_att, mdf_dist_CollX, 1, mcr_collX_archetipo_Search)
                      if (mdf_collXCeRiVa2_att > 0)
                         {
                          mcr_Ele_Found = mdf_collXCeRiVa[icX]
                          mcr_distX_case = 7
                          mcr_distX_minToFound = MCR_collX_dist_ctrl - mdf_distX_1a3e
                          mdf_distX_1a0e_Case7 = mdf_distX_1a0e
                          mdf_distX_1a3e_Case7 = mdf_distX_1a3e
                          mdf_distX_2a0e_Case7 = mdf_distX_2a0e
                          mdf_distX_2a3e_Case7 = mdf_distX_2a3e
                         // 20.01.2021
                          if (mdf_distX_1a0e < X_ele_collX)
                             {
                              mcr_distX_case = 8
                              mcr_distX_minToFound = MCR_collX_dist_ctrl + mdf_distX_1a3e
                              // 14.01.2025 OVG840941
                              if (mdf_distX_2a0e < X_ele_collX  &  mdf_distX_2a0e < mdf_distX_1a0e)
                                 {
                                  mcr_distX_case = 9
                                  mcr_distX_minToFound = -1*(MCR_collX_dist_ctrl + mdf_distX_1a3e)
                                 }
                             }
                          if (MCR_collX_spostaFisso != 0)
                             {
                              mcr_distX_minToFound = MCR_collX_spostaFisso
                             }
                         }
                     }
                 }
             }
          icX = icX+1
         }
   }

  // 18.12.2020
   PROCEDURA mdf_ctrl_posy_sat_Basette
   {
      // per limitare al massimo il NEAR_GLOBALE
      if (VAR_VAL(PADRE(idx_att, 1), "MdF_sat_Basetta_Attrezzata") <= 0)  { EXITSUB() }

      // per limitare al massimo
      if (VAR_VAL(idx_att, "mdf_basette") == 0)
         { COMPONENTI2("mdf_basette", idx_att, "MdF_Basetta*") }

      iBs=1
      while (iBs <= mdf_basette)
         {
          if (IS_IDX(mdf_basette[iBs]) )
             {
              if (IS_MATCH(NOME(mdf_basette[iBs]), "MdF_Basetta*") )
                 {
                  idx_basCollis = mdf_basette[iBs]
                  BOX_MODE(0)
                  // 19.01.2022 Sn072701 da 120 a 170 collisione sposta a -120 non mi trovava piu il sat basetta
                  NEAR_GLOBALE("mdf_search_satBas", idx_basCollis, 170, 1, "MdF_Sat_Bas*")
                  mis = 1
                  while (mis <= mdf_search_satBas)
                     {
                      if (IS_IDX(mdf_search_satBas[mis]) )
                         {
                          if ( VAR_VAL(mdf_search_satBas[mis], "idx_MdFgraf") == idx_basCollis
                             // attrezzato su fianco
                             & PADRE(mdf_search_satBas[mis], 1) != idx_basCollis
                             )
                             {
                              id_Cer = VAR_VAL(idx_basCollis, "id_Cer")
                              mdf_collY_sposta_y_bas = VAR_VAL(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_Cer)))
                              mdf_collY_sposta_y_sat = VAR_VAL(mdf_search_satBas[mis], "mdf_collY_sposta_y")
                              if (mdf_collY_sposta_y_bas != mdf_collY_sposta_y_sat)
                                 {
                                  // 21.12.2020 piu corretto COMANDO2 altrimenti rischia di farlo 2 volte anche se comunque impiega meno di 0.001 sec
                                  COMANDO2(STRCAT("RICALCOLA_UNA ", STR(mdf_search_satBas[mis]), " no_agganciati", " // ", NOME(idx_att), " x cambio MdfSys_collY_sposta"))
                                 }
                             }
                         }
                      mis = mis+1
                     }
                 }
             }
          iBs = iBs+1
         }
   }

  // 14.12.2021
   PROCEDURA mdf_ctrl_posy_sat_Bas_ALW
   {
      // per limitare al massimo il NEAR_GLOBALE
      if (VAR_VAL(PADRE(idx_att, 1), "MdF_sat_Basetta_Attrezzata") <= 0)  { EXITSUB() }

      // per limitare al massimo
      if (VAR_VAL(idx_att, "mdf_basette") == 0)
         { COMPONENTI2("mdf_basette", idx_att, "MdF_Basetta*") }

      iBs=1
      while (iBs <= mdf_basette)
         {
          if (IS_IDX(mdf_basette[iBs]) )
             {
              if (IS_MATCH(NOME(mdf_basette[iBs]), "MdF_Basetta*") )
                 {
                  idx_basS = mdf_basette[iBs]
                  BOX_MODE(0)
                  NEAR_GLOBALE("mdf_search_satBas", idx_basS, 100, 1, "MdF_Sat_Bas*")
                  id_CerS = VAR_VAL(idx_basS, "id_Cer")
                  py_CerBatatt = VAR_VAL(idx_att, STRCAT("py_CerBat", STR(id_CerS)))
                  mis = 1
                  while (mis <= mdf_search_satBas)
                     {
                      if (IS_IDX(mdf_search_satBas[mis]) )
                         {
                          mdf_LivSpostaCerUte = VAR_VAL(PADRE(idx_att, 1), "MdfSys_LivSpostaCerUte")-1
                          mdf_sposta_y_Ute = VAR_VAL(PADRE(idx_att, mdf_LivSpostaCerUte), STRCAT("MDF_CER_base0y_SpostataUtente", STR(id_CerS)))
                          // Vedi MdF_Sat.inc MdF_Sat_BasBat negli Ambienti  dov'e' gestito py_CerBat
                          py_CerBatSat = VAR_VAL(mdf_search_satBas[mis], "py_CerBat")
                          if ( VAR_VAL(mdf_search_satBas[mis], "idx_MdFgraf") == idx_basS
                             // attrezzato su fianco
                             & PADRE(mdf_search_satBas[mis], 1) != idx_basS
                             & py_CerBatSat != py_CerBatatt
                             // 01.06.2022 diverso da 0 oppure VAR_EXIST(mdf_search_satBas[mis], "py_CerBat")
                             & py_CerBatSat != 0
                             )
                             {
                              mdf_sposta_y_Ute_att = mdf_sposta_y_Ute
                              COMANDO2(STRCAT("RICALCOLA_UNA ", STR(mdf_search_satBas[mis]), " no_agganciati", " // ", NOME(idx_att), " x cambio py_CerBat KeyFamRegFacc"))
                             }
                         }
                      mis = mis+1
                     }
                 }
             }
          iBs = iBs+1
         }
   }

  // 08.08.2022
   PROCEDURA mdf_Ctrl_BasSat_PostCollis
   {
      if (VAR_VAL(PADRE(idx_att, 1), "MdF_sat_Basetta_Attrezzata") <= 0)  { EXITSUB() }
      if (VAR_VAL(PADRE(idx_att, 1), "MdF_Ctrl_BasSat_PostCollis") <= 0)  { EXITSUB() }

      id_collisionSp = 1
      mce_Collision = 0
      while ( VAR_EXIST(idx_att, STRCAT("py_CerBat", STR(id_collisionSp))) == 1
         )
         {
          if (VAR_EXIST(idx_att, STRCAT("MdfSys_collY_sposta", STR(id_collisionSp))) )
             {
              mce_Collision = mce_Collision+1
             }

          id_collisionSp = id_collisionSp+1
         }

      if (mce_Collision > 0)
         {
          mdf_ricalc_satBas_Collision = 1
          mdfbattSx = VAR_VAL(PADRE(idx_att, 1), "exitBattuta_SX")
          mdfbattDx = VAR_VAL(PADRE(idx_att, 1), "exitBattuta_DX")
          if (IS_MATCH(MdF_Apertura, "SX*") )
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(mdfbattSx), " no_agganciati", " // x MdF_CerBat_Collision_Find")) }
          if (IS_MATCH(MdF_Apertura, "DX*") )
             { COMANDO(STRCAT("RICALCOLA_UNA ", STR(mdfbattDx), " no_agganciati", " // x MdF_CerBat_Collision_Find")) }
         }
   }

   PROCEDURA MdF_add_CerBatVY
   {
      mdf_elemento_fro = "MdF_CerniereBattVY*"
      COMPONENTI3("mdf_Ferr_eleIn", idx_att, mdf_elemento_fro)
      mdf_da_rit = 0
      if (mdf_Ferr_eleIn >= 1)
         {
          tLav = "CerBat"
          if (STRLEN(VAR_VAL_STR(mdf_Ferr_eleIn[1], STRCAT("KeyFamRegFacc_", tLav))) == 0)
             { mdf_da_rit = 1 }
         }
      if (mdf_Ferr_eleIn == 0  |  VAR_VAL(idx_att, "mdf_ctrl_MdF_Apertura") > 0  |  mdf_da_rit > 0)
         {
          CHIAVE_TABVAR_MDF = "CerBat"
          GOSUB MdF_Variabili

          GOSUB MdF_KeyFam_Battuta_X
          // Su CerBatFro potrei prendere le MdfSys_SbordoY

          CHIAVE_TABVAR_MDF = "CerBatFro"
          GOSUB MdF_Variabili

          GOSUB MdF_pos_CerBat

          tLav = "CerBat"
          if (STRLEN(VAR_VAL_STR(idx_att, STRCAT("KeyFamRegFacc_", tLav))) > 0)
             {
              mdf_Vano_offy1 = VAR_VAL(idx_att, "MdF_Vano_offy1")
              //mdF_Lav_offy_LoadAttRegFacc = mdF_Lav_offy
              mdF_Lav_offy_LoadAttRegFacc_V1 = mdF_Lav_offy+mdf_Vano_offy1
              mdF_Lav_offy_LoadAttRegFacc_V2 = mdF_Lav_offy+mdf_Vano_offy1+MdF_AriaVaniY+MdF_VanoY1
              mdF_Lav_offy_LoadAttRegFacc_V3 = mdF_Lav_offy+mdf_Vano_offy1+MdF_AriaVaniY+MdF_VanoY1+MdF_AriaVaniY+MdF_VanoY2

              // 16.01.2025 PK2025OVB650465 Se ho salvato nel rit MdF_CerniereBattVY1 non mi aggiunge piu il 2 e 3
              mdf_elemento_froV = "MdF_CerniereBattVY1"
              COMPONENTI3("mdf_Ferr_eleInV", idx_att, mdf_elemento_froV)
              if ( mdf_Ferr_eleInV == 0
                 & VAR_VAL(idx_att, "mdf_added_CerBat_daLoadPers") == 0
                 )
                 {
                  mdf_added_Interat_CerBat = 1
                  GOSUB mdf_ShowAbilitaOff_Interat
                  mdf_add_now_MdF_ADD_Reg_Interat = 1

                  // 12.12.2024 Taglio_H Elimino se ho ancora MdF_CerniereBattenti perchè voglio mettere le cerPerVano
                  COMPONENTI2("mdf_CerTuttAltez", idx_att, "MdF_CerniereBattenti")
                  if (mdf_CerTuttAltez > 0)
                     {
                      COMANDO2(STRCAT("ELIMINA ", STR(mdf_CerTuttAltez[1]), " // da=", STR(idx_att), " figlio di ", STR(PADRE(mdf_CerTuttAltez[1], 1)), " MdF_add_CerBatVY"))
                     }

                  mdf_elemento_fro = "MdF_CerniereBattVY1"
                  if (mdf_Load_COMANDO2 == 0)
                     { COMANDO(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy+mdf_Vano_offy1)," ",STR(mdF_Lav_offz) ," 0")) }
                  else
                     { COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy+mdf_Vano_offy1)," ",STR(mdF_Lav_offz) ," 0")) }
                 }

              mdf_elemento_froV = "MdF_CerniereBattVY2"
              COMPONENTI3("mdf_Ferr_eleInV", idx_att, mdf_elemento_froV)
              if ( mdf_Ferr_eleInV == 0
                 & VAR_VAL(idx_att, "mdf_added_CerBat_daLoadPers") == 0
                 )
                 {
                  if (VAR_VAL(idx_att, "mdf_added_Interat_CerBat") == 0)
                     {
                      mdf_added_Interat_CerBat = 1
                      GOSUB mdf_ShowAbilitaOff_Interat
                      mdf_add_now_MdF_ADD_Reg_Interat = 1
                     }
                  mdf_elemento_fro = "MdF_CerniereBattVY2"
                  if (mdf_Load_COMANDO2 == 0)
                     { COMANDO(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy+mdf_Vano_offy1+MdF_AriaVaniY+MdF_VanoY1)," ",STR(mdF_Lav_offz) ," 0")) }
                  else
                     { COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy+mdf_Vano_offy1+MdF_AriaVaniY+MdF_VanoY1)," ",STR(mdF_Lav_offz) ," 0")) }
                 }
              mdf_elemento_froV = "MdF_CerniereBattVY3"
              COMPONENTI3("mdf_Ferr_eleInV", idx_att, mdf_elemento_froV)
              if ( mdf_Ferr_eleInV == 0
                 & VAR_VAL(idx_att, "mdf_added_CerBat_daLoadPers") == 0
                 )
                 {
                  // 07.03.2024
                  if (VAR_VAL(idx_att, "MdF_VanoY3") >= 50)
                     {
                      if (VAR_VAL(idx_att, "mdf_added_Interat_CerBat") == 0)
                         {
                          mdf_added_Interat_CerBat = 1
                          GOSUB mdf_ShowAbilitaOff_Interat
                          mdf_add_now_MdF_ADD_Reg_Interat = 1
                         }
                      mdf_elemento_fro = "MdF_CerniereBattVY3"
                      if (mdf_Load_COMANDO2 == 0)
                         { COMANDO(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy+mdf_Vano_offy1+MdF_AriaVaniY+MdF_VanoY1+MdF_AriaVaniY+MdF_VanoY2)," ",STR(mdF_Lav_offz) ," 0")) }
                      else
                         { COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_elemento_fro," A ",STR(mdF_Lav_offx)," ",STR(mdF_Lav_offy+mdf_Vano_offy1+MdF_AriaVaniY+MdF_VanoY1+MdF_AriaVaniY+MdF_VanoY2)," ",STR(mdF_Lav_offz) ," 0")) }
                     }
                 }
             }
          GOSUB MdF_ricalcola_escl_Incl
         }
   }

   PROCEDURA MdF_ADD_sat_Post
   {
      if (ACTION() == 1064)  { EXITSUB() }
      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
     // 18.01.2021 Posso personalizzare il Load MdF_ svincolandomi dall $OnLoadOrder o $VAR_LOAD_ORDER
      if (VAR_VAL(-1, "MdF_LoadOrder") > -1)  { CAM_loadOrder = $MdF_LoadOrder }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() == 3)  { mdf_ADD_sat_ActPreLoad = "ACTION3" }
         }
      if (CAM_loadOrder == 1)                { EXITSUB() }
      //
      //if (CAM_loadOrder == 0)
      //   {
      //    if (ACTION() == 2)  { EXITSUB() }
      //   }
      //
      if (VAR_VAL(idx_att, "escluso") != 0)  { EXITSUB() }

      COMPONENTI2("mdf_CerVasRib", idx_att, "MdF_CernieraVasRib")
      mds_i = 1
      while (mds_i <= mdf_CerVasRib)
         {
          idx_ContMdF = PADRE(mdf_CerVasRib[mds_i], 2)
          mcb_ElementoBdm = VAR_VAL_STR(idx_ContMdF, "MCR_ElementoBdm_CerRib")
          mdf_Apertura = VAR_VAL_STR(idx_ContMdF, "MdF_Apertura")

          mdf_import = VAR_VAL_STR(mdf_CerVasRib[mds_i], "mdf_import")

          idx_To_ReAdd = idx_att
          if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
             {
              COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm)
              if (mdf_elementoBdm <= 0)
                 {
                  mdF_sat_offx = VAR_VAL(mdf_CerVasRib[mds_i], "mdF_Lav_offx")
                  mdF_sat_offy = VAR_VAL(mdf_CerVasRib[mds_i], "mdF_Lav_offy")
                  mdF_sat_offz = VAR_VAL(mdf_CerVasRib[mds_i], "mdF_Lav_offz")
                  mdF_sat_angz = VAR_VAL(mdf_CerVasRib[mds_i], "mdF_Lav_angz")
                  COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_To_ReAdd), " ", mcb_ElementoBdm, " A ", STR(mdF_sat_offx), " ", STR(mdF_sat_offy), " ", STR(mdF_sat_offz), " ", STR(mdF_sat_angz)))
                 }
             }

          mds_i = mds_i+1
         }


      COMPONENTI2("mdf_BasVasRib", idx_att, "MdF_BasettaVasRib")
      mds_i = 1
      while (mds_i <= mdf_BasVasRib)
         {
          idx_ContMdF = PADRE(mdf_BasVasRib[mds_i], 2)
          mcb_ElementoBdm = VAR_VAL_STR(idx_ContMdF, "MCR_ElementoBdm_BasRib")
          mdf_Apertura = VAR_VAL_STR(idx_ContMdF, "MdF_Apertura")

          mdf_import = VAR_VAL_STR(mdf_BasVasRib[mds_i], "mdf_import")

          idx_To_ReAdd = idx_att
          if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
             {
              COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm)
              if (mdf_elementoBdm <= 0)
                 {
                  mdF_sat_offx = VAR_VAL(mdf_CerVasRib[mds_i], "mdF_Lav_offx")
                  mdF_sat_offy = VAR_VAL(mdf_CerVasRib[mds_i], "mdF_Lav_offy")
                  mdF_sat_offz = VAR_VAL(mdf_CerVasRib[mds_i], "mdF_Lav_offz")
                  mdF_sat_angz = VAR_VAL(mdf_CerVasRib[mds_i], "mdF_Lav_angz")
                  COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_To_ReAdd), " ", mcb_ElementoBdm, " A ", STR(mdF_sat_offx), " ", STR(mdF_sat_offy), " ", STR(mdF_sat_offz), " ", STR(mdF_sat_angz)))
                 }
             }

          mds_i = mds_i+1
         }
   }

   PROCEDURA mdf_ctrl_nomeFile_sat
   {
      if (IS_MATCH(mdf_import, "*/") != 1)
         {
          mdf_Apertura = VAR_VAL_STR(mdf_sat_idx_idx_CamMdF, "MdF_Apertura")
          // 31.03.2020
          // Dopo alcuni cambi tra Apertura Sx e DX e viceversa, per qualche motivo capita che la MdF_Apertura del
          // CamMdF non sia corretta. In ogni caso forse e' piu corretto che prenda qualla dell' MdF_
          if (VAR_EXIST(idx_att, "idx_MdF") )
             { mdf_Apertura = VAR_VAL_STR(idx_MdF, "MdF_Apertura") }

         // 20.06.2024 Sc Base ANP 71020754 in inserimento
          if (VAR_EXIST(idx_att, "mdf_Apertura_prec") != 1)  { mdf_Apertura_prec = mdf_Apertura }

         // 30.04.2024 Ottimizzazioni FILE_EXIST
          if ( VAR_EXIST(idx_att, "mdf_import_EXIST")
             & mdf_Apertura == mdf_Apertura_prec
             )
             {
              mdf_import = mdf_import_EXIST
              EXITSUB()
             }

          // 21.11.2024 Baco mdf_Apertura_prec = mdf_Apertura_prec
          mdf_Apertura_prec = mdf_Apertura

          if (VAR_EXIST(idx_att, "mdf_count_FILE_EXIST_nomeFile") != 1)  { mdf_count_FILE_EXIST_nomeFile = 0 }

          // Se non esiste il sat in tabella provo ad aggiungere _ MdF_Apertura
          mdf_count_FILE_EXIST_nomeFile = mdf_count_FILE_EXIST_nomeFile+1
          if (FILE_EXIST(STRCAT(mdf_import, ".sat")) != 1)
             {
              mdf_nomeFile_sat = STRCAT(mdf_nomeFile_sat, "_", mdf_Apertura)
              mdf_import = STRCAT($path_file_sat_MdF, mdf_nomeFile_sat)
             }
          else
             { mdf_import_EXIST = mdf_import }

          // Se non esiste il sat in tabella provo con il NOME dell' elemento
          mdf_count_FILE_EXIST_nomeFile = mdf_count_FILE_EXIST_nomeFile+1
          if (FILE_EXIST(STRCAT(mdf_import, ".sat")) != 1)
             {
              mdf_nomeFile_att = NOME(idx_att)
              mdf_import_att = STRCAT($path_file_sat_MdF, mdf_nomeFile_att)
              // Se non esiste il sat con il NOME provo ad aggiungere _ MdF_Apertura
              mdf_count_FILE_EXIST_nomeFile = mdf_count_FILE_EXIST_nomeFile+1
              if (FILE_EXIST(STRCAT(mdf_import_att, ".sat")) != 1)
                 {
                  mdf_nomeFile_att = STRCAT(mdf_nomeFile_att, "_", mdf_Apertura)
                  mdf_import_att = STRCAT($path_file_sat_MdF, mdf_nomeFile_att)
                 }
              else
                 { mdf_import_EXIST = mdf_import }

              mdf_count_FILE_EXIST_nomeFile = mdf_count_FILE_EXIST_nomeFile+1
              if (FILE_EXIST(STRCAT(mdf_import_att, ".sat")) == 1)
                 {
                  mdf_nomeFile_sat = mdf_nomeFile_att
                  mdf_import = STRCAT($path_file_sat_MdF, mdf_nomeFile_sat)
                  mdf_import_EXIST = mdf_import
                 }
             }
          else
             { mdf_import_EXIST = mdf_import }
         }
   }

   PROCEDURA mdf_ADD_sat
   {
      if (ACTION() == 1064)  { EXITSUB() }
      CAM_loadOrder = 0
      if (VAR_EXIST(-1, "OnLoadOrder") )    { CAM_loadOrder = $OnLoadOrder }
      if (VAR_EXIST(-1, "VAR_LOAD_ORDER"))  { CAM_loadOrder = $VAR_LOAD_ORDER }
     // 18.01.2021 Posso personalizzare il Load MdF_ svincolandomi dall $OnLoadOrder o $VAR_LOAD_ORDER
      if (VAR_VAL(-1, "MdF_LoadOrder") > -1)  { CAM_loadOrder = $MdF_LoadOrder }
      if (CAM_loadOrder == 1)
         {
          if (ACTION() == 3)  { mdf_ADD_sat_ActPreLoad = "ACTION3" }
         }
      if (CAM_loadOrder == 1)                { EXITSUB() }
      // 11.11.2016 Deve rimanere altrimenti potrebbe non fare a tempo a ridisegnarli
      //if (CAM_loadOrder == 0)
      //   {
      //    if (ACTION() == 2)  { EXITSUB() }
      //   }
      //
      if (VAR_VAL(idx_att, "escluso") != 0)  { EXITSUB() }

      if (VAR_EXIST(idx_att, "idx_MdF") )  { mdf_sat_idx_idx_CamMdF = PADRE(idx_MdF, 1) }
      else                                 { mdf_sat_idx_idx_CamMdF = PADRE(idx_att, 3) }

      // 13.02.2019 Caricamento da cic
      if (STRLEN(VAR_VAL_STR(-1, "path_file_sat_MdF")) < 2)
         { GOSUB MdF_path_CAMTAB }

      mdf_idx_pdrdi1 = PADRE(idx_att, 1)
      if (STRCMP(NOME(idx_att), "MdF_CerBasAngLib") == 0)  { mdf_idx_pdrdi1 = idx_att }

     // 16.10.2024 PK Se MdF_sat_Basetta_Attrezzata=0 con le "ottimizzazioni per FILE_EXIST" non funzionava piu
      if ( VAR_EXIST(idx_att, "mdf_import_EXIST")
         )
         {
          if ( STR_INDEX_OF(VAR_VAL_STR(idx_att, "mdf_import"), 0, mdf_nomeFile_sat) <= -1
             // 21.11.2024
             | STR_INDEX_OF(VAR_VAL_STR(idx_att, "mdf_import_EXIST"), 0, mdf_nomeFile_sat) <= -1
             )
             {
              DEL_VAR(idx_att, "mdf_import_EXIST")
             }
         }

      mdf_import = STRCAT($path_file_sat_MdF, mdf_nomeFile_sat)
      GOSUB mdf_ctrl_nomeFile_sat
      if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnMacroCancella*") == 1)  { EXITSUB() }

      mdf_vis_sat_da_var = 0
      mdf_Visualize_sat = VAR_VAL_STR(mdf_sat_idx_idx_CamMdF, "MdF_Visualize_sat")
      if ( STRCMP(mdf_Visualize_sat, "No") != 0
         & STRCMP(mdf_Visualize_sat, "") != 0
         )
         { mdf_vis_sat_da_var = 1 }

      if (VAR_EXIST(PADRE(idx_att, -1), "copied__") )
         {
         // in copia-elemento se ci sono già i sat andava in errore
          if (ACTION() == 2)  { EXITSUB() }
         }

      if (VAR_EXIST(idx_att, "mdf_count_mdf_ADD_sat") ! = 1)  { mdf_count_mdf_ADD_sat = 0 }
      mdf_count_mdf_ADD_sat = mdf_count_mdf_ADD_sat+1

      mdf_add_sat_now = 0
      if ( STR_INDEX_OF($MdF_Visualize, 0, "ImportSat") > -1
         | mdf_vis_sat_da_var > 0
         )
         {
          mdf_eliminato_e_reADD = 0
          mdF_Lav_offx = mdF_sat_offx
          mdF_Lav_offy = mdF_sat_offy
          mdF_Lav_offz = mdF_sat_offz
          mdF_Lav_angz = mdF_sat_angz

          // 18.01.2024 PK
          Y_sat_ToRif = Y
          if (VAR_VAL(PADRE(idx_att, 3), "MdF_offy_REL_ADD") )
             {
              mdf_sat_offyRelAdd = VAR_VAL(PADRE(idx_att, 3), "MdF_offy_REL_ADD")
              Y_sat_ToRif = Y-mdf_sat_offyRelAdd
             }
          mdf_pan_y_sat = VAR_VAL(PADRE(idx_att, 3), "MdF_Pan_Y")
          if (mdf_pan_y_sat > 1)
             {
              mdf_diff_Y_sat = VAR_VAL(PADRE(idx_att, 3), "Y") - mdf_pan_y_sat
              Y_sat_ToRif = Y-mdf_diff_Y_sat
             }

          // 08.02.2024
          //if (UN_PADRE("MdF_CerniereBattenti") )
          if ( UN_PADRE("MdF_CerniereBatt*")
             // In teoria era una prova, non serve l'if *UTE*
             | UN_PADRE("MECC*UTE*CerBat")
             )
             {
              if (STRCMP(NOME(idx_att), "MdF_CernieraBatt") == 0)
                 {
                  // 08.05.2017
                  mdf_NoGrafCer = 0
                  if ( VAR_EXIST(PADRE(idx_MdF, 1), "MCB_Vis_CerBat") == 1
                     & VAR_VAL(PADRE(idx_MdF, 1), "MCB_Vis_CerBat") == 0
                     & escl_Grafica == 1
                     )
                     { mdf_NoGrafCer = 1 }

                  if (mdf_NoGrafCer == 0)
                     {
                      if (STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MCB_ElementoBdm_CerBat")) > 3)
                         {
                          mdf_skeyReg = "CerBat"
                         // 23.10.2023 Se eistono gli offset del sat significa che c'è anche il nome in tabella
                          if (STRLEN(VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_F1_CerBat", STR(id_Cer))) ) < 5)
                             { GOSUB mdf_ctrl_nomeFile_sat_Scocca }
                          mcb_ElementoBdm = VAR_VAL_STR(PADRE(idx_MdF, 1), "MCB_ElementoBdm_CerBat")
                          idx_To_ReAdd = PADRE(idx_att, 1)
                          // 07.05.2024 Lo tolgo per Ottimizzare. Eventualmente aggiunge un sat che non esiste, ma impiega meno tempo
                          // In teoria però dovrebbero gia essere sufficienti i controlli precedenti
                          //if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
                          //   {
                              COMPONENTI3("mdf_elementoBdm", idx_att, mcb_ElementoBdm)
                              // Passato in procedura Std per tutti i sat
                              GOSUB mdf_Ctrl_Change_import

                              if (mdf_elementoBdm <= 0)
                                 {
                                  if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y }
                                  mdf_add_sat_now = 1
                                  COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mcb_ElementoBdm, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                                 }
                              // 23.04.2018
                              //if (VAR_VAL(-1, "CAM_Visualize") <= 0)  { escl_Grafica = 1 }
                          //   }
                         }
                      else
                         {
                          //mdF_Lav_offx = mdF_sat_offx
                          //mdF_Lav_offy = mdF_sat_offy
                          //mdF_Lav_offz = mdF_sat_offz
                          //mdF_Lav_angz = mdF_sat_angz
                          mdf_ele_ADD = "MdF_ImportSatGenerico"
                          if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y }
                          if (IS_MATCH(mdf_import, "*/") != 1)
                             {
                              if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
                                 {
                                  COMPONENTI3("mdf_imp", idx_att, mdf_ele_ADD)
                                  if (mdf_imp <= 0)
                                     {
                                      mdf_add_sat_now = 1
                                      COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_ele_ADD, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                                     }
                                 }
                             }
                         }
                     }
                 }
             }
          if (STRCMP(NOME(idx_att), "MdF_BasettaSXDX") == 0)
             {
              mdF_Lav_offx = mdF_sat_offx
              mdF_Lav_offy = mdF_sat_offy
              mdF_Lav_offz = mdF_sat_offz
              mdF_Lav_angz = mdF_sat_angz

              mdf_import_eleBasBat = ""
              if (STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MCB_ElementoBdm_BasBat")) > 3)
                 {
                  mdf_skeyReg = "BasBat"
                 // 23.10.2023 Se eistono gli offset del sat significa che c'è anche il nome in tabella
                  if (STRLEN(VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_E2_CerBat", STR(id_Cer))) ) < 5)
                     { GOSUB mdf_ctrl_nomeFile_sat_Scocca }
                  mcb_ElementoBdm = VAR_VAL_STR(PADRE(idx_MdF, 1), "MCB_ElementoBdm_BasBat")
                  // 10.07.2018
                  if (IS_MATCH(UPPER(mcb_ElementoBdm), "NO*") != 1)
                     {
                      // 31.03.2020
                      //mdf_Apertura = VAR_VAL_STR(PADRE(idx_att, 3), "MdF_Apertura")
                      mdf_Apertura = VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura")
                      //idx_To_ReAdd = PADRE(idx_att, 1)
                      // 31.03.2020
                      idx_To_ReAdd = idx_att
                      if (VAR_VAL(PADRE(idx_MdF, 1), "MdF_sat_Basetta_Attrezzata") > 0)
                         {
                          GOSUB mdf_idx_Battuta_SX
                          GOSUB mdf_idx_Battuta_DX
                          if (IS_MATCH(mdf_Apertura, "SX*") )
                             {
                              idx_To_ReAdd = mdf_idx_Battuta_SX
                              // 21.11.2023
                              if (IS_IDX(mdf_idx_Battuta_SX_sec) )
                                 {
                                  mdf_FiaBatSx_bas0y = VAR_VAL(mdf_idx_Battuta_SX_sec, "base_0.y")
                                  mdf_FiaBatSx_alt0y = VAR_VAL(mdf_idx_Battuta_SX_sec, "alto_0.y")
                                  if ( base_0.y > mdf_FiaBatSx_bas0y
                                     & base_0.y < mdf_FiaBatSx_alt0y
                                     )
                                     { idx_To_ReAdd = mdf_idx_Battuta_SX_sec }
                                 }
                             }
                          else
                             {
                              idx_To_ReAdd = mdf_idx_Battuta_DX
                              // 21.11.2023
                              if (IS_IDX(mdf_idx_Battuta_DX_sec) )
                                 {
                                  mdf_FiaBatDx_bas0y = VAR_VAL(mdf_idx_Battuta_DX_sec, "base_0.y")
                                  mdf_FiaBatDx_alt0y = VAR_VAL(mdf_idx_Battuta_DX_sec, "alto_0.y")
                                  if ( base_0.y > mdf_FiaBatDx_bas0y
                                     & base_0.y < mdf_FiaBatDx_alt0y
                                     )
                                     { idx_To_ReAdd = mdf_idx_Battuta_DX_sec }
                                 }
                             }
                          // 13.05.2020
                          if (ABS(VAR_VAL(idx_MdF, "MdF_angoloBas")) > 80  &  ABS(VAR_VAL(idx_MdF, "MdF_angoloBas")) < 100)
                             {
                              idx_To_ReAdd = PADRE(idx_MdF, 1)

                              mdF_archetipo_Mon = "*Montante*"
                              BOX_MODE(0)
                              NEAR_GLOBALE("mdfMontante_vic", PADRE(idx_att, 1), 90, 1, mdF_archetipo_Mon)
                              // 12.02.2025 Sc1057341
                              if (mdfMontante_vic == 0)
                                 {
                                  mdF_archetipo_Mon = "FiancoDiv*"
                                  NEAR_GLOBALE("mdfMontante_vic", PADRE(idx_att, 1), 4, 1, mdF_archetipo_Mon)
                                 }
                              if (mdfMontante_vic == 0)
                                 {
                                  // 19.06.2020 prima cerco Fis
                                  mdF_archetipo_Mon = "*Fis*"
                                  NEAR_GLOBALE("mdfMontante_vic", PADRE(idx_att, 1), 90, 1, mdF_archetipo_Mon)
                                 // 29.01.2021 BasettaSup sente PianoFisso ColANP
                                  nRipFis = 0
                                  nAntaPiuFis = 0
                                  iMo = 1
                                  while (iMo <= mdfMontante_vic)
                                     {
                                      if ( IS_MATCH(NOME(mdfMontante_vic[iMo]), "*Pia*")
                                         | IS_MATCH(NOME(mdfMontante_vic[iMo]), "*Rip*")
                                         // 05.05.2023 Semicolonna con Fascia Fissa sotto
                                         | VAR_VAL(mdfMontante_vic[iMo], "Y") < 90
                                         )
                                         { nRipFis = nRipFis+1 }

                                     // 15.11.2023 A161187 Cuc_AntaBattPiuFissa non va bene anche perchè oltre ad essere il padre delle 2 ante non ha il vano_0_0
                                      if ( IS_MATCH(NOME(mdfMontante_vic[iMo]), "*Anta*P*Fissa")
                                         & mdfMontante_vic[iMo] == PADRE(idx_att, 4)
                                         )
                                         {
                                          nRipFis = nRipFis+1
                                          // 14.04.2025 A015091 trova squadretta*Fissa e FrontaleFisso vicino
                                          nAntaPiuFis = nAntaPiuFis+1
                                         }

                                      iMo = iMo+1
                                     }
                                  // significa che li ho scartati tutti
                                  if (nRipFis == mdfMontante_vic)  { mdfMontante_vic = 0 }

                                  if ( mdfMontante_vic == 0
                                    // 14.04.2025 A015091
                                     | nAntaPiuFis > 0
                                     )
                                     {
                                      mdF_archetipo_Mon = NOME(PADRE(idx_att, 3))
                                      NEAR_GLOBALE("mdfMontante_vic", PADRE(idx_att, 1), 90, 1, mdF_archetipo_Mon)
                                     }
                                 }
                              iMo = 1
                              while (iMo <= mdfMontante_vic)
                                 {
                                  if ( VAR_EXIST(mdfMontante_vic[iMo], "vano_0_0") == 1
                                     & mdfMontante_vic[iMo] != PADRE(idx_att, 3)
                                     & PADRE(mdfMontante_vic[iMo], -1) == PADRE(idx_att, -1)
                                    // 29.01.2021
                                     & IS_MATCH(NOME(mdfMontante_vic[iMo]), "*Pia*") != 1
                                     & IS_MATCH(NOME(mdfMontante_vic[iMo]), "*Rip*") != 1
                                     )
                                     {
                                      basyMont = VAR_VAL(mdfMontante_vic[iMo], "base_0.y")
                                     // 29.04.2021 A045332 4ante ANP Pens
                                      altyMont = VAR_VAL(mdfMontante_vic[iMo], "alto_0.y")
                                      basy_att_MdF = VAR_VAL(PADRE(idx_att, 3), "base_0.y")
                                      // se trova frontale sopra prima di quello a fianco
                                      if ( basyMont-80 < basy_att_MdF
                                         & altyMont-10 > basy_att_MdF
                                         )
                                         {
                                          idx_To_ReAdd = mdfMontante_vic[iMo]
                                         // 21.01.2021
                                          if ( IS_MATCH(NOME(idx_To_ReAdd), "*Mon*Ing*")
                                             | VAR_VAL(idx_To_ReAdd, "mdf_sat_montanteBasette") == 1
                                             )
                                             { iMo = mdfMontante_vic }
                                         }
                                     }

                                  iMo = iMo+1
                                 }
                             }
                         }

                      // 07.05.2024 Lo tolgo per Ottimizzare. Eventualmente aggiunge un sat che non esiste, ma impiega meno tempo
                      // In teoria però dovrebbero gia essere suffcienti i controlli precedenti
                      //if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
                      //   {
                          // 07.12.2023 Sn017741 Problema AntaSingolaBattenteAngCurva con MdF_offx_REL_ADD
                          if (VAR_EXIST(idx_att, "idx_To_ReAdd_prec") != 1)
                             { idx_To_ReAdd_prec = idx_To_ReAdd }

                          COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm)
                          if ( VAR_VAL(PADRE(idx_MdF, 1), "MdF_sat_Basetta_Attrezzata") == 0
                             // 13.05.2020
                             | idx_To_ReAdd == idx_att
                             )
                             {
                              if (mdf_elementoBdm > 0)
                                 {
                                  // 11.01.2021
                                  mdf_import_eleBasBat = VAR_VAL_STR(mdf_elementoBdm[1], "import")

                                  if ( STRCMP(VAR_VAL_STR(mdf_elementoBdm[1], "mdf_Apertura"), VAR_VAL_STR(idx_MdF, "MdF_Apertura")) != 0
                                     | STRCMP(mdf_import, VAR_VAL_STR(mdf_elementoBdm[1], "import")) != 0
                                     )
                                     {
                                      GOSUB mdf_ShowAbilitaOff_ADD_sat
                                      mdf_eliminato_e_reADD = 1
                                      COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[1]), " // MCB_ElementoBdm_BasBat mdf_ADD_sat"))
                                      mdf_elementoBdm = 0
                                     }
                                 }
                              if (mdf_elementoBdm <= 0)
                                 {
                                  if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y }
                                  mdf_add_sat_now = 1
                                  COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_To_ReAdd), " ", mcb_ElementoBdm, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                                 }
                             }
                          else
                             {
                              if (idx_To_ReAdd == PADRE(idx_MdF, 1) )  { EXITSUB() }
                              mdf_sat_prosegui_Attr = 0
                              // 09.05.2025 BROWSER2148071 Sc ColFor
                              // Vuol dire aggiunte troppo presto prima di avere MdF_sat_Basetta_Attrezzata = 1
                              if (VAR_VAL(PADRE(idx_MdF, 1), "MdF_sat_Basetta_Attrezzata") == 1)
                                 {
                                  // Non dovrei averne
                                  COMPONENTI2("mdf_elementoBdmFiglio", idx_att, mcb_ElementoBdm)
                                  if (mdf_elementoBdmFiglio > 0)
                                     {
                                      GOSUB mdf_ShowAbilitaOff_ADD_sat
                                      mdf_eliminato_e_reADD = 1
                                      COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdmFiglio[1]), " // MCB_ElementoBdm_BasBat Figlio Err mdf_ADD_sat"))
                                     }
                                 }
                              mEi = 1
                              while(mEi <= mdf_elementoBdm)
                                 {
                                  // 08.05.2024 Ottimizzazioni
                                  // 14.05.2024
                                  // 21.11.2024 Vedi anche mdf_Ctrl_Change_import
                                  import_ele_sat_att   = VAR_VAL_STR(mdf_elementoBdm[mEi], "import")
                                  mdf_import_eleBasBat = VAR_VAL_STR(mdf_elementoBdm[mEi], "import")
                                  mdf_ctrl_change_sat = 0
                                 // 07.05.2025 EM0122400072
                                  midx_CamMdF = VAR_VAL(mdf_elementoBdm[mEi], "idx_MdFgraf")
                                  if (VAR_EXIST(PADRE(idx_att, 3), "mdf_bas0_y_Fro_Prec") == 1)
                                     {
                                      if (ABS(VAR_VAL(PADRE(idx_att, 3), "mdf_bas0_y_Fro_Prec") - VAR_VAL(PADRE(idx_att, 3), "base_0.y")) > 1)
                                         {
                                          mdiffbas0y_CamMdF = VAR_VAL(PADRE(idx_att, 3), "mdf_bas0_y_Fro_Prec") - VAR_VAL(PADRE(idx_att, 3), "base_0.y")
                                          if (VAR_VAL(mdf_elementoBdm[mEi], "idx_MdFgraf") == idx_att)
                                             { mdf_ctrl_change_sat = 999.99 }
                                         }
                                     }
                                  if (VAR_EXIST(PADRE(idx_att, 2), "MdF_Ctrl_var_gest_MdF") != 1)
                                     {
                                      // Questa in realta è sempre stata sbagliata, perchè KeyFamRegFacc_CerBat sull' MdF_ esiste da poco, prima c'era KeyFamRegFacc
                                      // e quindi non enrtava mai perchè sugli MdF_Sat non essendoci KeyFamRegFacc_CerBat il VAR_VAL_STR era per entrambe vuote
                                      // però c' era in OR il confronto con import
                                      //if ( STRCMP(VAR_VAL_STR(mdf_elementoBdm[mEi], "KeyFamRegFacc_CerBat"), VAR_VAL_STR(idx_MdF, "KeyFamRegFacc_CerBat")) != 0
                                      if ( STRCMP(UPPER(mdf_import), UPPER(VAR_VAL_STR(mdf_elementoBdm[mEi], "import"))) != 0
                                         & VAR_VAL(mdf_elementoBdm[mEi], "idx_MdFgraf") == idx_att
                                         //& IS_MATCH(VAR_VAL_STR(mdf_elementoBdm[mEi], "import"), "*Link*") != 1
                                         // 21.11.2024
                                         & STRLEN(import_ele_sat_att) > 0
                                         )
                                         { mdf_ctrl_change_sat = 1 }
                                     }
                                  else
                                     {
                                      if ( VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") > 0
                                         & VAR_VAL(mdf_elementoBdm[mEi], "idx_MdFgraf") == idx_att
                                         // 23.07.2024 A3
                                         // 21.11.2024
                                         & STRCMP(UPPER(mdf_import), UPPER(import_ele_sat_att)) != 0
                                         & STRLEN(import_ele_sat_att) > 0
                                         )
                                         { mdf_ctrl_change_sat = 2 }
                                     }
                                  if (mdf_ctrl_change_sat > 0)
                                     {
                                      // 14.05.2024
                                      //mdf_import_eleBasBat = VAR_VAL_STR(mdf_elementoBdm[mEi], "import")
                                      mdf_sat_prosegui_Attr = 1
                                      GOSUB mdf_ShowAbilitaOff_ADD_sat
                                      mdf_eliminato_e_reADD = 1

                                      import_ele_sat_att_change = import_ele_sat_att
                                      mdf_import_change = mdf_import
                                      //DISPLAY("mdf_ctrl_change_sat", VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM"))
                                      COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[mEi]), " // MCB_ElementoBdm_BasBat Attrezza ", NOME(mdf_elementoBdm[mEi]) ," da=", STR(idx_att), " pdr3=", STR(PADRE(idx_att, 3)), " mdf_ctrl_change_sat=", STR(mdf_ctrl_change_sat)))
                                     }
                                  mEi = mEi+1
                                 }
                              sat_id_Bas_found = 0
                              if (mdf_sat_prosegui_Attr == 0)
                                 {
                                  iEm = 1
                                  while (iEm <= mdf_elementoBdm)
                                     {
                                      if (VAR_VAL(mdf_elementoBdm[iEm], "idx_MdFgraf") == idx_att)
                                         { sat_id_Bas_found = 1 }

                                      iEm = iEm+1
                                     }
                                 }
                              if (sat_id_Bas_found == 0)  { mdf_sat_prosegui_Attr = 1 }

                              COMPONENTI3("mdf_elementoBdmOpp", mdf_idx_Battuta_DX, mcb_ElementoBdm)
                              if (IS_MATCH(mdf_Apertura, "DX*") )
                                 { COMPONENTI3("mdf_elementoBdmOpp", mdf_idx_Battuta_SX, mcb_ElementoBdm) }

                              mEi = 1
                              while(mEi <= mdf_elementoBdmOpp)
                                 {
                                  // 28.10.2020
                                  if (VAR_VAL(mdf_elementoBdmOpp[mEi], "idx_MdFgraf") == idx_att)
                                     {
                                      GOSUB mdf_ShowAbilitaOff_ADD_sat
                                      mdf_eliminato_e_reADD = 1
                                      COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdmOpp[mEi]), " // MCB_ElementoBdm_BasBat FiaOpposto cambioAperturaSXDX da=", STR(idx_att)))
                                     }
                                  mEi = mEi+1
                                 }

                              // 07.12.2023 Sn017741 Problema AntaSingolaBattenteAngCurva con MdF_offx_REL_ADD
                              // se destra trova il fianco sinistro e solo l' MdF_ figlio ha poi il fianco destro corretto
                              if (idx_To_ReAdd_prec != idx_To_ReAdd)
                                 {
                                  COMPONENTI3("mdf_elementoBdmPrec", idx_To_ReAdd_prec, mcb_ElementoBdm)
                                  mEi = 1
                                  while(mEi <= mdf_elementoBdmPrec)
                                     {
                                      if (VAR_VAL(mdf_elementoBdmPrec[mEi], "idx_MdFgraf") == idx_att)
                                         {
                                          GOSUB mdf_ShowAbilitaOff_ADD_sat
                                          mdf_eliminato_e_reADD = 1
                                          COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdmPrec[mEi]), " // MCB_ElementoBdm_BasBat idx_To_ReAdd_prec da=", STR(idx_att)))
                                         }
                                      mEi = mEi+1
                                     }
                                  // 13.03.2024 Devo farlo alla fine altrimenti rimangono MCB_ElementoBdm_Basetta_1,2
                                  //idx_To_ReAdd_prec = idx_To_ReAdd
                                 }

                              // 23.10.2020 2080 copied AGGANCIATA a 3342B ANP
                              if (VAR_EXIST(PADRE(idx_att, -1), "copied__") == 1)
                                 {
                                  if (ACTION() == 1)
                                     {
                                      if (CMD() == 0)  { mdf_sat_prosegui_Attr = -99 }
                                     }
                                 }

                              if (mdf_sat_prosegui_Attr > 0)
                                 {
                                  mdf_add_sat_act = ACTION()
                                  mdf_add_sat_now = 1
                                  mdfsys_collY_sposta_idx_MdFgraf_att = VAR_VAL(PADRE(idx_att, 2), STRCAT("MdfSys_collY_sposta", STR(id_Cer)))
                                  COMANDO2("PUSH_SITUAZIONE")
                                  COMANDO2(STRCAT("SETTA ", STR(idx_To_ReAdd)))
                                  COMANDO2(STRCAT("ELEMENTO_I ", mcb_ElementoBdm))
                                  COMANDO2("STRUTTURA_I")
                                  COMANDO2(STRCAT("VAR_SET X_MdF_graf=", STR(X), " idx_MdFgraf=", STR(idx_att), " id_Reggraf=", STR(id_Cer), " mdF_Lav_offx=", STR(mdF_Lav_offx), " mdF_Lav_offy=", STR(mdF_Lav_offy), " mdF_Lav_offz=", STR(mdF_Lav_offz)))
                                  // 29.05.2024
                                  COMANDO2(STRCAT("VAR_SET mdfsys_collY_sposta_idx_MdFgraf=", STR(mdfsys_collY_sposta_idx_MdFgraf_att)))

                                  if (STRLEN(VAR_VAL_STR(idx_To_ReAdd, "MdF_sat_VANO")) == 0)  { COMANDO2("VANO 0") }
                                  else                                                         { COMANDO2(VAR_VAL_STR(idx_To_ReAdd, "MdF_sat_VANO")) }
                                  COMANDO2(STRCAT("ATTREZZA2 ", STR(base_0.y)))
                                  COMANDO2("POP_SITUAZIONE")
                                 }
                             }
                          if (VAR_VAL(-1, "CAM_Visualize") <= 0)  { escl_Grafica = 1 }
                         //}
                     // 27.04.2020
                      idx_To_ReAdd_Basetta = idx_To_ReAdd
                     }
                 }
              else
                 {
                  mdf_ele_ADD = "MdF_ImportSatGenerico"
                  if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y }
                  if (IS_MATCH(mdf_import, "*/") != 1)
                     {
                      if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
                         {
                          COMPONENTI3("mdf_imp", idx_att, mdf_ele_ADD)
                          if (mdf_imp <= 0)
                             {
                              mdf_add_sat_now = 1
                              COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mdf_ele_ADD, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                             }
                          if (VAR_VAL(-1, "CAM_Visualize") <= 0)
                             { escl_Grafica = 1 }
                         }
                     }
                 }

              // 08.11.2018
              mdf_idx_satlinkBas = idx_MdF
              if (STRLEN(VAR_VAL_STR(idx_MdF, "MCB_ElementoBdm_Basetta_1")) < 3)
                 { mdf_idx_satlinkBas = PADRE(idx_MdF, 1) }

              // 27.04.2020
              idx_To_ReAdd = PADRE(idx_att, 1)
              if (VAR_EXIST(idx_att, "idx_To_ReAdd_Basetta") )
                 {
                  if (IS_IDX(idx_To_ReAdd_Basetta) )  { idx_To_ReAdd = idx_To_ReAdd_Basetta }
                 }

              mdf_Apertura = VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura")

              if ( STRLEN(VAR_VAL_STR(mdf_idx_satlinkBas, "MCB_ElementoBdm_Basetta_1")) > 3
                // 07.10.2021 strano sia uscito solo adesso. Il problema e' che in inserimento da Listino una baseANP in cui non dovevano esserci le cerniere-basette
                // sul frontaleFisso inzialmente le aveva, poi, dopo essersi configurata l' MdF_Apertuta corretta li cancellava, ma faceva anche parecchi ricalcoli bdm e quindi e' uscito il problema
                 & FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1
                 // 31.07.2024
                 & FILE_EXIST(STRCAT(mdf_import, "_2.sat")) != 1
                 )
                 {
                  mcb_ElementoBdm_Basetta_1 = VAR_VAL_STR(mdf_idx_satlinkBas, "MCB_ElementoBdm_Basetta_1")
                  mdF_Lav_offx = VAR_VAL(mdf_idx_satlinkBas, "MCB_sat_Basetta_1_offx")
                  mdF_Lav_offy = VAR_VAL(mdf_idx_satlinkBas, "MCB_sat_Basetta_1_offy")
                  mdF_Lav_offz = VAR_VAL(mdf_idx_satlinkBas, "MCB_sat_Basetta_1_offz")
                  mdF_Lav_angz = VAR_VAL(mdf_idx_satlinkBas, "MCB_sat_Basetta_1_angz")

                  mdf_Apertura = VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura")
                  if (VAR_EXIST(mdf_idx_satlinkBas, STRCAT("mdf_sat_offx_Basetta_Link_1_", mdf_Apertura)) )
                     {
                      mdF_Lav_offx = VAR_VAL(mdf_idx_satlinkBas, STRCAT("mdf_sat_offx_Basetta_Link_1_", mdf_Apertura))
                      mdF_Lav_offy = VAR_VAL(mdf_idx_satlinkBas, STRCAT("mdf_sat_offy_Basetta_Link_1_", mdf_Apertura))
                      mdF_Lav_offz = VAR_VAL(mdf_idx_satlinkBas, STRCAT("mdf_sat_offz_Basetta_Link_1_", mdf_Apertura))
                      mdF_Lav_angz = VAR_VAL(mdf_idx_satlinkBas, STRCAT("mdf_sat_angz_Basetta_Link_1_", mdf_Apertura))
                     }

                  // 13.05.2020
                  //COMPONENTI3("mdf_elementoBdm", PADRE(idx_att, 1), mcb_ElementoBdm_Basetta_1)
                  mcb_ElementoBdm = mcb_ElementoBdm_Basetta_1
                  COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm_Basetta_1)
                  if ( VAR_VAL(PADRE(idx_MdF, 1), "MdF_sat_Basetta_Attrezzata") == 0
                     // Se ANP non trova il Fianco, da vedere se cercare il montante
                     | idx_To_ReAdd == idx_att
                     )
                     {
                      if (mdf_elementoBdm > 0)
                         {
                          if ( STRCMP(VAR_VAL_STR(mdf_elementoBdm[1], "mdf_Apertura"), VAR_VAL_STR(idx_MdF, "MdF_Apertura")) != 0
                             // 11.01.2021
                             //| STRCMP(mdf_import, VAR_VAL_STR(mdf_elementoBdm[1], "import")) != 0
                             | STRCMP(mdf_import, mdf_import_eleBasBat) != 0
                             )
                             {
                              GOSUB mdf_ShowAbilitaOff_ADD_sat
                              mdf_eliminato_e_reADD = 1
                              COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[1]), " // MCB_ElementoBdm_Basetta_1 mdf_ADD_sat"))
                              mdf_elementoBdm = 0
                             }
                         }
                      if (mdf_elementoBdm <= 0)
                         {
                          if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y }
                          mdf_add_sat_now = 1
                          COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_To_ReAdd), " ", mcb_ElementoBdm_Basetta_1, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                         }
                     }
                  else
                     {
                      if (idx_To_ReAdd == PADRE(idx_MdF, 1) )  { EXITSUB() }
                      mdf_sat_prosegui_Attr = 0
                      mEi = 1
                      while(mEi <= mdf_elementoBdm)
                         {
                          // 14.05.2024 Ottimizzazioni
                          //if ( STRCMP(VAR_VAL_STR(mdf_elementoBdm[mEi], "KeyFamRegFacc_CerBat"), VAR_VAL_STR(idx_MdF, "KeyFamRegFacc_CerBat")) != 0
                          //   & VAR_VAL(mdf_elementoBdm[mEi], "idx_MdFgraf") == idx_att
                          //   )
                          mdf_ctrl_change_sat = 0
                          if (VAR_EXIST(PADRE(idx_att, 2), "MdF_Ctrl_var_gest_MdF") != 1)
                             {
                              if ( mdf_eliminato_e_reADD > 0
                                 & VAR_VAL(mdf_elementoBdm[mEi], "idx_MdFgraf") == idx_att
                                 //& IS_MATCH(VAR_VAL_STR(mdf_elementoBdm[mEi], "import"), "*Link*") == 1
                                 // 21.11.2024
                                 & STRCMP(mdf_import, mdf_import_eleBasBat) != 0
                                 )
                                 { mdf_ctrl_change_sat = 1 }
                             }
                          else
                             {
                              // 03.03.2025 Simil mdf_Ctrl_Change_import
                              //if ( VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") > 0
                              //   & VAR_VAL(mdf_elementoBdm[mEi], "idx_MdFgraf") == idx_att
                              //   // 23.07.2024 A3
                              //   & VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") != 200
                              //   & VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") != 1000
                              //   // 21.11.2024
                              //   & STRCMP(mdf_import, mdf_import_eleBasBat) != 0
                              //   )
                              //   { mdf_ctrl_change_sat = 2 }
                              import_ele_sat_att = mdf_import_eleBasBat
                              if (VAR_VAL(mdf_elementoBdm[mEi], "idx_MdFgraf") == idx_att)
                                 {
                                  if (STRCMP(mdf_import, import_ele_sat_att) != 0)
                                     {
                                      // UPPER per \sat o \Sat
                                      if ( STRCMP(UPPER(mdf_import), UPPER(import_ele_sat_att)) != 0
                                         & STRCMP(UPPER(import_ele_sat_att), UPPER(STRCAT(mdf_import, "_2"))) != 0
                                         & STRCMP(UPPER(import_ele_sat_att), UPPER(STRCAT(mdf_import, "_3"))) != 0
                                         )
                                         {
                                          if (VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") > 0)
                                             { mdf_ctrl_change_sat = 2 }
                                         }
                                     }
                                 }
                             }
                          if (mdf_ctrl_change_sat > 0)
                             {
                              mdf_sat_prosegui_Attr = 1
                              GOSUB mdf_ShowAbilitaOff_ADD_sat
                              mdf_eliminato_e_reADD = 1
                              COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[mEi]), " // MCB_ElementoBdm_Basetta_1 Attrezza ", NOME(mdf_elementoBdm[mEi]) ," da=", STR(idx_att), " pdr3=", STR(PADRE(idx_att, 3))))
                             }
                          mEi = mEi+1
                         }
                      sat_id_Bas_found = 0
                      if (mdf_sat_prosegui_Attr == 0)
                         {
                          iEm = 1
                          while (iEm <= mdf_elementoBdm)
                             {
                              if (VAR_VAL(mdf_elementoBdm[iEm], "idx_MdFgraf") == idx_att)
                                 { sat_id_Bas_found = 1 }

                              iEm = iEm+1
                             }
                         }
                      if (sat_id_Bas_found == 0)  { mdf_sat_prosegui_Attr = 1 }

                      COMPONENTI3("mdf_elementoBdmOpp", mdf_idx_Battuta_DX, mcb_ElementoBdm)
                      if (IS_MATCH(mdf_Apertura, "DX*") )
                         { COMPONENTI3("mdf_elementoBdmOpp", mdf_idx_Battuta_SX, mcb_ElementoBdm) }

                      mEi = 1
                      while(mEi <= mdf_elementoBdmOpp)
                         {
                          // 28.10.2020
                          if (VAR_VAL(mdf_elementoBdmOpp[mEi], "idx_MdFgraf") == idx_att)
                             {
                              GOSUB mdf_ShowAbilitaOff_ADD_sat
                              mdf_eliminato_e_reADD = 1
                              COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdmOpp[mEi]), " // MCB_ElementoBdm_Basetta_1 FiaOpposto cambioAperturaSXDX"))
                             }
                          mEi = mEi+1
                         }

                     // 13.03.2024 Come MdF_Sat_BasBat
                      if (VAR_EXIST(idx_att, "idx_To_ReAdd_prec") != 1)  { idx_To_ReAdd_prec = idx_To_ReAdd }

                      if (idx_To_ReAdd_prec != idx_To_ReAdd)
                         {
                          COMPONENTI3("mdf_elementoBdmPrec", idx_To_ReAdd_prec, mcb_ElementoBdm)
                          mEi = 1
                          while(mEi <= mdf_elementoBdmPrec)
                             {
                              if (VAR_VAL(mdf_elementoBdmPrec[mEi], "idx_MdFgraf") == idx_att)
                                 {
                                  GOSUB mdf_ShowAbilitaOff_ADD_sat
                                  mdf_eliminato_e_reADD = 1
                                  COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdmPrec[mEi]), " // MCB_ElementoBdm_Basetta_1 idx_To_ReAdd_prec da=", STR(idx_att)))
                                 }
                              mEi = mEi+1
                             }
                          //idx_To_ReAdd_prec = idx_To_ReAdd
                         }

                      // 23.10.2020 2080 copied AGGANCIATA a 3342B ANP
                      if (VAR_EXIST(PADRE(idx_att, -1), "copied__") == 1)
                         {
                          if (ACTION() == 1)
                             {
                              if (CMD() == 0)  { mdf_sat_prosegui_Attr = -99 }
                             }
                         }

                      if (mdf_sat_prosegui_Attr > 0)
                         {
                          mdf_add_sat_now = 1
                          mdfsys_collY_sposta_idx_MdFgraf_att = VAR_VAL(PADRE(idx_att, 2), STRCAT("MdfSys_collY_sposta", STR(id_Cer)))
                          COMANDO2("PUSH_SITUAZIONE")
                          COMANDO2(STRCAT("SETTA ", STR(idx_To_ReAdd)))
                          COMANDO2(STRCAT("ELEMENTO_I ", mcb_ElementoBdm))
                          COMANDO2("STRUTTURA_I")
                          COMANDO2(STRCAT("VAR_SET X_MdF_graf=", STR(X), " idx_MdFgraf=", STR(idx_att), " id_Reggraf=", STR(id_Cer), " mdF_Lav_offx=", STR(mdF_Lav_offx), " mdF_Lav_offy=", STR(mdF_Lav_offy), " mdF_Lav_offz=", STR(mdF_Lav_offz)))
                          // 15.01.2025
                          COMANDO2(STRCAT("VAR_SET mdfsys_collY_sposta_idx_MdFgraf=", STR(mdfsys_collY_sposta_idx_MdFgraf_att)))
                          if (STRLEN(VAR_VAL_STR(idx_To_ReAdd, "MdF_sat_VANO")) == 0)  { COMANDO2("VANO 0") }
                          else { COMANDO2(VAR_VAL_STR(idx_To_ReAdd, "MdF_sat_VANO")) }
                          COMANDO2(STRCAT("ATTREZZA2 ", STR(base_0.y)))
                          COMANDO2("POP_SITUAZIONE")
                         }
                     }
                 }
              if ( STRLEN(VAR_VAL_STR(mdf_idx_satlinkBas, "MCB_ElementoBdm_Basetta_2")) > 3
                // 07.10.2021 strano sia uscito solo adesso. Il problema e' che in inserimento da Listino una baseANP in cui non dovevano esserci le cerniere-basette
                // sul frontaleFisso inzialmente le aveva, poi, dopo essersi configurata l' MdF_Apertuta corretta li cancellava, ma faceva anche parecchi ricalcoli bdm e quindi e' uscito il problema
                 & FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1
                 // 31.07.2024
                 & FILE_EXIST(STRCAT(mdf_import, "_2.sat")) != 1
                 )
                 {
                  mcb_ElementoBdm_Basetta_2 = VAR_VAL_STR(mdf_idx_satlinkBas, "MCB_ElementoBdm_Basetta_2")
                  mdF_Lav_offx = VAR_VAL(mdf_idx_satlinkBas, "MCB_sat_Basetta_2_offx")
                  mdF_Lav_offy = VAR_VAL(mdf_idx_satlinkBas, "MCB_sat_Basetta_2_offy")
                  mdF_Lav_offz = VAR_VAL(mdf_idx_satlinkBas, "MCB_sat_Basetta_2_offz")
                  mdF_Lav_angz = VAR_VAL(mdf_idx_satlinkBas, "MCB_sat_Basetta_2_angz")

                  mdf_Apertura = VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura")
                  if (VAR_EXIST(mdf_idx_satlinkBas, STRCAT("mdf_sat_offx_Basetta_Link_2_", mdf_Apertura)) )
                     {
                      mdF_Lav_offx = VAR_VAL(mdf_idx_satlinkBas, STRCAT("mdf_sat_offx_Basetta_Link_2_", mdf_Apertura))
                      mdF_Lav_offy = VAR_VAL(mdf_idx_satlinkBas, STRCAT("mdf_sat_offy_Basetta_Link_2_", mdf_Apertura))
                      mdF_Lav_offz = VAR_VAL(mdf_idx_satlinkBas, STRCAT("mdf_sat_offz_Basetta_Link_2_", mdf_Apertura))
                      mdF_Lav_angz = VAR_VAL(mdf_idx_satlinkBas, STRCAT("mdf_sat_angz_Basetta_Link_2_", mdf_Apertura))
                     }
                  mcb_ElementoBdm = mcb_ElementoBdm_Basetta_2
                  //COMPONENTI3("mdf_elementoBdm", PADRE(idx_att, 1), mcb_ElementoBdm_Basetta_2)
                  COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm_Basetta_2)
                  // 13.05.2020
                  if ( VAR_VAL(PADRE(idx_MdF, 1), "MdF_sat_Basetta_Attrezzata") == 0
                     // Se ANP non trova il Fianco, da vedere se cercare il montante
                     | idx_To_ReAdd == idx_att
                     )
                     {
                      if (mdf_elementoBdm > 0)
                         {
                          if ( STRCMP(VAR_VAL_STR(mdf_elementoBdm[1], "mdf_Apertura"), VAR_VAL_STR(idx_MdF, "MdF_Apertura")) != 0
                            // 11.01.2021
                             | STRCMP(mdf_import, mdf_import_eleBasBat) != 0
                             )
                             {
                              GOSUB mdf_ShowAbilitaOff_ADD_sat
                              mdf_eliminato_e_reADD = 1
                              COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[1]), " // MCB_ElementoBdm_Basetta_2 mdf_ADD_sat"))
                              mdf_elementoBdm = 0
                             }
                         }
                      if (mdf_elementoBdm <= 0)
                         {
                          if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y }
                          mdf_add_sat_now = 1
                          COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_To_ReAdd), " ", mcb_ElementoBdm_Basetta_2, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                         }
                     }
                  else
                     {
                      if (idx_To_ReAdd == PADRE(idx_MdF, 1) )  { EXITSUB() }
                      mdf_sat_prosegui_Attr = 0
                      mEi = 1
                      while(mEi <= mdf_elementoBdm)
                         {
                          mdf_ctrl_change_sat = 0
                          if (VAR_EXIST(PADRE(idx_att, 2), "MdF_Ctrl_var_gest_MdF") != 1)
                             {
                              if ( mdf_eliminato_e_reADD > 0
                                 & VAR_VAL(mdf_elementoBdm[mEi], "idx_MdFgraf") == idx_att
                                 //& IS_MATCH(VAR_VAL_STR(mdf_elementoBdm[mEi], "import"), "*Link*") == 1
                                 & STRCMP(mdf_import, mdf_import_eleBasBat) != 0
                                 )
                                 { mdf_ctrl_change_sat = 1 }
                             }
                          else
                             {
                              if ( VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") > 0
                                 & VAR_VAL(mdf_elementoBdm[mEi], "idx_MdFgraf") == idx_att
                                 // 23.07.2024 A3
                                 & VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") != 200
                                 & VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") != 1000
                                 // 21.11.2024
                                 & STRCMP(mdf_import, mdf_import_eleBasBat) != 0
                                 )
                                 { mdf_ctrl_change_sat = 2 }
                             }

                          if (mdf_ctrl_change_sat > 0)
                             {
                              mdf_sat_prosegui_Attr = 1
                              GOSUB mdf_ShowAbilitaOff_ADD_sat
                              mdf_eliminato_e_reADD = 1
                              COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[mEi]), " // MCB_ElementoBdm_Basetta_2 Attrezza ", NOME(mdf_elementoBdm[mEi]) ," da=", STR(idx_att), " pdr3=", STR(PADRE(idx_att, 3))))
                             }
                          mEi = mEi+1
                         }
                      sat_id_Bas_found = 0
                      if (mdf_sat_prosegui_Attr == 0)
                         {
                          iEm = 1
                          while (iEm <= mdf_elementoBdm)
                             {
                              if (VAR_VAL(mdf_elementoBdm[iEm], "idx_MdFgraf") == idx_att)
                                 { sat_id_Bas_found = 1 }

                              iEm = iEm+1
                             }
                         }
                      if (sat_id_Bas_found == 0)  { mdf_sat_prosegui_Attr = 1 }

                      COMPONENTI3("mdf_elementoBdmOpp", mdf_idx_Battuta_DX, mcb_ElementoBdm)
                      if (IS_MATCH(mdf_Apertura, "DX*") )
                         { COMPONENTI3("mdf_elementoBdmOpp", mdf_idx_Battuta_SX, mcb_ElementoBdm) }

                      mEi = 1
                      while(mEi <= mdf_elementoBdmOpp)
                         {
                          // 28.10.2020
                          if (VAR_VAL(mdf_elementoBdmOpp[mEi], "idx_MdFgraf") == idx_att)
                             {
                              GOSUB mdf_ShowAbilitaOff_ADD_sat
                              mdf_eliminato_e_reADD = 1
                              COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdmOpp[mEi]), " // MCB_ElementoBdm_Basetta_2 FiaOpposto cambioAperturaSXDX"))
                             }
                          mEi = mEi+1
                         }

                     // 13.03.2024
                      if (VAR_EXIST(idx_att, "idx_To_ReAdd_prec") != 1)  { idx_To_ReAdd_prec = idx_To_ReAdd }

                      if (idx_To_ReAdd_prec != idx_To_ReAdd)
                         {
                          COMPONENTI3("mdf_elementoBdmPrec", idx_To_ReAdd_prec, mcb_ElementoBdm)
                          mEi = 1
                          while(mEi <= mdf_elementoBdmPrec)
                             {
                              if (VAR_VAL(mdf_elementoBdmPrec[mEi], "idx_MdFgraf") == idx_att)
                                 {
                                  GOSUB mdf_ShowAbilitaOff_ADD_sat
                                  mdf_eliminato_e_reADD = 1
                                  COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdmPrec[mEi]), " // MCB_ElementoBdm_Basetta_2 idx_To_ReAdd_prec da=", STR(idx_att)))
                                 }
                              mEi = mEi+1
                             }

                          //idx_To_ReAdd_prec = idx_To_ReAdd
                         }

                      // 23.10.2020 2080 copied AGGANCIATA a 3342B ANP
                      if (VAR_EXIST(PADRE(idx_att, -1), "copied__") == 1)
                         {
                          if (ACTION() == 1)
                             {
                              if (CMD() == 0)  { mdf_sat_prosegui_Attr = -99 }
                             }
                         }

                      if (mdf_sat_prosegui_Attr > 0)
                         {
                          mdf_add_sat_now = 1
                          mdfsys_collY_sposta_idx_MdFgraf_att = VAR_VAL(PADRE(idx_att, 2), STRCAT("MdfSys_collY_sposta", STR(id_Cer)))
                          COMANDO2("PUSH_SITUAZIONE")
                          COMANDO2(STRCAT("SETTA ", STR(idx_To_ReAdd)))
                          COMANDO2(STRCAT("ELEMENTO_I ", mcb_ElementoBdm))
                          COMANDO2("STRUTTURA_I")
                          COMANDO2(STRCAT("VAR_SET X_MdF_graf=", STR(X), " idx_MdFgraf=", STR(idx_att), " id_Reggraf=", STR(id_Cer), " mdF_Lav_offx=", STR(mdF_Lav_offx), " mdF_Lav_offy=", STR(mdF_Lav_offy), " mdF_Lav_offz=", STR(mdF_Lav_offz)))
                          // 15.01.2025
                          COMANDO2(STRCAT("VAR_SET mdfsys_collY_sposta_idx_MdFgraf=", STR(mdfsys_collY_sposta_idx_MdFgraf_att)))
                          if (STRLEN(VAR_VAL_STR(idx_To_ReAdd, "MdF_sat_VANO")) == 0)  { COMANDO2("VANO 0") }
                          else { COMANDO2(VAR_VAL_STR(idx_To_ReAdd, "MdF_sat_VANO")) }
                          COMANDO2(STRCAT("ATTREZZA2 ", STR(base_0.y)))
                          COMANDO2("POP_SITUAZIONE")
                         }
                     }
                 }

              // 31.07.2024
              if (FILE_EXIST(STRCAT(mdf_import, "_2.sat")) == 1)
                 {
                  GOSUB MdF_add_sat_Basetta_N
                 }

             // 13.03.2024 Devo farlo alla fine altrimenti rimangono MCB_ElementoBdm_Basetta_1,2
              idx_To_ReAdd_prec = idx_To_ReAdd
             }

         // 15.12.2016
          if (STRCMP(NOME(idx_att), "MdF_CerBasAngLib") == 0)
             {
              if (STRLEN(VAR_VAL_STR(PADRE(idx_MdF, 1), "MCA_ElementoBdm_CerAngLib")) > 3)
                 {
                  mdf_skeyReg = "CerAngLib"
                 // 29.11.2023 Se eistono gli offset del sat significa che c'è anche il nome in tabella
                  if (STRLEN(VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_F1_CerAngLib", STR(id_Fer))) ) < 5)
                     { GOSUB mdf_ctrl_nomeFile_sat_Scocca }
                  mcb_ElementoBdm = VAR_VAL_STR(PADRE(idx_MdF, 1), "MCA_ElementoBdm_CerAngLib")
                  //idx_To_ReAdd = PADRE(idx_att, 1)
                  idx_To_ReAdd = idx_att
                  if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
                     {
                      COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm)
                      if (mdf_elementoBdm > 0)
                         {
                          if ( STRCMP(VAR_VAL_STR(mdf_elementoBdm[1], "mdf_Apertura"), VAR_VAL_STR(idx_MdF, "MdF_Apertura")) != 0
                             // 06.03.2024 In teoria non serve.
                             // Se cambio import nell' MdF_Sat_CerAngLib mi cambierà sempre
                             // Se cambia la regola e offset e non cambio in MdF_Sat_CerAngLib potrebbe essere un problema
                             // però, in teoria, se lo imposto in RegFacc, come dovrebbe essere adesso lo standard, il problema non esiste piu
                             //| STRCMP(mdf_import, VAR_VAL_STR(mdf_elementoBdm[1], "import")) != 0
                             )
                             {
                             // 09.10.2023 Sc Basi Angolo. Per ora proteggo così
                              mdf_ctrl_copied_sat = 0
                              if (VAR_EXIST(PADRE(idx_att, -1), "copied__") == 1)
                                 {
                                  if (ACTION() == 3)  { mdf_ctrl_copied_sat = 1 }
                                 }
                              if (mdf_ctrl_copied_sat == 0)
                                 {
                                  GOSUB mdf_ShowAbilitaOff_ADD_sat
                                  mdf_eliminato_e_reADD = 1
                                  COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[1]), " // MCA_ElementoBdm_CerAngLib"))
                                  mdf_elementoBdm = 0
                                 }
                             }
                         }
                      if (mdf_elementoBdm <= 0)
                         {
                          mdf_add_sat_now = 1
                          //if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y }
                          //COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_att), " ", mcb_ElementoBdm, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                         // 09.10.2023 Sc Basi Angolo. Per ora proteggo così
                          mdf_ctrl_copied_sat = 0
                          if (VAR_EXIST(PADRE(idx_att, -1), "copied__") == 1)
                             {
                              if (ACTION() == 3)  { mdf_ctrl_copied_sat = 1 }
                             }
                          if (mdf_ctrl_copied_sat == 0)
                             {
                              COMANDO2("PUSH_SITUAZIONE")
                              COMANDO2(STRCAT("SETTA ", STR(idx_To_ReAdd)))
                              COMANDO2(STRCAT("ELEMENTO_I ", mcb_ElementoBdm))
                              COMANDO2("STRUTTURA_I")
                              COMANDO2(STRCAT("VAR_SET X_MdF_graf=", STR(X), " idx_Pis=", STR(idx_att), " id_Fer=", STR(id_Fer), " mdF_Lav_offx=", STR(mdF_Lav_offx), " mdF_Lav_offy=", STR(mdF_Lav_offy), " mdF_Lav_offz=", STR(mdF_Lav_offz)))
                              COMANDO2("ATTREZZA2 0.0")
                              COMANDO2("POP_SITUAZIONE")
                             }
                         }
                      if (VAR_VAL(-1, "CAM_Visualize") <= 0)  { escl_Grafica = 1 }
                     }
                 }
             }

          if (STRCMP(NOME(idx_att), "MdF_PistoneSuAnta") == 0)
             {
              if (STRLEN(VAR_VAL_STR(idx_MdF, "MPA_ElementoBdm_PisAnta")) > 3)
                 {
                  mdf_Apertura = VAR_VAL_STR(PADRE(idx_att, 3), "MdF_Apertura")
                  // 28.06.2018
                  // In caso di OnLoadPers puo succedere che alcune dll facciano un RICALCOLA_UNA automatico dopo
                  // un ATTREZZA2 per cui la MdF_Apertura CamMdFrontali si corregge da VA a RI
                  // ma solo dopo aver attrezzato il primo MdF_Sat_PisAnta. Stranamente e
                  // per fortuna MdF_Apertura di padre di 2 quindi dell' MdF_ Contenitore-Regole
                  // ha già la MdF_Apertura corretta.
                  // In teoria sarebbe comunque piu corretto MdF_Apertura del padre di 2
                  // ma visto che è cosi da anni per il momento faccio questa distinzione
                  if (IS_MATCH(VAR_VAL_STR(-1, "MdF_Load_att"), "OnLoadPers*Pis*") )
                     { mdf_Apertura = VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura") }

                  mdf_sat_X_PisAnta_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisAnta_1_", mdf_Apertura) )
                  if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisAnta_1_", KeyFamRegFacc)) == 1)
                     { mdf_sat_X_PisAnta_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisAnta_1_", KeyFamRegFacc)) }
                  if (mdf_sat_X_PisAnta_1 == 0)  { mdf_sat_X_PisAnta_1 = VAR_VAL(PADRE(idx_att, 1), "X") }

                  mdf_sat_offx_PisAnta_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisAnta_1_", mdf_Apertura) )
                  if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisAnta_1_", KeyFamRegFacc)) == 1)
                     { mdf_sat_offx_PisAnta_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisAnta_1_", KeyFamRegFacc)) }

                  mdF_Lav_offx = mdF_sat_offx + mdf_sat_offx_PisAnta_1
                  if ( IS_MATCH(Posizione, "DX")
                     | IS_MATCH(Posizione, "CNSX")
                     )
                     {
                      mdF_Lav_offx = mdF_sat_offx+VAR_VAL(PADRE(idx_att, 1), "X") - mdf_sat_X_PisAnta_1-mdf_sat_offx_PisAnta_1
                     }

                  //mdf_sat_offz_PisAnta_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_PisAnta_1_", mdf_Apertura) )
                  //mdF_Lav_offz = mdF_sat_offz+VAR_VAL(PADRE(idx_att, 1), "Z") - VAR_VAL(PADRE(idx_att, 1), "Z_eleFro") + mdf_sat_offz_PisAnta_1
                  mdf_sat_Z_PisAnta_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisAnta_1_", mdf_Apertura) )
                  if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisAnta_1_", KeyFamRegFacc)) == 1)
                     { mdf_sat_Z_PisAnta_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisAnta_1_", KeyFamRegFacc) ) }
                  if (mdf_sat_Z_PisAnta_1 == 0)  { mdf_sat_Z_PisAnta_1 = VAR_VAL(PADRE(idx_att, 1), "Z_eleFro") }
                  mdF_Lav_offz = mdF_sat_offz+VAR_VAL(PADRE(idx_att, 1), "Z") - mdf_sat_Z_PisAnta_1

                 // 06.12.2023
                  if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_F1_PisAnta", str_var, STR(id_Pis))) )
                     {
                      mdF_Lav_offx = mdF_sat_offx
                      mdF_Lav_offz = mdF_sat_offz
                     }

                  mcb_ElementoBdm = VAR_VAL_STR(idx_MdF, "MPA_ElementoBdm_PisAnta")
                  //idx_To_ReAdd = PADRE(idx_att, 1)
                  idx_To_ReAdd = PADRE(idx_MdF, 1)

                  mdf_sat_prosegui_Attr = 0
                  COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm)
                  if (mdf_elementoBdm > 0)
                     {
                      if (STRCMP(VAR_VAL_STR(mdf_elementoBdm[1], "KeyFamRegFacc_PisAnta"), VAR_VAL_STR(idx_MdF, "KeyFamRegFacc_PisAnta")) != 0)
                         {
                          mdf_sat_prosegui_Attr = 1
                          GOSUB mdf_ShowAbilitaOff_ADD_sat
                          mdf_eliminato_e_reADD = 1
                          COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[1]), " // MPA_ElementoBdm_PisAnta"))
                         }
                     }
                  sat_id_Pis_found = 0
                  if (mdf_sat_prosegui_Attr == 0)
                     {
                      iEm = 1
                      while (iEm <= mdf_elementoBdm)
                         {
                          if ( VAR_VAL(mdf_elementoBdm[iEm], "id_Pis") == id_Pis
                             // 17.01.2018
                             // se ci sono anche i centrali id_Pis potrebbero essere sempre 1 e 2
                             & VAR_VAL(mdf_elementoBdm[iEm], "idx_Pis") == idx_att
                             )
                             { sat_id_Pis_found = 1 }

                          iEm = iEm+1
                         }
                     }
                  if (sat_id_Pis_found == 0)  { mdf_sat_prosegui_Attr = 1 }

                  //if (mdf_elementoBdm <= 0)
                  if (mdf_sat_prosegui_Attr > 0)
                     {
                      if ( FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1
                        // 22.11.2023
                         | VAR_VAL(PADRE(idx_MdF, 1), "MdF_sat_Abilita_PisAnta_1") >= 1
                         )
                         {
                          mdf_sat_offy_PisAnta_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisAnta_1_", mdf_Apertura) )
                          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisAnta_1_", KeyFamRegFacc)) == 1)
                             { mdf_sat_offy_PisAnta_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisAnta_1_", KeyFamRegFacc) ) }

                          mdf_add_sat_now = 1
                          if (IS_MATCH($MDFSys_NewRTA, "1") == 1)
                             {
                              mdF_Lav_offy = mdF_sat_offy-Y_sat_ToRif+mdf_sat_offy_PisAnta_1
                             // 06.12.2023
                              if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_F1_PisAnta", str_var, STR(id_Pis))) )
                                 { mdF_Lav_offy = mdF_sat_offy-Y_sat_ToRif }
                             }
                          //COMANDO2(STRCAT("RELATIVE_ADD ", STR(PADRE(idx_att, 1)), " ", mcb_ElementoBdm, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                          COMANDO2("PUSH_SITUAZIONE")
                          COMANDO2(STRCAT("SETTA ", STR(idx_To_ReAdd)))
                          COMANDO2(STRCAT("ELEMENTO_I ", mcb_ElementoBdm))
                          COMANDO2("STRUTTURA_I")
                          COMANDO2(STRCAT("VAR_SET X_MdF_graf=", STR(X), " idx_Pis=", STR(idx_att), " id_Pis=", STR(id_Pis), " mdF_Lav_offx=", STR(mdF_Lav_offx), " mdF_Lav_offy=", STR(mdF_Lav_offy), " mdF_Lav_offz=", STR(mdF_Lav_offz)))
                          COMANDO2("ATTREZZA2 0.0")
                          COMANDO2("POP_SITUAZIONE")
                         }
                     }

                  mdf_sat_X_PisAnta_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisAnta_2_", mdf_Apertura) )
                  if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisAnta_2_", KeyFamRegFacc)) == 1)
                     { mdf_sat_X_PisAnta_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisAnta_2_", KeyFamRegFacc)) }
                  if (mdf_sat_X_PisAnta_2 == 0)  { mdf_sat_X_PisAnta_2 = VAR_VAL(PADRE(idx_att, 1), "X") }

                  mdf_sat_offx_PisAnta_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisAnta_2_", mdf_Apertura) )
                  if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisAnta_2_", KeyFamRegFacc)) == 1)
                     { mdf_sat_offx_PisAnta_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisAnta_2_", KeyFamRegFacc)) }

                  mdF_Lav_offx = mdF_sat_offx + mdf_sat_offx_PisAnta_2
                  if ( IS_MATCH(Posizione, "DX")
                     | IS_MATCH(Posizione, "CNSX")
                     )
                     {
                      mdF_Lav_offx = mdF_sat_offx+VAR_VAL(PADRE(idx_att, 1), "X") - mdf_sat_X_PisAnta_2-mdf_sat_offx_PisAnta_2
                     }
                  mdf_sat_Z_PisAnta_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisAnta_2_", mdf_Apertura) )
                  if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisAnta_2_", KeyFamRegFacc)) == 1)
                     { mdf_sat_Z_PisAnta_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisAnta_2_", KeyFamRegFacc) ) }
                  if (mdf_sat_Z_PisAnta_2 == 0)  { mdf_sat_Z_PisAnta_2 = VAR_VAL(PADRE(idx_att, 1), "Z_eleFro") }
                  mdF_Lav_offz = mdF_sat_offz+VAR_VAL(PADRE(idx_att, 1), "Z") - mdf_sat_Z_PisAnta_2

                  mcb_ElementoBdm_2 = STRCAT(VAR_VAL_STR(idx_MdF, "MPA_ElementoBdm_PisAnta"), "_2")
                  COMPONENTI3("mdf_elementoBdm", PADRE(idx_att, 1), mcb_ElementoBdm_2)
                 // 18.01.2024
                  mdf_sat_prosegui_Attr_2 = 0
                  if (mdf_elementoBdm <= 0)  { mdf_sat_prosegui_Attr_2 = 1 }
                  mEi = 1
                  while(mEi <= mdf_elementoBdm)
                     {
                      if ( STRCMP(VAR_VAL_STR(mdf_elementoBdm[mEi], "KeyFamRegFacc_PisAnta"), VAR_VAL_STR(idx_MdF, "KeyFamRegFacc_PisAnta")) != 0
                         & VAR_VAL(mdf_elementoBdm[mEi], "id_Pis") == id_Pis
                         & VAR_VAL(mdf_elementoBdm[mEi], "idx_Pis") == idx_att
                         )
                         {
                          mdf_sat_prosegui_Attr_2 = 2
                          GOSUB mdf_ShowAbilitaOff_ADD_sat
                          mdf_eliminato_e_reADD = 1
                          COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[mEi]), " // MPF_ElementoBdm_PisAnta_2"))
                         }
                      mEi = mEi+1
                     }
                  if (mdf_sat_prosegui_Attr_2 > 0)
                     {
                     // 30.11.2023
                      if (VAR_EXIST(idx_att, "mdF_sat_offx_2") )  { mdF_Lav_offx = VAR_VAL(idx_att, "mdF_sat_offx_2") }
                      if (VAR_EXIST(idx_att, "mdF_sat_offy_2") )  { mdF_Lav_offy = VAR_VAL(idx_att, "mdF_sat_offy_2") }
                      if (VAR_EXIST(idx_att, "mdF_sat_offz_2") )  { mdF_Lav_offz = VAR_VAL(idx_att, "mdF_sat_offz_2") }
                      if (VAR_EXIST(idx_att, "mdF_sat_angz_2") )  { mdF_Lav_angz = VAR_VAL(idx_att, "mdF_sat_angz_2") }

                      if ( FILE_EXIST(STRCAT(mdf_import, "_2.sat")) == 1
                        // 22.11.2023
                         | VAR_VAL(PADRE(idx_MdF, 1), "MdF_sat_Abilita_PisAnta_2") >= 1
                         )
                         {
                          mdf_add_sat_now = 1
                          mdf_sat_offy_PisAnta_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisAnta_2_", mdf_Apertura) )
                          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisAnta_2_", KeyFamRegFacc)) == 1)
                             { mdf_sat_offy_PisAnta_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisAnta_2_", KeyFamRegFacc) ) }

                          if (IS_MATCH($MDFSys_NewRTA, "1") == 1)
                             {
                              mdF_Lav_offy = mdF_sat_offy-Y_sat_ToRif+mdf_sat_offy_PisAnta_2

                             // 06.12.2023
                              if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_F1_PisAnta", str_var, STR(id_Pis))) )  { mdF_Lav_offy = mdF_sat_offy-Y_sat_ToRif }
                              if (VAR_EXIST(idx_att, "mdF_sat_offy_2") )                                       { mdF_Lav_offy = mdF_sat_offy_2-Y_sat_ToRif }
                             }
                          //COMANDO2(STRCAT("RELATIVE_ADD ", STR(PADRE(idx_att, 1)), " ", mcb_ElementoBdm_2, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                          COMANDO2("PUSH_SITUAZIONE")
                          COMANDO2(STRCAT("SETTA ", STR(PADRE(idx_att, 1))))
                          COMANDO2(STRCAT("ELEMENTO_I ", mcb_ElementoBdm_2))
                          COMANDO2("STRUTTURA_I")
                          // 18.10.2018
                          //COMANDO2(STRCAT("VAR_SET X_MdF_graf=", STR(X), " mdF_Lav_offx=", STR(mdF_Lav_offx), " mdF_Lav_offy=", STR(mdF_Lav_offy), " mdF_Lav_offz=", STR(mdF_Lav_offz)))
                          COMANDO2(STRCAT("VAR_SET X_MdF_graf=", STR(X), " idx_Pis=", STR(idx_att), " id_Pis=", STR(id_Pis), " mdF_Lav_offx=", STR(mdF_Lav_offx), " mdF_Lav_offy=", STR(mdF_Lav_offy), " mdF_Lav_offz=", STR(mdF_Lav_offz)))
                          COMANDO2("ATTREZZA2 0.0")
                          COMANDO2("POP_SITUAZIONE")
                         }
                     }

                  mdf_sat_X_PisAnta_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisAnta_3_", mdf_Apertura) )
                  if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisAnta_3_", KeyFamRegFacc)) == 1)
                     { mdf_sat_X_PisAnta_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisAnta_3_", KeyFamRegFacc)) }
                  if (mdf_sat_X_PisAnta_3 == 0)  { mdf_sat_X_PisAnta_3 = VAR_VAL(PADRE(idx_att, 1), "X") }

                  mdf_sat_offx_PisAnta_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisAnta_3_", mdf_Apertura) )
                  if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisAnta_3_", KeyFamRegFacc)) == 1)
                     { mdf_sat_offx_PisAnta_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisAnta_3_", KeyFamRegFacc)) }

                  mdF_Lav_offx = mdF_sat_offx + mdf_sat_offx_PisAnta_3
                  if ( IS_MATCH(Posizione, "DX")
                     | IS_MATCH(Posizione, "CNSX")
                     )
                     {
                      mdF_Lav_offx = mdF_sat_offx+VAR_VAL(PADRE(idx_att, 1), "X") - mdf_sat_X_PisAnta_3-mdf_sat_offx_PisAnta_3
                     }
                  mdf_sat_Z_PisAnta_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisAnta_3_", mdf_Apertura) )
                  if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisAnta_3_", KeyFamRegFacc)) == 1)
                     { mdf_sat_Z_PisAnta_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisAnta_3_", KeyFamRegFacc) ) }
                  if (mdf_sat_Z_PisAnta_3 == 0)  { mdf_sat_Z_PisAnta_3 = VAR_VAL(PADRE(idx_att, 1), "Z_eleFro") }
                  mdF_Lav_offz = mdF_sat_offz+VAR_VAL(PADRE(idx_att, 1), "Z") - mdf_sat_Z_PisAnta_3

                  mcb_ElementoBdm_3 = STRCAT(VAR_VAL_STR(idx_MdF, "MPA_ElementoBdm_PisAnta"), "_3")
                  COMPONENTI3("mdf_elementoBdm", PADRE(idx_att, 1), mcb_ElementoBdm_3)
                 // 18.01.2024
                  mdf_sat_prosegui_Attr_3 = 0
                  if (mdf_elementoBdm <= 0)  { mdf_sat_prosegui_Attr_3 = 1 }
                  mEi = 1
                  while(mEi <= mdf_elementoBdm)
                     {
                      if ( STRCMP(VAR_VAL_STR(mdf_elementoBdm[mEi], "KeyFamRegFacc_PisAnta"), VAR_VAL_STR(idx_MdF, "KeyFamRegFacc_PisAnta")) != 0
                         & VAR_VAL(mdf_elementoBdm[mEi], "id_Pis") == id_Pis
                         & VAR_VAL(mdf_elementoBdm[mEi], "idx_Pis") == idx_att
                         )
                         {
                          mdf_sat_prosegui_Attr_3 = 2
                          GOSUB mdf_ShowAbilitaOff_ADD_sat
                          mdf_eliminato_e_reADD = 1
                          COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[mEi]), " // MPF_ElementoBdm_PisAnta_3"))
                         }
                      mEi = mEi+1
                     }
                  if (mdf_sat_prosegui_Attr_3 > 0)
                     {
                     // 30.11.2023
                      if (VAR_EXIST(idx_att, "mdF_sat_offx_3") )  { mdF_Lav_offx = VAR_VAL(idx_att, "mdF_sat_offx_3") }
                      if (VAR_EXIST(idx_att, "mdF_sat_offy_3") )  { mdF_Lav_offy = VAR_VAL(idx_att, "mdF_sat_offy_3") }
                      if (VAR_EXIST(idx_att, "mdF_sat_offz_3") )  { mdF_Lav_offz = VAR_VAL(idx_att, "mdF_sat_offz_3") }
                      if (VAR_EXIST(idx_att, "mdF_sat_angz_3") )  { mdF_Lav_angz = VAR_VAL(idx_att, "mdF_sat_angz_3") }

                      if ( FILE_EXIST(STRCAT(mdf_import, "_3.sat")) == 1
                        // 22.11.2023
                         | VAR_VAL(PADRE(idx_MdF, 1), "MdF_sat_Abilita_PisAnta_3") >= 1
                         )
                         {
                          mdf_sat_offy_PisAnta_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisAnta_3_", mdf_Apertura) )
                          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisAnta_3_", KeyFamRegFacc)) == 1)
                             { mdf_sat_offy_PisAnta_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisAnta_3_", KeyFamRegFacc) ) }

                          mdf_add_sat_now = 1
                          if (IS_MATCH($MDFSys_NewRTA, "1") == 1)
                             {
                              mdF_Lav_offy = mdF_sat_offy-Y_sat_ToRif+mdf_sat_offy_PisAnta_3
                             // 06.12.2023
                              if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_F1_PisAnta", str_var, STR(id_Pis))) )  { mdF_Lav_offy = mdF_sat_offy-Y_sat_ToRif }
                              if (VAR_EXIST(idx_att, "mdF_sat_offy_3") )                                       { mdF_Lav_offy = mdF_sat_offy_3-Y_sat_ToRif }
                             }
                          //COMANDO2(STRCAT("RELATIVE_ADD ", STR(PADRE(idx_att, 1)), " ", mcb_ElementoBdm_3, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                          COMANDO2("PUSH_SITUAZIONE")
                          COMANDO2(STRCAT("SETTA ", STR(PADRE(idx_att, 1))))
                          COMANDO2(STRCAT("ELEMENTO_I ", mcb_ElementoBdm_3))
                          COMANDO2("STRUTTURA_I")
                          // 18.10.2018
                          //COMANDO2(STRCAT("VAR_SET X_MdF_graf=", STR(X), " mdF_Lav_offx=", STR(mdF_Lav_offx), " mdF_Lav_offy=", STR(mdF_Lav_offy), " mdF_Lav_offz=", STR(mdF_Lav_offz)))
                          COMANDO2(STRCAT("VAR_SET X_MdF_graf=", STR(X), " idx_Pis=", STR(idx_att), " id_Pis=", STR(id_Pis), " mdF_Lav_offx=", STR(mdF_Lav_offx), " mdF_Lav_offy=", STR(mdF_Lav_offy), " mdF_Lav_offz=", STR(mdF_Lav_offz)))
                          COMANDO2("ATTREZZA2 0.0")
                          COMANDO2("POP_SITUAZIONE")
                         }
                     }
                 }
             }
          if (STRCMP(NOME(idx_att), "MdF_PistoneSuFianco") == 0)
             {
              if (STRLEN(VAR_VAL_STR(idx_MdF, "MPF_ElementoBdm_PisFia")) > 3)
                 {
                  mdf_Apertura = VAR_VAL_STR(PADRE(idx_att, 3), "MdF_Apertura")
                  mcb_ElementoBdm = VAR_VAL_STR(idx_MdF, "MPF_ElementoBdm_PisFia")
                  idx_To_ReAdd = PADRE(idx_MdF, 1)
                  if ( IS_MATCH(Posizione, "DX")
                     | IS_MATCH(Posizione, "CNSX")
                     )
                     {
                      if ( VAR_EXIST(idx_MdF, "exitBattuta_DX") == 1
                         & IS_IDX(VAR_VAL(idx_MdF, "exitBattuta_DX"))
                         )
                         { idx_To_ReAdd = VAR_VAL(idx_MdF, "exitBattuta_DX") }

                      if ( VAR_EXIST(PADRE(idx_MdF, 1), "exitBattuta_DX") == 1
                         & IS_IDX(VAR_VAL(PADRE(idx_MdF, 1), "exitBattuta_DX"))
                         )
                         { idx_To_ReAdd = VAR_VAL(PADRE(idx_MdF, 1), "exitBattuta_DX") }
                      else
                         {
                          // 30.11.2023 Anta Trapezio che prende 2 Scocche. Se aumento MdF_distNearBatFia lo trova, ma se ho 2 Fianchi vicini di scocche diverse
                          // mi prenderebbe quello sbagliato. Sarebbe da correggere, ma per ora dato che il problema è solo sui sat faccio così
                          if ( VAR_EXIST(PADRE(idx_MdF, 1), "MdfSys_idx_Fia_DX_CnDX") == 1
                             & idx_To_ReAdd == PADRE(idx_MdF, 1)
                             )
                             {
                              if (IS_IDX(VAR_VAL(PADRE(idx_MdF, 1), "MdfSys_idx_Fia_DX_CnDX")) )
                                 { idx_To_ReAdd = VAR_VAL(PADRE(idx_MdF, 1), "MdfSys_idx_Fia_DX_CnDX") }
                             }
                         }
                     }
                  else
                     {
                      if ( VAR_EXIST(idx_MdF, "exitBattuta_SX") == 1
                         & IS_IDX(VAR_VAL(idx_MdF, "exitBattuta_SX"))
                         )
                         { idx_To_ReAdd = VAR_VAL(idx_MdF, "exitBattuta_SX") }

                      if ( VAR_EXIST(PADRE(idx_MdF, 1), "exitBattuta_SX") == 1
                         & IS_IDX(VAR_VAL(PADRE(idx_MdF, 1), "exitBattuta_SX"))
                         )
                         { idx_To_ReAdd = VAR_VAL(PADRE(idx_MdF, 1), "exitBattuta_SX") }
                      else
                         {
                          // 30.11.2023 Anta Trapezio che prende 2 Scocche. Se aumento MdF_distNearBatFia lo trova, ma se ho 2 Fianchi vicini di scocche diverse
                          // mi prenderebbe quello sbagliato. Sarebbe da correggere, ma per ora dato che il problema è solo sui sat faccio così
                          if ( VAR_EXIST(PADRE(idx_MdF, 1), "MdfSys_idx_Fia_SX_CnSX") == 1
                             & idx_To_ReAdd == PADRE(idx_MdF, 1)
                             )
                             {
                              if (IS_IDX(VAR_VAL(PADRE(idx_MdF, 1), "MdfSys_idx_Fia_SX_CnSX")) )
                                 { idx_To_ReAdd = VAR_VAL(PADRE(idx_MdF, 1), "MdfSys_idx_Fia_SX_CnSX") }
                             }
                         }
                     }
                 // 17.01.2018
                  if ( IS_MATCH(Posizione, "CN*")
                     // in caso potrei mettere in or se idx_To_ReAdd == PADRE(idx_MdF, 1) cosi almeno faccio un ultimo tentativo
                     )
                     {
                      BOX_MODE(0)
                     // 31.08.2021
                      nomePisFiaToSearch = NOME(idx_To_ReAdd)
                      cversofsx = STR_INDEX_OF(UPPER(nomePisFiaToSearch), 0, "SX")
                      cversofdx = STR_INDEX_OF(UPPER(nomePisFiaToSearch), 0, "DX")
                     // 06.09.2021
                      if (cversofsx > -1)
                         { nomePisFiaToSearch = STRCAT(STRMID(0,cversofsx,nomePisFiaToSearch), "*") }

                      if (cversofdx > -1)
                         { nomePisFiaToSearch = STRCAT(STRMID(0,cversofdx,nomePisFiaToSearch), "*") }
                     // 07.02.2022 M070825
                     // 18.06.2024 A2024OCL062601 Solo commento: occhio ad aumetare perchè se trova l' altro fianco non fa piu il controllo mdf_crtl_idxFiaToReadd
                      NEAR_GLOBALE("mdf_fia_vic_pis", idx_att, 14, 1, nomePisFiaToSearch)

                     // 15.11.2021
                      if (mdf_fia_vic_pis == 0)
                         {
                          mdf_arch2_fia_vic = VAR_VAL_STR(PADRE(idx_att, 3), "mdF_archetipo_Fia_2")
                          if (STRLEN(mdf_arch2_fia_vic) > 2)
                             {
                             // 08.02.2022 La00015
                              NEAR_GLOBALE("mdf_fia_vic_pis", idx_att, 80, 1, mdf_arch2_fia_vic)
                             }
                         }

                      if (mdf_fia_vic_pis > 0)
                         { idx_To_ReAdd = mdf_fia_vic_pis[1] }

                      // 18.06.2024 A2024OCL062601 L' Anta si grafica prima del resto dei pensili quindi inizialmente i Pis Cn non trovano il fianco corretto se non rientra in mdf_ADD_sat
                       // In realta non serve perchè il problema era far rientrare in mdf_ADD_sat MdF_PistoneSuFianco
                     }

                  if (idx_To_ReAdd == PADRE(idx_MdF, 1) )  { EXITSUB() }

                  mdf_sat_prosegui_Attr = 0
                  COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, STRCAT(mcb_ElementoBdm, "*"))
                  mEi = 1
                  while(mEi <= mdf_elementoBdm)
                     {
                      if ( STRCMP(VAR_VAL_STR(mdf_elementoBdm[mEi], "KeyFamRegFacc_PisFia"), VAR_VAL_STR(idx_MdF, "KeyFamRegFacc_PisFia")) != 0
                        // 08.05.2017
                         & VAR_VAL(mdf_elementoBdm[mEi], "id_Pis") == id_Pis
                         & VAR_VAL(mdf_elementoBdm[mEi], "idx_Pis") == idx_att
                         )
                         {
                          mdf_sat_prosegui_Attr = 1
                          GOSUB mdf_ShowAbilitaOff_ADD_sat
                          mdf_eliminato_e_reADD = 1
                          COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[mEi]), " // MPF_ElementoBdm_PisFia"))
                         }
                      mEi = mEi+1
                     }
                  sat_id_Pis_found = 0
                  if (mdf_sat_prosegui_Attr == 0)
                     {
                      iEm = 1
                      while (iEm <= mdf_elementoBdm)
                         {
                          if ( VAR_VAL(mdf_elementoBdm[iEm], "id_Pis") == id_Pis
                            // 08.05.2017
                             & VAR_VAL(mdf_elementoBdm[iEm], "idx_Pis") == idx_att
                             )
                             { sat_id_Pis_found = 1 }

                          iEm = iEm+1
                         }
                     }
                  if (sat_id_Pis_found == 0)  { mdf_sat_prosegui_Attr = 1 }

                  if (mdf_sat_prosegui_Attr > 0)
                     {
                     // Siccome non attrezzo o aggiungo sull' MdF_PistoneSuFianco ma direttamente sul Fianco/Div
                      // il fatto che potrei aver abbassato l' MdF_PistoneSuFianco non incide sulla posizione y del sat
                      mdfcamPis_diff_att = VAR_VAL(idx_att, "mdfcamPis_diff")
                      if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1
                        // 22.11.2023
                         | VAR_VAL(PADRE(idx_MdF, 1), "MdF_sat_Abilita_PisFia_1") >= 1
                         )
                         {
                          mdf_sat_X_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisFia_1_", mdf_Apertura) )
                          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisFia_1_", KeyFamRegFacc)) == 1)
                             { mdf_sat_X_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisFia_1_", KeyFamRegFacc)) }
                          if (mdf_sat_X_ele_1 == 0)  { mdf_sat_X_ele_1 = VAR_VAL(PADRE(idx_att, 1), "X") }

                          mdf_sat_offx_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisFia_1_", mdf_Apertura) )
                          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisFia_1_", KeyFamRegFacc)) == 1)
                             { mdf_sat_offx_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisFia_1_", KeyFamRegFacc)) }

                          mdF_Lav_offx = mdf_sat_offx_ele_1
                          mdF_Lav_offx = mdF_Lav_offx + mdF_sat_offx
                          if ( IS_MATCH(Posizione, "DX")
                             | IS_MATCH(Posizione, "CNSX")
                             )
                             {
                              mdF_Lav_offx = VAR_VAL(PADRE(idx_att, 1), "X") - mdf_sat_X_ele_1 - mdf_sat_offx_ele_1
                              mdF_Lav_offx = mdF_Lav_offx + mdF_sat_offx
                              if (mdF_Lav_offx == 0)
                                 { mdF_Lav_offx = VAR_VAL(PADRE(idx_att, 1), "X") - X }
                             }
                          mdf_sat_Z_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisFia_1_", mdf_Apertura) )
                          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisFia_1_", KeyFamRegFacc)) == 1)
                             { mdf_sat_Z_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisFia_1_", KeyFamRegFacc) ) }
                          //---non-compatibile if (mdf_sat_Z_ele_1 == 0)  { mdf_sat_Z_ele_1 = VAR_VAL(PADRE(idx_att, 1), "Z_eleFro") }
                          if (mdf_sat_Z_ele_1 != 0)
                             { mdF_Lav_offz = VAR_VAL(PADRE(idx_att, 1), "Z") - mdf_sat_Z_ele_1 }

                          mdf_sat_offy_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisFia_1_", mdf_Apertura) )
                          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisFia_1_", KeyFamRegFacc)) == 1)
                             { mdf_sat_offy_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisFia_1_", KeyFamRegFacc) ) }
                          if (mdf_sat_offy_ele_1 != 0)  { mdF_Lav_offy = mdf_sat_offy_ele_1 }

                         // 06.12.2023
                          if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_E2_PisFia", str_var, STR(id_Pis))) )
                             {
                              mdF_Lav_offx = mdF_sat_offx
                              mdF_Lav_offy = mdF_sat_offy
                              mdF_Lav_offz = mdF_sat_offz
                             }

                          if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y_sat_ToRif }

                          mdf_add_sat_now = 1
                          //COMANDO2(STRCAT("RELATIVE_ADD ", STR(PADRE(idx_att, 1)), " ", mcb_ElementoBdm, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                          COMANDO2("PUSH_SITUAZIONE")
                          COMANDO2(STRCAT("SETTA ", STR(idx_To_ReAdd)))
                          COMANDO2(STRCAT("ELEMENTO_I ", mcb_ElementoBdm))
                          COMANDO2("STRUTTURA_I")
                          COMANDO2(STRCAT("VAR_SET X_MdF_graf=", STR(X), " idx_Pis=", STR(idx_att), " Posizione=", APICI(), Posizione, APICI(), " id_Pis=", STR(id_Pis), " mdF_Lav_offx=", STR(mdF_Lav_offx), " mdF_Lav_offy=", STR(mdF_Lav_offy), " mdF_Lav_offz=", STR(mdF_Lav_offz)))
                         // 27.02.2020
                          if (STRLEN(VAR_VAL_STR(idx_To_ReAdd, "MdF_sat_VANO")) == 0)  { COMANDO2("VANO 0") }
                          else { COMANDO2(VAR_VAL_STR(idx_To_ReAdd, "MdF_sat_VANO")) }
                          COMANDO2("ATTREZZA2 0.0")
                          COMANDO2("POP_SITUAZIONE")
                         }
                     }

                  mdf_sat_X_ele_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisFia_2_", mdf_Apertura) )
                  if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisFia_2_", KeyFamRegFacc)) == 1)
                     { mdf_sat_X_ele_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisFia_2_", KeyFamRegFacc)) }
                  if (mdf_sat_X_ele_2 == 0)  { mdf_sat_X_ele_2 = VAR_VAL(PADRE(idx_att, 1), "X") }

                  mdf_sat_offx_ele_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisFia_2_", mdf_Apertura) )
                  if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisFia_2_", KeyFamRegFacc)) == 1)
                     { mdf_sat_offx_ele_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisFia_2_", KeyFamRegFacc)) }

                  mdF_Lav_offx = mdf_sat_offx_ele_2
                  if ( IS_MATCH(Posizione, "DX")
                     | IS_MATCH(Posizione, "CNSX")
                     )
                     { mdF_Lav_offx = VAR_VAL(PADRE(idx_att, 1), "X") - mdf_sat_X_ele_2 - mdf_sat_offx_ele_2 }

                  mdF_Lav_offx = mdF_Lav_offx + mdF_sat_offx

                  mdf_sat_Z_ele_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisFia_2_", mdf_Apertura) )
                  if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisFia_2_", KeyFamRegFacc)) == 1)
                     { mdf_sat_Z_ele_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisFia_2_", KeyFamRegFacc) ) }
                  if (mdf_sat_Z_ele_2 == 0)  { mdf_sat_Z_ele_2 = VAR_VAL(PADRE(idx_att, 1), "Z_eleFro") }
                  //mdF_Lav_offz = mdF_sat_offz+VAR_VAL(PADRE(idx_att, 1), "Z") - mdf_sat_Z_eleAnta_2
                  mdF_Lav_offz = VAR_VAL(PADRE(idx_att, 1), "Z") - mdf_sat_Z_ele_2

                  mpf_ElementoBdm_2 = STRCAT(VAR_VAL_STR(idx_MdF, "MPF_ElementoBdm_PisFia"), "_2")
                  mdf_sat_prosegui_Attr = 0
                  COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mpf_ElementoBdm_2)
                 // 08.05.2017
                  mEi = 1
                  while(mEi <= mdf_elementoBdm)
                     {
                      if ( STRCMP(VAR_VAL_STR(mdf_elementoBdm[mEi], "KeyFamRegFacc_PisFia"), VAR_VAL_STR(idx_MdF, "KeyFamRegFacc_PisFia")) != 0
                         & VAR_VAL(mdf_elementoBdm[mEi], "id_Pis") == id_Pis
                         & VAR_VAL(mdf_elementoBdm[mEi], "idx_Pis") == idx_att
                         )
                         {
                          mdf_sat_prosegui_Attr = 1
                          GOSUB mdf_ShowAbilitaOff_ADD_sat
                          mdf_eliminato_e_reADD = 1
                          COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[mEi]), " // MPF_ElementoBdm_PisFia_2"))
                         }
                      mEi = mEi+1
                     }
                  sat_id_Pis_found = 0
                  if (mdf_sat_prosegui_Attr == 0)
                     {
                      iEm = 1
                      while (iEm <= mdf_elementoBdm)
                         {
                          if ( VAR_VAL(mdf_elementoBdm[iEm], "id_Pis") == id_Pis
                            // 08.05.2017
                             & VAR_VAL(mdf_elementoBdm[iEm], "idx_Pis") == idx_att
                             )
                             { sat_id_Pis_found = 1 }

                          iEm = iEm+1
                         }
                     }
                  if (sat_id_Pis_found == 0)  { mdf_sat_prosegui_Attr = 1 }

                  if (mdf_sat_prosegui_Attr > 0)
                     {
                     // 30.11.2023
                      if (VAR_EXIST(idx_att, "mdF_sat_offx_2") )  { mdF_Lav_offx = VAR_VAL(idx_att, "mdF_sat_offx_2") }
                      if (VAR_EXIST(idx_att, "mdF_sat_offy_2") )  { mdF_Lav_offy = VAR_VAL(idx_att, "mdF_sat_offy_2") }
                      if (VAR_EXIST(idx_att, "mdF_sat_offz_2") )  { mdF_Lav_offz = VAR_VAL(idx_att, "mdF_sat_offz_2") }
                      if (VAR_EXIST(idx_att, "mdF_sat_angz_2") )  { mdF_Lav_angz = VAR_VAL(idx_att, "mdF_sat_angz_2") }

                      if ( FILE_EXIST(STRCAT(mdf_import, "_2.sat")) == 1
                        // 04.01.2021
                         | VAR_VAL(PADRE(idx_MdF, 1), "MdF_sat_Abilita_PisFia_2") >= 1
                         )
                         {
                          mdf_sat_offy_ele_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisFia_2_", mdf_Apertura) )
                          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisFia_2_", KeyFamRegFacc)) == 1)
                             { mdf_sat_offy_ele_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisFia_2_", KeyFamRegFacc) ) }

                          // 30.11.2023
                          if (VAR_EXIST(idx_att, "mdF_sat_offy_2") )  { mdf_sat_offy_ele_2 = VAR_VAL(idx_att, "mdF_sat_offy_2") }

                          mdf_add_sat_now = 1
                          if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdf_sat_offy_ele_2-Y_sat_ToRif }
                          //COMANDO2(STRCAT("RELATIVE_ADD ", STR(PADRE(idx_att, 1)), " ", mpf_ElementoBdm_2, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                          COMANDO2("PUSH_SITUAZIONE")
                          COMANDO2(STRCAT("SETTA ", STR(idx_To_ReAdd)))
                          COMANDO2(STRCAT("ELEMENTO_I ", mpf_ElementoBdm_2))
                          COMANDO2("STRUTTURA_I")
                          //COMANDO2(STRCAT("VAR_SET X_MdF_graf=", STR(X), " mdF_Lav_offx=", STR(mdF_Lav_offx), " mdF_Lav_offy=", STR(mdF_Lav_offy), " mdF_Lav_offz=", STR(mdF_Lav_offz)))
                          COMANDO2(STRCAT("VAR_SET X_MdF_graf=", STR(X), " idx_Pis=", STR(idx_att), " Posizione=", APICI(), Posizione, APICI(), " id_Pis=", STR(id_Pis), " mdF_Lav_offx=", STR(mdF_Lav_offx), " mdF_Lav_offy=", STR(mdF_Lav_offy), " mdF_Lav_offz=", STR(mdF_Lav_offz)))
                         // 27.02.2020
                          if (STRLEN(VAR_VAL_STR(idx_To_ReAdd, "MdF_sat_VANO")) == 0)  { COMANDO2("VANO 0") }
                          else { COMANDO2(VAR_VAL_STR(idx_To_ReAdd, "MdF_sat_VANO")) }
                          COMANDO2("ATTREZZA2 0.0")
                          COMANDO2("POP_SITUAZIONE")
                         }
                     }

                  mdf_sat_X_ele_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisFia_3_", mdf_Apertura) )
                  if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisFia_3_", KeyFamRegFacc)) == 1)
                     { mdf_sat_X_ele_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_PisFia_3_", KeyFamRegFacc)) }
                  if (mdf_sat_X_ele_3 == 0)  { mdf_sat_X_ele_3 = VAR_VAL(PADRE(idx_att, 1), "X") }

                  mdf_sat_offx_ele_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisFia_3_", mdf_Apertura) )
                  if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisFia_3_", KeyFamRegFacc)) == 1)
                     { mdf_sat_offx_ele_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_PisFia_3_", KeyFamRegFacc)) }

                  mdF_Lav_offx = mdf_sat_offx_ele_3
                  if ( IS_MATCH(Posizione, "DX")
                     | IS_MATCH(Posizione, "CNSX")
                     )
                     { mdF_Lav_offx = VAR_VAL(PADRE(idx_att, 1), "X") - mdf_sat_X_ele_3 - mdf_sat_offx_ele_3 }

                  mdF_Lav_offx = mdF_Lav_offx + mdF_sat_offx

                  mdf_sat_Z_ele_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisFia_3_", mdf_Apertura) )
                  if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisFia_3_", KeyFamRegFacc)) == 1)
                     { mdf_sat_Z_ele_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_PisFia_3_", KeyFamRegFacc) ) }
                  if (mdf_sat_Z_ele_3 == 0)  { mdf_sat_Z_ele_3 = VAR_VAL(PADRE(idx_att, 1), "Z_eleFro") }

                  mdF_Lav_offz = VAR_VAL(PADRE(idx_att, 1), "Z") - mdf_sat_Z_ele_3

                  mpf_ElementoBdm_3 = STRCAT(VAR_VAL_STR(idx_MdF, "MPF_ElementoBdm_PisFia"), "_3")
                  mdf_sat_prosegui_Attr = 0
                  COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mpf_ElementoBdm_3)
                 // 08.05.2017
                  mEi = 1
                  while(mEi <= mdf_elementoBdm)
                     {
                      if ( STRCMP(VAR_VAL_STR(mdf_elementoBdm[mEi], "KeyFamRegFacc_PisFia"), VAR_VAL_STR(idx_MdF, "KeyFamRegFacc_PisFia")) != 0
                        // 08.05.2017
                         & VAR_VAL(mdf_elementoBdm[mEi], "id_Pis") == id_Pis
                         & VAR_VAL(mdf_elementoBdm[mEi], "idx_Pis") == idx_att
                         )
                         {
                          mdf_sat_prosegui_Attr = 1
                          GOSUB mdf_ShowAbilitaOff_ADD_sat
                          mdf_eliminato_e_reADD = 1
                          COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[mEi]), " // MPF_ElementoBdm_PisFia_3"))
                         }
                      mEi = mEi+1
                     }
                  sat_id_Pis_found = 0
                  if (mdf_sat_prosegui_Attr == 0)
                     {
                      iEm = 1
                      while (iEm <= mdf_elementoBdm)
                         {
                          if ( VAR_VAL(mdf_elementoBdm[iEm], "id_Pis") == id_Pis
                            // 08.05.2017
                             & VAR_VAL(mdf_elementoBdm[iEm], "idx_Pis") == idx_att
                             )
                             { sat_id_Pis_found = 1 }

                          iEm = iEm+1
                         }
                     }
                  if (sat_id_Pis_found == 0)  { mdf_sat_prosegui_Attr = 1 }

                  if (mdf_sat_prosegui_Attr > 0)
                     {
                     // 30.11.2023
                      if (VAR_EXIST(idx_att, "mdF_sat_offx_3") )  { mdF_Lav_offx = VAR_VAL(idx_att, "mdF_sat_offx_3") }
                      if (VAR_EXIST(idx_att, "mdF_sat_offy_3") )  { mdF_Lav_offy = VAR_VAL(idx_att, "mdF_sat_offy_3") }
                      if (VAR_EXIST(idx_att, "mdF_sat_offz_3") )  { mdF_Lav_offz = VAR_VAL(idx_att, "mdF_sat_offz_3") }
                      if (VAR_EXIST(idx_att, "mdF_sat_angz_3") )  { mdF_Lav_angz = VAR_VAL(idx_att, "mdF_sat_angz_3") }

                      mdf_sat_PisFia_3_exist = STRCAT("mdf_sat_X_PisFia_3_", mdf_Apertura)

                      mdf_sat_add_PisFia_3 = 0
                      if ( VAR_VAL(PADRE(idx_MdF, 1), "MdF_sat_Abilita_PisFia_3") >= 1
                         & STRLEN(VAR_VAL_STR(idx_MdF, STRCAT("img_sat_E2_PisFia", STR(id_Pis)))) < 2
                         )
                         { mdf_sat_add_PisFia_3 = 1 }

                      if ( FILE_EXIST(STRCAT(mdf_import, "_3.sat")) == 1
                         | VAR_EXIST(PADRE(idx_MdF, 1), mdf_sat_PisFia_3_exist) == 1
                        // 04.01.2021
                        // 06.12.2023
                         //| VAR_VAL(PADRE(idx_MdF, 1), "MdF_sat_Abilita_PisFia_3") >= 1
                         | mdf_sat_add_PisFia_3 > 0
                         )
                         {
                          mdf_sat_offy_ele_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisFia_3_", mdf_Apertura) )
                          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisFia_3_", KeyFamRegFacc)) == 1)
                             { mdf_sat_offy_ele_3 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_PisFia_3_", KeyFamRegFacc) ) }

                          // 30.11.2023
                          if (VAR_EXIST(idx_att, "mdF_sat_offy_3") )  { mdf_sat_offy_ele_3 = VAR_VAL(idx_att, "mdF_sat_offy_3") }

                          mdf_add_sat_now = 1
                          if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdf_sat_offy_ele_3-Y_sat_ToRif }
                          COMANDO2("PUSH_SITUAZIONE")
                          COMANDO2(STRCAT("SETTA ", STR(idx_To_ReAdd)))
                          COMANDO2(STRCAT("ELEMENTO_I ", mpf_ElementoBdm_3))
                          COMANDO2("STRUTTURA_I")
                          COMANDO2(STRCAT("VAR_SET X_MdF_graf=", STR(X), " idx_Pis=", STR(idx_att), " Posizione=", APICI(), Posizione, APICI(), " id_Pis=", STR(id_Pis), " mdF_Lav_offx=", STR(mdF_Lav_offx), " mdF_Lav_offy=", STR(mdF_Lav_offy), " mdF_Lav_offz=", STR(mdF_Lav_offz)))
                         // 27.02.2020
                          if (STRLEN(VAR_VAL_STR(idx_To_ReAdd, "MdF_sat_VANO")) == 0)  { COMANDO2("VANO 0") }
                          else { COMANDO2(VAR_VAL_STR(idx_To_ReAdd, "MdF_sat_VANO")) }
                          COMANDO2("ATTREZZA2 0.0")
                          COMANDO2("POP_SITUAZIONE")
                         }
                     }
                 }
             }

          if (STRCMP(NOME(idx_att), "MdF_CernieraVasRib") == 0)
             {
              mcb_ElementoBdm = VAR_VAL_STR(idx_MdF, "MCR_ElementoBdm_CerRib")
              // 21.11.2024
              //mdf_Apertura = VAR_VAL_STR(PADRE(idx_att, 3), "MdF_Apertura")
              mdf_Apertura = VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura")

              if (IS_MATCH(mdf_Apertura, "VAPI*") )
                 {
                  mcb_ElementoBdm = VAR_VAL_STR(idx_MdF, "MCR_ElementoBdm_CerRibVAPI")
                 }
              idx_To_ReAdd = PADRE(idx_att, 1)

             // 10.09.2024
              if (VAR_VAL(PADRE(idx_att, 1), "sposta_X_Utente") != 0)
                 {
                  if (VAR_VAL(idx_att, "sposta_X_Utente_sat_prec") != VAR_VAL(PADRE(idx_att, 1), "sposta_X_Utente"))
                     {
                      COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm)
                      if (mdf_elementoBdm > 0)
                         {
                          if (VAR_EXIST(idx_att, "sposta_X_Utente_sat_prec") != 1)
                             { sposta_X_Utente_sat_prec = VAR_VAL(PADRE(idx_att, 1), "sposta_X_Utente") }

                          GOSUB mdf_ShowAbilitaOff_ADD_sat
                          mdf_eliminato_e_reADD = 1
                          COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[1]), " // MdF_CernieraVasRib"))
                         }
                     }
                  mdF_Lav_offx = mdF_Lav_offx + VAR_VAL(PADRE(idx_att, 1), "sposta_X_Utente")
                 }
              mcr_Ctrl_SpostaCollis = 0
              if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
                 {
                 // 28.01.2022
                  mcr_distX_minToFound_att = VAR_VAL(PADRE(idx_att, 1), "mcr_distX_minToFound")
                  if (mcr_TipoGestioneCollis > 0)
                     {
                      if (mcr_distX_minToFound_att != VAR_VAL(idx_att, "mcr_distX_minToFound_prec"))
                         {
                          COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm)
                          if (mdf_elementoBdm > 0)
                             {
                              if (VAR_EXIST(idx_att, "mcr_distX_minToFound_prec") != 1)
                                 { mcr_distX_minToFound_prec = VAR_VAL(PADRE(idx_att, 1), "mcr_distX_minToFound") }

                              GOSUB mdf_ShowAbilitaOff_ADD_sat
                              mdf_eliminato_e_reADD = 1
                              COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[1]), " // MdF_CernieraVasRib"))

                              mdF_Lav_offx = mdF_Lav_offx + VAR_VAL(PADRE(idx_att, 1), "mcr_distX_minToFound")
                              mcr_distX_minToFound_prec = mcr_distX_minToFound_att
                              mcr_Ctrl_SpostaCollis = 1
                             }
                         }
                     }

                  COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm)
                  // 21.11.2024
                  if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y }
                  if (VAR_EXIST(idx_att, "mdF_Lav_offy_prec") != 1)
                     { mdF_Lav_offy_prec = mdF_Lav_offy }

                  GOSUB mdf_Ctrl_Change_import

                  if (mdf_elementoBdm <= 0)
                     {
                      mdf_add_sat_now = 1
                      COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_To_ReAdd), " ", mcb_ElementoBdm, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                     // 02.04.2021
                      COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm)
                      GOSUB mdf_Set_MdFRef
                     }
                 }

              mdf_sat_X_eleAnta_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_CerRib_2_", mdf_Apertura) )
              if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_CerRib_2_", KeyFamRegFacc)) == 1)
                 { mdf_sat_X_eleAnta_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_CerRib_2_", KeyFamRegFacc)) }
              if (mdf_sat_X_eleAnta_2 == 0)  { mdf_sat_X_CerRib_2 = VAR_VAL(PADRE(idx_att, 1), "X") }

              mdf_sat_offx_eleAnta_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_CerRib_2_", mdf_Apertura) )
              if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_CerRib_2_", KeyFamRegFacc)) == 1)
                 { mdf_sat_offx_CerRib_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_CerRib_2_", KeyFamRegFacc)) }

              mdF_Lav_offx = mdF_sat_offx + mdf_sat_offx_eleAnta_2

              mdf_sat_Z_eleAnta_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_CerRib_2_", mdf_Apertura) )
              if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_CerRib_2_", KeyFamRegFacc)) == 1)
                 { mdf_sat_Z_eleAnta_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_CerRib_2_", KeyFamRegFacc) ) }
              if (mdf_sat_Z_eleAnta_2 == 0)  { mdf_sat_Z_eleAnta_2 = VAR_VAL(PADRE(idx_att, 1), "Z_eleFro") }
              //mdF_Lav_offz = mdF_sat_offz+VAR_VAL(PADRE(idx_att, 1), "Z") - mdf_sat_Z_eleAnta_2
              mdF_Lav_offz = VAR_VAL(PADRE(idx_att, 1), "Z") - mdf_sat_Z_eleAnta_2

              mcb_ElementoBdm_2 = STRCAT(VAR_VAL_STR(idx_MdF, "MCR_ElementoBdm_CerRib"), "_2")

             // 28.01.2022
              if (mcr_Ctrl_SpostaCollis == 1)
                 {
                  COMPONENTI3("mdf_elementoBdm", PADRE(idx_att, 1), mcb_ElementoBdm_2)
                  if (mdf_elementoBdm > 0)
                     {
                      GOSUB mdf_ShowAbilitaOff_ADD_sat
                      mdf_eliminato_e_reADD = 1
                      COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[1]), " // MdF_CernieraVasRib"))

                      mdF_Lav_offx = mdF_Lav_offx + VAR_VAL(PADRE(idx_att, 1), "mcr_distX_minToFound")
                     }
                 }

              COMPONENTI3("mdf_elementoBdm", PADRE(idx_att, 1), mcb_ElementoBdm_2)
              // 21.11.2024
              GOSUB mdf_Ctrl_Change_import

              if (mdf_elementoBdm <= 0)
                 {
                 // 30.11.2023
                  if (VAR_EXIST(idx_att, "mdF_sat_offx_2") )  { mdF_Lav_offx = VAR_VAL(idx_att, "mdF_sat_offx_2") }
                  if (VAR_EXIST(idx_att, "mdF_sat_offy_2") )  { mdF_Lav_offy = VAR_VAL(idx_att, "mdF_sat_offy_2") }
                  if (VAR_EXIST(idx_att, "mdF_sat_offz_2") )  { mdF_Lav_offz = VAR_VAL(idx_att, "mdF_sat_offz_2") }
                  if (VAR_EXIST(idx_att, "mdF_sat_angz_2") )  { mdF_Lav_angz = VAR_VAL(idx_att, "mdF_sat_angz_2") }

                  if (FILE_EXIST(STRCAT(mdf_import, "_2.sat")) == 1)
                     {
                      mdf_sat_offy_eleAnta_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_CerRib_2_", mdf_Apertura) )
                      if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_CerRib_2_", KeyFamRegFacc)) == 1)
                         { mdf_sat_offy_eleAnta_2 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_CerRib_2_", KeyFamRegFacc) ) }

                      if (VAR_EXIST(idx_att, "mdF_sat_offy_2") )  { mdf_sat_offy_eleAnta_2 = VAR_VAL(idx_att, "mdF_sat_offy_2") }

                      mdf_add_sat_now = 1
                      if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdf_sat_offy_eleAnta_2-Y }

                      COMANDO2(STRCAT("RELATIVE_ADD ", STR(PADRE(idx_att, 1)), " ", mcb_ElementoBdm_2, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                     // 02.04.2021
                      COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm_2)
                      GOSUB mdf_Set_MdFRef
                     }
                 }
             }

          if (STRCMP(NOME(idx_att), "MdF_BasettaVasRib") == 0)
             {
              mcb_ElementoBdm = VAR_VAL_STR(idx_MdF, "MCR_ElementoBdm_BasRibVAPI")
              // 21.11.2024
              //mdf_Apertura = VAR_VAL_STR(PADRE(idx_att, 3), "MdF_Apertura")
              mdf_Apertura = VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura")
              idx_To_ReAdd = PADRE(idx_att, 1)
             // 24.11.2021 aperture storiche fuori standard
              mdf_aperSUPINF = 0
              if (IS_MATCH(mdf_Apertura, "VAPIE*SUP*") )  { mdf_aperSUPINF = 1 }
              if (IS_MATCH(mdf_Apertura, "VAPIE*INF*") )  { mdf_aperSUPINF = -1 }

              if ( IS_MATCH(mdf_Apertura, "VAPI*")
                 & mdf_aperSUPINF != 1
                 )
                 {
                 // 27.02.2019
                  // il sat MdF_BasettaVasRib_VAPI lo aggiungo all' anta superiore per avere
                  // il movimento legato appunto all' anta superiore
                  BOX_MODE(0)
                 // 16.04.2019 asterisco davanti per Cuc_
                  NEAR_GLOBALE("mdf_antaVAPS", idx_att, 6, 1, "*AntaSing*")
                 // 23.05.2023
                  mdf_distNearVAPS = 6
                  if (mdf_antaVAPS == 0)
                     {
                      if (IS_MATCH(NOME(PADRE(idx_att, 4)), "*Pie*Cur*") )
                         { mdf_distNearVAPS = 24.1 }
                     }
                 // 22.11.2022 asterisco in mezzo per AntaLibroSingola_  ma per non rischiare lo faccio se non trovo *AntaSing*
                  if (mdf_antaVAPS == 0)
                     { NEAR_GLOBALE("mdf_antaVAPS", idx_att, mdf_distNearVAPS, 1, "*Anta*Sing*") }
                  mdfan = 1
                  y_antaVAPS = VAR_VAL(PADRE(idx_MdF, 1), "Y")
                  while (mdfan <= mdf_antaVAPS)
                     {
                      if (PADRE(idx_att, -1) == PADRE(mdf_antaVAPS[mdfan], -1))
                         {
                          mdf_aperVAPS = VAR_VAL_STR(mdf_antaVAPS[mdfan], "MdF_Apertura")
                          if (STRLEN(mdf_aperVAPS) > 0)
                             {
                              if ( IS_MATCH(mdf_aperVAPS, "VAPS*")
                                 // 04.05.2023
                                 //| mdf_aperSUPINF == 1
                                 | IS_MATCH(mdf_aperVAPS, "VAP*SUP*")
                                 )
                                 {
                                  idx_To_ReAdd = mdf_antaVAPS[mdfan]
                                  y_antaVAPS = VAR_VAL(mdf_antaVAPS[mdfan], "Y")
                                  mdF_Lav_offy = mdF_Lav_offy-y_antaVAPS
                                 }
                             }
                          else
                             {
                              // 04.05.2023
                              WITH_VAR_LOCAL(mdf_antaVAPS[mdfan], "mdf_antaVAPS_figl", "MdF_Apertura", 1+2, 0, "")
                              mdAperS = 1
                              while (mdAperS <= mdf_antaVAPS_figl)
                                 {
                                  if ( IS_MATCH(NOME(mdf_antaVAPS_figl[mdAperS]), "MdF_*") != 1
                                     // 07.08.2024
                                     & IS_MATCH(NOME(mdf_antaVAPS_figl[mdAperS]), "MECCANISM*_UTENTE*") != 1
                                     )
                                     {
                                      mdf_aperVAPS_Figl = VAR_VAL_STR(mdf_antaVAPS_figl[mdAperS], "MdF_Apertura")
                                      if ( IS_MATCH(mdf_aperVAPS_Figl, "VAPS*")
                                         | IS_MATCH(mdf_aperVAPS_Figl, "VAP*SUP*")
                                         )
                                         {
                                          idx_To_ReAdd = mdf_antaVAPS_figl[mdAperS]
                                          y_antaVAPS = VAR_VAL(mdf_antaVAPS_figl[mdAperS], "Y")
                                          mdF_Lav_offy = mdF_Lav_offy-y_antaVAPS
                                          mdf_aperVAPS = mdf_aperVAPS_Figl
                                         }
                                     }
                                  mdAperS = mdAperS+1
                                 }
                             }
                         // 28.11.2023 Sn2021VAP112102_soffietto Se la VAPS non e' ancora passata per VariabiliMdF.txt gli dico di ricalcolarmi
                          if (STRLEN(mdf_aperVAPS) == 0)
                             {
                             // 07.08.2024
                              idx_satBasVAPI_ToCtrl = PADRE(idx_MdF, 1)
                              idx_att_Rif_ToRic = idx_att
                              // Serviva se MECCANISMI_UTENTE, ma con MECCANISMO_UTENTE_CerVasRib i livelli rimangono corretti
                              if (IS_MATCH(NOME(PADRE(idx_att, 3)), "MECCANISMI_UTENTE*") == 1)
                                 {
                                  idx_satBasVAPI_ToCtrl = PADRE(idx_MdF, 2)
                                  idx_att_Rif_ToRic = PADRE(idx_att, 2)
                                 }

                              if ( PADRE(mdf_antaVAPS[mdfan], 1) == PADRE(idx_satBasVAPI_ToCtrl, 1)
                                 & mdf_antaVAPS[mdfan] != idx_satBasVAPI_ToCtrl
                                 )
                                 {
                                  if (VAR_EXIST(mdf_antaVAPS[mdfan], "mdf_idx_Sat_BasRibVAPI") != 1)
                                     {
                                      VAR_VALUE_SET(mdf_antaVAPS[mdfan], "mdf_idx_Sat_BasRibVAPI", idx_att_Rif_ToRic)
                                     }
                                 }
                             }
                         }
                      mdfan = mdfan+1
                     }
                  var_px_CerRib = STRCAT("px_CerRib", STR(id_Cer))
                  mdF_Lav_offx = mdF_Lav_offx+VAR_VAL(PADRE(idx_att, 2), var_px_CerRib)
                 }
              else
                 {
                  if (STRLEN(VAR_VAL_STR(idx_MdF, "MCR_ElementoBdm_BasRib")) > 3)
                     {
                      mcb_ElementoBdm = VAR_VAL_STR(idx_MdF, "MCR_ElementoBdm_BasRib")
                     }
                 }
             // 10.09.2024
              if (VAR_VAL(PADRE(idx_att, 1), "sposta_X_Utente") != 0)
                 {
                  if (VAR_VAL(idx_att, "sposta_X_Utente_sat_prec") != VAR_VAL(PADRE(idx_att, 1), "sposta_X_Utente"))
                     {
                      COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm)
                      mdfis = 1
                      while (mdfis <= mdf_elementoBdm)
                         {
                          if ( VAR_VAL(mdf_elementoBdm[mdfis], "id_Cer") == VAR_VAL(idx_att, "id_Cer")
                             & VAR_VAL(mdf_elementoBdm[mdfis], "idx_BasRibVAPI") == idx_att
                             )
                             {
                              if (VAR_EXIST(idx_att, "sposta_X_Utente_sat_prec") != 1)
                                 { sposta_X_Utente_sat_prec = VAR_VAL(PADRE(idx_att, 1), "sposta_X_Utente") }

                              GOSUB mdf_ShowAbilitaOff_ADD_sat
                              mdf_eliminato_e_reADD = 1
                              COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[mdfis]), " // MdF_BasettaVasRib"))
                              mdf_sat_prosegui_Attr = 1
                             }
                          mdfis = mdfis+1
                         }
                     }
                  mdF_Lav_offx = mdF_Lav_offx + VAR_VAL(PADRE(idx_att, 1), "sposta_X_Utente")
                 }

              if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
                 {
                 // 27.02.2019
                  mdf_sat_prosegui_Attr = 1
                  COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm)
                  // 21.11.2024
                  GOSUB mdf_Ctrl_Change_import

                  mdfis = 1
                  while (mdfis <= mdf_elementoBdm)
                     {
                      if ( VAR_VAL(mdf_elementoBdm[mdfis], "id_Cer") == VAR_VAL(idx_att, "id_Cer")
                         & VAR_VAL(mdf_elementoBdm[mdfis], "idx_BasRibVAPI") == idx_att
                         )
                         { mdf_sat_prosegui_Attr = 0 }

                      mdfis = mdfis+1
                     }
                 // 16.04.2019 se entra quando non c'e ancora MdF_Apertura sull' altra anta
                  if ( IS_MATCH(mdf_Apertura, "VAPI*")
                     & mdf_aperSUPINF != 1
                     )
                     {
                      if (STRCMP(mcb_ElementoBdm, "MdF_Sat_BasRibVAPI") == 0)
                         {
                          // 15.01.2024 VD851495 Se entra che sto modificando la lunghezza anta sotto e poi quella sopra
                          //if (STRLEN(VAR_VAL_STR(idx_att, "mdf_aperVAPS")) == 0)
                          //   {
                              if (idx_To_ReAdd == PADRE(idx_att, 1))
                                 {
                                  mdf_sat_prosegui_Attr = -1
                                 }
                          //   }
                         }
                     }

                  // 15.01.2024 VD851495
                  if (mdf_sat_prosegui_Attr == 1)
                     {
                      if (IS_MATCH(mdf_Apertura, "VAPI*") )
                         {
                          mcr_distX_minToFound_att = VAR_VAL(PADRE(idx_att, 1), "mcr_distX_minToFound")
                          if (mcr_TipoGestioneCollis > 0)
                             {
                              if (mcr_distX_minToFound_att != 0)
                                 {
                                  mdF_Lav_offx = mdF_Lav_offx + VAR_VAL(PADRE(idx_att, 1), "mcr_distX_minToFound")
                                  mcr_distX_minToFound_prec = mcr_distX_minToFound_att
                                 }
                             }
                         }
                     }

                 // 28.01.2022
                  if (mdf_sat_prosegui_Attr == 0)
                     {
                      mcr_distX_minToFound_att = VAR_VAL(PADRE(idx_att, 1), "mcr_distX_minToFound")
                      COMPONENTI3("mdf_elementoBdmC", idx_To_ReAdd, mcb_ElementoBdm)
                      if (mcr_TipoGestioneCollis > 0)
                         {
                          if (mcr_distX_minToFound_att != VAR_VAL(idx_att, "mcr_distX_minToFound_prec"))
                             {
                              mdfis = 1
                              // 15.01.2024 VD851495 while, prima era if di [1] ma non so come potesse aver funzionato.
                              while (mdfis <= mdf_elementoBdmC)
                                 {
                                  if ( VAR_VAL(mdf_elementoBdmC[mdfis], "id_Cer") == VAR_VAL(idx_att, "id_Cer")
                                     & VAR_VAL(mdf_elementoBdmC[mdfis], "idx_BasRibVAPI") == idx_att
                                     )
                                     {
                                      if (VAR_EXIST(idx_att, "mcr_distX_minToFound_prec") != 1)
                                         { mcr_distX_minToFound_prec = VAR_VAL(PADRE(idx_att, 1), "mcr_distX_minToFound") }

                                      GOSUB mdf_ShowAbilitaOff_ADD_sat
                                      mdf_eliminato_e_reADD = 1
                                      COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdmC[mdfis]), " // MdF_BasettaVasRib da=", STR(idx_att)))

                                      mdF_Lav_offx = mdF_Lav_offx + VAR_VAL(PADRE(idx_att, 1), "mcr_distX_minToFound")
                                      mcr_distX_minToFound_prec = mcr_distX_minToFound_att
                                      mdf_sat_prosegui_Attr = 1
                                     }

                                  mdf_BRVAPI_ric = 0
                                  if (IS_IDX(mdf_elementoBdmC[mdfis]) > 0)
                                     {
                                      if ( VAR_VAL(mdf_elementoBdmC[mdfis], "idx_BasRibVAPI") > 0
                                         & IS_IDX(VAR_VAL(mdf_elementoBdmC[mdfis], "idx_BasRibVAPI")) != 1
                                         )
                                         { mdf_BRVAPI_ric = 1 }
                                     }
                                  if (IS_IDX(mdf_elementoBdmC[mdfis]) > 0)
                                     {
                                      if (VAR_VAL(mdf_elementoBdmC[mdfis], "idx_BasRibVAPI") == idx_att)
                                         { mdf_BRVAPI_ric = 2 }
                                     }
                                  if (mdf_BRVAPI_ric > 0)
                                     {
                                      GOSUB mdf_ShowAbilitaOff_ADD_sat
                                      mdf_eliminato_e_reADD = 1

                                      mdf_ricalcVAPS = idx_To_ReAdd

                                      COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdmC[mdfis]), " // MdF_CernieraVasRib idx_BasRibVAPI idx_att da=", STR(idx_att)))
                                     }

                                  mdfis = mdfis+1
                                 }
                             }
                         }
                     }
                 // 05.09.2024
                  if (UN_PADRE("MECC*UTE*") )
                     {
                      if (VAR_EXIST(idx_att, "px_CerRib1_prec") != 1)
                         { px_CerRib1_prec = VAR_VAL(PADRE(idx_att, 2), "px_CerRib1") }

                      if (VAR_EXIST(idx_att, "MdF_Apertura_Utente_prec") != 1)
                         { MdF_Apertura_Utente_prec = VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura_Utente") }

                      if ( VAR_VAL(idx_att, "px_CerRib1_prec") != VAR_VAL(PADRE(idx_att, 2), "px_CerRib1")
                         | VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura_Utente_prec") != VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura_Utente")
                         )
                         {
                          px_CerRib1_prec = VAR_VAL(PADRE(idx_att, 2), "px_CerRib1")
                          MdF_Apertura_Utente_prec = VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura_Utente")

                          COMPONENTI3("mdf_elementoBdmC", idx_To_ReAdd, mcb_ElementoBdm)
                          mdfiu = 1
                          while (mdfiu <= mdf_elementoBdmC)
                             {
                              mdf_BRVAPI_ric = 0
                              if (IS_IDX(mdf_elementoBdmC[mdfiu]) > 0)
                                 {
                                  if (VAR_VAL(mdf_elementoBdmC[mdfiu], "idx_BasRibVAPI") == idx_att)
                                     { mdf_BRVAPI_ric = 2 }
                                 }
                              if (mdf_BRVAPI_ric > 0)
                                 {
                                  GOSUB mdf_ShowAbilitaOff_ADD_sat
                                  mdf_eliminato_e_reADD = 1

                                  mdf_ricalcVAPS = idx_To_ReAdd

                                  COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdmC[mdfiu]), " // MdF_BasettaVasRib idx_BasRibVAPI idx_att da=", STR(idx_att)))
                                  mdf_sat_prosegui_Attr = 3
                                 }
                              mdfiu = mdfiu+1
                             }
                         }
                     }

                 // 05.09.2024
                  if (UN_PADRE("MECC*UTE*") )
                     {
                      if (STRLEN(mdf_Apertura) < 1)
                         {
                          if (idx_To_ReAdd == PADRE(idx_att, 1))  { mdf_sat_prosegui_Attr = -2 }
                         }
                     }

                  if (mdf_sat_prosegui_Attr > 0)
                     {
                      mdf_add_sat_now = 1
                      // Y in realta sarebbe da mettere y_antaVAPS, ma sono sempre uguali
                      if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y }
                      COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_To_ReAdd), " ", mcb_ElementoBdm, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                     // 27.02.2019
                      COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm)
                      mdfis = 1
                      while (mdfis <= mdf_elementoBdm)
                         {
                          if (VAR_EXIST(mdf_elementoBdm[mdfis], "id_Cer") != 1)
                             {
                              VAR_CREATE_NUM(mdf_elementoBdm[mdfis], "idx_BasRibVAPI", idx_att, 0, "")
                              VAR_CREATE_NUM(mdf_elementoBdm[mdfis], "id_Cer", VAR_VAL(idx_att, "id_Cer"), 0, "")
                              VAR_CREATE_STR(mdf_elementoBdm[mdfis], "MdF_Apertura", mdf_Apertura, 0, "")
                             }

                          mdfis = mdfis+1
                         }
                     }
                 }
             }
         // 27.12.2022
          if (STRCMP(NOME(idx_att), "MdF_FerramentaGen") == 0)
             {
              GOSUB MdF_add_sat_FerGen
             }
          if (STRCMP(NOME(idx_att), "MdF_FerGenCri") == 0)
             {
              GOSUB MdF_add_sat_FerCri
             }
          if (STRCMP(NOME(idx_att), "MdF_FerramentaSuFianco") == 0)
             {
              GOSUB MdF_add_sat_FerFia
             }
         // 03.01.2023
          if (STRCMP(NOME(idx_att), "MdF_FerramentaSuPiano") == 0)
             {
              GOSUB MdF_add_sat_FerPia
             }
         // 21.02.2024
          if (STRCMP(NOME(idx_att), "MdF_FerramentaSuAnta") == 0)
             {
              GOSUB MdF_add_sat_FerFro
             }

          // 01.07.2020
          if (mdf_eliminato_e_reADD == 1)
             {
             // 13.03.2024
              if (VAR_VAL(-1, "OnLoadOrder2") == 0)
                 {
                  COMANDO2(STRCAT("SHOW Abilita On   // mdf_ADD_sat idx=", STR(idx_att), " ", NOME(idx_att)))
                  // 13.03.2024 suggerito da Nicola
                  COMANDO2(STRCAT("Show Strutture idx add ", STR(idx_To_ReAdd), "  // mdf_ADD_sat da idx=", STR(idx_att), " ", NOME(idx_att)))
                 }
             }
         }
   }

   // 31.07.2024
   PROCEDURA MdF_add_sat_Basetta_N
   {
      isatb = 2
      while (FILE_EXIST(STRCAT(mdf_import, "_", STR(isatb), ".sat")) == 1)
         {
          mcb_ElementoBdm_Bas_N = STRCAT(VAR_VAL_STR(PADRE(idx_MdF, 1), "MCB_ElementoBdm_BasBat"), "_", STR(isatb))

          mdF_Lav_offx = VAR_VAL(idx_att, STRCAT("mdF_sat_offx_", STR(isatb)))
          mdF_Lav_offy = VAR_VAL(idx_att, STRCAT("mdF_sat_offy_", STR(isatb)))
          mdF_Lav_offz = VAR_VAL(idx_att, STRCAT("mdF_sat_offz_", STR(isatb)))
          mdF_Lav_angz = VAR_VAL(idx_att, STRCAT("mdF_sat_angz_", STR(isatb)))

          mdf_Apertura = VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura")

          mcb_ElementoBdm = mcb_ElementoBdm_Bas_N
          COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mcb_ElementoBdm_Bas_N)
          if ( VAR_VAL(PADRE(idx_MdF, 1), "MdF_sat_Basetta_Attrezzata") == 0
             // Se ANP non trova il Fianco, da vedere se cercare il montante
             | idx_To_ReAdd == idx_att
             )
             {
              if (mdf_elementoBdm > 0)
                 {
                  if ( STRCMP(VAR_VAL_STR(mdf_elementoBdm[1], "mdf_Apertura"), VAR_VAL_STR(idx_MdF, "MdF_Apertura")) != 0
                     | STRCMP(mdf_import, mdf_import_eleBasBat) != 0
                     )
                     {
                      GOSUB mdf_ShowAbilitaOff_ADD_sat
                      mdf_eliminato_e_reADD = 1
                      COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[1]), " // mcb_ElementoBdm_Bas_N mdf_ADD_sat"))
                      mdf_elementoBdm = 0
                     }
                 }
              if (mdf_elementoBdm <= 0)
                 {
                  if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y }
                  mdf_add_sat_now = 1
                  COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_To_ReAdd), " ", mcb_ElementoBdm_Bas_N, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
                 }
             }
          else
             {
              if (idx_To_ReAdd == PADRE(idx_MdF, 1) )  { EXITSUB() }
              mdf_sat_prosegui_Attr = 0
              // 09.05.2025 Vuol dire aggiunte troppo presto prima di avere MdF_sat_Basetta_Attrezzata = 1
              if (VAR_VAL(PADRE(idx_MdF, 1), "MdF_sat_Basetta_Attrezzata") == 1)
                 {
                  // Non dovrei averne
                  COMPONENTI2("mdf_elementoBdmFiglio", idx_att, mcb_ElementoBdm)
                  if (mdf_elementoBdmFiglio > 0)
                     {
                      GOSUB mdf_ShowAbilitaOff_ADD_sat
                      mdf_eliminato_e_reADD = 1
                      COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdmFiglio[1]), " // mcb_ElementoBdm_Bas_N Figlio Err mdf_ADD_sat"))
                     }
                 }
              mEi = 1
              while(mEi <= mdf_elementoBdm)
                 {
                  mdf_ctrl_change_sat = 0
                 // 07.05.2025 Vedi EM0122400072
                  midx_CamMdF = VAR_VAL(mdf_elementoBdm[mEi], "idx_MdFgraf")
                  if (VAR_EXIST(PADRE(idx_att, 3), "mdf_bas0_y_Fro_Prec") == 1)
                     {
                      if (ABS(VAR_VAL(PADRE(idx_att, 3), "mdf_bas0_y_Fro_Prec") - VAR_VAL(PADRE(idx_att, 3), "base_0.y")) > 1)
                         {
                          mdiffbas0y_CamMdF = VAR_VAL(PADRE(idx_att, 3), "mdf_bas0_y_Fro_Prec") - VAR_VAL(PADRE(idx_att, 3), "base_0.y")
                          if (VAR_VAL(mdf_elementoBdm[mEi], "idx_MdFgraf") == idx_att)
                             {
                              mdf_ctrl_change_sat = 999.99
                             }
                         }
                     }

                  if (VAR_EXIST(PADRE(idx_att, 2), "MdF_Ctrl_var_gest_MdF") != 1)
                     {
                      if ( mdf_eliminato_e_reADD > 0
                         & VAR_VAL(mdf_elementoBdm[mEi], "idx_MdFgraf") == idx_att
                         )
                         { mdf_ctrl_change_sat = 1 }
                     }
                  else
                     {
                      if ( VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") > 0
                         & VAR_VAL(mdf_elementoBdm[mEi], "idx_MdFgraf") == idx_att
                         & VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") != 200
                         & VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") != 1000
                         )
                         { mdf_ctrl_change_sat = 2 }
                     }
                  if (mdf_ctrl_change_sat > 0)
                     {
                      mdf_sat_prosegui_Attr = 1
                      GOSUB mdf_ShowAbilitaOff_ADD_sat
                      mdf_eliminato_e_reADD = 1
                      COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[mEi]), " // mcb_ElementoBdm_Bas_N Attrezza ", NOME(mdf_elementoBdm[mEi]) ," da=", STR(idx_att), " pdr3=", STR(PADRE(idx_att, 3))))
                     }
                  mEi = mEi+1
                 }
              sat_id_Bas_found = 0
              if (mdf_sat_prosegui_Attr == 0)
                 {
                  iEm = 1
                  while (iEm <= mdf_elementoBdm)
                     {
                      if (VAR_VAL(mdf_elementoBdm[iEm], "idx_MdFgraf") == idx_att)
                         { sat_id_Bas_found = 1 }

                      iEm = iEm+1
                     }
                 }
              if (sat_id_Bas_found == 0)  { mdf_sat_prosegui_Attr = 1 }

              COMPONENTI3("mdf_elementoBdmOpp", mdf_idx_Battuta_DX, mcb_ElementoBdm)
              if (IS_MATCH(mdf_Apertura, "DX*") )
                 { COMPONENTI3("mdf_elementoBdmOpp", mdf_idx_Battuta_SX, mcb_ElementoBdm) }

              mEi = 1
              while(mEi <= mdf_elementoBdmOpp)
                 {
                  // 28.10.2020
                  if (VAR_VAL(mdf_elementoBdmOpp[mEi], "idx_MdFgraf") == idx_att)
                     {
                      GOSUB mdf_ShowAbilitaOff_ADD_sat
                      mdf_eliminato_e_reADD = 1
                      COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdmOpp[mEi]), " // mcb_ElementoBdm_Bas_N FiaOpposto cambioAperturaSXDX"))
                     }
                  mEi = mEi+1
                 }

              if (VAR_EXIST(idx_att, "idx_To_ReAdd_prec") != 1)  { idx_To_ReAdd_prec = idx_To_ReAdd }

              if (idx_To_ReAdd_prec != idx_To_ReAdd)
                 {
                  COMPONENTI3("mdf_elementoBdmPrec", idx_To_ReAdd_prec, mcb_ElementoBdm)
                  mEi = 1
                  while(mEi <= mdf_elementoBdmPrec)
                     {
                      if (VAR_VAL(mdf_elementoBdmPrec[mEi], "idx_MdFgraf") == idx_att)
                         {
                          GOSUB mdf_ShowAbilitaOff_ADD_sat
                          mdf_eliminato_e_reADD = 1
                          COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdmPrec[mEi]), " // mcb_ElementoBdm_Bas_N idx_To_ReAdd_prec da=", STR(idx_att)))
                         }
                      mEi = mEi+1
                     }
                 }

              // copied AGGANCIATA a 3342B ANP
              if (VAR_EXIST(PADRE(idx_att, -1), "copied__") == 1)
                 {
                  if (ACTION() == 1)
                     {
                      if (CMD() == 0)  { mdf_sat_prosegui_Attr = -99 }
                     }
                 }

              if (mdf_sat_prosegui_Attr > 0)
                 {
                  mdf_add_sat_now = 1
                  mdfsys_collY_sposta_idx_MdFgraf_att = VAR_VAL(PADRE(idx_att, 2), STRCAT("MdfSys_collY_sposta", STR(id_Cer)))
                  COMANDO2("PUSH_SITUAZIONE")
                  COMANDO2(STRCAT("SETTA ", STR(idx_To_ReAdd)))
                  COMANDO2(STRCAT("ELEMENTO_I ", mcb_ElementoBdm))
                  COMANDO2("STRUTTURA_I")
                  COMANDO2(STRCAT("VAR_SET X_MdF_graf=", STR(X), " idx_MdFgraf=", STR(idx_att), " id_Reggraf=", STR(id_Cer), " mdF_Lav_offx=", STR(mdF_Lav_offx), " mdF_Lav_offy=", STR(mdF_Lav_offy), " mdF_Lav_offz=", STR(mdF_Lav_offz)))
                  // 15.01.2025
                  COMANDO2(STRCAT("VAR_SET mdfsys_collY_sposta_idx_MdFgraf=", STR(mdfsys_collY_sposta_idx_MdFgraf_att)))
                  if (STRLEN(VAR_VAL_STR(idx_To_ReAdd, "MdF_sat_VANO")) == 0)  { COMANDO2("VANO 0") }
                  else { COMANDO2(VAR_VAL_STR(idx_To_ReAdd, "MdF_sat_VANO")) }
                  COMANDO2(STRCAT("ATTREZZA2 ", STR(base_0.y)))
                  COMANDO2("POP_SITUAZIONE")
                 }
             }
          isatb = isatb+1
         }
   }

  // 27.12.2022
   PROCEDURA MdF_add_sat_FerGen
   {
      mdf_ElementoBdm = VAR_VAL_STR(idx_MdF, "MdF_ElementoBdm_FerGen")
      if (STRLEN(mdf_ElementoBdm) < 1)  { mdf_ElementoBdm = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_ElementoBdm_FerGen") }
      if (STRLEN(mdf_ElementoBdm) < 1)  { mdf_ElementoBdm = "MdF_Sat_FerGen" }
      mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, "MdF_nomeFile_sat_FerGen")
      if (STRLEN(mdf_nomeFile_sat) < 1)  { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerGen") }
      if (STRLEN(mdf_nomeFile_sat) < 1)  { mdf_nomeFile_sat = "MdF_FerGen_TEST" }

      if (px_FerGen < VAR_VAL(idx_MdF, "X")/2)
         {
          if (VAR_EXIST(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerGen_SX") )
             {
              mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerGen_SX")
             }
         }
      else
         {
          if (VAR_EXIST(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerGen_DX") )
             {
              mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerGen_DX")
             }
         }

     // 07.12.2023
      if (VAR_EXIST(idx_MdF, STRCAT("img_sat_F1_FerGen", STR(id_Fer))) )
         {
          mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("img_sat_F1_FerGen", STR(id_Fer)))
          if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_F1_FerGen", STR(id_Fer))) )
             {
              mdfstr_input = VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_F1_FerGen", STR(id_Fer)))
              GOSUB MdF_EstraiStringhe
              mdF_Lav_offx = ATOI(mdf_array_Stringhe[1])
              mdF_Lav_offy = ATOI(mdf_array_Stringhe[2])
              mdF_Lav_offz = ATOI(mdf_array_Stringhe[3])
              mdF_Lav_angz = ATOI(mdf_array_Stringhe[4])
             }
         }

     // 21.02.2023
      mdf_import = STRCAT($path_file_sat_MdF, mdf_nomeFile_sat)

      idx_To_ReAdd = idx_att
      if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
         {
          if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y }
          mdf_sat_prosegui_Attr = 1
          COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mdf_ElementoBdm)
          if (mdf_elementoBdm > 0)
             { mdf_sat_prosegui_Attr = 0 }

          if (mdf_sat_prosegui_Attr > 0)
             {
              mdf_add_sat_now = 1
              COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_To_ReAdd), " ", mdf_ElementoBdm, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
             }
         }
   }

   PROCEDURA MdF_add_sat_FerCri
   {
      mdf_ElementoBdm = VAR_VAL_STR(idx_MdF, "MdF_ElementoBdm_FerCri")
      if (STRLEN(mdf_ElementoBdm) < 1)  { mdf_ElementoBdm = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_ElementoBdm_FerCri") }
      if (STRLEN(mdf_ElementoBdm) < 1)  { mdf_ElementoBdm = "MdF_Sat_FerCri" }
      mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, "MdF_nomeFile_sat_FerCri")
      if (STRLEN(mdf_nomeFile_sat) < 1)  { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerCri") }
      if (STRLEN(mdf_nomeFile_sat) < 1)  { mdf_nomeFile_sat = "MdF_FerCri_TEST" }

      if (VAR_EXIST(idx_MdF, STRCAT("img_sat_F1_FerCri", STR(id_Fer))) )
         {
          mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("img_sat_F1_FerCri", STR(id_Fer)))
          if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_F1_FerCri", STR(id_Fer))) )
             {
              mdfstr_input = VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_F1_FerCri", STR(id_Fer)))
              GOSUB MdF_EstraiStringhe
              mdF_Lav_offx = ATOI(mdf_array_Stringhe[1])
              mdF_Lav_offy = ATOI(mdf_array_Stringhe[2])
              mdF_Lav_offz = ATOI(mdf_array_Stringhe[3])
              mdF_Lav_angz = ATOI(mdf_array_Stringhe[4])
             }
         }

      mdf_import = STRCAT($path_file_sat_MdF, mdf_nomeFile_sat)

      idx_To_ReAdd = idx_att
      if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
         {
          if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y }
          mdf_sat_prosegui_Attr = 1
          COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mdf_ElementoBdm)
          if (mdf_elementoBdm > 0)
             { mdf_sat_prosegui_Attr = 0 }

          if (mdf_sat_prosegui_Attr > 0)
             {
              mdf_add_sat_now = 1
              COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_To_ReAdd), " ", mdf_ElementoBdm, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
             }
         }
   }

   PROCEDURA MdF_add_sat_FerFia
   {
      mdf_ElementoBdm = VAR_VAL_STR(idx_MdF, "MdF_ElementoBdm_FerFia")
      if (STRLEN(mdf_ElementoBdm) < 1)  { mdf_ElementoBdm = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_ElementoBdm_FerFia") }
      if (STRLEN(mdf_ElementoBdm) < 1)  { mdf_ElementoBdm = "MdF_Sat_FerFia" }
      mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, "MdF_nomeFile_sat_FerFia")
      if (STRLEN(mdf_nomeFile_sat) < 1)  { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerFia") }
      if (STRLEN(mdf_nomeFile_sat) < 1)  { mdf_nomeFile_sat = "MdF_FerFia_TEST" }

      px_FerFia_att = VAR_VAL(PADRE(idx_att, 1), "px_FerFia")
      if (px_FerFia_att < VAR_VAL(idx_MdF, "X")/2)
         {
          if (VAR_EXIST(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerFia_SX") )
             {
              mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerFia_SX")
             }
         }
      else
         {
          if (VAR_EXIST(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerFia_DX") )
             {
              mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerFia_DX")
             }
         }

     // 07.12.2023
      if (VAR_EXIST(idx_MdF, STRCAT("img_sat_F1_FerFia", STR(id_Fer))) )
         {
          mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("img_sat_F1_FerFia", STR(id_Fer)))
          if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_F1_FerFia", STR(id_Fer))) )
             {
              mdfstr_input = VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_F1_FerFia", STR(id_Fer)))
              GOSUB MdF_EstraiStringhe
              mdF_Lav_offx = ATOI(mdf_array_Stringhe[1])
              mdF_Lav_offy = ATOI(mdf_array_Stringhe[2])
              mdF_Lav_offz = ATOI(mdf_array_Stringhe[3])
              mdF_Lav_angz = ATOI(mdf_array_Stringhe[4])
             }
         }

     // 21.02.2023
      mdf_import = STRCAT($path_file_sat_MdF, mdf_nomeFile_sat)
      if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y }

      idx_To_ReAdd = idx_att
      if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
         {
          mdf_sat_prosegui_Attr = 1
          COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mdf_ElementoBdm)
          if (mdf_elementoBdm > 0)
             { mdf_sat_prosegui_Attr = 0 }

          if (mdf_sat_prosegui_Attr > 0)
             {
              mdf_add_sat_now = 1
              COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_To_ReAdd), " ", mdf_ElementoBdm, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
             }
         }
   }

   PROCEDURA MdF_add_sat_FerPia
   {
      mdf_ElementoBdm = VAR_VAL_STR(idx_MdF, "MdF_ElementoBdm_FerPia")
      if (STRLEN(mdf_ElementoBdm) < 1)  { mdf_ElementoBdm = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_ElementoBdm_FerPia") }
      if (STRLEN(mdf_ElementoBdm) < 1)  { mdf_ElementoBdm = "MdF_Sat_FerPia" }

      mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, "MdF_nomeFile_sat_FerPia")
      if (STRLEN(mdf_nomeFile_sat) < 1)  { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerPia") }
      if (STRLEN(mdf_nomeFile_sat) < 1)  { mdf_nomeFile_sat = "MdF_FerPia_TEST" }

      py_FerPia_att = VAR_VAL(PADRE(idx_att, 1), "py_FerPia")
  //    if (py_FerPia_att < VAR_VAL(idx_MdF, "Y")/2)
      if (VAR_VAL_STR(idx_MdF, "MdF_Lato") == "BOTTOM")
         {
          if (VAR_EXIST(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerPia_DW") )
             {
              mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerPia_DW")
             }
          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("MdF_nomeFile_sat_FerPia_", CHIAVE_TAB_CAM, "_DW")) )
             {
              var_sat_chiave = STRCAT("MdF_nomeFile_sat_FerPia_", CHIAVE_TAB_CAM, "_DW")
              mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), var_sat_chiave)
             }
         }
      else
         {
          if (VAR_EXIST(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerPia_UP") )
             {
              mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerPia_UP")
             }
          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("MdF_nomeFile_sat_FerPia_", CHIAVE_TAB_CAM, "_UP")) )
             {
              var_sat_chiave = STRCAT("MdF_nomeFile_sat_FerPia_", CHIAVE_TAB_CAM, "_UP")
              mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), var_sat_chiave)
             }
         }

     // 07.12.2023
      if (VAR_EXIST(idx_MdF, STRCAT("img_sat_F1_FerPia", STR(id_Fer))) )
         {
          mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("img_sat_F1_FerPia", STR(id_Fer)))
          if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_F1_FerPia", STR(id_Fer))) )
             {
              mdfstr_input = VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_F1_FerPia", STR(id_Fer)))
              GOSUB MdF_EstraiStringhe
              mdF_Lav_offx = ATOI(mdf_array_Stringhe[1])
              mdF_Lav_offy = ATOI(mdf_array_Stringhe[2])
              mdF_Lav_offz = ATOI(mdf_array_Stringhe[3])
              mdF_Lav_angz = ATOI(mdf_array_Stringhe[4])
             }
         }

     // 21.02.2023
      mdf_import = STRCAT($path_file_sat_MdF, mdf_nomeFile_sat)
      if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y }

      idx_To_ReAdd = idx_att
      if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
         {
          mdf_sat_prosegui_Attr = 1
          COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mdf_ElementoBdm)
          if (mdf_elementoBdm > 0)
             { mdf_sat_prosegui_Attr = 0 }

          if (mdf_sat_prosegui_Attr > 0)
             {
              mdf_add_sat_now = 1
              COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_To_ReAdd), " ", mdf_ElementoBdm, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
             }
         }
   }

   PROCEDURA MdF_add_sat_FerFro
   {
      mdf_ElementoBdm = VAR_VAL_STR(idx_MdF, "MdF_ElementoBdm_FerFro")
      if (STRLEN(mdf_ElementoBdm) < 1)  { mdf_ElementoBdm = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_ElementoBdm_FerFro") }
      if (STRLEN(mdf_ElementoBdm) < 1)  { mdf_ElementoBdm = "MdF_Sat_FerFro" }
      mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, "MdF_nomeFile_sat_FerFro")
      if (STRLEN(mdf_nomeFile_sat) < 1)  { mdf_nomeFile_sat = VAR_VAL_STR(PADRE(idx_MdF, 1), "MdF_nomeFile_sat_FerFro") }
      if (STRLEN(mdf_nomeFile_sat) < 1)  { mdf_nomeFile_sat = "MdF_FerFro_TEST" }

      if (VAR_EXIST(idx_MdF, STRCAT("img_sat_F1_FerFro", STR(id_Fer))) )
         {
          mdf_nomeFile_sat = VAR_VAL_STR(idx_MdF, STRCAT("img_sat_F1_FerFro", STR(id_Fer)))
          if (VAR_EXIST(idx_MdF, STRCAT("offxyz_sat_F1_FerFro", STR(id_Fer))) )
             {
              mdfstr_input = VAR_VAL_STR(idx_MdF, STRCAT("offxyz_sat_F1_FerFro", STR(id_Fer)))
              GOSUB MdF_EstraiStringhe
              mdF_Lav_offx = ATOI(mdf_array_Stringhe[1])
              mdF_Lav_offy = ATOI(mdf_array_Stringhe[2])
              mdF_Lav_offz = ATOI(mdf_array_Stringhe[3])
              mdF_Lav_angz = ATOI(mdf_array_Stringhe[4])
             }
         }

      mdf_import = STRCAT($path_file_sat_MdF, mdf_nomeFile_sat)
     // 27.02.2024 Spostato fuori perche se mi serve come riferimento e ho gia inserito il sat, se ripassa di qua
      // imposta qui sopra mdF_Lav_offy = ATOI(mdf_array_Stringhe[2]) e mi manca il -Y
      if (IS_MATCH($MDFSys_NewRTA, "1") == 1)  { mdF_Lav_offy = mdF_Lav_offy-Y }

      idx_To_ReAdd = idx_att
      if (FILE_EXIST(STRCAT(mdf_import, ".sat")) == 1)
         {
          mdf_sat_prosegui_Attr = 1
          COMPONENTI3("mdf_elementoBdm", idx_To_ReAdd, mdf_ElementoBdm)
          if (mdf_elementoBdm > 0)
             { mdf_sat_prosegui_Attr = 0 }

          if (mdf_sat_prosegui_Attr > 0)
             {
              mdf_add_sat_now = 1
              COMANDO2(STRCAT("RELATIVE_ADD ", STR(idx_To_ReAdd), " ", mdf_ElementoBdm, " A ", STR(mdF_Lav_offx), " ", STR(mdF_Lav_offy), " ", STR(mdF_Lav_offz), " ", STR(mdF_Lav_angz)))
             }
         }
   }

   PROCEDURA mdf_ctrl_nomeFile_sat_Scocca
   {
      mdf_Apertura = VAR_VAL_STR(PADRE(idx_att, 2), "MdF_Apertura")
      mdf_AlScocca = VAR_VAL_STR(mdf_sat_idx_idx_CamMdF, "MdF_AliasScocca")
      mdf_nomeFile_sat_Sc = STRCAT(NOME(idx_att), "_", mdf_AlScocca, "_", mdf_Apertura)
      mdf_import_Scocca = STRCAT($path_file_sat_MdF, mdf_nomeFile_sat_Sc)

      mdf_idx_ele_rif = idx_att
      mdf_idx_CamMdF = mdf_sat_idx_idx_CamMdF

     // 25.11.2016
      if (VAR_EXIST(mdf_idx_CamMdF, "mdf_sat_var_CerBasBat_ToCtrl") == 1)
         {
          mdf_sat_var_ToCtrl = VAR_VAL_STR(mdf_idx_CamMdF, "mdf_sat_var_CerBasBat_ToCtrl")
          mdf_charReg = VAR_VAL_STR(mdf_idx_CamMdF, mdf_sat_var_ToCtrl)
          // 28.06.2018
          if (VAR_EXIST(mdf_idx_CamMdF, mdf_sat_var_ToCtrl) != 1)
             {
              mdf_idx_VarCER = PADRE(mdf_idx_CamMdF, 1)
              mdf_charReg = VAR_VAL_STR(mdf_idx_VarCER, mdf_sat_var_ToCtrl)
              if (VAR_EXIST(mdf_idx_VarCER, mdf_sat_var_ToCtrl) != 1)
                 {
                  mdf_charReg = VAR_VAL_STR(PADRE(idx_att, -1), mdf_sat_var_ToCtrl)
                 }
             }
          mdf_nomeFile_sat_Sc = STRCAT(NOME(idx_att), "_", mdf_charReg, "_", mdf_Apertura)
          mdf_import_Scocca = STRCAT($path_file_sat_MdF, mdf_nomeFile_sat_Sc)

          if ( VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg ,"_1_", mdf_charReg, "_", mdf_Apertura))
             | VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg ,"_1_", mdf_charReg))
             )
             {
              mdf_sat_X_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_", mdf_skeyReg ,"_1_", mdf_charReg) )
              if (mdf_sat_X_ele_1 == 0)  { mdf_sat_X_ele_1 = VAR_VAL(mdf_idx_pdrdi1, "X") }

              mdf_sat_offx_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg ,"_1_", mdf_charReg) )

              if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg ,"_1_", mdf_charReg, "_", mdf_Apertura)) )
                 { mdf_sat_offx_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg ,"_1_", mdf_charReg, "_", mdf_Apertura) ) }

              mdF_Lav_offx = mdf_sat_offx_ele_1

              if (IS_MATCH(mdf_Apertura, "DX*") )
                 {
                  mdF_Lav_offx = VAR_VAL(mdf_idx_pdrdi1, "X") - mdf_sat_X_ele_1-mdf_sat_offx_ele_1
                 }

              mdf_sat_offy_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_", mdf_skeyReg, "_1_", mdf_charReg) )
              mdF_Lav_offy = mdf_sat_offy_ele_1
             }

          if ( VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg ,"_1_", mdf_charReg, "_", mdf_Apertura))
             | VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg ,"_1_", mdf_charReg))
             )
             {
              mdf_sat_Z_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_", mdf_skeyReg , "_1_", mdf_charReg) )
              if (mdf_sat_Z_ele_1 == 0)  { mdf_sat_Z_ele_1 = VAR_VAL(mdf_idx_pdrdi1, "Z_eleFro") }
              mdf_sat_offz_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg , "_1_", mdf_charReg) )
              if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg ,"_1_", mdf_charReg, "_", mdf_Apertura)) )
                 { mdf_sat_offz_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg ,"_1_", mdf_charReg, "_", mdf_Apertura) ) }
              mdF_Lav_offz = VAR_VAL(mdf_idx_ele_rif, "Z") - mdf_sat_Z_ele_1 + mdf_sat_offz_ele_1
             }

          // 30.04.2024 Ottimizzazioni FILE_EXIST per la rete
          if (mdf_import_Scocca != VAR_VAL_STR(idx_att, "mdf_import_Scocca_prec") )
             {
              if (FILE_EXIST(STRCAT(mdf_import_Scocca, ".sat")) == 1)  { import_sat_Scocca_exist = 1 }
              else                                                     { import_sat_Scocca_exist = 0 }
              mdf_import_Scocca_prec = mdf_import_Scocca
             }
          if (VAR_VAL(idx_att, "import_sat_Scocca_exist") > 0)
             {
              mdf_import = mdf_import_Scocca
              EXITSUB()
             }
         }

      mdf_sat_X_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_", mdf_skeyReg ,"_1_", mdf_Apertura) )
      if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_", mdf_skeyReg ,"_1_", KeyFamRegFacc)) == 1)
         { mdf_sat_X_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_", mdf_skeyReg ,"_1_", KeyFamRegFacc)) }
      if (mdf_sat_X_ele_1 == 0)  { mdf_sat_X_ele_1 = VAR_VAL(mdf_idx_pdrdi1, "X") }

      mdf_sat_offx_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg ,"_1_", mdf_Apertura) )
      if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg, "_1_", KeyFamRegFacc)) == 1)
         { mdf_sat_offx_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg , "_1_", KeyFamRegFacc)) }

      mdF_Lav_offx = mdf_sat_offx_ele_1
      if (IS_MATCH(mdf_Apertura, "DX*") )
         {
          mdF_Lav_offx = VAR_VAL(mdf_idx_pdrdi1, "X") - mdf_sat_X_ele_1-mdf_sat_offx_ele_1
         }

      mdf_sat_offy_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_", mdf_skeyReg, "_1_", mdf_Apertura) )
      if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_", mdf_skeyReg, "_1_", KeyFamRegFacc)) == 1)
         { mdf_sat_offy_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_", mdf_skeyReg, "_1_", KeyFamRegFacc) ) }
      mdF_Lav_offy = mdf_sat_offy_ele_1

      mdf_sat_Z_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_", mdf_skeyReg , "_1_", mdf_Apertura) )
      if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_", mdf_skeyReg, "_1_", KeyFamRegFacc)) == 1)
         { mdf_sat_Z_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_", mdf_skeyReg, "_1_", KeyFamRegFacc) ) }
      if (mdf_sat_Z_ele_1 == 0)  { mdf_sat_Z_ele_1 = VAR_VAL(mdf_idx_pdrdi1, "Z_eleFro") }
      mdf_sat_offz_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg , "_1_", mdf_Apertura) )
      if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg, "_1_", KeyFamRegFacc)) == 1)
         { mdf_sat_offz_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg, "_1_", KeyFamRegFacc) ) }
      mdF_Lav_offz = VAR_VAL(mdf_idx_ele_rif, "Z") - mdf_sat_Z_ele_1 + mdf_sat_offz_ele_1

      mdf_AlScocca_charReg = mdf_AlScocca
      if (FILE_EXIST(STRCAT(mdf_import_Scocca, ".sat")) != 1)
         {
          mdf_AlScocca_charReg = STRMID(0,5,mdf_AlScocca)
         // 07.05.2018
          // anta grficata sciolta
          if (STRLEN(mdf_AlScocca) < 1)
             {
              if (IS_MATCH(mdf_Apertura,"DX*MAN") )  { mdf_AlScocca_charReg = "PEANG" }
              if (IS_MATCH(mdf_Apertura,"SX*MAN") )  { mdf_AlScocca_charReg = "PEANG" }
             }
          mdf_nomeFile_sat_Sc = STRCAT(NOME(idx_att), "_", mdf_AlScocca_charReg, "_", mdf_Apertura)
          mdf_import_Scocca = STRCAT($path_file_sat_MdF, mdf_nomeFile_sat_Sc)

         // 15.05.2017
          if (FILE_EXIST(STRCAT(mdf_import_Scocca, ".sat")) != 1)
             {
              // ANGCUR
              if (STRLEN(mdf_AlScocca) > 5)
                 {
                  mdf_AlScocca_charReg = STRMID(2,6,mdf_AlScocca)
                  mdf_nomeFile_sat_Sc = STRCAT(NOME(idx_att), "_", mdf_AlScocca_charReg, "_", mdf_Apertura)
                  mdf_import_Scocca = STRCAT($path_file_sat_MdF, mdf_nomeFile_sat_Sc)
                 }
             }

          if ( VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg, "_", mdf_Apertura))
             | VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg))
             )
             {
              mdf_sat_X_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg) )
              if (mdf_sat_X_ele_1 == 0)  { mdf_sat_X_ele_1 = VAR_VAL(mdf_idx_pdrdi1, "X") }

              mdf_sat_offx_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg) )

              if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg, "_", mdf_Apertura)) )
                 { mdf_sat_offx_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg, "_", mdf_Apertura) ) }

              mdF_Lav_offx = mdf_sat_offx_ele_1

              if (IS_MATCH(mdf_Apertura, "DX*") )
                 {
                  mdF_Lav_offx = VAR_VAL(mdf_idx_pdrdi1, "X") - mdf_sat_X_ele_1-mdf_sat_offx_ele_1
                 }

              mdf_sat_offy_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_", mdf_skeyReg, "_1_", mdf_AlScocca_charReg) )
             // 15.12.2016
              if ( VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_", mdf_skeyReg, "_1_", mdf_AlScocca_charReg, "_", mdf_Apertura)) )
                 {
                  mdf_sat_offy_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_", mdf_skeyReg, "_1_", mdf_AlScocca_charReg, "_", mdf_Apertura) )
                 }

              mdF_Lav_offy = mdf_sat_offy_ele_1
             }

          if ( VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg, "_", mdf_Apertura))
             | VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg))
             )
             {
              mdf_sat_Z_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_", mdf_skeyReg , "_1_", mdf_AlScocca_charReg) )
              if (mdf_sat_Z_ele_1 == 0)  { mdf_sat_Z_ele_1 = VAR_VAL(mdf_idx_pdrdi1, "Z_eleFro") }
              mdf_sat_offz_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg , "_1_", mdf_AlScocca_charReg) )
              if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg, "_", mdf_Apertura)) )
                 { mdf_sat_offz_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg, "_", mdf_Apertura) ) }
              mdF_Lav_offz = VAR_VAL(mdf_idx_ele_rif, "Z") - mdf_sat_Z_ele_1 + mdf_sat_offz_ele_1
             }
         }

      if (FILE_EXIST(STRCAT(mdf_import_Scocca, ".sat")) != 1)
         {
          mdf_AlScocca_charReg = STRMID(2,3,mdf_AlScocca)
          mdf_nomeFile_sat_Sc = STRCAT(NOME(idx_att), "_", mdf_AlScocca_charReg, "_", mdf_Apertura)
          mdf_import_Scocca = STRCAT($path_file_sat_MdF, mdf_nomeFile_sat_Sc)
          if ( STRCMP(mdf_AlScocca_charReg, "ANP") == 0
             & VAR_VAL(mdf_idx_CamMdF, "MdF_angoloBas") == 0
             )
             { mdf_import_Scocca = "" }
         }

      if (FILE_EXIST(STRCAT(mdf_import_Scocca, ".sat")) == 1)
         {
          mdf_import = mdf_import_Scocca

          mdf_sat_X_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_X_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg) )
          if (mdf_sat_X_ele_1 == 0)  { mdf_sat_X_ele_1 = VAR_VAL(mdf_idx_pdrdi1, "X") }

          mdf_sat_offx_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg) )

          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg, "_", mdf_Apertura)) )
             { mdf_sat_offx_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offx_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg, "_", mdf_Apertura) ) }

          mdF_Lav_offx = mdf_sat_offx_ele_1

          if (IS_MATCH(mdf_Apertura, "DX*") )
             {
              mdF_Lav_offx = VAR_VAL(mdf_idx_pdrdi1, "X") - mdf_sat_X_ele_1-mdf_sat_offx_ele_1
             }

          mdf_sat_offy_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offy_", mdf_skeyReg, "_1_", mdf_AlScocca_charReg) )
          mdF_Lav_offy = mdf_sat_offy_ele_1

          mdf_sat_Z_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_Z_", mdf_skeyReg , "_1_", mdf_AlScocca_charReg) )
          if (mdf_sat_Z_ele_1 == 0)  { mdf_sat_Z_ele_1 = VAR_VAL(mdf_idx_pdrdi1, "Z_eleFro") }
          //mdF_Lav_offz = VAR_VAL(mdf_idx_pdrdi1, "Z") - mdf_sat_Z_ele_1
          mdf_sat_offz_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg , "_1_", mdf_AlScocca_charReg) )
          if (VAR_EXIST(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg, "_", mdf_Apertura)) )
             { mdf_sat_offz_ele_1 = VAR_VAL(PADRE(idx_MdF, 1), STRCAT("mdf_sat_offz_", mdf_skeyReg ,"_1_", mdf_AlScocca_charReg, "_", mdf_Apertura) ) }
          mdF_Lav_offz = VAR_VAL(mdf_idx_ele_rif, "Z") - mdf_sat_Z_ele_1 + mdf_sat_offz_ele_1
         }
   }

   PROCEDURA mdf_Visualize
   {
      mdf_Visualize_std = 1
      if (STRLEN(RegFacc_Visualizza) > 1)
         {
          escl_Grafica = 1
          if ( STR_INDEX_OF(RegFacc_Visualizza, 0, $MdF_Visualize) > -1
             | STR_INDEX_OF($MdF_Visualize, 0, RegFacc_Visualizza) > -1
             )
             { escl_Grafica = 0 }

          if (STRCMP($MdF_Visualize, "") == 0)            { escl_Grafica = 1 }
          if (STRCMP(RegFacc_Visualizza, "Always") == 0)  { escl_Grafica = 0 }
         }

      if (STRCMP($MdF_Visualize, "0") == 0)       { escl_Grafica = 1 }
      if (STRCMP($MdF_Visualize, "Always") == 0)  { escl_Grafica = 0 }

      cam_KeyRegMdF = VAR_VAL_STR(PADRE(idx_att, 1), "CHIAVE_TABVAR_MDF")
      if (STRLEN(cam_KeyRegMdF) < 1)  { cam_KeyRegMdF = VAR_VAL_STR(PADRE(idx_att, 2), "cam_KeyRegMdF") }
      if (STRLEN(cam_KeyRegMdF) < 1)  { cam_KeyRegMdF = VAR_VAL_STR(PADRE(idx_att, 3), "cam_KeyRegMdF") }
      if (STRLEN(cam_KeyRegMdF) < 1)  { cam_KeyRegMdF = STRMID(0, 6, VAR_VAL_STR(PADRE(idx_att, 2), "CHIAVE_TABVAR_MDF")) }
      if (STRLEN(cam_KeyRegMdF) < 1)  { cam_KeyRegMdF = STRMID(0, 6, VAR_VAL_STR(PADRE(idx_att, 3), "CHIAVE_TABVAR_MDF")) }

      if (STRLEN($MdF_Utente) > 1)
         {
          if (STR_INDEX_OF($MdF_Utente, 0, cam_KeyRegMdF) > -1)  { escl_Grafica = 0 }
         }
      else
         {
          if (VAR_VAL(idx_att, "mdf_modif_Ute") != 0)            { escl_Grafica = 0 }
          if (VAR_VAL(PADRE(idx_att, 1), "mdf_modif_Ute") != 0)  { escl_Grafica = 0 }
         }

      // 02.03.2022
      // Se ho grafica già da Bdm e quindi non voglio che nemmeno con Always esca niente MdF_Visualize_sat="No" non fa vedere il sat
      // ma mi resterebbe il cilindro-Cer e il rettangolo-basetta
      // e non e' nemmeno lineare gestire con MCB_Vis_CerBat e MCB_Vis_BasBat che comunque con Always fin' ora non erano considereati lo stesso
      if (STRCMP(RegFacc_Visualizza, "Bdm") == 0)  { escl_Grafica = 1 }

     // Un po specifica da conversione vecchio. Si può togliere e impotare su cam.ini MdF_Visualize="CerBat"
      if (IS_MATCH(NOME(idx_att), "MdF_CernieraBatt") )
         {
          if (STRCMP($MdF_Visualize, "Always") != 0)
             {
              if (VAR_EXIST(PADRE(idx_att, 2), "MCB_Vis_CerBat") )
                 { escl_Grafica = 1-VAR_VAL(PADRE(idx_att, 2), "MCB_Vis_CerBat") }
             }
         }
      if (IS_MATCH(NOME(idx_att), "MdF_BasettaSXDX") )
         {
          if (STRCMP($MdF_Visualize, "Always") != 0)
             {
              if (VAR_EXIST(PADRE(idx_att, 2), "MCB_Vis_BasBat") )
                 { escl_Grafica = 1-VAR_VAL(PADRE(idx_att, 2), "MCB_Vis_BasBat") }
             }
         }
      if (VAR_VAL(-1, "CAM_Visualize") == -1)
         {
          $CAM_Visualize = ATOI(SUBST_LABEL(READ_INI2("CAMCAB", "CAM_Visualize", $MdF_path_camini)))
         }
      mdf_Visualize_std = escl_Grafica

      if (VAR_VAL(-1, "CAM_Visualize") > 0)  { escl_Grafica = 0 }
   }

   PROCEDURA mdf_ShowAbilitaOff_Interat
   {
      if (VAR_VAL(idx_att, "mdf_add_now_MdF_ADD_Reg_Interat") == 0)
         {
          if (mdf_Esegui_Show_Abilita > 0)
             {
              if (mdf_Load_COMANDO2 == 0)
                 { COMANDO(STRCAT("SHOW Abilita Off   // MdF_ADD_Reg_Interat idx=", STR(idx_att), " ", NOME(idx_att))) }
              else
                 { COMANDO2(STRCAT("SHOW Abilita Off   // MdF_ADD_Reg_Interat idx=", STR(idx_att), " ", NOME(idx_att))) }
             }
         }
   }

  // 13.03.2024
   PROCEDURA mdf_ShowAbilitaOff_ADD_sat
   {
      if (mdf_eliminato_e_reADD == 0)
         {
          if (VAR_VAL(-1, "OnLoadOrder2") == 0)
             {
              COMANDO2(STRCAT("SHOW Abilita Off   // mdf_ADD_sat idx=", STR(idx_att), " ", NOME(idx_att)))
             }
         }
   }

   PROCEDURA mdf_Set_MdFRef
   {
      mdfis = 1
      while (mdfis <= mdf_elementoBdm)
         {
          if (VAR_EXIST(mdf_elementoBdm[mdfis], "id_Cer") != 1)
             {
              VAR_CREATE_NUM(mdf_elementoBdm[mdfis], "idx_MdFRef", idx_att, 0, "")
              VAR_CREATE_NUM(mdf_elementoBdm[mdfis], "id_Cer", VAR_VAL(idx_att, "id_Cer"), 0, "")
              VAR_CREATE_STR(mdf_elementoBdm[mdfis], "MdF_Apertura", mdf_Apertura, 0, "")
             }
          mdfis = mdfis+1
         }
   }

  // 21.11.2024
   PROCEDURA mdf_Ctrl_Change_import
   {
      if (VAR_EXIST(idx_att, "miCCi") != 1)  { miCCi = 1 }

      if (mdf_elementoBdm > 0)
         {
          import_ele_sat_att = VAR_VAL_STR(mdf_elementoBdm[miCCi], "import")

          id_Cer_Ele = VAR_VAL(mdf_elementoBdm[miCCi], "id_Cer")

          mCtrl_idx_BasRibVAPI = 1
          if (STRCMP(NOME(idx_att), "MdF_BasettaVasRib") == 0)
             {
              if (VAR_EXIST(mdf_elementoBdm[miCCi], "idx_BasRibVAPI") != 1)
                 { mCtrl_idx_BasRibVAPI = 0 }
             }

         // 09.12.2024 1057106
          if (VAR_EXIST(mdf_elementoBdm[miCCi], "idx_BasRibVAPI") == 1)
             {
              if (VAR_VAL(mdf_elementoBdm[miCCi], "idx_BasRibVAPI") != idx_att)
                 { mCtrl_idx_BasRibVAPI = -0.1 }
             }

          mCtrl_offy_prec = 0
          if (VAR_EXIST(idx_att, "mdF_Lav_offy_prec") == 1)
             {
              if (VAR_VAL(idx_att, "mdF_Lav_offy_prec") != VAR_VAL(idx_att, "mdF_Lav_offy"))
                 {
                  mdF_Lav_offy_prec = mdF_Lav_offy
                  mCtrl_offy_prec = 1
                 }
             }

          if ( STRLEN(import_ele_sat_att) > 0
             & mCtrl_idx_BasRibVAPI > 0
             )
             {
              mdf_ctrl_change_sat = 0
              mdf_ctrl_change_Var_CAM_att = VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM")
              if (VAR_EXIST(PADRE(idx_att, 2), "MdF_Ctrl_var_gest_MdF") != 1)
                 {
                  if ( STRCMP(VAR_VAL_STR(mdf_elementoBdm[miCCi], "mdf_Apertura"), VAR_VAL_STR(idx_MdF, "MdF_Apertura")) != 0
                     // 24.01.2025
                     //| STRCMP(mdf_import, import_ele_sat_att) != 0
                     )
                     {
                     // 27.01.2025 Aggiunto UPPER per \sat o \Sat
                      if ( STRCMP(UPPER(mdf_import), UPPER(import_ele_sat_att)) != 0
                         // Aggiunto anche _2 _3
                         // IS_MATCH sembra non funzionare con la \ ma comunque si può fare così
                         & STRCMP(UPPER(import_ele_sat_att), UPPER(STRCAT(mdf_import, "_2"))) != 0
                         & STRCMP(UPPER(import_ele_sat_att), UPPER(STRCAT(mdf_import, "_3"))) != 0
                         )
                         {
                          mdf_ctrl_change_sat = 1
                          import_ele_sat_att_Ctrl = VAR_VAL_STR(mdf_elementoBdm[miCCi], "import")
                          import_ele_sat_att_idx = mdf_elementoBdm[miCCi]
                          import_ele_sat_att_att = import_ele_sat_att
                          // 24.01.2025
                          if ( IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "VAPI*")
                             | IS_MATCH(VAR_VAL_STR(idx_MdF, "MdF_Apertura"), "VAP*S*")
                             )
                             {
                              if ( STRCMP(UPPER(mdf_import), UPPER(import_ele_sat_att)) == 0
                                 | STRCMP(UPPER(import_ele_sat_att), UPPER(STRCAT(mdf_import, "_2"))) == 0
                                 | STRCMP(UPPER(import_ele_sat_att), UPPER(STRCAT(mdf_import, "_3"))) == 0
                                 )
                                 {
                                  mdf_ctrl_change_sat = -0.2
                                  import_ele_sat_att_Ctrl = VAR_VAL_STR(mdf_elementoBdm[miCCi], "import")
                                  import_ele_sat_att_idx = mdf_elementoBdm[miCCi]
                                 }
                             }
                         }
                     }
                 }
              else
                 {
                  if (mCtrl_offy_prec > 0)  { mdf_ctrl_change_sat = 2 }

                  if (STRCMP(mdf_import, import_ele_sat_att) != 0)
                     {
                      // 27.01.2025 Aggiunto UPPER per \sat o \Sat
                      if ( STRCMP(UPPER(mdf_import), UPPER(import_ele_sat_att)) != 0
                         & STRCMP(UPPER(import_ele_sat_att), UPPER(STRCAT(mdf_import, "_2"))) != 0
                         & STRCMP(UPPER(import_ele_sat_att), UPPER(STRCAT(mdf_import, "_3"))) != 0
                         )
                         {
                          if (VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") > 0)
                             { mdf_ctrl_change_sat = 2.1 }
                         }
                     }
                 }
              if (mdf_ctrl_change_sat > 0)
                 {
                  GOSUB mdf_ShowAbilitaOff_ADD_sat
                  mdf_eliminato_e_reADD = 1
                  COMANDO2(STRCAT("ELIMINA ", STR(mdf_elementoBdm[miCCi]), " // mdf_ADD_sat mdf_Ctrl_Change_import ", NOME(mdf_elementoBdm[miCCi]), " pdrDi3=", STR(PADRE(idx_att, 3)), " mdf_ctrl_change_sat=", STR(mdf_ctrl_change_sat), " ..", STR(mdf_ctrl_change_Var_CAM_att)))
                  mdf_import_sat_att = mdf_import
                  if (VAR_VAL(PADRE(idx_att, 2), "mdf_ctrl_Change_Var_CAM") > 100)
                     { COMANDO2(STRCAT("LOGMSG mdf_ADD_sat mdf_Ctrl_Change_import ", NOME(mdf_elementoBdm[miCCi]), " import_ele_sat_att=", import_ele_sat_att, " mdf_import_sat_att=", mdf_import_sat_att)) }
                  mdf_elementoBdm = 0
                 }
             }
         }
   }

   PROCEDURA MdF_Ctrl_GEST_Config
   {
      if (VAR_EXIST(idx_att, "mdf_Ctrl_var_GEST_Configured") == 1)
         {
          // Per ora in questo modo il controllo lo farebbe solo una volta
          mdf_Ctrl_var_GEST_Configured = mdf_Ctrl_var_GEST_Configured+100
          if (CMD() == 1  |  ACTION() == 1)  { EXITSUB() }
         }

      if (VAR_EXIST(idx_att, "mdf_Ctrl_var_GEST_Configured") != 1)
         { mdf_Ctrl_var_GEST_Configured = 0.5 }

      if (VAR_EXIST(idx_att, "MdF_name_var_GEST_Apertura") != 1)  { EXITSUB() }

      if ( VAR_EXIST(idx_att, MdF_name_var_GEST_Apertura) != 1
         & VAR_EXIST(PADRE(idx_att, 1), MdF_name_var_GEST_Apertura) != 1
         & VAR_EXIST(PADRE(idx_att, 2), MdF_name_var_GEST_Apertura) != 1
         & VAR_EXIST(PADRE(idx_att, 3), MdF_name_var_GEST_Apertura) != 1
         )
         {
          if (IS_MATCH(VAR_VAL_STR(idx_att, "Apertura"), "BA") == 1)
             {
              mdf_Ctrl_var_GEST_Configured = -0.6
             }
         }

      mdf_idx_var_gest_ap = idx_att
      if (VAR_EXIST(mdf_idx_var_gest_ap, MdF_name_var_GEST_Apertura) != 1)
         {
          mdf_idx_var_gest_ap = PADRE(mdf_idx_var_gest_ap, 1)
          if (VAR_EXIST(mdf_idx_var_gest_ap, MdF_name_var_GEST_Apertura) != 1)
             {
              mdf_idx_var_gest_ap = PADRE(mdf_idx_var_gest_ap, 2)
              if (VAR_EXIST(mdf_idx_var_gest_ap, MdF_name_var_GEST_Apertura) != 1)
                 {
                  mdf_idx_var_gest_ap = PADRE(mdf_idx_var_gest_ap, 3)
                 }
             }
         }

      if (VAR_EXIST(mdf_idx_var_gest_ap, MdF_name_var_GEST_Apertura) )
         {
          mdf_Ctrl_var_GEST_Configured = mdf_Ctrl_var_GEST_Configured+1

          if (VAR_EXIST(idx_att, "gest_var_Apertura_Init") != 1)
             { gest_var_Apertura_Init = VAR_VAL_STR(mdf_idx_var_gest_ap, MdF_name_var_GEST_Apertura) }

          if ( IS_MATCH(VAR_VAL_STR(mdf_idx_var_gest_ap, MdF_name_var_GEST_Apertura), "__") == 1
             | IS_MATCH(VAR_VAL_STR(mdf_idx_var_gest_ap, MdF_name_var_GEST_Apertura), "_") == 1
             | IS_MATCH(VAR_VAL_STR(mdf_idx_var_gest_ap, MdF_name_var_GEST_Apertura), "") == 1
             | IS_MATCH(VAR_VAL_STR(mdf_idx_var_gest_ap, MdF_name_var_GEST_Apertura), " ") == 1
             )
             { mdf_Ctrl_var_GEST_Configured = -1 }
         }
   }

   PROCEDURA mdfsys_Collision_att
   {
      mdfsys_Collision1_att = VAR_VAL(idx_att, "MdfSys_Collision1")
      mdfsys_Collision2_att = VAR_VAL(idx_att, "MdfSys_Collision2")
      mdfsys_Collision3_att = VAR_VAL(idx_att, "MdfSys_Collision3")
      mdfsys_Collision4_att = VAR_VAL(idx_att, "MdfSys_Collision4")
      mdfsys_Collision5_att = VAR_VAL(idx_att, "MdfSys_Collision5")
      mdfsys_Collision6_att = VAR_VAL(idx_att, "MdfSys_Collision6")
      mdfsys_Collision7_att = VAR_VAL(idx_att, "MdfSys_Collision7")
      mdfsys_Collision8_att = VAR_VAL(idx_att, "MdfSys_Collision8")

     // 18.05.2021 Sc1049559
      // Come MdF_CerBat_Collision_Post.
      // Se MdF_Ctrl_Cer_ChangeUte eseguito a fine caricamento ordine e cambia la Y dell' elemento in collisione, si sistema lo sposta e il CAM,
      // ma graficamente non si spostano le cerniere senza un ricalcola
      mdfsys_Collision1_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision1_y_mm")
      mdfsys_Collision2_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision2_y_mm")
      mdfsys_Collision3_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision3_y_mm")
      mdfsys_Collision4_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision4_y_mm")
      mdfsys_Collision5_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision5_y_mm")
      mdfsys_Collision6_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision6_y_mm")
      mdfsys_Collision7_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision7_y_mm")
      mdfsys_Collision8_y_mm_att = VAR_VAL(idx_att, "MdfSys_Collision8_y_mm")

     // 13.03.2025
      mdfsys_collY_sposta1_att = VAR_VAL(idx_att, "MdfSys_collY_sposta1")
      mdfsys_collY_sposta2_att = VAR_VAL(idx_att, "MdfSys_collY_sposta2")
      mdfsys_collY_sposta3_att = VAR_VAL(idx_att, "MdfSys_collY_sposta3")
      mdfsys_collY_sposta4_att = VAR_VAL(idx_att, "MdfSys_collY_sposta4")
      mdfsys_collY_sposta5_att = VAR_VAL(idx_att, "MdfSys_collY_sposta5")
      mdfsys_collY_sposta6_att = VAR_VAL(idx_att, "MdfSys_collY_sposta6")
      mdfsys_collY_sposta7_att = VAR_VAL(idx_att, "MdfSys_collY_sposta7")
      mdfsys_collY_sposta8_att = VAR_VAL(idx_att, "MdfSys_collY_sposta8")
   }

   // Ca 2448216
   PROCEDURA MdF_Ctrl_Battuta_X_da_Fia
   {
       if (VAR_EXIST(ATTUALE(), "idx_agg") != 1)  { EXITSUB() }

       MdF_WITH_ALIAS_att("mdf_Ctrl_PostFia", "MdF_CerBat", idx_agg)
       iMd=1
       while (iMd <= VAR_VAL(idx_agg, "mdf_Ctrl_PostFia") )
          {
           varCtrl = STRCAT("mdf_Ctrl_PostFia_##", STR(iMd))
           mdfidxCtrl = VAR_VAL(idx_agg, varCtrl)
           exitBattuta_SX_CamMdF = VAR_VAL(PADRE(mdfidxCtrl, 1), "exitBattuta_SX")
           exitBattuta_DX_CamMdF = VAR_VAL(PADRE(mdfidxCtrl, 1), "exitBattuta_DX")
           exitBattuta_SX_MdF = VAR_VAL(mdfidxCtrl, "exitBattuta_SX")
           exitBattuta_DX_MdF = VAR_VAL(mdfidxCtrl, "exitBattuta_DX")

           mdf_angoloBas = VAR_VAL(mdfidxCtrl, "MdF_angoloBas")

           idx_FiaValid = 0
           // Potrebbe prendere il fianco figlio
           if (IS_IDX(exitBattuta_SX_CamMdF) )  { idx_FiaValid = 1 }
           if (IS_IDX(exitBattuta_DX_CamMdF) )  { idx_FiaValid = 2 }
           if (IS_IDX(exitBattuta_SX_MdF) )     { idx_FiaValid = 3 }
           if (IS_IDX(exitBattuta_DX_MdF) )     { idx_FiaValid = 4 }

           if (idx_FiaValid == 0  &  ABS(mdf_angoloBas) != 90)
              {
               COMANDO(STRCAT("Procedura MdF_Ctrl_Cambiamenti ", STR(mdfidxCtrl), " // Ctrl_Agg_Fia da=", STR(ATTUALE()), " OnRigenera=", STR($OnRigenera), " OnLoadOrder=", STR($OnLoadOrder), " OnLoadOrder2=", STR($OnLoadOrder2)))
              }
           iMd = iMd+1
          }
   }

   PROCEDURA MdF_Ingom_Fia
   {
       mdf_Ingom_fia = 0
       if ( IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 1)), "*Fia*") == 1
          // 10.06.2020
          & PADRE(Fianchi_vic[iX], 1) != Fianchi_vic[iX]
          )
          {
           if ( IS_MATCH(NOME(Fianchi_vic[iX]), "Ingombro*Fianco*") == 1
              | IS_MATCH(NOME(Fianchi_vic[iX]), "*Fia*Ctrl*") == 1
              // 01.06.2020
              | IS_MATCH(NOME(Fianchi_vic[iX]), "Mas*Fia*") == 1
              // 10.06.2020
              | STR_INDEX_OF(NOME(Fianchi_vic[iX]), 0, NOME(PADRE(Fianchi_vic[iX], 1))) > -1
              // 10.07.2020
              | IS_MATCH(NOME(Fianchi_vic[iX]), "*Fia*graf*") == 1
              )
              {
               mdf_Ingom_fia = 1
              // 20.03.2025 H 21048401 Sbagliata grafica Bdm
               if ( VAR_VAL(PADRE(Fianchi_vic[iX], 1), "Y") != VAR_VAL(Fianchi_vic[iX], "Y")
                  & Battuta_X == 0
                  )
                  { mdf_Ingom_fia = 0 }
              }
          // 17.10.2024 Ce
           if (IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 1)), "Fia*") == 1)
              {
                if (IS_MATCH(NOME(Fianchi_vic[iX]), "grf_Fia*") == 1)
                   { mdf_Ingom_fia = 1.1 }
              }
          }
       // 06.08.2020
       if (IS_MATCH(NOME(Fianchi_vic[iX]), "Graf*Fia*") == 1  &  VAR_VAL(Fianchi_vic[iX], "X") < 6)
          {
           if (IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 2)), "*Fia*") == 1)
              { mdf_Ingom_fia = 2 }
          }
      // 23.06.2023
       if (IS_MATCH(NOME(Fianchi_vic[iX]), "Geom*Fia*") == 1)
          {
           forma = FORMA(Fianchi_vic[iX])
           if ( IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 1)), "*Fia*") == 1
              // Per ora aggiungo anche controllo su forma, ma probabilmente non serve
              & forma == 2
              )
              { mdf_Ingom_fia = 2.1 }
          }
      // 17.01.2025
       if ( IS_MATCH(NOME(Fianchi_vic[iX]), "*Copri*ia*") == 1
          | IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 1)), "*Copri*ia*") == 1
          )
          {
           if (VAR_VAL(Fianchi_vic[iX], "X") <= 12)
              { mdf_Ingom_fia = 2.2 }
          }
      // 19.05.2021 FiancoChiusura in accosto a Colonne Slide che hanno la Battuta_X a 71 sul FiancoInterno
       if (STRLEN(mdF_arch_NO_BatFia) > 2)
          {
           if (IS_MATCH(NOME(Fianchi_vic[iX]), mdF_arch_NO_BatFia) == 1)
              { mdf_Ingom_fia = 3 }

          // 09.02.2024 Se è usato l' archetipo fianco in Scocche che non dovrebbe fare da Fianco Battuta, esempio Riempitivi
           if (IS_MATCH(NOME(PADRE(Fianchi_vic[iX], 1)), mdF_arch_NO_BatFia) == 1)
              { mdf_Ingom_fia = 4 }
          }
      // 13.02.2024
       if (VAR_VAL(Fianchi_vic[iX], "X") < 5)  { mdf_Ingom_fia = 5 }
   }
}

// 21.09.2023
Funzioni
{
   number MdF_IS_MATCH_LIST ( string StrgToCtrl, string ListToMatch )
   {
      // esegue IS_MATCH( ) per una lista di valori separati da mdfchar "|"
      // restituisce 1 se trova almeno un match
      Result = 0
      mdfstr_input = ListToMatch
      // 22.09.2023 Con | per uniformita con VarStrMatch e per ricordarsi che sono in OR
      mdfchar = "|"
      GOSUB MdF_EstraiStringheSep
      mi_IML = 1
      while (mi_IML <= mdf_array_Stringhe)
         {
          mi_str_parz_check = mdf_array_Stringhe[mi_IML]
          if (IS_MATCH(StrgToCtrl, mi_str_parz_check) > 0)
             {
              Result = mi_IML
              EXITSUB( )
             }
          mi_IML = mi_IML + 1
         }
   }

  // 15.11.2024
   void MdF_WITH_ALIAS_att ( string NomeArray, string NomeAlias, number idx )
   {
      COMPONENTI2("wk_mdf_comps", idx, "*")
      mdfi = 1  mdfj = 0
      while(mdfi <= wk_mdf_comps)
         {
          if (HAS_ALIAS(wk_mdf_comps[mdfi], NomeAlias) )
             {
              mdfj = mdfj+1
              VAR_CREATE_NUM(idx, STRCAT(NomeArray, "_##", STR(mdfj)), wk_mdf_comps[mdfi], 0, "")
             }
          mdfi = mdfi+1
         }
      VAR_CREATE_NUM(idx, NomeArray, mdfj, 0, "")
   }

   void MdF_WITH_ALIAS_att_ESCL ( string NomeArray, string NomeAlias, number idx )
   {
      COMPONENTI3("wk_mdf_comps", idx, "*")
      mdfi = 1  mdfj = 0
      while(mdfi <= wk_mdf_comps)
         {
          if (HAS_ALIAS(wk_mdf_comps[mdfi], NomeAlias) )
             {
              mdfj = mdfj+1
              VAR_CREATE_NUM(idx, STRCAT(NomeArray, "_##", STR(mdfj)), wk_mdf_comps[mdfi], 0, "")
             }
          mdfi = mdfi+1
         }
      VAR_CREATE_NUM(idx, NomeArray, mdfj, 0, "")
   }
}
