From c831af68998046ec426a4fe636eb5fedd3390c75 Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 27 May 2024 14:37:25 +0200 Subject: [PATCH] EgwWindowLua : - integrato il calcolo degli split dowels nel calcolo del solido - modifica alla struttura della ricorsione nel calcolo dei pezzi dal telaio. --- Profiles/Main.lua | 1 - Profiles/WinLib/WinCalculate.lua | 475 +++++++++++++++---------------- Profiles/WinOpenProjectFile.lua | 1 - 3 files changed, 234 insertions(+), 243 deletions(-) diff --git a/Profiles/Main.lua b/Profiles/Main.lua index 49af335..248371b 100644 --- a/Profiles/Main.lua +++ b/Profiles/Main.lua @@ -656,7 +656,6 @@ WinCalculate.SetCalcSolid( true) -- -- creo i pezzi WinCalculate.CreatePartFromArea( nFrameId) -WinCalculate.AddSplitDowelToParts( nFrameId) WinCalculate.AddHardware( nFrameId) -- -- creo tabella per salvataggio diff --git a/Profiles/WinLib/WinCalculate.lua b/Profiles/WinLib/WinCalculate.lua index a3470bf..94e4c8f 100644 --- a/Profiles/WinLib/WinCalculate.lua +++ b/Profiles/WinLib/WinCalculate.lua @@ -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) diff --git a/Profiles/WinOpenProjectFile.lua b/Profiles/WinOpenProjectFile.lua index 9519825..6fdf051 100644 --- a/Profiles/WinOpenProjectFile.lua +++ b/Profiles/WinOpenProjectFile.lua @@ -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