250 lines
8.6 KiB
Lua
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 |