Files
Dario Sassi cc55202ec5 DataDoors 2.7c1 :
- primo commit con versione corrente.
2025-03-18 17:02:20 +01:00

484 lines
21 KiB
Lua

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