-- BeamData.lua by Egaltech s.r.l. 2023/05/12
-- Raccolta dati generali per Travi

EgtOutLog( ' PF1500rl-BeamData started')

-- Tabella per definizione modulo
local BeamData = {
   RIGHT_LOAD = true,                       -- flag carico da destra
   SIMUL_VIEW_DIR = 1,                      -- direzione di vista predefinita per la simulazione (1=NW, 2=SW, 3=NE, 4=SE)
   MIN_WIDTH = 40,                          -- larghezza minima del grezzo
   MIN_HEIGHT = 40,                         -- altezza minima del grezzo
   MAX_WIDTH = 1505,                        -- larghezza massima del grezzo
   MAX_HEIGHT = 605,                        -- altezza massima del grezzo
   LEN_SHORT_PART = 1200,                   -- lunghezza massima pezzo piccolo
   MAX_RAW = 20000,                         -- massima lunghezza grezzo (deve essere minore di LenTable - RAW_OFFSET)
   STD_RAW = 14000,                         -- lunghezza standard della barra di grezzo
   OVM_HEAD = 10,                           -- sovramateriale testa
   OVM_MID = 5.4,                           -- sovramateriale intermedio (spessore lama)
   MIN_JOIN_S = 100,                        -- minima presa pinza per pezzo piccolo
   MIN_JOIN_L = 450,                        -- minima presa pinza per pezzo grande
   MINRAW_S = 980,                          -- minimo grezzo in coda scaricabile per sezioni piccole
   MINRAW_L = 1680,                         -- minimo grezzo in coda scaricabile per sezioni grandi
   CHAR_EXTRA_DIST = 400,                   -- distanza aggiuntiva per minimizzare scambi di carrelli
   CHAR_LOAD_DIST = 3000,                   -- distanza suggerita di presa della pinza dalla testa trave al carico
   MAX_LEN_SCRAP = 150,                     -- massima lunghezza scarto di coda
   MAX_LEN_SCRAP_START = 150,               -- massima lunghezza scarto di testa
   MAX_DIM_HTCUT = 185,                     -- larghezza massima taglio di testa o coda
   MAX_DIM_HTCUT_HBEAM = 185,               -- larghezza massima taglio di testa o coda con trave alta
   MIN_DIM_HBEAM = 610,                     -- altezza minima di trave alta
   OVM_CHAIN_HBEAM = 8,                     -- sovramateriale per split con sega a catena
   MAX_DIM_DICE = 155,                      -- dimensione trasversale massima cubetto
   MAX_LEN_DICE = 400,                      -- lunghezza massima cubetto
   DECR_VERT_CUT = 25,                      -- riduzione profondità per affondamento verticale in taglio orizzontale
   COLL_SIC = 5,                            -- distanza di sicurezza per collisioni
   CUT_SIC = 28,                            -- distanza di sicurezza per tagli
   CUT_EXTRA = 5,                           -- affondamento extra standard per tagli di lama e fresature
   CUT_EXTRA_MIN = 2,                       -- affondamento extra ridotto per tagli di lama e fresature
   CUT_VZ_MIN = -0.484,                     -- componente limite in Z del versore di un taglio (-61deg)
   NZ_MINA = -0.6,                          -- componente limite in Z normale di una faccia (-30deg)
   NZ_MINB = -0.4,                          -- componente limite in Z normale di un insieme di facce (-23deg)
   DRILL_TOL = 0.2,                         -- tolleranza tra diametro foro e diametro punta
   DRILL_VZ_MIN = - 0.51,                   -- componente limite in Z del versore di un foro
   DRILL_VX_MAX = 0.867,                    -- componente limite in X del versore di un foro sulle facce laterali
   DRILL_OVERLAP = 5,                       -- sovrapposizione tra due mezze forature
   MILL_OVERLAP = 5,                        -- sovrapposizione tra due mezze fresature
   MAX_DIST_HTFEA = 50.0,                   -- massima distanza di feature da testa o coda per essere considerata tale
   MAX_LEN_HTFEA = 2550.0,                  -- massima lunghezza di feature di testa o coda
   LONGCUT_ENDLEN = 1500,                   -- lunghezza lavoro estremi iniziale e finale
   LONGCUT_MAXLEN = 3000,                   -- lunghezza massima sezione di taglio longitudinale
   MAX_LEN_RIDGELAP_FROM_BOTTOM = 0,        -- massima lunghezza ridgelap lavorabile da sotto
   MAX_LEN_RIDGELAP_FROM_BOTTOM_HBEAM = 0,  -- massima lunghezza ridgelap lavorabile da sotto con trave alta
   DIM_TO_CENTER_STRIP = 0,                 -- larghezza minima trave per inserimento codolo nel centro della trave; 0 = automatico
   DIM_STRIP = -1,                          -- dimensione codolo sostegno parti lasciate su contorno libero o archi
   DIM_STRIP_SMALL = 2,                     -- dimensione codolo piccolo (quando le parti sostenute sono sicuramente sulla parte sopra del pezzo)
   RAWCOL = { 255, 160, 32, 30},            -- colore del grezzo
   RAW_OFFSET = 2000,                       -- spostamento grezzo rimanente dopo split
   VICE_MINH = 110,                         -- altezza minima della morsa
   OFFSET_DRILL_TENON = 0,                  -- offset fori su tenoni verso base degli stessi (0=non fare)
   USER_HOLE_DIAM = 0,                      -- diametro foro per L20
   MAX_TOOL_LEN_FOR_HOR_MACH = 600,         -- massima lunghezza ingombro per poter fare forature (fresature) oltre i 10 gradi dalla verticale
   DRILL_VZ_MIN_LONG_TOOL = 0.984,          -- componente limite per lavorazioni con punta lunga
   MAX_TOOL_LEN_BACK_HOR_MACH = 600,        -- massima lunghezza utensile per poter eseguire lavorazioni (forature/svuotature) da dietro (faccia 4)
   MIN_LEN_LAMELLO = 1000,                  -- lunghezza minima di fessura longitudinale per lavorazione tipo lamello (SideMillAsBlade)
   PRESS_ROLLER = true,                     -- dichiarazione presenza rulli pressori
   C_SIMM = true,                           -- dichiarazione simmetria mensola asse C
   C_SIMM_ENC = 180,                        -- ingombro semi-forcella in X da naso mandrino (compresa sicurezza)
   DOWN_HEAD = true,                        -- dichiarazione presenza seconda testa dal basso
   DH_MAX_TOP = 370,                        -- quota massima raggiungibile dalla testa da sotto dal sotto del pezzo
   KIOTP = 2,                               -- coefficiente moltiplicativo per attacco/uscita lama tangente anzichè perpendicolare
   MAXDIAM_POCK_CORNER = 30,                -- diametro massimo utensile ammesso per tasche con angoli interni
   USE_LONGCUT = true,                      -- per i tagli longitudinali usare solo la lavorazione di lama LongCut
   ADVANCE_TAIL_CUT = true,                 -- per spostare prima del taglio di separazione il taglio di coda su pezzi corti con robabile caduta
   ADVANCE_TAIL_OFFS = 5,                   -- accorciamento taglio di coda avanzato (minimo 1)
   DOUBLE_HEAD_DOVETAIL = true,             -- flag abilitazione lavorazione mortase a coda di rondine in doppio
   DOUBLE_HEAD_MORTISE = true,              -- flag abilitazione lavorazione mortase in doppio
   DOUBLE_HEAD_DRILLING = true,             -- flag abilitazione forature in doppio
   USE_MULTI_DRILL = false,                  -- flag abilitazione gruppo a forare
}

