d8d34552e9
- pezzi con dimensioni variabili ( prima versione).
764 lines
32 KiB
Lua
764 lines
32 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 WinCreate = {}
|
|
|
|
-- funzioni
|
|
----------------------------------------------------------------------------------
|
|
local function AddInfo( nId, sInfo, nVal)
|
|
local vInfo = EgtGetInfo( nId, sInfo, 'vi') or {}
|
|
table.insert( vInfo, nVal)
|
|
EgtSetInfo( nId, sInfo, vInfo)
|
|
end
|
|
|
|
----------------------------------------------------------------------------------
|
|
local function CopyParentOutline( nAreaId, nParentAreaId)
|
|
-- recupero outline del parent
|
|
local nParentOutlineLayerId = EgtGetFirstNameInGroup( nParentAreaId, WIN_AREAOUTLINE)
|
|
local vParentCrvs = EgtGetAllInGroup( nParentOutlineLayerId)
|
|
-- creo outline per area corrente
|
|
local nOutlineLayerId = EgtGroup( nAreaId)
|
|
EgtSetName( nOutlineLayerId, WIN_AREAOUTLINE)
|
|
-- copio le curve di outline del parent e setto le corrispondenze sou/child
|
|
for i = 1, #vParentCrvs do
|
|
local nOutlineId = EgtCopy( vParentCrvs[i], nOutlineLayerId)
|
|
EgtSetInfo( nOutlineId, WIN_SOU, vParentCrvs[i])
|
|
EgtSetInfo( vParentCrvs[i], WIN_CHILD, nOutlineId)
|
|
end
|
|
return nOutlineLayerId
|
|
end
|
|
|
|
|
|
|
|
----------------------------------------------------------------------------------
|
|
------------------------------------ PROFILO -------------------------------------
|
|
----------------------------------------------------------------------------------
|
|
-- funzione che importa il profilo
|
|
function WinCreate.ImportProfile( sProfilePath)
|
|
-- verifico esistenza file
|
|
if not EgtExistsFile( sProfilePath) then
|
|
EgtOutLog( 'File del profilo non trovato! ' .. sProfilePath)
|
|
EgtOutText( 'File del profilo non trovato! ' .. sProfilePath)
|
|
EgtPause(5000)
|
|
return false
|
|
end
|
|
-- creo gruppo per il profilo
|
|
local nProfileId = EgtGroup( GDB_ID.ROOT)
|
|
EgtSetName( nProfileId, WIN_PROFILE)
|
|
EgtSetLevel( nProfileId, GDB_LV.SYSTEM)
|
|
-- importo profilo prescelto
|
|
local bOk = EgtInsertFile( sProfilePath)
|
|
-- recupero gruppi importati e li sposto nel gruppo profilo
|
|
local nGroupId = EgtGetFirstInGroup( GDB_ID.ROOT)
|
|
while nGroupId do
|
|
if nGroupId ~= nProfileId then
|
|
local nCurrId = nGroupId
|
|
nGroupId = EgtGetNext( nGroupId)
|
|
EgtRelocateGlob( nCurrId, nProfileId)
|
|
EgtSetStatus( nCurrId, GDB_ST.OFF)
|
|
else
|
|
nGroupId = EgtGetNext( nGroupId)
|
|
end
|
|
end
|
|
-- riporto path nel Part del profilo
|
|
EgtSetInfo( nProfileId, WIN_PROFILEPATH, sProfilePath)
|
|
return true
|
|
end
|
|
|
|
|
|
|
|
----------------------------------------------------------------------------------
|
|
------------------------------------- TELAIO -------------------------------------
|
|
----------------------------------------------------------------------------------
|
|
-- funzione che crea le curve che definiscono il telaio in base alla geometria richiesta
|
|
local function CreateFrameCurves( nLayerId, nType, vDim)
|
|
|
|
-- rettangolo
|
|
if nType == WIN_FRAME_TYPES.RECT then
|
|
-- vDim[1] larghezza, vDim[2] altezza dei lati verticali
|
|
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
|
EgtSetName( nBottomId, WIN_BOTTOM)
|
|
local nRightId = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[1], vDim[2], 0))
|
|
EgtSetName( nRightId, WIN_RIGHT)
|
|
local nTopId = EgtLine( nLayerId, Point3d( vDim[1], vDim[2], 0), Point3d( 0, vDim[2], 0))
|
|
EgtSetName( nTopId, WIN_TOP)
|
|
local nLeftId = EgtLine( nLayerId, Point3d( 0, vDim[2], 0), ORIG())
|
|
EgtSetName( nLeftId, WIN_LEFT)
|
|
|
|
-- lato top inclinato
|
|
elseif nType == WIN_FRAME_TYPES.CHAMFER_SIDE then
|
|
-- vDim[1] larghezza, vDim[2] altezza del lato sx, vDim[3] altezza del lato dx
|
|
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
|
EgtSetName( nBottomId, WIN_BOTTOM)
|
|
local nRightId = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[1], vDim[3], 0))
|
|
EgtSetName( nRightId, WIN_RIGHT)
|
|
local nTopId = EgtLine( nLayerId, Point3d( vDim[1], vDim[3], 0), Point3d( 0, vDim[2], 0))
|
|
EgtSetName( nTopId, WIN_TOP)
|
|
local nLeftId = EgtLine( nLayerId, Point3d( 0, vDim[2], 0), ORIG())
|
|
EgtSetName( nLeftId, WIN_LEFT)
|
|
|
|
-- triangular arch
|
|
elseif nType == WIN_FRAME_TYPES.CHAMFER then
|
|
-- vDim[1] larghezza, vDim[2] altezza dei lati verticali, vDim[3] altezza complessiva
|
|
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
|
EgtSetName( nBottomId, WIN_BOTTOM)
|
|
local nRightId = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[1], vDim[2], 0))
|
|
EgtSetName( nRightId, WIN_RIGHT)
|
|
local nTop1Id = EgtLine( nLayerId, Point3d( vDim[1], vDim[2], 0), Point3d( vDim[1] / 2, vDim[3], 0))
|
|
local nTop2Id = EgtLine( nLayerId, Point3d( vDim[1] / 2, vDim[3], 0), Point3d( 0, vDim[2], 0))
|
|
EgtSetName( nTop1Id, WIN_TOP)
|
|
EgtSetName( nTop2Id, WIN_TOP)
|
|
local nLeftId = EgtLine( nLayerId, Point3d( 0, vDim[2], 0), ORIG())
|
|
EgtSetName( nLeftId, WIN_LEFT)
|
|
|
|
-- arco a tutto sesto
|
|
elseif nType == WIN_FRAME_TYPES.ROUND_ARC then
|
|
-- vDim[1] larghezza, vDim[2] altezza complessiva
|
|
-- verifico che altezza sia sensata
|
|
if vDim[2] < 0.5 * vDim[1] + GEO.EPS_SMALL then
|
|
return false
|
|
end
|
|
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
|
EgtSetName( nBottomId, WIN_BOTTOM)
|
|
local nRightId = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[1], vDim[2] - 0.5 * vDim[1], 0))
|
|
EgtSetName( nRightId, WIN_RIGHT)
|
|
local nTopId = EgtArcCPA( nLayerId, Point3d( 0.5 * vDim[1], vDim[2] - 0.5 * vDim[1], 0), Point3d( vDim[1], vDim[2] - 0.5 * vDim[1], 0), 180, 0)
|
|
EgtSetName( nTopId, WIN_TOP)
|
|
local nLeftId = EgtLine( nLayerId, Point3d( 0, vDim[2] - 0.5 * vDim[1], 0), ORIG())
|
|
EgtSetName( nLeftId, WIN_LEFT)
|
|
|
|
-- arco ribassato
|
|
elseif nType == WIN_FRAME_TYPES.SEGMENTAL_ARC then
|
|
-- vDim[1] larghezza, vDim[2] altezza dei lati verticali, vDim[3] altezza complessiva
|
|
-- controllo che non degeneri in arco a tutto sesto
|
|
if vDim[3] - vDim[2] > 0.5 * vDim[1] - GEO.EPS_SMALL then
|
|
return false
|
|
end
|
|
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
|
EgtSetName( nBottomId, WIN_BOTTOM)
|
|
local nRightId = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[1], vDim[2], 0))
|
|
EgtSetName( nRightId, WIN_RIGHT)
|
|
local nTopId = EgtArc3P( nLayerId, Point3d( vDim[1], vDim[2], 0), Point3d( 0.5 * vDim[1], vDim[3], 0), Point3d( 0, vDim[2], 0))
|
|
EgtSetName( nTopId, WIN_TOP)
|
|
local nLeftId = EgtLine( nLayerId, Point3d( 0, vDim[2], 0), ORIG())
|
|
EgtSetName( nLeftId, WIN_LEFT)
|
|
|
|
-- arco a 3 centri
|
|
elseif nType == WIN_FRAME_TYPES.THREE_CENTER_ARC then
|
|
-- vDim[1] larghezza, vDim[2] altezza dei lati verticali, vDim[3] altezza complessiva, vDim[4] raggio di raccordo
|
|
-- controllo sulle dimensioni
|
|
if vDim[3] - vDim[2] > 0.5 * vDim[1] - GEO.EPS_SMALL or vDim[4] > 0.5 * vDim[1] - GEO.EPS_SMALL then
|
|
return false
|
|
end
|
|
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
|
EgtSetName( nBottomId, WIN_BOTTOM)
|
|
local nRightId = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[1], vDim[2], 0))
|
|
EgtSetName( nRightId, WIN_RIGHT)
|
|
local nTopId = EgtArc3P( nLayerId, Point3d( vDim[1], vDim[2], 0), Point3d( 0.5 * vDim[1], vDim[3], 0), Point3d( 0, vDim[2], 0))
|
|
EgtSetName( nTopId, WIN_TOP)
|
|
local nLeftId = EgtLine( nLayerId, Point3d( 0, vDim[2], 0), ORIG())
|
|
EgtSetName( nLeftId, WIN_LEFT)
|
|
|
|
local nFillet1 = EgtCurveFillet( nLayerId, nRightId, EgtUP( nRightId, 0.9), nTopId, EgtUP( nTopId, 0.1), vDim[4], true)
|
|
EgtRelocateGlob( nFillet1, nTopId, GDB_IN.BEFORE)
|
|
EgtSetName( nFillet1, WIN_TOP)
|
|
local nFillet2 = EgtCurveFillet( nLayerId, nTopId, EgtUP( nTopId, 0.9), nLeftId, EgtUP( nLeftId, 0.1), vDim[4], true)
|
|
EgtRelocateGlob( nFillet2, nTopId, GDB_IN.AFTER)
|
|
EgtSetName( nFillet2, WIN_TOP)
|
|
|
|
-- arco a sesto acuto
|
|
elseif nType == WIN_FRAME_TYPES.POINTED_ARC then
|
|
-- vDim[1] larghezza, vDim[2] altezza dei lati verticali, vDim[3] altezza complessiva
|
|
-- verifico che le due altezze abbiano valori sensati per realizzare i due archi
|
|
if vDim[3] - vDim[2] < 0.5 * vDim[1] then
|
|
return false
|
|
end
|
|
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
|
EgtSetName( nBottomId, WIN_BOTTOM)
|
|
local nRightId = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[1], vDim[2], 0))
|
|
EgtSetName( nRightId, WIN_RIGHT)
|
|
local nTop1Id = EgtArc2PV( nLayerId, Point3d( vDim[1], vDim[2], 0), Point3d( 0.5 * vDim[1], vDim[3], 0), Y_AX())
|
|
EgtSetName( nTop1Id, WIN_TOP)
|
|
local nTop2Id = EgtArc2PV( nLayerId, Point3d( 0, vDim[2], 0), Point3d( 0.5 * vDim[1], vDim[3], 0), Y_AX())
|
|
EgtInvertCurve( nTop2Id)
|
|
EgtSetName( nTop2Id, WIN_TOP)
|
|
local nLeftId = EgtLine( nLayerId, Point3d( 0, vDim[2], 0), ORIG())
|
|
EgtSetName( nLeftId, WIN_LEFT)
|
|
|
|
-- triangolo
|
|
elseif nType == WIN_FRAME_TYPES.TRG then
|
|
-- vDim[1] larghezza, vDim[2] altezza complessiva, vDim[3] proiezione del lato left sul bottom
|
|
local nBottomId = EgtLine( nLayerId, ORIG(), Point3d( vDim[1], 0, 0))
|
|
EgtSetName( nBottomId, WIN_BOTTOM)
|
|
local nEdge1Id = EgtLine( nLayerId, Point3d( vDim[1], 0, 0), Point3d( vDim[3], vDim[2], 0))
|
|
local nEdge2Id = EgtLine( nLayerId, Point3d( vDim[3], vDim[2], 0), ORIG())
|
|
-- un lato verticale è right/left, un lato inclinato è top
|
|
if vDim[3] < GEO.EPS_SMALL then
|
|
EgtSetName( nEdge1Id, WIN_TOP)
|
|
EgtSetName( nEdge2Id, WIN_LEFT)
|
|
elseif abs( vDim[3] - vDim[1]) < GEO.EPS_SMALL then
|
|
EgtSetName( nEdge1Id, WIN_RIGHT)
|
|
EgtSetName( nEdge2Id, WIN_TOP)
|
|
else
|
|
EgtSetName( nEdge1Id, WIN_TOP)
|
|
EgtSetName( nEdge2Id, WIN_TOP)
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- funzione che crea il telaio a partire da una specifica geometria ( rettangolo, chamfer...)
|
|
function WinCreate.CreateFrame( nType, vDimensions, vJoints, vPartsDim, nAreaNbr)
|
|
|
|
-- creo gruppo per telaio
|
|
local nAreaId = EgtGroup( GDB_ID.ROOT)
|
|
EgtSetName( nAreaId, WIN_AREA .. '(' .. WIN_FRAME .. ')')
|
|
EgtSetLevel( nAreaId, GDB_LV.SYSTEM)
|
|
|
|
-- imposto le info
|
|
EgtSetInfo( nAreaId, WIN_AREATYPE, WIN_AREATYPES.FRAME)
|
|
EgtSetInfo( nAreaId, WIN_FRAME_TYPE, nType)
|
|
EgtSetInfo( nAreaId, WIN_JOINTS, vJoints)
|
|
EgtSetInfo( nAreaId, WIN_PART_DIM, vPartsDim)
|
|
EgtSetInfo( nAreaId, WIN_AREA_NBR, nAreaNbr)
|
|
|
|
-- costruisco le curve di outline
|
|
local nOutlineLayerId = EgtGroup( nAreaId)
|
|
EgtSetName( nOutlineLayerId, WIN_AREAOUTLINE)
|
|
if not CreateFrameCurves( nOutlineLayerId, nType, vDimensions) then
|
|
return
|
|
end
|
|
|
|
return nAreaId
|
|
end
|
|
|
|
|
|
|
|
----------------------------------------------------------------------------------
|
|
-------------------------------------- ANTA --------------------------------------
|
|
----------------------------------------------------------------------------------
|
|
-- funzione che aggiunge una singola anta
|
|
function WinCreate.AddSash( nParentAreaId, vJoints, vPartsDim, nOpeningType, nAreaNbr)
|
|
|
|
-- se già presente area errore
|
|
if EgtGetFirstNameInGroup( nParentAreaId, WIN_AREA .. '*') then
|
|
return
|
|
end
|
|
|
|
-- creo nuova area
|
|
local nAreaId = EgtGroup( nParentAreaId)
|
|
EgtSetName( nAreaId, WIN_AREA .. '(' .. WIN_SASH .. ')')
|
|
-- imposto le info
|
|
EgtSetInfo( nAreaId, WIN_AREATYPE, WIN_AREATYPES.SASH)
|
|
EgtSetInfo( nAreaId, WIN_JOINTS, vJoints)
|
|
EgtSetInfo( nAreaId, WIN_PART_DIM, vPartsDim)
|
|
EgtSetInfo( nAreaId, WIN_OPENING_TYPE, nOpeningType)
|
|
EgtSetInfo( nAreaId, WIN_AREA_NBR, nAreaNbr)
|
|
EgtSetInfo( nAreaId, WIN_SASH_NBR, 1)
|
|
-- copio outline dall'area parent
|
|
CopyParentOutline( nAreaId, nParentAreaId)
|
|
|
|
return nAreaId
|
|
end
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- funzione che aggiunge un gruppo di ante
|
|
function WinCreate.AddSashGroup( nParentAreaId, vMeasureTypes, vDimensions, vJoints, vPartsDim, vSashTypes, vOpeningTypes, nAreaNbr, vSashNbrs)
|
|
|
|
-- se già presente sottoarea errore
|
|
if EgtGetFirstNameInGroup( nParentAreaId, WIN_AREA .. '*') then
|
|
return
|
|
end
|
|
|
|
-- creo gli split di tipo french
|
|
local vAreas = WinCreate.AddSplits( nParentAreaId, WIN_SPLITORIENTATION.VERTICAL, vMeasureTypes, vDimensions, {}, true, nAreaNbr)
|
|
-- trasformo le aree risultanti ( che sono null) nelle aree dell'anta settando le info opportune
|
|
for i = 1, #vAreas do
|
|
EgtSetName( vAreas[i], EgtGetName( vAreas[i]) .. '(' .. WIN_SASH .. ')')
|
|
EgtSetInfo( vAreas[i], WIN_AREATYPE, WIN_AREATYPES.SASH)
|
|
EgtSetInfo( vAreas[i], WIN_JOINTS, vJoints[i])
|
|
EgtSetInfo( vAreas[i], WIN_PART_DIM, vPartsDim[i])
|
|
EgtSetInfo( vAreas[i], WIN_SASHTYPE, vSashTypes[i])
|
|
EgtSetInfo( vAreas[i], WIN_OPENING_TYPE, vOpeningTypes[i])
|
|
if vSashNbrs then
|
|
EgtSetInfo( vAreas[i], WIN_SASH_NBR, vSashNbrs[i])
|
|
end
|
|
end
|
|
|
|
return vAreas
|
|
end
|
|
|
|
|
|
|
|
----------------------------------------------------------------------------------
|
|
-------------------------------------- FILL --------------------------------------
|
|
----------------------------------------------------------------------------------
|
|
-- funzione che aggiunge un riempimento
|
|
function WinCreate.AddFill( nParentAreaId, nFillType, nAreaNbr)
|
|
|
|
-- se area ha già sottoarea errore
|
|
if EgtGetFirstNameInGroup( nParentAreaId, WIN_AREA .. '*') then
|
|
return
|
|
end
|
|
|
|
local nAreaId = EgtGroup( nParentAreaId)
|
|
EgtSetName( nAreaId, WIN_AREA .. '(' .. WIN_FILL .. ')')
|
|
-- setto le info
|
|
EgtSetInfo( nAreaId, WIN_AREATYPE, WIN_AREATYPES.FILL)
|
|
EgtSetInfo( nAreaId, WIN_FILLTYPE, nFillType)
|
|
EgtSetInfo( nAreaId, WIN_AREA_NBR, nAreaNbr)
|
|
-- copio outline dall'area parent
|
|
CopyParentOutline( nAreaId, nParentAreaId)
|
|
|
|
return nAreaId
|
|
end
|
|
|
|
|
|
|
|
----------------------------------------------------------------------------------
|
|
------------------------------------- SPLIT --------------------------------------
|
|
----------------------------------------------------------------------------------
|
|
-- funzione che assegna il nome alla curva di split nella sottoarea in base alla sua direzione
|
|
local function SetSplitName( nSplitId)
|
|
|
|
local vtMedia = ( ( EgtEV( nSplitId) + EgtSV( nSplitId)) / 2)
|
|
if not vtMedia:normalize() then
|
|
vtMedia = EgtSV( nSplitId)
|
|
end
|
|
if abs( vtMedia:getX()) > abs( vtMedia:getY()) then
|
|
if vtMedia:getX() > 0 then
|
|
EgtSetName( nSplitId, WIN_BOTTOM)
|
|
else
|
|
EgtSetName( nSplitId, WIN_TOP)
|
|
end
|
|
else
|
|
if vtMedia:getY() > 0 then
|
|
EgtSetName( nSplitId, WIN_RIGHT)
|
|
else
|
|
EgtSetName( nSplitId, WIN_LEFT)
|
|
end
|
|
end
|
|
end
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- funzione che taglia lo split con il bordo della regione
|
|
local function AdjustSplitCurve( nSplitId, nCompo, vOutlineCrvs, nOutlineLayerId)
|
|
|
|
-- trimmo lo split a filo con l'outline
|
|
EgtExtendCurveStartByLen( nSplitId, 10)
|
|
EgtExtendCurveEndByLen( nSplitId, 10)
|
|
local ptS = EgtIP( nSplitId, nCompo, EgtSP( nSplitId))
|
|
local ptE = EgtIP( nSplitId, nCompo, EgtEP( nSplitId))
|
|
local dParS = EgtCurveParamAtPoint( nSplitId, ptS)
|
|
local dParE = EgtCurveParamAtPoint( nSplitId, ptE)
|
|
EgtTrimCurveStartEndAtParam( nSplitId, dParS, dParE)
|
|
|
|
-- recupero le curve con cui avviene l'intersezione e le salvo come info
|
|
-- start
|
|
local dParCrvS = EgtCurveParamAtPoint( nCompo, ptS)
|
|
if abs( dParCrvS - ceil( dParCrvS)) < GEO.EPS_ZERO then
|
|
local nCrv = vOutlineCrvs[ ceil( dParCrvS) + 1]
|
|
local nOther = EgtGetPrev( nCrv) or EgtGetLastInGroup( nOutlineLayerId)
|
|
EgtSetInfo( nSplitId, WIN_SPLIT_STARTINTERS, { nOther, nCrv})
|
|
elseif abs( dParCrvS - floor( dParCrvS)) < GEO.EPS_ZERO then
|
|
local nCrv = vOutlineCrvs[ floor( dParCrvS) + 1]
|
|
local nOther = EgtGetPrev( nCrv) or EgtGetLastInGroup( nOutlineLayerId)
|
|
EgtSetInfo( nSplitId, WIN_SPLIT_STARTINTERS, { nOther, nCrv})
|
|
else
|
|
-- se il parametro non è intero allora l'intersezione coinvolge una sola curva
|
|
local nCrv = vOutlineCrvs[ floor( dParCrvS) + 1]
|
|
EgtSetInfo( nSplitId, WIN_SPLIT_STARTINTERS, { nCrv})
|
|
end
|
|
|
|
-- end
|
|
local dParCrvE = EgtCurveParamAtPoint( nCompo, ptE)
|
|
if abs( dParCrvE - ceil( dParCrvE)) < GEO.EPS_ZERO then
|
|
local nCrv = vOutlineCrvs[ ceil( dParCrvE) + 1]
|
|
local nOther = EgtGetPrev( nCrv) or EgtGetLastInGroup( nOutlineLayerId)
|
|
EgtSetInfo( nSplitId, WIN_SPLIT_ENDINTERS, { nOther, nCrv})
|
|
elseif abs( dParCrvE - floor( dParCrvE)) < GEO.EPS_ZERO then
|
|
local nCrv = vOutlineCrvs[ floor( dParCrvE) + 1]
|
|
local nOther = EgtGetPrev( nCrv) or EgtGetLastInGroup( nOutlineLayerId)
|
|
EgtSetInfo( nSplitId, WIN_SPLIT_ENDINTERS, { nOther, nCrv})
|
|
else
|
|
local nCrv = vOutlineCrvs[ floor( dParCrvE) + 1]
|
|
EgtSetInfo( nSplitId, WIN_SPLIT_ENDINTERS, { nCrv})
|
|
end
|
|
end
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- funzione che restituisce il bordo delle due regioni definite da uno split
|
|
local function GetBorderRegions( nSplitId, nCompo, nAreaId)
|
|
|
|
-- taglio il bordo in due in corrispondenza dello split
|
|
local nCrv1 = EgtCopyGlob( nCompo, nAreaId)
|
|
local nCrv2 = EgtCopyGlob( nCompo, nAreaId)
|
|
local dPar1 = EgtCurveParamAtPoint( nCompo, EgtSP( nSplitId), 100 * GEO.EPS_SMALL)
|
|
local dPar2 = EgtCurveParamAtPoint( nCompo, EgtEP( nSplitId), 100 * GEO.EPS_SMALL)
|
|
EgtTrimCurveStartEndAtParam( nCrv1, dPar2, dPar1)
|
|
EgtTrimCurveStartEndAtParam( nCrv2, dPar1, dPar2)
|
|
|
|
-- aggiungo la curva di split al bordo per chiuderlo orientandola opportunamente
|
|
local nSplitId1 = EgtCopyGlob( nSplitId, nAreaId)
|
|
if AreSamePointApprox( EgtSP( nSplitId1), EgtSP( nCrv1)) then
|
|
EgtInvertCurve( nSplitId1)
|
|
end
|
|
EgtAddCurveCompoCurve( nCrv1, nSplitId1)
|
|
local _, dParE1 = EgtCurveDomain( nCrv1)
|
|
EgtCurveCompoSetTempProp( nCrv1, dParE1 - 1, nSplitId)
|
|
|
|
local nSplitId2 = EgtCopyGlob( nSplitId, nAreaId)
|
|
if AreSamePointApprox( EgtSP( nSplitId2), EgtSP( nCrv2)) then
|
|
EgtInvertCurve( nSplitId2)
|
|
end
|
|
EgtAddCurveCompoCurve( nCrv2, nSplitId2)
|
|
local _, dParE2 = EgtCurveDomain( nCrv2)
|
|
EgtCurveCompoSetTempProp( nCrv2, dParE2 - 1, nSplitId)
|
|
|
|
return nCrv1, nCrv2
|
|
end
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- funzione che crea le aree generate da una sequenza di curve di split
|
|
local function CreateAreasFromSplits( nAreaId, vSplitCrvs)
|
|
|
|
local nGrpTmp = EgtGroup( nAreaId)
|
|
|
|
-- creo la curva composita dell'outline
|
|
local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_AREAOUTLINE)
|
|
local vOutlineCrvs = EgtGetAllInGroup( nOutlineLayerId)
|
|
local nCompo = EgtCurveCompo( nGrpTmp, vOutlineCrvs, false)
|
|
for i = 1, #vOutlineCrvs do
|
|
EgtCurveCompoSetTempProp( nCompo, i - 1, vOutlineCrvs[i])
|
|
end
|
|
|
|
-- creo le curve associate ad ogni regione degli split
|
|
local vBorders = {}
|
|
local nCompoRef = nCompo
|
|
for i = 1, #vSplitCrvs do
|
|
|
|
-- aggiusto lo split per averlo a filo con l'outline
|
|
AdjustSplitCurve( vSplitCrvs[i], nCompo, vOutlineCrvs, nOutlineLayerId)
|
|
|
|
-- calcolo i bordi delle due regioni definite dallo split
|
|
local nCrv1, nCrv2 = GetBorderRegions( vSplitCrvs[i], nCompoRef, nGrpTmp)
|
|
table.insert( vBorders, nCrv1)
|
|
-- il secondo bordo è quello da suddividere con lo split successivo ( se esiste)
|
|
nCompoRef = nCrv2
|
|
if i == #vSplitCrvs then
|
|
table.insert( vBorders, nCrv2)
|
|
end
|
|
end
|
|
|
|
-- creo le sottoaree a partire dai contorni
|
|
local vAreas = {}
|
|
for i = 1, #vBorders do
|
|
-- creo area
|
|
local nSplitAreaId = EgtGroup( nAreaId)
|
|
EgtSetName( nSplitAreaId , WIN_AREA .. tostring( i))
|
|
EgtSetInfo( nSplitAreaId, WIN_AREATYPE, WIN_AREATYPES.NULL)
|
|
vAreas[i] = nSplitAreaId
|
|
|
|
-- creo outline con la curva di bordo
|
|
local nOutlineLayerId = EgtGroup( nSplitAreaId)
|
|
EgtSetName( nOutlineLayerId, WIN_AREAOUTLINE)
|
|
EgtRelocateGlob( vBorders[i], nOutlineLayerId)
|
|
local vOrigCrvs = EgtCurveCompoGetTempProp( vBorders[i])
|
|
local nFirst, nCnt = EgtExplodeCurveCompo( vBorders[i])
|
|
|
|
-- assegno nome e info a tutte le curve di bordo a partire dalla curva da cui derviano ( salvata nella temp prop della curva)
|
|
for j = 0, nCnt - 1 do
|
|
-- assegno le info di child e source
|
|
EgtSetInfo( nFirst + j, WIN_SOU, vOrigCrvs[j+1])
|
|
AddInfo( vOrigCrvs[j+1], WIN_CHILD, nFirst + j)
|
|
-- assengo il nome : se deriva da outline lo copio, se deriva da split lo scelgo in base all'orientamento
|
|
if EgtGetName( vOrigCrvs[j+1]) == WIN_SPLIT then
|
|
SetSplitName( nFirst + j)
|
|
else
|
|
EgtSetName( nFirst + j, EgtGetName( vOrigCrvs[j+1]))
|
|
end
|
|
end
|
|
|
|
-- riordino le curve dell'outline per avere bottom come primo
|
|
local nCrvId = EgtGetFirstInGroup( nOutlineLayerId)
|
|
while EgtGetName( nCrvId) ~= WIN_BOTTOM do
|
|
EgtRelocate( nCrvId, nOutlineLayerId)
|
|
nCrvId = EgtGetFirstInGroup( nOutlineLayerId)
|
|
end
|
|
end
|
|
|
|
EgtErase( nGrpTmp)
|
|
return vAreas
|
|
end
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- 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
|
|
|
|
-- 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
|
|
local dCurrPosition = dPosition
|
|
-- creo la linea se rientra nella regione limite
|
|
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() * dCurrPosition, Y_AX(), b3OutlineLayer:getDimY())
|
|
end
|
|
|
|
elseif nSplitType == WIN_SPLITORIENTATION.HORIZONTAL then
|
|
-- aree ordinate dall'alto al basso
|
|
local dCurrPosition = b3OutlineLayer:getDimY() - dPosition
|
|
-- creo la linea se rientra nella regione limite
|
|
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() * dCurrPosition, X_AX(), b3OutlineLayer:getDimX())
|
|
end
|
|
end
|
|
|
|
if nSplitCrv then
|
|
EgtSetName( nSplitCrv, WIN_SPLIT)
|
|
table.insert( vSplitCurves, nSplitCrv)
|
|
EgtSetInfo( nSplitCrv, WIN_SPLIT_POSITION, dPosition)
|
|
end
|
|
end
|
|
|
|
return vSplitCurves
|
|
end
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- funzione che crea tagli split multipli
|
|
function WinCreate.AddSplits( nParentAreaId, nSplitType, vMeasureTypes, vValues, vPartsDim, bFrench, nAreaNbr)
|
|
|
|
-- se area ha già sottoarea errore
|
|
if EgtGetFirstNameInGroup( nParentAreaId, WIN_AREA .. '*') then
|
|
return
|
|
end
|
|
|
|
local nParentOutlineLayerId = EgtGetFirstNameInGroup( nParentAreaId, WIN_AREAOUTLINE)
|
|
local b3OutlineLayer = EgtGetBBox( nParentOutlineLayerId, GDB_BB.STANDARD)
|
|
|
|
-- creo area di split
|
|
local nAreaId = EgtGroup( nParentAreaId)
|
|
EgtSetName( nAreaId, WIN_AREA .. '(' .. WIN_SPLIT .. ')')
|
|
-- setto le info
|
|
EgtSetInfo( nAreaId, WIN_AREATYPE, WIN_AREATYPES.SPLIT)
|
|
EgtSetInfo( nAreaId, WIN_AREA_NBR, nAreaNbr)
|
|
EgtSetInfo( nAreaId, WIN_SPLIT_DIR, nSplitType)
|
|
EgtSetInfo( nAreaId, WIN_MEASURE_TYPE, vMeasureTypes)
|
|
EgtSetInfo( nAreaId, WIN_MEASURE_VALUE, vValues)
|
|
EgtSetInfo( nAreaId, WIN_SPLIT_REF_DIM, EgtIf( nSplitType == WIN_SPLITORIENTATION.VERTICAL, b3OutlineLayer:getDimX(), b3OutlineLayer:getDimY()))
|
|
EgtSetInfo( nAreaId, WIN_PART_DIM, vPartsDim)
|
|
|
|
-- copio il contorno dall'area parent
|
|
CopyParentOutline( nAreaId, nParentAreaId)
|
|
|
|
-- creo layer per split
|
|
local nSplitLayerId = EgtGroup( nAreaId)
|
|
EgtSetName( nSplitLayerId, WIN_BASESPLIT)
|
|
-- verifico se va impostato il tipo french
|
|
if bFrench then
|
|
EgtSetInfo( nSplitLayerId, WIN_SPLITTYPE, WIN_SPLITTYPES.FRENCH)
|
|
end
|
|
-- creo le curve di split
|
|
local vSplitCurves = CalcSplitCurves( nSplitLayerId, b3OutlineLayer, b3OutlineLayer, nSplitType, vMeasureTypes, vValues)
|
|
if #vSplitCurves == 0 then
|
|
-- se non ci sono curve valide cancello tutto ed esco
|
|
EgtErase( nAreaId)
|
|
return
|
|
end
|
|
|
|
-- creo le aree generate dagli split
|
|
local vAreas = CreateAreasFromSplits( nAreaId, vSplitCurves)
|
|
return vAreas
|
|
end
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- funzione che crea tagli split grid
|
|
function WinCreate.AddGridSplits( nParentAreaId, vVertMeasureTypes, vVertValues, vHorizMeasureTypes, vHorizValues, bStartVertical, vPartsDim, nAreaNbr)
|
|
|
|
local AreaResult = {}
|
|
|
|
-- se area ha già sottoarea errore
|
|
if EgtGetFirstNameInGroup( nParentAreaId, WIN_AREA .. '*') then
|
|
return
|
|
end
|
|
|
|
-- creo area di split
|
|
local nAreaId = EgtGroup( nParentAreaId)
|
|
EgtSetName( nAreaId, WIN_AREA .. '(' .. WIN_SPLIT .. ')')
|
|
-- setto info
|
|
EgtSetInfo( nAreaId, WIN_AREATYPE, WIN_AREATYPES.SPLIT)
|
|
EgtSetInfo( nAreaId, WIN_AREA_NBR, nAreaNbr)
|
|
EgtSetInfo( nAreaId, WIN_GRID_SPLIT, true)
|
|
EgtSetInfo( nAreaId, WIN_PART_DIM, vPartsDim)
|
|
|
|
-- 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)
|
|
|
|
-- stabilisco direzione principale e secondaria
|
|
local vMainTypes, vOtherTypes, vMainValues, vOtherValues, nMainSplitOrientation, nOtherSplitOrientation
|
|
if bStartVertical then
|
|
vMainTypes = vVertMeasureTypes
|
|
vMainValues = vVertValues
|
|
nMainSplitOrientation = WIN_SPLITORIENTATION.VERTICAL
|
|
vOtherTypes = vHorizMeasureTypes
|
|
vOtherValues = vHorizValues
|
|
nOtherSplitOrientation = WIN_SPLITORIENTATION.HORIZONTAL
|
|
else
|
|
vMainTypes = vHorizMeasureTypes
|
|
vMainValues = vHorizValues
|
|
nMainSplitOrientation = WIN_SPLITORIENTATION.HORIZONTAL
|
|
vOtherTypes = vVertMeasureTypes
|
|
vOtherValues = vVertValues
|
|
nOtherSplitOrientation = WIN_SPLITORIENTATION.VERTICAL
|
|
end
|
|
|
|
-- salvo i dati dello split principale nell'area principale, i dati dello split secondario verranno salvati nelle aree virtuali
|
|
EgtSetInfo( nAreaId, WIN_SPLIT_DIR, nMainSplitOrientation)
|
|
EgtSetInfo( nAreaId, WIN_MEASURE_TYPE, vMainTypes)
|
|
EgtSetInfo( nAreaId, WIN_MEASURE_VALUE, vMainValues)
|
|
EgtSetInfo( nAreaId, WIN_SPLIT_REF_DIM, EgtIf( nMainSplitOrientation == WIN_SPLITORIENTATION.VERTICAL, b3OutlineLayer:getDimX(), b3OutlineLayer:getDimY()))
|
|
|
|
-- calcolo la suddivisione nella direzione principale
|
|
local vMainSplit = CalcSplitCurves( nSplitLayerId, b3OutlineLayer, b3OutlineLayer, nMainSplitOrientation, vMainTypes, vMainValues)
|
|
for i = 1, #vMainSplit do
|
|
EgtSetInfo( vMainSplit[i], WIN_GRIDSPLIT_ORDER, 0)
|
|
end
|
|
local vMainAreas = CreateAreasFromSplits( nAreaId, vMainSplit)
|
|
|
|
-- per ogni area della direzione principale calcolo la suddivisione nella direzione secondaria
|
|
for i = 1, #vMainAreas do
|
|
-- recupero outline per calcolare il limite delle curve di split
|
|
local nAreaOutlineLayerId = EgtGetFirstNameInGroup( vMainAreas[i], WIN_AREAOUTLINE)
|
|
local b3Limit = EgtGetBBox( nAreaOutlineLayerId, GDB_BB.STANDARD)
|
|
|
|
-- calcolo gli split nella direzione secondaria
|
|
local vOtherSplit = CalcSplitCurves( nSplitLayerId, b3OutlineLayer, b3Limit, nOtherSplitOrientation, vOtherTypes, vOtherValues)
|
|
if #vOtherSplit > 0 then
|
|
for j = 1, #vOtherSplit do
|
|
EgtSetInfo( vOtherSplit[j], WIN_GRIDSPLIT_ORDER, tostring( i))
|
|
end
|
|
-- calcolo le aree generate dagli split secondari
|
|
local vNewAreas = CreateAreasFromSplits( vMainAreas[i], vOtherSplit)
|
|
AreaResult = EgtJoinTables( AreaResult, vNewAreas)
|
|
end
|
|
end
|
|
|
|
-- sposto le aree secondarie nell'area di split e le rinomino
|
|
for i = 1, #AreaResult do
|
|
EgtRelocateGlob( AreaResult[i], nAreaId)
|
|
EgtSetName( AreaResult[i], WIN_AREA .. EgtNumToString( i))
|
|
end
|
|
-- le aree generate dallo split principale diventano aree virtuali ausiliarie per i conti
|
|
-- riporto come info quelle legate allo split secondario
|
|
for i = 1, #vMainAreas do
|
|
EgtSetName( vMainAreas[i], WIN_VIRTUAL_AREA)
|
|
EgtSetInfo( vMainAreas[i], WIN_SPLIT_DIR, nOtherSplitOrientation)
|
|
EgtSetInfo( vMainAreas[i], WIN_MEASURE_TYPE, vOtherTypes)
|
|
EgtSetInfo( vMainAreas[i], WIN_MEASURE_VALUE, vOtherValues)
|
|
EgtSetInfo( vMainAreas[i], WIN_SPLIT_REF_DIM, EgtIf( nOtherSplitOrientation == WIN_SPLITORIENTATION.VERTICAL, b3OutlineLayer:getDimX(), b3OutlineLayer:getDimY()))
|
|
end
|
|
|
|
return AreaResult
|
|
end
|
|
|
|
|
|
|
|
----------------------------------------------------------------------------------
|
|
---------------------------------- BOTTOMRAIL ------------------------------------
|
|
----------------------------------------------------------------------------------
|
|
-- funzione che aggiunge uno zoccolo
|
|
function WinCreate.AddBottomRail( nAreaId, nNbr, vDim)
|
|
local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i')
|
|
if nAreaType == WIN_AREATYPES.FRAME or nAreaType == WIN_AREATYPES.SASH then
|
|
EgtSetInfo( nAreaId, WIN_BOTTOMRAIL, nNbr)
|
|
EgtSetInfo( nAreaId, WIN_BOTTOMRAIL .. WIN_PART_DIM, vDim)
|
|
end
|
|
end
|
|
|
|
----------------------------------------------------------------------------------
|
|
---------------------------------- SOGLIA ------------------------------------
|
|
----------------------------------------------------------------------------------
|
|
-- funzione che aggiunge la soglia
|
|
function WinCreate.AddThreshold( nAreaId, sThresholdProfile)
|
|
local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i')
|
|
if nAreaType == WIN_AREATYPES.FRAME then
|
|
EgtSetInfo( nAreaId, WIN_THRESHOLD_PROFILE, sThresholdProfile)
|
|
end
|
|
end
|
|
|
|
----------------------------------------------------------------------------------
|
|
---------------------------------- FERRAMENTA ------------------------------------
|
|
----------------------------------------------------------------------------------
|
|
function WinCreate.AddHardware( nFrameId, sFavourite, sHandle)
|
|
EgtSetInfo( nFrameId, WIN_HDW_FAVOURITE, sFavourite)
|
|
EgtSetInfo( nFrameId, WIN_HDW_HANDLE, sHandle)
|
|
end
|
|
|
|
---------------------------------------------------------------------
|
|
return WinCreate
|