DataWindow :

- nella creazione degli split aggiunto measure type per ogni valore.
This commit is contained in:
SaraP
2025-12-02 14:47:42 +01:00
parent 36691a7e06
commit a77901fcc3
4 changed files with 209 additions and 171 deletions
+79 -53
View File
@@ -304,7 +304,7 @@ local function IdentifySashShape( nAreaId, nOutlineLayerId)
end
----------------------------------------------------------------------------------
-- funzione che aggiunge una anta
-- funzione che aggiunge una singola anta
function WinCreate.AddSash( nParentAreaId, vJoints, nOpeningType, nAreaNbr)
-- se già presente area errore
@@ -335,7 +335,7 @@ end
----------------------------------------------------------------------------------
-- funzione che aggiunge un gruppo di ante
function WinCreate.AddSashGroup( nParentAreaId, nMeasureType, vDimensions, vJoints, vSashTypes, vOpeningTypes, nAreaNbr, vSashNbrs)
function WinCreate.AddSashGroup( nParentAreaId, vMeasureTypes, vDimensions, vJoints, vSashTypes, vOpeningTypes, nAreaNbr, vSashNbrs)
-- se già presente sottoarea errore
if EgtGetFirstNameInGroup( nParentAreaId, WIN_AREA .. '*') then
@@ -343,7 +343,7 @@ function WinCreate.AddSashGroup( nParentAreaId, nMeasureType, vDimensions, vJoin
end
-- creo gli split di tipo french
local vAreas = WinCreate.AddSplits( nParentAreaId, WIN_SPLITORIENTATION.VERTICAL, nMeasureType, vDimensions, true, nAreaNbr)
local vAreas = WinCreate.AddSplits( nParentAreaId, WIN_SPLITORIENTATION.VERTICAL, vMeasureTypes, vDimensions, true, nAreaNbr)
-- identifico la forma del gruppo di ante
local nAreaSplit = EgtGetParent( vAreas[1])
@@ -572,50 +572,71 @@ local function CreateAreasFromSplits( nAreaId, vSplitCrvs)
end
----------------------------------------------------------------------------------
local function CalcSplitCurves( nLayerId, b3OutlineLayer, b3Limit, nSplitType, nMeasureType, PositionList)
local vSplitCurves = {}
local nProportion = 0
if nMeasureType == WIN_MEASURE.PROPORTIONAL then
for i = 1, #PositionList do
nProportion = nProportion + PositionList[i]
-- funzione che calcola le dimensioni assolute delle divisioni
local function CalcSplitDimensions( vMeasureTypes, vValues, dDim)
local vDimensions = {}
-- calcolo le dimensioni di tutti gli split assoluti e percentuali e calcolo i valori di riferimento per eventuali split proporzionali
local nPropTot = 0
local dPropDim = dDim
local bProportional = false
for i = 1, #vMeasureTypes do
if vMeasureTypes[i] == WIN_MEASURE.ABSOLUTE then
vDimensions[i] = vValues[i]
dPropDim = dPropDim - vDimensions[i]
elseif vMeasureTypes[i] == WIN_MEASURE.PERCENTAGE then
vDimensions[i] = dDim * vValues[i] / 100
dPropDim = dPropDim - vDimensions[i]
elseif vMeasureTypes[i] == WIN_MEASURE.PROPORTIONAL then
nPropTot = nPropTot + vValues[i]
bProportional = true
end
end
local dCurrPosition = 0
for i = 1, #PositionList do
-- calcolo la posizione corrente
dCurrPosition = dCurrPosition + PositionList[i]
local dCalcPosition
local nSplitCrv
-- calcolo le dimensioni degli split proporzionali
if bProportional then
if dPropDim < GEO.EPS_SMALL then
return {}
end
for i = 1, #vValues do
if vMeasureTypes[i] == WIN_MEASURE.PROPORTIONAL then
vDimensions[i] = dPropDim * vValues[i] / nPropTot
end
end
end
return vDimensions
end
----------------------------------------------------------------------------------
local function CalcSplitCurves( nLayerId, b3OutlineLayer, b3Limit, nSplitType, vMeasureTypes, vValues)
-- calcolo le dimensioni assolute di tutti gli split
local vDimensions = CalcSplitDimensions( vMeasureTypes, vValues, EgtIf( nSplitType == WIN_SPLITORIENTATION.VERTICAL, b3OutlineLayer:getDimX(), b3OutlineLayer:getDimY()))
local vSplitCurves = {}
local dPosition = 0
for i = 1, #vDimensions do
-- calcolo la posizione cumulata
dPosition = dPosition + vDimensions[i]
local nSplitCrv
if nSplitType == WIN_SPLITORIENTATION.VERTICAL then
-- aree ordinate da sx a dx
if nMeasureType == WIN_MEASURE.ABSOLUT then
dCalcPosition = dCurrPosition
elseif nMeasureType == WIN_MEASURE.PROPORTIONAL then
dCalcPosition = b3OutlineLayer:getDimX() * dCurrPosition / nProportion
elseif nMeasureType == WIN_MEASURE.PERCENTAGE then
dCalcPosition = b3OutlineLayer:getDimX() * dCurrPosition
end
local dCurrPosition = dPosition
-- creo la linea se rientra nella regione limite
local dX = b3OutlineLayer:getMin():getX() + dCalcPosition
local dX = b3OutlineLayer:getMin():getX() + dCurrPosition
if dX > b3Limit:getMin():getX() + GEO.EPS_SMALL and dX < b3Limit:getMax():getX() - GEO.EPS_SMALL then
nSplitCrv = EgtLinePVL( nLayerId, b3OutlineLayer:getMin() + X_AX() * dCalcPosition, Y_AX(), b3OutlineLayer:getDimY())
nSplitCrv = EgtLinePVL( nLayerId, b3OutlineLayer:getMin() + X_AX() * dCurrPosition, Y_AX(), b3OutlineLayer:getDimY())
end
elseif nSplitType == WIN_SPLITORIENTATION.HORIZONTAL then
-- aree ordinate dall'alto al basso
if nMeasureType == WIN_MEASURE.ABSOLUT then
dCalcPosition = b3OutlineLayer:getDimY() - dCurrPosition
elseif nMeasureType == WIN_MEASURE.PROPORTIONAL then
dCalcPosition = b3OutlineLayer:getDimY() * ( 1 - dCurrPosition / nProportion)
elseif nMeasureType == WIN_MEASURE.PERCENTAGE then
dCalcPosition = b3OutlineLayer:getDimY() * ( 1 - dCurrPosition)
end
local dCurrPosition = b3OutlineLayer:getDimY() - dPosition
-- creo la linea se rientra nella regione limite
local dY = b3OutlineLayer:getMin():getY() + dCalcPosition
local dY = b3OutlineLayer:getMin():getY() + dCurrPosition
if dY > b3Limit:getMin():getY() + GEO.EPS_SMALL and dY < b3Limit:getMax():getY() - GEO.EPS_SMALL then
nSplitCrv = EgtLinePVL( nLayerId, b3OutlineLayer:getMin() + Y_AX() * dCalcPosition, X_AX(), b3OutlineLayer:getDimX())
nSplitCrv = EgtLinePVL( nLayerId, b3OutlineLayer:getMin() + Y_AX() * dCurrPosition, X_AX(), b3OutlineLayer:getDimX())
end
end
@@ -630,7 +651,7 @@ end
----------------------------------------------------------------------------------
-- funzione che crea tagli split multipli
function WinCreate.AddSplits( nParentAreaId, nSplitType, nMeasureType, PositionList, bFrench, nAreaNbr)
function WinCreate.AddSplits( nParentAreaId, nSplitType, vMeasureTypes, vValues, bFrench, nAreaNbr)
-- se area ha già sottoarea errore
if EgtGetFirstNameInGroup( nParentAreaId, WIN_AREA .. '*') then
@@ -644,11 +665,7 @@ function WinCreate.AddSplits( nParentAreaId, nSplitType, nMeasureType, PositionL
if nAreaNbr then
EgtSetInfo( nAreaId, WIN_AREA_NBR, nAreaNbr)
end
-- copio il contorno dall'area parent e setto opportune corrispondenze sou/child
local nOutlineLayerId = CopyParentOutline( nAreaId, nParentAreaId)
local b3OutlineLayer = EgtGetBBox( nOutlineLayerId, GDB_BB.STANDARD)
-- creo layer per split
local nSplitLayerId = EgtGroup( nAreaId)
EgtSetName( nSplitLayerId, WIN_BASESPLIT)
@@ -658,7 +675,9 @@ function WinCreate.AddSplits( nParentAreaId, nSplitType, nMeasureType, PositionL
end
-- creo le curve di split
local vSplitCurves = CalcSplitCurves( nSplitLayerId, b3OutlineLayer, b3OutlineLayer, nSplitType, nMeasureType, PositionList)
local nParentOutlineLayerId = EgtGetFirstNameInGroup( nParentAreaId, WIN_AREAOUTLINE)
local b3OutlineLayer = EgtGetBBox( nParentOutlineLayerId, GDB_BB.STANDARD)
local vSplitCurves = CalcSplitCurves( nSplitLayerId, b3OutlineLayer, b3OutlineLayer, nSplitType, vMeasureTypes, vValues)
-- se non ci sono curve valide cancello tutto ed esco
if #vSplitCurves == 0 then
@@ -666,6 +685,9 @@ function WinCreate.AddSplits( nParentAreaId, nSplitType, nMeasureType, PositionL
return
end
-- copio il contorno dall'area parent e setto opportune corrispondenze sou/child
local nOutlineLayerId = CopyParentOutline( nAreaId, nParentAreaId)
-- creo le aree generate dagli split
local vAreas = CreateAreasFromSplits( nAreaId, vSplitCurves)
return vAreas
@@ -673,7 +695,7 @@ end
----------------------------------------------------------------------------------
-- funzione che crea tagli split grid
function WinCreate.AddGridSplits( nParentAreaId, nMeasureType, PositionListVert, PositionListHoriz, bStartVertical, nAreaNbr)
function WinCreate.AddGridSplits( nParentAreaId, vVertMeasureTypes, vVertValues, vHorizMeasureTypes, vHorizValues, bStartVertical, nAreaNbr)
local AreaResult = {}
@@ -699,21 +721,25 @@ function WinCreate.AddGridSplits( nParentAreaId, nMeasureType, PositionListVert,
EgtSetName( nSplitLayerId, WIN_BASESPLIT)
-- stabilisco direzione principale e secondaria
local PositionListMain, PositionListOther, nSplitOrientationMain, nSplitOrientationOther
local vMainTypes, vOtherTypes, vMainValues, vOtherValues, nMainSplitOrientation, nOtherSplitOrientation
if bStartVertical then
PositionListMain = PositionListVert
PositionListOther = PositionListHoriz
nSplitOrientationMain = WIN_SPLITORIENTATION.VERTICAL
nSplitOrientationOther = WIN_SPLITORIENTATION.HORIZONTAL
vMainTypes = vVertMeasureTypes
vMainValues = vVertValues
nMainSplitOrientation = WIN_SPLITORIENTATION.VERTICAL
vOtherTypes = vHorizMeasureTypes
vOtherValues = vHorizValues
nOtherSplitOrientation = WIN_SPLITORIENTATION.HORIZONTAL
else
PositionListMain = PositionListHoriz
PositionListOther = PositionListVert
nSplitOrientationMain = WIN_SPLITORIENTATION.HORIZONTAL
nSplitOrientationOther = WIN_SPLITORIENTATION.VERTICAL
vMainTypes = vHorizMeasureTypes
vMainValues = vHorizValues
nMainSplitOrientation = WIN_SPLITORIENTATION.HORIZONTAL
vOtherTypes = vVertMeasureTypes
vOtherValues = vVertValues
nOtherSplitOrientation = WIN_SPLITORIENTATION.VERTICAL
end
-- calcolo la suddivisione nella direzione principale
local vMainSplit = CalcSplitCurves( nSplitLayerId, b3OutlineLayer, b3OutlineLayer, nSplitOrientationMain, nMeasureType, PositionListMain)
local vMainSplit = CalcSplitCurves( nSplitLayerId, b3OutlineLayer, b3OutlineLayer, nMainSplitOrientation, vMainTypes, vMainValues)
local vMainAreas = CreateAreasFromSplits( nAreaId, vMainSplit)
-- per ogni area della direzione principale calcolo la suddivisione nella direzione secondaria
@@ -723,7 +749,7 @@ function WinCreate.AddGridSplits( nParentAreaId, nMeasureType, PositionListVert,
local b3Limit = EgtGetBBox( nAreaOutlineLayerId, GDB_BB.STANDARD)
-- calcolo gli split nella direzione secondaria
local vOtherSplit = CalcSplitCurves( nSplitLayerId, b3OutlineLayer, b3Limit, nSplitOrientationOther, nMeasureType, PositionListOther)
local vOtherSplit = CalcSplitCurves( nSplitLayerId, b3OutlineLayer, b3Limit, nOtherSplitOrientation, vOtherTypes, vOtherValues)
if #vOtherSplit > 0 then
local vNewAreas = CreateAreasFromSplits( vMainAreas[i], vOtherSplit)
AreaResult = EgtJoinTables( AreaResult, vNewAreas)
+8 -19
View File
@@ -103,7 +103,7 @@ end
local function GetMeasureType( sMeasureType)
if sMeasureType == 'ABSOLUT' then
return WIN_MEASURE.ABSOLUT
return WIN_MEASURE.ABSOLUTE
elseif sMeasureType == 'PROPORTIONAL' then
return WIN_MEASURE.PROPORTIONAL
elseif sMeasureType == 'PERCENTAGE' then
@@ -214,7 +214,6 @@ local function ConvertTableToGeometry( AreaTable, nParentId)
-- 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]
@@ -267,18 +266,14 @@ local function ConvertTableToGeometry( AreaTable, nParentId)
for i = 1, #tSashes do
vMeasureType[i] = GetMeasureType( tSashes[i][JWD_MEASURE_TYPE])
vDimensions[i] = tSashes[i][JWD_DIMENSION]
if vMeasureType[i] == WIN_MEASURE.PERCENTAGE then
vDimensions[i] = vDimensions[i] / 100
end
vOpeningTypes[i] = GetOpeningType( tSashes[i][JWD_OPENING_TYPE])
vSashNbrs[i] = tSashes[i][JWD_ID_SASH]
vJoints[i] = GetJoints( tSashes[i][JWD_JOINTS])
end
table.remove( vDimensions)
local vSashTypes, sHandleSide = GetSashTypes( tSashes, vOpeningTypes)
-- aggiungo il gruppo di ante
local vAreas = WinCreate.AddSashGroup( nParentId, vMeasureType[1], vDimensions, vJoints, vSashTypes, vOpeningTypes, nAreaNbr, vSashNbrs)
local vAreas = WinCreate.AddSashGroup( nParentId, vMeasureType, vDimensions, vJoints, vSashTypes, vOpeningTypes, nAreaNbr, vSashNbrs)
-- aggiungo le ante
for i = 1, #vAreas do
-- bottomrail
@@ -305,30 +300,24 @@ local function ConvertTableToGeometry( AreaTable, nParentId)
local vVertDimensions = {}
local vVertMeasureType = {}
local vSplitVertDimensions = AreaTable[JWD_SPLIT_VERT_POS]
for i = 1, #vSplitVertDimensions - 1 do
for i = 1, #vSplitVertDimensions do
vVertMeasureType[i] = GetMeasureType( vSplitVertDimensions[i][JWD_MEASURE_TYPE])
vVertDimensions[i] = vSplitVertDimensions[i][JWD_DIMENSION]
if vVertMeasureType[i] == WIN_MEASURE.PERCENTAGE then
vVertDimensions[i] = vVertDimensions[i] / 100
end
end
local vHorizDimensions = {}
local vHorizMeasureType = {}
local vSplitHorizDimensions = AreaTable[JWD_SPLIT_HORIZ_POS]
for i = 1, #vSplitHorizDimensions - 1 do
for i = 1, #vSplitHorizDimensions do
vHorizMeasureType[i] = GetMeasureType( vSplitHorizDimensions[i][JWD_MEASURE_TYPE])
vHorizDimensions[i] = vSplitHorizDimensions[i][JWD_DIMENSION]
if vHorizMeasureType[i] == WIN_MEASURE.PERCENTAGE then
vHorizDimensions[i] = vHorizDimensions[i] / 100
end
end
local vSplitAreas
if AreaTable[JWD_SPLIT_TYPE] == 'GRID' then
vSplitAreas = WinCreate.AddGridSplits( nParentId, vVertMeasureType[1], vVertDimensions, vHorizDimensions, AreaTable[JWD_SPLIT_START_VERT], nAreaNbr)
vSplitAreas = WinCreate.AddGridSplits( nParentId, vVertMeasureType, vVertDimensions, vHorizMeasureType, vHorizDimensions, AreaTable[JWD_SPLIT_START_VERT], nAreaNbr)
elseif AreaTable[JWD_SPLIT_TYPE] == 'VERTICAL' then
vSplitAreas = WinCreate.AddSplits( nParentId, WIN_SPLITORIENTATION.VERTICAL, vVertMeasureType[1], vVertDimensions, false, nAreaNbr)
vSplitAreas = WinCreate.AddSplits( nParentId, WIN_SPLITORIENTATION.VERTICAL, vVertMeasureType, vVertDimensions, false, nAreaNbr)
else
vSplitAreas = WinCreate.AddSplits( nParentId, WIN_SPLITORIENTATION.HORIZONTAL, vHorizMeasureType[1], vHorizDimensions, false, nAreaNbr)
vSplitAreas = WinCreate.AddSplits( nParentId, WIN_SPLITORIENTATION.HORIZONTAL, vHorizMeasureType, vHorizDimensions, false, nAreaNbr)
end
for i = 1, #vSplitAreas do
ConvertTableToGeometry( AreaTable[JWD_AREA_LIST][i], vSplitAreas[i])