---------------------------------------------------------------------
-- Aggiornamento con dati da TechnoEssetre7
local sTs3Data = EgtGetStringFromIni( 'Beam', 'DATA_DIR', "C:\\TechnoEssetre7\\EgtData", EgtGetIniFile()).."\\Essetre-PF1500rl.data"
local sDataBeam = EgtGetCurrMachineDir().."\\Beam\\Ts3Data.lua"
if EgtExistsFile( sTs3Data) then
   EgtCopyFile( sTs3Data, sDataBeam)
   local sTs3DataOld = sTs3Data..'.old'
   EgtEraseFile( sTs3DataOld)
   EgtRenameFile( sTs3Data, sTs3DataOld)
end
if EgtExistsFile( sDataBeam) then
   local Machine = dofile( sDataBeam)
   if Machine then
      if Machine.Offsets then
         if Machine.Offsets.DOUBLE_HEAD_DOVETAIL then BeamData.DOUBLE_HEAD_DOVETAIL = ( Machine.Offsets.DOUBLE_HEAD_DOVETAIL == 1) end
         if Machine.Offsets.DOUBLE_HEAD_MORTISE then BeamData.DOUBLE_HEAD_MORTISE = ( Machine.Offsets.DOUBLE_HEAD_MORTISE == 1) end
         if Machine.Offsets.DOUBLE_HEAD_DRILLING then BeamData.DOUBLE_HEAD_DRILLING = ( Machine.Offsets.DOUBLE_HEAD_DRILLING == 1) end
         BeamData.MINRAW_S = max( BeamData.MINRAW_S, Machine.Offsets.MINRAW_S or BeamData.MINRAW_S)
         BeamData.MINRAW_L = max( BeamData.MINRAW_L, Machine.Offsets.MINRAW_L or BeamData.MINRAW_L)
         BeamData.CUT_EXTRA = Machine.Offsets.CUT_EXTRA or BeamData.CUT_EXTRA
         BeamData.CUT_EXTRA_MIN = Machine.Offsets.CUT_EXTRA_MIN or BeamData.CUT_EXTRA_MIN
         BeamData.DIM_STRIP_SMALL = Machine.Offsets.DIM_STRIP_SMALL or BeamData.DIM_STRIP_SMALL
         BeamData.DIM_TO_CENTER_STRIP = Machine.Offsets.DIM_TO_CENTER_STRIP or BeamData.DIM_TO_CENTER_STRIP
         BeamData.MAXDIAM_POCK_CORNER = Machine.Offsets.MAXDIAM_POCK_CORNER or BeamData.MAXDIAM_POCK_CORNER
      end
      if Machine.Trave then
         BeamData.MIN_WIDTH = Machine.Trave.XMIN or BeamData.MIN_WIDTH
         BeamData.MIN_HEIGHT = Machine.Trave.ZMIN or BeamData.MIN_HEIGHT
         BeamData.MAX_WIDTH = Machine.Trave.XMAX or BeamData.MAX_WIDTH
         BeamData.MAX_HEIGHT = Machine.Trave.ZMAX or BeamData.MAX_HEIGHT
      end
      if Machine.User then
         BeamData.OFFSET_DRILL_TENON = Machine.User.L040_OFFSET_P1 or BeamData.OFFSET_DRILL_TENON
         if Machine.User.OPTIMIZATIONS_ENABLE_SLICES_F5 == 1 then
            BeamData.MAX_LEN_SCRAP = Machine.User.OPTIMIZATIONS_LENGTH_SLICES or BeamData.MAX_LEN_SCRAP
         else
            BeamData.MAX_LEN_SCRAP = 100000
         end
         if Machine.User.OPTIMIZATIONS_ENABLE_SLICES_F6 == 1 then
            BeamData.MAX_LEN_SCRAP_START = Machine.User.OPTIMIZATIONS_LENGTH_SLICES or BeamData.MAX_LEN_SCRAP_START
         else
            BeamData.MAX_LEN_SCRAP_START = 100000
         end
         BeamData.USER_HOLE_DIAM = Machine.User.L020_DIAM_HOLE or BeamData.USER_HOLE_DIAM
      end
   end
