-- 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