-- WinData.lua by Egalware s.r.l. 2025/03/19 -- Raccolta dati generali per Serramenti EgtOutLog( ' Just3500-WinData started', 1) -- Tabella per definizione modulo local WinData = { -- COSTANTI MACH_TYPE = 'LINE', FIRST_PHASE_LOAD = 'PUSH', DIM_CAR = 1430, DIST_CARR_OPEN = 470, DIST_CARR_CLOSE = 90, DIMTABY = 250, MAXDIMPIECE1CAR = 1500, TABNAME_1PZ = 'Tab', TABNAME_2PZ = 'Tab2', PART_ALIGN = Vector3d( 1, 0, 0) } --------------------------------------------------------------------- -- Verifica che i pezzi da processare siano compatibili con la configurazione della macchina --------------------------------------------------------------------- local function VerifyPieces( PARTS) if not PARTS or #PARTS > 2 then local sErr = 'ATTENZIONE : massimo due pezzi per macchinata' return false, sErr end -- controllo che le dimensioni siano compatibili for i = 1, #PARTS do local dPartLength -- il pezzo potrebbe essere girato, quindi la lunghezza è data dalla coordinata Y if PARTS[i].b3Raw:getDimX() > PARTS[i].b3Raw:getDimY() then dPartLength = PARTS[i].b3Raw:getDimX() else dPartLength = PARTS[i].b3Raw:getDimY() end if #PARTS == 1 then if dPartLength > ( WinData.DIM_CAR + WinData.DIST_CARR_OPEN + WinData.DIM_CAR) then local sErr = 'ATTENZIONE : pezzo troppo lungo' return false, sErr end else if dPartLength > WinData.MAXDIMPIECE1CAR then local sErr = 'ATTENZIONE : pezzo ' .. PARTS[i].sName .. ' troppo lungo' return false, sErr end end end return true end WinData.VerifyPieces = VerifyPieces --------------------------------------------------------------------- -- Dispone i pezzi in macchina --------------------------------------------------------------------- local function ExecDisposition( PARTS) -- si verifica che i pezzi selezionati siano compatibili con la macchina local bOk, sErr = VerifyPieces( PARTS) if not bOk then return false, sErr end -- se ho un pezzo if #PARTS == 1 then EgtSetTable( WinData.TABNAME_1PZ) -- se ho due pezzi else EgtSetTable( WinData.TABNAME_2PZ) end -- fase 1 (non serve creare fase 1 perchè già presente alla creazione del machgroup) EgtSetCurrPhase( 1) for i = 1, #PARTS do local dPosX = 0 local dPosY = 0 local dPosZ = 0 -- posizionamento pezzi prima fase -- setto gli offset iniziali if i == 2 then dPosX = WinData.DIM_CAR + WinData.DIST_CARR_OPEN end dPosX = dPosX - PARTS[i].OffsetPartToRaw.X dPosY = - PARTS[i].OffsetPartToRaw.Y - PARTS[i].DispOffsets.Phase1.dOffsetY dPosZ = 0 local vtOffs = Vector3d( dPosX, dPosY, dPosZ) -- ammetto di uscire dalla tavola dello sbordo calcolato EgtSetTableAreaOffset( 100, 100, 100, 100) EgtSetStatus( PARTS[i].idRaw, GDB_ST.ON) if not EgtMoveToCornerRawPart( PARTS[i].idRaw, vtOffs, MCH_CR.BL) then local sErr = 'ATTENZIONE : error positioning raw part on table' return false, sErr end end -- fase 2 EgtAddPhase() EgtSetCurrPhase( 2) for i = 1, #PARTS do -- ammetto di uscire dalla tavola dello sbordo calcolato EgtSetTableAreaOffset( 100, 100, 100, 100) -- posizionamento pezzi seconda fase -- reset offset local dPosX = 0 local dPosY = WinData.DIMTABY local dPosZ = 0 -- se sono al secondo pezzo da inserire, lo metto sul secondo carrello if i == 2 then dPosX = WinData.DIM_CAR + WinData.DIST_CARR_OPEN + WinData.DIM_CAR -- se primo pezzo else if PARTS[i].dPartLength > WinData.MAXDIMPIECE1CAR then dPosX = WinData.DIM_CAR + WinData.DIST_CARR_CLOSE + WinData.DIM_CAR else dPosX = WinData.DIM_CAR end end EgtKeepRawPart( PARTS[i].idRaw) dPosX = dPosX - PARTS[i].dPartLength - PARTS[i].OffsetPartToRaw.X dPosY = dPosY - PARTS[i].dPartWidth - PARTS[i].OffsetPartToRaw.Y + PARTS[i].DispOffsets.Phase2.dOffsetY dPosZ = PARTS[i].DispOffsets.Phase2.dOffsetZ local vtOffs = Vector3d( dPosX, dPosY, dPosZ) EgtMoveToCornerRawPart( PARTS[i].idRaw, vtOffs, MCH_CR.BL) end return true end WinData.ExecDisposition = ExecDisposition --------------------------------------------------------------------- -- Dispone i pezzi in macchina --------------------------------------------------------------------- local function AdjustDisposition( PARTS) -- fase 1 (non serve creare fase 1 perchè già presente alla creazione del machgroup) EgtSetCurrPhase( 1) for i = 1, #PARTS do local dPosX = 0 local dPosY = 0 local dPosZ = 0 -- posizionamento pezzi prima fase -- setto gli offset iniziali if i == 2 then dPosX = WinData.DIM_CAR + WinData.DIST_CARR_OPEN end dPosX = dPosX - PARTS[i].OffsetPartToRaw.X dPosY = dPosY - PARTS[i].OffsetPartToRaw.Y - PARTS[i].DispOffsets.Phase1.dOffsetY dPosZ = 0 local vtOffs = Vector3d( dPosX, dPosY, dPosZ) if not EgtMoveToCornerRawPart( PARTS[i].idRaw, vtOffs, MCH_CR.BL) then local sErr = 'ATTENZIONE : error positioning raw part on table in phase 1' return false, sErr end end -- fase 2 EgtSetCurrPhase( 2) for i = 1, #PARTS do -- reset offset local dPosX = 0 local dPosY = WinData.DIMTABY local dPosZ = 0 -- posizionamento pezzi seconda fase -- se sono al secondo pezzo da inserire, lo metto sul secondo carrello if i == 2 then dPosX = WinData.DIM_CAR + WinData.DIST_CARR_OPEN + WinData.DIM_CAR -- se primo pezzo else if PARTS[i].dPartLength > WinData.MAXDIMPIECE1CAR then dPosX = WinData.DIM_CAR + WinData.DIST_CARR_CLOSE + WinData.DIM_CAR else dPosX = WinData.DIM_CAR end end dPosX = dPosX + PARTS[i].OffsetPartToRaw.X dPosY = dPosY + PARTS[i].OffsetPartToRaw.Y + PARTS[i].DispOffsets.Phase2.dOffsetY dPosZ = dPosZ + PARTS[i].DispOffsets.Phase2.dOffsetZ local vtOffs = Vector3d( dPosX, dPosY, dPosZ) if not EgtMoveToCornerRawPart( PARTS[i].idRaw, vtOffs, MCH_CR.TR) then local sErr = 'ATTENZIONE : error positioning raw part on table in phase 2' return false, sErr end end return true end WinData.AdjustDisposition = AdjustDisposition --------------------------------------------------------------------- -- Info che dipendono dal setup dell'utensile e configurazione macchina --------------------------------------------------------------------- local function GetSetupInfo( ToolData) local SetupInfo = {} -- dati comuni SetupInfo.bToolOnAggregate = false -- testa 1 ( testa verticale con asse rotante per rinvii con CU) if ToolData.sHead == 'H11' then SetupInfo.nNumberOfAxis = 4 SetupInfo.bIsVerticalHead = true SetupInfo.bIsHorizontalHead = not SetupInfo.bIsVerticalHead -- testa 2 ( 4 uscite orizzontali rotanti) elseif ToolData.sHead == 'H21' then SetupInfo.nNumberOfAxis = 4 SetupInfo.bIsHorizontalHead = true SetupInfo.bIsVerticalHead = not SetupInfo.bIsHorizontalHead -- testa 3 ( 2 uscite orizzontali fisse) elseif ToolData.sHead == 'H31' then SetupInfo.nNumberOfAxis = 3 SetupInfo.bIsHorizontalHead = true SetupInfo.bIsVerticalHead = not SetupInfo.bIsHorizontalHead if ToolData.nExit == 1 then SetupInfo.vDirection = Vector3d(0,1,0) else SetupInfo.vDirection = Vector3d(0,-1,0) end -- testa 4 ( testa verticale fissa) elseif ToolData.sHead == 'H41' then SetupInfo.nNumberOfAxis = 3 SetupInfo.bIsVerticalHead = true SetupInfo.bIsHorizontalHead = not SetupInfo.bIsVerticalHead end return SetupInfo end WinData.GetSetupInfo = GetSetupInfo --------------------------------------------------------------------- return WinData