59934d0fdf
- in Process (lancio da EgtCAM5 quindi uso praticamente solo interno) aggiunta possibilità di tenere ordine pezzi in barra come da selezione.
285 lines
11 KiB
Lua
285 lines
11 KiB
Lua
-- 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)},
|
|
{'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
|
|
|
|
-- Sistemo sezione barra con travi
|
|
local bVert = ( vsVal[3] == '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[4] == '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, 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
|