-- BatchProcess.lua by Egaltech s.r.l. 2019/04/01 -- Gestione calcolo batch disposizione e lavorazioni per Travi -- Intestazioni require( 'EgtBase') _ENV = EgtProtectGlobal() EgtEnableDebug( false) -- Log dati di generazione local sLog = 'BatchProcess : ' .. BEAM.FILE .. ', ' .. BEAM.MACHINE .. ', ' .. tostring( BEAM.FLAG) EgtOutLog( sLog) -- Cancello file di log specifico local sLogFile = EgtChangePathExtension( BEAM.FILE, '.txt') EgtEraseFile( sLogFile) -- Funzione per scrittura su file di log specifico local function WriteLogFile( nErr, sErr, nCutId, nTaskId) if nErr ~= 0 then EgtOutLog( sErr .. ' (' .. tostring( nErr) ..')') end local hFile = io.open( sLogFile, 'w') hFile:write( 'ERR=' .. tostring( nErr) .. '\n') if nErr ~= 0 then hFile:write( 'CUTID=' .. tostring( nCutId or 0) .. '\n') hFile:write( 'TASKID=' .. tostring( nTaskId or 0) .. '\n') hFile:write( sErr .. '\n') end hFile:close() if nErr ~= 0 and ( BEAM.FLAG == 1 or BEAM.FLAG == 2) then EgtSetView( SCE_VD.ISO_SW, false) EgtZoom( SCE_ZM.ALL) EgtOutBox( sErr .. ' (error ' .. tostring( nErr) .. ')', 'BatchProcess', 'ERROR') end end -- Imposto direttorio libreria specializzata per Travi local sBaseDir = EgtGetSourceDir() EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua') -- Impostazione della macchina corrente EgtResetCurrMachGroup() local sMachine = 'Essetre-' .. BEAM.MACHINE if not EgtSetCurrMachine( sMachine) then BEAM.ERR = 11 BEAM.MSG = 'Error selecting machine : ' .. sMachine WriteLogFile( BEAM.ERR, BEAM.MSG) return end -- Verifico che la macchina corrente sia abilitata per la lavorazione delle Travi local sMachDir = EgtGetCurrMachineDir() if not EgtExistsFile( sMachDir .. '\\Beam\\BeamData.lua') then BEAM.ERR = 12 BEAM.MSG = 'Error not configured for beams machine : ' .. sMachine WriteLogFile( BEAM.ERR, BEAM.MSG) return end -- Elimino direttori altre macchine e imposto direttorio macchina corrente per ricerca librerie EgtRemoveBaseMachineDirFromPackagePath() EgtAddToPackagePath( sMachDir .. '\\Beam\\?.lua') -- Segnalazione avvio EgtOutLog( '*** Beam BatchProcess 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') -- Importo il file Btl EgtNewFile() if not EgtImportBtl( BEAM.FILE, EIB_FL.TS3_POS) then BEAM.ERR = 13 BEAM.MSG = 'Error importing BTL file : ' .. BEAM.FILE WriteLogFile( BEAM.ERR, BEAM.MSG) return end -- Recupero l'elenco ordinato delle travi local vBeam = {} local nPartId = EgtGetFirstPart() while nPartId do table.insert( vBeam, { Id = nPartId, Name = ( EgtGetName( nPartId) or ( 'Id=' .. tonumber( nPartId)))}) nPartId = EgtGetNextPart( nPartId) end if #vBeam == 0 then BEAM.ERR = 14 BEAM.MSG = 'Error no beams in the file : ' .. BEAM.FILE WriteLogFile( BEAM.ERR, BEAM.MSG) return else local sOut = '' for i = 1, #vBeam do sOut = sOut .. vBeam[i].Name .. ', ' end sOut = sOut:sub( 1, -3) EgtOutLog( 'Travi trovate : ' .. sOut, 1) end -- Ne recupero 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 BEAM.ERR = 15 BEAM.MSG = 'Box undefined for beam ' .. vBeam[i].Name WriteLogFile( BEAM.ERR, BEAM.MSG) return else vBeam[i].Box = b3Solid end end -- Eseguo eventuali rotazioni e inversioni testa-coda for i = 1, #vBeam do local b3Solid = vBeam[i].Box -- rotazione local dRotAng = EgtGetInfo( vBeam[i].Id, 'ROTATED', 'd') if dRotAng and abs( dRotAng) > GEO.EPS_ANG_SMALL then local ptRotCen = b3Solid:getCenter() EgtRotate( vBeam[i].Id, ptRotCen, X_AX(), dRotAng, GDB_RT.GLOB) b3Solid:rotate( ptRotCen, X_AX(), dRotAng) end -- inversione local dInvAng = 180 - ( EgtGetInfo( vBeam[i].Id, 'INVERTED', 'd') or 0) if abs( dInvAng) > GEO.EPS_ANG_SMALL then local ptInvCen = b3Solid:getCenter() EgtRotate( vBeam[i].Id, ptInvCen, Z_AX(), dInvAng, GDB_RT.GLOB) end end -- Ne verifico le dimensioni local dRawW = vBeam[1].Box:getDimY() local 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' table.remove( vBeam, vBeamErr[i]) end BEAM.ERR = 16 BEAM.MSG = sOut WriteLogFile( BEAM.ERR, BEAM.MSG) return end -- Verifico sezione barra 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) .. ')' BEAM.ERR = 17 BEAM.MSG = sOut WriteLogFile( BEAM.ERR, BEAM.MSG) return end -- Lunghezza della barra local dRawL = EgtGetInfo( EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo'), 'BARLEN', 'd') or 12000 -- Sovramateriale di testa local dOvmHead = EgtGetInfo( EgtGetFirstPart(), 'POSX', 'd') or 10 -- Sistemo le travi nel grezzo local bPbOk, sPbErr = BE.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, vBeam) if not bPbOk then BEAM.ERR = 18 BEAM.MSG = sPbErr WriteLogFile( BEAM.ERR, BEAM.MSG) return end -- Imposto Nome file CN local _, sName, _ = EgtSplitPath( BEAM.FILE) EgtSetInfo( EgtGetCurrMachGroup(), 'NcName', sName .. '.cnc') -- Abilito Vmill EgtSetInfo( EgtGetCurrMachGroup(), 'Vm', '1') -- Lavoro le features local bPfOk, sPfErr, nPfCutId, nPfTaskId = BE.ProcessFeatures() if not bPfOk then BEAM.ERR = 19 BEAM.MSG = sPfErr BEAM.CUTID = nPfCutId BEAM.TASKID = nPfTaskId WriteLogFile( BEAM.ERR, BEAM.MSG, BEAM.CUTID, BEAM.TASKID) return end -- Salvo il progetto local sNgeFile = EgtChangePathExtension( BEAM.FILE, '.nge') EgtSaveFile( sNgeFile) -- Genero programma CN, se richiesto if BEAM.FLAG == 0 then if not EgtGenerate( '', 'EgtCAM5 - ' .. sNgeFile) then BEAM.ERR = 20 BEAM.MSG = 'Error generating NC part program : ' .. sName WriteLogFile( BEAM.ERR, BEAM.MSG) return end end -- Imposto la vista ISO 3d, se richiesto if BEAM.FLAG == 1 or BEAM.FLAG == 2 then EgtSetView( SCE_VD.ISO_SW, false) end -- Completamento senza errori BEAM.ERR = 0 BEAM.MSG = '' WriteLogFile( BEAM.ERR, BEAM.MSG)