337 lines
13 KiB
Lua
337 lines
13 KiB
Lua
--
|
|
-- EEEEEEEEEE GGGGGG TTTTTTTTTTTTTT
|
|
-- EEEEEEEEEE GGGGGGGGGG TTTTTTTTTTTTTT
|
|
-- EEEE GGGG GGGG TTTT
|
|
-- EEEE GGGG TTTT
|
|
-- EEEEEEE GGGG GGGGGGG TTTT
|
|
-- EEEEEEE GGGG GGGGGGG TTTT
|
|
-- EEEE GGGG GGGG TTTT
|
|
-- EEEE GGGG GGGG TTTT
|
|
-- EEEEEEEEEE GGGGGGGGGG TTTT
|
|
-- EEEEEEEEEE GGGGGG TTTT
|
|
--
|
|
-- by Egalware s.r.l.
|
|
-- Window project software by Egalware s.r.l. 2023/05/02
|
|
|
|
-- Tabella per definizione modulo
|
|
local WinManageProject = {}
|
|
|
|
-- Include
|
|
require( 'EgtBase')
|
|
_G.package.loaded.WinConst = nil
|
|
require( 'WinConst')
|
|
_G.package.loaded.WinJWDConst = nil
|
|
require( 'WinJWDConst')
|
|
_G.package.loaded.WinCreate = nil
|
|
local WinCreate = require( 'WinCreate')
|
|
_G.package.loaded.JSON = nil
|
|
local JSON = require( 'JSON')
|
|
|
|
---------------------------------------------------------------------
|
|
local function GetJoints( tJoints)
|
|
local vJoints = {}
|
|
for i = 1, #tJoints do
|
|
if tJoints[i][JWD_JOINT_TYPE] == 'FULL_H' then
|
|
vJoints[i] = WIN_JNT.FULL_H
|
|
elseif tJoints[i][JWD_JOINT_TYPE] == 'FULL_V' then
|
|
vJoints[i] = WIN_JNT.FULL_V
|
|
elseif tJoints[i][JWD_JOINT_TYPE] == 'ANGLED' then
|
|
vJoints[i] = WIN_JNT.ANGLED
|
|
end
|
|
end
|
|
return vJoints
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
local function GetFrameShape( sShape)
|
|
|
|
if sShape == 'RECTANGLE' then
|
|
return WIN_FRAME_TYPES.RECT
|
|
elseif sShape == 'RIGHTCHAMFER' or sShape == 'LEFTCHAMFER' then
|
|
return WIN_FRAME_TYPES.CHAMFER_SIDE
|
|
elseif sShape == 'DOUBLECHAMFER' then
|
|
return WIN_FRAME_TYPES.CHAMFER
|
|
elseif sShape == 'ARC_FULL' then
|
|
return WIN_FRAME_TYPES.ROUND_ARC
|
|
elseif sShape == 'ARC' then
|
|
return WIN_FRAME_TYPES.SEGMENTAL_ARC
|
|
elseif sShape == 'DOUBLEARC' then
|
|
return WIN_FRAME_TYPES.POINTED_ARC
|
|
elseif sShape == 'TRIANGLE' then
|
|
return WIN_FRAME_TYPES.TRG
|
|
end
|
|
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
local function GetOpeningType( sOpeningType)
|
|
|
|
if sOpeningType == 'NULL' then
|
|
return WIN_OPENING_TYPES.NULL
|
|
elseif sOpeningType == 'TURNONLY_LEFT' then
|
|
return WIN_OPENING_TYPES.TURNONLY_LEFT
|
|
elseif sOpeningType == 'TURNONLY_RIGHT' then
|
|
return WIN_OPENING_TYPES.TURNONLY_RIGHT
|
|
elseif sOpeningType == 'TILTTURN_LEFT' then
|
|
return WIN_OPENING_TYPES.TILTTURN_LEFT
|
|
elseif sOpeningType == 'TILTTURN_RIGHT' then
|
|
return WIN_OPENING_TYPES.TILTTURN_RIGHT
|
|
elseif sOpeningType == 'TILTONLY_TOP' then
|
|
return WIN_OPENING_TYPES.TILTONLY_TOP
|
|
elseif sOpeningType == 'TILTONLY_BOTTOM' then
|
|
return WIN_OPENING_TYPES.TILTONLY_BOTTOM
|
|
elseif sOpeningType == 'PIVOT' then
|
|
return WIN_OPENING_TYPES.PIVOT
|
|
elseif sOpeningType == 'FIXED' then
|
|
return WIN_OPENING_TYPES.FIXED
|
|
elseif sOpeningType == 'COPLANARSLIDE_LEFT' then
|
|
return WIN_OPENING_TYPES.COPLANARSLIDE_LEFT
|
|
elseif sOpeningType == 'COPLANARSLIDE_RIGHT' then
|
|
return WIN_OPENING_TYPES.COPLANARSLIDE_RIGHT
|
|
elseif sOpeningType == 'LIFTSLIDE_LEFT' then
|
|
return WIN_OPENING_TYPES.LIFTSLIDE_LEFT
|
|
elseif sOpeningType == 'LIFTSLIDE_RIGHT' then
|
|
return WIN_OPENING_TYPES.LIFTSLIDE_RIGHT
|
|
end
|
|
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
-- funzione che ricava la tipologia dell'anta in base al tipo di apertura e alla struttura
|
|
local function GetSashTypes( tSashes, vOpeningTypes)
|
|
|
|
-- alzante scorrevole
|
|
local bSlideWindow = ( vOpeningTypes[1] == WIN_OPENING_TYPES.FIXED or vOpeningTypes[1] == WIN_OPENING_TYPES.COPLANARSLIDE_RIGHT or vOpeningTypes[1] == WIN_OPENING_TYPES.LIFTSLIDE_RIGHT)
|
|
if bSlideWindow then
|
|
if #tSashes == 2 then
|
|
if vOpeningTypes[1] == WIN_OPENING_TYPES.FIXED then
|
|
return { WIN_SASHTYPES.SLIDE_FIXED, WIN_SASHTYPES.SLIDE_MOVABLE}, 'Dx'
|
|
elseif vOpeningTypes[2] == WIN_OPENING_TYPES.FIXED then
|
|
return { WIN_SASHTYPES.SLIDE_MOVABLE, WIN_SASHTYPES.SLIDE_FIXED}, 'Sx'
|
|
else
|
|
-- TODO individuare parametro per disinguerle
|
|
return { WIN_SASHTYPES.SLIDE_MOVABLE, WIN_SASHTYPES.SLIDE_MOVABLE_BACK}, 'Sx'
|
|
end
|
|
else
|
|
if vOpeningTypes[1] == WIN_OPENING_TYPES.FIXED then
|
|
return { WIN_SASHTYPES.SLIDE_FIXED, WIN_SASHTYPES.SLIDE_MOVABLE, WIN_SASHTYPES.SLIDE_MOVABLE, WIN_SASHTYPES.SLIDE_FIXED}, 'Sx'
|
|
elseif vOpeningTypes[2] == WIN_OPENING_TYPES.FIXED then
|
|
return { WIN_SASHTYPES.SLIDE_MOVABLE, WIN_SASHTYPES.SLIDE_FIXED, WIN_SASHTYPES.SLIDE_MOVABLE}, 'Sx'
|
|
else
|
|
return { WIN_SASHTYPES.SLIDE_MOVABLE_BACK, WIN_SASHTYPES.SLIDE_MOVABLE, WIN_SASHTYPES.SLIDE_MOVABLE, WIN_SASHTYPES.SLIDE_MOVABLE_BACK}, 'Sx'
|
|
end
|
|
end
|
|
end
|
|
|
|
-- casi standard
|
|
if #tSashes == 2 then
|
|
if tSashes[1][JWD_HAS_HANDLE] then
|
|
return { WIN_SASHTYPES.ACTIVE, WIN_SASHTYPES.INACTIVE}, 'Sx'
|
|
else
|
|
return { WIN_SASHTYPES.INACTIVE, WIN_SASHTYPES.ACTIVE}, 'Dx'
|
|
end
|
|
|
|
elseif #tSashes == 3 then
|
|
if tSashes[1][JWD_HAS_HANDLE] then
|
|
return { WIN_SASHTYPES.ACTIVE, WIN_SASHTYPES.INACTIVE_IN, WIN_SASHTYPES.INACTIVE_OUT}, 'Sx'
|
|
elseif tSashes[2][JWD_HAS_HANDLE] then
|
|
if vOpeningTypes[2] == WIN_OPENING_TYPES.TURNONLY_LEFT or vOpeningTypes[2] == WIN_OPENING_TYPES.TILTTURN_LEFT then
|
|
return { WIN_SASHTYPES.ACTIVE_OUT, WIN_SASHTYPES.ACTIVE_IN, WIN_SASHTYPES.INACTIVE}, 'Sx'
|
|
else
|
|
return { WIN_SASHTYPES.INACTIVE, WIN_SASHTYPES.ACTIVE_IN, WIN_SASHTYPES.ACTIVE_OUT}, 'Dx'
|
|
end
|
|
else
|
|
return { WIN_SASHTYPES.INACTIVE_OUT, WIN_SASHTYPES.INACTIVE_IN, WIN_SASHTYPES.ACTIVE}, 'Dx'
|
|
end
|
|
|
|
else
|
|
if tSashes[2][JWD_HAS_HANDLE] then
|
|
return { WIN_SASHTYPES.ACTIVE_OUT, WIN_SASHTYPES.ACTIVE_IN, WIN_SASHTYPES.INACTIVE_IN, WIN_SASHTYPES.INACTIVE_OUT}, 'Sx'
|
|
else
|
|
return { WIN_SASHTYPES.INACTIVE_OUT, WIN_SASHTYPES.INACTIVE_IN, WIN_SASHTYPES.ACTIVE_IN, WIN_SASHTYPES.ACTIVE_OUT}, 'Dx'
|
|
end
|
|
end
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
-- funzione ricorsiva che legge le aree in tabella e crea le geometrie
|
|
local function ConvertTableToGeometry( AreaTable, nParentId)
|
|
|
|
if not AreaTable then
|
|
return
|
|
end
|
|
|
|
-- TELAIO
|
|
if AreaTable[JWD_AREA_TYPE] == 'FRAME' then
|
|
|
|
-- recupero i dati del telaio ( forma, giunzioni, dimensioni)
|
|
local nType = GetFrameShape( AreaTable[JWD_FRAME_SHAPE])
|
|
local vJoints = GetJoints( AreaTable[JWD_JOINTS])
|
|
local vDim = {}
|
|
local tDimensions = AreaTable[JWD_DIMENSION_LIST]
|
|
for i = 1, #tDimensions do
|
|
vDim[i] = tDimensions[i][JWD_VALUE]
|
|
end
|
|
|
|
-- creo il telaio
|
|
local nAreaId = WinCreate.CreateFrame( nType, vJoints, vDim[1], vDim[2], vDim[3])
|
|
|
|
-- verifico presenza bottomrail
|
|
if AreaTable[JWD_BOTTOMRAIL] then
|
|
WinCreate.AddBottomRail( nAreaId, AreaTable[JWD_BOTTOMRAIL_QTY])
|
|
end
|
|
|
|
-- analizzo sottoaree
|
|
if AreaTable[JWD_AREA_LIST] then
|
|
ConvertTableToGeometry( AreaTable[JWD_AREA_LIST][1], nAreaId)
|
|
end
|
|
|
|
return nAreaId
|
|
|
|
-- ANTA
|
|
elseif AreaTable[JWD_AREA_TYPE] == 'SASH' then
|
|
|
|
-- recupero dati
|
|
local tSashes = AreaTable[JWD_SASH_LIST]
|
|
local vJoints = GetJoints( AreaTable[JWD_JOINTS])
|
|
local nBottomRailNbr = 0
|
|
if AreaTable[JWD_BOTTOMRAIL] then
|
|
nBottomRailNbr = AreaTable[JWD_BOTTOMRAIL_QTY]
|
|
end
|
|
|
|
-- anta singola
|
|
if #tSashes == 1 then
|
|
local nOpeningType = GetOpeningType( tSashes[1][JWD_OPENING_TYPE])
|
|
local nAreaId = WinCreate.AddSash( nParentId, vJoints, WIN_SASHTYPES.NULL, nOpeningType)
|
|
-- aggiungo ferramenta sull'anta
|
|
if nOpeningType == WIN_OPENING_TYPES.TURNONLY_LEFT or
|
|
nOpeningType == WIN_OPENING_TYPES.TILTTURN_LEFT or
|
|
nOpeningType == WIN_OPENING_TYPES.TILTONLY_TOP or
|
|
nOpeningType == WIN_OPENING_TYPES.COPLANARSLIDE_LEFT or
|
|
nOpeningType == WIN_OPENING_TYPES.LIFTSLIDE_LEFT then
|
|
EgtSetInfo( nAreaId, WIN_HDW_HANDLE, 'Sx')
|
|
elseif nOpeningType == WIN_OPENING_TYPES.TURNONLY_RIGHT or
|
|
nOpeningType == WIN_OPENING_TYPES.TILTTURN_RIGHT or
|
|
nOpeningType == WIN_OPENING_TYPES.TILTONLY_BOTTOM or
|
|
nOpeningType == WIN_OPENING_TYPES.COPLANARSLIDE_RIGHT or
|
|
nOpeningType == WIN_OPENING_TYPES.LIFTSLIDE_RIGHT then
|
|
EgtSetInfo( nAreaId, WIN_HDW_HANDLE, 'Dx')
|
|
end
|
|
WinCreate.AddHardware( nAreaId, AreaTable[JWD_HARDWARE])
|
|
-- bottomrail
|
|
WinCreate.AddBottomRail( nAreaId, nBottomRailNbr)
|
|
-- analizzo sottaree
|
|
ConvertTableToGeometry( AreaTable[JWD_AREA_LIST][1], nAreaId)
|
|
|
|
-- ante multiple
|
|
else
|
|
-- aggiungo la ferramenta sull'area parent
|
|
WinCreate.AddHardware( nParentId, AreaTable[JWD_HARDWARE])
|
|
|
|
-- recupero dati delle ante
|
|
local vDimensions = {}
|
|
local vOpeningTypes = {}
|
|
for i = 1, #tSashes do
|
|
vDimensions[i] = tSashes[i][JWD_DIMENSION] / 100
|
|
vOpeningTypes[i] = GetOpeningType( tSashes[i][JWD_OPENING_TYPE])
|
|
end
|
|
table.remove( vDimensions)
|
|
local vSashTypes, sHandleSide = GetSashTypes( tSashes, vOpeningTypes)
|
|
EgtSetInfo( nParentId, WIN_HDW_HANDLE, sHandleSide)
|
|
|
|
-- aggiungo gli split
|
|
local vSplitAreas = WinCreate.AddSplits( nParentId, WIN_SPLITORIENTATION.VERTICAL, WIN_MEASURE.PERCENTAGE, vDimensions, 1, WIN_SPLITTYPES.FRENCH)
|
|
|
|
-- aggiungo le ante
|
|
for i = 1, #vSplitAreas do
|
|
local nAreaId = WinCreate.AddSash( vSplitAreas[i], vJoints, vSashTypes[i], vOpeningTypes[i])
|
|
-- bottomrail
|
|
WinCreate.AddBottomRail( nAreaId, nBottomRailNbr)
|
|
-- analizzo sottaree
|
|
ConvertTableToGeometry( AreaTable[JWD_AREA_LIST][i], nAreaId)
|
|
end
|
|
end
|
|
|
|
|
|
-- FILL
|
|
elseif AreaTable[JWD_AREA_TYPE] == 'FILL' then
|
|
local nFillType = EgtIf( AreaTable[JWD_FILL_TYPE] == 'GLASS', WIN_FILLTYPES.GLASS, WIN_FILLTYPES.WOOD)
|
|
WinCreate.AddFill( nParentId, nFillType)
|
|
|
|
|
|
-- SPLIT
|
|
elseif AreaTable[JWD_AREA_TYPE] == 'SPLIT' then
|
|
local vVertDimensions = {}
|
|
local vSplitVertDimensions = AreaTable[JWD_SPLIT_VERT_POS]
|
|
for i = 1, #vSplitVertDimensions - 1 do
|
|
vVertDimensions[i] = vSplitVertDimensions[i][JWD_DIMENSION] / 100
|
|
end
|
|
local vHorizDimensions = {}
|
|
local vSplitHorizDimensions = AreaTable[JWD_SPLIT_HORIZ_POS]
|
|
for i = 1, #vSplitHorizDimensions - 1 do
|
|
vHorizDimensions[i] = vSplitHorizDimensions[i][JWD_DIMENSION] / 100
|
|
end
|
|
local vSplitAreas
|
|
if AreaTable[JWD_SPLIT_TYPE] == 'GRID' then
|
|
vSplitAreas = WinCreate.AddGridSplits( nParentId, WIN_MEASURE.PERCENTAGE, vVertDimensions, vHorizDimensions, AreaTable[JWD_SPLIT_START_VERT])
|
|
elseif AreaTable[JWD_SPLIT_TYPE] == 'VERTICAL' then
|
|
vSplitAreas = WinCreate.AddSplits( nParentId, WIN_SPLITORIENTATION.VERTICAL, WIN_MEASURE.PERCENTAGE, vVertDimensions)
|
|
else
|
|
vSplitAreas = WinCreate.AddSplits( nParentId, WIN_SPLITORIENTATION.HORIZONTAL, WIN_MEASURE.PERCENTAGE, vHorizDimensions)
|
|
end
|
|
for i = 1, #vSplitAreas do
|
|
ConvertTableToGeometry( AreaTable[JWD_AREA_LIST][i], vSplitAreas[i])
|
|
end
|
|
|
|
|
|
-- NULL
|
|
elseif AreaTable[JWD_AREA_TYPE] == 'SPLITTED' then
|
|
if AreaTable[JWD_AREA_LIST] then
|
|
ConvertTableToGeometry( AreaTable[JWD_AREA_LIST][1], nParentId)
|
|
end
|
|
end
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
-- funzione che dato un file in json ne crea il progetto gerarchico
|
|
function WinManageProject.ReadFromFile( sFilePath, sProfileDir)
|
|
-- leggo il file
|
|
local SouFh = io.open( sFilePath, "rb")
|
|
if not SouFh then
|
|
EgtOutBox( 'Error opening ' .. sFilePath, 'ReadFromFile', 'ERROR')
|
|
return false
|
|
end
|
|
local content = SouFh:read( "*all")
|
|
SouFh:close()
|
|
local tData = JSON:decode( content)
|
|
|
|
-- importo il profilo
|
|
local sProfilePath = sProfileDir .. '\\' .. tData[JWD_PROFILE_PATH] .. '.nge'
|
|
if not WinCreate.ImportProfile( sProfilePath) then
|
|
return false
|
|
end
|
|
|
|
-- creo le aree
|
|
ConvertTableToGeometry( tData[JWD_AREA_LIST][1], GDB_ID.ROOT)
|
|
|
|
return true
|
|
end
|
|
|
|
-- funzione che apre un file jwd
|
|
function WinManageProject.ReadFromJwd( sJwd)
|
|
local tData = JSON:decode( sJwd)
|
|
|
|
-- importo il profilo
|
|
local sProfilePath = _G.sProfilePath .. '\\' .. tData[JWD_PROFILE_PATH] .. '.nge'
|
|
if not WinCreate.ImportProfile( sProfilePath) then
|
|
return false
|
|
end
|
|
|
|
-- creo le aree
|
|
return ConvertTableToGeometry( tData[JWD_AREA_LIST][1], GDB_ID.ROOT)
|
|
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
return WinManageProject
|