-- BeamData.lua by Egalware s.r.l. 2025/12/03 -- Raccolta dati generali per Travi EgtOutLog( ' FAST-BeamData started', 1) -- Tabella per definizione modulo local BeamData = { RIGHT_LOAD = false, -- flag carico da destra ROT90 = false, -- flag abilitazione rotazione 90 gradi ROT180 = true, -- flag abilitazione rotazione 180 gradi MIN_WIDTH = 40, -- larghezza minima del grezzo MIN_HEIGHT = 40, -- altezza minima del grezzo MAX_WIDTH = 240, -- larghezza massima del grezzo MAX_HEIGHT = 625, -- altezza massima del grezzo MAX_WIDTH2 = 305, -- seconda larghezza massima del grezzo MAX_HEIGHT2 = 625, -- altezza massima per seconda larghezza massima del grezzo LEN_SHORT_PART = 1200, -- RENAME lunghezza massima pezzo corto LEN_VERY_SHORT_PART = 400, -- RENAME lunghezza massima pezzo molto corto (molto probabile lo scarico a caduta) MAX_RAW = 30000, -- 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) MINRAW_S = 750, -- minimo grezzo in coda scaricabile per sezioni piccole MINRAW_L = 1070, -- minimo grezzo in coda scaricabile per sezioni grandi MAX_DIM_HTCUT = 200, -- SOLO DICE larghezza massima taglio di testa o coda MIN_DIM_HBEAM = 380, -- SOLO DICE altezza minima di trave alta MAX_DIM_DICE = 155, -- dimensione trasversale massima cubetto MAX_LEN_DICE = 400, -- SOLO DICE lunghezza massima cubetto COLL_SIC = 5, -- distanza di sicurezza per collisioni CUT_SIC = 20, -- distanza di sicurezza per tagli CUT_EXTRA = 5, -- affondamento extra standard per tagli di lama e fresature CUT_EXTRA_MIN = 1, -- affondamento extra ridotto per tagli di lama e fresature MILL_OVERLAP = 5, -- sovrapposizione tra due mezze fresature LONGCUT_ENDLEN = 600, -- RENAME??lunghezza lavoro estremi iniziale e finale (std=600) LONGCUT_MAXLEN = 1200, -- RENAME??lunghezza massima sezione di taglio longitudinale DIM_STRIP = -1, -- dimensione codolo sostegno parti lasciate su contorno libero o archi (-1 = da Q...) DIM_STRIP_SMALL = 1, -- 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 VICE_MAXH = 370, -- altezza massima zona pinzaggio orizzontale USER_HOLE_DIAM = 0, -- diametro foro per L20 STRATEGIES_SCRIPT = 'Essetre', STRATEGIES_CONFIG_FILE = 'Std1.json' } -- costanti riportate da mlde non necessarie per automatismo (sostituire con GetParameters o simile) local MldeParameters = {} MldeParameters.MillOffs = 177.35 MldeParameters.MinJoinVV = 75 MldeParameters.MinJoinSS = 100 MldeParameters.MinJoinLS = 290 MldeParameters.MinJoinSL = 100 MldeParameters.MinJoinLL = 400 -- Aggiornamento con dati macchina personalizzati -- TODO sostituire con GetParameters o simile local sTs3Data = EgtGetStringFromIni( 'Beam', 'DATA_DIR', "C:\\TechnoEssetre7\\EgtData", EgtGetIniFile()).."\\Essetre-Fast.data" local sData = EgtGetCurrMachineDir().."\\Beam\\Ts3Data.lua" if EgtExistsFile( sTs3Data) then EgtCopyFile( sTs3Data, sData) local sTs3DataOld = sTs3Data..'.old' EgtEraseFile( sTs3DataOld) EgtRenameFile( sTs3Data, sTs3DataOld) end if EgtExistsFile( sData) then local Machine = dofile( sData) if Machine then if Machine.Offsets then 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.LONGCUT_ENDLEN = Machine.Offsets.LONGCUT_ENDLEN or BeamData.LONGCUT_ENDLEN BeamData.LONGCUT_MAXLEN = Machine.Offsets.LONGCUT_MAXLEN or BeamData.LONGCUT_MAXLEN BeamData.LEN_VERY_SHORT_PART = Machine.Offsets.LEN_VERY_SHORT_PART or BeamData.LEN_VERY_SHORT_PART BeamData.LEN_SHORT_PART = Machine.Offsets.LEN_SHORT_PART or BeamData.LEN_SHORT_PART BeamData.MAX_HEIGHT2 = Machine.Offsets.MAX_HEIGHT2 or BeamData.MAX_HEIGHT2 BeamData.OVM_MID = Machine.Offsets.OVM_MID or BeamData.OVM_MID if Machine.Offsets.PIVOTFRESA then MldeParameters.MillOffs = - Machine.Offsets.PIVOTFRESA end if Machine.Offsets.ROT90 ~= nil then BeamData.ROT90 = ( Machine.Offsets.ROT90 == 1) end if Machine.Offsets.ROT180 ~= nil then BeamData.ROT180 = ( Machine.Offsets.ROT180 == 1) end if Machine.Offsets.CUT_SIC then BeamData.CUT_SIC = EgtClamp( Machine.Offsets.CUT_SIC, 15, 50) end if Machine.Offsets.MIN_JOIN_VV then MldeParameters.MinJoinVV = EgtClamp( Machine.Offsets.MIN_JOIN_VV, 60, 150) end if Machine.Offsets.MIN_JOIN_SS then MldeParameters.MinJoinSS = EgtClamp( Machine.Offsets.MIN_JOIN_SS, 80, 275) end if Machine.Offsets.MIN_JOIN_LS then MldeParameters.MinJoinLS = EgtClamp( Machine.Offsets.MIN_JOIN_LS, 250, 400) end if Machine.Offsets.MIN_JOIN_SL then MldeParameters.MinJoinSL = EgtClamp( Machine.Offsets.MIN_JOIN_SL, 80, 400) end if Machine.Offsets.MIN_JOIN_LL then MldeParameters.MinJoinLL = EgtClamp( Machine.Offsets.MIN_JOIN_LL, 300, 600) end 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.USER_HOLE_DIAM = Machine.User.L020_DIAM_HOLE or BeamData.USER_HOLE_DIAM end end end --------------------------------------------------------------------- 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 --------------------------------------------------------------------- -- TODO questa è copiata (e migliorata) da mlde, va unificata -- TODO vedere se servono anche dDeltaTol e dMinOther local function GetMinJoin( dW, dH, dL) -- funzione di supporto per interpolazione lineare local function MapRange( x, x1, x2, y1, y2) if x <= x1 then return y1 end if x >= x2 then return y2 end return y1 + ( y2 - y1) * ( ( x - x1) / ( x2 - x1)) end -- costanti geometriche e tolleranze local L_SMALL = 800 local H_V, H_S, H_L = 90, 200, 400 local W_V, W_S, W_L = 90, 150, 250 local DELTA_TOL_S = 210 local DELTA_TOL_V = 110 local DELTA_TOL_L = 410 local dMinJoin, dDeltaTol if dW <= W_V and dH <= H_V then dMinJoin = MldeParameters.MinJoinVV dDeltaTol = DELTA_TOL_V elseif dL <= L_SMALL then dMinJoin = MldeParameters.MinJoinSS dDeltaTol = DELTA_TOL_S else -- 1. Interpolazione sulla larghezza partendo da valori macchina local dMinJoinS = MapRange( dW, W_S, W_L, MldeParameters.MinJoinSS, MldeParameters.MinJoinSL) local dMinJoinL = MapRange( dW, W_S, W_L, MldeParameters.MinJoinLS, MldeParameters.MinJoinLL) -- 2. Interpolazione sull'altezza partendo dai valori interpolati sulla larghezza dMinJoin = MapRange( dH, H_S, H_L, dMinJoinS, dMinJoinL) dDeltaTol = MapRange( dH, H_S, H_L, DELTA_TOL_S, DELTA_TOL_L) if dW < W_V then dDeltaTol = DELTA_TOL_V end end --local dMinOther = abs( MldeParameters.MinY) + abs( MldeParameters.MaxV) + dMinJoin return dMinJoin end BeamData.GetMinJoin = GetMinJoin --------------------------------------------------------------------- local function GetRestrictedLength( dW, dH, dL) local dMinJoin = GetMinJoin( dW, dH, dL) local dExtra = 50 local dRestrictedLength = dMinJoin + dExtra return dRestrictedLength end BeamData.GetRestrictedLength = GetRestrictedLength --------------------------------------------------------------------- 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 == 'H3' then if sBlockedAxis == 'parallel' then return 'A=0' elseif sBlockedAxis == 'perpendicular' then return 'A=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 GetChainSawInitAngs( vtN, vtO, nInd) if nInd == 1 then return '' else return EgtIf( vtN:getY() > 0, 'C=180', 'C=-180') end end BeamData.GetChainSawInitAngs = GetChainSawInitAngs --------------------------------------------------------------------- local function GetSCC( vtToolDirection, vtEdgeDirection, vtNFace) local nSCC = MCH_SCC.NONE if abs( vtToolDirection:getX()) > abs( vtToolDirection:getY()) - GEO.EPS_SMALL then -- se il taglio è orizzontale, si gira aggregato lama per facilitare caduta del legno if abs( vtEdgeDirection:getZ()) < 10 * GEO.EPS_SMALL and not AreSameOrOppositeVectorApprox( vtNFace, Z_AX()) then nSCC = EgtIf( ( vtToolDirection:getX() > -GEO.EPS_SMALL), MCH_SCC.ADIR_XM, MCH_SCC.ADIR_XP) else nSCC = EgtIf( ( vtToolDirection:getX() > -GEO.EPS_SMALL), MCH_SCC.ADIR_XP, MCH_SCC.ADIR_XM) end else -- se il taglio è orizzontale, si gira aggregato lama per facilitare caduta del legno if abs( vtEdgeDirection:getZ()) < 10 * GEO.EPS_SMALL and not AreSameOrOppositeVectorApprox( vtNFace, Z_AX()) then nSCC = EgtIf( ( vtToolDirection:getY() > -GEO.EPS_SMALL), MCH_SCC.ADIR_YM, MCH_SCC.ADIR_YP) else nSCC = EgtIf( ( vtToolDirection:getY() > -GEO.EPS_SMALL), MCH_SCC.ADIR_YP, MCH_SCC.ADIR_YM) end end return nSCC end --------------------------------------------------------------------- local function GetSetupInfo( sHead) local SetupInfo = {} -- dati comuni SetupInfo.bIsCSymmetrical = false SetupInfo.dCAxisEncumbrance = 180 SetupInfo.dCAxisSideEncumbrance = 200 SetupInfo.bToolOnAggregate = false -- testa 5 assi da sopra if sHead == 'H1' then SetupInfo.HeadType = { bTop = true, bBottom = false} SetupInfo.PreferredSide = {} SetupInfo.dPivot = MldeParameters.MillOffs -- per uscita fresa, diverso da uscita lama SetupInfo.GetMinNz = function() return sin( -25) end -- lama su testa 5 assi da sopra elseif sHead == 'H2' then SetupInfo.HeadType = { bTop = true, bBottom = false} SetupInfo.PreferredSide = {} SetupInfo.GetMinNz = function() return sin( -45) end SetupInfo.GetSCC = GetSCC -- motosega elseif sHead == 'H3' then SetupInfo.HeadType = { bTop = true, bBottom = false} SetupInfo.PreferredSide = {} SetupInfo.GetMinNz = function() return 0 end -- rinvio angolare 90° (considerato come fosse una testa da sotto) elseif sHead == 'H5' then SetupInfo.bToolOnAggregate = true SetupInfo.HeadType = { bTop = false, bBottom = true} SetupInfo.PreferredSide = {} SetupInfo.GetMaxNz = function() return 0 end end return SetupInfo end BeamData.GetSetupInfo = GetSetupInfo --------------------------------------------------------------------- return BeamData