diff --git a/FlipRot.lua b/FlipRot.lua index 312d3d8..631e53e 100644 --- a/FlipRot.lua +++ b/FlipRot.lua @@ -1,9 +1,13 @@ --- BatchProcessNew.lua by Egalware s.r.l. 2025/04/24 +-- Process.lua by Egalware s.r.l. 2024/04/02 +-- Gestione calcolo disposizione e lavorazioni per Travi +-- Si opera sulla macchina corrente +-- 2024/04/02 PRIMA VERSIONE + -- Intestazioni require( 'EgtBase') _ENV = EgtProtectGlobal() -EgtEnableDebug( false) +EgtEnableDebug( true) -- Imposto direttorio libreria specializzata per Travi EgtAddToPackagePath( BEAM.BASEDIR .. '\\LuaLibs\\?.lua') @@ -11,22 +15,7 @@ EgtAddToPackagePath( BEAM.BASEDIR .. '\\LuaLibs\\?.lua') EgtAddToPackagePath( BEAM.BASEDIR .. '\\Strategies\\Standard\\?.lua') EgtAddToPackagePath( BEAM.BASEDIR .. '\\StrategyLibs\\?.lua') --- Verifico che la macchina corrente sia abilitata per la lavorazione delle Travi e carico log txt -local sMachine = BEAM.MACHINE -local sTxtLogFile -if ( BEAM.FLAG ~= 6) and ( BEAM.FLAG ~= 9) then - EgtResetCurrMachGroup() - 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 -end -if BEAM.FLAG ~= 9 then - sTxtLogFile = EgtChangePathExtension( BEAM.FILE, '.txt') -end +-- 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') @@ -34,10 +23,6 @@ if not sMachDir then end if not EgtExistsFile( sMachDir .. '\\Beam\\BeamDataNew.lua') then EgtOutBox( 'La macchina corrente non è configurata per lavorare travi', 'Lavora Travi', 'ERROR') - BEAM.ERR = 12 - BEAM.MSG = 'Error not configured for beams machine : ' .. sMachine - WriteErrToLogFile( BEAM.ERR, BEAM.MSG) - PostErrView( BEAM.ERR, BEAM.MSG) return end @@ -96,16 +81,75 @@ local BeamData = require( 'BeamDataNew') -- carico librerie local BeamExec = require( 'BeamExec') local BeamLib = require( 'BeamLib') -local FeatureLib = require( 'FeatureLib') -local JSON = require( 'JSON') -- Variabili di modulo local dRawW local dRawH ------------------------------------------------------------------------------------------------------------- --- Funzioni di supporto +-- *** Recupero le travi selezionate *** +------------------------------------------------------------------------------------------------------------- +local function MyProcessInputData() + -- Recupero le travi selezionate + local nId = EgtGetFirstPart() + while nId do + table.insert( PARTS, { nInd = #PARTS + 1, id = nId, sName = ( EgtGetName( nId) or ( 'Id=' .. tonumber( nId)))}) + nId = EgtGetNextPart( nId) + end + if #PARTS == 0 then + EgtOutBox( 'Non sono state selezionate travi', 'Lavora Travi', 'ERROR') + return false + else + local sOut = '' + for i = 1, #PARTS do + sOut = sOut .. PARTS[i].sName .. ', ' + end + sOut = sOut:sub( 1, -3) + EgtOutLog( 'Travi selezionate : ' .. sOut, 1) + end + + -- Ne recupero e verifico le dimensioni + for i = 1, #PARTS do + local Ls = EgtGetFirstNameInGroup( PARTS[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 ' .. PARTS[i].sName, 'Lavora Travi', 'ERROR') + return false + else + PARTS[i].b3PartOriginal = b3Solid + end + end + dRawW = PARTS[1].b3PartOriginal:getDimY() + dRawH = PARTS[1].b3PartOriginal:getDimZ() + local vBeamErr = {} + for i = 2, #PARTS do + local dDimW = PARTS[i].b3PartOriginal:getDimY() + local dDimH = PARTS[i].b3PartOriginal: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 .. PARTS[vBeamErr[i]].sName .. '\n' + EgtDeselectPartObjs( PARTS[vBeamErr[i]].id) + table.remove( PARTS, vBeamErr[i]) + end + EgtOutLog( sOut, 1) + EgtOutBox( sOut, 'Lavora Travi', 'INFO') + EgtDraw() + return false + end + EgtDeselectAll() + + return true +end + + +------------------------------------------------------------------------------------------------------------- local function GetDataConfig() -- recupero utensili dal magazzino BeamExec.GetToolsFromDB() @@ -113,604 +157,149 @@ local function GetDataConfig() return true end -local function WriteErrToLogFile( nErr, sMsg, nRot, idCut, idTask) - local hFile = io.open( sTxtLogFile, 'a') - hFile:write( 'ERR=' .. tostring( nErr) .. '\n') - hFile:write( sMsg .. '\n') - hFile:write( 'ROT=' .. tostring( nRot or 0) .. '\n') - hFile:write( 'CUTID=' .. tostring( idCut or 0) .. '\n') - hFile:write( 'TASKID=' .. tostring( idTask or 0) .. '\n') - hFile:close() -end +------------------------------------------------------------------------------------------------------------- +-- *** Inserimento delle travi nel grezzo *** +------------------------------------------------------------------------------------------------------------- +local function MyProcessBeams() + -- Determinazione minimo grezzo scaricabile + BeamExec.CalcMinUnloadableRaw( dRawW, dRawH) -local function WriteFallToLogFile( nErr, sMsg, idCut, nFall) - local hFile = io.open( sTxtLogFile, 'a') - hFile:write( 'ERR=' .. tostring( nErr) .. '\n') - hFile:write( sMsg .. '\n') - hFile:write( 'CUTID=' .. tostring( idCut or 0) .. '\n') - hFile:write( 'FALL=' .. tostring( nFall or 0) .. '\n') - hFile:close() -end - -local function WriteTimeToLogFile( dTime) - local hFile = io.open( sTxtLogFile, 'a') - hFile:write( 'TIME=' .. EgtNumToString( dTime) .. '\n') - hFile:close() -end - --- Funzioni per gestire visualizzazione dopo errore e dopo warning -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') + -- Lunghezza totale delle travi + local dTotLen = 0 + for i = 1, #PARTS - 1 do + dTotLen = dTotLen + PARTS[i].b3PartOriginal:getDimX() end -end + dTotLen = dTotLen + max( PARTS[#PARTS].b3PartOriginal:getDimX(), BeamData.dMinRaw) + local dAddLen = BeamData.OVM_HEAD + ( #PARTS - 1) * BeamData.OVM_MID + EgtOutLog( 'Ltot : '..EgtNumToString( dTotLen, 1) .. ' Lagg : '..EgtNumToString( dAddLen, 1)..' MinUnloadRaw : '.. EgtNumToString( BeamData.dMinRaw + BeamData.OVM_MID, 1), 1) -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') + -- 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( BeamData.MAX_RAW, 0)..',MinUlr='..EgtNumToString( BeamData.dMinRaw + BeamData.OVM_MID, 0)..')', + --{'Lunghezza grezzo', EgtNumToString( BeamData.STD_RAW, 0)}, -- TODO RIPRISTINARE + {'Lunghezza grezzo', EgtNumToString( 0)}, + {'Sovramateriale di testa', EgtNumToString( BeamData.OVM_HEAD, 0)}, + {'Offset intermedio', EgtNumToString( BeamData.OVM_MID, 0)}, + {'Forza sezione verticale', ' CB:true,*false'}, + {'Ordina per lunghezza', ' CB:true,*false'}, + {'Calcolo Lavorazioni', ' CB:*Da progetto,Ricalcolo standard,Ricalcolo IA'}) + if not vsVal then + EgtDraw() + return end -end - --- Funzione di reset gruppo di lavoro in caso di impossibilità di inserire i pezzi -local function ResetMachGroup( PARTS) - for i = 1, #PARTS do - EgtErase( PARTS[i].id) - end - EgtRemoveMachGroup( EgtGetCurrMachGroup() or GDB_ID.NULL) -end - --- scrittura JSON risultati --- TODO da migliorare/completare -local function WriteResultToJson( RESULT) - local sData = JSON:encode_pretty( RESULT) - - -- Salvataggio e visualizzazione tabella - local sOutFile = EgtChangePathExtension( BEAM.FILE, '.json') - local DestFh = io.open( sOutFile, 'w+') - if not DestFh then - EgtOutBox( 'Error opening ' .. sOutFile, 'TestJson', 'ERROR') + 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, BeamData.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 BeamData.MAX_WIDTH2 or not BeamData.MAX_HEIGHT2 then + if ( dRawW > BeamData.MAX_WIDTH + 10 * GEO.EPS_SMALL or dRawH > BeamData.MAX_HEIGHT + 10 * GEO.EPS_SMALL) then + local sOut = 'Sezione (' .. EgtNumToString( dRawW, 2) .. ' x ' .. EgtNumToString( dRawH, 2) .. ') ' .. + 'oltre i limiti della macchina (' .. EgtNumToString( BeamData.MAX_WIDTH, 2) .. ' x ' .. EgtNumToString( BeamData.MAX_HEIGHT, 2) .. ') ' + EgtOutLog( sOut) + EgtOutBox( sOut, 'Lavora Travi', 'WARNING') + EgtDraw() + return false + end + else + if ( dRawW > BeamData.MAX_WIDTH + 10 * GEO.EPS_SMALL or dRawH > BeamData.MAX_HEIGHT + 10 * GEO.EPS_SMALL) and + ( dRawW > BeamData.MAX_WIDTH2 + 10 * GEO.EPS_SMALL or dRawH > BeamData.MAX_HEIGHT2 + 10 * GEO.EPS_SMALL) then + local sOut = 'Sezione (' .. EgtNumToString( dRawW, 2) .. ' x ' .. EgtNumToString( dRawH, 2) .. ') ' .. + 'oltre i limiti della macchina (' .. EgtNumToString( BeamData.MAX_WIDTH, 2) .. ' x ' .. EgtNumToString( BeamData.MAX_HEIGHT, 2) .. ') ' .. + 'e (' .. EgtNumToString( BeamData.MAX_WIDTH2, 2) .. ' x ' .. EgtNumToString( BeamData.MAX_HEIGHT2, 2) .. ')' + EgtOutLog( sOut) + EgtOutBox( sOut, 'Lavora Travi', 'WARNING') + EgtDraw() + return false + end + end + + -- Verifico sezione barra non troppo piccola + if dRawW < BeamData.MIN_WIDTH - 10 * GEO.EPS_SMALL or dRawH < BeamData.MIN_HEIGHT - 10 * GEO.EPS_SMALL then + local sOut = 'Sezione (' .. EgtNumToString( dRawW, 2) .. ' x ' .. EgtNumToString( dRawH, 2) .. ') ' .. + 'sotto i limiti della macchina (' .. EgtNumToString( BeamData.MIN_WIDTH, 2) .. ' x ' .. EgtNumToString( BeamData.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( PARTS, function( B1, B2) + if abs( B1.b3PartOriginal:getDimX() - B2.b3PartOriginal:getDimX()) < 1 then + return B1.nInd < B2.nInd + else + return B1.b3PartOriginal:getDimX() < B2.b3PartOriginal:getDimX() + end + end) + end + do + local sOut = '' + for i = 1, #PARTS do + sOut = sOut .. PARTS[i].sName .. ', ' + end + sOut = sOut:sub( 1, -3) + EgtOutLog( 'Travi ordinate : ' .. sOut, 1) + end + + -- Sistemo le travi nel grezzo + local bOk, sErr = BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, dOvmMid, PARTS, nil, false) + if not bOk then + EgtOutLog( sErr) + EgtOutBox( sErr, 'Lavora Travi', 'ERROR') return false end - DestFh:write( sData) - DestFh:close() return true end ------------------------------------------------------------------------------------------------------------- +-- *** Inserimento delle lavorazioni nelle travi *** +------------------------------------------------------------------------------------------------------------- +local function MyProcessFeatures() --- calcolo tempo esecuzione -TIMER:start() -EgtOutLog( ' Execution timer started') - --- script principale - -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 == 6 then - sFlag = 'CREATE_BAR' -elseif BEAM.FLAG == 8 then - sFlag = 'CHECK_NOSIM' -elseif BEAM.FLAG == 9 then - sFlag = 'GET_TOPOLOGY' -elseif BEAM.FLAG == 10 then - sFlag = 'FLIP_ROT' -else - sFlag = 'FLAG='..tostring( BEAM.FLAG) -end -local sLog = 'BatchProcess : ' .. BEAM.FILE .. ', ' .. ( BEAM.MACHINE or EgtGetCurrMachineName()) .. ', ' .. sFlag -EgtOutLog( sLog) - --- TODO forzatura calcolo con prerotazioni. Cancellare dopo che è stata aggiunta la gestione corretta -local bCalcBestPieceUnloadPosition = true or BEAM.FLAG == 10 - --- Dati dei file --- TODO spostare a quando flag ~= 6 e 9 -local sDir, sTitle = EgtSplitPath( BEAM.FILE) -local sOriFile = sDir..sTitle..'.ori.bwe' -local sNgeFile = sDir..sTitle..'.bwe' - --- cancellazione file log txt precedente --- in caso sia richiesta generazione senza check, verifico prima che il file log specifico non contenga errori: se sì, forzo il check --- TODO serve ancora?? forzare sempre il check e simulazione? -if BEAM.FLAG == 0 then - local hLogFile = io.open( sTxtLogFile, '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 --- restituisce all'interfaccia il nome della topologia della feature di id passato --- TODO valutare se fare script separato -elseif BEAM.FLAG == 9 then - if type( BEAM.FEATUREID) == 'number' then - -- creo un gruppo temporaneo dove finiranno tutte le entità che non bisogna salvare, alla fine lo si cancella - local idTempGroup = BeamLib.CreateTempGroup() - - local Part = {} - Part.id = EgtGetParent( EgtGetParent( BEAM.FEATUREID)) - Part.idBoxTm = EgtGetFirstInGroup( EgtGetFirstNameInGroup( Part.id, 'Box') or GDB_ID.NULL) - Part.b3Part = EgtGetBBoxGlob( Part.idBoxTm, GDB_BB.STANDARD) - Part.idTempGroup = idTempGroup - - local Proc = FeatureLib.GetProcFromTrimesh( BEAM.FEATUREID, Part) - Proc.nGrp = EgtGetInfo( Proc.id, 'GRP', 'i') - Proc.nPrc = EgtGetInfo( Proc.id, 'PRC', 'i') - - Proc.Topology = {} - if FeatureLib.NeedTopologyFeature( Proc, Part) then - Proc.Topology = FeatureLib.ClassifyTopology( Proc, Part) - else - Proc = FeatureLib.GetAdditionalInfo( Proc, Part) - Proc.Topology = FeatureLib.GetTopologyFromFeature( Proc, Part) - end - - if Proc.Topology and Proc.Topology.sName then - BEAM.TOPOLOGY = Proc.Topology.sName - else - BEAM.TOPOLOGY = 'NOT_IMPLEMENTED' - end - - -- si cancella gruppo temporaneo contenente entità da cancellare - EgtErase( idTempGroup) - end - return -end - --- Cancello file di log specifico -EgtEraseFile( sTxtLogFile) - --- In generale va completamente riprocessato -local bToProcess = true -local bToRecalc = false --- se BTL, barra ed esiste già il corrispondente progetto Nge -if EgtExistsFile( sOriFile) then - bToProcess = false - EgtCopyFile( sOriFile, sNgeFile) - -- se cambiata configurazione macchina da ultima elaborazione, devo aggiornare - 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 - --- Inizializzo contatori errori e avvisi -local nErrCnt = 0 -local nWarnCnt = 0 - --- Se da elaborare -if bToProcess then - EgtOutLog( ' +++ Processing Parts >>>') - - -- Flag di barra da creare - local bCreateBar - -- Lunghezza della barra ed elenco travi - local dBarLen - - -- Se necessario, apro il file Bwe - if BEAM.FLAG ~= 6 then - if not EgtOpenFile( BEAM.FILE) then - BEAM.ERR = 13 - BEAM.MSG = 'Error opening BWE file : ' .. BEAM.FILE - WriteErrToLogFile( BEAM.ERR, BEAM.MSG) - PostErrView( BEAM.ERR, BEAM.MSG) - BeamExec.AddApplyResultToGlobalList( BEAM.ERR, 0, BEAM.MSG) - BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) - WriteResultToJson( RESULT) - return - end - -- Faccio copia del file originale - EgtCopyFile( BEAM.FILE, sOriFile) - - -- Se già presente un gruppo di lavoro - if EgtGetFirstMachGroup() then - -- Barra già presente - bCreateBar = false - -- Rendo corrente il gruppo di lavoro - EgtSetCurrMachGroup() - -- Area tavola - local b3Tab = EgtGetTableArea() - -- Sezione del grezzo - local nRawId = EgtGetFirstRawPart() - if not nRawId then - BEAM.ERR = 14 - BEAM.MSG = 'Error no Raw Parts in the file : ' .. BEAM.FILE - WriteErrToLogFile( BEAM.ERR, BEAM.MSG) - PostErrView( BEAM.ERR, BEAM.MSG) - BeamExec.AddApplyResultToGlobalList( BEAM.ERR, 0, BEAM.MSG) - BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) - WriteResultToJson( RESULT) - return - end - local b3Raw = EgtGetRawPartBBox( nRawId) - -- Calcolo posizione estremo TR o BR della tavola rispetto a sua origine in BL - local dPosY = EgtIf( BeamData.CENTER_BEAM, ( b3Tab:getDimY() + b3Raw:getDimY() * EgtIf( BeamData.RIGHT_LOAD, -1, 1)) / 2, EgtIf( BeamData.RIGHT_LOAD, 0, b3Tab:getDimY())) - BeamData.ptOriXR = Point3d( b3Tab:getDimX(), dPosY, 0) - BeamData.dPosXR = EgtIf( BeamData.RIGHT_LOAD, MCH_CR.BR, MCH_CR.TR) - -- Calcolo minimo grezzo scaricabile - BeamExec.CalcMinUnloadableRaw( b3Raw:getDimY(), b3Raw:getDimZ()) - -- altrimenti devo recuperare i pezzi per creare la barra - else - -- Barra da creare - bCreateBar = true - -- Recupero l'elenco ordinato delle travi - local nPartId = EgtGetFirstPart() - while nPartId do - table.insert( PARTS, { id = nPartId, sName = ( EgtGetName( nPartId) or ( 'Id=' .. tonumber( nPartId)))}) - nPartId = EgtGetNextPart( nPartId) - end - if #PARTS == 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) - BeamExec.AddApplyResultToGlobalList( BEAM.ERR, 0, BEAM.MSG) - BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) - WriteResultToJson( RESULT) - return - else - local sOut = '' - for i = 1, #PARTS do - sOut = sOut .. PARTS[i].sName .. ', ' - end - sOut = sOut:sub( 1, -3) - EgtOutLog( 'Travi trovate : ' .. sOut, 1) - end - -- Ne recupero le dimensioni - for i = 1, #PARTS do - local Ls = EgtGetFirstNameInGroup( PARTS[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 ' .. PARTS[i].sName - WriteErrToLogFile( BEAM.ERR, BEAM.MSG) - PostErrView( BEAM.ERR, BEAM.MSG) - BeamExec.AddApplyResultToGlobalList( BEAM.ERR, 0, BEAM.MSG) - BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) - WriteResultToJson( RESULT) - return - else - PARTS[i].b3PartOriginal = b3Solid - end - end - -- Assegno lunghezza della barra - dBarLen = PARTS[1].b3PartOriginal:getDimX() + 10 - if dBarLen < 2200 then - dBarLen = dBarLen + 1800 - end - -- Assegno posizione prima ed unica trave - PARTS[1].dPosX = 10 - end - - -- Altrimenti, opero sul progetto corrente - else - -- Recupero l'identificativo del gruppo di lavoro corrente - local nMGrpId = EgtGetCurrMachGroup() - -- Barra da creare - bCreateBar = true - -- Lunghezza della barra - dBarLen = EgtGetInfo( nMGrpId, 'BARLEN', 'd') - -- Recupero l'elenco ordinato delle travi da inserire nella barra - for i = 1, 100 do - local sKey = 'PART'..tostring( i) - local sVal = EgtGetInfo( nMGrpId, sKey) - local vVal = EgtSplitString( sVal or '') - if not vVal or #vVal < 2 then break end - local nPartId = tonumber( vVal[1]) - local dPosX = tonumber( vVal[2]) - table.insert( PARTS, { id = nPartId, dPosX = dPosX, sName = ( EgtGetName( nPartId) or ( 'Id=' .. tonumber( nPartId)))}) - end - if #PARTS == 0 then - BEAM.ERR = 14 - BEAM.MSG = 'Error : no beams in the project' - WriteErrToLogFile( BEAM.ERR, BEAM.MSG) - BeamExec.AddApplyResultToGlobalList( BEAM.ERR, 0, BEAM.MSG) - BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) - WriteResultToJson( RESULT) - return - else - local sOut = '' - for i = 1, #PARTS do - sOut = sOut .. PARTS[i].sName .. ', ' - end - sOut = sOut:sub( 1, -3) - EgtOutLog( 'Travi trovate : ' .. sOut, 1) - end - -- Ne recupero le dimensioni - for i = 1, #PARTS do - local Ls = EgtGetFirstNameInGroup( PARTS[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 ' .. PARTS[i].sName - WriteErrToLogFile( BEAM.ERR, BEAM.MSG) - BeamExec.AddApplyResultToGlobalList( BEAM.ERR, 0, BEAM.MSG) - BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) - WriteResultToJson( RESULT) - return - else - PARTS[i].b3PartOriginal = b3Solid - end - end - end - - -- recupero parametri generali da progetto - BeamExec.GetGeneralParameters() - - -- creo un gruppo temporaneo dove finiranno tutte le entità che non bisogna salvare, alla fine lo si cancella - local idTempGroup = BeamLib.CreateTempGroup() - - -- Se devo creare la barra - if bCreateBar then - if #PARTS == 0 then - -- Recupero l'identificativo del gruppo di lavoro corrente - local nMGrpId = EgtGetCurrMachGroup() - -- Recupero le dimensioni della barra - dRawW = EgtGetInfo(nMGrpId, 'BARWIDTH', 'd') - dRawH = EgtGetInfo(nMGrpId, 'BARHEIGHT', 'd') - else - -- Ne verifico le dimensioni - dRawW = PARTS[1].b3PartOriginal:getDimY() - dRawH = PARTS[1].b3PartOriginal:getDimZ() - end - local vBeamErr = {} - for i = 2, #PARTS do - local dDimW = PARTS[i].b3PartOriginal:getDimY() - local dDimH = PARTS[i].b3PartOriginal: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 .. PARTS[vBeamErr[i]].sName .. '\n' - table.remove( PARTS, vBeamErr[i]) - end - ResetMachGroup( PARTS) - 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 BeamData.MAX_WIDTH2 or not BeamData.MAX_HEIGHT2 then - if ( dRawW > BeamData.MAX_WIDTH + 10 * GEO.EPS_SMALL or dRawH > BeamData.MAX_HEIGHT + 10 * GEO.EPS_SMALL) then - ResetMachGroup( PARTS) - local sOut = 'Sezione (' .. EgtNumToString( dRawW, 2) .. ' x ' .. EgtNumToString( dRawH, 2) .. ') ' .. - 'oltre i limiti della macchina (' .. EgtNumToString( BeamData.MAX_WIDTH, 2) .. ' x ' .. EgtNumToString( BeamData.MAX_HEIGHT, 2) .. ') ' - BEAM.ERR = 17 - BEAM.MSG = sOut - WriteErrToLogFile( BEAM.ERR, BEAM.MSG) - PostErrView( BEAM.ERR, BEAM.MSG) - BeamExec.AddApplyResultToGlobalList( BEAM.ERR, 0, BEAM.MSG) - BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) - WriteResultToJson( RESULT) - return - end - else - if ( dRawW > BeamData.MAX_WIDTH + 10 * GEO.EPS_SMALL or dRawH > BeamData.MAX_HEIGHT + 10 * GEO.EPS_SMALL) and - ( dRawW > BeamData.MAX_WIDTH2 + 10 * GEO.EPS_SMALL or dRawH > BeamData.MAX_HEIGHT2 + 10 * GEO.EPS_SMALL) then - ResetMachGroup( PARTS) - local sOut = 'Sezione (' .. EgtNumToString( dRawW, 2) .. ' x ' .. EgtNumToString( dRawH, 2) .. ') ' .. - 'oltre i limiti della macchina (' .. EgtNumToString( BeamData.MAX_WIDTH, 2) .. ' x ' .. EgtNumToString( BeamData.MAX_HEIGHT, 2) .. ') ' .. - 'e (' .. EgtNumToString( BeamData.MAX_WIDTH2, 2) .. ' x ' .. EgtNumToString( BeamData.MAX_HEIGHT2, 2) .. ')' - BEAM.ERR = 17 - BEAM.MSG = sOut - WriteErrToLogFile( BEAM.ERR, BEAM.MSG) - PostErrView( BEAM.ERR, BEAM.MSG) - BeamExec.AddApplyResultToGlobalList( BEAM.ERR, 0, BEAM.MSG) - BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) - WriteResultToJson( RESULT) - return - end - end - - -- Verifico sezione barra non troppo piccola - if dRawW < BeamData.MIN_WIDTH - 10 * GEO.EPS_SMALL or dRawH < BeamData.MIN_HEIGHT - 10 * GEO.EPS_SMALL then - ResetMachGroup( PARTS) - local sOut = 'Sezione (' .. EgtNumToString( dRawW, 2) .. ' x ' .. EgtNumToString( dRawH, 2) .. ') ' .. - 'sotto i limiti della macchina (' .. EgtNumToString( BeamData.MIN_WIDTH, 2) .. ' x ' .. EgtNumToString( BeamData.MIN_HEIGHT, 2) .. ')' - BEAM.ERR = 17 - BEAM.MSG = sOut - WriteErrToLogFile( BEAM.ERR, BEAM.MSG) - PostErrView( BEAM.ERR, BEAM.MSG) - BeamExec.AddApplyResultToGlobalList( BEAM.ERR, 0, BEAM.MSG) - BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) - WriteResultToJson( RESULT) - return - end - - -- Lunghezza della barra - local dRawL = dBarLen + 0.1 - -- Sovramateriale di testa - local dOvmHead = 0 - if #PARTS > 0 then - dOvmHead = PARTS[1].dPosX or 0 - end - - -- Sistemo le travi nel grezzo - local bPbOk, sPbErr = BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, nil, PARTS, BEAM.FLAG ~= 6, bCalcBestPieceUnloadPosition) - if not bPbOk then - BEAM.ERR = 18 - BEAM.MSG = sPbErr - WriteErrToLogFile( BEAM.ERR, BEAM.MSG) - PostErrView( BEAM.ERR, BEAM.MSG) - BeamExec.AddApplyResultToGlobalList( BEAM.ERR, 0, BEAM.MSG) - BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) - WriteResultToJson( RESULT) - return - else - -- Scrivo altezza e larghezza barra nel gruppo di lavoro corrente - local nMGrpId = EgtGetCurrMachGroup() - EgtSetInfo(nMGrpId, 'BARHEIGHT', dRawH) - EgtSetInfo(nMGrpId, 'BARWIDTH', dRawW) - end - -- sistemazioni per pezzi nella barra - else - -- ciclo sui grezzi - local nRawId = EgtGetFirstRawPart() - while nRawId do - -- massimo un pezzo per grezzo - local nPartId = EgtGetFirstPartInRawPart( nRawId) - -- box del pezzo - local Ls = EgtGetFirstNameInGroup( nPartId, 'Box') - local b3Solid = EgtGetBBoxGlob( Ls or GDB_ID.NULL, GDB_BB.STANDARD) - -- se nel grezzo c'è un pezzo - if nPartId then - -- creo o pulisco gruppo geometrie aggiuntive - BeamLib.CreateOrEmptyAddGroup( nPartId) - -- aggiungo faccia per taglio iniziale al pezzo - BeamLib.AddPartStartFace( nPartId, b3Solid) - -- aggiungo faccia per taglio finale al pezzo - BeamLib.AddPartEndFace( nPartId, b3Solid) - end - -- passo al successivo grezzo - nRawId = EgtGetNextRawPart( nRawId) - end - -- elimino le lavorazioni - EgtRemoveAllOperations() - -- Recupero l'identificativo del gruppo di lavoro corrente - local nMGrpId = EgtGetCurrMachGroup() - -- Recupero l'elenco ordinato delle travi da inserire nella barra - for i = 1, 100 do - local sKey = 'PART'..tostring( i) - local sVal = EgtGetInfo( nMGrpId, sKey) - local vVal = EgtSplitString( sVal or '') - if not vVal or #vVal < 2 then break end - local nPartId = tonumber( vVal[1]) - local dPosX = tonumber( vVal[2]) - table.insert( PARTS, { nInd = #PARTS + 1, id = nPartId, dPosX = dPosX, sName = ( EgtGetName( nPartId) or ( 'Id=' .. tonumber( nPartId)))}) - end - -- se lunghezza barra non settata, la leggo ora - if not dBarLen then - dBarLen = EgtGetInfo( nMGrpId, 'BARLEN', 'd') - end - -- Recupero tutte le informazioni dei pezzi - local dLen = dBarLen - for i = 1, #PARTS do - -- aggiorno grezzo precedente - PARTS[i].idRaw = EgtGetRawPartFromPart( PARTS[i].id) - PARTS[i].bIsLastPart = ( i == #PARTS) - -- dimensioni del grezzo ( comprende sovramateriale di testa e lavorazione di coda per separazione) - PARTS[i].b3Raw = EgtGetRawPartBBox( PARTS[i].idRaw) - PARTS[i].dRawLength = PARTS[i].b3Raw:getDimX() - PARTS[i].dRawWidth = PARTS[i].b3Raw:getDimY() - PARTS[i].dRawHeight = PARTS[i].b3Raw:getDimZ() - -- dimensione pezzo finito - PARTS[i].idBoxTm = EgtGetFirstInGroup( EgtGetFirstNameInGroup( PARTS[i].id, 'Box') or GDB_ID.NULL) - PARTS[i].b3Part = EgtGetBBoxGlob( PARTS[i].idBoxTm, GDB_BB.STANDARD) - PARTS[i].dLength = PARTS[i].b3Part:getDimX() - PARTS[i].dWidth = PARTS[i].b3Part:getDimY() - PARTS[i].dHeight = PARTS[i].b3Part:getDimZ() - PARTS[i].bSquareSection = abs( PARTS[i].dWidth - PARTS[i].dHeight) < 100 * GEO.EPS_SMALL - PARTS[i].nIndexInParts = i - PARTS[i].SplittingPoints = BeamLib.GetPartSplittingPoints( PARTS[i]) - PARTS[i].NotClampableLength = { STD = { dHead = 0, dTail = 0}, SIDE = { dHead = 0, dTail = 0}, DOWN = { dHead = 0, dTail = 0}} - PARTS[i].sBTLInfo = EgtGetInfo( PARTS[i].id, 'PROJ', 's') or nil - PARTS[i].idTempGroup = idTempGroup - - PARTS[i].sAISetupConfig = EgtGetInfo( PARTS[i].id, 'AISETUP', 's') or - ( GENERAL_PARAMETERS.BTL[PARTS[i].sBTLInfo] and GENERAL_PARAMETERS.BTL[PARTS[i].sBTLInfo].sAISetupConfig) or -- i parametri BTL potrebbero non esistere - GENERAL_PARAMETERS.PROJECT.sAISetupConfig or nil - - -- si carica configurazione lavorazioni - TIMER:startElapsed('Json') - BeamExec.GetStrategiesFromJSONinBD( PARTS[i].sAISetupConfig) - PARTS[i].GeneralParameters = BeamLib.GetPieceGeneralParameters( PARTS[i], GENERAL_PARAMETERS_JSON) - TIMER:stopElapsed('Json') - PARTS[i].CombinationList = BeamExec.GetAvailableCombinations( PARTS[i], bCalcBestPieceUnloadPosition) - - -- sovramateriale in testa al pezzo - local dDeltaS = max( PARTS[i].dPosX - ( dBarLen - dLen), 0) - PARTS[i].dHeadOverMaterial = dDeltaS - - -- lunghezza grezzo (comprende sovramateriale di testa e mm tagliati in coda dalla lavorazione, tipicamente 5.4mm dello spessore lama) - local dCrawLen = PARTS[i].dRawLength - -- materiale tolto in coda dalla lavorazione di separazione - local dDeltaE = dCrawLen - PARTS[i].dLength - dDeltaS - local dDeltaNextPiece - if PARTS[i+1] then - dDeltaNextPiece = PARTS[i+1].dPosX - ( dBarLen - dLen) - dCrawLen + dDeltaE - else - dDeltaNextPiece = 10000 - end - PARTS[i].dDistanceToNextPiece = dDeltaNextPiece - - -- aggiorno la lunghezza residua della barra - dLen = dLen - dCrawLen - PARTS[i].dRestLength = dLen - end - end - - -- Se richiesta solo barra, esco - if BEAM.FLAG == 6 then - -- Completamento senza errori e avvisi - if nWarnCnt == 0 then - BEAM.ERR = 0 - BEAM.MSG = '---' - WriteErrToLogFile( BEAM.ERR, BEAM.MSG) - BeamExec.AddApplyResultToGlobalList( BEAM.ERR, 0, BEAM.MSG) - BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) - WriteResultToJson( RESULT) - end - EgtOutLog( ' +++ BatchProcess completed') - return - end - - -- Imposto Nome file CN - local _, sName, _ = EgtSplitPath( BEAM.FILE) - EgtSetInfo( EgtGetCurrMachGroup(), 'NcName', sName .. '.cnc') - - -- Abilito Vmill - EgtSetInfo( EgtGetCurrMachGroup(), 'Vm', '1') - - -- Aggiorno Setup utensili - EgtImportSetup() - - -- Lavoro le features - -- TODO gestire errori e messaggi di ritorno in questo caso - if not GetDataConfig() then return end - - BeamExec.GetProcessings( PARTS, bCalcBestPieceUnloadPosition) - BeamExec.GetCombinationMatrix( PARTS, bCalcBestPieceUnloadPosition) + BeamExec.GetProcessings( PARTS, false) + BeamExec.GetCombinationMatrix( PARTS, false) BeamExec.ProcessMachinings( PARTS) - - -- si cancella gruppo temporaneo contenente entità da cancellare - EgtErase( idTempGroup) - + local nErrCnt = 0 + local nWarnCnt = 0 local sOutput = '' - - -- scrittura txt risultati for i = 1, #RESULT do local sMsg = '' if RESULT[i].sType == 'Feature' then - if RESULT[i].ChosenStrategy.bIsApplyOk then - sMsg = RESULT[i].ChosenStrategy.sInfo - else - sMsg = RESULT[i].ChosenStrategy.sApplyInfo - end + sMsg = RESULT[i].ChosenStrategy.sInfo elseif RESULT[i].sType == 'Part' then sMsg = RESULT[i].sMsg end @@ -718,17 +307,8 @@ if bToProcess then sMsg = string.gsub( sMsg or '', '\r', ' ', 10) -- trovata almeno una strategia e feature lavorata completamente if RESULT[i].sType == 'Feature' and RESULT[i].ChosenStrategy.sStatus == 'Completed' then - if #EgtTrim( sMsg) > 0 then - BEAM.ERR = -19 - BEAM.MSG = sMsg - else - BEAM.ERR = 0 - BEAM.MSG = '---' - end - BEAM.ROT = -( RESULT[i].nRotation or 1) + 1 - BEAM.CUTID = RESULT[i].idCut - BEAM.TASKID = RESULT[i].idTask - WriteErrToLogFile( BEAM.ERR, BEAM.MSG, BEAM.ROT, BEAM.CUTID, BEAM.TASKID) + sOutput = sOutput .. string.format( '[%d,%d] %s\n', RESULT[i].idCut, RESULT[i].idTask, sMsg or '') + -- trovata almeno una strategia ma nessuna applicabile oppure non trovata alcuna strategia elseif RESULT[i].sType == 'Feature' and ( ( RESULT[i].ChosenStrategy.sStatus == 'Not-Applicable') @@ -739,202 +319,66 @@ if bToProcess then sMsg = 'No applicable strategy found' end sOutput = sOutput .. string.format( '[%d,%d] %s\n', RESULT[i].idCut, RESULT[i].idTask, sMsg) - BEAM.ERR = 19 - BEAM.MSG = sMsg - BEAM.ROT = -( RESULT[i].nRotation or 1) + 1 - BEAM.CUTID = RESULT[i].idCut - BEAM.TASKID = RESULT[i].idTask - WriteErrToLogFile( BEAM.ERR, BEAM.MSG, BEAM.ROT, BEAM.CUTID, BEAM.TASKID) else -- segnalazione scarico pezzo standard, incompleto o a caduta if RESULT[i].sType == 'Part' and ( RESULT[i].nErr == -100 or RESULT[i].nErr == -101 or RESULT[i].nErr == -102) then - BEAM.ERR = 0 - BEAM.MSG = sMsg - BEAM.CUTID = RESULT[i].idCut - BEAM.FALL = abs( RESULT[i].nErr + 100) - WriteFallToLogFile( BEAM.ERR, BEAM.MSG, BEAM.CUTID, BEAM.FALL) - -- errore da post apply, al momento non specifico - elseif RESULT[i].sType == 'Part' and RESULT[i].nErr > 0 then - nErrCnt = nErrCnt + 1 - sOutput = sOutput .. string.format( '[%d,%d] %s\n', RESULT[i].idCut, RESULT[i].idTask, sMsg) - BEAM.ERR = 19 - BEAM.MSG = 'Clamp impossible' - WriteErrToLogFile( BEAM.ERR, BEAM.MSG) - return + -- nulla da segnalare + -- feature incompleta e altro elseif RESULT[i].sType == 'Feature' and RESULT[i].ChosenStrategy.sStatus == 'Not-Completed' then nWarnCnt = nWarnCnt + 1 + sMsg = 'Incomplete : Completion index ' .. RESULT[i].ChosenStrategy.dCompletionIndex .. '/5\n' .. sMsg sOutput = sOutput .. string.format( '[%d,%d] %s\n', RESULT[i].idCut, RESULT[i].idTask, sMsg) - BEAM.ERR = -19 - BEAM.MSG = 'Incomplete : Completion index ' .. RESULT[i].ChosenStrategy.dCompletionIndex .. '/5\n' .. sMsg - BEAM.ROT = -( RESULT[i].nRotation or 1) + 1 - BEAM.CUTID = RESULT[i].idCut - BEAM.TASKID = RESULT[i].idTask - WriteErrToLogFile( BEAM.ERR, BEAM.MSG, BEAM.ROT, BEAM.CUTID, BEAM.TASKID) + end end end - -- TODO: se scarico a caduta (-101, -102) le lavorazioni dopo separazione vanno disattivate. Scrivere info feature incompleta su quelle feature + -- cancello gruppo temporaneo + local idTempGroup = BeamLib.GetTempGroup() + EgtErase( idTempGroup) - -- Salvo il progetto - EgtSaveFile( sNgeFile) - -- copio come originale (per dichiarare progetto ricalcolato) - EgtCopyFile( sNgeFile, sOriFile) - - -- Visualizzazione avvisi o errori if #sOutput > 0 then EgtOutLog( sOutput) end if nErrCnt > 0 then - PostErrView( 19, sOutput) + EgtOutBox( sOutput, 'Lavora Travi', 'ERRORS') + return false elseif nWarnCnt > 0 then - PostWarnView( 19, sOutput) + EgtOutBox( sOutput, 'Lavora Travi', 'WARNINGS') + return true end --- Altrimenti carico il progetto salvato e dichiaro nessun errore -else - EgtOutLog( ' +++ Loading Project already processed >>>') - -- Carico il progetto già fatto - EgtOpenFile( sNgeFile) - -- 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 or BEAM.FLAG == 8 then - EgtOutLog( ' +++ Recalculating all dispositions and machinings >>>') - EgtImportSetup() - EgtApplyAllMachinings() - -- Salvo il progetto - EgtSaveFile( sNgeFile) - -- copio come originale (per dichiarare progetto ricalcolato) - EgtCopyFile( sNgeFile, sOriFile) - end + return true end +------------------------------------------------------------------------------------------------------------- +-- *** Esecuzione *** +------------------------------------------------------------------------------------------------------------- + +-- calcolo tempo esecuzione +TIMER:start() +EgtOutLog( ' Execution timer started') + +-- script principale + +if not MyProcessInputData() then return end + +-- recupero parametri generali da progetto +BeamExec.GetGeneralParameters() + +-- creo un gruppo temporaneo dove finiranno tutte le entità che non bisogna salvare, alla fine lo si cancella +BeamLib.CreateTempGroup() + +if not MyProcessBeams() then return end + +if not GetDataConfig() then return end + +-- Abilito Vmill +EgtSetInfo( EgtGetCurrMachGroup(), 'Vm', '1') + +MyProcessFeatures() + -- log tempi di esecuzione if EgtGetDebugLevel() >= 3 then TIMER:logAllElapsed() 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 - BEAM.ERR = 19 - BEAM.MSG = 'Error in setup: tool/s ' .. sToolsList .. ' not found' - WriteErrToLogFile( BEAM.ERR, BEAM.MSG, 0, 0, 0) - BeamExec.AddApplyResultToGlobalList( BEAM.ERR, 0, BEAM.MSG) - BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) - WriteResultToJson( RESULT) - 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) - -- TODO gestire collisione su feature specifica!!!!!!!!!!!!!!!!!!!!!!!!!!!! - BeamExec.AddApplyResultToGlobalList( BEAM.ERR, BEAM.CUTID, BEAM.MSG) - BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) - WriteResultToJson( RESULT) - 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) - BeamExec.AddApplyResultToGlobalList( BEAM.ERR, 0, BEAM.MSG) - BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) - WriteResultToJson( RESULT) - 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) - BeamExec.AddApplyResultToGlobalList( BEAM.ERR, 0, BEAM.MSG) - BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) - WriteResultToJson( RESULT) - return -end -local Ttot = EgtGetInfo( EgtGetCurrMachGroup(), 'Ttot', 'd') -local sTime = 'Total Time = ' .. EgtNumToString( Ttot, 1) -EgtOutLog( sTime) - --- Se modifica o simula, imposto la vista ISO 3d opportuna -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( BeamData.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) -RESULT[#RESULT+1] = { dTime = Ttot, sType = 'Time'} - --- Riporto risultati in tabella globale BEAM -BEAM.RESULT = BeamLib.TableCopyDeep( RESULT) --- Scrittura json risultati -WriteResultToJson( RESULT) - -EgtOutLog( ' +++ BatchProcess completed') diff --git a/LuaLibs/BeamExec.lua b/LuaLibs/BeamExec.lua index 6b7d246..e9a66fc 100644 --- a/LuaLibs/BeamExec.lua +++ b/LuaLibs/BeamExec.lua @@ -970,7 +970,6 @@ local function CalculateStrategies( vProcSingleRot, Part) -- eseguo file config con i parametri di default local CurrentStrategy = {} CurrentStrategy = RunStrategyLibraries( Proc.AvailableStrategies[nIndexCurrentStrategy].sStrategyId) - -- TODO in caso di ulteriore ciclo dovuto a errori imprevisti, controllare se questa strategia è quella che ha dato errore e disabilitarla senza calcolare nulla -- controllo che le librerie siano state effettivamente caricate if CurrentStrategy.Config and CurrentStrategy.Script then -- eseguo la strategia solo come calcolo fattibilità e voto. Non si applicano le lavorazioni. Si passa la Proc e i parametri personalizzati diff --git a/Process.lua b/Process.lua index 1ef58aa..344415e 100644 --- a/Process.lua +++ b/Process.lua @@ -15,9 +15,6 @@ EgtAddToPackagePath( BEAM.BASEDIR .. '\\LuaLibs\\?.lua') EgtAddToPackagePath( BEAM.BASEDIR .. '\\Strategies\\Standard\\?.lua') EgtAddToPackagePath( BEAM.BASEDIR .. '\\StrategyLibs\\?.lua') --- TODO forzatura calcolo con prerotazioni. Cancellare dopo che è stata aggiunta la gestione corretta -local bCalcBestPieceUnloadPosition = true - -- Verifico che la macchina corrente sia abilitata per la lavorazione delle Travi local sMachDir = EgtGetCurrMachineDir() if not sMachDir then @@ -290,7 +287,7 @@ local function MyProcessBeams() end -- Sistemo le travi nel grezzo - local bOk, sErr = BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, dOvmMid, PARTS, nil, bCalcBestPieceUnloadPosition) + local bOk, sErr = BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, dOvmMid, PARTS, nil, false) if not bOk then EgtOutLog( sErr) EgtOutBox( sErr, 'Lavora Travi', 'ERROR') @@ -305,8 +302,8 @@ end ------------------------------------------------------------------------------------------------------------- local function MyProcessFeatures() - BeamExec.GetProcessings( PARTS, bCalcBestPieceUnloadPosition) - BeamExec.GetCombinationMatrix( PARTS, bCalcBestPieceUnloadPosition) + BeamExec.GetProcessings( PARTS, false) + BeamExec.GetCombinationMatrix( PARTS, false) BeamExec.ProcessMachinings( PARTS) local nErrCnt = 0 local nWarnCnt = 0