end

---------------------------------------------------------------------
local function GetMaxLenRidgeLapFromBottom( dHRaw)
   if dHRaw < BeamData.MIN_DIM_HBEAM then
      return BeamData.MAX_LEN_RIDGELAP_FROM_BOTTOM + 0.01
   else
      return BeamData.MAX_LEN_RIDGELAP_FROM_BOTTOM_HBEAM + 0.01
   end
end
BeamData.GetMaxLenRidgeLapFromBottom = GetMaxLenRidgeLapFromBottom

---------------------------------------------------------------------
local function GetBottomToolMaxTotLen( vtDir)
   return 310
end
BeamData.GetBottomToolMaxTotLen = GetBottomToolMaxTotLen

---------------------------------------------------------------------
local function GetSectionCoeff( dW, dH, dL)
   local SEZ_L = 80000
   local SEZ_S = 20000
   local LEN_SMALL = 2000
   local dSez = dW * dH
   if dSez <= SEZ_S then
      return 0.0
   elseif dSez < SEZ_L  then
      if dL and dL < LEN_SMALL then dSez = max( 0.6 * dSez, SEZ_S) end
      local dCoeff = ( dSez - SEZ_S) / ( SEZ_L - SEZ_S)
      return dCoeff
   else
      return 1.0
   end
