Files
DataWall/Process.lua
T
Dario Sassi 111496f5a7 DataWall :
- primo commit.
2020-04-09 08:05:41 +00:00

293 lines
11 KiB
Lua

-- Process.lua by Egaltech s.r.l. 2020/04/06
-- Gestione calcolo disposizione e lavorazioni per Pareti
-- Si opera sulla macchina corrente
-- Intestazioni
require( 'EgtBase')
_ENV = EgtProtectGlobal()
EgtEnableDebug( false)
-- Imposto direttorio libreria specializzata per Travi
local sBaseDir = EgtGetSourceDir()
EgtAddToPackagePath( sBaseDir .. 'LuaLibs\\?.lua')
-- Verifico che la macchina corrente sia abilitata per la lavorazione delle Pareti
local sMachDir = EgtGetCurrMachineDir()
if not sMachDir then
EgtOutBox( 'Errore nel caricamento della macchina corrente', 'Lavora Pareti', 'ERROR')
return
end
if not EgtExistsFile( sMachDir .. '\\Wall\\WallData.lua') then
EgtOutBox( 'La macchina corrente non è configurata per lavorare pareti', 'Lavora Pareti', 'ERROR')
return
end
-- Elimino direttori altre macchine e imposto direttorio macchina corrente per ricerca librerie
EgtRemoveBaseMachineDirFromPackagePath()
EgtAddToPackagePath( sMachDir .. '\\Wall\\?.lua')
-- Segnalazione avvio
EgtOutLog( '*** Wall Process Start ***', 1)
-- Carico le librerie
--_G.package.loaded.BeamExec = nil
--local BE = require( 'BeamExec')
--local BL = require( 'BeamLib')
-- Carico i dati globali
local WD = require( 'WallData')
-- Variabili di modulo
local vWall = {}
local dRawH
-------------------------------------------------------------------------------------------------------------
-- *** Recupero le pareti 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, #vWall do
if vWall[i].Id == nPartId then
bFound = true
break
end
end
if not bFound then
table.insert( vWall, { Id = nPartId, Name = ( EgtGetName( nPartId) or ( 'Id=' .. tonumber( nPartId)))})
end
end
nId = EgtGetNextSelectedObj()
end
if #vWall == 0 then
EgtOutBox( 'Non sono state selezionate pareti', 'Lavora Pareti', 'ERROR')
return false
else
local sOut = ''
for i = 1, #vWall do
sOut = sOut .. vWall[i].Name .. ', '
end
sOut = sOut:sub( 1, -3)
EgtOutLog( 'Pareti selezionate : ' .. sOut, 1)
end
-- Ne recupero e verifico le dimensioni
for i = 1, #vWall do
local Ls = EgtGetFirstNameInGroup( vWall[i].Id, 'Box')
local b3Solid = EgtGetBBoxGlob( Ls or GDB_ID.NULL, GDB_BB.STANDARD)
if not b3Solid then
EgtOutBox( 'Box non definito per la parete ' .. vWall[i].Name, 'Lavora Pareti', 'ERROR')
return false
else
vWall[i].Box = b3Solid
end
end
dRawH = vWall[1].Box:getDimZ()
local vWallErr = {}
for i = 2, #vWall do
local dDimH = vWall[i].Box:getDimZ()
if abs( dDimH - dRawH) > 10 * GEO.EPS_SMALL then
table.insert( vWallErr, i)
end
end
if #vWallErr > 0 then
local sOut = 'Rimosse pareti con spessore diverso dalla prima :\n'
for i = #vWallErr, 1, -1 do
sOut = sOut .. vWall[vWallErr[i]].Name .. '\n'
EgtDeselectPartObjs( vWall[vWallErr[i]].Id)
table.remove( vWall, vWallErr[i])
end
EgtOutLog( sOut, 1)
EgtOutBox( sOut, 'Lavora Travi', 'INFO')
EgtDraw()
return false
end
EgtDeselectAll()
return true
end
-------------------------------------------------------------------------------------------------------------
-- *** Inserimento delle pareti nel grezzo ***
-------------------------------------------------------------------------------------------------------------
local function MyProcessWalls()
-- Lunghezza totale delle pareti
local dTotLen = 0
for i = 1, #vWall - 1 do
dTotLen = dTotLen + vWall[i].Box:getDimX()
end
dTotLen = dTotLen + max( vWall[#vWall].Box:getDimX(), WD.MIN_LENGTH)
local dAddLen = WD.OVM_HEAD + ( #vWall - 1) * WD.OVM_MID
EgtOutLog( 'Ltot : ' .. EgtNumToString( dTotLen, 1) .. ' Lagg : '.. EgtNumToString( dAddLen, 1), 1)
-- Larghezza massima delle pareti
local dMaxWid = 0
for i = 1, #vWall do
if vWall[i].Box:getDimY() > dMaxWid then
dMaxWid = dMaxWid + vWall[i].Box:getDimY()
end
end
-- Richiedo lunghezza del grezzo e sovramateriale di testa
local vsVal = EgtDialogBox( 'Lavora Pareti' .. ' (Ltot='.. EgtNumToString( dTotLen + dAddLen + 0.5, 0) .. ', Wmax=' .. EgtNumToString( dMaxWid + 0.5, 0) .. ')',
{'Lunghezza grezzo', EgtNumToString( WD.STD_RAW_LENGTH, 0)},
{'Larghezza grezzo', EgtNumToString( WD.STD_RAW_WIDTH, 0)},
{'Sovramateriale', EgtNumToString( WD.OVM_HEAD, 0)})
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 Pareti', 'WARNING')
EgtDraw()
return false
end
dRawL = min( dRawL, WD.MAX_LENGTH)
local dRawW = EgtEvalNumExpr( vsVal[2])
if not dRawW then
local sOut = 'Larghezza grezzo errata : ' .. vsVal[2]
EgtOutLog( sOut)
EgtOutBox( sOut, 'Lavora Pareti', 'WARNING')
EgtDraw()
return false
end
dRawW = min( dRawW, WD.MAX_WIDTH )
local dOvmHead = EgtEvalNumExpr( vsVal[3])
if not dOvmHead then
local sOut = 'Sovramateriale di testa errato : ' .. vsVal[3]
EgtOutLog( sOut)
EgtOutBox( sOut, 'Lavora Pareti', 'WARNING')
EgtDraw()
return false
end
-- Verifico dimensioni massime grezzo
if dRawL > WD.MAX_LENGTH + 10 * GEO.EPS_SMALL or dRawW > WD.MAX_WIDTH + 10 * GEO.EPS_SMALL or dRawH > WD.MAX_HEIGHT + 10 * GEO.EPS_SMALL then
local sOut = 'Grezzo (' .. EgtNumToString( dRawL, 2) .. ' x ' .. EgtNumToString( dRawW, 2) .. ' x ' .. EgtNumToString( dRawH, 2) .. ') ' ..
'oltre il limite della macchina ('..EgtNumToString( WD.MAX_LENGTH, 2)..' x '..EgtNumToString( WD.MAX_WIDTH, 2)..' x '..EgtNumToString( WD.MAX_HEIGHT, 2)..') '
EgtOutLog( sOut)
EgtOutBox( sOut, 'Lavora Pareti', 'WARNING')
EgtDraw()
return false
end
-- Verifico dimensioni minime del grezzo
if dRawL < WD.MIN_LENGTH - 10 * GEO.EPS_SMALL or dRawW < WD.MIN_WIDTH - 10 * GEO.EPS_SMALL or dRawH < WD.MIN_HEIGHT - 10 * GEO.EPS_SMALL then
local sOut = 'Grezzo (' .. EgtNumToString( dRawL, 2) .. ' x ' .. EgtNumToString( dRawW, 2) .. ' x ' .. EgtNumToString( dRawH, 2) .. ') ' ..
'sotto il limite della macchina ('..EgtNumToString( WD.MIN_LENGTH, 2)..' x '..EgtNumToString( WD.MIN_WIDTH, 2)..' x '..EgtNumToString( WD.MIN_HEIGHT, 2)..')'
EgtOutLog( sOut)
EgtOutBox( sOut, 'Lavora Pareti', 'WARNING')
EgtDraw()
return false
end
-- Sistemo le pareti nel grezzo
-- Creazione nuovo gruppo di lavoro
local sMgName = EgtGetMachGroupNewName( 'Mach')
local NewMgId = EgtAddMachGroup( sMgName)
if not NewMgId then
local sOut = 'Errore nella creazione del gruppo di lavoro ' .. sMgName
return false, sOut
end
-- Impostazione della tavola
EgtSetTable( 'Tab')
-- Area tavola
local b3Tab = EgtGetTableArea()
-- Calcolo posizione estremo TR della tavola rispetto a sua origine in BL
WD.OriTR = Point3d( b3Tab:getDimX(), b3Tab:getDimY(), 0)
-- Impostazione dell'attrezzaggio di default
EgtImportSetup()
-- Creazione del grezzo e suo posizionamento in macchina
local nRaw = EgtAddRawPart( Point3d(0,0,0), dRawL, dRawW, dRawH, WD.RAWCOL)
EgtMoveToCornerRawPart( nRaw, WD.OriTR, MCH_CR.TR)
-- Inserimento dei pezzi nel grezzo
local Cnt = 0
local Len = dRawL
local DeltaS = dOvmHead
local DeltaE = WD.OVM_MID
for i = 1, #vWall do
-- assegno identificativo pezzo
local Pz = vWall[i].Id
-- dati del pezzo
local b3Part = EgtGetBBoxGlob( Pz or GDB_ID.NULL, GDB_BB.EXACT)
local b3Solid = vWall[i].Box
if b3Part:isEmpty() or b3Solid:isEmpty() then break end
-- se spessore compatibile e lunghezza disponibile sufficiente
local PartLen = b3Solid:getDimX()
local PartWidth = b3Solid:getDimY()
local PartHeight = b3Solid:getDimZ()
local NextLen = Len - DeltaS - PartLen - DeltaE
if ( dRawW > PartWidth - 10 * GEO.EPS_SMALL and abs( PartHeight - dRawH) < 10 * GEO.EPS_SMALL) and NextLen + DeltaE >= 0 then
-- eventuale sovramateriale di testa
if vWall[i].PosX then
DeltaS = max( vWall[i].PosX - ( dRawL - Len), 0)
end
-- dimensioni del grezzo
local CrawLen = min( PartLen + DeltaS + DeltaE, Len)
local Delta = Len - PartLen - DeltaS
-- inserisco il pezzo nel grezzo
EgtDeselectPartObjs( Pz)
local ptPos = b3Part:getMin() - b3Solid:getMin() + Vector3d( Delta, dRawW - PartWidth - dOvmHead, ( dRawH - PartHeight) / 2)
EgtAddPartToRawPart( Pz, ptPos, nRaw)
-- aggiorno la lunghezza residua della barra
Len = Len - CrawLen
end
DeltaS = 0
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
nWarnCnt = nWarnCnt + 1
sOutput = sOutput .. string.format( '[%d,%d] %s\n', Stats[i].CutId, Stats[i].TaskId, Stats[i].Msg)
end
end
if #sOutput > 0 then EgtOutLog( sOutput) end
if nErrCnt > 0 then
EgtOutBox( sOutput, 'Lavora Travi', 'ERRORS')
EgtDraw()
return false
elseif nWarnCnt > 0 then
EgtOutBox( sOutput, 'Lavora Travi', 'WARNINGS')
EgtDraw()
return true
end
return true
end
-------------------------------------------------------------------------------------------------------------
-- *** Esecuzione ***
-------------------------------------------------------------------------------------------------------------
if not MyProcessInputData() then return end
if not MyProcessWalls() then return end
-- Abilito Vmill
EgtSetInfo( EgtGetCurrMachGroup(), 'Vm', '1')
--if not MyProcessFeatures() then return end