Files
Saomad-Just3500/Scripts/InitDisp.lua
T
2024-07-17 13:02:09 +02:00

250 lines
8.6 KiB
Lua

-- Disposition Init for Saomad Just3500 2024/02/07
-- Intestazioni
require( 'EgtBase')
_ENV = EgtProtectGlobal()
EgtEnableDebug( false)
--------------------------------------------------------------------------------
-- Colore del grezzo
local ColA = Color3d( 255, 165, 0, 30)
--------------------------------------------------------------------------------
-- COSTANTI
local DIM_CAR = 1430
local DIST_CARR_OPEN = 470
local DIMTABY = 250
local MAXDIMPIECE1CAR = 1500
local TABNAME_1PZ = 'Tab'
local TABNAME_2PZ = 'Tab2'
-- Variabili globali modulo
local vPiece = {}
--------------------------------------------------------------------------------
-- * Verifica esistenza MachGroup *
if not EgtGetCurrMachGroup() then
EgtOutLog( 'InitDisp for Saomad-Just3500 : missing CurrMachGroup')
DISP.ERR = 1
return
end
-------------------------------------------------------------------------------------------------------------
-- recupero i pezzi da processare
function MyProcessInputData()
-- controllo che esista il pezzo
local nIdpz = DISP.PARTID
if not nIdpz or nIdpz == GDB_ID.NULL then
DISP.ERR = 0
return false
end
-- Recupero i dati del pezzo
local nId = EgtGetFirstNameInGroup( nIdpz, 'Solid')
if not nId then
EgtOutBox( 'SOLID non definito per pezzo: ' .. EgtGetName( nIdpz), 'Info', 'ERROR')
return false
end
-- salvo i pezzi in lista
local vsPiece = EgtSplitString( DISP.PARTS)
for i = 1, #vsPiece do
table.insert( vPiece, { Ind = #vPiece + 1, Id = tonumber( vsPiece[i]), Name = ( EgtGetName( vsPiece[i]) or ( 'Id=' .. tonumber( vsPiece[i])))})
local Ls = EgtGetFirstNameInGroup( vPiece[i].Id, 'Box')
local b3Solid = EgtGetBBoxGlob( Ls or GDB_ID.NULL, GDB_BB.STANDARD)
if not b3Solid then
EgtOutBox( 'Box non definito per il pezzo ' .. vPiece[i].Name, 'Lavora Pezzi', 'ERROR')
return false
else
vPiece[i].Box = b3Solid
vPiece[i].Len = vPiece[i].Box:getDimX()
vPiece[i].Wid = vPiece[i].Box:getDimY()
end
end
return true
end
-------------------------------------------------------------------------------------------------------------
-- operazione sui pezzi
function MyProcessPieces()
--------------------------------------------------------------------------------
-- *** Disposizione ***
-- scelta della configurazione tavola in base al numero di pezzi
if not vPiece or #vPiece > 2 then
EgtOutBox( 'ATTENZIONE : massimo due pezzi per macchinata', 'Lavora Pezzi', 'ERROR')
return false
-- se ho un pezzo
elseif #vPiece == 1 then
EgtSetTable( TABNAME_1PZ)
-- se ho due pezzi
else
EgtSetTable( TABNAME_2PZ)
end
-- controllo che le dimensioni siano compatibili
if #vPiece == 1 then
if vPiece[DISP.IND].Len > ( DIM_CAR + DIST_CARR_OPEN + DIM_CAR) then
EgtOutBox( 'ATTENZIONE : pezzo troppo lungo', 'Lavora Pezzi', 'ERROR')
return false
end
else
if vPiece[DISP.IND].Len > MAXDIMPIECE1CAR then
EgtOutBox( 'ATTENZIONE : pezzo ' .. vPiece[DISP.IND].Name .. ' troppo lungo', 'Lavora Pezzi', 'ERROR')
return false
end
end
-- dati di default
local sHeadSporgF1 = '40'
local sHeadSporgF2 = '40'
local sSideSporgF1 = '40'
local sSideSporgF2 = '40'
local sPosZF1 = '0'
local sPosZF2 = '0'
-- cerco se ci sono delle note di offset sul pezzo
local dHeadSporgF1 = nil
local dHeadSporgF2 = nil
local dSideSporgF1 = EgtGetInfo( vPiece[DISP.IND].Id, 'OFFY_1', 'd')
local dSideSporgF2 = EgtGetInfo( vPiece[DISP.IND].Id, 'OFFY_2', 'd')
local dPosZF1 = EgtGetInfo( vPiece[DISP.IND].Id, 'OFFZ_1', 'd')
local dPosZF2 = EgtGetInfo( vPiece[DISP.IND].Id, 'OFFZ_2', 'd')
local bInsertAllOffs = false
-- se non tutti gli offset Y-Z sono settati, avviso e poi chiedo tutti i dati
if not( dSideSporgF1 and dSideSporgF2 and dPosZF1 and dPosZF2) then
EgtOutBox( 'OFFSET di posizionamento non trovati. Inserire tutti i dati per calcolo posizionamento', 'ATTENZIONE PEZZO : ' .. vPiece[DISP.IND].Name, 'WARNING', 'OK')
bInsertAllOffs = true
end
-- assegno alle stringhe i valori letti, in modo che vengano proposti quelli nel dialogo
sHeadSporgF1 = EgtIf( dHeadSporgF1, tostring( dHeadSporgF1), '40')
sHeadSporgF2 = EgtIf( dHeadSporgF2, tostring( dHeadSporgF2), '40')
sSideSporgF1 = EgtIf( dSideSporgF1, tostring( dSideSporgF1), '40')
sSideSporgF2 = EgtIf( dSideSporgF2, tostring( dSideSporgF2), '40')
sPosZF1 = EgtIf( dPosZF1, tostring( dPosZF1), '0')
sPosZF2 = EgtIf( dPosZF2, tostring( dPosZF2), '0')
-- se devo inserire tutti gli offset
if bInsertAllOffs then
local vInp = EgtDialogBox( 'Dati di disposizione pezzo: ' .. vPiece[DISP.IND].Name,
{'Sporgenza Testa FASE1', sHeadSporgF1}, {'Sporgenza laterale FASE1', sSideSporgF1}, {'Posizione Z FASE1', sPosZF1},
{'Sporgenza Testa FASE2', sHeadSporgF2}, {'Sporgenza laterale FASE2', sSideSporgF2}, {'Posizione Z FASE2', sPosZF2})
if not vInp or #vInp == 0 then
DISP.ERR = 100
return
end
-- salvo input nei valori che utilizzerò dopo
dHeadSporgF1 = tonumber( vInp[1])
dSideSporgF1 = tonumber( vInp[2])
dPosZF1 = tonumber( vInp[3])
dHeadSporgF2 = tonumber( vInp[4])
dSideSporgF2 = tonumber( vInp[5])
dPosZF2 = tonumber( vInp[6])
else
local vInp = EgtDialogBox( 'Dati di disposizione pezzo: ' .. vPiece[DISP.IND].Name, {'Sporgenza Testa FASE1', sHeadSporgF1}, {'Sporgenza Testa FASE2', sHeadSporgF2})
if not vInp or #vInp == 0 then
DISP.ERR = 100
return
end
dHeadSporgF1 = tonumber( vInp[1])
dHeadSporgF2 = tonumber( vInp[2])
end
local dPosX = 0
local dPosY = 0
local dPosZ = 0
local dOverMat = 0
local nRawID
local vtOffs = Vector3d( 0, 0, 0)
-- PRIMA FASE
EgtSetCurrPhase( 1)
-- Abilito Vmill
EgtSetInfo( EgtGetCurrMachGroup(), 'Vm', '1')
-- posizionamento pezzi prima fase
-- setto gli offset iniziali
if DISP.IND == 2 then dPosX = DIM_CAR + DIST_CARR_OPEN end
dPosX = dPosX - dHeadSporgF1
dPosY = dPosY - dSideSporgF1
dPosZ = dPosZF1
vtOffs = Vector3d( dPosX, dPosY, dPosZ)
-- Definizione e posizionamento del grezzo
if vPiece[DISP.IND].Raw then
nRawID = EgtAddRawPartWithPart( vPiece[DISP.IND].Id, vPiece[DISP.IND].Raw, 0, ColA)
EgtSetStatus( Er, GDB_ST.ON)
else
nRawID = EgtAddRawPartWithPart( vPiece[DISP.IND].Id, GDB_ID.NULL, dOverMat, ColA)
end
if not nRawID then
EgtOutLog( 'InitDisp for Saomad-Just3500 : error defining raw part')
DISP.ERR = 3
return false
end
-- ammetto di uscire dalla tavola dello sbordo calcolato
EgtSetTableAreaOffset( 100, 100, 100, 100)
if not EgtMoveToCornerRawPart( nRawID, vtOffs, MCH_CR.BL) then
EgtOutLog( 'InitDisp for Saomad-Just3500 : error positioning raw part on table')
DISP.ERR = 4
return false
end
-- creo la seconda fase se primo pezzo
if DISP.IND == 1 then
EgtAddPhase()
-- altrimenti setto la due come corrente
else
EgtSetCurrPhase( 2)
end
-- ammetto di uscire dalla tavola dello sbordo calcolato
EgtSetTableAreaOffset( 100, 100, 100, 100)
-- posizionamento pezzi seconda fase
-- reset offset
dPosX = 0 ; dPosY = DIMTABY ;
-- se sono al secondo pezzo da inserire, lo metto sul secondo carrello
if DISP.IND == 2 then
dPosX = DIM_CAR + DIST_CARR_OPEN + DIM_CAR
-- se primo pezzo
else
if vPiece[DISP.IND].Len > MAXDIMPIECE1CAR then
dPosX = DIM_CAR + DIST_CARR_OPEN + DIM_CAR
else
dPosX = DIM_CAR
end
end
EgtKeepRawPart( nRawID)
dPosX = dPosX - vPiece[DISP.IND].Len + dHeadSporgF2
dPosY = dPosY - vPiece[DISP.IND].Wid + dSideSporgF2
dPosZ = dPosZF2
vtOffs = Vector3d( dPosX, dPosY, dPosZ)
EgtMoveToCornerRawPart( nRawID, vtOffs, MCH_CR.BL)
DISP.ERR = 0
return true
end
-------------------------------------------------------------------------------------------------------------
-- operazioni sulle lavorazioni
function MyProcessFeatures()
-- per il momento non applico lavorazioni
return true
end
-------------------------------------------------------------------------------------------------------------
-- *** Esecuzione ***
-------------------------------------------------------------------------------------------------------------
if not MyProcessInputData() then return end
if not MyProcessPieces() then return end
if not MyProcessFeatures() then return end