end

---------------------------------------------------------------------
local function GetMinJoin( dW, dH, dL)
   local dCoeff = GetSectionCoeff( dW, dH, dL)
   return ( 1 - dCoeff) * BeamData.MIN_JOIN_S + dCoeff * BeamData.MIN_JOIN_L
end
BeamData.GetMinJoin = GetMinJoin

---------------------------------------------------------------------
local function GetMinUnloadableRaw( dW, dH)
   local dCoeff = GetSectionCoeff( dW, dH)
   return ( 1 - dCoeff) * BeamData.MINRAW_S + dCoeff * BeamData.MINRAW_L
end
BeamData.GetMinUnloadableRaw = GetMinUnloadableRaw

---------------------------------------------------------------------
local function GetBlockedAxis( sHead, nToolType, sBlockedAxis)
   -- lama
   if nToolType == MCH_TY.SAW_STD or nToolType == MCH_TY.SAW_FLAT then
      return ''
   -- sega a catena
   elseif nToolType == MCH_TY.MORTISE_STD then
      if sHead == 'H13' then
         if sBlockedAxis == 'parallel' then
            return 'A1=0'
         elseif sBlockedAxis == 'perpendicular' then
            return 'A1=90'
         end
      else
         return ''
      end
   -- fresa
   elseif nToolType == MCH_TY.MILL_STD or nToolType == MCH_TY.MILL_NOTIP then
      return ''
   -- punta
   elseif nToolType == MCH_TY.DRILL_STD or nToolType == MCH_TY.DRILL_LONG then
      return ''
   else
      return ''
   end
end
BeamData.GetBlockedAxis = GetBlockedAxis

---------------------------------------------------------------------
local function GetSetupInfo( sHead)
   local SetupInfo = {}

   -- dati comuni
   SetupInfo.bIsCSymmetric = true
   SetupInfo.dCAxisEncumbrance = 180
   SetupInfo.bToolOnAggregate = false
   
   -- testa 5 assi da sopra
   if sHead == 'H11' then
      SetupInfo.bIsTopHead = true
      SetupInfo.bIsBottomHead = not SetupInfo.bIsTopHead
      SetupInfo.dMaxNegativeAngle = sin( -35)
   -- lama su aggregato testa 5 assi da sopra
   elseif sHead == 'H12' then
      SetupInfo.bIsTopHead = true
      SetupInfo.bIsBottomHead = not SetupInfo.bIsTopHead
      SetupInfo.dMaxNegativeAngle = sin( -35)
   -- seconda lama su aggregato testa 5 assi da sopra
   elseif sHead == 'H16' then
      SetupInfo.bIsTopHead = true
      SetupInfo.bIsBottomHead = not SetupInfo.bIsTopHead
      SetupInfo.dMaxNegativeAngle = sin( -35)
   -- motosega
   elseif sHead == 'H13' then
      SetupInfo.bIsTopHead = true
      SetupInfo.bIsBottomHead = not SetupInfo.bIsTopHead
      SetupInfo.dMaxNegativeAngle = 0
   -- testa 5 assi da sotto
   elseif sHead == 'H21' then
      SetupInfo.bIsBottomHead = true
      SetupInfo.bIsTopHead = not SetupInfo.bIsBottomHead
      SetupInfo.dMaxPositiveAngle = sin( 25)
   -- lama su aggregato testa 5 assi da sotto
   elseif sHead == 'H22' then
      SetupInfo.bIsBottomHead = true
      SetupInfo.bIsTopHead = not SetupInfo.bIsBottomHead
      SetupInfo.dMaxPositiveAngle = sin( 25)
   end

   return SetupInfo
end
BeamData.GetSetupInfo = GetSetupInfo

---------------------------------------------------------------------
return BeamData
