-- -- EEEEEEEEEE GGGGGG wwww wwww -- EEEEEEEEEE GGGGGGGGGG wwww wwww -- EEEE GGGG GGGG wwww wwww wwww -- EEEE GGGG wwww wwww wwww -- EEEEEEE GGGG GGGGGGG wwww wwwwww wwww -- EEEEEEE GGGG GGGGGGG wwww wwwwww wwww -- EEEE GGGG GGGG wwww wwwwwwww wwww -- EEEE GGGG GGGG wwww wwww wwww wwww -- EEEEEEEEEE GGGGGGGGGG wwwwwwww wwwwwwww -- EEEEEEEEEE GGGGGG wwwwwww wwwwwww -- -- AssemblyDisp.lua by EgalWare s.r.l. 2017.11.14 -- disposizione assemblato a raggruppamento -- Tavola per definizione modulo (serve ma non usata) local AssemblyDisp = {} EgtEnableDebug( false) ----------------------------------------------------------------- local function GetFromPos( nIdPiece) local pPosPlaced = EgtGetInfo( nIdPiece, 'MoveedTo', 'p') return pPosPlaced end ----------------------------------------------------------------- local function GetPosToMove( nIdPiece) local pPosFrom = EgtGetInfo( nIdPiece, 'PosFromDoor', 'p') return pPosFrom end ----------------------------------------------------------------- local function GetTypePiece( nIdPiece) local nTypePiece = EgtGetInfo( nIdPiece, 'Piece Type', 'i') local sAssembType = EgtGetInfo( nIdPiece, 'Assembly', 's') or '' -- se non trovate note esco con errore if not ( nTypePiece and sAssembType) then return end -- comparo i valori per trovare corrispondenza certa if nTypePiece == 1 and sAssembType == 'first' then return nTypePiece elseif nTypePiece == 2 and sAssembType == 'second' then return nTypePiece elseif nTypePiece == 3 and sAssembType == 'framesx' then return nTypePiece elseif nTypePiece == 4 and sAssembType == 'framedx' then return nTypePiece elseif nTypePiece == 5 and sAssembType == 'frametop' then return nTypePiece elseif nTypePiece == 6 and sAssembType == 'framebot' then return nTypePiece else return end end ----------------------------------------------------------------- local function MovePieceOfAssemb( Pz, nPrevDisp, nDispose, dExtraMove, dSecondDoorGap) local bTypePiece = GetTypePiece( Pz) local pPosAct = GetFromPos( Pz) local pPosToMove = GetPosToMove( Pz) local pCalcPos -- se manca qualche dato non faccio nulla if not ( bTypePiece and pPosAct and pPosToMove) then return end -- se le disposizioni sono uguali non faccio nulla if nPrevDisp == nDispose then return end if nDispose == 0 then -- se devo disporre come presentato dal Door if bTypePiece == 2 then -- se porta secondaria if nPrevDisp == 1 then -- se disposizione attuale raggruppata pCalcPos = pPosToMove elseif nPrevDisp == 2 then -- se disposizione attuale esplosa pCalcPos = pPosToMove + Vector3d( dSecondDoorGap,0,0) end -- movimento EgtMove( Pz, pPosAct - pCalcPos, GDB_RT.GRID) -- assegno nota disposizione EgtSetInfo( Pz, 'DisposeAssembly', nDispose) else if bTypePiece == 3 then -- se frame sx -- acquisisco le misure del pezzo relative al tipo di pezzo local dWidthPiece = EgtGetInfo( Pz, 'T', 'd') local dLengthPiece = EgtGetInfo( Pz, 'H', 'd') local dThickPiece = EgtGetInfo( Pz, 'W', 'd') if nPrevDisp == 1 then -- se disposizione attuale raggruppata pCalcPos = pPosToMove elseif nPrevDisp == 2 then -- se disposizione attuale esplosa pCalcPos = pPosToMove + Vector3d(-dExtraMove,0,0) end -- porto il pezzo a zero EgtMove( Pz, ORIG() - pCalcPos, GDB_RT.GRID) -- riporto il pezzo nella posizione originaria EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.FRONT)) EgtRotate( Pz, Point3d(0,0,0), Z_AX(), 90, GDB_RT.GRID) -- ruoto su faccia frontale EgtMove( Pz, Point3d(dThickPiece,0,0) - ORIG(), GDB_RT.GRID) EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.TOP)) -- muovo a posizione disposta EgtMove( Pz, pPosAct - ORIG(), GDB_RT.GRID) -- assegno nota disposta EgtSetInfo( Pz, 'DisposeAssembly', nDispose) elseif bTypePiece == 4 then -- se frame dx -- acquisisco le misure del pezzo relative al tipo di pezzo local dWidthPiece = EgtGetInfo( Pz, 'T', 'd') local dLengthPiece = EgtGetInfo( Pz, 'H', 'd') local dThickPiece = EgtGetInfo( Pz, 'W', 'd') if nPrevDisp == 1 then -- se disposizione attuale raggruppata pCalcPos = pPosToMove elseif nPrevDisp == 2 then -- se disposizione attuale esplosa pCalcPos = pPosToMove + Vector3d( ( dExtraMove + dSecondDoorGap),0,0) end -- porto il pezzo a zero EgtMove( Pz, ORIG() - pCalcPos, GDB_RT.GRID) -- riporto il pezzo nella posizione originaria EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.FRONT)) EgtRotate( Pz, Point3d(dWidthPiece,0,0), Z_AX(), -90, GDB_RT.GRID) -- ruoto su faccia frontale EgtMove( Pz, Point3d(-dWidthPiece,0,0) - ORIG(), GDB_RT.GRID) EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.TOP)) -- muovo a posizione disposta EgtMove( Pz, pPosAct - ORIG(), GDB_RT.GRID) -- assegno nota disposta EgtSetInfo( Pz, 'DisposeAssembly', nDispose) elseif bTypePiece == 5 then -- se frame top -- acquisisco le misure del pezzo relative al tipo di pezzo local dWidthPiece = EgtGetInfo( Pz, 'H', 'd') local dLengthPiece = EgtGetInfo( Pz, 'T', 'd') local dThickPiece = EgtGetInfo( Pz, 'W', 'd') if nPrevDisp == 1 then -- se disposizione attuale raggruppata pCalcPos = pPosToMove elseif nPrevDisp == 2 then -- se disposizione attuale esplosa pCalcPos = pPosToMove + Vector3d( (dSecondDoorGap/2), dExtraMove,0) end -- porto il pezzo a zero EgtMove( Pz, ORIG() - pCalcPos, GDB_RT.GRID) -- riporto il pezzo nella posizione originaria EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.LEFT)) EgtRotate( Pz, Point3d(-dLengthPiece,0,0), Z_AX(), 90, GDB_RT.GRID) -- ruoto su faccia sinistra EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.TOP)) EgtMove( Pz, Point3d(0,-dLengthPiece,0) - ORIG(), GDB_RT.GRID) EgtRotate( Pz, Point3d(0,0,0), Z_AX(), 90, GDB_RT.GRID) -- ruoto su faccia sinistra EgtMove( Pz, Point3d(dThickPiece,0,0) - ORIG(), GDB_RT.GRID) -- muovo a posizione disposta EgtMove( Pz, pPosAct - ORIG(), GDB_RT.GRID) -- assegno nota disposta EgtSetInfo( Pz, 'DisposeAssembly', nDispose) elseif bTypePiece == 6 then -- se frame bottom -- acquisisco le misure del pezzo relative al tipo di pezzo local dWidthPiece = EgtGetInfo( Pz, 'H', 'd') local dLengthPiece = EgtGetInfo( Pz, 'T', 'd') local dThickPiece = EgtGetInfo( Pz, 'W', 'd') if nPrevDisp == 1 then -- se disposizione attuale raggruppata pCalcPos = pPosToMove elseif nPrevDisp == 2 then -- se disposizione attuale esplosa pCalcPos = pPosToMove + Vector3d( (dSecondDoorGap/2), -dExtraMove,0) end -- porto il pezzo a zero EgtMove( Pz, ORIG() - pCalcPos, GDB_RT.GRID) -- riporto il pezzo nella posizione originaria EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.LEFT)) EgtRotate( Pz, Point3d(0,0,0), Z_AX(), -90, GDB_RT.GRID) -- ruoto su faccia sinistra EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.TOP)) EgtRotate( Pz, Point3d(0,0,0), Z_AX(), 90, GDB_RT.GRID) -- ruoto su faccia sinistra -- muovo a posizione disposta EgtMove( Pz, pPosAct - ORIG(), GDB_RT.GRID) -- assegno nota disposta EgtSetInfo( Pz, 'DisposeAssembly', nDispose) end end elseif nDispose == 1 then -- se devo disporre raggruppato if bTypePiece == 2 then -- se porta secondaria if nPrevDisp == 0 then -- se disposizione attuale disposta come door pCalcPos = pPosAct elseif nPrevDisp == 2 then -- se disposizione attuale esplosa pCalcPos = pPosToMove + Vector3d( dSecondDoorGap,0,0) end EgtMove( Pz, pPosToMove - pCalcPos, GDB_RT.GRID) -- assegno nota raggruppata EgtSetInfo( Pz, 'DisposeAssembly', nDispose) else if bTypePiece == 3 then -- se frame sx -- acquisisco le misure del pezzo relative al tipo di pezzo local dWidthPiece = EgtGetInfo( Pz, 'T', 'd') local dLengthPiece = EgtGetInfo( Pz, 'H', 'd') local dThickPiece = EgtGetInfo( Pz, 'W', 'd') if nPrevDisp == 0 then -- se disposizione attuale disposta come door pCalcPos = pPosAct -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, Point3d( -dThickPiece,0,0) - pCalcPos, GDB_RT.GRID) EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.FRONT)) EgtRotate( Pz, Point3d(0,0,0), Z_AX(), -90, GDB_RT.GRID) -- ruoto su faccia frontale EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.TOP)) elseif nPrevDisp == 2 then -- se disposizione attuale esplosa pCalcPos = pPosToMove + Vector3d(-dExtraMove,0,0) -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, ORIG() - pCalcPos, GDB_RT.GRID) end -- movimento a nuova posizione EgtMove( Pz, pPosToMove - ORIG(), GDB_RT.GRID) -- assegno nota raggruppata EgtSetInfo( Pz, 'DisposeAssembly', nDispose) elseif bTypePiece == 4 then -- se frame dx -- acquisisco le misure del pezzo relative al tipo di pezzo local dWidthPiece = EgtGetInfo( Pz, 'T', 'd') local dLengthPiece = EgtGetInfo( Pz, 'H', 'd') local dThickPiece = EgtGetInfo( Pz, 'W', 'd') if nPrevDisp == 0 then -- se disposizione attuale disposta come door pCalcPos = pPosAct -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, Point3d( dWidthPiece,0,0) - pCalcPos, GDB_RT.GRID) EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.FRONT)) EgtRotate( Pz, Point3d( dWidthPiece,0,0), Z_AX(), 90, GDB_RT.GRID) -- ruoto su faccia frontale EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.TOP)) elseif nPrevDisp == 2 then -- se disposizione attuale esplosa pCalcPos = pPosToMove + Vector3d( ( dExtraMove + dSecondDoorGap),0,0) -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, ORIG() - pCalcPos, GDB_RT.GRID) end -- movimento a nuova posizione EgtMove( Pz, pPosToMove - ORIG(), GDB_RT.GRID) -- assegno nota raggruppata EgtSetInfo( Pz, 'DisposeAssembly', nDispose) elseif bTypePiece == 5 then -- se frame top -- acquisisco le misure del pezzo relative al tipo di pezzo local dWidthPiece = EgtGetInfo( Pz, 'H', 'd') local dLengthPiece = EgtGetInfo( Pz, 'T', 'd') local dThickPiece = EgtGetInfo( Pz, 'W', 'd') if nPrevDisp == 0 then -- se disposizione attuale disposta come door pCalcPos = pPosAct -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, Point3d( -dThickPiece,0,0) - pCalcPos, GDB_RT.GRID) EgtRotate( Pz, Point3d(0,0,0), Z_AX(), -90, GDB_RT.GRID) -- ruoto su faccia top EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.LEFT)) EgtRotate( Pz, Point3d(0,0,0), Z_AX(), -90, GDB_RT.GRID) -- ruoto su faccia left EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.TOP)) EgtMove( Pz, Point3d(0,dLengthPiece,0) - ORIG(), GDB_RT.GRID) elseif nPrevDisp == 2 then -- se disposizione attuale esplosa pCalcPos = pPosToMove + Vector3d( (dSecondDoorGap/2), dExtraMove,0) -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, ORIG() - pCalcPos, GDB_RT.GRID) end -- movimento a nuova posizione EgtMove( Pz, pPosToMove - ORIG(), GDB_RT.GRID) -- assegno nota raggruppata EgtSetInfo( Pz, 'DisposeAssembly', nDispose) elseif bTypePiece == 6 then -- se frame bottom -- acquisisco le misure del pezzo relative al tipo di pezzo local dWidthPiece = EgtGetInfo( Pz, 'H', 'd') local dLengthPiece = EgtGetInfo( Pz, 'T', 'd') local dThickPiece = EgtGetInfo( Pz, 'W', 'd') if nPrevDisp == 0 then -- se disposizione attuale disposta come door pCalcPos = pPosAct -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, ORIG() - pCalcPos, GDB_RT.GRID) EgtRotate( Pz, Point3d(0,0,0), Z_AX(), -90, GDB_RT.GRID) -- ruoto su faccia top EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.LEFT)) EgtRotate( Pz, Point3d(0,0,0), Z_AX(), 90, GDB_RT.GRID) -- ruoto su faccia left EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.TOP)) elseif nPrevDisp == 2 then -- se disposizione attuale esplosa pCalcPos = pPosToMove + Vector3d( (dSecondDoorGap/2), -dExtraMove,0) -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, ORIG() - pCalcPos, GDB_RT.GRID) end -- movimento a nuova posizione EgtMove( Pz, pPosToMove - ORIG(), GDB_RT.GRID) -- assegno nota raggruppata EgtSetInfo( Pz, 'DisposeAssembly', nDispose) end end elseif nDispose == 2 then -- se devo disporre esploso if bTypePiece == 2 then -- se porta secondaria if nPrevDisp == 0 then -- se disposizione attuale disposta come door pCalcPos = pPosAct elseif nPrevDisp == 1 then -- se disposizione attuale raggruppata pCalcPos = pPosToMove end EgtMove( Pz, ( pPosToMove + Vector3d( dSecondDoorGap,0,0)) - pCalcPos, GDB_RT.GRID) -- assegno nota raggruppata EgtSetInfo( Pz, 'DisposeAssembly', nDispose) else if bTypePiece == 3 then -- se frame sx -- acquisisco le misure del pezzo relative al tipo di pezzo local dWidthPiece = EgtGetInfo( Pz, 'T', 'd') local dLengthPiece = EgtGetInfo( Pz, 'H', 'd') local dThickPiece = EgtGetInfo( Pz, 'W', 'd') if nPrevDisp == 0 then -- se disposizione attuale disposta come door pCalcPos = pPosAct -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, Point3d( -dThickPiece,0,0) - pCalcPos, GDB_RT.GRID) EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.FRONT)) EgtRotate( Pz, Point3d(0,0,0), Z_AX(), -90, GDB_RT.GRID) -- ruoto su faccia frontale EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.TOP)) elseif nPrevDisp == 1 then -- se disposizione attuale raggruppata pCalcPos = pPosToMove -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, ORIG() - pCalcPos, GDB_RT.GRID) end -- movimento a nuova posizione EgtMove( Pz, ( pPosToMove + Vector3d( -dExtraMove,0,0)) - ORIG(), GDB_RT.GRID) -- assegno nota raggruppata EgtSetInfo( Pz, 'DisposeAssembly', nDispose) elseif bTypePiece == 4 then -- se frame dx -- acquisisco le misure del pezzo relative al tipo di pezzo local dWidthPiece = EgtGetInfo( Pz, 'T', 'd') local dLengthPiece = EgtGetInfo( Pz, 'H', 'd') local dThickPiece = EgtGetInfo( Pz, 'W', 'd') if nPrevDisp == 0 then -- se disposizione attuale disposta come door pCalcPos = pPosAct -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, Point3d( dWidthPiece,0,0) - pCalcPos, GDB_RT.GRID) EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.FRONT)) EgtRotate( Pz, Point3d( dWidthPiece,0,0), Z_AX(), 90, GDB_RT.GRID) -- ruoto su faccia frontale EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.TOP)) elseif nPrevDisp == 1 then -- se disposizione attuale raggruppata pCalcPos = pPosToMove -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, ORIG() - pCalcPos, GDB_RT.GRID) end -- movimento a nuova posizione EgtMove( Pz, ( pPosToMove + Vector3d( ( dExtraMove + dSecondDoorGap),0,0)) - ORIG(), GDB_RT.GRID) -- assegno nota raggruppata EgtSetInfo( Pz, 'DisposeAssembly', nDispose) elseif bTypePiece == 5 then -- se frame top -- acquisisco le misure del pezzo relative al tipo di pezzo local dWidthPiece = EgtGetInfo( Pz, 'H', 'd') local dLengthPiece = EgtGetInfo( Pz, 'T', 'd') local dThickPiece = EgtGetInfo( Pz, 'W', 'd') if nPrevDisp == 0 then -- se disposizione attuale disposta come door pCalcPos = pPosAct -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, Point3d( -dThickPiece,0,0) - pCalcPos, GDB_RT.GRID) EgtRotate( Pz, Point3d(0,0,0), Z_AX(), -90, GDB_RT.GRID) -- ruoto su faccia top EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.LEFT)) EgtRotate( Pz, Point3d(0,0,0), Z_AX(), -90, GDB_RT.GRID) -- ruoto su faccia left EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.TOP)) EgtMove( Pz, Point3d(0,dLengthPiece,0) - ORIG(), GDB_RT.GRID) elseif nPrevDisp == 1 then -- se disposizione attuale raggruppata pCalcPos = pPosToMove -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, ORIG() - pCalcPos, GDB_RT.GRID) end -- movimento a nuova posizione EgtMove( Pz, ( pPosToMove + Vector3d( (dSecondDoorGap/2), dExtraMove,0)) - ORIG(), GDB_RT.GRID) -- assegno nota raggruppata EgtSetInfo( Pz, 'DisposeAssembly', nDispose) elseif bTypePiece == 6 then -- se frame bottom -- acquisisco le misure del pezzo relative al tipo di pezzo local dWidthPiece = EgtGetInfo( Pz, 'H', 'd') local dLengthPiece = EgtGetInfo( Pz, 'T', 'd') local dThickPiece = EgtGetInfo( Pz, 'W', 'd') if nPrevDisp == 0 then -- se disposizione attuale disposta come door pCalcPos = pPosAct -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, ORIG() - pCalcPos, GDB_RT.GRID) EgtRotate( Pz, Point3d(0,0,0), Z_AX(), -90, GDB_RT.GRID) -- ruoto su faccia top EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.LEFT)) EgtRotate( Pz, Point3d(0,0,0), Z_AX(), 90, GDB_RT.GRID) -- ruoto su faccia left EgtSetGridFrame( Frame3d( 0,0,0, GDB_FR.TOP)) elseif nPrevDisp == 1 then -- se disposizione attuale raggruppata pCalcPos = pPosToMove -- prima devo portare il pezzo a zero e ruotarlo come originale EgtMove( Pz, ORIG() - pCalcPos, GDB_RT.GRID) end -- movimento a nuova posizione EgtMove( Pz, ( pPosToMove + Vector3d( (dSecondDoorGap/2), -dExtraMove,0)) - ORIG(), GDB_RT.GRID) -- assegno nota raggruppata EgtSetInfo( Pz, 'DisposeAssembly', nDispose) end end end end ----------------------------------------------------------------- function AssemblyDisp.AssemblyDispose( nDisposeMain) -- ciclo per leggere i pezzi local dExtraMove = 100 local dSecondDoorGap = 0 local Pz = EgtGetFirstPart() while Pz do local bTypePiece = GetTypePiece( Pz) if bTypePiece and bTypePiece == 2 then dSecondDoorGap = dExtraMove / 2 Pz = nil else -- passo al pezzo successivo Pz = EgtGetNextPart( Pz) end end Pz = EgtGetFirstPart() local nDispose while Pz do local nPrevDisp = EgtGetInfo( Pz, 'DisposeAssembly', 'i') if nPrevDisp == nil then nDispose = 1 nPrevDisp = 0 elseif nPrevDisp == 0 then nDispose = 1 elseif nPrevDisp == 1 then nDispose = 2 elseif nPrevDisp == 2 then nDispose = 0 end -- se il flag passato dal main non è nil prendo questo valore if nDisposeMain ~= nil then nDispose = nDisposeMain end -- muovo il pezzo MovePieceOfAssemb( Pz, nPrevDisp, nDispose, dExtraMove, dSecondDoorGap) -- passo al pezzo successivo Pz = EgtGetNextPart( Pz) end return true end return AssemblyDisp