c6ced91b14
- Aggiunta funzione dedicata alla creazione del gruppo ausiliario al MachGroup - Alla funzione BeamExec.GetCombinationListFromMatrix si può passare una lista con le sole combinazioni da provare - Nella BeamExec aggiunta funzione ProcessAlternatives solo per provare le alternative (simile alla ProcessFeatures, ma completamente slegata). La ProcessFeature decide il posizionamento iniziale, la ProcessAlternatives verifica solamente le alternative. - FlipRot adeguata a nuovo funzionamento - Altre piccole migliorie varie - TODO : 1) manca la parte per settare nelle info pezzo la rotazione iniziale (per vista in Aedifica) e le altre alternative (per ottimizzazione in nesting) 2) In FlipRot gestire interazione con Aedifica, dato che verrà lanciato direttamente dal programma (per ora funziona lanciato come la Process)
241 lines
8.5 KiB
Lua
241 lines
8.5 KiB
Lua
-- 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)
|
|
|
|
-- Imposto direttorio libreria specializzata per Travi
|
|
EgtAddToPackagePath( BEAM.BASEDIR .. '\\LuaLibs\\?.lua')
|
|
-- Imposto direttorio strategie. N.B. Le strategie dovranno essere caricate con il nome del direttorio padre
|
|
EgtAddToPackagePath( BEAM.BASEDIR .. '\\Strategies\\Standard\\?.lua')
|
|
EgtAddToPackagePath( BEAM.BASEDIR .. '\\StrategyLibs\\?.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\\BeamDataNew.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.BasicCustomerStrategies = nil
|
|
_G.package.loaded.BeamExec = nil
|
|
_G.package.loaded.BeamLib = nil
|
|
_G.package.loaded.DiceCut = nil
|
|
_G.package.loaded.FaceData = nil
|
|
_G.package.loaded.FeatureLib = nil
|
|
_G.package.loaded.Identity = nil
|
|
_G.package.loaded.Logs = nil
|
|
_G.package.loaded.MachiningLib = nil
|
|
_G.package.loaded.PreSimulationLib = nil
|
|
_G.package.loaded.LeadInOutLib = nil
|
|
-- strategie di base sempre presenti
|
|
_G.package.loaded['HEADCUT\\HEADCUT'] = nil
|
|
_G.package.loaded['TAILCUT\\TAILCUT'] = nil
|
|
-- libreria macchina
|
|
_G.package.loaded.BeamDataNew = nil
|
|
-- libreria calcolo tempo esecuzione
|
|
_G.package.loaded.TimeLib = nil
|
|
|
|
-- TODO controllare se c'è un modo migliore per resettare librerie delle strategie caricate precedentemente
|
|
-- Per ottimizzare potremmo anche ciclare solo fino al numero di strategie raggiunto per il momento.
|
|
-- Infatti difficile ci siano 9999 strategie.
|
|
-- reset strategie caricate come librerie
|
|
for i = 1, 9999 do
|
|
local idSTRTemp = EgtReplaceString( EgtNumToString( i/10000, -4), '0.', '')
|
|
local sLibraryToReload = "STR" .. idSTRTemp .. "\\STR" .. idSTRTemp
|
|
if _G.package.loaded[sLibraryToReload] then
|
|
_G.package.loaded[sLibraryToReload] = nil
|
|
end
|
|
end
|
|
local vtCoreStrategiesNames = EgtFindAllFiles( BEAM.BASEDIR .. '\\StrategyLibs\\*.lua')
|
|
for i = 1, #vtCoreStrategiesNames do
|
|
local sCurrentName = EgtSplitString( vtCoreStrategiesNames[i], '.')[1]
|
|
if _G.package.loaded[sCurrentName] then
|
|
_G.package.loaded[sCurrentName] = nil
|
|
end
|
|
end
|
|
|
|
|
|
-- Variabili globali
|
|
PARTS = {} -- tabella contenente tutte le informazioni di ogni pezzo
|
|
|
|
-- Carico i dati globali
|
|
local BeamData = require( 'BeamDataNew')
|
|
-- carico librerie
|
|
local BeamExec = require( 'BeamExec')
|
|
local BeamLib = require( 'BeamLib')
|
|
|
|
-------------------------------------------------------------------------------------------------------------
|
|
-- *** Recupero trave (E' SEMPRE E SOLO UNA) ***
|
|
-------------------------------------------------------------------------------------------------------------
|
|
local function MyProcessInputData()
|
|
-- Recupero il pezzo e i suoi dati
|
|
local nId = EgtGetFirstPart()
|
|
if nId then
|
|
table.insert( PARTS, { nInd = #PARTS + 1, id = nId, sName = ( EgtGetName( nId) or ( 'Id=' .. tonumber( nId)))})
|
|
local Ls = EgtGetFirstNameInGroup( PARTS[1].id, 'Box')
|
|
local b3Solid = EgtGetBBoxGlob( Ls or GDB_ID.NULL, GDB_BB.STANDARD)
|
|
if not b3Solid then
|
|
return false
|
|
end
|
|
PARTS[1].b3PartOriginal = b3Solid
|
|
else
|
|
return false
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
-------------------------------------------------------------------------------------------------------------
|
|
local function GetDataConfig()
|
|
-- recupero utensili dal magazzino
|
|
BeamExec.GetToolsFromDB()
|
|
-- TODO da gestire eventuali errori bloccanti
|
|
return true
|
|
end
|
|
|
|
-------------------------------------------------------------------------------------------------------------
|
|
-- *** Inserimento delle travi nel grezzo ***
|
|
-------------------------------------------------------------------------------------------------------------
|
|
local function MyProcessBeams()
|
|
-- Lunghezza totale delle travi
|
|
local dLen = PARTS[1].b3PartOriginal:getDimX()
|
|
local dRawW = PARTS[1].b3PartOriginal:getDimY()
|
|
local dRawH = PARTS[1].b3PartOriginal:getDimZ()
|
|
|
|
-- Determinazione minimo grezzo scaricabile
|
|
BeamExec.CalcMinUnloadableRaw( dRawW, dRawH)
|
|
|
|
local dOvmHead = BeamData.OVM_HEAD or 10
|
|
local dOvmMid = BeamData.OVM_MID or 10
|
|
|
|
local dRawL = max( dLen + dOvmHead + dOvmMid, BeamData.dMinRaw)
|
|
|
|
-- Recupero info pezzi
|
|
local bOk, sErr = BeamExec.ProcessBeams( dRawW, dRawH, dRawL, dOvmHead, dOvmMid, PARTS, nil, true)
|
|
if not bOk then
|
|
EgtOutLog( sErr)
|
|
return false
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
-------------------------------------------------------------------------------------------------------------
|
|
-- *** Inserimento delle lavorazioni nelle travi ***
|
|
-------------------------------------------------------------------------------------------------------------
|
|
local function MyProcessFeatures()
|
|
|
|
BeamExec.GetProcessings( PARTS, true)
|
|
BeamExec.GetCombinationMatrix( PARTS, true)
|
|
BeamExec.ProcessMachinings( PARTS)
|
|
local nErrCnt = 0
|
|
local nWarnCnt = 0
|
|
local sOutput = ''
|
|
for i = 1, #RESULT do
|
|
local sMsg = ''
|
|
if RESULT[i].sType == 'Feature' then
|
|
sMsg = RESULT[i].ChosenStrategy.sInfo
|
|
elseif RESULT[i].sType == 'Part' then
|
|
sMsg = RESULT[i].sMsg
|
|
end
|
|
sMsg = string.gsub( sMsg or '', '\n', ' ', 10)
|
|
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
|
|
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')
|
|
or ( not RESULT[i].ChosenStrategy.sStrategyName)) then
|
|
|
|
nErrCnt = nErrCnt + 1
|
|
if #sMsg == 0 then
|
|
sMsg = 'No applicable strategy found'
|
|
end
|
|
sOutput = sOutput .. string.format( '[%d,%d] %s\n', RESULT[i].idCut, RESULT[i].idTask, sMsg)
|
|
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
|
|
-- 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)
|
|
|
|
end
|
|
end
|
|
end
|
|
|
|
-- si calcolano alternative
|
|
BeamExec.ProcessAlternatives( PARTS)
|
|
|
|
-- cancello gruppo temporaneo
|
|
local idTempGroup = BeamLib.GetTempGroup()
|
|
EgtErase( idTempGroup)
|
|
|
|
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 ***
|
|
-------------------------------------------------------------------------------------------------------------
|
|
|
|
-- 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
|
|
|