-- BatchProcess.lua by Egaltech s.r.l. 2022/05/10 -- Gestione calcolo batch disposizione e lavorazioni per Travi -- 2019/07/11 Aggiunta gestione stato rotazione di feature per TS3. -- 2019/07/16 Aggiunta gestione modalità oltre 10 per impostazione macchina e uscita. -- 2019/07/19 Aggiunta gestione collisioni. -- 2019/07/24 Aggiunta gestione extra-corse. -- 2019/08/29 Aggiunta possibilità di processare file NGE. -- 2019/10/04 Migliorato log dei parametri ricevuti. -- 2019/10/07 Aggiunta gestione Flag 4 = Check+Generate. -- 2019/10/09 In ImportBtl aggiunto flag per usare UserAttr. -- 2019/12/09 Gestione conservazione modifiche su barre. -- 2019/12/20 Gestione LOAD90 tramite file ausiliario (btm). -- 2019/12/28 Tolta uscita in caso di errore su features. -- 2020/01/08 Aggiunta seconda sezione limite (BD.MAX_WIDTH2 x BD.MAX_HEIGHT2). -- 2020/01/14 Si carica ultimo gruppo di lavoro. Corretto problema con nome non definito in segnalazione errore in generazione o stima. -- 2020/01/30 File Diff con nome del btl. -- 2020/02/12 Migliorie nella gestione degli errori. -- 2020/06/12 Si esegue sempre Processing se parametri macchina TS3 successivi al btl. -- 2021/02/04 Se necessario ricalcolo allora si aggiorna anche l'attrezzaggio. -- 2021/02/14 Modifica per macchine senza BD.MAX_WIDTH2 e BD.MAX_HEIGHT2. -- 2021/02/22 Aggiunto anche controllo su file macchina mlde per aggiornare calcoli. -- 2021/02/25 Aggiunta gestione tipo scarico (standard, lav. incomplete, a caduta). -- 2021/06/16 Se disponibile si aggiunge la versione dell'eseguibile alle info del programma CN. -- 2021/08/04 Direzione vista simulazione da BD.SIMUL_VIEW_DIR se esiste. -- 2022/04/28 In info generazione aggiunta indicazione se 64bit. -- 2023/05/03 Tolleranza su sezione portata a 0.1 mm (100 * GEO.EPS_SMALL). -- 2022/05/10 Dopo aver fatto rotazioni e inversioni dei pezzi cambio chiave Info relative. -- Intestazioni require( 'EgtBase') _ENV = EgtProtectGlobal() EgtEnableDebug( false) -- Per test --BEAM = {} --BEAM.FILE = 'c:\\EgtData\\Varie\\TestEssetreFast\\TestFilippo\\BTL\\Bar_20_1.btl' --BEAM.MACHINE = 'FAST' --BEAM.FLAG = 3 -- Log dati in input local sFlag = '' if BEAM.FLAG == 0 then sFlag = 'GENERATE' elseif BEAM.FLAG == 1 then sFlag = 'MODIFY' elseif BEAM.FLAG == 2 then sFlag = 'SIMULATE' elseif BEAM.FLAG == 3 then sFlag = 'CHECK' elseif BEAM.FLAG == 4 then sFlag = 'CHECK+GENERATE' elseif BEAM.FLAG == 11 then sFlag = 'TOOLS' elseif BEAM.FLAG == 12 then sFlag = 'JOBS' else sFlag = 'FLAG='..tostring( BEAM.FLAG) end local sLog = 'BatchProcess : ' .. BEAM.FILE .. ', ' .. BEAM.MACHINE .. ', ' .. sFlag EgtOutLog( sLog) local sLogFile = EgtChangePathExtension( BEAM.FILE, '.txt') -- in caso sia richiesta generazione senza check, verifico prima che il file log specifico non contenga errori: se sì, forzo il check if BEAM.FLAG == 0 then local hLogFile = io.open( sLogFile, 'r') if hLogFile then for line in hLogFile:lines() do if EgtStartsWith( line, 'ERR') and tonumber( EgtSplitString( line, '=')[2] or 0) > 0 then BEAM.FLAG = 4 break end end hLogFile:close() end end -- Cancello file di log specifico EgtEraseFile( sLogFile) -- Funzioni per scrittura su file di log specifico local function WriteErrToLogFile( nErr, sMsg, nRot, nCutId, nTaskId) local hFile = io.open( sLogFile, 'a') hFile:write( 'ERR=' .. tostring( nErr) .. '\n') hFile:write( sMsg .. '\n') hFile:write( 'ROT=' .. tostring( nRot or 0) .. '\n') hFile:write( 'CUTID=' .. tostring( nCutId or 0) .. '\n') hFile:write( 'TASKID=' .. tostring( nTaskId or 0) .. '\n') hFile:close() end local function WriteFallToLogFile( nErr, sMsg, nCutId, nFall) local hFile = io.open( sLogFile, 'a') hFile:write( 'ERR=' .. tostring( nErr) .. '\n') hFile:write( sMsg .. '\n') hFile:write( 'CUTID=' .. tostring( nCutId or 0) .. '\n') hFile:write( 'FALL=' .. tostring( nFall or 0) .. '\n') hFile:close() end local function WriteTimeToLogFile( dTime) local hFile = io.open( sLogFile, 'a') hFile:write( 'TIME=' .. EgtNumToString( dTime) .. '\n') hFile:close() end -- Funzione per gestire visualizzazione dopo errore local function PostErrView( nErr, sMsg) if nErr ~= 0 and ( BEAM.FLAG == 1 or BEAM.FLAG == 2) then EgtSetView( SCE_VD.ISO_SW, false) EgtZoom( SCE_ZM.ALL) EgtOutBox( sMsg, 'BatchProcess (err=' .. tostring( nErr) .. ')', 'ERRORS') end end -- Funzione per gestire visualizzazione dopo warning local function PostWarnView( nWarn, sMsg) if nWarn ~= 0 and ( BEAM.FLAG == 1 or BEAM.FLAG == 2) then EgtSetView( SCE_VD.ISO_SW, false) EgtZoom( SCE_ZM.ALL) EgtOutBox( sMsg, 'BatchProcess (wrn=' .. tostring( nWarn) .. ')', 'WARNINGS') end end -- Funzione per aggiornare dati ausiliari local function UpdateAuxData( sAuxFile) local bModif = false -- Se definito LOAD90, aggiorno local sLoad90 = EgtGetStringFromIni( 'AuxData', 'LOAD90', '', sAuxFile) if sLoad90 ~= '' then local BtlInfoId = EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL EgtSetInfo( BtlInfoId, 'LOAD90', sLoad90) bModif = true end return bModif end -- Imposto direttorio libreria specializzata per Travi EgtAddToPackagePath( BEAM.BASEDIR .. '\\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 WriteErrToLogFile( BEAM.ERR, BEAM.MSG) PostErrView( 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 WriteErrToLogFile( BEAM.ERR, BEAM.MSG) PostErrView( BEAM.ERR, BEAM.MSG) return end -- Elimino direttori altre macchine e imposto direttorio macchina corrente per ricerca librerie EgtRemoveBaseMachineDirFromPackagePath() EgtAddToPackagePath( sMachDir .. '\\Beam\\?.lua') -- Se modalità visualizzazione finestre per DB esco if BEAM.FLAG > 10 then BEAM.ERR = 0 return end -- Carico le librerie _G.package.loaded.BeamExec = nil local BE = require( 'BeamExec') local BL = require( 'BeamLib') -- Carico i dati globali local BD = require( 'BeamData') -- Dati del file local sDir, sTitle, sExt = EgtSplitPath( BEAM.FILE) local bBtl = ( string.upper( sExt or '') ~= '.NGE') local sNgeFile = sDir..sTitle..'.nge' local sBtmFile = sDir..sTitle..'.btm' -- In generale va completamente riprocessato local bToProcess = true local bToRecalc = false -- se BTL, barra ed esiste già il corrispondente progetto Nge if bBtl and string.find( sTitle, 'Bar_', 1, true) and EgtExistsFile( sNgeFile) then local sOriFile = sDir..sTitle..'.ori'..sExt local sDiffFile = sDir..sTitle..'.diff.txt' EgtEraseFile( sDiffFile) local _, nDiff = EgtTextFileCompare( BEAM.FILE, sOriFile, ';', sDiffFile) -- se BTL corrente coincide con originale, salto il riprocessamento if nDiff == 0 then bToProcess = false -- se cambiata configurazione macchina da ultima elaborazione, devo riprocessare if EgtCompareFilesLastWriteTime( sOriFile, sMachDir .. '\\Beam\\TS3Data.lua') == -1 or EgtCompareFilesLastWriteTime( sOriFile, sMachDir .. '\\Tools\\Tools.data') == -1 or EgtCompareFilesLastWriteTime( sOriFile, sMachDir .. '\\' .. sMachine ..'.mlde') == -1 then bToRecalc = true end end end -- Inizializzo contatori errori e avvisi local nErrCnt = 0 local nWarnCnt = 0 -- Se da elaborare if bToProcess then EgtOutLog( ' +++ Processing Parts >>>') -- Se Btl, lo importo if bBtl then -- cancello eventuale vecchio progetto omonimo EgtEraseFile( sNgeFile) -- eseguo import EgtNewFile() if not EgtImportBtl( BEAM.FILE, EIB_FL.TS3_POS + EIB_FL.USEUATTR) then BEAM.ERR = 13 BEAM.MSG = 'Error importing BTL file : ' .. BEAM.FILE WriteErrToLogFile( BEAM.ERR, BEAM.MSG) PostErrView( BEAM.ERR, BEAM.MSG) return end -- faccio copia del file btl originale EgtCopyFile( BEAM.FILE, sDir..sTitle..'.ori'..sExt) -- altrimenti Nge, lo apro else if not EgtOpenFile( BEAM.FILE) then BEAM.ERR = 13 BEAM.MSG = 'Error opening NGE file : ' .. BEAM.FILE WriteErrToLogFile( BEAM.ERR, BEAM.MSG) PostErrView( BEAM.ERR, BEAM.MSG) return end -- faccio copia del file originale EgtCopyFile( BEAM.FILE, sDir..sTitle..'.ori'..sExt) end -- Aggiorno eventuali dati ausiliari UpdateAuxData( sBtmFile) -- 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 WriteErrToLogFile( BEAM.ERR, BEAM.MSG) PostErrView( 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 WriteErrToLogFile( BEAM.ERR, BEAM.MSG) PostErrView( BEAM.ERR, BEAM.MSG) return else vBeam[i].Box = b3Solid end end -- Ne recupero la posizione for i = 1, #vBeam do local PosX = EgtGetInfo( vBeam[i].Id, 'POSX', 'd') vBeam[i].PosX = PosX end -- Se non già eseguite, applico 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') or 0 if 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 EgtRemoveInfo( vBeam[i].Id, 'ROTATED') EgtSetInfo( vBeam[i].Id, 'ROTATED_OK', dRotAng) -- 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 EgtRemoveInfo( vBeam[i].Id, 'INVERTED') EgtSetInfo( vBeam[i].Id, 'INVERTED_OK', 180 - dInvAng) 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) > 100 * GEO.EPS_SMALL or abs( dDimH - dRawH) > 100 * GEO.EPS_SMALL) and ( abs( dDimH - dRawW) > 100 * GEO.EPS_SMALL or abs( dDimW - dRawH) > 100 * 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 WriteErrToLogFile( BEAM.ERR, BEAM.MSG) PostErrView( BEAM.ERR, BEAM.MSG) return end -- 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) .. ') ' BEAM.ERR = 17 BEAM.MSG = sOut WriteErrToLogFile( BEAM.ERR, BEAM.MSG) PostErrView( BEAM.ERR, BEAM.MSG) return 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) .. ')' BEAM.ERR = 17 BEAM.MSG = sOut WriteErrToLogFile( BEAM.ERR, BEAM.MSG) PostErrView( BEAM.ERR, BEAM.MSG) return 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) .. ')' BEAM.ERR = 17 BEAM.MSG = sOut WriteErrToLogFile( BEAM.ERR, BEAM.MSG) PostErrView( BEAM.ERR, BEAM.MSG) return end -- Lunghezza della barra local dRawL = ( EgtGetInfo( EgtGetFirstNameInGroup( GDB_ID.ROOT, 'BtlInfo') or GDB_ID.NULL, 'BARLEN', 'd') or 12000) + 0.1 -- Sovramateriale di testa local dOvmHead = vBeam[1].PosX or 0 -- Sistemo le travi nel grezzo local bPbOk, sPbErr = BE.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, nil, vBeam) if not bPbOk then BEAM.ERR = 18 BEAM.MSG = sPbErr WriteErrToLogFile( BEAM.ERR, BEAM.MSG) PostErrView( 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, Stats = BE.ProcessFeatures() local sOutput = '' for i = 1, #Stats do local sMsg = Stats[i].Msg sMsg = string.gsub( sMsg, '\n', ' ', 10) sMsg = string.gsub( sMsg, '\r', ' ', 10) if Stats[i].Err == 0 then BEAM.ERR = 0 BEAM.MSG = '---' BEAM.ROT = Stats[i].Rot or 0 BEAM.CUTID = Stats[i].CutId BEAM.TASKID = Stats[i].TaskId WriteErrToLogFile( BEAM.ERR, BEAM.MSG, BEAM.ROT, BEAM.CUTID, BEAM.TASKID) elseif Stats[i].Err > 0 then nErrCnt = nErrCnt + 1 sOutput = sOutput .. string.format( '[%d,%d] %s\n', Stats[i].CutId, Stats[i].TaskId, sMsg) BEAM.ERR = 19 BEAM.MSG = sMsg BEAM.ROT = Stats[i].Rot or 0 BEAM.CUTID = Stats[i].CutId BEAM.TASKID = Stats[i].TaskId WriteErrToLogFile( BEAM.ERR, BEAM.MSG, BEAM.ROT, BEAM.CUTID, BEAM.TASKID) 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 BEAM.ERR = 0 BEAM.MSG = sMsg BEAM.CUTID = Stats[i].CutId BEAM.FALL = abs( Stats[i].Err + 100) WriteFallToLogFile( BEAM.ERR, BEAM.MSG, BEAM.CUTID, BEAM.FALL) -- altri avvertimenti else nWarnCnt = nWarnCnt + 1 sOutput = sOutput .. string.format( '[%d,%d] %s\n', Stats[i].CutId, Stats[i].TaskId, sMsg) BEAM.ERR = -19 BEAM.MSG = sMsg BEAM.ROT = Stats[i].Rot or 0 BEAM.CUTID = Stats[i].CutId BEAM.TASKID = Stats[i].TaskId WriteErrToLogFile( BEAM.ERR, BEAM.MSG, BEAM.ROT, BEAM.CUTID, BEAM.TASKID) end end end -- Salvo il progetto EgtSaveFile( sNgeFile) -- Visualizzazione avvisi o errori if #sOutput > 0 then EgtOutLog( sOutput) end if nErrCnt > 0 then PostErrView( 19, sOutput) elseif nWarnCnt > 0 then PostWarnView( 19, sOutput) end -- Altrimenti carico il progetto salvato e dichiaro nessun errore else EgtOutLog( ' +++ Loading Project already processed >>>') -- Carico il progetto già fatto EgtOpenFile( sNgeFile) -- Dichiaro nessun errore local nPartId = EgtGetFirstPart() while nPartId do local nCutId = EgtGetInfo( nPartId, 'CUTID') if nCutId then local nProcId = EgtGetFirstInGroup( EgtGetFirstNameInGroup( nPartId, 'Processings') or GDB_ID.NULL) while nProcId do local bIsFea = EgtExistsInfo( nProcId, 'GRP') and EgtExistsInfo( nProcId, 'PRC') local nTaskId = EgtGetInfo( nProcId, 'TASKID') if bIsFea and nTaskId then BEAM.ERR = 0 BEAM.MSG = '---' BEAM.ROT = 0 BEAM.CUTID = nCutId BEAM.TASKID = nTaskId WriteErrToLogFile( BEAM.ERR, BEAM.MSG, BEAM.ROT, BEAM.CUTID, BEAM.TASKID) end nProcId = EgtGetNext( nProcId) end end nPartId = EgtGetNextPart( nPartId) end -- Aggiorno eventuali dati ausiliari UpdateAuxData( sBtmFile) -- Passo in modalità lavora EgtSetCurrMachGroup( EgtGetLastMachGroup()) -- Se necessario eseguo aggiornamento con setup corrente e ricalcolo delle lavorazioni if bToRecalc or BEAM.FLAG == 3 or BEAM.FLAG == 4 then EgtOutLog( ' +++ Recalculating all dispositions and machinings >>>') EgtImportSetup() EgtApplyAllMachinings() -- copia del file btl originale (per dichiarare progetto ricalcolato) EgtCopyFile( BEAM.FILE, sDir..sTitle..'.ori'..sExt) end -- Salvo il progetto EgtSaveFile( sNgeFile) end -- *** Eseguo simulazione con verifica collisione in cieco *** if ( BEAM.FLAG == 0 and ( bToProcess or bToRecalc)) or BEAM.FLAG == 3 or BEAM.FLAG == 4 then EgtOutLog( ' +++ Simulating with collision check >>>') -- verifico setup local bSetUpOk, SetUpErrors = EgtVerifyCurrSetup() if not bSetUpOk then local sToolsList = "" for ToolIndex = 1, #SetUpErrors do sToolsList = sToolsList .. SetUpErrors[ToolIndex] if ToolIndex ~= #SetUpErrors then sToolsList = sToolsList .. ", " end end WriteErrToLogFile( 19, 'Error in setup: tool/s ' .. sToolsList .. ' not found', 0, 0, 0) return end -- lancio simulazione local bSimOk, nErr, sErr = EgtSimulate() if not bSimOk then if nErr == MCH_SHE.INIT then BEAM.ERR = 19 BEAM.MSG = 'Error starting simulation' elseif nErr == MCH_SHE.COLLISION then BEAM.ERR = 22 BEAM.MSG = 'Head-part collision' elseif nErr == MCH_SHE.OUTSTROKE then BEAM.ERR = 23 BEAM.MSG = 'Axis outstroke ' .. sErr elseif nErr == MCH_SHE.SPECIAL then BEAM.ERR = 24 BEAM.MSG = 'Special error ' .. sErr else BEAM.ERR = 25 BEAM.MSG = 'General failure (contact supplier)' end BEAM.ROT = 0 BEAM.CUTID = 0 BEAM.TASKID = 0 local vItem = EgtSplitString( sErr, ';') or {} for i = 1, #vItem do vItem[i] = EgtTrim( vItem[i] or '') if string.find( vItem[i], 'CUTID', 1, true) then BEAM.CUTID = EgtGetVal( vItem[i], 'CUTID', 'i') or 0 elseif string.find( vItem[i], 'TASKID', 1, true) then BEAM.TASKID = EgtGetVal( vItem[i], 'TASKID', 'i') or 0 end end WriteErrToLogFile( BEAM.ERR, BEAM.MSG, BEAM.ROT, BEAM.CUTID, BEAM.TASKID) return end end -- *** Genero programma CN *** ( se richiesto) local bIsGenerationEnabled = ( EgtVerifyKeyOption( 110) == false) if bIsGenerationEnabled and ( BEAM.FLAG == 0 or BEAM.FLAG == 4) then EgtOutLog( ' +++ Generating NC part program >>>') local sInfo = 'EgtCAM5' .. EgtIf( EgtIs64bit(), ' 64bit', '') if EgtGetExeVersion then sInfo = sInfo .. ' ver.' .. EgtGetExeVersion() end sInfo = sInfo .. ' - ' if not EgtGenerate( '', sInfo .. sNgeFile) then BEAM.ERR = 20 local _, sName, _ = EgtSplitPath( BEAM.FILE) BEAM.MSG = 'Error generating NC part program : ' .. sName WriteErrToLogFile( BEAM.ERR, BEAM.MSG) PostErrView( BEAM.ERR, BEAM.MSG) return end end -- *** Eseguo stima tempi *** EgtOutLog( ' +++ Estimating T&L >>>') if not EgtEstimate( '', 'EgtCAM5 - ' .. sNgeFile) then BEAM.ERR = 21 local _, sName, _ = EgtSplitPath( BEAM.FILE) BEAM.MSG = 'Error estimating production time : ' .. sName WriteErrToLogFile( BEAM.ERR, BEAM.MSG) PostErrView( BEAM.ERR, BEAM.MSG) return end local Ttot = EgtGetInfo( EgtGetCurrMachGroup(), 'Ttot') local sTime = 'Total Time = ' .. EgtNumToString( Ttot, 1) EgtOutLog( sTime) -- Imposto la vista ISO 3d, se richiesto if BEAM.FLAG == 1 or BEAM.FLAG == 2 then local vView = { SCE_VD.ISO_NW, SCE_VD.ISO_SW, SCE_VD.ISO_NE, SCE_VD.ISO_SE} local nV = min( max( BD.SIMUL_VIEW_DIR or 2, 1), 4) EgtSetView( vView[nV], false) end -- Completamento senza errori e avvisi if nWarnCnt == 0 then BEAM.ERR = 0 BEAM.MSG = '---' WriteErrToLogFile( BEAM.ERR, BEAM.MSG) end -- Scrittura tempo totale stimato di lavorazione WriteTimeToLogFile( Ttot) EgtOutLog( ' +++ BatchProcess completed')