EgwWindowLua :

- integrato il calcolo degli split dowels nel calcolo del solido
- modifica alla struttura della ricorsione nel calcolo dei pezzi dal telaio.
This commit is contained in:
SaraP
2024-05-27 14:37:25 +02:00
parent 6c684e3068
commit c831af6899
3 changed files with 234 additions and 243 deletions
-1
View File
@@ -656,7 +656,6 @@ WinCalculate.SetCalcSolid( true)
-- -- creo i pezzi
WinCalculate.CreatePartFromArea( nFrameId)
WinCalculate.AddSplitDowelToParts( nFrameId)
WinCalculate.AddHardware( nFrameId)
-- -- creo tabella per salvataggio
+234 -241
View File
@@ -333,6 +333,19 @@ local function CalcProfileType( nAreaId)
end
end
---------------------------------------------------------------------
-- funzione che cicla ricorsivamente su aree e sottoaree per impostare i tipi di profilo
local function CalculateAreaProfileType( nAreaId)
-- calcolo i profili per l'area corrente
CalcProfileType( nAreaId)
-- calcolo i profili per le eventuali sottoaree
local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREA .. '*')
while nChildAreaId do
CalculateAreaProfileType( nChildAreaId)
nChildAreaId = EgtGetNextName( nChildAreaId, WIN_AREA .. '*')
end
end
---------------------------------------------------------------------
--------------------- CALCOLO OUTLINE -------------------------------
@@ -601,6 +614,20 @@ local function CalculateOutlineFromAreaOutline( nAreaId)
EgtErase( nCompoId)
end
---------------------------------------------------------------------
-- funzione che cicla ricorsivamente su aree e sottaree per calcolare gli outlines
local function CalculateAreaOutline( nAreaId)
-- calcolo outlines per l'area corrente
CalculateOutlineFromAreaOutline( nAreaId)
-- calcolo outlines per le eventuali sottoaree
local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREA .. '*')
while nChildAreaId do
CalculateAreaOutline( nChildAreaId)
nChildAreaId = EgtGetNextName( nChildAreaId, WIN_AREA .. '*')
end
end
---------------------------------------------------------------------
---------------------- CALCOLO PEZZI ------------------------------
@@ -958,7 +985,7 @@ local function CalcStartEndProfileType( nProfileType, nOutlineId, nStartProfileI
end
---------------------------------------------------------------------
local function AddDowelStart( nOutlineId, nPrevOutlineId, StartJointType, nMainProfileId, nStartProfileId, nDowelLayerId, nGeoInId, nSolidLayerId,
local function AddStartDowels( nOutlineId, nPrevOutlineId, StartJointType, nMainProfileId, nStartProfileId, nDowelLayerId, nGeoInId, nSolidLayerId,
nMainExtrusionId, nStartExtrusionId, nExtrCopyId)
local sOutlineName = EgtGetName( nOutlineId)
@@ -1085,8 +1112,8 @@ local function AddDowelStart( nOutlineId, nPrevOutlineId, StartJointType, nMainP
end
---------------------------------------------------------------------
local function AddDowelEnd( nOutlineId, nEndOutlineId, EndJointType, nMainProfileId, nEndProfileId, nDowelLayerId, nGeoInId, nSolidLayerId,
nMainExtrusionId, nEndExtrusionId, nExtrCopyId)
local function AddEndDowels( nOutlineId, nEndOutlineId, EndJointType, nMainProfileId, nEndProfileId, nDowelLayerId, nGeoInId, nSolidLayerId,
nMainExtrusionId, nEndExtrusionId, nExtrCopyId)
local sOutlineName = EgtGetName( nOutlineId)
local sEndOutlineName = EgtGetName( nEndOutlineId)
@@ -1329,7 +1356,7 @@ local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartP
EgtSurfTmCut( nStartExtrusionId, nExtrCopyId, true, false)
-- creo fori per spine su Start
AddDowelStart( nOutlineId, nPrevOutlineId, StartJointType, nMainProfileId, nStartProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, nMainExtrusionId, nStartExtrusionId, nExtrCopyId)
AddStartDowels( nOutlineId, nPrevOutlineId, StartJointType, nMainProfileId, nStartProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, nMainExtrusionId, nStartExtrusionId, nExtrCopyId)
-- c) END PROFILE
@@ -1403,12 +1430,165 @@ local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartP
EgtSurfTmCut( nEndExtrusionId, nExtrCopyId, true, false)
-- creo fori per spine su End
AddDowelEnd( nOutlineId, nEndOutlineId, EndJointType, nMainProfileId, nEndProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, nMainExtrusionId, nEndExtrusionId, nExtrCopyId)
AddEndDowels( nOutlineId, nEndOutlineId, EndJointType, nMainProfileId, nEndProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, nMainExtrusionId, nEndExtrusionId, nExtrCopyId)
-- elimino copia dell'estrusione principale
EgtErase( { nExtrCopyId})
end
----------------------------------------------------------------------------------
------------------------------- SPLIT DOWELS -------------------------------------
----------------------------------------------------------------------------------
-- funzione che calcola intersezione, geometrie e superfici dei dowel degli split
local function CalSplitDowel( nSplitLayerId, nOutlineId, nProfileType, nPartId)
-- verifico se interseca l'outline che sto analizzando
local nSplitId = EgtGetFirstInGroup( nSplitLayerId)
local ptInt = EgtIP( nOutlineId, nSplitId, EgtSP( nSplitId))
if not ptInt then
return
end
-- se interseca, recupero il profilo dello split
local nOrigSplitProfileId = GetOutlineProfileId( nSplitId, false)
-- creo copia del profilo
local nFrameProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE)
local nSplitProfileId = EgtCopy( nOrigSplitProfileId, nFrameProfileLayerId)
local sSplitProfileType = EgtGetName( nOrigSplitProfileId)
EgtSetInfo( nSplitProfileId, WIN_PRF_TYPE, sSplitProfileType)
EgtSetName( nSplitProfileId, WIN_PRF_SPLIT)
-- recupero intersezione con lato In o Out del geo
local nGeoLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO)
local nGeoCrvId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN)
local ptInters = EgtIP( nGeoCrvId, nSplitId, EgtSP( nSplitId))
if not ptInters and nProfileType == WIN_PRF.SPLIT then
nGeoCrvId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_OUT)
ptInters = EgtIP( nGeoCrvId, nSplitId, EgtSP( nSplitId))
end
-- recupero frame del profilo e lo applico a tutte le sue geometrie
local nSplitProfileFrameId = EgtGetFirstNameInGroup( nSplitProfileId, WIN_SECTIONFRAME)
local frInvertSplitProfile = EgtFR( nSplitProfileFrameId)
frInvertSplitProfile:invert()
EgtTransform( EgtGetAllInGroup( nSplitProfileId), frInvertSplitProfile)
-- assegno come riferimento del profilo il punto di intersezione e la direzione dello split
local vtDir = - EgtSV( nSplitId) -- se non fosse lineare potrebbe essere end vector ?
EgtChangeGroupFrame( nSplitProfileId, Frame3d( ptInters, vtDir))
-- calcolo la direzione del dowel sempre verso l'interno del pezzo
local vtDowelDir = Vector3d( vtDir)
local _, _, nSide = EgtPointCurveDistSide( ptInters + vtDowelDir, nGeoCrvId, Z_AX())
if nSide == 1 then
-- se a destra della curva significa che la direzione è uscente dal pezzo e va invertita
vtDowelDir = - vtDowelDir
end
-- recupero solido del pezzo
local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID)
local nMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_MAIN)
local nOrigMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_ORIGMAIN)
-- creo fori per spine su Split
local nDowelLayerId = EgtGetFirstNameInGroup( nPartId, WIN_DOWEL)
-- recupero profondita' d'inizio e fine
local sStart = WIN_DWL_TOPPERPSTART
local sEnd = WIN_DWL_TOPPERPEND
if nProfileType == WIN_PRF.BOTTOM then
sStart = WIN_DWL_BOTTOMPERPSTART
sEnd = WIN_DWL_BOTTOMPERPEND
elseif nProfileType == WIN_PRF.BOTTOMRAIL then
sStart = WIN_DWL_RAILBOTTOMPERPSTART
sEnd = WIN_DWL_RAILBOTTOMPERPEND
elseif nProfileType == WIN_PRF.SPLIT then
local sProfileType = EgtGetInfo( nOutlineId, WIN_PROFILETYPE)
if sProfileType == WIN_SASH_HORIZONTAL then
sStart = WIN_DWL_HORIZONTALSPLITPERPSTART
sEnd = WIN_DWL_HORIZONTALSPLITPERPEND
-- sta sempre leggendo l'informazione corretta? ( cfr dowel per start ed end nella crezione del solido)
elseif sProfileType == WIN_SASH_VERTICAL then
sStart = WIN_DWL_VERTICALSPLITPERPSTART
sEnd = WIN_DWL_VERTICALSPLITPERPEND
else -- sProfileType == WIN_FRAME_SPLIT
sStart = WIN_DWL_SPLITPERPSTART
sEnd = WIN_DWL_SPLITPERPEND
end
end
-- ciclo sui fori trovati
local nOrigDowelId = EgtGetFirstNameInGroup( nSplitProfileId, WIN_DOWEL .. '*')
while nOrigDowelId do
local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd')
if not dStart then
dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPSTART, 'd')
end
local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd')
if not dEnd then
dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPEND, 'd')
end
local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId)
EgtSetColor( nDowelId, Color3d( 128, 128, 128))
-- posiziono il dowel e gli assegno estrusione e spessore
EgtMove( nDowelId, vtDowelDir * dStart)
EgtModifyCurveExtrusion( nDowelId, vtDowelDir)
EgtModifyCurveThickness( nDowelId, dEnd - dStart)
-- creo solido di estrusione
local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtDowelDir * ( dEnd - dStart + 1))
EgtMove( nDowelExtrusionId, - vtDowelDir)
EgtInvertSurf( nDowelExtrusionId)
-- taglio estrusi per ottenere solido
EgtSurfTmCut( nMainExtrusionId, nDowelExtrusionId, true, false)
EgtSurfTmCut( nDowelExtrusionId, nOrigMainExtrusionId, true, false)
nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*')
end
end
----------------------------------------------------------------------------------
-- funzione che cicla ricorsivamente sulle aree e sottoaree relative al pezzo per aggiungere gli split dowels
local function AddAreaSplitDowels( nOutlineId, nPartId, nProfileType, nAreaLayerId)
-- verifico la presenza di eventuali split nell'area corrente
local nSplitLayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_SPLIT)
if nSplitLayerId then
local nSplitType = EgtGetInfo( nSplitLayerId, WIN_SPLITTYPE, 'i') or WIN_SPLITTYPES.NULL
if nSplitType ~= WIN_SPLITTYPES.FRENCH then
CalSplitDowel( nSplitLayerId, nOutlineId, nProfileType, nPartId)
end
end
-- verifico la presenza di split nelle sottoaree
local nChildAreaId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_AREA .. '*')
while nChildAreaId do
local nAreaType = EgtGetInfo( nChildAreaId, WIN_AREATYPE, 'i')
if nAreaType == WIN_AREATYPES.SPLIT then
AddAreaSplitDowels( nOutlineId, nPartId, nProfileType, nChildAreaId)
end
nChildAreaId = EgtGetNextName( nChildAreaId, WIN_AREA .. '*')
end
end
----------------------------------------------------------------------------------
-- funzione che aggiunge al solido i dowels degli split che lo intersecano
local function AddSplitDowels( nOutlineId, nOutlineLayerId, nPartId, nProfileType)
-- se profilo bottom con BottomRail esco ( gli split dowels saranno aggiuti sul BottomRail associato)
if nProfileType == WIN_PRF.BOTTOM then
local bBottomRail = EgtGetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, 'b') or false
if bBottomRail then
return
end
end
-- recupero area del pezzo
local nAreaLayerId = EgtGetParent( nOutlineLayerId)
-- aggiungo gli split dowels a partire dall'area corrente
AddAreaSplitDowels( nOutlineId, nPartId, nProfileType, nAreaLayerId)
end
---------------------------------------------------------------------
-- funzione che crea il solido del pezzo del telaio
local function CalcFrameSolid( nPartId, nOutlineId, nGeoId, nOutlineLayerId, bBottomRail)
@@ -1449,6 +1629,10 @@ local function CalcFrameSolid( nPartId, nOutlineId, nGeoId, nOutlineLayerId, bBo
-- creo solido dai profili
MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartProfileId, nEndProfileId, nProfileType, nSolidLayerId, nDowelLayerId)
-- aggiungo dowels degli split
AddSplitDowels( nOutlineId, nOutlineLayerId, nPartId, nProfileType)
end
---------------------------------------------------------------------
@@ -1583,12 +1767,36 @@ local function CreateStripGuideLines( nOutlineId, nStripId, nProfileId, nSolidLa
end
---------------------------------------------------------------------
-- funzione che recupera il pezzo associato ad un outline
local function FindAssociatedPart( nOutlineId)
local nPartId = EgtGetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, 'i') or EgtGetInfo( nOutlineId, WIN_REF_PART, 'i')
if not nPartId then
-- cerco la prima curva da cui deriva che ha un pezzo associato
local nBaseOutline = EgtGetInfo( nOutlineId, WIN_COPY, 'i')
while not nPartId do
-- recupero il base outline da cui deriva
nBaseOutline = EgtGetInfo( nBaseOutline, WIN_SOU, 'i')
-- verifico se ha un profilo associato ( e quindi un pezzo)
local sProfileType = EgtGetInfo( nBaseOutline, WIN_PROFILETYPE)
if sProfileType then
-- recupero l'outline associato
local nCrvId = EgtGetInfo( nBaseOutline, WIN_COPY, 'i')
nPartId = EgtGetInfo( nCrvId, WIN_REF_BOTTOMRAIL_PART, 'i') or EgtGetInfo( nCrvId, WIN_REF_PART, 'i')
end
end
end
return nPartId
end
---------------------------------------------------------------------
-- funzione che crea gli Strip
local function CreateStripFromOutline( nAreaId, nOutlineId)
-- recupero il pezzo associato ( prendendo quello di bottomrail se esiste)
local nPartId = EgtGetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, 'i') or EgtGetInfo( nOutlineId, WIN_REF_PART, 'i')
local nPartId = FindAssociatedPart( nOutlineId)
-- recupero layer per solido e per profili di estrusione
local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID)
local nMainProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE)
@@ -1597,8 +1805,8 @@ local function CreateStripFromOutline( nAreaId, nOutlineId)
local nOutlineLayerId = EgtGetParent( nOutlineId)
local nPrevOutlineId, nNextOutlineId = GetPrevNextOutline( WIN_PRF.NULL, nOutlineId, nOutlineLayerId)
-- recupero i pezzi precedente e successivo, prendendo eventualmente quelli di bottomrail
local nPrevPartId = EgtGetInfo( nPrevOutlineId, WIN_REF_BOTTOMRAIL_PART, 'i') or EgtGetInfo( nPrevOutlineId, WIN_REF_PART)
local nNextPartId = EgtGetInfo( nNextOutlineId, WIN_REF_BOTTOMRAIL_PART, 'i') or EgtGetInfo( nNextOutlineId, WIN_REF_PART)
local nPrevPartId = FindAssociatedPart( nPrevOutlineId)
local nNextPartId = FindAssociatedPart( nNextOutlineId)
-- recupero profilo e controprofili
local nMainProfileId = EgtGetFirstNameInGroup( nMainProfileLayerId, WIN_PRF_MAIN)
@@ -1671,238 +1879,10 @@ local function CreateStripFromOutline( nAreaId, nOutlineId)
EgtErase( nStripExtrCopyId)
end
----------------------------------------------------------------------------------
------------------------------- SPLIT DOWELS -------------------------------------
----------------------------------------------------------------------------------
-- funzione che calcola intersezione, geometrie e superfici dei dowel degli split
local function CalSplitDowel( nSplitLayerId, nOutlineId, nProfileType, nPartId)
-- verifico se interseca l'outline che sto analizzando
local nSplitId = EgtGetFirstInGroup( nSplitLayerId)
local ptInt = EgtIP( nOutlineId, nSplitId, EgtSP( nSplitId))
if not ptInt then
return
end
-- se interseca, recupero il profilo dello split
local nOrigSplitProfileId = GetOutlineProfileId( nSplitId, false)
-- creo copia del profilo
local nFrameProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE)
local nSplitProfileId = EgtCopy( nOrigSplitProfileId, nFrameProfileLayerId)
local sSplitProfileType = EgtGetName( nOrigSplitProfileId)
EgtSetInfo( nSplitProfileId, WIN_PRF_TYPE, sSplitProfileType)
EgtSetName( nSplitProfileId, WIN_PRF_SPLIT)
-- recupero intersezione con lato In o Out del geo
local nGeoLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO)
local nGeoCrvId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN)
local ptInters = EgtIP( nGeoCrvId, nSplitId, EgtSP( nSplitId))
if not ptInters and nProfileType == WIN_PRF.SPLIT then
nGeoCrvId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_OUT)
ptInters = EgtIP( nGeoCrvId, nSplitId, EgtSP( nSplitId))
end
-- recupero frame del profilo e lo applico a tutte le sue geometrie
local nSplitProfileFrameId = EgtGetFirstNameInGroup( nSplitProfileId, WIN_SECTIONFRAME)
local frInvertSplitProfile = EgtFR( nSplitProfileFrameId)
frInvertSplitProfile:invert()
EgtTransform( EgtGetAllInGroup( nSplitProfileId), frInvertSplitProfile)
-- assegno come riferimento del profilo il punto di intersezione e la direzione dello split
local vtDir = - EgtSV( nSplitId) -- se non fosse lineare potrebbe essere end vector ?
EgtChangeGroupFrame( nSplitProfileId, Frame3d( ptInters, vtDir))
-- calcolo la direzione del dowel sempre verso l'interno del pezzo
local vtDowelDir = Vector3d( vtDir)
local _, _, nSide = EgtPointCurveDistSide( ptInters + vtDowelDir, nGeoCrvId, Z_AX())
if nSide == 1 then
-- se a destra della curva significa che la direzione è uscente dal pezzo e va invertita
vtDowelDir = - vtDowelDir
end
-- recupero solido del pezzo
local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID)
local nMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_MAIN)
local nOrigMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_ORIGMAIN)
-- creo fori per spine su Split
local nDowelLayerId = EgtGetFirstNameInGroup( nPartId, WIN_DOWEL)
-- recupero profondita' d'inizio e fine
local sStart = WIN_DWL_TOPPERPSTART
local sEnd = WIN_DWL_TOPPERPEND
if nProfileType == WIN_PRF.BOTTOM then
sStart = WIN_DWL_BOTTOMPERPSTART
sEnd = WIN_DWL_BOTTOMPERPEND
elseif nProfileType == WIN_PRF.BOTTOMRAIL then
sStart = WIN_DWL_RAILBOTTOMPERPSTART
sEnd = WIN_DWL_RAILBOTTOMPERPEND
elseif nProfileType == WIN_PRF.SPLIT then
local sProfileType = EgtGetInfo( nOutlineId, WIN_PROFILETYPE)
if sProfileType == WIN_SASH_HORIZONTAL then
sStart = WIN_DWL_HORIZONTALSPLITPERPSTART
sEnd = WIN_DWL_HORIZONTALSPLITPERPEND
-- sta sempre leggendo l'informazione corretta? ( cfr dowel per start ed end nella crezione del solido)
elseif sProfileType == WIN_SASH_VERTICAL then
sStart = WIN_DWL_VERTICALSPLITPERPSTART
sEnd = WIN_DWL_VERTICALSPLITPERPEND
else -- sProfileType == WIN_FRAME_SPLIT
sStart = WIN_DWL_SPLITPERPSTART
sEnd = WIN_DWL_SPLITPERPEND
end
end
-- ciclo sui fori trovati
local nOrigDowelId = EgtGetFirstNameInGroup( nSplitProfileId, WIN_DOWEL .. '*')
while nOrigDowelId do
local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd')
if not dStart then
dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPSTART, 'd')
end
local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd')
if not dEnd then
dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPEND, 'd')
end
local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId)
EgtSetColor( nDowelId, Color3d( 128, 128, 128))
-- posiziono il dowel e gli assegno estrusione e spessore
EgtMove( nDowelId, vtDowelDir * dStart)
EgtModifyCurveExtrusion( nDowelId, vtDowelDir)
EgtModifyCurveThickness( nDowelId, dEnd - dStart)
-- creo solido di estrusione
local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtDowelDir * ( dEnd - dStart + 1))
EgtMove( nDowelExtrusionId, - vtDowelDir)
EgtInvertSurf( nDowelExtrusionId)
-- taglio estrusi per ottenere solido
EgtSurfTmCut( nMainExtrusionId, nDowelExtrusionId, true, false)
EgtSurfTmCut( nDowelExtrusionId, nOrigMainExtrusionId, true, false)
nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*')
end
end
----------------------------------------------------------------------------------
-- funzione ricorsiva che cerca gli split che possono dare origine a dei dowel
local function VerifyDowelArea( nAreaLayerId, nOutlineId, nProfileType, nPartId)
-- verifico la presenza di eventuali Split
local nSplitLayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_SPLIT)
if nSplitLayerId then
local nSplitType = EgtGetInfo( nSplitLayerId, WIN_SPLITTYPE, 'i') or WIN_SPLITTYPES.NULL
if nSplitType ~= WIN_SPLITTYPES.FRENCH then
CalSplitDowel( nSplitLayerId, nOutlineId, nProfileType, nPartId)
end
end
-- verifico la presenza di split in sotto aree
local nArea1LayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_AREA1)
if nArea1LayerId then
local nAreaType = EgtGetInfo( nArea1LayerId, WIN_AREATYPE, 'i')
if nAreaType == WIN_AREATYPES.SPLIT then
VerifyDowelArea( nArea1LayerId, nOutlineId, nProfileType, nPartId)
end
end
local nArea2LayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_AREA2)
if nArea2LayerId then
local nAreaType = EgtGetInfo( nArea2LayerId, WIN_AREATYPE, 'i')
if nAreaType == WIN_AREATYPES.SPLIT then
VerifyDowelArea( nArea2LayerId, nOutlineId, nProfileType, nPartId)
end
end
end
----------------------------------------------------------------------------------
-- funzione che posiziona i fori delle spine degli split, li estrude e crea il solido
local function AddSplitDowelToExtrusion( nOutlineId, bIsBottomRail)
-- ricavo pezzo associato
local sPartRef = WIN_REF_PART
if bIsBottomRail then
sPartRef = WIN_REF_BOTTOMRAIL_PART
end
local nPartId = EgtGetInfo( nOutlineId, sPartRef, 'i')
-- ricavo tipo di profilo
local nProfileType = GetOutlineProfileType( nOutlineId, bIsBottomRail)
-- se profilo Bottom con BottomRail, esco ( gli split dowels saranno fatti sul BottomRail)
local nOutlineLayerId = EgtGetParent( nOutlineId)
if nProfileType == WIN_PRF.BOTTOM then
local bBottomRail = EgtGetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, 'b') or false
if bBottomRail then
return
end
end
-- recupero l'area di cui fa parte il pezzo
local nAreaLayerId = EgtGetParent( nOutlineLayerId)
-- verifico la presenza di eventuali Split
VerifyDowelArea( nAreaLayerId, nOutlineId, nProfileType, nPartId)
end
----------------------------------------------------------------------------------
function WinCalculate.AddSplitDowelToParts( nAreaId)
-- se non ho calcolato i solidi, esco
if not bCalcSolid then
return
end
-- recupero tipo di area
local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i')
if nAreaType == WIN_AREATYPES.FRAME or nAreaType == WIN_AREATYPES.SASH then
-- recupero pezzi outline
local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_OUTLINE)
local nOutlineId = EgtGetFirstInGroup( nOutlineLayerId)
while nOutlineId do
AddSplitDowelToExtrusion( nOutlineId, false)
-- se di tipo bottom
local sName = EgtGetName( nOutlineId)
if sName == WIN_BOTTOM then
-- se ha BottomRail
local bBottomRail = EgtGetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, 'b') or false
if bBottomRail then
AddSplitDowelToExtrusion( nOutlineId, true)
end
end
nOutlineId = EgtGetNext( nOutlineId)
end
end
-- verifico se c'e' uno split
local nSplitLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_SPLIT)
if nSplitLayerId then
local nSplitType = EgtGetInfo( nSplitLayerId, WIN_SPLITTYPE, 'i') or WIN_SPLITTYPES.NULL
-- se split ha pezzo associato
if nSplitType ~= WIN_SPLITTYPES.FRENCH then
local nSplitId = EgtGetFirstInGroup( nSplitLayerId)
if nSplitId then
AddSplitDowelToExtrusion( nSplitId, false)
end
end
end
-- verifico se ci sono aree
local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREA .. '*')
while nChildAreaId do
-- lancio costruzione pezzi di quell'area
WinCalculate.AddSplitDowelToParts( nChildAreaId)
nChildAreaId = EgtGetNextName( nChildAreaId, WIN_AREA .. '*')
end
end
---------------------------------------------------------------------
------------------------- FUNZIONI ----------------------------------
---------------------------------------------------------------------
-- funzione che cicla ricorsivamente sulla struttura per creare tutti i pezzi della finestra
function WinCalculate.CreatePartFromArea( nAreaId)
-- funzione che cicla ricorsivamente su aree e sottaree per calcolare i pezzi
local function CalculateAreaParts( nAreaId)
-- assengo il tipo di profilo alle curve del base outline
CalcProfileType( nAreaId)
-- calcolo outline a partire dal base outline
CalculateOutlineFromAreaOutline( nAreaId)
-- creo pezzo
local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i')
if nAreaType == WIN_AREATYPES.FRAME or nAreaType == WIN_AREATYPES.SASH then
-- creo pezzi per ogni outline
@@ -1955,15 +1935,28 @@ function WinCalculate.CreatePartFromArea( nAreaId)
end
end
-- verifico se ci sono sotto-aree da realizzare
-- calcolo i pezzi delle sottoaree
local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREA .. '*')
while nChildAreaId do
-- lancio costruzione pezzi di quell'area
WinCalculate.CreatePartFromArea( nChildAreaId)
CalculateAreaParts( nChildAreaId)
nChildAreaId = EgtGetNextName( nChildAreaId, WIN_AREA .. '*')
end
end
---------------------------------------------------------------------
------------------------- FUNZIONI ----------------------------------
---------------------------------------------------------------------
-- funzione che crea tutti i pezzi della finestra partendo dal telaio
function WinCalculate.CreatePartFromArea( nFrameId)
-- assengo il tipo di profilo alle curve del base outline
CalculateAreaProfileType( nFrameId)
-- calcolo outline a partire dal base outline
CalculateAreaOutline( nFrameId)
-- creo pezzi
CalculateAreaParts( nFrameId)
end
---------------------------------------------------------------------
-- funzione che posiziona un pezzo
function WinCalculate.PositionPart(nPartId)
-1
View File
@@ -69,7 +69,6 @@ WinCalculate.SetCalcSolid( true)
-- creo i pezzi
local nFrameId = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_AREAASTERISK)
WinCalculate.CreatePartFromArea( nFrameId)
WinCalculate.AddSplitDowelToParts( nFrameId)
-- elimino profilo se in batch per test
if WINDOW and WINDOW.TEST and WINDOW.TEST == 1 then