-- Process.lua by Egaltech s.r.l. 2021/02/25 -- Gestione calcolo disposizione e lavorazioni per Travi -- Si opera sulla macchina corrente -- 2020/01/08 Aggiunta seconda sezione limite (BD.MAX_WIDTH2 x BD.MAX_HEIGHT2). -- 2020/10/25 Se assegno lunghezza barra nulla prende il minimo calcolato. -- 2021/02/14 Modifica per macchine senza BD.MAX_WIDTH2 e BD.MAX_HEIGHT2. -- Intestazioni require( 'EgtBase') _ENV = EgtProtectGlobal() EgtEnableDebug( false) -- Imposto direttorio libreria specializzata per Travi EgtAddToPackagePath( BEAM.BASEDIR .. '\\LuaLibs\\?.lua') -- Verifico che la macchina corrente sia abilitata per la lavorazione delle Travi local sMachDir = EgtGetCurrMachineDir() if not sMachDir then EgtOutBox( 'Errore nel caricamento della macchina corrente', 'Lavora Travi', 'ERROR') return end if not EgtExistsFile( sMachDir .. '\\Beam\\BeamData.lua') then EgtOutBox( 'La macchina corrente non è configurata per lavorare travi', 'Lavora Travi', 'ERROR') return end -- Elimino direttori altre macchine e imposto direttorio macchina corrente per ricerca librerie EgtRemoveBaseMachineDirFromPackagePath() EgtAddToPackagePath( sMachDir .. '\\Beam\\?.lua') -- Segnalazione avvio EgtOutLog( '*** Beam Process Start ***', 1) -- Carico le librerie _G.package.loaded.BeamExec = nil local BE = require( 'BeamExec') local BL = require( 'BeamLib') -- Carico i dati globali local BD = require( 'BeamData') -- Variabili di modulo local vBeam = {} local dRawW local dRawH ------------------------------------------------------------------------------------------------------------- -- *** Recupero le travi selezionate *** ------------------------------------------------------------------------------------------------------------- local function MyProcessInputData() -- Recupero le travi selezionate local nId = EgtGetFirstSelectedObj() while nId do local nPartId = EgtGetParent( EgtGetParent( nId or GDB_ID.NULL) or GDB_ID.NULL) if nPartId then local bFound = false for i = 1, #vBeam do if vBeam[i].Id == nPartId then bFound = true break end end if not bFound then table.insert( vBeam, { Ind = #vBeam + 1, Id = nPartId, Name = ( EgtGetName( nPartId) or ( 'Id=' .. tonumber( nPartId)))}) end end nId = EgtGetNextSelectedObj() end if #vBeam == 0 then EgtOutBox( 'Non sono state selezionate travi', 'Lavora Travi', 'ERROR') return false else local sOut = '' for i = 1, #vBeam do sOut = sOut .. vBeam[i].Name .. ', ' end sOut = sOut:sub( 1, -3) EgtOutLog( 'Travi selezionate : ' .. sOut, 1) end -- Ne recupero e verifico le dimensioni for i = 1, #vBeam do local Ls = EgtGetFirstNameInGroup( vBeam[i].Id, 'Box') local b3Solid = EgtGetBBoxGlob( Ls or GDB_ID.NULL, GDB_BB.STANDARD) if not b3Solid then EgtOutBox( 'Box non definito per la trave ' .. vBeam[i].Name, 'Lavora Travi', 'ERROR') return false else vBeam[i].Box = b3Solid end end dRawW = vBeam[1].Box:getDimY() dRawH = vBeam[1].Box:getDimZ() local vBeamErr = {} for i = 2, #vBeam do local dDimW = vBeam[i].Box:getDimY() local dDimH = vBeam[i].Box:getDimZ() if ( abs( dDimW - dRawW) > 10 * GEO.EPS_SMALL or abs( dDimH - dRawH) > 10 * GEO.EPS_SMALL) and ( abs( dDimH - dRawW) > 10 * GEO.EPS_SMALL or abs( dDimW - dRawH) > 10 * GEO.EPS_SMALL) then table.insert( vBeamErr, i) end end if #vBeamErr > 0 then local sOut = 'Rimosse travi con sezioni diverse dalla prima :\n' for i = #vBeamErr, 1, -1 do sOut = sOut .. vBeam[vBeamErr[i]].Name .. '\n' EgtDeselectPartObjs( vBeam[vBeamErr[i]].Id) table.remove( vBeam, vBeamErr[i]) end EgtOutLog( sOut, 1) EgtOutBox( sOut, 'Lavora Travi', 'INFO') EgtDraw() return false end EgtDeselectAll() return true end ------------------------------------------------------------------------------------------------------------- -- *** Inserimento delle travi nel grezzo *** ------------------------------------------------------------------------------------------------------------- local function MyProcessBeams() -- Determinazione minimo grezzo scaricabile BE.CalcMinUnloadableRaw( dRawW, dRawH) -- Lunghezza totale delle travi local dTotLen = 0 for i = 1, #vBeam - 1 do dTotLen = dTotLen + vBeam[i].Box:getDimX() end dTotLen = dTotLen + max( vBeam[#vBeam].Box:getDimX(), BD.MinRaw) local dAddLen = BD.OVM_HEAD + ( #vBeam - 1) * BD.OVM_MID EgtOutLog( 'Ltot : '..EgtNumToString( dTotLen, 1) .. ' Lagg : '..EgtNumToString( dAddLen, 1)..' MinUnloadRaw : '.. EgtNumToString( BD.MinRaw + BD.OVM_MID, 1), 1) -- Richiedo lunghezza del grezzo, sovramateriale di testa, forzatura verticale e ordinamento automatico secondo la lunghezza local vsVal = EgtDialogBox( 'Lavora Travi' .. ' (Ltot='..EgtNumToString( dTotLen + dAddLen + 0.5, 0).. ', Lmax='..EgtNumToString( BD.MAX_RAW, 0)..',MinUlr='..EgtNumToString( BD.MinRaw + BD.OVM_MID, 0)..')', {'Lunghezza grezzo', EgtNumToString( BD.STD_RAW, 0)}, {'Sovramateriale di testa', EgtNumToString( BD.OVM_HEAD, 0)}, {'Offset intermedio', EgtNumToString( BD.OVM_MID, 0)}, {'Forza sezione verticale', ' CB:true,*false'}, {'Ordina per lunghezza', ' CB:true,*false'}) if not vsVal then EgtDraw() return end local dRawL = EgtEvalNumExpr( vsVal[1]) if not dRawL then local sOut = 'Lunghezza grezzo errata : ' .. vsVal[1] EgtOutLog( sOut) EgtOutBox( sOut, 'Lavora Travi', 'WARNING') EgtDraw() return false end if dRawL < GEO.EPS_SMALL then dRawL = dTotLen + dAddLen + 0.5 end dRawL = min( dRawL, BD.MAX_RAW) local dOvmHead = EgtEvalNumExpr( vsVal[2]) if not dOvmHead then local sOut = 'Sovramateriale di testa errato : ' .. vsVal[2] EgtOutLog( sOut) EgtOutBox( sOut, 'Lavora Travi', 'WARNING') EgtDraw() return false end local dOvmMid = EgtEvalNumExpr( vsVal[3]) if not dOvmMid then local sOut = 'Offset intermedio : ' .. vsVal[3] EgtOutLog( sOut) EgtOutBox( sOut, 'Lavora Travi', 'WARNING') EgtDraw() return false end -- Sistemo sezione barra con travi local bVert = ( vsVal[4] == 'true') if bVert then if dRawW > dRawH then dRawW, dRawH = dRawH, dRawW end end EgtOutLog( 'Lraw : ' .. EgtNumToString( dRawL, 1) .. ' Lovm : '.. EgtNumToString( dOvmHead, 1), 1) -- Verifico sezione barra non troppo grande if not BD.MAX_WIDTH2 or not BD.MAX_HEIGHT2 then if ( dRawW > BD.MAX_WIDTH + 10 * GEO.EPS_SMALL or dRawH > BD.MAX_HEIGHT + 10 * GEO.EPS_SMALL) then local sOut = 'Sezione (' .. EgtNumToString( dRawW, 2) .. ' x ' .. EgtNumToString( dRawH, 2) .. ') ' .. 'oltre i limiti della macchina (' .. EgtNumToString( BD.MAX_WIDTH, 2) .. ' x ' .. EgtNumToString( BD.MAX_HEIGHT, 2) .. ') ' EgtOutLog( sOut) EgtOutBox( sOut, 'Lavora Travi', 'WARNING') EgtDraw() return false end else if ( dRawW > BD.MAX_WIDTH + 10 * GEO.EPS_SMALL or dRawH > BD.MAX_HEIGHT + 10 * GEO.EPS_SMALL) and ( dRawW > BD.MAX_WIDTH2 + 10 * GEO.EPS_SMALL or dRawH > BD.MAX_HEIGHT2 + 10 * GEO.EPS_SMALL) then local sOut = 'Sezione (' .. EgtNumToString( dRawW, 2) .. ' x ' .. EgtNumToString( dRawH, 2) .. ') ' .. 'oltre i limiti della macchina (' .. EgtNumToString( BD.MAX_WIDTH, 2) .. ' x ' .. EgtNumToString( BD.MAX_HEIGHT, 2) .. ') ' .. 'e (' .. EgtNumToString( BD.MAX_WIDTH2, 2) .. ' x ' .. EgtNumToString( BD.MAX_HEIGHT2, 2) .. ')' EgtOutLog( sOut) EgtOutBox( sOut, 'Lavora Travi', 'WARNING') EgtDraw() return false end end -- Verifico sezione barra non troppo piccola if dRawW < BD.MIN_WIDTH - 10 * GEO.EPS_SMALL or dRawH < BD.MIN_HEIGHT - 10 * GEO.EPS_SMALL then local sOut = 'Sezione (' .. EgtNumToString( dRawW, 2) .. ' x ' .. EgtNumToString( dRawH, 2) .. ') ' .. 'sotto i limiti della macchina (' .. EgtNumToString( BD.MIN_WIDTH, 2) .. ' x ' .. EgtNumToString( BD.MIN_HEIGHT, 2) .. ')' EgtOutLog( sOut) EgtOutBox( sOut, 'Lavora Travi', 'WARNING') EgtDraw() return false end -- Se richiesto, ordino le travi in senso di lunghezza crescente local bOrd = ( vsVal[5] == 'true') if bOrd then table.sort( vBeam, function( B1, B2) if abs( B1.Box:getDimX() - B2.Box:getDimX()) < 1 then return B1.Ind < B2.Ind else return B1.Box:getDimX() < B2.Box:getDimX() end end) end do local sOut = '' for i = 1, #vBeam do sOut = sOut .. vBeam[i].Name .. ', ' end sOut = sOut:sub( 1, -3) EgtOutLog( 'Travi ordinate : ' .. sOut, 1) end -- Sistemo le travi nel grezzo local bOk, sErr = BE.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, dOvmMid, vBeam) if not bOk then EgtOutLog( sErr) EgtOutBox( sErr, 'Lavora Travi', 'ERROR') return false end return true end ------------------------------------------------------------------------------------------------------------- -- *** Inserimento delle lavorazioni nelle travi *** ------------------------------------------------------------------------------------------------------------- local function MyProcessFeatures() local bOk, Stats = BE.ProcessFeatures() local nErrCnt = 0 local nWarnCnt = 0 local sOutput = '' for i = 1, #Stats do if Stats[i].Err > 0 then nErrCnt = nErrCnt + 1 sOutput = sOutput .. string.format( '[%d,%d] %s\n', Stats[i].CutId, Stats[i].TaskId, Stats[i].Msg) elseif Stats[i].Err < 0 then -- se segnalazione scarico pezzo standard, incompleto o a caduta if Stats[i].Err == -100 or Stats[i].Err == -101 or Stats[i].Err == -102 then -- non faccio niente else nWarnCnt = nWarnCnt + 1 sOutput = sOutput .. string.format( '[%d,%d] %s\n', Stats[i].CutId, Stats[i].TaskId, Stats[i].Msg) end end end if #sOutput > 0 then EgtOutLog( sOutput) end if nErrCnt > 0 then EgtOutBox( sOutput, 'Lavora Travi', 'ERRORS') return false elseif nWarnCnt > 0 then EgtOutBox( sOutput, 'Lavora Travi', 'WARNINGS') return true end return true end ------------------------------------------------------------------------------------------------------------- -- *** Esecuzione *** ------------------------------------------------------------------------------------------------------------- if not MyProcessInputData() then return end if not MyProcessBeams() then return end -- Abilito Vmill EgtSetInfo( EgtGetCurrMachGroup(), 'Vm', '1') if not MyProcessFeatures() then return end