From 2095d0accf153cdfa713d2e973c4e8e840f38974 Mon Sep 17 00:00:00 2001 From: Emmanuele Sassi Date: Fri, 26 Jul 2024 10:19:19 +0200 Subject: [PATCH 1/7] - aggiunta funzione per lettura opzioni hardware --- Profiles/WinLib/WinCalculate.lua | 8 ++++++-- Profiles/WinProject.lua | 5 +++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Profiles/WinLib/WinCalculate.lua b/Profiles/WinLib/WinCalculate.lua index 6d900fc..a3f3066 100644 --- a/Profiles/WinLib/WinCalculate.lua +++ b/Profiles/WinLib/WinCalculate.lua @@ -2403,7 +2403,7 @@ local function SearchSash( nAreaId, SashList) end -- funzione che aggiunge l'hardware -function WinCalculate.AddHardwareForSash( nFrameId) +function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest) -- cerco ed indicizzo ante del serramento local SashList = {} SearchSash( nFrameId, SashList) @@ -2496,9 +2496,13 @@ function WinCalculate.AddHardwareForSash( nFrameId) -- Scrittura nuova linea fhInput:write( sText .. '\n') - -- Chiudo file CNC + -- Chiudo file fhInput:close() + if bOnlyRequest then + return sInputFile + end + -- attendo scrittura output local nWait = 0 while not EgtExistsFile( sOutputFile) and nWait < 20 do diff --git a/Profiles/WinProject.lua b/Profiles/WinProject.lua index 2c40235..9ff2005 100644 --- a/Profiles/WinProject.lua +++ b/Profiles/WinProject.lua @@ -106,4 +106,9 @@ local function WinCalculate_AddHardware() end _G.WinCalculate_AddHardware = WinCalculate_AddHardware +local function WinCreate_GetHardwareOptionPath() + WDG.HWDOPTPATH = WinCalculate.AddHardwareForSash(WDG.AREAID, true) +end +_G.WinCreate_GetHardwareOptionPath = WinCreate_GetHardwareOptionPath + --------------------------------------------------------------------- From e4f54c9f190fc5abece7fb13e50cf9b162ef3885 Mon Sep 17 00:00:00 2001 From: SaraP Date: Wed, 7 Aug 2024 11:07:37 +0200 Subject: [PATCH 2/7] - migliorati dowels per archi e lati inclinati. --- Profiles/Profilo78 - Offset - Copy (48).nge | Bin 0 -> 254906 bytes Profiles/Profilo78 - Offset.nge | Bin 254906 -> 258478 bytes Profiles/WinConst.lua | 36 +- Profiles/WinLib/WinCalculate.lua | 1073 ++++++++++--------- 4 files changed, 566 insertions(+), 543 deletions(-) create mode 100644 Profiles/Profilo78 - Offset - Copy (48).nge diff --git a/Profiles/Profilo78 - Offset - Copy (48).nge b/Profiles/Profilo78 - Offset - Copy (48).nge new file mode 100644 index 0000000000000000000000000000000000000000..1b10c42eb793aea5a5407671511748bfd077f672 GIT binary patch literal 254906 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 literal 0 HcmV?d00001 diff --git a/Profiles/Profilo78 - Offset.nge b/Profiles/Profilo78 - Offset.nge index 1b10c42eb793aea5a5407671511748bfd077f672..5574fd524bacacb7aaf44d507a066193d7205a42 100644 GIT binary patch delta 4072 zcmdmWoPXV8{tX|E82P3xV3MA;iE*|UF9QQZNPa;;YEgktYM!l;DNG=-C=o1RAOKY1 zlwVSkp9@!nECy9)Xfb((@dDZy{NDs<@Z<%iJE!Z&FmX7+oN9*dR1-|68k!@C!MtQS zIns>UCT=#TvWc5{EnN!X;VC#>e<735=)zE?;s35o?C$j{eT}=@}uqFgmf$4&=n` z32uz180*nPko??_H3V%9&C$eRL1h9CJvo#RHA4^4>CYS(7Y`M;209NNx9)KrGH%_j z?!lHTA*bjh+1&*WQ(hK!saZP{V=;sr|)?Ua_4klVcMc;bjR-ozvNpm?VIP3r**n&%`<1GKtBDiq3CIVrrf4@P?6P z`u_wPT2q_I)ViHBnd!4NErKa-KGQ;4mYDP&RVEThB4z8!Crg`2Oi$2aIz8FLydT1N zV*z1oo?vBM2v;pM`NQh2>GnGrIVYc8GaZ|7-n!`^0|KT`_`;Yq{eUJD=VYM`7(&}N zq6=+~+PtBYQFOXu4wDqfrE{kHePT?Wu42b{b^1(u#s!Qb(-XCTQVXh?g|??TFwS9| zzQ_qI?D&PzfBFV3rmXFpB z{{Yk>gmBIDGzUiE?bkmtYBEk=@EIhx9q6QN#_2xa5S;BlelXhRPkxZjGF>HyNql

GKYNlaf@&8#$CVGWb!^ou!6Ez>W2V`Q1WJqx>v zhHR#m?V-6$pRLi%{kjsvDyP*@Av9YiufZz5{mEJ;iPMY%h#;Asu$IYudO{`h)9FvE vm=^%0Kryr(7(;rD)AMS ptInt2:getX() then + ptInt = EgtIf( bSashOrFrame, Point3d( ptInt1), Point3d( ptInt2)) + else + ptInt = EgtIf( bSashOrFrame, Point3d( ptInt2), Point3d( ptInt1)) + end + ptInt:toGlob( frDest) + + -- modifico il punto di origine del frame nel punto individuato + frDest:move( ptInt - ORIG()) + + return frDest end ---------------------------------------------------------------------- -local function AddEndDowels( nOutlineId, nEndOutlineId, nProfileLayerId, nDowelLayerId, nGeoLayerId, nMainExtrusionId) +---------------------------------------------------------------------------------- +-- funzione che crea la superficie di estrusione del profilo sCtr +local function CreateSemiProfileSurf( nOutlineId, nProfileId, sCtr, nLayerId) - local sOutlineName = EgtGetName( nOutlineId) - local sEndOutlineName = EgtGetName( nEndOutlineId) - - local nGeoInId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN) - local nGeoRightId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_RIGHT) - - local nMainProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) - local nEndProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_END) - - local nEndJointType = EgtGetInfo( nOutlineId, WIN_ENDJOINT, 'i') - if nEndJointType == WIN_PART_JNT.ANGLED then - - elseif nEndJointType == WIN_PART_JNT.FULL then - -- recupero profondita' d'inizio e fine - local sStart = EgtIf( sOutlineName == WIN_BOTTOM, WIN_DWL_BOTTOMPERPSTART, WIN_DWL_TOPPERPSTART) - local sEnd = EgtIf( sOutlineName == WIN_BOTTOM, WIN_DWL_BOTTOMPERPEND, WIN_DWL_TOPPERPEND) - - -- calcolo il riferimento del profilo - local nFrameProfile = EgtGetFirstNameInGroup( nEndProfileId, WIN_SECTIONFRAME) - local frOrig = EgtFR( nFrameProfile, GDB_ID.ROOT) - frOrig:invert() - -- calcolo il riferimento su cui posizionare i dowel - local ptInt = EgtEP( nGeoRightId) - local vtRef = EgtEV( nGeoRightId) - local frDest = Frame3d( ptInt, - vtRef) - - -- ciclo sui fori trovati - local nOrigDowelId = EgtGetFirstNameInGroup( nEndProfileId, WIN_DOWEL .. '*') - while nOrigDowelId do - local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd') - if not dStart then - dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPSTART, 'd') or 0 + -- creo la curva guida + local nGuideId = EgtCopy( nOutlineId, nLayerId) + EgtExtendCurveStartByLen( nGuideId, 100) + EgtExtendCurveEndByLen( nGuideId, 100) + -- verifico se necessaria inversione della guida nel caso derivi direttamente da split + local nArea = EgtGetParent( EgtGetParent( nOutlineId)) + local nAreaType = EgtGetInfo( nArea, WIN_AREATYPE, 'i') + if nAreaType == WIN_AREATYPES.SPLIT then + local nSouId = EgtGetInfo( nOutlineId, WIN_REF_SPLIT, 'i') + if nSouId then + -- recupero vettore tangente nel punto medio della curva + local ptMidStart = EgtMP( nOutlineId) + local vtMidStart = EgtMV( nOutlineId) + -- recupero vettore tangente nello stesso punto della curva split originale + local dMidStartOnStartSou = EgtCurveParamAtPoint( nSouId, ptMidStart) + local vtMidStartSou = EgtUV( nSouId, dMidStartOnStartSou, -1) + -- se i due vettori non sono orientati nella stessa direzione + if not AreSameVectorApprox( vtMidStart, vtMidStartSou) then + EgtInvertCurve( nGuideId) end - local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd') - if not dEnd then - dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPEND, 'd') or 0 - end - - local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) - EgtSetColor( nDowelId, Color3d( 128, 128, 128)) - -- posiziono i fori grazie ai riferimenti e assegno estrusione e spessore - EgtTransform( nDowelId, frOrig) - EgtTransform( nDowelId, frDest) - EgtMove( nDowelId, - vtRef * dStart) - EgtModifyCurveExtrusion( nDowelId, vtRef) - EgtModifyCurveThickness( nDowelId, - ( dEnd - dStart)) - -- setto info di lavorazione - EgtSetInfo( nDowelId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) - EgtSetInfo( nDowelId, WIN_PRC_DWL_SIDE, WIN_PRC_DWL_SIDETYPE.IN) - - if bCalcSolid then - -- creo solido di estrusione - local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nDowelLayerId, nDowelId, - vtRef * ( dEnd - dStart + 1)) - EgtMove( nDowelExtrusionId, vtRef) - -- sottraggo il dowel al solido - EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) - EgtErase( nDowelExtrusionId) - end - - nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') - end - - elseif nEndJointType == WIN_PART_JNT.SHORT then - -- recupero profondita' d'inizio e fine - local sStart = WIN_DWL_TOPPARASTART - local sEnd = WIN_DWL_TOPPARAEND - if sEndOutlineName == WIN_BOTTOM then - sStart = WIN_DWL_BOTTOMPARASTART - sEnd = WIN_DWL_BOTTOMPARAEND - end - if sOutlineName == WIN_SPLIT then - local sEndProfileType = EgtGetInfo( nEndProfileId, WIN_PRF_TYPE) - if sEndProfileType == WIN_RAIL_BOTTOM then - sStart = WIN_DWL_RAILBOTTOMPARASTART - sEnd = WIN_DWL_RAILBOTTOMPARAEND - elseif sEndProfileType == WIN_SASH_HORIZONTAL then - -- non faccio nulla perche' e' uguale al top - elseif sEndProfileType == WIN_SASH_VERTICAL then - sStart = WIN_DWL_VERTICALSPLITPARASTART - sEnd = WIN_DWL_VERTICALSPLITPARAEND - elseif sEndProfileType == WIN_FRAME_SPLIT or sEndProfileType == WIN_SASH_SPLIT then - sStart = WIN_DWL_SPLITPARASTART - sEnd = WIN_DWL_SPLITPARAEND - end - end - - -- calcolo il riferimento del profilo - local nFrameProfile = EgtGetFirstNameInGroup( nMainProfileId, WIN_SECTIONFRAME) - local frOrig = EgtFR( nFrameProfile, GDB_ID.ROOT) - frOrig:invert() - -- calcolo il riferimento su cui posizionare i dowel - local nRightCopy = EgtCopyGlob( nGeoRightId, nDowelLayerId) - EgtExtendCurveStartByLen( nRightCopy, 200) - EgtExtendCurveEndByLen( nRightCopy, 200) - local ptInt = EgtIP( nOutlineId, nRightCopy, ORIG()) - EgtErase( nRightCopy) - if not ptInt then - return - end - local dParRef = EgtCurveParamAtPoint( nOutlineId, ptInt) - local vtRef = EgtUV( nOutlineId, dParRef, -1) - local frDest = Frame3d( ptInt, - vtRef) - - -- ciclo sui fori trovati - local nOrigDowelId = EgtGetFirstNameInGroup( nMainProfileId, WIN_DOWEL .. '*') - while nOrigDowelId do - local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd') - if not dStart then - dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARASTART, 'd') or 0 - end - local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd') - if not dEnd then - dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARAEND, 'd') or 0 - end - - local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) - EgtSetColor( nDowelId, Color3d( 128, 128, 128)) - -- posiziono i fori grazie ai riferimenti e assegno estrusione e spessore - EgtTransform( nDowelId, frOrig, GDB_RT.GLOB) - EgtTransform( nDowelId, frDest, GDB_RT.GLOB) - EgtMove( nDowelId, - vtRef * dStart) - EgtModifyCurveExtrusion( nDowelId, vtRef) - EgtModifyCurveThickness( nDowelId, - ( dEnd - dStart)) - -- setto info di lavorazione - EgtSetInfo( nDowelId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) - EgtSetInfo( nDowelId, WIN_PRC_DWL_SIDE, WIN_PRC_DWL_SIDETYPE.RIGHT) - - if bCalcSolid then - -- creo solido di estrusione - local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nDowelLayerId, nDowelId, - vtRef * ( dEnd - dStart + 1)) - EgtMove( nDowelExtrusionId, vtRef) - -- sottraggo il dowel al solido - EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) - EgtErase( nDowelExtrusionId) - end - - nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') end end + + -- recupero frame del profilo + local nProfileFrameId = EgtGetFirstNameInGroup( nProfileId, WIN_SECTIONFRAME) + local frOrig = EgtFR( nProfileFrameId, GDB_ID.ROOT) + frOrig:invert() + + -- calcolo il riferimento su cui posizionare il profilo per l'estrusione + local ptRef = EgtSP( nGuideId, GDB_ID.ROOT) + local vtRef = - EgtSV( nGuideId, GDB_ID.ROOT) + local frDest = Frame3d( ptRef, vtRef) + + -- recupero il profilo da estrudere + local nOrigSectionId = EgtGetFirstNameInGroup( nProfileId, sCtr) + local nSectionId = EgtCopyGlob( nOrigSectionId, nLayerId) + + -- posiziono il profilo usando i riferimenti + EgtTransform( nSectionId, frOrig, GDB_RT.GLOB) + EgtTransform( nSectionId, frDest, GDB_RT.GLOB) + + -- creo la superficie + local nSurfId = EgtSurfTmSwept( nLayerId, nSectionId, nGuideId, false, WIN_SURF_APPROX) + EgtErase( nGuideId) + EgtErase( nSectionId) + + return nSurfId end ---------------------------------------------------------------------- --- funzione che calcola intersezione, geometrie e superfici dei dowel degli split -local function CalSplitDowel( nSplitLayerId, nOutlineId, nProfileType, nPartId) +---------------------------------------------------------------------------------- +local function PositionDowel( nDowelId, frOrig, frDest, vtDir, nSurfId) - -- 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 - -- TO DO gestire il caso in cui lo split ha due intersezioni con l'outline - - -- 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)) - local sDowelRefSide = WIN_PRC_DWL_SIDETYPE.IN - if not ptInters and nProfileType == WIN_PRF.SPLIT then - nGeoCrvId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_OUT) - ptInters = EgtIP( nGeoCrvId, nSplitId, EgtSP( nSplitId)) - sDowelRefSide = WIN_PRC_DWL_SIDETYPE.OUT - end - -- se non trovo intersezione esco ( TO DO da sistemare perchè anche se non trova intersezione potrebbe essere coinvolto dai dowels dello split!) - if not ptInters then - return - end + -- posiziono il dowel utilizzando i riferimenti + EgtTransform( nDowelId, frOrig, GDB_RT.GLOB) + EgtTransform( nDowelId, frDest, GDB_RT.GLOB) + EgtMove( nDowelId, 300 * vtDir) + -- creo il tool corrispondente al dowel + local dRad = EgtArcRadius( nDowelId) + EgtCAvSetStdTool( s_dDowelTol, 2 * dRad, 0) + -- calcolo spostamento per posizionarlo in corrispondenza della superficie + local dStart = EgtCAvToolPosStm( EgtCP( nDowelId), - vtDir, nSurfId, - vtDir) + EgtMove( nDowelId, - dStart * vtDir) - -- 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 +end - -- recupero solido del pezzo ( se non esiste è nil) - local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) or GDB_ID.NULL - local nMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_MAIN) - - -- creo fori per spine su Split - local nProcLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PRC) +---------------------------------------------------------------------------------- +local function CreateDowel( nOrigDowelId, nLayerId, frOrig, frDest, vtDir, nTestSurfId, sLenKey, sDowelSide, nMainExtrusionId) - -- 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 - -- se poggia sul controprofilo CntrIn2 leggo le info dello split orizzontale, altrimenti vanno bene quelle del top - -- ( cfr AddStartDowels e AddEndDowels) - if AreSamePointApprox( ptInt, EgtSP( nSplitId)) then - sStart = WIN_DWL_HORIZONTALSPLITPERPSTART - sEnd = WIN_DWL_HORIZONTALSPLITPERPEND - end - 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 + -- vtDir rivolta verso interno del pezzo - -- 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, nProcLayerId) - 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)) - -- setto info di lavorazione - EgtSetInfo( nDowelId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) - EgtSetInfo( nDowelId, WIN_PRC_DWL_SIDE, sDowelRefSide) - - if bCalcSolid then - -- creo solido di estrusione - local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtDowelDir * ( dEnd - dStart + 1)) - EgtMove( nDowelExtrusionId, - vtDowelDir) - -- sottraggo il dowel al solido - EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) - EgtErase( nDowelExtrusionId) - end + local nDowelId = EgtCopyGlob( nOrigDowelId, nLayerId) + EgtSetColor( nDowelId, Color3d( 128, 128, 128)) + + -- posiziono il dowel + PositionDowel( nDowelId, frOrig, frDest, vtDir, nTestSurfId) + + -- assegno estrusione e spessore + local dLen = EgtGetInfo( nOrigDowelId, sLenKey, 'd') + s_dDowelTol + EgtModifyCurveExtrusion( nDowelId, - vtDir) + EgtModifyCurveThickness( nDowelId, - dLen) + + -- setto info di lavorazione + EgtSetInfo( nDowelId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) + EgtSetInfo( nDowelId, WIN_PRC_DWL_SIDE, sDowelSide) - nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') + -- eventuale aggiornamento del solido + if nMainExtrusionId then + -- creo solido di estrusione del dowel + local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nLayerId, nDowelId, vtDir * dLen) + -- sottraggo il dowel al solido + EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) + EgtErase( nDowelExtrusionId) 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) +-- funzione che calcola la correzione da applicare al frame delle spine per evitare che fuoriescano dal pezzo da un lato visibile ( esterno per ante ed interno per telaio) +local function CalcDowelFrameCorrection( nOutlineId, nPrevOutlineId, nDowelRef, frOrig, frDest, nTestSurfPos, nTestSurfPosPrev, nTestSurf, vtMove, nLayerId, sLenKey, sPrevLenKey) - -- 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) + local dMove = 0 + -- se le curve sono due linee ortogonali non serve correzione + if EgtGetType( nOutlineId) == GDB_TY.CRV_LINE and EgtGetType( nPrevOutlineId) == GDB_TY.CRV_LINE then + local vt1 = EgtSV( nPrevOutlineId) + local vt2 = EgtSV( nOutlineId) + local dAng = GetAngleXY( vt1, vt2) + if abs( abs( dAng) - 90) < GEO.EPS_SMALL then + return dMove 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) + -- 1) verifico posizione per il pezzo corrente + -- posiziono il dowel + local nDowel1 = EgtCopyGlob( nDowelRef, nLayerId) + PositionDowel( nDowel1, frOrig, frDest, - frDest:getVersZ(), nTestSurfPos) + -- verifico se la faccia di fondo fuoriesce dalla superficie di test + local dLen = EgtGetInfo( nDowel1, sLenKey, 'd') + s_dDowelTol + local dMove1 = EgtCAvToolPosStm( EgtCP( nDowel1) - frDest:getVersZ() * dLen, frDest:getVersZ(), nTestSurf, vtMove) + + -- 2) verifico posizione per il pezzo precedente + -- posiziono il dowel + local nDowel2 = EgtCopyGlob( nDowelRef, nLayerId) + PositionDowel( nDowel2, frOrig, frDest, frDest:getVersZ(), nTestSurfPosPrev) + -- verifico se la faccia di fondo fuoriesce dalla superficie di test + local dPrevLen = EgtGetInfo( nDowel2, sPrevLenKey, 'd') + s_dDowelTol + local dMove2 = EgtCAvToolPosStm( EgtCP( nDowel2) + frDest:getVersZ() * dPrevLen, - frDest:getVersZ(), nTestSurf, vtMove) + + EgtErase( nDowel1) + EgtErase( nDowel2) + + -- calcolo la correzione complessiva + dMove = max( dMove1, dMove2) + return dMove +end + +---------------------------------------------------------------------------------- +local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail) + + -- recupero i pezzi + local nPart = EgtGetInfo( nOutlineId, WIN_REF_PART, 'i') + local nPrevPart = EgtGetInfo( nPrevOutlineId, WIN_REF_PART, 'i') + if bBottomRail then + if EgtGetName( nOutlineId) == WIN_BOTTOM then + nPart = EgtGetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, 'i') + else + nPrevPart = EgtGetInfo( nPrevOutlineId, WIN_REF_BOTTOMRAIL_PART, 'i') end + end + + -- recupero i layer delle lavorazioni + local nLayerId = EgtGetFirstNameInGroup( nPart, WIN_PRC) + local nPrevLayerId = EgtGetFirstNameInGroup( nPrevPart, WIN_PRC) + + -- recupero i profili + local nProfileLay = EgtGetFirstNameInGroup( nPart, WIN_PROFILE) + local nProfileId = EgtGetFirstNameInGroup( nProfileLay, WIN_PRF_MAIN) + local nPrevProfileLay = EgtGetFirstNameInGroup( nPrevPart, WIN_PROFILE) + local nPrevProfileId = EgtGetFirstNameInGroup( nPrevProfileLay, WIN_PRF_MAIN) + + -- recupero i geo + local nGeo = EgtGetFirstNameInGroup( nPart, WIN_GEO) + local nPrevGeo = EgtGetFirstNameInGroup( nPrevPart, WIN_GEO) + + -- recupero i tipi di profilo + local nPrevProfileType = GetOutlineProfileType( nPrevOutlineId, bBottomRail) + local nProfileType = GetOutlineProfileType( nOutlineId, bBottomRail) + -- caso particolare del triangolo : se lato top contro bottom il top deve essere gestito come un left/right + if nProfileType == WIN_PRF.TOP and nPrevProfileType == WIN_PRF.BOTTOM then + nProfileType = WIN_PRF.RIGHT + elseif nProfileType == WIN_PRF.BOTTOM and nPrevProfileType == WIN_PRF.TOP then + nPrevProfileType = WIN_PRF.LEFT + end + + -- recupero i solidi + local nPrevSolidId, nSolidId + if bCalcSolid then + local nSolidLay = EgtGetFirstNameInGroup( nPart, WIN_SOLID) + nSolidId = EgtGetFirstNameInGroup( nSolidLay, WIN_SRF_MAIN) + local nPrevSolidLay = EgtGetFirstNameInGroup( nPrevPart, WIN_SOLID) + nPrevSolidId = EgtGetFirstNameInGroup( nPrevSolidLay, WIN_SRF_MAIN) + end + + -- recupero il tipo di giunzione + local nJointType = EgtGetInfo( nOutlineId, WIN_STARTJOINT, 'i') + if bBottomRail then + if EgtGetName( nOutlineId) == WIN_BOTTOM then + nJointType = WIN_PART_JNT.SHORT + else + nJointType = WIN_PART_JNT.FULL + end + end + if nJointType == WIN_PART_JNT.ANGLED then + -- TO DO + + elseif nJointType == WIN_PART_JNT.FULL then + + -- calcolo il riferimento del profilo + local nFrameProfile = EgtGetFirstNameInGroup( nPrevProfileId, WIN_SECTIONFRAME) + local frOrig = EgtFR( nFrameProfile, GDB_ID.ROOT) + frOrig:invert() + + -- calcolo il riferimento su cui posizionare i dowels + local frDest = CreateDowelFrameDest( nPrevProfileType, nPrevGeo, nGeo, nPrevOutlineId, true, bSashOrFrame) + + -- recupero info con la lunghezza ( dipendono dal profilo del pezzo full) + local sLenKey = EgtIf( nProfileType == WIN_PRF.BOTTOM, WIN_DWL_BOTTOM_PERP_LEN, WIN_DWL_TOP_PERP_LEN) + local sPrevLenKey = EgtIf( nProfileType == WIN_PRF.BOTTOM, WIN_DWL_BOTTOM_PARA_LEN, WIN_DWL_TOP_PARA_LEN) + + -- superficie test per il posizionamento dei dowels + local nTestSurf = CreateSemiProfileSurf( nOutlineId, nProfileId, WIN_CTRIN, nLayerId) + local nTestSurfInverted = EgtCopyGlob( nTestSurf, nLayerId) + EgtInvertSurf( nTestSurfInverted) + + -- superficie test per la traslazione dei dowels + local nTestSurf2 = CreateSemiProfileSurf( nPrevOutlineId, nPrevProfileId, EgtIf( bSashOrFrame, WIN_OUT, WIN_IN), nLayerId) + EgtInvertSurf( nTestSurf2) + -- direzione per la traslazione dei dowels + local vtMove = EgtIf( bSashOrFrame, - frDest:getVersX(), frDest:getVersX()) + + -- analizzo le singole file di dowels + for k = 1, 3 do + -- recupero i dowels della fila k-esima + local vDowels = EgtGetNameInGroup( nPrevProfileId, WIN_DOWEL .. 'Row' .. tostring( k)) + if not vDowels then + break + end + -- recupero il dowel nella posizione più problematica ( per le ante è quello più esterno, per il telaio quello più interno) + local nDowelRef = EgtIf( bSashOrFrame, vDowels[1], vDowels[#vDowels]) + -- calcolo correzione da applicare al frame affinchè i dowels non fuoriescano da un lato visibile ( esterno per ante ed interno per telaio) + local dMove = CalcDowelFrameCorrection( nOutlineId, nPrevOutlineId, nDowelRef, frOrig, frDest, nTestSurfInverted, nTestSurf, nTestSurf2, vtMove, nLayerId, sLenKey, sPrevLenKey) + local frDestDowel = Frame3d( frDest) + frDestDowel:move( dMove * vtMove) + for i = 1, #vDowels do + -- dowels per pezzo corrente + CreateDowel( vDowels[i], nLayerId, frOrig, frDestDowel, - frDestDowel:getVersZ(), nTestSurfInverted, sLenKey, WIN_PRC_DWL_SIDETYPE.IN, nSolidId) + -- dowels per prezzo precedente + CreateDowel( vDowels[i], nPrevLayerId, frOrig, frDestDowel, frDestDowel:getVersZ(), nTestSurf, sPrevLenKey, WIN_PRC_DWL_SIDETYPE.RIGHT, nPrevSolidId) + end + end + + EgtErase( nTestSurf) + EgtErase( nTestSurfInverted) + EgtErase( nTestSurf2) + + + elseif nJointType == WIN_PART_JNT.SHORT then + + -- calcolo il riferimento del profilo + local nFrameProfile = EgtGetFirstNameInGroup( nProfileId, WIN_SECTIONFRAME) + local frOrig = EgtFR( nFrameProfile, GDB_ID.ROOT) + frOrig:invert() + + -- calcolo il riferimento su cui posizionare i dowels + local frDest = CreateDowelFrameDest( nProfileType, nPrevGeo, nGeo, nOutlineId, false, bSashOrFrame) + + -- recupero info con la lunghezza ( dipendono dal profilo del pezzo full, quindi da prezzo prev) + local sLenKey = WIN_DWL_TOP_PARA_LEN + local sPrevLenKey = WIN_DWL_TOP_PERP_LEN + if nPrevProfileType == WIN_PRF.BOTTOM then + sLenKey = WIN_DWL_BOTTOM_PARA_LEN + sPrevLenKey = WIN_DWL_BOTTOM_PERP_LEN + elseif nPrevProfileType == WIN_PRF.BOTTOM_RAIL then + sLenKey = WIN_DWL_BOTTOMRAIL_PARA_LEN + sPrevLenKey = WIN_DWL_BOTTOMRAIL_PERP_LEN + end + + -- superficie test per il posizionamento dei dowels + local nTestSurf = CreateSemiProfileSurf( nPrevOutlineId, nPrevProfileId, WIN_CTRIN, nLayerId) + local nTestSurfInverted = EgtCopyGlob( nTestSurf, nLayerId) + EgtInvertSurf( nTestSurfInverted) + + -- superficie test per la traslazione dei dowels + local nTestSurf2 = CreateSemiProfileSurf( nOutlineId, nProfileId, EgtIf( bSashOrFrame, WIN_OUT, WIN_IN), nLayerId) + EgtInvertSurf( nTestSurf2) + -- direzione per la traslazione dei dowels + local vtMove = EgtIf( bSashOrFrame, - frDest:getVersX(), frDest:getVersX()) + + -- analizzo le singole file di dowels + for k = 1, 3 do + -- recupero i dowels sulla fila k-esima + local vDowels = EgtGetNameInGroup( nProfileId, WIN_DOWEL .. 'Row' .. tostring(k)) + if not vDowels then + break + end + -- recupero il dowel nella posizione più problematica ( per le ante è quello più esterno, per il telaio quello più interno) + local nDowelRef = EgtIf( bSashOrFrame, vDowels[1], vDowels[#vDowels]) + -- calcolo correzione da applicare al frame affinchè i dowels non fuoriescano da un lato visibile ( esterno per ante ed interno per telaio) + local dMove = CalcDowelFrameCorrection( nOutlineId, nPrevOutlineId, nDowelRef, frOrig, frDest, nTestSurf, nTestSurfInverted, nTestSurf2, vtMove, nLayerId, sLenKey, sPrevLenKey) + local frDestDowel = Frame3d( frDest) + frDestDowel:move( dMove * vtMove) + for i = 1, #vDowels do + -- dowels per pezzo corrente + CreateDowel( vDowels[i], nLayerId, frOrig, frDestDowel, - frDestDowel:getVersZ(), nTestSurf, sLenKey, WIN_PRC_DWL_SIDETYPE.LEFT, nSolidId) + -- dowels per prezzo precedente + CreateDowel( vDowels[i], nPrevLayerId, frOrig, frDestDowel, frDestDowel:getVersZ(), nTestSurfInverted, sPrevLenKey, WIN_PRC_DWL_SIDETYPE.IN, nPrevSolidId) + end + end + + EgtErase( nTestSurf) + EgtErase( nTestSurfInverted) + EgtErase( nTestSurf2) + end + +end + +---------------------------------------------------------------------------------- +local function CalcSplitDowels( nSplitId, vOutlines, bStartOrEnd) + + -- TO DO : da gestire incrocio dowels di tre pezzi + + -- recupero il pezzo dello split + local nSplitPart = EgtGetInfo( nSplitId, WIN_REF_PART, 'i') + -- recupero il profilo originale dello split e il suo frame + local nSplitProfile = GetOutlineProfileId( nSplitId, false) + local nSplitProfileFrameId = EgtGetFirstNameInGroup( nSplitProfile, WIN_SECTIONFRAME) + local frOrig = EgtFR( nSplitProfileFrameId, GDB_ID.ROOT) + frOrig:invert() + -- recupero il gruppo delle lavorazioni + local nSplitLayerId = EgtGetFirstNameInGroup( nSplitPart, WIN_PRC) + -- recupero eventuale solido + local nSplitSolidId + if bCalcSolid then + local nSplitSolidLayerId = EgtGetFirstNameInGroup( nSplitPart, WIN_SOLID) + nSplitSolidId = EgtGetFirstNameInGroup( nSplitSolidLayerId, WIN_SRF_MAIN) + end + -- indviduo il lato su cui andranno i dowels + local sSplitDowelSide = WIN_PRC_DWL_SIDETYPE.RIGHT + if bStartOrEnd then + sSplitDowelSide = WIN_PRC_DWL_SIDETYPE.LEFT + end + + local ptRef = EgtIf( bStartOrEnd, EgtSP( nSplitId), EgtEP( nSplitId)) + + for i = 1, #vOutlines do + + -- recupero il pezzo associato e il suo outline di riferimento + local nPartId = FindAssociatedPart( vOutlines[i]) + local nOutlineId = EgtGetInfo( nPartId, WIN_REF_OUTLINE, 'i') + local nProfileType = GetOutlineProfileType( nOutlineId, true) + + -- calcolo il frame di destinazione + -- trovo intersezione dello split 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, ptRef) + local sDowelSide = WIN_PRC_DWL_SIDETYPE.IN + if not ptInters and nProfileType == WIN_PRF.SPLIT then + nGeoCrvId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_OUT) + ptInters = EgtIP( nGeoCrvId, nSplitId, ptRef) + sDowelSide = WIN_PRC_DWL_SIDETYPE.OUT + end + -- se non trovo intersezione esco + if not ptInters then + return + end + -- TO DO : gestione split non lineare + local frDest = Frame3d( ptInters, - EgtSV( nSplitId)) + + -- recupero il layer con le lavorazioni + local nLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PRC) + + -- nel layer dei profili del pezzo aggiungo il profilo dello split posizionato correttamente + local nProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) + local nSplitProfileCopyId = EgtCopy( nSplitProfile, nProfileLayerId) + local sSplitProfileType = EgtGetName( nSplitProfile) + EgtSetInfo( nSplitProfileCopyId, WIN_PRF_TYPE, sSplitProfileType) + EgtSetName( nSplitProfileCopyId, WIN_PRF_SPLIT) + -- posiziono il profilo sulla curva di split + EgtTransform( EgtGetAllInGroup( nSplitProfileCopyId), frOrig, GDB_RT.GLOB) + EgtChangeGroupFrame( nSplitProfileCopyId, frDest, GDB_RT.GLOB) + + -- recupero eventuale solido + local nSolidId + if bCalcSolid then + local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) + nSolidId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_MAIN) + end + + -- recupero le chiavi delle lunghezze ( dipendono dal profilo del pezzo su cui poggia lo split) + local sSplitLenKey = WIN_DWL_TOP_PARA_LEN + local sLenKey = WIN_DWL_TOP_PERP_LEN + if nProfileType == WIN_PRF.BOTTOM then + sSplitLenKey = WIN_DWL_BOTTOM_PARA_LEN + sLenKey = WIN_DWL_BOTTOM_PERP_LEN + elseif nProfileType == WIN_PRF.BOTTOMRAIL then + sSplitLenKey = WIN_DWL_RAILBOTTOM_PARA_LEN + sLenKey = WIN_DWL_RAILBOTTOM_PERP_LEN + elseif nProfileType == WIN_PRF.SPLIT then + sSplitLenKey = WIN_DWL_SPLIT_PARA_LEN + sLenKey = WIN_DWL_SPLIT_PERP_LEN + end + + -- creo la superficie di test per il posizionamento dei dowels + local nProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) + local sCtr = GetProfileCtrIn( nOutlineId, nSplitId, nProfileId) + local nTestSurf = CreateSemiProfileSurf( nOutlineId, nProfileId, sCtr, nSplitLayerId) + local nTestSurfInverted = EgtCopyGlob( nTestSurf, nSplitLayerId) + if sDowelSide == WIN_PRC_DWL_SIDETYPE.OUT then + EgtInvertSurf( nTestSurf) + else + EgtInvertSurf( nTestSurfInverted) + end + + -- calcolo le direzioni entranti nei pezzi + local vtSplitDir = EgtIf( bStartOrEnd, - frDest:getVersZ(), frDest:getVersZ()) + local vtDir = frDest:getVersZ() + local _, _, nSide = EgtPointCurveDistSide( ptInters + vtDir, nGeoCrvId, Z_AX()) + if nSide == 1 then + -- se a destra della curva significa che la direzione è uscente dal pezzo e va invertita + vtDir = - vtDir + end + + -- aggiungo i dowels + local vDowels = EgtGetNameInGroup( nSplitProfile, WIN_DOWEL .. '*') or {} + for i = 1, #vDowels do + -- split + CreateDowel( vDowels[i], nSplitLayerId, frOrig, frDest, vtSplitDir, nTestSurf, sSplitLenKey, sSplitDowelSide, nSplitSolidId) + -- pezzo + CreateDowel( vDowels[i], nLayerId, frOrig, frDest, vtDir, nTestSurfInverted, sLenKey, sDowelSide, nSolidId) + end + + EgtErase( nTestSurf) + EgtErase( nTestSurfInverted) + + end +end + +---------------------------------------------------------------------------------- +-- funzione che calcola le spine +local function CalculateAreaDowels( nAreaId) + + local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i') + local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_OUTLINE) + if nAreaType == WIN_AREATYPES.FRAME or nAreaType == WIN_AREATYPES.SASH then + -- verifico se presente bottomrail + local bBottomRail = EgtGetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, 'b') or false + -- aggiungo le spine sui pezzi dell'area + local nOutline = EgtGetFirstInGroup( nOutlineLayerId) + local nPrevOutline = EgtGetLastInGroup( nOutlineLayerId) + while nOutline do + -- aggiungo spine su nOutline e nPrevOutline nel loro punto di giunzione + CalcDowels( nOutline, nPrevOutline, nAreaType == WIN_AREATYPES.SASH, false) + -- bottomrail + if bBottomRail and ( EgtGetName( nOutline) == WIN_BOTTOM or EgtGetName( nPrevOutline) == WIN_BOTTOM) then + CalcDowels( nOutline, nPrevOutline, false, true) + end + -- aggiorno per iterazione successiva + nPrevOutline = nOutline + nOutline = EgtGetNext( nOutline) + 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 non è di tipo french ha un pezzo associato per il quale vanno calcolate le spine + if nSplitType ~= WIN_SPLITTYPES.FRENCH then + local nSplitId = EgtGetFirstInGroup( nSplitLayerId) + -- recupero le curve su cui poggia lo split + local vPrevOutlineId, vNextOutlineId = GetPrevNextOutline( WIN_PRF.SPLIT, nSplitId, nOutlineLayerId) + CalcSplitDowels( nSplitId, vPrevOutlineId, true) + CalcSplitDowels( nSplitId, vNextOutlineId, false) + end + end + + -- calcolo le spine delle sottoaree + local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREA .. '*') + while nChildAreaId do + CalculateAreaDowels( nChildAreaId) 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 i fori per le spine -local function CalcFrameDowels( nPartId, nOutlineId, nOutlineLayerId, nProfileType) - - -- creo fori per spine su Start ed End - local vPrevOutlineId, vNextOutlineId = GetPrevNextOutline( nProfileType, nOutlineId, nOutlineLayerId) - local nProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) - local nProcLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PRC) - local nGeoLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO) - local nMainExtrusionId - if bCalcSolid then - local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) - nMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_MAIN) - end - for i = 1, #vPrevOutlineId do - AddStartDowels( nOutlineId, vPrevOutlineId[i], nProfileLayerId, nProcLayerId, nGeoLayerId, nMainExtrusionId) - end - for i = 1, #vNextOutlineId do - AddEndDowels( nOutlineId, vNextOutlineId[i], nProfileLayerId, nProcLayerId, nGeoLayerId, nMainExtrusionId) - end - - -- split dowels - AddSplitDowels( nOutlineId, nOutlineLayerId, nPartId, nProfileType) -end ---------------------------------------------------------------------------------- @@ -1754,6 +1800,10 @@ local function CalcStartEndProfileType( nProfileType, nOutlineId, vStartProfileI else local StartJointType = EgtGetInfo( nOutlineId, WIN_STARTJOINT, 'i') + if nProfileType == WIN_PRF.BOTTOMRAIL then + -- l'info nella curva si riferisce al pezzo bottom, il bottomrail viene sempre forzato a short + StartJointType = WIN_PART_JNT.SHORT + end if StartJointType == WIN_PART_JNT.ANGLED then vsStartProfileType = { WIN_MINIZINKEN} elseif StartJointType == WIN_PART_JNT.SHORT then @@ -1763,6 +1813,9 @@ local function CalcStartEndProfileType( nProfileType, nOutlineId, vStartProfileI end local EndJointType = EgtGetInfo( nOutlineId, WIN_ENDJOINT, 'i') + if nProfileType == WIN_PRF.BOTTOMRAIL then + EndJointType = WIN_PART_JNT.SHORT + end if EndJointType == WIN_PART_JNT.ANGLED then vsEndProfileType = { WIN_MINIZINKEN} elseif EndJointType == WIN_PART_JNT.SHORT then @@ -1840,7 +1893,7 @@ local function CalcFrameSolid( nPartId, nOutlineId, nGeoId, nProfileType) for i = 1, #vPrevGeoId do -- posiziono il profilo Start local nRefStartProfileId = EgtGetFirstNameInGroup( vStartProfileId[i], WIN_REF) - local b3RefStartProfile = EgtGetBBoxGlob( nRefStartProfileId, GDB_BB.STANDARD) + local b3RefStartProfile = EgtGetBBoxGlob( nRefStartProfileId, GDB_BB.STANDARD) -- creo guida per estrusione con estensione in tangenza local nStartGuideId = EgtCopy( vPrevGeoId[i], nSolidLayerId) if EgtGetType( nStartGuideId) == GDB_TY.CRV_LINE then @@ -1865,13 +1918,9 @@ local function CalcFrameSolid( nPartId, nOutlineId, nGeoId, nProfileType) if bSplitInsideSplitArea then -- verifico se il suo start deriva da uno split local vStartId = EgtGetInfo( nOutlineId, WIN_SPLIT_STARTINTERS, 'vi') - local nStartSouId = vStartId[i] - local sStartSouName - repeat - nStartSouId = EgtGetInfo( nStartSouId, WIN_SOU, 'i') - sStartSouName = EgtGetName( nStartSouId or GDB_ID.NULL) - until not nStartSouId or sStartSouName == WIN_SPLIT - if sStartSouName == WIN_SPLIT then + local nStartOutlineId = EgtGetInfo( vStartId[i], WIN_COPY, 'i') + local nStartSouId = EgtGetInfo( nStartOutlineId, WIN_REF_SPLIT, 'i') + if nStartSouId then -- recupero vettore tangente nel punto medio della curva di contorno local ptMidStart = EgtMP( vStartId[i]) local vtMidStart = EgtMV( vStartId[i]) @@ -1934,13 +1983,9 @@ local function CalcFrameSolid( nPartId, nOutlineId, nGeoId, nProfileType) if bSplitInsideSplitArea then -- verifico se end deriva da split local vEndId = EgtGetInfo( nOutlineId, WIN_SPLIT_ENDINTERS, 'vi') - local nEndSouId = vEndId[i] - local sEndSouName - repeat - nEndSouId = EgtGetInfo( nEndSouId, WIN_SOU) - sEndSouName = EgtGetName( nEndSouId or GDB_ID.NULL) - until not nEndSouId or sEndSouName == WIN_SPLIT - if sEndSouName == WIN_SPLIT then + local nEndOutlineId = EgtGetInfo( vEndId[i], WIN_COPY, 'i') + local nEndSouId = EgtGetInfo( nEndOutlineId, WIN_REF_SPLIT, 'i') + if nEndSouId then -- recupero vettore tangente nel punto medio della curva di contorno local ptMidEnd = EgtMP( vEndId[i]) local vtMidEnd = EgtMV( vEndId[i]) @@ -2026,8 +2071,6 @@ local function CreatePartFromOutline( nAreaLayerId, nOutlineId, nOutlineCrvNbr, if bCalcSolid then CalcFrameSolid( nPartId, nOutlineId, nGeoId, nProfileType) end - -- calcolo i fori per le spine - CalcFrameDowels( nPartId, nOutlineId, nOutlineLayerId, nProfileType) -- b) Fill elseif nAreaType == WIN_AREATYPES.FILL then @@ -2072,8 +2115,8 @@ local function GetStripNearestToOutline( nPrevProfileId, nPrevOutlineId, nOutlin until not nPrevSouId or sPrevSouName == WIN_SPLIT -- verifico da quale lato si trova la curva per decidere quale controprofilo considerare - local _, _, dSide = EgtPointCurveDistSide( EgtMP( nOutlineId), nPrevSouId, Z_AX()) - if dSide == 1 then + local _, _, nSide = EgtPointCurveDistSide( EgtMP( nOutlineId), nPrevSouId, Z_AX()) + if nSide == 1 then nStripId = EgtGetFirstNameInGroup( nPrevProfileId, WIN_STRIP .. '1') -- dx else nStripId = EgtGetFirstNameInGroup( nPrevProfileId, WIN_STRIP .. '2') -- sx @@ -2158,10 +2201,7 @@ local function CreateStripFromOutline( nAreaId, nOutlineId) EgtExtendCurveEndByLen( nStartStripGuideId, 10) -- estrudo Strip start - local nStartProfileFrameId = EgtGetFirstNameInGroup( nStartProfileId, WIN_SECTIONFRAME) - local frStartProfile = EgtFR( nStartProfileFrameId, GDB_ID.ROOT) - local nRefStartProfileId = EgtGetFirstNameInGroup( nStartProfileId, WIN_REF) - local b3RefStartProfile = EgtGetBBoxRef( nRefStartProfileId, GDB_BB.STANDARD, frStartProfile) + local b3RefStartProfile = GetProfileLocalBox( nStartProfileId) local nStartStripProfileId = EgtLine( nStartProfileId, ptStripMinStart, ptStripMinStart - Z_AX() * b3RefStartProfile:getDimY(), GDB_RT.GLOB) EgtInvertCurve( nStartStripProfileId) local nStartStripExtrusionId = EgtSurfTmSwept( nSolidLayerId, nStartStripProfileId, nStartStripGuideId, false, WIN_SURF_APPROX) @@ -2183,10 +2223,7 @@ local function CreateStripFromOutline( nAreaId, nOutlineId) EgtInvertCurve( nEndStripGuideId) -- estrudo Strip end - local nEndProfileFrameId = EgtGetFirstNameInGroup( nEndProfileId, WIN_SECTIONFRAME) - local frEndProfile = EgtFR( nEndProfileFrameId, GDB_ID.ROOT) - local nRefEndProfileId = EgtGetFirstNameInGroup( nEndProfileId, WIN_REF) - local b3RefEndProfile = EgtGetBBoxRef(nRefEndProfileId, GDB_BB.STANDARD, frEndProfile) + local b3RefEndProfile = GetProfileLocalBox( nEndProfileId) local nEndStripProfileId = EgtLine( nEndProfileId, ptStripMinEnd, ptStripMinEnd - Z_AX() * b3RefEndProfile:getDimY(), GDB_RT.GLOB) EgtInvertCurve( nEndStripProfileId) local nEndStripExtrusionId = EgtSurfTmSwept( nSolidLayerId, nEndStripProfileId, nEndStripGuideId, false, WIN_SURF_APPROX) @@ -2306,6 +2343,8 @@ function WinCalculate.CreatePartFromArea( nFrameId) CalculateAreaOutline( nFrameId) -- creo pezzi CalculateAreaParts( nFrameId) + -- calcolo le spine + CalculateAreaDowels( nFrameId) end --------------------------------------------------------------------- @@ -2657,7 +2696,7 @@ function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest) if bOnlyRequest then return sInputFile end - + -- attendo scrittura output local nWait = 0 while not EgtExistsFile( sOutputFile) and nWait < 20 do From 1a5edcc34bfed0f572be6c45ab3521f89af80df3 Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 9 Aug 2024 11:22:51 +0200 Subject: [PATCH 3/7] - rimossi dowels esterni ai pezzi di split. --- Profiles/WinLib/WinCalculate.lua | 207 +++++++++++++++++++------------ 1 file changed, 125 insertions(+), 82 deletions(-) diff --git a/Profiles/WinLib/WinCalculate.lua b/Profiles/WinLib/WinCalculate.lua index faa3054..cd56ea2 100644 --- a/Profiles/WinLib/WinCalculate.lua +++ b/Profiles/WinLib/WinCalculate.lua @@ -952,6 +952,30 @@ local function GetProfileCtrIn( nPrevOutlineId, nOutlineId, nPrevProfileId) return sPrevCtrIn end +--------------------------------------------------------------------- +-- funzione che crea la superficie corrispondente al Geo di un pezzo +local function CreateGeoArea( nGeoLayId, nDestLayId) + + local vCrvs = EgtGetAllInGroup( nGeoLayId) + local nCompoId = EgtCurveCompoByChain( nDestLayId, vCrvs, EgtSP( vCrvs[1]), false) + EgtChangeClosedCurveStartPoint( nCompoId, EgtSP( vCrvs[1])) + -- verifico che orientamento della composita rispecchi quello della curva out + if not AreSameVectorApprox( EgtSV( nCompoId), EgtSV( vCrvs[1])) then + EgtInvertCurve( nCompoId) + end + local nArea = EgtSurfFlatRegion( nDestLayId, nCompoId) + -- controllo per eventuale autointersezione del geo di un pezzo di split + local vtN = EgtSurfFrNormVersor( nArea) + if AreOppositeVectorApprox( vtN, Z_AX()) then + EgtErase( nArea) + local nGeoIn = EgtGetFirstNameInGroup( nGeoLayId, WIN_GEO_IN) + EgtChangeClosedCurveStartPoint( nCompoId, EgtSP( nGeoIn)) + nArea = EgtSurfFlatRegion( nDestLayId, nCompoId) + end + EgtErase( nCompoId) + + return nArea +end --------------------------------------------------------------------- --------------------------- GEO ----------------------------------- @@ -1392,6 +1416,8 @@ local function CreateDowel( nOrigDowelId, nLayerId, frOrig, frDest, vtDir, nTest EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) EgtErase( nDowelExtrusionId) end + + return nDowelId end ---------------------------------------------------------------------------------- @@ -1531,9 +1557,9 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail local frDestDowel = Frame3d( frDest) frDestDowel:move( dMove * vtMove) for i = 1, #vDowels do - -- dowels per pezzo corrente + -- dowels per pezzo corrente ( full) CreateDowel( vDowels[i], nLayerId, frOrig, frDestDowel, - frDestDowel:getVersZ(), nTestSurfInverted, sLenKey, WIN_PRC_DWL_SIDETYPE.IN, nSolidId) - -- dowels per prezzo precedente + -- dowels per prezzo precedente ( short) CreateDowel( vDowels[i], nPrevLayerId, frOrig, frDestDowel, frDestDowel:getVersZ(), nTestSurf, sPrevLenKey, WIN_PRC_DWL_SIDETYPE.RIGHT, nPrevSolidId) end end @@ -1589,9 +1615,9 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail local frDestDowel = Frame3d( frDest) frDestDowel:move( dMove * vtMove) for i = 1, #vDowels do - -- dowels per pezzo corrente + -- dowels per pezzo corrente ( short) CreateDowel( vDowels[i], nLayerId, frOrig, frDestDowel, - frDestDowel:getVersZ(), nTestSurf, sLenKey, WIN_PRC_DWL_SIDETYPE.LEFT, nSolidId) - -- dowels per prezzo precedente + -- dowels per prezzo precedente ( full) CreateDowel( vDowels[i], nPrevLayerId, frOrig, frDestDowel, frDestDowel:getVersZ(), nTestSurfInverted, sPrevLenKey, WIN_PRC_DWL_SIDETYPE.IN, nPrevSolidId) end end @@ -1628,6 +1654,9 @@ local function CalcSplitDowels( nSplitId, vOutlines, bStartOrEnd) if bStartOrEnd then sSplitDowelSide = WIN_PRC_DWL_SIDETYPE.LEFT end + -- creo la superficie di test per verificare se dowel interno al pezzo + local nSplitGeo = EgtGetFirstNameInGroup( nSplitPart, WIN_GEO) + local nSplitSurf = CreateGeoArea( nSplitGeo, nSplitLayerId) local ptRef = EgtIf( bStartOrEnd, EgtSP( nSplitId), EgtEP( nSplitId)) @@ -1649,80 +1678,101 @@ local function CalcSplitDowels( nSplitId, vOutlines, bStartOrEnd) ptInters = EgtIP( nGeoCrvId, nSplitId, ptRef) sDowelSide = WIN_PRC_DWL_SIDETYPE.OUT end - -- se non trovo intersezione esco - if not ptInters then - return - end - -- TO DO : gestione split non lineare - local frDest = Frame3d( ptInters, - EgtSV( nSplitId)) - - -- recupero il layer con le lavorazioni - local nLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PRC) - - -- nel layer dei profili del pezzo aggiungo il profilo dello split posizionato correttamente - local nProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) - local nSplitProfileCopyId = EgtCopy( nSplitProfile, nProfileLayerId) - local sSplitProfileType = EgtGetName( nSplitProfile) - EgtSetInfo( nSplitProfileCopyId, WIN_PRF_TYPE, sSplitProfileType) - EgtSetName( nSplitProfileCopyId, WIN_PRF_SPLIT) - -- posiziono il profilo sulla curva di split - EgtTransform( EgtGetAllInGroup( nSplitProfileCopyId), frOrig, GDB_RT.GLOB) - EgtChangeGroupFrame( nSplitProfileCopyId, frDest, GDB_RT.GLOB) - - -- recupero eventuale solido - local nSolidId - if bCalcSolid then - local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) - nSolidId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_MAIN) - end + -- se non trovo intersezione passo al successivo + if ptInters then - -- recupero le chiavi delle lunghezze ( dipendono dal profilo del pezzo su cui poggia lo split) - local sSplitLenKey = WIN_DWL_TOP_PARA_LEN - local sLenKey = WIN_DWL_TOP_PERP_LEN - if nProfileType == WIN_PRF.BOTTOM then - sSplitLenKey = WIN_DWL_BOTTOM_PARA_LEN - sLenKey = WIN_DWL_BOTTOM_PERP_LEN - elseif nProfileType == WIN_PRF.BOTTOMRAIL then - sSplitLenKey = WIN_DWL_RAILBOTTOM_PARA_LEN - sLenKey = WIN_DWL_RAILBOTTOM_PERP_LEN - elseif nProfileType == WIN_PRF.SPLIT then - sSplitLenKey = WIN_DWL_SPLIT_PARA_LEN - sLenKey = WIN_DWL_SPLIT_PERP_LEN - end - - -- creo la superficie di test per il posizionamento dei dowels - local nProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) - local sCtr = GetProfileCtrIn( nOutlineId, nSplitId, nProfileId) - local nTestSurf = CreateSemiProfileSurf( nOutlineId, nProfileId, sCtr, nSplitLayerId) - local nTestSurfInverted = EgtCopyGlob( nTestSurf, nSplitLayerId) - if sDowelSide == WIN_PRC_DWL_SIDETYPE.OUT then - EgtInvertSurf( nTestSurf) - else - EgtInvertSurf( nTestSurfInverted) - end + -- TO DO : gestione split non lineare + local frDest = Frame3d( ptInters, - EgtSV( nSplitId)) + + -- recupero il layer con le lavorazioni + local nLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PRC) + + -- nel layer dei profili del pezzo aggiungo il profilo dello split posizionato correttamente + local nProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) + local nSplitProfileCopyId = EgtCopy( nSplitProfile, nProfileLayerId) + local sSplitProfileType = EgtGetName( nSplitProfile) + EgtSetInfo( nSplitProfileCopyId, WIN_PRF_TYPE, sSplitProfileType) + EgtSetName( nSplitProfileCopyId, WIN_PRF_SPLIT) + -- posiziono il profilo sulla curva di split + EgtTransform( EgtGetAllInGroup( nSplitProfileCopyId), frOrig, GDB_RT.GLOB) + EgtChangeGroupFrame( nSplitProfileCopyId, frDest, GDB_RT.GLOB) + + -- recupero eventuale solido + local nSolidId + if bCalcSolid then + local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) + nSolidId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_MAIN) + end - -- calcolo le direzioni entranti nei pezzi - local vtSplitDir = EgtIf( bStartOrEnd, - frDest:getVersZ(), frDest:getVersZ()) - local vtDir = frDest:getVersZ() - local _, _, nSide = EgtPointCurveDistSide( ptInters + vtDir, nGeoCrvId, Z_AX()) - if nSide == 1 then - -- se a destra della curva significa che la direzione è uscente dal pezzo e va invertita - vtDir = - vtDir - end - - -- aggiungo i dowels - local vDowels = EgtGetNameInGroup( nSplitProfile, WIN_DOWEL .. '*') or {} - for i = 1, #vDowels do - -- split - CreateDowel( vDowels[i], nSplitLayerId, frOrig, frDest, vtSplitDir, nTestSurf, sSplitLenKey, sSplitDowelSide, nSplitSolidId) - -- pezzo - CreateDowel( vDowels[i], nLayerId, frOrig, frDest, vtDir, nTestSurfInverted, sLenKey, sDowelSide, nSolidId) - end - - EgtErase( nTestSurf) - EgtErase( nTestSurfInverted) + -- recupero le chiavi delle lunghezze ( dipendono dal profilo del pezzo su cui poggia lo split) + local sSplitLenKey = WIN_DWL_TOP_PARA_LEN + local sLenKey = WIN_DWL_TOP_PERP_LEN + if nProfileType == WIN_PRF.BOTTOM then + sSplitLenKey = WIN_DWL_BOTTOM_PARA_LEN + sLenKey = WIN_DWL_BOTTOM_PERP_LEN + elseif nProfileType == WIN_PRF.BOTTOMRAIL then + sSplitLenKey = WIN_DWL_RAILBOTTOM_PARA_LEN + sLenKey = WIN_DWL_RAILBOTTOM_PERP_LEN + elseif nProfileType == WIN_PRF.SPLIT then + sSplitLenKey = WIN_DWL_SPLIT_PARA_LEN + sLenKey = WIN_DWL_SPLIT_PERP_LEN + end + + -- creo la superficie di test per il posizionamento dei dowels + local nProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) + local sCtr = GetProfileCtrIn( nOutlineId, nSplitId, nProfileId) + local nTestSurf = CreateSemiProfileSurf( nOutlineId, nProfileId, sCtr, nSplitLayerId) + local nTestSurfInverted = EgtCopyGlob( nTestSurf, nSplitLayerId) + if sDowelSide == WIN_PRC_DWL_SIDETYPE.OUT then + EgtInvertSurf( nTestSurf) + else + EgtInvertSurf( nTestSurfInverted) + end + -- calcolo le direzioni entranti nei pezzi + local vtSplitDir = EgtIf( bStartOrEnd, - frDest:getVersZ(), frDest:getVersZ()) + local vtDir = frDest:getVersZ() + local _, _, nSide = EgtPointCurveDistSide( ptInters + vtDir, nGeoCrvId, Z_AX()) + if nSide == 1 then + -- se a destra della curva significa che la direzione è uscente dal pezzo e va invertita + vtDir = - vtDir + end + + -- creo la superficie di test per verificare se dowel interno al pezzo + local nGeo = EgtGetFirstNameInGroup( nPartId, WIN_GEO) + local nSurf = CreateGeoArea( nGeo, nLayerId) + + -- aggiungo i dowels + local vDowels = EgtGetNameInGroup( nSplitProfile, WIN_DOWEL .. '*') or {} + for i = 1, #vDowels do + -- split + local nDowel1 = CreateDowel( vDowels[i], nSplitLayerId, frOrig, frDest, vtSplitDir, nTestSurf, sSplitLenKey, sSplitDowelSide, nSplitSolidId) + -- verifico se dowel è interno al pezzo ( TO DO : da migliorare!) + local ptTest = EgtCP( nDowel1) - vtSplitDir * EgtCurveThickness( nDowel1) + local nTestPoint = EgtPoint( nSplitLayerId, ptTest) + if EgtSurfFrTestExternal( nSplitSurf, nTestPoint) then + EgtErase( nDowel1) + end + EgtErase( nTestPoint) + + -- pezzo + local nDowel2 = CreateDowel( vDowels[i], nLayerId, frOrig, frDest, vtDir, nTestSurfInverted, sLenKey, sDowelSide, nSolidId) + ptTest = EgtCP( nDowel2) - vtDir * EgtCurveThickness( nDowel2) + nTestPoint = EgtPoint( nLayerId, ptTest) + if EgtSurfFrTestExternal( nSurf, nTestPoint) then + EgtErase( nDowel2) + end + EgtErase( nTestPoint) + + end + + EgtErase( nTestSurf) + EgtErase( nTestSurfInverted) + EgtErase( nSurf) + end end + + EgtErase( nSplitSurf) end ---------------------------------------------------------------------------------- @@ -2279,14 +2329,7 @@ local function CalculateAreaParts( nAreaId) EgtSetName( nSelectionLayerId, WIN_SPLITSELECTION) EgtSetStatus( nSelectionLayerId, GDB_ST.OFF) local nSplitPartGeoId = EgtGetFirstNameInGroup( nSplitPartId, WIN_GEO) - -- costruisco curva semplificata a partire dai lati out e in per evitare problemi con autointersezioni del geo - local nGeoOut = EgtGetFirstNameInGroup( nSplitPartGeoId, WIN_GEO_OUT) - local nGeoIn = EgtGetFirstNameInGroup( nSplitPartGeoId, WIN_GEO_IN) - local nCompoId = EgtCurveCompo( nSelectionLayerId, nGeoOut, false) - EgtAddCurveCompoLine( nCompoId, EgtSP( nGeoIn)) - EgtAddCurveCompoCurve( nCompoId, nGeoIn, false) - EgtCloseCurveCompo( nCompoId) - local nSelectionArea = EgtSurfFlatRegion( nSelectionLayerId, nCompoId) + local nSelectionArea = CreateGeoArea( nSplitPartGeoId, nSelectionLayerId) EgtSetColor( nSelectionArea, 'YELLOW') EgtSetAlpha( nSelectionArea, 10) EgtMove( nSelectionArea, 10 * Z_AX()) From ece4972c283aaafd3686f788cc3e394ad6e29c31 Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 19 Aug 2024 11:27:17 +0200 Subject: [PATCH 4/7] - aggiunta lavorazione per strip e info corrispondente sui profili - aggiunte info CLAMPV per lavorazioni. --- Profiles/Profilo78 - Offset - Copy (49).nge | Bin 0 -> 258478 bytes Profiles/Profilo78 - Offset.nge | Bin 258478 -> 258687 bytes Profiles/WinConst.lua | 6 +++- Profiles/WinLib/WinCalculate.lua | 30 ++++++++++++++++++-- 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 Profiles/Profilo78 - Offset - Copy (49).nge diff --git a/Profiles/Profilo78 - Offset - Copy (49).nge b/Profiles/Profilo78 - Offset - Copy (49).nge new file mode 100644 index 0000000000000000000000000000000000000000..5574fd524bacacb7aaf44d507a066193d7205a42 GIT binary patch literal 258478 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 vTW4b`$VXBwzW89O= z$T2-hhp8C13${DzG8s4kl@;YOmElnqk_S=Nx{j#?i!u{ah!a!SGkviFnilm6t7$N0 zHm{kE#Xx+*=E3Ypz$cqMn4>|4@;5UV31fz($@Ye3=0t0tf=Bz9v3V6{>%slZZw&$W CqkwDx delta 179 zcmezWgn!**{tfrb7?~$OC^MaGwBp! zy4pTQ8?ex`eT;i@8QG^V)?q51E;xZPXZti=CIbhc$njjJvh9I+Omje-ck7r+AkvT4 zGkviFid=sMlumrjWE9KDGJT2%vkTa`7*FPCknE0T<|2stRV~b5_4D^LLoJwefcdQ< E0JtVcPyhe` diff --git a/Profiles/WinConst.lua b/Profiles/WinConst.lua index c133f3c..83f0fe6 100644 --- a/Profiles/WinConst.lua +++ b/Profiles/WinConst.lua @@ -220,6 +220,7 @@ WIN_GAPDELTA = 'GapDelta' WIN_GAPDELTAZ = 'GapDeltaZ' WIN_GAPDELTAIN = 'GapDeltaIn' WIN_GAPDELTAOUT = 'GapDeltaOut' +WIN_STRIP_DIST = 'StripDistance' WIN_PRC_PHASE = 'PHASE' WIN_PRC_PROFILE_TYPE = 'PROFILE_TYPE' @@ -231,6 +232,8 @@ WIN_PRC_OFFY_1 = 'OFFY_1' WIN_PRC_OFFZ_1 = 'OFFZ_1' WIN_PRC_OFFY_2 = 'OFFY_2' WIN_PRC_OFFZ_2 = 'OFFZ_2' +WIN_PRC_CLAMPV_1 = 'CLAMPV_1' +WIN_PRC_CLAMPV_2 = 'CLAMPV_2' WIN_REF_SPLIT = 'RefSplit' WIN_CRV_ON_FRENCH_SPLIT = 'OutlineOnFrenchSplit' @@ -249,7 +252,8 @@ WIN_PRC_TYPE = { HOLE = 'Hole', PROFILING = 'Profiling', POCKET = 'Pocket', - CUT = 'Cut' + CUT = 'Cut', + STRIP_CUT = 'StripCut' } WIN_PRC_OVERMAT_IN = 'OVERMAT_IN' WIN_PRC_OVERMAT_OUT = 'OVERMAT_OUT' diff --git a/Profiles/WinLib/WinCalculate.lua b/Profiles/WinLib/WinCalculate.lua index cd56ea2..18a187e 100644 --- a/Profiles/WinLib/WinCalculate.lua +++ b/Profiles/WinLib/WinCalculate.lua @@ -1043,6 +1043,8 @@ local function CalcFrameProfiles( nPartId, nOutlineId, vPrevOutlineId, vNextOutl CopyInfo( nPartId, nMainProfileId, WIN_PRC_OFFZ_1, 0) CopyInfo( nPartId, nMainProfileId, WIN_PRC_OFFY_2, 0) CopyInfo( nPartId, nMainProfileId, WIN_PRC_OFFZ_2, 0) + CopyInfo( nPartId, nMainProfileId, WIN_PRC_CLAMPV_1, 0) + CopyInfo( nPartId, nMainProfileId, WIN_PRC_CLAMPV_2, 0) return nProfileLayerId end @@ -1171,7 +1173,7 @@ end --------------------------------------------------------------------- -- funzione che calcola le lavorazioni di profiling -local function CalcProfilingProcessings( nPartId, nGeoLayerId) +local function CalcProfilingProcessings( nPartId, nGeoLayerId, nOutlineId, nProfileLayerId) -- creo gruppo delle lavorazioni local nProcGrp = EgtGroup( nPartId) @@ -1203,6 +1205,30 @@ local function CalcProfilingProcessings( nPartId, nGeoLayerId) EgtSetInfo( nCrv, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.CUT) end end + + -- preparo eventuali curve per gli strip + local nProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) + local vStripDist = EgtGetInfo( nProfileId, WIN_STRIP_DIST, 'vi') or {} + local nSurf = GDB_ID.NULL + if #vStripDist > 0 then + nSurf = CreateGeoArea( nGeoLayerId, nProcGrp) + end + for i = 1, #vStripDist do + local nStripCut = EgtCopyGlob( nOutlineId, nProcGrp) + EgtOffsetCurve( nStripCut, - vStripDist[i]) + -- modifico la curva in modo che sia a filo del geo + EgtExtendCurveStartByLen( nStripCut, 1000) + EgtExtendCurveEndByLen( nStripCut, 1000) + nStripCut = EgtTrimCurveWithRegion( nStripCut, nSurf, true, false) + -- aggiusto orientamento per essere coerente con il geo corrispondente + if vStripDist[i] > 0 then + EgtInvertCurve( nStripCut) + end + -- setto info di lavorazione + EgtSetName( nStripCut, WIN_PRC_TYPE.STRIP_CUT) + EgtSetInfo( nStripCut, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.STRIP_CUT) + end + EgtErase( nSurf) end --------------------------------------------------------------------- @@ -1267,7 +1293,7 @@ local function CalcFrameGeo( nPartId, nOutlineId, nOutlineCrvNbr, nOutlineLayerI local nGeoOutId = CreateFrameGeo( nOutlineId, vPrevOutlineId, vNextOutlineId, nStartPartJointType, nEndPartJointType, nGeoLayerId, nProfileLayerId) -- calcolo le lavorazioni associate ai profili - CalcProfilingProcessings( nPartId, nGeoLayerId) + CalcProfilingProcessings( nPartId, nGeoLayerId, nOutlineId, nProfileLayerId) return nGeoOutId end From 9a36037b4c9730581e78c7df9bcc004488c146be Mon Sep 17 00:00:00 2001 From: SaraP Date: Wed, 11 Sep 2024 09:12:32 +0200 Subject: [PATCH 5/7] - cambio profilo ( prima versione). --- Profiles/Profilo78 - Offset - Copy (50).nge | Bin 0 -> 258687 bytes Profiles/Profilo78 - Offset.nge | Bin 258687 -> 342148 bytes Profiles/WinConst.lua | 43 +- Profiles/WinLib/WinCalculate.lua | 1913 ++++++++++++------- 4 files changed, 1287 insertions(+), 669 deletions(-) create mode 100644 Profiles/Profilo78 - Offset - Copy (50).nge diff --git a/Profiles/Profilo78 - Offset - Copy (50).nge b/Profiles/Profilo78 - Offset - Copy (50).nge new file mode 100644 index 0000000000000000000000000000000000000000..1edd6b1239480d9ac6304e12b1ad9609b52d33e6 GIT binary patch literal 258687 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 RJO;Wr-!wR|Lw)!0{{i&)>TUo4 literal 0 HcmV?d00001 diff --git a/Profiles/Profilo78 - Offset.nge b/Profiles/Profilo78 - Offset.nge index 1edd6b1239480d9ac6304e12b1ad9609b52d33e6..aa6055e4d29bc0e4958afbd9e6b8fc5560a9f604 100644 GIT binary patch delta 22512 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 0 and #vSashChildren > 0 then + return WIN_CHILDREN_TYPES.MIXED -- cambio profilo + elseif #vFillChildren > 0 then + return WIN_CHILDREN_TYPES.FILL + elseif #vSashChildren > 0 then + return WIN_CHILDREN_TYPES.SASH + else + return WIN_CHILDREN_TYPES.NULL + end +end + +--------------------------------------------------------------------- +-- funzione che identifica il tipo di split ( null, mullion, french, mixed) local function GetSplitType( nSplitLayerId) local nSplitType = EgtGetInfo( nSplitLayerId, WIN_SPLITTYPE, 'i') @@ -256,23 +331,21 @@ local function GetSplitType( nSplitLayerId) nParentAreaId = EgtGetParent( nParentAreaId) nParentAreaType = EgtGetInfo( nParentAreaId or GDB_ID.NULL, WIN_AREATYPE, 'i') or WIN_AREATYPES.NULL end - -- devi confrontare il type con sash + -- se dentro anta è di tipo null, se non è dentro anta devo verificare le tipologie dei figli if not nParentAreaId or nParentAreaType ~= WIN_AREATYPES.SASH then - -- verifico se ci sono Sash dopo - local nAreaId = EgtGetParent( nSplitLayerId) - local bSashAfter = VerifyChildArea( nAreaId) - -- se ci sono assegno tipo di profilo a mullion - if bSashAfter then - EgtSetInfo( nSplitLayerId, WIN_SPLITTYPE, WIN_SPLITTYPES.MULLION) + local nSplitId = EgtGetFirstInGroup( nSplitLayerId) + local nChildrenType = GetChildrenType( nSplitId) + if nChildrenType == WIN_CHILDREN_TYPES.MIXED then + nSplitType = WIN_SPLITTYPES.MIXED + elseif nChildrenType == WIN_CHILDREN_TYPES.SASH then nSplitType = WIN_SPLITTYPES.MULLION end end end if not nSplitType then - EgtSetInfo( nSplitLayerId, WIN_SPLITTYPE, WIN_SPLITTYPES.NULL) nSplitType = WIN_SPLITTYPES.NULL end - + EgtSetInfo( nSplitLayerId, WIN_SPLITTYPE, nSplitType) return nSplitType end @@ -307,9 +380,27 @@ local function CalcSplitProfileType( nSplitLayerId, nAreaId) if nParentAreaType == WIN_AREATYPES.SASH then EgtSetInfo( nSplitId, WIN_PROFILETYPE, WIN_SASH_SPLIT) else - -- altrimenti vetro fisso EgtSetInfo( nSplitId, WIN_PROFILETYPE, WIN_FRAME_SPLIT) end + + elseif nSplitType == WIN_SPLITTYPES.MIXED then + EgtSetInfo( nSplitId, WIN_PROFILETYPE, WIN_MIXED_SPLIT) + EgtSetInfo( nSplitId, WIN_PRF_CHANGE, true) + + -- verifico se l'orientamento dello split è coerente con il cambio profilo ( vetro fisso a destra e anta a sinistra) : + -- recupero il lato da cui si trova il figlio di tipo anta + local nSashChild = EgtGetInfo( nSplitId, WIN_SASH_CHILDREN, 'i') + local nRefCrv = EgtGetNext( nSashChild) or EgtGetPrev( nSashChild) + local _, _, nSide = EgtPointCurveDistSide( EgtMP( nRefCrv), nSplitId, Z_AX()) + -- se si trova a destra, lo split va invertito + if nSide == 1 then + EgtInvertCurve( nSplitId) + -- scambio le info di intersezione + local vStartInters = EgtGetInfo( nSplitId, WIN_SPLIT_STARTINTERS, 'vi') + local vEndInters = EgtGetInfo( nSplitId, WIN_SPLIT_ENDINTERS, 'vi') + EgtSetInfo( nSplitId, WIN_SPLIT_STARTINTERS, vEndInters) + EgtSetInfo( nSplitId, WIN_SPLIT_ENDINTERS, vStartInters) + end end -- se split di tipo french non ha profilo assegnato perchè non ha un pezzo associato @@ -337,26 +428,6 @@ local function FindAdjacentSashType( nSplitId, nSouId) return nSashType end ---------------------------------------------------------------------- -local function GetSubAreaType( nAreaId) - - local vStack = { nAreaId} - local i = 1 - while vStack[i] do - -- verifico se area è di tipo sash o fill - local nType = EgtGetInfo( vStack[i], WIN_AREATYPE, 'i') - if nType == WIN_AREATYPES.FILL or nType == WIN_AREATYPES.SASH then - return nType - end - -- aggiungo le sue sottoaree ( se esistono) tra gli elementi da analizzare - local vSubAreas = EgtGetNameInGroup( vStack[i], WIN_AREA .. '*') or {} - vStack = EgtJoinTables( vStack, vSubAreas) - -- aggiorno il contatore - i = i + 1 - end - return nil -end - --------------------------------------------------------------------- -- funzione che imposta i tipi di profilo in base al tipo di pezzi local function CalcProfileType( nAreaId) @@ -364,26 +435,36 @@ local function CalcProfileType( nAreaId) -- FRAME if nAreaType == WIN_AREATYPES.FRAME then - -- recupero il tipo delle sottoaree - local nChildType = GetSubAreaType( nAreaId) -- assegno il profilo alle curve di outline local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_AREAOUTLINE) local nOutlineId = EgtGetFirstInGroup( nOutlineLayerId) while nOutlineId do local sName = EgtGetName( nOutlineId) - if not nChildType or nChildType == WIN_AREATYPES.SASH then + -- recupero il tipo dei figli + local nChildrenType = GetChildrenType( nOutlineId) + + if nChildrenType == WIN_CHILDREN_TYPES.NULL or nChildrenType == WIN_CHILDREN_TYPES.SASH then if sName == WIN_BOTTOM then EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_SASH_BOTTOM) else EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_SASH_TOP) end - else -- nChildType == WIN_AREATYPES.FILL + + elseif nChildrenType == WIN_CHILDREN_TYPES.FILL then if sName == WIN_BOTTOM then EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_FIXED_BOTTOM) EgtSetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, true) else EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_FIXED_TOP) end + + elseif nChildrenType == WIN_CHILDREN_TYPES.MIXED then + EgtSetInfo( nOutlineId, WIN_PRF_CHANGE, true) + if sName == WIN_BOTTOM then + EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_MIXED_BOTTOM) + else + EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_MIXED_TOP) + end end nOutlineId = EgtGetNext( nOutlineId) end @@ -456,10 +537,10 @@ local function CalcProfileType( nAreaId) end else local sName = EgtGetName( nOutlineId) - if sName ~= WIN_BOTTOM then - EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_FRAME_TOP) - else + if sName == WIN_BOTTOM then EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_FRAME_BOTTOM) + else + EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_FRAME_TOP) end end nOutlineId = EgtGetNext( nOutlineId) @@ -470,10 +551,10 @@ local function CalcProfileType( nAreaId) local nOutlineId = EgtGetFirstInGroup( nOutlineLayerId) while nOutlineId do local sName = EgtGetName( nOutlineId) - if sName ~= WIN_BOTTOM then - EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_FRAME_TOP) - else + if sName == WIN_BOTTOM then EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_FRAME_BOTTOM) + else + EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_FRAME_TOP) end nOutlineId = EgtGetNext( nOutlineId) end @@ -503,9 +584,10 @@ local function CalculateAreaProfileType( nAreaId) end ---------------------------------------------------------------------- ---------------------- CALCOLO OUTLINE ------------------------------- ---------------------------------------------------------------------- + +---------------------------------------------------------------------------------- +------------------------------ CALCOLO OUTLINE --------------------------------- +---------------------------------------------------------------------------------- -- funzione che calcola l'outline dall'area outline ( base outline) local function CalculateOutlineFromAreaOutline( nAreaId) @@ -551,8 +633,8 @@ local function CalculateOutlineFromAreaOutline( nAreaId) local nSouId = EgtGetInfo( nBaseOutlineId, WIN_SOU, 'i') local nCopyId = EgtGetInfo( nSouId, WIN_COPY, 'i') local nOutlineId = EgtCopy( nCopyId, nOutlineLayerId) - - -- se deriva da split devo aggiornare il nome + + -- se deriva da split devo aggiornare il nome e setto il riferimento local sSouName = EgtGetName( nSouId) if sSouName == WIN_SPLIT then local sBaseName = EgtGetName( nBaseOutlineId) @@ -564,7 +646,7 @@ local function CalculateOutlineFromAreaOutline( nAreaId) EgtSetInfo( nOutlineId, WIN_COPY, nBaseOutlineId) EgtSetInfo( nBaseOutlineId, WIN_COPY, nOutlineId) EgtRemoveInfo( nOutlineId, WIN_CHILD) - + nBaseOutlineId = EgtGetNext( nBaseOutlineId) end -- taglio tutti i contorni @@ -604,6 +686,11 @@ local function CalculateOutlineFromAreaOutline( nAreaId) -- recupero se anta battente ricevente local nSashType = EgtGetInfo( nAreaId, WIN_SASHTYPE, 'i') or WIN_SASHTYPES.NULL + -- recupero gruppo profili anta e telaio + local nProfileLayerId = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_PROFILE) + local nSashProfileLayerId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_SASH) + local nFrameProfileLayerId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_FRAME) + -- ciclo su profilo disegnato anta local nBaseOutlineId = EgtGetFirstInGroup( nAreaOutlineLayerId) while nBaseOutlineId do @@ -612,11 +699,8 @@ local function CalculateOutlineFromAreaOutline( nAreaId) local nCopyId = EgtGetInfo( nSouId, WIN_COPY, 'i') local nOutlineId = EgtCopy( nCopyId, nOutlineLayerId) - -- recupero tipo di profili anta + -- recupero profilo local sSashProfile = EgtGetInfo( nBaseOutlineId, WIN_PROFILETYPE) - -- recupero profilo usato per anta - local nProfileLayerId = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_PROFILE) - local nSashProfileLayerId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_SASH) local nSashProfileId = EgtGetFirstNameInGroup( nSashProfileLayerId, sSashProfile) -- calcolo offset sulla z dell'anta @@ -629,6 +713,8 @@ local function CalculateOutlineFromAreaOutline( nAreaId) EgtSetInfo( nBaseOutlineId, WIN_COPY, nOutlineId) EgtSetInfo( nOutlineId, WIN_COPY, nBaseOutlineId) EgtSetInfo( nOutlineId, WIN_PROFILETYPE, sSashProfile) + EgtRemoveInfo( nOutlineId, WIN_PRF_CHANGE) + EgtRemoveInfo( nOutlineId, WIN_REF_SPLIT) -- verifico se outline e' segmento battente o ricevente ( che quindi deriva da split di tipo french) local bOnFrenchSplit = EgtGetInfo( nBaseOutlineId, WIN_CRV_ON_FRENCH_SPLIT, 'b') or false @@ -643,13 +729,13 @@ local function CalculateOutlineFromAreaOutline( nAreaId) nFrameBaseOutlineId = EgtGetInfo( nFrameBaseOutlineId, WIN_SOU , 'i') sFrameProfile = EgtGetInfo( nFrameBaseOutlineId or GDB_ID.NULL, WIN_PROFILETYPE) end - local nFrameProfileLayerId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_FRAME) local nFrameProfileId = EgtGetFirstNameInGroup( nFrameProfileLayerId, sFrameProfile) -- calcolo il box del riferimento del profilo del frame local b3FrameProfile = GetProfileLocalBox( nFrameProfileId) -- calcolo offset perpendicolare - local dOverlap = EgtGetInfo( nSashProfileId, WIN_OVERLAP, 'd') + local sOverlapInfo = EgtIf( EgtGetName( nOutlineId) == WIN_BOTTOM, WIN_SASH_BOTTOM_OVERLAP, WIN_SASH_TOP_OVERLAP) + local dOverlap = EgtGetInfo( nFrameProfileId, sOverlapInfo, 'd') local dSashPerpOffset = abs( b3FrameProfile:getMin():getX()) - dOverlap -- faccio offset @@ -678,9 +764,7 @@ local function CalculateOutlineFromAreaOutline( nAreaId) -- recupero profilo usato per anta local sSplitProfile = EgtGetInfo( nBaseSplitId, WIN_PROFILETYPE) - local nProfileLayerId = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_PROFILE) - local nSplitProfileLayerId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_SASH) - local nSplitProfileId = EgtGetFirstNameInGroup( nSplitProfileLayerId, sSplitProfile) + local nSplitProfileId = EgtGetFirstNameInGroup( nSashProfileLayerId, sSplitProfile) -- calcolo offset sulla z dell'anta local dSplitZOffset = EgtGetInfo( nSplitProfileId, WIN_DELTA, 'd') -- sposto split in Z @@ -745,44 +829,9 @@ end ---------------------------------------------------------------------- ----------------------- CALCOLO PEZZI ------------------------------ ---------------------------------------------------------------------- --- funzione che calcola l'ingombro del fill -local function CalcFillGeo( nPartId, nOutlineLayerId) - -- creo layer per ingombro - local nGeoLayerId = EgtGroup( nPartId) - EgtSetName( nGeoLayerId, WIN_GEO) - -- copio lati da Outline - local nOutlineId = EgtGetFirstInGroup( nOutlineLayerId) - while nOutlineId do - EgtCopy( nOutlineId, nGeoLayerId) - nOutlineId = EgtGetNext( nOutlineId) - end - -- recupero e salvo spessore vetro - local nProfileLayerId = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_PROFILE) - local nSashProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_SASH) - local dGlassThickness = EgtGetInfo( nSashProfileId, WIN_GLASSTHICKNESS, 'd') - EgtSetInfo( nGeoLayerId, WIN_GEOWIDTH, dGlassThickness) - return nGeoLayerId -end - ---------------------------------------------------------------------- --- funzione che crea il solido del Fill -local function CalcFillSolid( nPartId, nOutlineLayerId, nGeoLayerId) - -- creo layer per solido - local nSolidLayerId = EgtGroup( nPartId) - EgtSetName( nSolidLayerId, WIN_SOLID) - -- creo compo di outline - local vOutlineList = EgtGetAllInGroup( nOutlineLayerId) - local nCompoOutlineId = EgtCurveCompoByChain( nSolidLayerId, vOutlineList, EgtSP( vOutlineList[1]), false) - -- recupero spessore vetro - local dGlassThickness = EgtGetInfo( nGeoLayerId, WIN_GEOWIDTH, 'd') - local nSurfId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nCompoOutlineId, Z_AX() * dGlassThickness) - EgtErase( nCompoOutlineId) -end - --------------------------------------------------------------------- +---------------------------------------------------------------------------------- +------------------------ FUNZIONI AUX PER CALCOLO PEZZI ------------------------ +---------------------------------------------------------------------------------- -- funzione che restituisce il WIN_PRF in base al nome della curva local function GetOutlineProfileType( nOutlineId, bBottomRail) -- ricavo tipo dal nome @@ -857,10 +906,6 @@ local function GetSplitOtherOutline( nSplitId, nSurfSplit, nOutlineId, bPrevOrNe else vOutlineIds = { nOutlineId, nCrv} end - - -- aggiorno le info di intersezione dello split per non dover ripetere questo calcolo nelle future chiamate a GetPrevNextOutline - local vBaseOutlineId = { EgtGetInfo( vOutlineIds[1], WIN_COPY, 'i'), EgtGetInfo( vOutlineIds[2], WIN_COPY, 'i')} - EgtSetInfo( nSplitId, EgtIf( bPrevOrNext, WIN_SPLIT_STARTINTERS, WIN_SPLIT_ENDINTERS), vBaseOutlineId) end EgtErase( nCompoTest) @@ -930,22 +975,29 @@ end -- funzione che restituisce il tipo di controprofilo dell'outline adiacente local function GetProfileCtrIn( nPrevOutlineId, nOutlineId, nPrevProfileId) local sPrevCtrIn = WIN_CTRIN - -- gestione particolare del caso di profilo di split + -- gestione particolare del caso di split o cambio profilo if not EgtGetFirstNameInGroup( nPrevProfileId, sPrevCtrIn) then - -- recupero la curva di base outline da cui deriva il precedente e cerco lo split originale da cui deriva - local nPrevSouId = EgtGetInfo( nPrevOutlineId, WIN_COPY, 'i') - local sPrevSouName = EgtGetName( nPrevSouId) - while nPrevSouId and sPrevSouName ~= WIN_SPLIT do - nPrevSouId = EgtGetInfo( nPrevSouId, WIN_SOU, 'i') - sPrevSouName = EgtGetName( nPrevSouId or GDB_ID.NULL) - end - - -- verifico da quale lato si trova la curva per decidere quale controprofilo considerare - local _, _, nSide = EgtPointCurveDistSide( EgtMP( nOutlineId), nPrevSouId, Z_AX()) - if nSide == 1 then - sPrevCtrIn = WIN_CTRIN .. '1' -- dx + + local nRefSplitId = EgtGetInfo( nPrevOutlineId, WIN_REF_SPLIT, 'i') + if nRefSplitId or EgtGetName( nPrevOutlineId) == WIN_SPLIT then + -- 1) split + -- verifico da quale lato dello split originale si trova l'outline per decidere quale controprofilo considerare + local _, _, nSide = EgtPointCurveDistSide( EgtMP( nOutlineId), nRefSplitId or nPrevOutlineId, Z_AX()) + if nSide == 1 then + sPrevCtrIn = WIN_CTRIN .. '1' -- dx + else + sPrevCtrIn = WIN_CTRIN .. '2' -- sx + end else - sPrevCtrIn = WIN_CTRIN .. '2' -- sx + -- 2) pezzo del telaio con cambio profilo + -- il profilo da usare dipende dal pezzo corrente: se ha figli di tipo fill allora è legato alla parte fill del cambio profilo, se ha figli di tipo sash è legato alla parte sash, + -- se ha entrambe le tipologie di figli allora è mixed split e conviene considerare parte sash perchè ha DeltaCP minore + local vSashChildren = EgtGetInfo( nOutlineId, WIN_SASH_CHILDREN, 'vi') + if vSashChildren then + sPrevCtrIn = WIN_SASH .. WIN_CTRIN + else + sPrevCtrIn = WIN_FILL .. WIN_CTRIN + end end end @@ -977,9 +1029,11 @@ local function CreateGeoArea( nGeoLayId, nDestLayId) return nArea end ---------------------------------------------------------------------- ---------------------------- GEO ----------------------------------- ---------------------------------------------------------------------- + + +---------------------------------------------------------------------------------- +-------------------------------- GEO ------------------------------------------- +---------------------------------------------------------------------------------- -- funzione che dato il tipo di pezzo e di giunzione, restituisce se e' corto, lungo o angolato local function CalcPartJointType( nProfileType, JointType) @@ -1019,9 +1073,9 @@ local function CalcFrameProfiles( nPartId, nOutlineId, vPrevOutlineId, vNextOutl EgtSetInfo( nMainProfileId, WIN_PRF_TYPE, sMainProfileType) EgtSetName( nMainProfileId, WIN_PRF_MAIN) - -- recupero controprofili start e ne creo copia + -- recupero profili start e ne creo copia + -- se il tipo corrente è split il pezzo va tagliato con il bottomrail, altrimenti con il bottom for i = 1, #vPrevOutlineId do - -- se il tipo corrente è split il pezzo va tagliato con il bottomrail, altrimenti con il bottom local nOrigStartProfileId = GetOutlineProfileId( vPrevOutlineId[i], nProfileType == WIN_PRF.SPLIT) local nStartProfileId = EgtCopy( nOrigStartProfileId, nProfileLayerId) local sStartProfileType = EgtGetName( nStartProfileId) @@ -1029,7 +1083,7 @@ local function CalcFrameProfiles( nPartId, nOutlineId, vPrevOutlineId, vNextOutl EgtSetName( nStartProfileId, WIN_PRF_START) end - -- recupero controprofili end e ne creo copia + -- recupero profili end e ne creo copia for i = 1, #vNextOutlineId do local nOrigEndProfileId = GetOutlineProfileId( vNextOutlineId[i], nProfileType == WIN_PRF.SPLIT) local nEndProfileId = EgtCopy( nOrigEndProfileId, nProfileLayerId) @@ -1087,12 +1141,11 @@ local function CreateFrameGeo( nOutlineId, vPrevOutlineId, vNextOutlineId, nStar EgtOffsetCurve( nCurrOffsetId, dCurrOffset - b3CurrProfileFrame:getDimX()) EgtInvertCurve( nCurrOffsetId) EgtSetName( nCurrOffsetId, WIN_GEO_IN) - local nSemiProfileIn = EgtGetFirstNameInGroup( nCurrProfileId, WIN_IN) or EgtGetFirstNameInGroup( nCurrProfileId, WIN_IN .. '2') + local nSemiProfileIn = EgtGetFirstNameInGroup( nCurrProfileId, WIN_IN) or EgtGetFirstNameInGroup( nCurrProfileId, WIN_IN .. '2') or EgtGetFirstNameInGroup( nCurrProfileId, WIN_MIXED_COMMON .. WIN_IN) EgtSetInfo( nCurrOffsetId, WIN_SEMI_PROFILE, nSemiProfileIn) -- curve left local vPrevProfileId = EgtGetNameInGroup( nProfileLayerId, WIN_PRF_START) - local vStartCPDelta = {} for i = 1, #vPrevOutlineId do local nPrevCurveId local nPrevSemiProfile @@ -1103,32 +1156,28 @@ local function CreateFrameGeo( nOutlineId, vPrevOutlineId, vNextOutlineId, nStar vtMedia = EgtSV( nOutlineId) vtMedia:rotate( Z_AX(), 90) end - table.insert( vStartCPDelta, 0) nPrevCurveId = EgtLinePVL( nGeoLayerId, EgtSP( nOutlineId), vtMedia, 3 * b3CurrProfileFrame:getDimX()) EgtInvertCurve( nPrevCurveId) else nPrevCurveId = EgtCopy( vPrevOutlineId[i], nGeoLayerId) if nStartPartJointType == WIN_PART_JNT.SHORT then local sCtrIn = GetProfileCtrIn( vPrevOutlineId[i], nOutlineId, vPrevProfileId[i]) - local dPrevCPDelta = GetDeltaProfile( vPrevProfileId[i], sCtrIn) - EgtOffsetCurve( nPrevCurveId, - dPrevCPDelta) - table.insert( vStartCPDelta, dPrevCPDelta) + local dCPDelta = GetDeltaProfile( vPrevProfileId[i], sCtrIn) + EgtOffsetCurve( nPrevCurveId, - dCPDelta) -- ricavo il semiprofilo associato nPrevSemiProfile = EgtGetFirstNameInGroup( vPrevProfileId[i], sCtrIn) else - table.insert( vStartCPDelta, 0) nPrevSemiProfile = EgtGetFirstNameInGroup( vPrevProfileId[i], WIN_OUT) end end EgtSetName( nPrevCurveId, WIN_GEO_LEFT) EgtSetInfo( nPrevCurveId, WIN_SEMI_PROFILE, nPrevSemiProfile) + EgtSetInfo( nPrevCurveId, WIN_REF_OUTLINE, vPrevOutlineId[i]) EgtRelocateGlob( nPrevCurveId, nGeoLayerId, GDB_IN.LAST_SON) end - EgtSetInfo( nGeoLayerId, WIN_STARTCPDELTA, vStartCPDelta) - + -- curve right local vNextProfileId = EgtGetNameInGroup( nProfileLayerId, WIN_PRF_END) - local vNextCPDelta = {} for i = 1, #vNextOutlineId do local nNextCurveId local nNextSemiProfile @@ -1137,98 +1186,34 @@ local function CreateFrameGeo( nOutlineId, vPrevOutlineId, vNextOutlineId, nStar local vtMedia = ( ( EgtSV( vNextOutlineId[i]) - EgtEV( nOutlineId)) / 2) if not vtMedia:normalize() then vtMedia = EgtEV( nOutlineId) - vtMedia:rotate(Z_AX(), 90) + vtMedia:rotate( Z_AX(), 90) end - table.insert( vNextCPDelta, 0) nNextCurveId = EgtLinePVL( nGeoLayerId, EgtEP( nOutlineId), vtMedia, 3 * b3CurrProfileFrame:getDimX()) else nNextCurveId = EgtCopy( vNextOutlineId[i], nGeoLayerId) if nEndPartJointType == WIN_PART_JNT.SHORT then local sCtrIn = GetProfileCtrIn( vNextOutlineId[i], nOutlineId, vNextProfileId[i]) - local dNextCPDelta = GetDeltaProfile( vNextProfileId[i], sCtrIn) - EgtOffsetCurve( nNextCurveId, - dNextCPDelta) - table.insert( vNextCPDelta, dNextCPDelta) + local dCPDelta = GetDeltaProfile( vNextProfileId[i], sCtrIn) + EgtOffsetCurve( nNextCurveId, - dCPDelta) -- ricavo il semiprofilo associato nNextSemiProfile = EgtGetFirstNameInGroup( vNextProfileId[i], sCtrIn) else - table.insert( vNextCPDelta, 0) nNextSemiProfile = EgtGetFirstNameInGroup( vNextProfileId[i], WIN_OUT) end end EgtSetName( nNextCurveId, WIN_GEO_RIGHT) EgtSetInfo( nNextCurveId, WIN_SEMI_PROFILE, nNextSemiProfile) + EgtSetInfo( nNextCurveId, WIN_REF_OUTLINE, vNextOutlineId[i]) EgtRelocateGlob( nNextCurveId, nCurrOffsetId, GDB_IN.BEFORE) - end - EgtSetInfo( nGeoLayerId, WIN_ENDCPDELTA, vNextCPDelta) + end -- trim delle curve TrimAndOrientOrderedCurveLayer( nGeoLayerId, false) - -- salvo spessore serramento nella curva out + -- salvo spessore serramento nel gruppo local dGeoWidth = b3CurrProfileFrame:getDimX() - EgtSetInfo( nCurrCurveId, WIN_GEOWIDTH, dGeoWidth) + EgtSetInfo( nGeoLayerId, WIN_GEOWIDTH, dGeoWidth) - return nCurrCurveId -end - ---------------------------------------------------------------------- --- funzione che calcola le lavorazioni di profiling -local function CalcProfilingProcessings( nPartId, nGeoLayerId, nOutlineId, nProfileLayerId) - - -- creo gruppo delle lavorazioni - local nProcGrp = EgtGroup( nPartId) - EgtSetName( nProcGrp, WIN_PRC) - EgtSetStatus( nProcGrp, GDB_ST.OFF) - -- recupero tutte le curve del geo - local vGeoCrvs = EgtGetAllInGroup( nGeoLayerId) - for i = 1, #vGeoCrvs do - -- copio curva - local nCrv = EgtCopyGlob( vGeoCrvs[i], nProcGrp) - - -- recupero il semiprofilo associato - local nSemiProfile = EgtGetInfo( nCrv, WIN_SEMI_PROFILE, 'i') - if nSemiProfile then - -- setto info di lavorazione - EgtSetInfo( nCrv, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.PROFILING) - -- recupero le info di lavorazione dal semiprofilo - CopyInfo( nCrv, nSemiProfile, WIN_PRC_PHASE) - CopyInfo( nCrv, nSemiProfile, WIN_PRC_PROFILE_TYPE) - local nTools = EgtGetInfo( nSemiProfile, WIN_PRC_NTOOLS , 'i') or 0 - EgtSetInfo( nCrv, WIN_PRC_NTOOLS, nTools) - for j = 1, nTools do - CopyInfo( nCrv, nSemiProfile, WIN_PRC_TOOL_NAME .. '_' .. tostring(j)) - CopyInfo( nCrv, nSemiProfile, WIN_PRC_OFFL .. '_' .. tostring(j)) - CopyInfo( nCrv, nSemiProfile, WIN_PRC_OFFR .. '_' .. tostring(j)) - end - else - -- se non ha semiprofilo associato è un taglio - EgtSetInfo( nCrv, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.CUT) - end - end - - -- preparo eventuali curve per gli strip - local nProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) - local vStripDist = EgtGetInfo( nProfileId, WIN_STRIP_DIST, 'vi') or {} - local nSurf = GDB_ID.NULL - if #vStripDist > 0 then - nSurf = CreateGeoArea( nGeoLayerId, nProcGrp) - end - for i = 1, #vStripDist do - local nStripCut = EgtCopyGlob( nOutlineId, nProcGrp) - EgtOffsetCurve( nStripCut, - vStripDist[i]) - -- modifico la curva in modo che sia a filo del geo - EgtExtendCurveStartByLen( nStripCut, 1000) - EgtExtendCurveEndByLen( nStripCut, 1000) - nStripCut = EgtTrimCurveWithRegion( nStripCut, nSurf, true, false) - -- aggiusto orientamento per essere coerente con il geo corrispondente - if vStripDist[i] > 0 then - EgtInvertCurve( nStripCut) - end - -- setto info di lavorazione - EgtSetName( nStripCut, WIN_PRC_TYPE.STRIP_CUT) - EgtSetInfo( nStripCut, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.STRIP_CUT) - end - EgtErase( nSurf) end --------------------------------------------------------------------- @@ -1241,6 +1226,8 @@ local function CalcFrameGeo( nPartId, nOutlineId, nOutlineCrvNbr, nOutlineLayerI -- recupero outline precedenti e successivi ( solo nel caso di split possono essere più di uno) local vPrevOutlineId, vNextOutlineId = GetPrevNextOutline( nProfileType, nOutlineId, nOutlineLayerId) + EgtSetInfo( nOutlineId, WIN_PREV_OUTLINES, vPrevOutlineId) + EgtSetInfo( nOutlineId, WIN_NEXT_OUTLINES, vNextOutlineId) -- recupero il tipo di giunzioni local nStartJointType @@ -1279,30 +1266,842 @@ local function CalcFrameGeo( nPartId, nOutlineId, nOutlineCrvNbr, nOutlineLayerI local nStartPartJointType = CalcPartJointType( nProfileTypeS, nStartJointType) local nEndPartJointType = CalcPartJointType( nProfileTypeE, nEndJointType) - -- salvo i valori joint su outline per disegno solido e calcolo dowels + -- salvo il valore di start joint su outline per calcolo dowels -- se bottomrail è sicuramente short quindi non salvo il valore che sovrascriverebbe quello del pezzo bottom ( che potrebbe essere short o full) if nProfileType ~= WIN_PRF.BOTTOMRAIL then EgtSetInfo( nOutlineId, WIN_STARTJOINT, nStartPartJointType) - EgtSetInfo( nOutlineId, WIN_ENDJOINT, nEndPartJointType) end -- creo il gruppo con i profili del pezzo local nProfileLayerId = CalcFrameProfiles( nPartId, nOutlineId, vPrevOutlineId, vNextOutlineId, nProfileType) -- creo lati dell'outline - local nGeoOutId = CreateFrameGeo( nOutlineId, vPrevOutlineId, vNextOutlineId, nStartPartJointType, nEndPartJointType, nGeoLayerId, nProfileLayerId) + CreateFrameGeo( nOutlineId, vPrevOutlineId, vNextOutlineId, nStartPartJointType, nEndPartJointType, nGeoLayerId, nProfileLayerId) - -- calcolo le lavorazioni associate ai profili - CalcProfilingProcessings( nPartId, nGeoLayerId, nOutlineId, nProfileLayerId) +end - return nGeoOutId +--------------------------------------------------------------------- +-- funzione che calcola l'ingombro del fill +local function CalcFillGeo( nPartId, nOutlineLayerId) + -- creo layer per ingombro + local nGeoLayerId = EgtGroup( nPartId) + EgtSetName( nGeoLayerId, WIN_GEO) + -- copio lati da Outline + local nOutlineId = EgtGetFirstInGroup( nOutlineLayerId) + while nOutlineId do + EgtCopy( nOutlineId, nGeoLayerId) + nOutlineId = EgtGetNext( nOutlineId) + end + -- recupero e salvo spessore vetro + local nProfileLayerId = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_PROFILE) + local nSashProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_SASH) + local dGlassThickness = EgtGetInfo( nSashProfileId, WIN_GLASSTHICKNESS, 'd') + EgtSetInfo( nGeoLayerId, WIN_GEOWIDTH, dGlassThickness) + return nGeoLayerId end ---------------------------------------------------------------------------------- + +---------------------------------------------------------------------------------- +----------------------- CURVE AUX PER CAMBIO PROFILO ----------------------------- +---------------------------------------------------------------------------------- +-- funzione che individua e crea i diversi tratti uniformi della curva di outline +local function CalcMixedOutlines( nPartId, nOutlineId) + + -- creo gruppo dove salvare i sottotratti + local nGrp = EgtGroup( nPartId) + EgtSetName( nGrp, WIN_MIXED_OUTLINES) + EgtSetStatus( nGrp, GDB_ST.OFF) + + -- recupero i tratti di tipo sash e li concateno + local vSashChildren = EgtGetInfo( nOutlineId, WIN_SASH_CHILDREN, 'vi') + local vSash = {} + for i = 1, #vSashChildren do + local nCrv = EgtCopyGlob( vSashChildren[i], nGrp) + table.insert( vSash, nCrv) + end + local nCrvS, nCntS = EgtCurveCompoByReorder( nGrp, vSash, EgtSP( nOutlineId)) + for nId = nCrvS, nCrvS + nCntS - 1 do + EgtSetName( nId, WIN_SASH) + end + + -- recupero i tratti di tipo fill e li concateno + local vFillChildren = EgtGetInfo( nOutlineId, WIN_FILL_CHILDREN, 'vi') + local vFill = {} + for i = 1, #vFillChildren do + local nCrv = EgtCopyGlob( vFillChildren[i], nGrp) + table.insert( vFill, nCrv) + end + local nCrvF, nCntF = EgtCurveCompoByReorder( nGrp, vFill, EgtSP( nOutlineId)) + for nId = nCrvF, nCrvF + nCntF - 1 do + EgtSetName( nId, WIN_FILL) + end + + -- riordino le curve nel gruppo per ricostruire l'outline + EgtReorderCurvesInGroup( nGrp, EgtSP( nOutlineId)) + + -- creo associazione tra le sottocurve di outline e gli split che le separano : + -- recupero tutti gli split coinvolti + local nBaseOutline = EgtGetInfo( nOutlineId, WIN_COPY, 'i') + local vStack = { nBaseOutline} + local vSplitIds = {} + local i = 1 + while vStack[i] do + -- recupero il tipo di area + local nAreaId = EgtGetParent( EgtGetParent( vStack[i])) + local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i') + if nAreaType ~= WIN_AREATYPES.SASH and nAreaType ~= WIN_AREATYPES.FILL then + -- salvo il suo eventuale split + local nSplitLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_SPLIT) + if nSplitLayerId then + local nSplitId = EgtGetFirstInGroup( nSplitLayerId) + table.insert( vSplitIds, nSplitId) + end + -- analizzo eventuali figli + local vChildren = EgtGetInfo( vStack[i], WIN_CHILD, 'vi') or {} + vStack = EgtJoinTables( vStack, vChildren) + end + i = i + 1 + end + + -- associo le curve con lo split che le taglia nel loro punto finale + local vCrvs = EgtGetAllInGroup( nGrp) + for i = 1, #vSplitIds do + local ptS = EgtSP( vSplitIds[i]) + local ptE = EgtEP( vSplitIds[i]) + for j = 1, #vCrvs - 1 do + local ptTest = EgtEP( vCrvs[j]) + if AreSamePointApprox( ptS, ptTest) then + EgtSetInfo( vSplitIds[i], WIN_MIXED_REF_START, vCrvs[j]) + EgtSetInfo( vCrvs[j], WIN_MIXED_SPLIT_REF, vSplitIds[i]) + break + elseif AreSamePointApprox( ptE, ptTest) then + EgtSetInfo( vSplitIds[i], WIN_MIXED_REF_END, vCrvs[j]) + EgtSetInfo( vCrvs[j], WIN_MIXED_SPLIT_REF, vSplitIds[i]) + break + end + end + end + + return nGrp +end + +--------------------------------------------------------------------- +-- funzione che crea la curva di lavorazione sulla giunzione tra il pezzo di split e il pezzo di telaio con cambio profilo +local function CalcMixedIntersections( nPartId, nOutline, vOutlines) + + local nGrp = EgtGroup( nPartId) + EgtSetName( nGrp, WIN_MIXED_INTERSECTIONS) + EgtSetStatus( nGrp, GDB_ST.OFF) + + -- recupero il profilo dell'outline + local nProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) + local nMainProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) + + for i = 1, #vOutlines - 1 do + + -- recupero la curva di split che separa i due tratti di outline + local nSplitId = EgtGetInfo( vOutlines[i], WIN_MIXED_SPLIT_REF, 'i') + local nSplitProfileId = GetOutlineProfileId( nSplitId, false) + + -- verifico ordinamento + local bSashFill = ( EgtGetName( vOutlines[i]) == WIN_SASH) + + -- ricavo il punto di incontro tra le due parti dei profili che vanno contro il vetro + local nCrv1 = EgtCopyGlob( nSplitId, nGrp) + local dDeltaFixedSplit = EgtGetInfo( nSplitProfileId, WIN_FIXED_REF, 'd') + EgtOffsetCurve( nCrv1, dDeltaFixedSplit) + local nCrv2 = EgtCopyGlob( nOutline, nGrp) + local dDeltaFixedFrame = EgtGetInfo( nMainProfileId, WIN_FIXED_REF, 'd') + EgtOffsetCurve( nCrv2, - dDeltaFixedFrame) + local ptRef1 = EgtIP( nCrv1, nCrv2, ORIG()) + + -- ricavo il punto di incontro tra il taglio a 45° e la parte del telaio contro anta + -- TO DO : capire come gestire correttamente la rotazione nel caso di arco + local dParRef = EgtCurveParamAtPoint( nCrv2, ptRef1) + local vtDir45 = EgtUV( nCrv2, dParRef, -1) + vtDir45:rotate( Z_AX(), EgtIf( bSashFill, 225, -45)) + local nCrv3 = EgtLinePVL( nGrp, ptRef1, vtDir45, 100) + local nCrv4 = EgtCopyGlob( nOutline, nGrp) + local dDeltaSashFrame = EgtGetInfo( nMainProfileId, WIN_SASH_REF, 'd') + EgtOffsetCurve( nCrv4, - dDeltaSashFrame) + local ptRef2 = EgtIP( nCrv3, nCrv4, ORIG()) + + -- ricavo il punto finale del tratto del telaio contro anta + local nCrv5 = EgtCopyGlob( nSplitId, nGrp) + local dSizeSplit = EgtGetInfo( nSplitProfileId, WIN_SASH_REF, 'd') + EgtOffsetCurve( nCrv5, - dSizeSplit) + local ptRef3 = EgtIP( nCrv4, nCrv5, ORIG()) + + -- creo la curva di intersezione : + -- a) taglio a 45° + local nCrv = EgtCurveCompoFromPoints( nGrp, { ptRef1, ptRef2}) + -- b) tratto lungo il telaio + if bSashFill then + EgtInvertCurve( nCrv4) + end + local dParS = EgtCurveParamAtPoint( nCrv4, ptRef2) + local dParE = EgtCurveParamAtPoint( nCrv4, ptRef3) + EgtTrimCurveStartEndAtParam( nCrv4, dParS, dParE) + + -- c) fillet + local dFillet = 0 -- EgtGetInfo( nSplitProfileId, WIN_MIXED_FILLET, 'd') + local nFillet = EgtCurveFillet( nGrp, nCrv, EgtMP( nCrv), nCrv4, EgtMP( nCrv4), dFillet, true) or GDB_ID.NULL + EgtAddCurveCompoCurve( nCrv, nFillet) + EgtAddCurveCompoCurve( nCrv, nCrv4) + + -- d) tratto lungo split + if not EgtCurveParamAtPoint( nOutline, EgtSP( nSplitId)) then + EgtInvertCurve( nCrv5) + end + local dPar = EgtCurveParamAtPoint( nCrv5, ptRef3) + EgtTrimCurveStartAtParam( nCrv5, dPar) + EgtTrimCurveEndAtLen( nCrv5, 100) + EgtAddCurveCompoCurve( nCrv, nCrv5) + + -- cancello curve di costruzione + EgtErase( { nCrv1, nCrv2, nCrv3, nCrv4, nCrv5}) + + -- assegno riferimento + EgtSetInfo( vOutlines[i], WIN_MIXED_INTERS_REF, nCrv) + + end +end + +--------------------------------------------------------------------- +-- funzione che calcola curve ausiliarie per la gestione del cambio profilo +local function CalcMixedFrameCurves( nPartId, nOutlineId) + -- calcolo i sottotratti uniformi della curva di outline + local nOutlinesGrp = CalcMixedOutlines( nPartId, nOutlineId) + local vCrvs = EgtGetAllInGroup( nOutlinesGrp) + -- calcolo le curve di intersezione con gli split + CalcMixedIntersections( nPartId, nOutlineId, vCrvs) +end + + + +---------------------------------------------------------------------------------- +--------------------------- PROFILING PROCESSINGS -------------------------------- +---------------------------------------------------------------------------------- +-- funzione che copia sulla curva di lavorazione le informazioni prese dal semiprofilo corrispondente +local function GetProcessingInfoFromSemiProfile( nCrv, nSemiProfile) + + if nSemiProfile then + -- setto info di lavorazione + EgtSetInfo( nCrv, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.PROFILING) + -- recupero le info di lavorazione dal semiprofilo + CopyInfo( nCrv, nSemiProfile, WIN_PRC_PHASE) + CopyInfo( nCrv, nSemiProfile, WIN_PRC_PROFILE_TYPE) + local nTools = EgtGetInfo( nSemiProfile, WIN_PRC_NTOOLS , 'i') or 0 + EgtSetInfo( nCrv, WIN_PRC_NTOOLS, nTools) + for j = 1, nTools do + CopyInfo( nCrv, nSemiProfile, WIN_PRC_TOOL_NAME .. '_' .. tostring(j)) + CopyInfo( nCrv, nSemiProfile, WIN_PRC_OFFL .. '_' .. tostring(j)) + CopyInfo( nCrv, nSemiProfile, WIN_PRC_OFFR .. '_' .. tostring(j)) + end + else + -- se non ha semiprofilo associato è un taglio + EgtSetInfo( nCrv, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.CUT) + end +end + +--------------------------------------------------------------------- +-- funzione che calcola le lavorazioni di profiling per un pezzo di telaio con cambio profilo +local function CalcMixedFrameProfilingProcessings( nPartId, nProcLayerId, nGeoLayerId, nMainProfileId, nSurfGeoId) + + -- per le lavorazioni dei profili out, left, right e in comune uso le corrispondenti curve del geo + local vGeoCrvs = EgtGetAllInGroup( nGeoLayerId) + for i = 1, #vGeoCrvs do + -- copio curva + local nCrv = EgtCopyGlob( vGeoCrvs[i], nProcLayerId) + -- recupero il semiprofilo associato + local nSemiProfile = EgtGetInfo( nCrv, WIN_SEMI_PROFILE, 'i') + GetProcessingInfoFromSemiProfile( nCrv, nSemiProfile) + end + + -- lavorazione dei sottotratti in di sash e fill + local nOutlinesGrp = EgtGetFirstNameInGroup( nPartId, WIN_MIXED_OUTLINES) + local vCrvs = EgtGetAllInGroup( nOutlinesGrp) + local b3Profile = GetProfileLocalBox( nMainProfileId) + local dOffs = b3Profile:getMin():getX() + for i = #vCrvs, 1, -1 do + -- calcolo la curva di lavorazione + local nCrv = EgtCopyGlob( vCrvs[i], nProcLayerId) + EgtSetName( nCrv, WIN_GEO_IN) + EgtOffsetCurve( nCrv, dOffs) + EgtInvertCurve( nCrv) + nCrv = EgtTrimCurveWithRegion( nCrv, nSurfGeoId, true, true) + -- setto le info di lavorazione + local nSemiProfile = EgtGetFirstNameInGroup( nMainProfileId, EgtGetName( vCrvs[i]) .. WIN_IN) + GetProcessingInfoFromSemiProfile( nCrv, nSemiProfile) + end + + -- lavorazioni sulle intersezioni con gli split + local nIntersGrp = EgtGetFirstNameInGroup( nPartId, WIN_MIXED_INTERSECTIONS) + local vInters = EgtGetAllInGroup( nIntersGrp) + local dDepth = EgtGetInfo( nMainProfileId, WIN_MIXED_DEPTH, 'd') + for i = 1, #vInters do + local nCrv = EgtCopyGlob( vInters[i], nProcLayerId) + EgtSetName( nCrv, WIN_GEO_IN) + nCrv = EgtTrimCurveWithRegion( nCrv, nSurfGeoId, true, true) + EgtSetInfo( nCrv, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.PROFILING) + end +end + +--------------------------------------------------------------------- +local function CalcMixedSplitLeftRightProcessing( nOutlineId, nProfileId, sSemiProfileName, nSurfGeoId, nProcLayerId, sName) + + local nCrv = EgtCopyGlob( nOutlineId, nProcLayerId) + EgtSetName( nCrv, sName) + -- posiziono correttamente + local dDelta = GetDeltaProfile( nProfileId, sSemiProfileName) + EgtOffsetCurve( nCrv, - dDelta) + -- taglio con geo + nCrv = EgtTrimCurveWithRegion( nCrv, nSurfGeoId, true, true) + -- setto info di lavorazione + local nSemiProfile = EgtGetFirstNameInGroup( nProfileId, sSemiProfileName) + GetProcessingInfoFromSemiProfile( nCrv, nSemiProfile) + +end + +--------------------------------------------------------------------- +-- funzione che calcola le lavorazioni di profiling nel caso di uno split coinvolto da cambio profilo +local function CalcMixedSplitProfilingProcessings( nSplitId, nProcLayerId, nGeoLayerId, nProfileLayerId, nSurfGeoId) + + -- 1) lavorazione profilo out + local nGeoOutId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_OUT) + local nCrvOutId = EgtCopyGlob( nGeoOutId, nProcLayerId) + local nSemiProfileOutId = EgtGetInfo( nCrvOutId, WIN_SEMI_PROFILE, 'i') + GetProcessingInfoFromSemiProfile( nCrvOutId, nSemiProfileOutId) + + -- 2) lavorazione profilo in + local nGeoInId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN) + local nCrvInId = EgtCopyGlob( nGeoInId, nProcLayerId) + local nSemiProfileInId = EgtGetInfo( nCrvInId, WIN_SEMI_PROFILE, 'i') + GetProcessingInfoFromSemiProfile( nCrvInId, nSemiProfileInId) + + -- 3) lavorazioni profili left + local nStartProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_START) + -- a) parte comune dell'outline del telaio + local nOutlineLId = EgtGetInfo( nSplitId, WIN_PREV_OUTLINES, 'i') + CalcMixedSplitLeftRightProcessing( nOutlineLId, nStartProfileId, WIN_MIXED_COMMON .. WIN_CTRIN, nSurfGeoId, nProcLayerId, WIN_LEFT) + -- b) sottotratti sash e fill + local nOutlineL1Id = EgtGetInfo( nSplitId, WIN_MIXED_REF_START, 'i') + CalcMixedSplitLeftRightProcessing( nOutlineL1Id, nStartProfileId, EgtGetName( nOutlineL1Id) .. WIN_CTRIN, nSurfGeoId, nProcLayerId, WIN_LEFT) + local nOutlineL2Id = EgtGetNext( nOutlineL1Id) + CalcMixedSplitLeftRightProcessing( nOutlineL2Id, nStartProfileId, EgtGetName( nOutlineL2Id) .. WIN_CTRIN, nSurfGeoId, nProcLayerId, WIN_LEFT) + -- c) curva di intersezione + local nOutlineL3Id = EgtGetInfo( nOutlineL1Id, WIN_MIXED_INTERS_REF, 'i') + local nLeftId = EgtCopyGlob( nOutlineL3Id, nProcLayerId) + EgtSetName( nLeftId, WIN_LEFT) + local _, dParEL = EgtCurveDomain( nOutlineL3Id) + EgtTrimCurveEndAtParam( nLeftId, dParEL - 1) + -- setto info di lavorazione + EgtSetInfo( nLeftId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.PROFILING) + + -- 4) lavorazioni profili right + local nEndProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_END) + -- a) parte comune dell'outline del telaio + local nOutlineRId = EgtGetInfo( nSplitId, WIN_NEXT_OUTLINES, 'i') + CalcMixedSplitLeftRightProcessing( nOutlineRId, nEndProfileId, WIN_MIXED_COMMON .. WIN_CTRIN, nSurfGeoId, nProcLayerId, WIN_RIGHT) + -- b) sottotratti sash e fill + local nOutlineR1Id = EgtGetInfo( nSplitId, WIN_MIXED_REF_END, 'i') + CalcMixedSplitLeftRightProcessing( nOutlineR1Id, nEndProfileId, EgtGetName( nOutlineR1Id) .. WIN_CTRIN, nSurfGeoId, nProcLayerId, WIN_RIGHT) + local nOutlineR2Id = EgtGetNext( nOutlineR1Id) + CalcMixedSplitLeftRightProcessing( nOutlineR2Id, nEndProfileId, EgtGetName( nOutlineR2Id) .. WIN_CTRIN, nSurfGeoId, nProcLayerId, WIN_RIGHT) + -- b) curva di intersezione + local nOutlineR3Id = EgtGetInfo( nOutlineR1Id, WIN_MIXED_INTERS_REF, 'i') + local nRightId = EgtCopyGlob( nOutlineR3Id, nProcLayerId) + EgtSetName( nRightId, WIN_RIGHT) + local _, dParER = EgtCurveDomain( nOutlineR3Id) + EgtTrimCurveEndAtParam( nRightId, dParER - 1) + -- setto info di lavorazione + EgtSetInfo( nRightId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.PROFILING) + +end + +--------------------------------------------------------------------- +-- funzione che calcola le lavorazioni di profiling +local function CalcProfilingProcessings( nPartId, nOutlineId) + + -- creo gruppo delle lavorazioni + local nProcLayerId = EgtGroup( nPartId) + EgtSetName( nProcLayerId, WIN_PRC) + EgtSetStatus( nProcLayerId, GDB_ST.OFF) + + -- recupero il geo e creo la superficie associata per limitare le lavorazioni + local nGeoLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO) + local nSurfGeo = CreateGeoArea( nGeoLayerId, nProcLayerId) + EgtSurfFrOffset( nSurfGeo, 50 * GEO.EPS_SMALL) + + -- recupero il gruppo dei profili + local nProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) + local nMainProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) + + -- calcolo lavorazioni dei profili + local bChangeProfile = EgtGetInfo( nOutlineId, WIN_PRF_CHANGE, 'b') or false + if bChangeProfile then + -- 1) caso cambio profilo : telaio o split + if EgtGetName( nOutlineId) == WIN_SPLIT then + CalcMixedSplitProfilingProcessings( nOutlineId, nProcLayerId, nGeoLayerId, nProfileLayerId, nSurfGeo) + else + CalcMixedFrameProfilingProcessings( nPartId, nProcLayerId, nGeoLayerId, nMainProfileId, nSurfGeo) + end + else + -- 2) caso standard + -- recupero tutte le curve del geo + local vGeoCrvs = EgtGetAllInGroup( nGeoLayerId) + for i = 1, #vGeoCrvs do + -- copio curva + local nCrvId = EgtCopyGlob( vGeoCrvs[i], nProcLayerId) + -- recupero il semiprofilo associato + local nSemiProfileId = EgtGetInfo( nCrvId, WIN_SEMI_PROFILE, 'i') + -- setto le info dal semiprofilo + GetProcessingInfoFromSemiProfile( nCrvId, nSemiProfileId) + end + end + + -- calcolo eventuali lavorazioni per strip + local vStripDist = EgtGetInfo( nMainProfileId, WIN_STRIP_DIST, 'vi') or {} + for i = 1, #vStripDist do + local nStripCut = EgtCopyGlob( nOutlineId, nProcLayerId) + EgtOffsetCurve( nStripCut, vStripDist[i]) + -- modifico la curva in modo che sia a filo del geo + EgtExtendCurveStartByLen( nStripCut, 1000) + EgtExtendCurveEndByLen( nStripCut, 1000) + nStripCut = EgtTrimCurveWithRegion( nStripCut, nSurfGeo, true, false) + -- aggiusto orientamento per essere coerente con il geo corrispondente + if vStripDist[i] < 0 then + EgtInvertCurve( nStripCut) + end + -- setto info di lavorazione + EgtSetName( nStripCut, WIN_PRC_TYPE.STRIP_CUT) + EgtSetInfo( nStripCut, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.STRIP_CUT) + end + EgtErase( nSurfGeo) +end + + + +---------------------------------------------------------------------------------- +---------------------------------- SOLIDO ---------------------------------------- +---------------------------------------------------------------------------------- +-- funzione che costruisce una superficie estrudendo il profilo sProfileName lungo l'outline +local function CreateProfileSurf( nOutlineId, nProfileId, sProfileName, dExtraLen, nLayerId) + + -- creo guida con estensione in tangenza + local nGuideId = EgtCopy( nOutlineId, nLayerId) + if EgtGetType( nGuideId) == GDB_TY.CRV_LINE then + EgtExtendCurveStartByLen( nGuideId, dExtraLen) + EgtExtendCurveEndByLen( nGuideId, dExtraLen) + else + nGuideId = EgtCurveCompo( nLayerId, nGuideId) + EgtAddCurveCompoLineTg( nGuideId, dExtraLen) + EgtAddCurveCompoLineTg( nGuideId, dExtraLen, false) + end + + -- verifico se necessaria inversione della guida nel caso sia curva "virtuale" ( ovvero in area null o split) che deriva da pezzo di split + local nRefSplitId = EgtGetInfo( nOutlineId, WIN_REF_SPLIT, 'i') + if nRefSplitId then + -- recupero base outline per confrontarlo con lo split da cui deriva + local nBaseOutlineId = EgtGetInfo( nOutlineId, WIN_COPY, 'i') + -- recupero vettore tangente nel punto medio del base outline + local ptM = EgtMP( nBaseOutlineId) + local vtM = EgtMV( nBaseOutlineId) + -- recupero vettore tangente nello stesso punto della curva di split da cui deriva + local dRefSplitPar = EgtCurveParamAtPoint( nRefSplitId, ptM) + local vtMRefSplit = EgtUV( nRefSplitId, dRefSplitPar, -1) + -- se i due vettori non sono orientati nella stessa direzione inverto la guida + if not AreSameVectorApprox( vtM, vtMRefSplit) then + EgtInvertCurve( nGuideId) + end + end + + -- recupero il profilo da estrudere + local nOrigProfileId = EgtGetFirstNameInGroup( nProfileId, sProfileName) + local nSectionId = EgtCopyGlob( nOrigProfileId, nLayerId) + + -- posiziono la sezione di estrusione sulla guida : + -- recupero frame del profilo + local nProfileFrameId = EgtGetFirstNameInGroup( nProfileId, WIN_SECTIONFRAME) + local frProfile = EgtFR( nProfileFrameId, GDB_ID.ROOT) + frProfile:invert() + -- calcolo il frame di destinazione sulla guida + local frDest = Frame3d( EgtSP( nGuideId), - EgtSV( nGuideId), GDB_RT.GLOB) + -- posiziono con i riferimenti + EgtTransform( nSectionId, frProfile, GDB_RT.GLOB) + EgtTransform( nSectionId, frDest, GDB_RT.GLOB) + + -- creo la superfice di estrusione + local nStmId = EgtSurfTmSwept( nLayerId, nSectionId, nGuideId, false, WIN_SURF_APPROX) + EgtErase( nGuideId) + EgtErase( nSectionId) + + return nStmId +end + +--------------------------------------------------------------------- +-- funzione che crea la superficie di trim per il solido +local function CreateTrimSurf( nGeoId, nProfileId, dGeoWidth, nLayerId) + + -- recupero profilo di riferimento dalla curva geo + local nOrigTrimProfileId = EgtGetInfo( nGeoId, WIN_SEMI_PROFILE, 'i') + + -- 1) minizinken + if not nOrigTrimProfileId then + + local nGuideId = EgtCopy( nGeoId, nLayerId) + EgtExtendCurveStartByLen( nGuideId, 4 * dGeoWidth) + EgtExtendCurveEndByLen( nGuideId, 4 * dGeoWidth) + EgtMove( nGuideId, Z_AX()) + local b3Profile = GetProfileLocalBox( nProfileId) + local nTrimSurf = EgtSurfTmByExtrusion( nLayerId, nGuideId, - Z_AX() * ( b3Profile:getDimY() + 2), WIN_SURF_APPROX) + EgtInvertSurf( nTrimSurf) + EgtErase( nGuideId) + return nTrimSurf + + -- 2) controprofilo + else + -- recupero il controprofilo da estrudere + local sTrimProfileName = EgtGetName( nOrigTrimProfileId) + sTrimProfileName = WIN_OFST .. sTrimProfileName + -- recupero la curva di outline associata alla curva di geo + local nRefOutline = EgtGetInfo( nGeoId, WIN_REF_OUTLINE, 'i') + -- calcolo la superficie di estrusione + return CreateProfileSurf( nRefOutline, nProfileId, sTrimProfileName, 4 * dGeoWidth, nLayerId) + end + +end + +--------------------------------------------------------------------- +-- funzione che crea la superficie di trim per uno split coinvolto da cambio profilo +local function CreateMixedSplitTrimSurf( nOutlineId1, nProfileId, dExtraLen, nLayerId) + + -- recupero il frame del profilo + local nFrameId = EgtGetFirstNameInGroup( nProfileId, WIN_SECTIONFRAME) + local frProfile = EgtFR( nFrameId, GDB_ID.ROOT) + local vtDirX = frProfile:getVersX() + frProfile:invert() + + -- punto di riferimento per le estensioni degli outlines del telaio + local nIntersCrvId = EgtGetInfo( nOutlineId1, WIN_MIXED_INTERS_REF, 'i') + local nPartId = EgtGetParent( EgtGetParent( nOutlineId1)) + local nOutlineId = EgtGetInfo( nPartId, WIN_REF_OUTLINE, 'i') + local _, dParE = EgtCurveDomain( nIntersCrvId) + local _, ptOutline = EgtPointCurveDist( EgtUP( nIntersCrvId, dParE - 2), nOutlineId) + + -- primo tratto + local nGuideId1 = EgtCopy( nOutlineId1, nLayerId) + EgtExtendCurveStartByLen( nGuideId1, 2 * dExtraLen) + EgtModifyCurveEndPoint( nGuideId1, ptOutline) + -- recupero il controprofilo corrispondente + local sProfileName1 = WIN_OFST .. EgtGetName( nGuideId1) .. WIN_CTRIN + local nOrigProfileId1 = EgtGetFirstNameInGroup( nProfileId, sProfileName1) + -- aggiungo un tratto di chiusura superiore per le operazioni booleane + local nProfileId1 = EgtCopyGlob( nOrigProfileId1, nLayerId) + EgtAddCurveCompoLine( nProfileId1, EgtEP( nProfileId1) + dExtraLen * vtDirX) + -- posiziono il controprofilo grazie ai riferimenti + EgtTransform( nProfileId1, frProfile, GDB_RT.GLOB) + EgtTransform( nProfileId1, Frame3d( EgtSP( nGuideId1), - EgtSV( nGuideId1))) + -- creo la superficie di estrusione + local nStmId1 = EgtSurfTmSwept( nLayerId, nProfileId1, nGuideId1, false, WIN_SURF_APPROX) + + -- secondo tratto + local nOutlineId2 = EgtGetNext( nOutlineId1) + local nGuideId2 = EgtCopy( nOutlineId2, nLayerId) + EgtExtendCurveEndByLen( nGuideId2, 2 * dExtraLen) + EgtModifyCurveStartPoint( nGuideId2, ptOutline) + -- recupero il controprofilo corrispondente + local sProfileName2 = WIN_OFST .. EgtGetName( nGuideId2) .. WIN_CTRIN + local nOrigProfileId2 = EgtGetFirstNameInGroup( nProfileId, sProfileName2) + -- aggiungo un tratto di chiusura superiore per le operazioni booleane + local nProfileId2 = EgtCopyGlob( nOrigProfileId2, nLayerId) + EgtAddCurveCompoLine( nProfileId2, EgtEP( nProfileId2) + dExtraLen * vtDirX) + -- posiziono grazie ai riferimenti + EgtTransform( nProfileId2, frProfile, GDB_RT.GLOB) + EgtTransform( nProfileId2, Frame3d( EgtSP( nGuideId2), - EgtSV( nGuideId2))) + -- creo la superficie di estrusione + local nStmId2 = EgtSurfTmSwept( nLayerId, nProfileId2, nGuideId2, false, WIN_SURF_APPROX) + + -- creo un solido chiuso per la regione di intersezione + local nGuideId3 = EgtCopy( nIntersCrvId, nLayerId) + EgtExtendCurveEndByLen( nGuideId3, 2 * dExtraLen) + EgtExtendCurveStartByLen( nGuideId3, 2 * dExtraLen) + EgtCloseCurveCompo( nGuideId3) + EgtMove( nGuideId3, Z_AX()) + local dDepth = EgtGetInfo( nProfileId, WIN_MIXED_DEPTH, 'd') + local nStmCutId = EgtSurfTmByRegionExtrusion( nLayerId, nGuideId3, - ( dDepth + 1) * Z_AX()) + + -- creo superficie complessiva + local nTrimStmId = EgtSurfTmByTriangles( nLayerId, { nStmId1, nStmId2}) + -- operazione booleana di add e non di subtract perchè nTrimStmId è invertita rispetto al solido del telaio, essendo stata costruita a partire dai controprofili + EgtSurfTmAdd( nTrimStmId, nStmCutId) + + -- chiudo eventuali buchi + local nLoop, nCnt = EgtExtractSurfTmLoops( nTrimStmId, nLayerId) + if nCnt == 2 then + local nStmHoleId = EgtSurfTmByFlatContour( nLayerId, nLoop + 1) + EgtInvertSurf( nStmHoleId) + nTrimStmId = EgtSurfTmByTriangles( nLayerId, { nTrimStmId, nStmHoleId}) + EgtErase( nLoop + 1) + end + + -- cancello curve di costruzione + EgtErase( { nProfileId1, nProfileId2, nGuideId1, nGuideId2, nGuideId3, nStmCutId, nLoop}) + + return nTrimStmId +end + +--------------------------------------------------------------------- +-- funzione che crea il solido di estrusione principale +local function CreateMainSurf( nOutlineId, dExtraLen, nProfileId, nLayerId) + + -- curva guida + local nGuideId = EgtCopy( nOutlineId, nLayerId) + EgtSetName( nGuideId, WIN_MAINGUIDE) + EgtSetStatus( nGuideId, GDB_ST.OFF) + EgtExtendCurveStartByLen( nGuideId, dExtraLen) + EgtExtendCurveEndByLen( nGuideId, dExtraLen) + + -- posiziono il profilo sulla curva guida : + -- recupero il frame del profilo + local nProfileFrameId = EgtGetFirstNameInGroup( nProfileId, WIN_SECTIONFRAME) + local frInvert = EgtFR( nProfileFrameId) + frInvert:invert() + -- lo applico a tutte le geometrie del profilo + EgtTransform( EgtGetAllInGroup( nProfileId), frInvert) + -- assegno come riferimento del profilo il punto start dell'outline + EgtChangeGroupFrame( nProfileId, Frame3d( EgtSP( nGuideId), - EgtSV( nGuideId))) + + -- recupero outline del profilo Main e lo estrudo + local nSectionId = EgtGetFirstNameInGroup( nProfileId, WIN_SECTION) + local nMainExtrusionId = EgtSurfTmSwept( nLayerId, nSectionId, nGuideId, false, WIN_SURF_APPROX) + EgtSetName( nMainExtrusionId, WIN_SRF_MAIN) + + return nMainExtrusionId +end + +--------------------------------------------------------------------- +-- funzione che crea il solido di un pezzo di telaio con cambio profilo +local function CalcMixedFrameSolid( nOutlineId, nSolidLayerId, nProfileLayerId, nGeoLayerId, dGeoWidth) + + -- a) SOLIDO PRINCIPALE + local nMainProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) + -- recupero i vari sottotratti uniformi del pezzo + local nMixedOutlinesGrp = EgtGetFirstNameInGroup( EgtGetParent( nSolidLayerId), WIN_MIXED_OUTLINES) + local vMixedOutlines = EgtGetAllInGroup( nMixedOutlinesGrp) + -- recupero le curve di intersezione con gli split + local nMixedIntersectionsGrp = EgtGetFirstNameInGroup( EgtGetParent( nSolidLayerId), WIN_MIXED_INTERSECTIONS) + local vIntersections = EgtGetAllInGroup( nMixedIntersectionsGrp) + + -- creo i solidi corrispondenti ai diversi sottotratti + local vMainExtrusions = {} + for i = 1, #vMixedOutlines do + + -- creo curva guida con estensione opportuna agli estremi per facilitare il calcolo del solido : se all'estremo del pezzo estensione + -- arbitraria, altrimenti estendo fino ad incontrare il pezzo precedente/successivo nella regione dove si innesta lo split + local nGuideId = EgtCopyGlob( vMixedOutlines[i], nSolidLayerId) + if i == 1 then + EgtExtendCurveStartByLen( nGuideId, 2 * dGeoWidth) + else + local _, dParE = EgtCurveDomain( vIntersections[i-1]) + local _, ptOutline = EgtPointCurveDist( EgtUP( vIntersections[i-1], dParE - 2), nOutlineId) + EgtModifyCurveStartPoint( nGuideId, ptOutline) + end + if i == #vMixedOutlines then + EgtExtendCurveEndByLen( nGuideId, 2 * dGeoWidth) + else + local _, dParE = EgtCurveDomain( vIntersections[i]) + local _, ptOutline = EgtPointCurveDist( EgtUP( vIntersections[i], dParE - 2), nOutlineId) + EgtModifyCurveEndPoint( nGuideId, ptOutline) + end + + -- posiziono il profilo sulla guida + local nMainProfileFrameId = EgtGetFirstNameInGroup( nMainProfileId, WIN_SECTIONFRAME) + local frInvertMainProfile = EgtFR( nMainProfileFrameId) + frInvertMainProfile:invert() + EgtTransform( EgtGetAllInGroup( nMainProfileId), frInvertMainProfile) + EgtChangeGroupFrame( nMainProfileId, Frame3d( EgtSP( nGuideId), - EgtSV( nGuideId))) + + -- recupero la sezione e la estrudo + local nSectionId = EgtGetFirstNameInGroup( nMainProfileId, EgtGetName( vMixedOutlines[i]) .. WIN_SECTION) + local nMainExtrusionId = EgtSurfTmSwept( nSolidLayerId, nSectionId, nGuideId, false, WIN_SURF_APPROX) + table.insert( vMainExtrusions, nMainExtrusionId) + EgtErase( nGuideId) + end + + -- come guida tengo solo una copia della curva di outline + local nMainGuideId = EgtCopyGlob( nOutlineId, nSolidLayerId) + EgtSetName( nMainGuideId, WIN_MAINGUIDE) + EgtSetStatus( nMainGuideId, GDB_ST.OFF) + + -- unifico i diversi tratti di superficie calcolati + local nMainExtrusionId = EgtSurfTmByTriangles( nSolidLayerId, vMainExtrusions) + EgtSetName( nMainExtrusionId, WIN_SRF_MAIN) + + -- taglio il solido con gli innesti degli split + for i = 1, #vIntersections do + -- creo una curva chiusa a partire dalla curva di intersezione + local nCompo = EgtCopyGlob( vIntersections[i], nSolidLayerId) + EgtExtendCurveEndByLen( nCompo, 2 * dGeoWidth) + EgtExtendCurveStartByLen( nCompo, 2 * dGeoWidth) + EgtCloseCurveCompo( nCompo) + -- creo il solido + EgtMove( nCompo, Z_AX()) + local dDepth = EgtGetInfo( nMainProfileId, WIN_MIXED_DEPTH, 'i') + local nSrfCut = EgtSurfTmByRegionExtrusion( nSolidLayerId, nCompo, - ( dDepth + 1) * Z_AX()) + -- sottraggo + EgtSurfTmSubtract( nMainExtrusionId, nSrfCut) + EgtErase( nCompo) + EgtErase( nSrfCut) + end + + -- chiudo i buchi ( caps ed eventuali parti on del solido di intersezione sul pezzo) + local nLoop, nCnt = EgtExtractSurfTmLoops( nMainExtrusionId, nSolidLayerId) + if nLoop then + local vSurfs = { nMainExtrusionId} + for nId = nLoop, nLoop + nCnt - 1 do + local nHoleStmId = EgtSurfTmByFlatContour( nSolidLayerId, nId) + EgtInvertSurf( nHoleStmId) + table.insert( vSurfs, nHoleStmId) + EgtErase( nId) + end + nMainExtrusionId = EgtSurfTmByTriangles( nSolidLayerId, vSurfs) + EgtSetName( nMainExtrusionId, WIN_SRF_MAIN) + end + + -- creo una copia dell'estrusione principale ( usata per ferramenta) + local nOrigMainExtrusionId = EgtCopy( nMainExtrusionId, nSolidLayerId) + EgtSetName( nOrigMainExtrusionId, WIN_SRF_ORIGMAIN) + EgtSetStatus( nOrigMainExtrusionId, GDB_ST.OFF) + + -- b) TRIM START + local nPrevGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_LEFT) + local nStartProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_START) + local nTrimSurfStart = CreateTrimSurf( nPrevGeoId, nStartProfileId, dGeoWidth, nSolidLayerId) + EgtSetName( nTrimSurfStart, WIN_SRF_START) + EgtSetStatus( nTrimSurfStart, GDB_ST.OFF) + EgtSurfTmIntersect( nMainExtrusionId, nTrimSurfStart) + + -- c) TRIM END + local nNextGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_RIGHT) + local nEndProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_END) + local nTrimSurfEnd = CreateTrimSurf( nNextGeoId, nEndProfileId, dGeoWidth, nSolidLayerId) + EgtSetName( nTrimSurfEnd, WIN_SRF_END) + EgtSetStatus( nTrimSurfEnd, GDB_ST.OFF) + EgtSurfTmIntersect( nMainExtrusionId, nTrimSurfEnd) + +end + +--------------------------------------------------------------------- +-- funzione che crea il solido di un pezzo di split coinvolto da cambio profilo +local function CalcMixedSplitSolid( nOutlineId, nSolidLayerId, nProfileLayerId, dGeoWidth) + + -- a) creo il solido di estrusione principale + local nMainProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) + local nMainExtrusionId = CreateMainSurf( nOutlineId, 2 * dGeoWidth, nMainProfileId, nSolidLayerId) + -- creo una copia + local nOrigMainExtrusionId = EgtCopy( nMainExtrusionId, nSolidLayerId) + EgtSetName( nOrigMainExtrusionId, WIN_SRF_ORIGMAIN) + EgtSetStatus( nOrigMainExtrusionId, GDB_ST.OFF) + + -- b) trim start + local nPrevProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_START) + local nPrevOutlineRef = EgtGetInfo( nOutlineId, WIN_MIXED_REF_START, 'i') + local nStmTrimStart = CreateMixedSplitTrimSurf( nPrevOutlineRef, nPrevProfileId, dGeoWidth, nSolidLayerId) + EgtSetName( nStmTrimStart, WIN_SRF_START) + EgtSetStatus( nStmTrimStart, GDB_ST.OFF) + EgtSurfTmIntersect( nMainExtrusionId, nStmTrimStart) + + -- c) trim end + local nNextProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_END) + local nNextOutlineRef = EgtGetInfo( nOutlineId, WIN_MIXED_REF_END, 'i') + local nStmTrimEnd = CreateMixedSplitTrimSurf( nNextOutlineRef, nNextProfileId, dGeoWidth, nSolidLayerId) + EgtSetName( nStmTrimEnd, WIN_SRF_END) + EgtSetStatus( nStmTrimEnd, GDB_ST.OFF) + EgtSurfTmIntersect( nMainExtrusionId, nStmTrimEnd) +end + +--------------------------------------------------------------------- +-- funzione che crea il solido del pezzo +local function CalcSolid( nPartId, nOutlineId) + + -- creo layer per solido + local nSolidLayerId = EgtGroup( nPartId) + EgtSetName( nSolidLayerId, WIN_SOLID) + + -- recupero profilo principale + local nProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) + + -- recupero geo e la sua larghezza + local nGeoLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO) + local dGeoWidth = EgtGetInfo( nGeoLayerId, WIN_GEOWIDTH, 'd') + + -- gestione speciale per pezzi con CAMBIO PROFILO + local bChangeProfile = EgtGetInfo( nOutlineId, WIN_PRF_CHANGE, 'b') or false + if bChangeProfile then + if EgtGetName( nOutlineId) == WIN_SPLIT then + return CalcMixedSplitSolid( nOutlineId, nSolidLayerId, nProfileLayerId, dGeoWidth) + else + return CalcMixedFrameSolid( nOutlineId, nSolidLayerId, nProfileLayerId, nGeoLayerId, dGeoWidth) + end + end + + -- a) creo il solido di estrusione principale + local nMainProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) + local nMainExtrusionId = CreateMainSurf( nOutlineId, 2 * dGeoWidth, nMainProfileId, nSolidLayerId) + -- creo una copia ( usata per calcolo ferramenta) + local nOrigMainExtrusionId = EgtCopy( nMainExtrusionId, nSolidLayerId) + EgtSetName( nOrigMainExtrusionId, WIN_SRF_ORIGMAIN) + EgtSetStatus( nOrigMainExtrusionId, GDB_ST.OFF) + + -- b) trim con i controprofili sullo start + local vPrevGeoId = EgtGetNameInGroup( nGeoLayerId, WIN_GEO_LEFT) + local vStartProfileId = EgtGetNameInGroup( nProfileLayerId, WIN_PRF_START) + for i = 1, #vPrevGeoId do + -- creo la superficie di trim + local nTrimSurf = CreateTrimSurf( vPrevGeoId[i], vStartProfileId[i], dGeoWidth, nSolidLayerId) + EgtSetStatus( nTrimSurf, GDB_ST.OFF) + EgtSetName( nTrimSurf, WIN_SRF_START) + -- eseguo intersezione per ottenere un solido unico ( tagliare le due superfici con EgtSurfTmCut e poi unirle potrebbe creare piccoli buchi legati alle diverse approssimazioni) + EgtSurfTmIntersect( nMainExtrusionId, nTrimSurf) + end + + -- c) trim con i controprofili sull'end + local vNextGeoId = EgtGetNameInGroup( nGeoLayerId, WIN_GEO_RIGHT) + local vEndProfileId = EgtGetNameInGroup( nProfileLayerId, WIN_PRF_END) + for i = 1, #vNextGeoId do + -- creo la superficie di trim + local nTrimSurf = CreateTrimSurf( vNextGeoId[i], vEndProfileId[i], dGeoWidth, nSolidLayerId) + EgtSetStatus( nTrimSurf, GDB_ST.OFF) + EgtSetName( nTrimSurf, WIN_SRF_END) + -- eseguo intersezione per ottenere un solido unico + EgtSurfTmIntersect( nMainExtrusionId, nTrimSurf) + end + +end + +--------------------------------------------------------------------- +-- funzione che crea il solido del Fill +local function CalcFillSolid( nPartId, nOutlineLayerId, nGeoLayerId) + -- creo layer per solido + local nSolidLayerId = EgtGroup( nPartId) + EgtSetName( nSolidLayerId, WIN_SOLID) + -- creo compo di outline + local vOutlineList = EgtGetAllInGroup( nOutlineLayerId) + local nCompoOutlineId = EgtCurveCompoByChain( nSolidLayerId, vOutlineList, EgtSP( vOutlineList[1]), false) + -- recupero spessore vetro + local dGlassThickness = EgtGetInfo( nGeoLayerId, WIN_GEOWIDTH, 'd') + local nSurfId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nCompoOutlineId, Z_AX() * dGlassThickness) + EgtErase( nCompoOutlineId) +end + + + +---------------------------------------------------------------------------------- ---------------------------------- DOWELS ---------------------------------------- ---------------------------------------------------------------------------------- --- funzione che calcola il riferimento dove posizionare le spine +-- funzione che calcola il riferimento dove posizionare i dowels local function CreateDowelFrameDest( nRefProfileType, nPrevGeo, nGeo, nRefOutline, bFullOrShort, bSashOrFrame) -- 1) la direzione z è quella del pezzo short nel caso rettangolare @@ -1345,60 +2144,8 @@ local function CreateDowelFrameDest( nRefProfileType, nPrevGeo, nGeo, nRefOutlin return frDest end ----------------------------------------------------------------------------------- --- funzione che crea la superficie di estrusione del profilo sCtr -local function CreateSemiProfileSurf( nOutlineId, nProfileId, sCtr, nLayerId) - - -- creo la curva guida - local nGuideId = EgtCopy( nOutlineId, nLayerId) - EgtExtendCurveStartByLen( nGuideId, 100) - EgtExtendCurveEndByLen( nGuideId, 100) - -- verifico se necessaria inversione della guida nel caso derivi direttamente da split - local nArea = EgtGetParent( EgtGetParent( nOutlineId)) - local nAreaType = EgtGetInfo( nArea, WIN_AREATYPE, 'i') - if nAreaType == WIN_AREATYPES.SPLIT then - local nSouId = EgtGetInfo( nOutlineId, WIN_REF_SPLIT, 'i') - if nSouId then - -- recupero vettore tangente nel punto medio della curva - local ptMidStart = EgtMP( nOutlineId) - local vtMidStart = EgtMV( nOutlineId) - -- recupero vettore tangente nello stesso punto della curva split originale - local dMidStartOnStartSou = EgtCurveParamAtPoint( nSouId, ptMidStart) - local vtMidStartSou = EgtUV( nSouId, dMidStartOnStartSou, -1) - -- se i due vettori non sono orientati nella stessa direzione - if not AreSameVectorApprox( vtMidStart, vtMidStartSou) then - EgtInvertCurve( nGuideId) - end - end - end - - -- recupero frame del profilo - local nProfileFrameId = EgtGetFirstNameInGroup( nProfileId, WIN_SECTIONFRAME) - local frOrig = EgtFR( nProfileFrameId, GDB_ID.ROOT) - frOrig:invert() - - -- calcolo il riferimento su cui posizionare il profilo per l'estrusione - local ptRef = EgtSP( nGuideId, GDB_ID.ROOT) - local vtRef = - EgtSV( nGuideId, GDB_ID.ROOT) - local frDest = Frame3d( ptRef, vtRef) - - -- recupero il profilo da estrudere - local nOrigSectionId = EgtGetFirstNameInGroup( nProfileId, sCtr) - local nSectionId = EgtCopyGlob( nOrigSectionId, nLayerId) - - -- posiziono il profilo usando i riferimenti - EgtTransform( nSectionId, frOrig, GDB_RT.GLOB) - EgtTransform( nSectionId, frDest, GDB_RT.GLOB) - - -- creo la superficie - local nSurfId = EgtSurfTmSwept( nLayerId, nSectionId, nGuideId, false, WIN_SURF_APPROX) - EgtErase( nGuideId) - EgtErase( nSectionId) - - return nSurfId -end - ----------------------------------------------------------------------------------- +--------------------------------------------------------------------- +-- funzione che posiziona il dowel tramite i riferimenti local function PositionDowel( nDowelId, frOrig, frDest, vtDir, nSurfId) -- posiziono il dowel utilizzando i riferimenti @@ -1407,6 +2154,7 @@ local function PositionDowel( nDowelId, frOrig, frDest, vtDir, nSurfId) EgtMove( nDowelId, 300 * vtDir) -- creo il tool corrispondente al dowel local dRad = EgtArcRadius( nDowelId) + EgtCAvSetStdTool( s_dDowelTol, 2 * dRad, 0) -- calcolo spostamento per posizionarlo in corrispondenza della superficie local dStart = EgtCAvToolPosStm( EgtCP( nDowelId), - vtDir, nSurfId, - vtDir) @@ -1414,7 +2162,8 @@ local function PositionDowel( nDowelId, frOrig, frDest, vtDir, nSurfId) end ----------------------------------------------------------------------------------- +--------------------------------------------------------------------- +-- funzione che crea il dowel e lo sottrae al solido local function CreateDowel( nOrigDowelId, nLayerId, frOrig, frDest, vtDir, nTestSurfId, sLenKey, sDowelSide, nMainExtrusionId) -- vtDir rivolta verso interno del pezzo @@ -1446,8 +2195,8 @@ local function CreateDowel( nOrigDowelId, nLayerId, frOrig, frDest, vtDir, nTest return nDowelId end ----------------------------------------------------------------------------------- --- funzione che calcola la correzione da applicare al frame delle spine per evitare che fuoriescano dal pezzo da un lato visibile ( esterno per ante ed interno per telaio) +--------------------------------------------------------------------- +-- funzione che calcola la correzione da applicare al frame dei dowels per evitare che fuoriescano dal pezzo da un lato visibile ( esterno per ante ed interno per telaio) local function CalcDowelFrameCorrection( nOutlineId, nPrevOutlineId, nDowelRef, frOrig, frDest, nTestSurfPos, nTestSurfPosPrev, nTestSurf, vtMove, nLayerId, sLenKey, sPrevLenKey) local dMove = 0 @@ -1485,9 +2234,10 @@ local function CalcDowelFrameCorrection( nOutlineId, nPrevOutlineId, nDowelRef, return dMove end ----------------------------------------------------------------------------------- +--------------------------------------------------------------------- +-- funzione che calcola i dowels tra due pezzi local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail) - + -- recupero i pezzi local nPart = EgtGetInfo( nOutlineId, WIN_REF_PART, 'i') local nPrevPart = EgtGetInfo( nPrevOutlineId, WIN_REF_PART, 'i') @@ -1524,11 +2274,11 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail end -- recupero i solidi - local nPrevSolidId, nSolidId + local nPrevSolidId, nSolidId, nPrevSolidLay, nSolidLay if bCalcSolid then - local nSolidLay = EgtGetFirstNameInGroup( nPart, WIN_SOLID) + nSolidLay = EgtGetFirstNameInGroup( nPart, WIN_SOLID) nSolidId = EgtGetFirstNameInGroup( nSolidLay, WIN_SRF_MAIN) - local nPrevSolidLay = EgtGetFirstNameInGroup( nPrevPart, WIN_SOLID) + nPrevSolidLay = EgtGetFirstNameInGroup( nPrevPart, WIN_SOLID) nPrevSolidId = EgtGetFirstNameInGroup( nPrevSolidLay, WIN_SRF_MAIN) end @@ -1541,6 +2291,7 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail nJointType = WIN_PART_JNT.FULL end end + if nJointType == WIN_PART_JNT.ANGLED then -- TO DO @@ -1558,14 +2309,36 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail local sLenKey = EgtIf( nProfileType == WIN_PRF.BOTTOM, WIN_DWL_BOTTOM_PERP_LEN, WIN_DWL_TOP_PERP_LEN) local sPrevLenKey = EgtIf( nProfileType == WIN_PRF.BOTTOM, WIN_DWL_BOTTOM_PARA_LEN, WIN_DWL_TOP_PARA_LEN) - -- superficie test per il posizionamento dei dowels - local nTestSurf = CreateSemiProfileSurf( nOutlineId, nProfileId, WIN_CTRIN, nLayerId) + -- superficie test per il posizionamento dei dowels : è la superficie in del pezzo full + local nTestSurf + if bCalcSolid then + -- è la superficie che viene utilizzata per trimmare l'end del pezzo prev + local nOrigSurf = EgtGetFirstNameInGroup( nPrevSolidLay, WIN_SRF_END) + nTestSurf = EgtCopyGlob( nOrigSurf, nLayerId) + else + local sCtrIn = WIN_OFST .. GetProfileCtrIn( nOutlineId, nPrevOutlineId, nProfileId) -- controprofilo in del pezzo corrente + nTestSurf = CreateProfileSurf( nOutlineId, nProfileId, sCtrIn, 100, nLayerId) + end local nTestSurfInverted = EgtCopyGlob( nTestSurf, nLayerId) EgtInvertSurf( nTestSurfInverted) -- superficie test per la traslazione dei dowels - local nTestSurf2 = CreateSemiProfileSurf( nPrevOutlineId, nPrevProfileId, EgtIf( bSashOrFrame, WIN_OUT, WIN_IN), nLayerId) - EgtInvertSurf( nTestSurf2) + local nTestSurf2 + if bSashOrFrame then + -- se anta la superficie da cui non fuoriuscire è quella esterna del pezzo short, ovvero la superficie usata per trimmare lo start del pezzo corrente + if bCalcSolid then + local nOrigSurf = EgtGetFirstNameInGroup( nSolidLay, WIN_SRF_START) + nTestSurf2 = EgtCopyGlob( nOrigSurf, nLayerId) + else + nTestSurf2 = CreateProfileSurf( nPrevOutlineId, nPrevProfileId, WIN_OFST .. WIN_OUT, 100, nLayerId) + end + EgtInvertSurf( nTestSurf2) + else + -- se telaio la superficie da cui non fuoriuscire è quella interna del pezzo short + local sCtrIn2 = WIN_OFST .. GetProfileCtrIn( nPrevOutlineId, nOutlineId, nPrevProfileId) + nTestSurf2 = CreateProfileSurf( nPrevOutlineId, nPrevProfileId, sCtrIn2, 100, nLayerId) + end + -- direzione per la traslazione dei dowels local vtMove = EgtIf( bSashOrFrame, - frDest:getVersX(), frDest:getVersX()) @@ -1617,13 +2390,33 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail end -- superficie test per il posizionamento dei dowels - local nTestSurf = CreateSemiProfileSurf( nPrevOutlineId, nPrevProfileId, WIN_CTRIN, nLayerId) + -- è il controprofilo in del pezzo full quindi è la stessa superficie che viene utilizzata per trimmare lo start del pezzo corrente + local nTestSurf + if bCalcSolid then + local nOrigSurf = EgtGetFirstNameInGroup( nSolidLay, WIN_SRF_START) + nTestSurf = EgtCopyGlob( nOrigSurf, nLayerId) + else + local sCtrIn = WIN_OFST .. GetProfileCtrIn( nPrevOutlineId, nOutlineId, nPrevProfileId) -- controprofilo del pezzo full + nTestSurf = CreateProfileSurf( nPrevOutlineId, nPrevProfileId, sCtrIn, 100, nLayerId) + end local nTestSurfInverted = EgtCopyGlob( nTestSurf, nLayerId) EgtInvertSurf( nTestSurfInverted) - + -- superficie test per la traslazione dei dowels - local nTestSurf2 = CreateSemiProfileSurf( nOutlineId, nProfileId, EgtIf( bSashOrFrame, WIN_OUT, WIN_IN), nLayerId) - EgtInvertSurf( nTestSurf2) + local nTestSurf2 + if bSashOrFrame then + if bCalcSolid then + local nOrigSurf = EgtGetFirstNameInGroup( nPrevSolidLay, WIN_SRF_END) + nTestSurf2 = EgtCopyGlob( nOrigSurf, nLayerId) + else + nTestSurf2 = CreateProfileSurf( nOutlineId, nProfileId, WIN_OFST .. WIN_OUT, 100, nLayerId) + end + EgtInvertSurf( nTestSurf2) + else + local sCtrIn2 = WIN_OFST .. GetProfileCtrIn( nOutlineId, nPrevOutlineId, nProfileId) -- controprofilo del pezzo short + nTestSurf2 = CreateProfileSurf( nOutlineId, nProfileId, sCtrIn2, 100, nLayerId) + end + -- direzione per la traslazione dei dowels local vtMove = EgtIf( bSashOrFrame, - frDest:getVersX(), frDest:getVersX()) @@ -1652,34 +2445,41 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail EgtErase( nTestSurfInverted) EgtErase( nTestSurf2) end - + end ----------------------------------------------------------------------------------- +--------------------------------------------------------------------- +-- funzione che calcola i dowels tra uno split e i pezzi sui cui poggia local function CalcSplitDowels( nSplitId, vOutlines, bStartOrEnd) - + -- TO DO : da gestire incrocio dowels di tre pezzi -- recupero il pezzo dello split local nSplitPart = EgtGetInfo( nSplitId, WIN_REF_PART, 'i') + -- recupero il profilo originale dello split e il suo frame local nSplitProfile = GetOutlineProfileId( nSplitId, false) local nSplitProfileFrameId = EgtGetFirstNameInGroup( nSplitProfile, WIN_SECTIONFRAME) local frOrig = EgtFR( nSplitProfileFrameId, GDB_ID.ROOT) frOrig:invert() + -- recupero il gruppo delle lavorazioni local nSplitLayerId = EgtGetFirstNameInGroup( nSplitPart, WIN_PRC) - -- recupero eventuale solido - local nSplitSolidId + + -- recupero eventuale solido e superifici usate per il suo trim + local nSplitSolidId, vTestSurf if bCalcSolid then local nSplitSolidLayerId = EgtGetFirstNameInGroup( nSplitPart, WIN_SOLID) nSplitSolidId = EgtGetFirstNameInGroup( nSplitSolidLayerId, WIN_SRF_MAIN) + vTestSurf = EgtGetNameInGroup( nSplitSolidLayerId, EgtIf( bStartOrEnd, WIN_SRF_START, WIN_SRF_END)) end + -- indviduo il lato su cui andranno i dowels local sSplitDowelSide = WIN_PRC_DWL_SIDETYPE.RIGHT if bStartOrEnd then sSplitDowelSide = WIN_PRC_DWL_SIDETYPE.LEFT end + -- creo la superficie di test per verificare se dowel interno al pezzo local nSplitGeo = EgtGetFirstNameInGroup( nSplitPart, WIN_GEO) local nSplitSurf = CreateGeoArea( nSplitGeo, nSplitLayerId) @@ -1746,14 +2546,22 @@ local function CalcSplitDowels( nSplitId, vOutlines, bStartOrEnd) -- creo la superficie di test per il posizionamento dei dowels local nProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) - local sCtr = GetProfileCtrIn( nOutlineId, nSplitId, nProfileId) - local nTestSurf = CreateSemiProfileSurf( nOutlineId, nProfileId, sCtr, nSplitLayerId) - local nTestSurfInverted = EgtCopyGlob( nTestSurf, nSplitLayerId) - if sDowelSide == WIN_PRC_DWL_SIDETYPE.OUT then - EgtInvertSurf( nTestSurf) + local nTestSurf + if bCalcSolid then + -- è la stessa superficie utilizzata per il trim del solido + nTestSurf = EgtCopyGlob( vTestSurf[i], nSplitLayerId) else - EgtInvertSurf( nTestSurfInverted) + local bChangeProfile = EgtGetInfo( nSplitId, WIN_PRF_CHANGE, 'b') or false + if not bChangeProfile then + local sCtr = WIN_OFST .. GetProfileCtrIn( nOutlineId, nSplitId, nProfileId) + nTestSurf = CreateProfileSurf( nOutlineId, nProfileId, sCtr, 100, nSplitLayerId) + else + local nMixedOutlineRef = EgtGetInfo( nSplitId, EgtIf( bStartOrEnd, WIN_MIXED_REF_START, WIN_MIXED_REF_END), 'i') + nTestSurf = CreateMixedSplitTrimSurf( nMixedOutlineRef, nProfileId, 100, nSplitLayerId) + end end + local nTestSurfInverted = EgtCopyGlob( nTestSurf, nSplitLayerId) + EgtInvertSurf( nTestSurfInverted) -- calcolo le direzioni entranti nei pezzi local vtSplitDir = EgtIf( bStartOrEnd, - frDest:getVersZ(), frDest:getVersZ()) @@ -1801,7 +2609,7 @@ local function CalcSplitDowels( nSplitId, vOutlines, bStartOrEnd) EgtErase( nSplitSurf) end ----------------------------------------------------------------------------------- +--------------------------------------------------------------------- -- funzione che calcola le spine local function CalculateAreaDowels( nAreaId) @@ -1833,9 +2641,11 @@ local function CalculateAreaDowels( nAreaId) -- se split non è di tipo french ha un pezzo associato per il quale vanno calcolate le spine if nSplitType ~= WIN_SPLITTYPES.FRENCH then local nSplitId = EgtGetFirstInGroup( nSplitLayerId) - -- recupero le curve su cui poggia lo split - local vPrevOutlineId, vNextOutlineId = GetPrevNextOutline( WIN_PRF.SPLIT, nSplitId, nOutlineLayerId) + -- start + local vPrevOutlineId = EgtGetInfo( nSplitId, WIN_PREV_OUTLINES, 'vi') CalcSplitDowels( nSplitId, vPrevOutlineId, true) + -- end + local vNextOutlineId = EgtGetInfo( nSplitId, WIN_NEXT_OUTLINES, 'vi') CalcSplitDowels( nSplitId, vNextOutlineId, false) end end @@ -1851,332 +2661,9 @@ end ---------------------------------------------------------------------------------- ----------------------------------- SOLIDO ---------------------------------------- +--------------------------------- STRIP ---------------------------------------- ---------------------------------------------------------------------------------- --- funzione che recupera tipo di inizio e fine pezzo -local function CalcStartEndProfileType( nProfileType, nOutlineId, vStartProfileId, vEndProfileId) - - local vsStartProfileType = {} - local vsEndProfileType = {} - - if nProfileType == WIN_PRF.SPLIT then - local vStartBaseOutlineId = EgtGetInfo( nOutlineId, WIN_SPLIT_STARTINTERS, 'vi') - for i = 1, #vStartProfileId do - local nStartId = EgtGetInfo( vStartBaseOutlineId[i], WIN_COPY, 'i') - local sStartProfileType = GetProfileCtrIn( nStartId, nOutlineId, vStartProfileId[i]) - table.insert( vsStartProfileType, WIN_OFST .. sStartProfileType) - end - - local vEndBaseOutlineId = EgtGetInfo( nOutlineId, WIN_SPLIT_ENDINTERS, 'vi') - for i = 1, #vEndProfileId do - local nEndId = EgtGetInfo( vEndBaseOutlineId[i], WIN_COPY, 'i') - local sEndProfileType = GetProfileCtrIn( nEndId, nOutlineId, vEndProfileId[i]) - table.insert( vsEndProfileType, WIN_OFST .. sEndProfileType) - end - - else - local StartJointType = EgtGetInfo( nOutlineId, WIN_STARTJOINT, 'i') - if nProfileType == WIN_PRF.BOTTOMRAIL then - -- l'info nella curva si riferisce al pezzo bottom, il bottomrail viene sempre forzato a short - StartJointType = WIN_PART_JNT.SHORT - end - if StartJointType == WIN_PART_JNT.ANGLED then - vsStartProfileType = { WIN_MINIZINKEN} - elseif StartJointType == WIN_PART_JNT.SHORT then - vsStartProfileType = { WIN_CTRINOFST} - elseif StartJointType == WIN_PART_JNT.FULL then - vsStartProfileType = { WIN_OUTOFST} - end - - local EndJointType = EgtGetInfo( nOutlineId, WIN_ENDJOINT, 'i') - if nProfileType == WIN_PRF.BOTTOMRAIL then - EndJointType = WIN_PART_JNT.SHORT - end - if EndJointType == WIN_PART_JNT.ANGLED then - vsEndProfileType = { WIN_MINIZINKEN} - elseif EndJointType == WIN_PART_JNT.SHORT then - vsEndProfileType = { WIN_CTRINOFST} - elseif EndJointType == WIN_PART_JNT.FULL then - vsEndProfileType = { WIN_OUTOFST} - end - end - - return vsStartProfileType, vsEndProfileType -end - ---------------------------------------------------------------------- --- funzione che crea il solido del pezzo del telaio -local function CalcFrameSolid( nPartId, nOutlineId, nGeoId, nProfileType) - - -- creo layer per solido - local nSolidLayerId = EgtGroup( nPartId) - EgtSetName( nSolidLayerId, WIN_SOLID) - - -- recupero layer delle lavorazioni per i dowels - local nProcLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PRC) - - -- recupero profili e controprofili - local nProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) - local nMainProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) - local vStartProfileId = EgtGetNameInGroup( nProfileLayerId, WIN_PRF_START) - local vEndProfileId = EgtGetNameInGroup( nProfileLayerId, WIN_PRF_END) - - -- recupero geo - local nGeoLayerId = EgtGetParent( nGeoId) - local vPrevGeoId = EgtGetNameInGroup( nGeoLayerId, WIN_GEO_LEFT) - local vNextGeoId = EgtGetNameInGroup( nGeoLayerId, WIN_GEO_RIGHT) - -- recupero BBox e larghezza del geo - local dGeoWidth = EgtGetInfo( nGeoId, WIN_GEOWIDTH, 'd') - - -- recupero i controprofili in base al tipo di giunzioni - local vsStartProfileType, vsEndProfileType = CalcStartEndProfileType( nProfileType, nOutlineId, vStartProfileId, vEndProfileId) - - -- verifico se outline è split interno ad area di split per controlli su inversione del profilo - local bSplitInsideSplitArea = false - if nProfileType == WIN_PRF.SPLIT then - local nAreaId = EgtGetParent( EgtGetParent( nOutlineId)) - local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i') - bSplitInsideSplitArea = ( nAreaType == WIN_AREATYPES.SPLIT) - end - - -- a) MAIN EXTRUSION - -- creo guida Main - local nGuideId = EgtCopy( nOutlineId, nSolidLayerId) - EgtSetName( nGuideId, WIN_MAINGUIDE) - EgtSetStatus( nGuideId, GDB_ST.OFF) - EgtExtendCurveStartByLen( nGuideId, 2 * dGeoWidth) - EgtExtendCurveEndByLen( nGuideId, 2 * dGeoWidth) - -- recupero frame del profilo - local nMainProfileFrameId = EgtGetFirstNameInGroup( nMainProfileId, WIN_SECTIONFRAME) - local frInvertMainProfile = EgtFR( nMainProfileFrameId) - frInvertMainProfile:invert() - -- lo applico a tutte le geometrie del profilo - EgtTransform( EgtGetAllInGroup( nMainProfileId), frInvertMainProfile) - -- assegno come riferimento del profilo il punto start dell'outline - EgtChangeGroupFrame( nMainProfileId, Frame3d( EgtSP( nGuideId), - EgtSV( nGuideId))) - -- recupero outline del profilo Main e lo estrudo - local nMainOutlineId = EgtGetFirstNameInGroup( nMainProfileId, WIN_SECTION) - local nMainExtrusionId = EgtSurfTmSwept( nSolidLayerId, nMainOutlineId, nGuideId, false, WIN_SURF_APPROX) - EgtSetName( nMainExtrusionId, WIN_SRF_MAIN) - -- creo una copia dell'estrusione principale per trim successivi - local nOrigMainExtrusionId = EgtCopy( nMainExtrusionId, nSolidLayerId) - EgtSetName( nOrigMainExtrusionId, WIN_SRF_ORIGMAIN) - EgtSetStatus( nOrigMainExtrusionId, GDB_ST.OFF) - - - -- b) START PROFILE - local vStartDelta = EgtGetInfo( nGeoLayerId, WIN_STARTCPDELTA, 'vd') - for i = 1, #vPrevGeoId do - -- posiziono il profilo Start - local nRefStartProfileId = EgtGetFirstNameInGroup( vStartProfileId[i], WIN_REF) - local b3RefStartProfile = EgtGetBBoxGlob( nRefStartProfileId, GDB_BB.STANDARD) - -- creo guida per estrusione con estensione in tangenza - local nStartGuideId = EgtCopy( vPrevGeoId[i], nSolidLayerId) - if EgtGetType( nStartGuideId) == GDB_TY.CRV_LINE then - EgtExtendCurveStartByLen( nStartGuideId, 4 * dGeoWidth) - EgtExtendCurveEndByLen( nStartGuideId, 4 * dGeoWidth) - else - nStartGuideId = EgtCurveCompo( nSolidLayerId, nStartGuideId) - EgtAddCurveCompoLineTg( nStartGuideId, 4 * dGeoWidth) - EgtAddCurveCompoLineTg( nStartGuideId, 4 * dGeoWidth, false) - end - -- recupero frame del profilo - local nStartProfileFrameId = EgtGetFirstNameInGroup( vStartProfileId[i], WIN_SECTIONFRAME) - local frStartProfile = EgtFR( nStartProfileFrameId) - -- lo sposto se controprofilo - frStartProfile:move( - frStartProfile:getVersX() * vStartDelta[i]) - frStartProfile:invert() - -- lo applico a tutte le geometrie del profilo - EgtTransform( EgtGetAllInGroup( vStartProfileId[i]), frStartProfile) - -- assegno come riferimento del profilo il punto start dell'outline - EgtChangeGroupFrame( vStartProfileId[i], Frame3d( EgtSP( nStartGuideId), - EgtSV( nStartGuideId))) - - if bSplitInsideSplitArea then - -- verifico se il suo start deriva da uno split - local vStartId = EgtGetInfo( nOutlineId, WIN_SPLIT_STARTINTERS, 'vi') - local nStartOutlineId = EgtGetInfo( vStartId[i], WIN_COPY, 'i') - local nStartSouId = EgtGetInfo( nStartOutlineId, WIN_REF_SPLIT, 'i') - if nStartSouId then - -- recupero vettore tangente nel punto medio della curva di contorno - local ptMidStart = EgtMP( vStartId[i]) - local vtMidStart = EgtMV( vStartId[i]) - -- recupero vettore tangente nello stesso punto della curva split originale - local dMidStartOnStartSou = EgtCurveParamAtPoint( nStartSouId, ptMidStart) - local vtMidStartSou = EgtUV( nStartSouId, dMidStartOnStartSou, -1) - -- se i due vettori non sono orientati nella stessa direzione - if not AreSameVectorApprox( vtMidStart, vtMidStartSou) then - -- ruoto di 180 gradi il profilo - local frStartProfileS = EgtFR( nStartProfileFrameId, GDB_ID.ROOT) - EgtRotate( vStartProfileId[i], frStartProfileS:getOrigin(), frStartProfileS:getVersY(), 180, GDB_RT.GLOB) - end - end - end - - -- recupero outline del profilo Start e lo estrudo - local nOutStartProfileId - if vsStartProfileType[i] == WIN_MINIZINKEN then - nOutStartProfileId = EgtLine( vStartProfileId[i], EgtSP( vPrevGeoId[i]), EgtSP( vPrevGeoId[i]) - Z_AX() * b3RefStartProfile:getDimY(), GDB_RT.GLOB) - EgtInvertCurve( nOutStartProfileId) - else - nOutStartProfileId = EgtGetFirstNameInGroup( vStartProfileId[i], vsStartProfileType[i]) - end - local nStartExtrusionId = EgtSurfTmSwept( nSolidLayerId, nOutStartProfileId, nStartGuideId, false, WIN_SURF_APPROX) - -- eseguo intersezione per ottenere un solido unico - -- ( tagliare le due superfici con EgtSurfTmCut e poi unirle potrebbe creare piccoli buchi legati alle diverse approssimazioni) - EgtSurfTmIntersect( nMainExtrusionId, nStartExtrusionId) - EgtErase( nStartExtrusionId) - EgtErase( nStartGuideId) - end - - - -- c) END PROFILE - local vEndDelta = EgtGetInfo( nGeoLayerId, WIN_ENDCPDELTA, 'vd') - for i = 1, #vNextGeoId do - -- posiziono il profilo End - local nRefEndProfileId = EgtGetFirstNameInGroup( vEndProfileId[i], WIN_REF) - local b3RefEndProfile = EgtGetBBoxGlob( nRefEndProfileId, GDB_BB.STANDARD) - -- creo guida per estrusione - local nEndGuideId = EgtCopy( vNextGeoId[i], nSolidLayerId) - if EgtGetType( nEndGuideId) == GDB_TY.CRV_LINE then - EgtExtendCurveStartByLen( nEndGuideId, 4 * dGeoWidth) - EgtExtendCurveEndByLen( nEndGuideId, 4 * dGeoWidth) - else - nEndGuideId = EgtCurveCompo( nSolidLayerId, nEndGuideId) - EgtAddCurveCompoLineTg( nEndGuideId, 4 * dGeoWidth) - EgtAddCurveCompoLineTg( nEndGuideId, 4 * dGeoWidth, false) - end - -- recupero frame del profilo - local nEndProfileFrameId = EgtGetFirstNameInGroup( vEndProfileId[i], WIN_SECTIONFRAME) - local frEndProfile = EgtFR( nEndProfileFrameId) - frEndProfile:move( - frEndProfile:getVersX() * vEndDelta[i]) - frEndProfile:invert() - -- lo applico a tutte le geometrie del profilo - EgtTransform( EgtGetAllInGroup( vEndProfileId[i]), frEndProfile) - -- assegno come riferimento del profilo il punto start dell'outline - EgtChangeGroupFrame( vEndProfileId[i], Frame3d( EgtSP( nEndGuideId), - EgtSV( nEndGuideId))) - - -- verifico se necessario ruotare di 180 gradi il profilo - if bSplitInsideSplitArea then - -- verifico se end deriva da split - local vEndId = EgtGetInfo( nOutlineId, WIN_SPLIT_ENDINTERS, 'vi') - local nEndOutlineId = EgtGetInfo( vEndId[i], WIN_COPY, 'i') - local nEndSouId = EgtGetInfo( nEndOutlineId, WIN_REF_SPLIT, 'i') - if nEndSouId then - -- recupero vettore tangente nel punto medio della curva di contorno - local ptMidEnd = EgtMP( vEndId[i]) - local vtMidEnd = EgtMV( vEndId[i]) - -- recupero vettore tangente nello stesso punto della curva split originale - local dMidStartOnEndSou = EgtCurveParamAtPoint( nEndSouId, ptMidEnd) - local vtMidEndSou = EgtUV( nEndSouId, dMidStartOnEndSou, -1) - -- se i due vettori non sono orientati nella stessa direzione - if not AreSameVectorApprox( vtMidEnd, vtMidEndSou) then - -- ruoto di 180 gradi il profilo - local frEndProfileS = EgtFR( nEndProfileFrameId, GDB_ID.ROOT) - EgtRotate( vEndProfileId[i], frEndProfileS:getOrigin(), frEndProfileS:getVersY(), 180, GDB_RT.GLOB) - end - end - end - - -- recupero outline del profilo End e lo estrudo - local nOutEndProfileId - if vsEndProfileType[i] == WIN_MINIZINKEN then - nOutEndProfileId = EgtLine( vEndProfileId[i], EgtSP( vNextGeoId[i]), EgtSP( vNextGeoId[i]) - Z_AX() * b3RefEndProfile:getDimY(), GDB_RT.GLOB) - EgtInvertCurve( nOutEndProfileId) - else - nOutEndProfileId = EgtGetFirstNameInGroup( vEndProfileId[i], vsEndProfileType[i]) - end - local nEndExtrusionId = EgtSurfTmSwept( nSolidLayerId, nOutEndProfileId, nEndGuideId, false, WIN_SURF_APPROX) - -- eseguo intersezione per ottenere un solido unico - EgtSurfTmIntersect( nMainExtrusionId, nEndExtrusionId) - EgtErase( nEndExtrusionId) - EgtErase( nEndGuideId) - end - -end - ---------------------------------------------------------------------- --- funzione che calcola l'ingombro dei pezzi del telaio e i loro solidi -local function CreatePartFromOutline( nAreaLayerId, nOutlineId, nOutlineCrvNbr, bBottomRail) - - -- creo pezzo - local nPartId = EgtGroup( GDB_ID.ROOT) - -- inserisco riferimento alla sua area - EgtSetInfo( nPartId, WIN_AREA, nAreaLayerId) - - local nAreaType = EgtGetInfo( nAreaLayerId, WIN_AREATYPE, 'i') - local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_OUTLINE) - - -- a) Telaio, anta o split - if nAreaType == WIN_AREATYPES.FRAME or nAreaType == WIN_AREATYPES.SASH or nAreaType == WIN_AREATYPES.SPLIT then - - -- creo riferimenti tra pezzo e outline - EgtSetInfo( nPartId, WIN_REF_OUTLINE, nOutlineId) - if bBottomRail then - EgtSetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, nPartId) - else - EgtSetInfo( nOutlineId, WIN_REF_PART, nPartId) - end - - -- imposto nome del pezzo - local sName = EgtGetName( nOutlineId) - if bBottomRail then - sName = WIN_BOTTOMRAIL - end - EgtSetName( nPartId, sName) - - -- imposto colore - if sName == WIN_BOTTOM or sName == WIN_TOP or bBottomRail then - EgtSetColor( nPartId, Color3d( 204, 102, 0)) - elseif sName == WIN_RIGHT or sName == WIN_LEFT then - EgtSetColor( nPartId, Color3d( 251, 128, 4)) - else - EgtSetColor( nPartId, Color3d( 255, 159, 57)) - end - - -- setto le info di sovramateriale ( TO DO : capire da dove devono essere ricavate) - EgtSetInfo( nPartId, WIN_PRC_OVERMAT_IN, 0) - EgtSetInfo( nPartId, WIN_PRC_OVERMAT_OUT, 0) - EgtSetInfo( nPartId, WIN_PRC_OVERMAT_LEFT, 0) - EgtSetInfo( nPartId, WIN_PRC_OVERMAT_RIGHT, 0) - - -- ricavo il tipo di profilo - local nProfileType = GetOutlineProfileType( nOutlineId, bBottomRail) - -- disegno ingombro - local nGeoId = CalcFrameGeo( nPartId, nOutlineId, nOutlineCrvNbr, nOutlineLayerId, nProfileType) - -- disegno solido - if bCalcSolid then - CalcFrameSolid( nPartId, nOutlineId, nGeoId, nProfileType) - end - - -- b) Fill - elseif nAreaType == WIN_AREATYPES.FILL then - -- imposto nome del pezzo - EgtSetName( nPartId, WIN_FILL) - -- ricavo tipo - local nFillType = EgtGetInfo( nAreaLayerId, WIN_FILLTYPE, 'i') - -- imposto colore - if nFillType == WIN_FILLTYPES.GLASS then - EgtSetColor( nPartId, Color3d( 71, 161, 255)) - EgtSetAlpha( nPartId, 30) - elseif nFillType == WIN_FILLTYPES.WOOD then - EgtSetColor( nPartId, Color3d( 194, 148, 103)) - end - - -- disegno ingombro - local nGeoLayerId = CalcFillGeo( nPartId, nOutlineLayerId) - -- disegno solido - if bCalcSolid then - CalcFillSolid( nPartId, nOutlineLayerId, nGeoLayerId) - end - end - return nPartId -end - - ---------------------------------------------------------------------- ----------------------------- STRIP ---------------------------------- ---------------------------------------------------------------------- --- funzione che restitutisce lo Strip piu' vicino +-- funzione che restitutisce lo Strip piu' vicino -- ( analoga a GetProfileCtrIn) local function GetStripNearestToOutline( nPrevProfileId, nPrevOutlineId, nOutlineId) local nStripId = EgtGetFirstNameInGroup( nPrevProfileId, WIN_STRIP) @@ -2235,19 +2722,17 @@ local function CreateStripFromOutline( nAreaId, nOutlineId) 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) -- recupero gli outline precedente e successivo ( non serve utilizzare un WIN_PRF accurato perchè conta solo sia diverso da split) local nOutlineLayerId = EgtGetParent( nOutlineId) local vPrevOutlineId, vNextOutlineId = GetPrevNextOutline( WIN_PRF.NULL, nOutlineId, nOutlineLayerId) - local nPrevOutlineId = vPrevOutlineId[1] - local nNextOutlineId = vNextOutlineId[1] -- recupero i pezzi precedente e successivo, prendendo eventualmente quelli di bottomrail - local nPrevPartId = FindAssociatedPart( nPrevOutlineId) - local nNextPartId = FindAssociatedPart( nNextOutlineId) + local nPrevPartId = FindAssociatedPart( vPrevOutlineId[1]) + local nNextPartId = FindAssociatedPart( vNextOutlineId[1]) -- recupero profilo e controprofili + local nMainProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) local nMainProfileId = EgtGetFirstNameInGroup( nMainProfileLayerId, WIN_PRF_MAIN) local nPrevProfileLayerId = EgtGetFirstNameInGroup( nPrevPartId, WIN_PROFILE) local nStartProfileId = EgtGetFirstNameInGroup( nPrevProfileLayerId, WIN_PRF_MAIN) @@ -2257,19 +2742,26 @@ local function CreateStripFromOutline( nAreaId, nOutlineId) -- a) estrudo il fermavetro -- recupero guida Main local nGuideId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_MAINGUIDE) - -- recupero strip piu' vicino a prev outline - local nMainStripId = GetStripNearestToOutline( nMainProfileId, nOutlineId, nPrevOutlineId) - -- estrudo MainStrip - local nMainStripExtrusionId = EgtSurfTmSwept( nSolidLayerId, nMainStripId, nGuideId, false, WIN_SURF_APPROX) + -- recupero strip piu' vicino a prev outline e lo posiziono sulla guida + local nMainStripId = GetStripNearestToOutline( nMainProfileId, nOutlineId, vPrevOutlineId[1]) + local nSectionId = EgtCopyGlob( nMainStripId, nSolidLayerId) + local nFrameProfileId = EgtGetFirstNameInGroup( nMainProfileId, WIN_SECTIONFRAME) + local frOrig = EgtFR( nFrameProfileId, GDB_ID.ROOT) + frOrig:invert() + local frDest = Frame3d( EgtSP( nGuideId), - EgtSV( nGuideId)) + EgtTransform( nSectionId, frOrig) + EgtTransform( nSectionId, frDest) + -- creo estrusione + local nMainStripExtrusionId = EgtSurfTmSwept( nSolidLayerId, nSectionId, nGuideId, false, WIN_SURF_APPROX) EgtSetName( nMainStripExtrusionId, WIN_SRF_STRIP) -- b) taglio con start -- recupero strip dello start piu' vicino ad outline - local nStartStripId = GetStripNearestToOutline( nStartProfileId, nPrevOutlineId, nOutlineId) + local nStartStripId = GetStripNearestToOutline( nStartProfileId, vPrevOutlineId[1], nOutlineId) -- disegno guida start per lo strip trovando le intersezioni degli outline minimi e massimi tra MainStrip e StartStrip local nMainStripMinOffsetId, nMainStripMaxOffsetId = CreateStripGuideLines( nOutlineId, nMainStripId, nMainProfileId, nSolidLayerId) - local nStartStripMinOffsetId, nStartStripMaxOffsetId = CreateStripGuideLines( nPrevOutlineId, nStartStripId, nStartProfileId, nSolidLayerId) + local nStartStripMinOffsetId, nStartStripMaxOffsetId = CreateStripGuideLines( vPrevOutlineId[1], nStartStripId, nStartProfileId, nSolidLayerId) local ptStripMinStart = FindIntersectionPoint( nMainStripMinOffsetId, nStartStripMinOffsetId, EgtSP( nMainStripMinOffsetId)) local ptStripMaxStart = FindIntersectionPoint( nMainStripMaxOffsetId, nStartStripMaxOffsetId, EgtSP( nMainStripMinOffsetId)) local nStartStripGuideId = EgtLine( nSolidLayerId, ptStripMinStart, ptStripMaxStart) @@ -2287,10 +2779,10 @@ local function CreateStripFromOutline( nAreaId, nOutlineId) -- c) taglio con end -- recupero strip piu' vicino ad outline - local nEndStripId = GetStripNearestToOutline( nEndProfileId, nNextOutlineId, nOutlineId) + local nEndStripId = GetStripNearestToOutline( nEndProfileId, vNextOutlineId[1], nOutlineId) -- disegno guida end per lo strip trovando le intersezioni degli outline minimi e massimi tra MainStrip ed EndStrip - local nEndStripMinOffsetId, nEndStripMaxOffsetId = CreateStripGuideLines( nNextOutlineId, nEndStripId, nEndProfileId, nSolidLayerId) + local nEndStripMinOffsetId, nEndStripMaxOffsetId = CreateStripGuideLines( vNextOutlineId[1], nEndStripId, nEndProfileId, nSolidLayerId) local ptStripMinEnd = FindIntersectionPoint( nMainStripMinOffsetId, nEndStripMinOffsetId, EgtEP( nMainStripMinOffsetId)) local ptStripMaxEnd = FindIntersectionPoint( nMainStripMaxOffsetId, nEndStripMaxOffsetId, EgtEP( nMainStripMaxOffsetId)) local nEndStripGuideId = EgtLine( nSolidLayerId, ptStripMinEnd, ptStripMaxEnd) @@ -2308,12 +2800,102 @@ local function CreateStripFromOutline( nAreaId, nOutlineId) EgtSurfTmIntersect( nMainStripExtrusionId, nEndStripExtrusionId) -- cancello curve e superfici di costruzione + EgtErase( nSectionId) EgtErase( { nMainStripMinOffsetId, nMainStripMaxOffsetId}) EgtErase( { nStartStripMinOffsetId, nStartStripMaxOffsetId, nStartStripGuideId, nStartStripProfileId, nStartStripExtrusionId}) EgtErase( { nEndStripMinOffsetId, nEndStripMaxOffsetId, nEndStripGuideId, nEndStripProfileId, nEndStripExtrusionId}) end + + +---------------------------------------------------------------------------------- +----------------------------- CALCOLO PEZZI ------------------------------------ +---------------------------------------------------------------------------------- +-- funzione che calcola l'ingombro dei pezzi del telaio e i loro solidi +local function CreatePartFromOutline( nAreaLayerId, nOutlineId, nOutlineCrvNbr, bBottomRail) + + -- creo pezzo + local nPartId = EgtGroup( GDB_ID.ROOT) + -- inserisco riferimento alla sua area + EgtSetInfo( nPartId, WIN_AREA, nAreaLayerId) + + local nAreaType = EgtGetInfo( nAreaLayerId, WIN_AREATYPE, 'i') + local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_OUTLINE) + + -- a) Telaio, anta o split + if nAreaType == WIN_AREATYPES.FRAME or nAreaType == WIN_AREATYPES.SASH or nAreaType == WIN_AREATYPES.SPLIT then + + -- creo riferimenti tra pezzo e outline + EgtSetInfo( nPartId, WIN_REF_OUTLINE, nOutlineId) + if bBottomRail then + EgtSetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, nPartId) + else + EgtSetInfo( nOutlineId, WIN_REF_PART, nPartId) + end + + -- imposto nome del pezzo + local sName = EgtGetName( nOutlineId) + if bBottomRail then + sName = WIN_BOTTOMRAIL + end + EgtSetName( nPartId, sName) + + -- imposto colore + if sName == WIN_BOTTOM or sName == WIN_TOP or bBottomRail then + EgtSetColor( nPartId, Color3d( 204, 102, 0)) + elseif sName == WIN_RIGHT or sName == WIN_LEFT then + EgtSetColor( nPartId, Color3d( 251, 128, 4)) + else + EgtSetColor( nPartId, Color3d( 255, 159, 57)) + end + + -- setto le info di sovramateriale ( TO DO : capire da dove devono essere ricavate) + EgtSetInfo( nPartId, WIN_PRC_OVERMAT_IN, 0) + EgtSetInfo( nPartId, WIN_PRC_OVERMAT_OUT, 0) + EgtSetInfo( nPartId, WIN_PRC_OVERMAT_LEFT, 0) + EgtSetInfo( nPartId, WIN_PRC_OVERMAT_RIGHT, 0) + + -- ricavo il tipo di profilo + local nProfileType = GetOutlineProfileType( nOutlineId, bBottomRail) + -- disegno ingombro + CalcFrameGeo( nPartId, nOutlineId, nOutlineCrvNbr, nOutlineLayerId, nProfileType) + -- calcolo eventuali curve ausiliarie per cambio profilo + local bChangeProfile = EgtGetInfo( nOutlineId, WIN_PRF_CHANGE, 'b') or false + if bChangeProfile and nProfileType ~= WIN_PRF.SPLIT then + CalcMixedFrameCurves( nPartId, nOutlineId) + end + -- calcolo le lavorazioni associate ai profili + CalcProfilingProcessings( nPartId, nOutlineId) + -- disegno solido + if bCalcSolid then + CalcSolid( nPartId, nOutlineId) + end + + -- b) Fill + elseif nAreaType == WIN_AREATYPES.FILL then + -- imposto nome del pezzo + EgtSetName( nPartId, WIN_FILL) + -- ricavo tipo + local nFillType = EgtGetInfo( nAreaLayerId, WIN_FILLTYPE, 'i') + -- imposto colore + if nFillType == WIN_FILLTYPES.GLASS then + EgtSetColor( nPartId, Color3d( 71, 161, 255)) + EgtSetAlpha( nPartId, 30) + elseif nFillType == WIN_FILLTYPES.WOOD then + EgtSetColor( nPartId, Color3d( 194, 148, 103)) + end + + -- disegno ingombro + local nGeoLayerId = CalcFillGeo( nPartId, nOutlineLayerId) + -- disegno solido + if bCalcSolid then + CalcFillSolid( nPartId, nOutlineLayerId, nGeoLayerId) + end + end + return nPartId +end + --------------------------------------------------------------------- -- funzione che cicla ricorsivamente su aree e sottoaree per calcolare i pezzi local function CalculateAreaParts( nAreaId) @@ -2359,7 +2941,6 @@ local function CalculateAreaParts( nAreaId) EgtSetColor( nSelectionArea, 'YELLOW') EgtSetAlpha( nSelectionArea, 10) EgtMove( nSelectionArea, 10 * Z_AX()) - EgtErase( nCompoId) end end elseif nAreaType ~= WIN_AREATYPES.FILL then @@ -2401,12 +2982,13 @@ local function CalculateAreaParts( nAreaId) end ---------------------------------------------------------------------- -------------------------- FUNZIONI ---------------------------------- ---------------------------------------------------------------------- + +---------------------------------------------------------------------------------- +------------------------------ 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 + -- assegno il tipo di profilo alle curve del base outline CalculateAreaProfileType( nFrameId) -- calcolo outline a partire dal base outline CalculateAreaOutline( nFrameId) @@ -2495,6 +3077,12 @@ function WinCalculate.PrepareProject() local nProfileGrp = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) EgtErase( nProfileGrp) + -- cancello eventuali gruppi ausiliari per cambio profilo + local nMixedOutlines = EgtGetFirstNameInGroup( nPartId, WIN_MIXED_OUTLINES) + EgtErase( nMixedOutlines or GDB_ID.NULL) + local nMixedIntersections = EgtGetFirstNameInGroup( nPartId, WIN_MIXED_INTERSECTIONS) + EgtErase( nMixedIntersections or GDB_ID.NULL) + -- accendo gruppo delle lavorazioni local nProcLay = EgtGetFirstNameInGroup( nPartId, WIN_PRC) EgtSetStatus( nProcLay, GDB_ST.ON) @@ -2525,9 +3113,10 @@ function WinCalculate.PrepareProject() end ---------------------------------------------------------------------- ------------------------- FERRAMENTA --------------------------------- ---------------------------------------------------------------------- + +---------------------------------------------------------------------------------- +---------------------------------- FERRAMENTA ---------------------------------- +---------------------------------------------------------------------------------- local function SearchSash( nAreaId, SashList) -- verifico il tipo local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i') From 4fa9e9fce4c3ffe787cf544509ed6061d54c3dc3 Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 20 Sep 2024 12:27:58 +0200 Subject: [PATCH 6/7] - correzioni cambio profilo. --- Profiles/Profilo78 - Offset - Copy (51).nge | Bin 0 -> 342148 bytes Profiles/Profilo78 - Offset.nge | Bin 342148 -> 339193 bytes Profiles/WinConst.lua | 3 +- Profiles/WinLib/WinCalculate.lua | 463 ++++++++------------ 4 files changed, 187 insertions(+), 279 deletions(-) create mode 100644 Profiles/Profilo78 - Offset - Copy (51).nge diff --git a/Profiles/Profilo78 - Offset - Copy (51).nge b/Profiles/Profilo78 - Offset - Copy (51).nge new file mode 100644 index 0000000000000000000000000000000000000000..aa6055e4d29bc0e4958afbd9e6b8fc5560a9f604 GIT binary patch literal 342148 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 literal 0 HcmV?d00001 diff --git a/Profiles/Profilo78 - Offset.nge b/Profiles/Profilo78 - Offset.nge index aa6055e4d29bc0e4958afbd9e6b8fc5560a9f604..2c8f86bfb18d3dd7f2171f336f41265c44753793 100644 GIT binary patch delta 1159 zcmb7ESxi$|81DJ6U7%1vE2tv{X?OuW;Jpr9yMWr>1YlVKHHftW~Upki=b zD0mJ3I1kEk(036NMf@3G)-_bqEMpk~Fl>fd8DcE1 zsASmb^mkj@HN^xqC9sx4!2wfn5<{in69-I;QHYwtVxFI0#L`0RjwEz{CQ+#Q6Pj@0 zC!)mH>7c-}I`GK9`U5K;*C&%iT$M;tgjM5X$lTz5|5-|bW(F+S(+F~mF9!oItRhR1 zdq!mVjsYHf=0FUVbU+en>P63%dawus1{vO53R44IJuYvB44}lwq}e^0J-bvDJYFqo%Sl8+8+9CzqtBZR%{i#xf9ZZk@#%Hu%)$3D&g{9XEwKf z@p<~L*$Yc@_j<%^hZZDN9Cql+G2s)KkV^%*?j8jzYo(ld5x=AReBHSaPvX{;`cFm~ zIrZJWz0EAz9mJyKCQdt}ks3JZWh?eLh)(EFmZ9@6Qmj4b*pssLMS7re;^O1g5tlH2 ztJsU=Z_tVnMq_^(6|GEF;W8&MT&SYM`t77l&&#fEac`qJ_26^f^-oR2#}Ieid;QBS z?$W*+FP&d8`#xCoBeCiTcXsLWLrwQ{xT%+Cueb!iVKy{J+5^LUw}*c>>A^Sp+L9HMNnm2F>SjL2|g+yr3zM|F)AfJeNgO_;43l z5OOI9Rfk=IEeirJ$afHHgcxi${5!T?(A_y8DGC!!f|-ww%M7E9r$+1T4~Ciw&l?+D ziC3UJ71z1RC_L>GCq4>q`rua_LsO%H&O+M&n2dozo>Q}_;&<_;vvk&XbIq_c6D?K) d4~1ByS&OS~00z0_A9C8;XiEG>9crVc@^53!m74$n delta 1914 zcmZWq2~ZPP7~XwB0!hpv3K2vJlAtJ%kl=XXJ`2MXLVsqqN0flVm!EVQY1HDaj!zdP8c^k^q!t1WxGTVxZvjXkKh$PHIfb zH_c(bKo<{g0n}6k7NF?0KvrEUL{t%w%5Z>T0$LQ8VHmx|=Bp^?%a4VYH4NPt0a9fF z&7!|y!h>BgXjz7dHdf4h)^f(ME>=4MotVq5i=1! zRJ3Gh{LarSr8mQKm z&E>~Utp?re{%7VXBX8YG0={TRvM}6(gpoqBs>fa!+L&fYC|AM+P0buTWC@GEqOYVr z>J>5Gx#3X9wJWB1Cpk_b;Z{3A;|EgfTinr&O}JX1FDrMAoA8ImvGzXnrW8bql!2?a zMqZ>`VR4~vYl|4k4%>NpHwMej-I*(eqd%nAt=QIW`d#qW!)xs6ly4awL-z;DUXggC zMp$t-p!>^c7Z~Y=U6rcHEPGGyBK@AqgO>zwv_>gyQU7D=QdQjktd6_9&y~-XH zDshdY7n?^Z+=XD^M=z~pnPT{zdrz*f;9t|PcY~E%F{>pOUxb!*$?+&pFE(!?pzr8%}kvXF*PS?6X%Cuk3ez7$JcfMM<51^+dJ37i>Rz z-Zk#B1eRvcm~-bgiTnGI{;fQPE!isWw#;i89x?+~9}~v)-e<){{XB&&*(#oWbd3A$ z*%`1Uf7Y(<2dsG1LZ0CNWHdVtgphUHc_>-~q{6}83Uj@)5>6bbY0|zy`_#aPq^9u{ zwsh^3|9|e7F85R^VYVDPkG!?Wn;}nOOSj5jLJ7$Z5lWa#dOdchkg61D937a)pbLx3 z6qdIl@*VTGh@guo=d6VF*1$Y(P&YK!U11l%djfo zY!(AxeG=_(okc-(2Jl6;3@uWn(=cZG8q%Hti%^ytxS*Zcmaex5RRLOs0Vh@v3tuzA z=dbyosTMF)iXtF;qj(Z$!;|>KutHXwZK^Ejk=R5x)}b=sh6|8`5$u$GGzplV9;@4y z5|WZ;NDK;4qxu2b$yy_j*i42&BiJj)-AVt{xhDe?+w7a;Pl2zv!m%C1mIrMVF+{~* zt|=jVLtOnVE}DrKqb}5mClujv^Lf>RcXZxLa~DZZADHSC8%G{XhyWz>*P$B>wjltR<^42>Rrme@7uCpkTf@&x$w<`)BC5Xu}U k`SfTE(l7?t85*ifOG_~Xsg-_#WfO7^{oDOAA)m(m51aO>tN;K2 diff --git a/Profiles/WinConst.lua b/Profiles/WinConst.lua index 3bf0811..13ebb4f 100644 --- a/Profiles/WinConst.lua +++ b/Profiles/WinConst.lua @@ -234,8 +234,7 @@ WIN_GAPDELTAIN = 'GapDeltaIn' WIN_GAPDELTAOUT = 'GapDeltaOut' WIN_FIXED_REF = 'FixedRef' WIN_SASH_REF = 'SashRef' -WIN_MIXED_DEPTH = 'MixedDepth' -WIN_MIXED_FILLET = 'MixedFillet' +WIN_SASH_DEPTH = 'SashDepth' WIN_PRC_PHASE = 'PHASE' WIN_PRC_PROFILE_TYPE = 'PROFILE_TYPE' WIN_PRC_NTOOLS = 'NTOOLS' diff --git a/Profiles/WinLib/WinCalculate.lua b/Profiles/WinLib/WinCalculate.lua index d97723b..30c9d33 100644 --- a/Profiles/WinLib/WinCalculate.lua +++ b/Profiles/WinLib/WinCalculate.lua @@ -991,7 +991,7 @@ local function GetProfileCtrIn( nPrevOutlineId, nOutlineId, nPrevProfileId) else -- 2) pezzo del telaio con cambio profilo -- il profilo da usare dipende dal pezzo corrente: se ha figli di tipo fill allora è legato alla parte fill del cambio profilo, se ha figli di tipo sash è legato alla parte sash, - -- se ha entrambe le tipologie di figli allora è mixed split e conviene considerare parte sash perchè ha DeltaCP minore + -- se ha entrambe le tipologie di figli allora è mixed split e va considerata la parte sash ( perchè è quella utilizzata per tagliare il pezzo) local vSashChildren = EgtGetInfo( nOutlineId, WIN_SASH_CHILDREN, 'vi') if vSashChildren then sPrevCtrIn = WIN_SASH .. WIN_CTRIN @@ -1205,7 +1205,7 @@ local function CreateFrameGeo( nOutlineId, vPrevOutlineId, vNextOutlineId, nStar EgtSetInfo( nNextCurveId, WIN_SEMI_PROFILE, nNextSemiProfile) EgtSetInfo( nNextCurveId, WIN_REF_OUTLINE, vNextOutlineId[i]) EgtRelocateGlob( nNextCurveId, nCurrOffsetId, GDB_IN.BEFORE) - end + end -- trim delle curve TrimAndOrientOrderedCurveLayer( nGeoLayerId, false) @@ -1387,7 +1387,7 @@ local function CalcMixedOutlines( nPartId, nOutlineId) end --------------------------------------------------------------------- --- funzione che crea la curva di lavorazione sulla giunzione tra il pezzo di split e il pezzo di telaio con cambio profilo +-- funzione che crea la curva di riferimento sulla giunzione tra il pezzo di split e il pezzo di telaio con cambio profilo local function CalcMixedIntersections( nPartId, nOutline, vOutlines) local nGrp = EgtGroup( nPartId) @@ -1423,48 +1423,18 @@ local function CalcMixedIntersections( nPartId, nOutline, vOutlines) vtDir45:rotate( Z_AX(), EgtIf( bSashFill, 225, -45)) local nCrv3 = EgtLinePVL( nGrp, ptRef1, vtDir45, 100) local nCrv4 = EgtCopyGlob( nOutline, nGrp) - local dDeltaSashFrame = EgtGetInfo( nMainProfileId, WIN_SASH_REF, 'd') + local dDeltaSashFrame = EgtGetInfo( nMainProfileId, WIN_SASH_REF .. '1', 'd') EgtOffsetCurve( nCrv4, - dDeltaSashFrame) local ptRef2 = EgtIP( nCrv3, nCrv4, ORIG()) - -- ricavo il punto finale del tratto del telaio contro anta - local nCrv5 = EgtCopyGlob( nSplitId, nGrp) - local dSizeSplit = EgtGetInfo( nSplitProfileId, WIN_SASH_REF, 'd') - EgtOffsetCurve( nCrv5, - dSizeSplit) - local ptRef3 = EgtIP( nCrv4, nCrv5, ORIG()) - - -- creo la curva di intersezione : - -- a) taglio a 45° + -- curva di intersezione da usare come riferimento per i conti successivi local nCrv = EgtCurveCompoFromPoints( nGrp, { ptRef1, ptRef2}) - -- b) tratto lungo il telaio - if bSashFill then - EgtInvertCurve( nCrv4) - end - local dParS = EgtCurveParamAtPoint( nCrv4, ptRef2) - local dParE = EgtCurveParamAtPoint( nCrv4, ptRef3) - EgtTrimCurveStartEndAtParam( nCrv4, dParS, dParE) - - -- c) fillet - local dFillet = 0 -- EgtGetInfo( nSplitProfileId, WIN_MIXED_FILLET, 'd') - local nFillet = EgtCurveFillet( nGrp, nCrv, EgtMP( nCrv), nCrv4, EgtMP( nCrv4), dFillet, true) or GDB_ID.NULL - EgtAddCurveCompoCurve( nCrv, nFillet) - EgtAddCurveCompoCurve( nCrv, nCrv4) - - -- d) tratto lungo split - if not EgtCurveParamAtPoint( nOutline, EgtSP( nSplitId)) then - EgtInvertCurve( nCrv5) - end - local dPar = EgtCurveParamAtPoint( nCrv5, ptRef3) - EgtTrimCurveStartAtParam( nCrv5, dPar) - EgtTrimCurveEndAtLen( nCrv5, 100) - EgtAddCurveCompoCurve( nCrv, nCrv5) - + -- cancello curve di costruzione - EgtErase( { nCrv1, nCrv2, nCrv3, nCrv4, nCrv5}) - + EgtErase( { nCrv1, nCrv2, nCrv3, nCrv4}) + -- assegno riferimento EgtSetInfo( vOutlines[i], WIN_MIXED_INTERS_REF, nCrv) - end end @@ -1505,11 +1475,52 @@ local function GetProcessingInfoFromSemiProfile( nCrv, nSemiProfile) end end +--------------------------------------------------------------------- +-- funzione che calcola la lavorazione per l'innesto dello split sul telaio nel caso di cambio profilo +local function CalcMixedFrameMillingProcessings( nIntersCrv, nOutlineId, dOffs, dDepth, nSplitRef, bSashFill, nProcLayerId, nSurfGeoId) + + local nMilling = EgtCopyGlob( nIntersCrv, nProcLayerId) + EgtExtendCurveStartByLen( nMilling, 100) + + -- calcolo il tratto di outline + local nOutlineCrv = EgtCopyGlob( nOutlineId, nProcLayerId) + EgtOffsetCurve( nOutlineCrv, - dOffs) + if bSashFill then + EgtInvertCurve( nOutlineCrv) + end + local pt1 = EgtIP( nMilling, nOutlineCrv, ORIG()) + local pt2 = EgtIP( nOutlineCrv, nSplitRef, ORIG()) + local dParS = EgtCurveParamAtPoint( nOutlineCrv, pt1) + local dParE = EgtCurveParamAtPoint( nOutlineCrv, pt2) + EgtTrimCurveStartEndAtParam( nOutlineCrv, dParS, dParE) + + -- aggiungo il tratto derivante dall'outline + if not AreSamePointApprox( pt1, EgtEP( nMilling)) then + local dParTrim = EgtCurveParamAtPoint( nMilling, pt1) + EgtTrimCurveEndAtParam( nMilling, dParTrim) + end + EgtAddCurveCompoCurve( nMilling, nOutlineCrv) + + -- aggiungo tratto di uscita a 45° + local vtDir2 = EgtEV( nMilling) + vtDir2:rotate( Z_AX(), EgtIf( bSashFill, - 45, 45)) + EgtAddCurveCompoLine( nMilling, EgtEP( nMilling) + vtDir2 * 100) + + if bSashFill then + EgtInvertCurve( nMilling) + end + EgtModifyCurveThickness( nMilling, - dDepth) + EgtSetInfo( nMilling, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.PROFILING) + EgtTrimCurveWithRegion( nMilling, nSurfGeoId, true, false) + +end + --------------------------------------------------------------------- -- funzione che calcola le lavorazioni di profiling per un pezzo di telaio con cambio profilo local function CalcMixedFrameProfilingProcessings( nPartId, nProcLayerId, nGeoLayerId, nMainProfileId, nSurfGeoId) - -- per le lavorazioni dei profili out, left, right e in comune uso le corrispondenti curve del geo + -- a) lavorazioni profili + -- per le lavorazioni dei profili out, left, right e in comune si usano le corrispondenti curve del geo local vGeoCrvs = EgtGetAllInGroup( nGeoLayerId) for i = 1, #vGeoCrvs do -- copio curva @@ -1519,7 +1530,7 @@ local function CalcMixedFrameProfilingProcessings( nPartId, nProcLayerId, nGeoLa GetProcessingInfoFromSemiProfile( nCrv, nSemiProfile) end - -- lavorazione dei sottotratti in di sash e fill + -- lavorazioni dei sottotratti in di sash e fill local nOutlinesGrp = EgtGetFirstNameInGroup( nPartId, WIN_MIXED_OUTLINES) local vCrvs = EgtGetAllInGroup( nOutlinesGrp) local b3Profile = GetProfileLocalBox( nMainProfileId) @@ -1527,7 +1538,6 @@ local function CalcMixedFrameProfilingProcessings( nPartId, nProcLayerId, nGeoLa for i = #vCrvs, 1, -1 do -- calcolo la curva di lavorazione local nCrv = EgtCopyGlob( vCrvs[i], nProcLayerId) - EgtSetName( nCrv, WIN_GEO_IN) EgtOffsetCurve( nCrv, dOffs) EgtInvertCurve( nCrv) nCrv = EgtTrimCurveWithRegion( nCrv, nSurfGeoId, true, true) @@ -1536,87 +1546,72 @@ local function CalcMixedFrameProfilingProcessings( nPartId, nProcLayerId, nGeoLa GetProcessingInfoFromSemiProfile( nCrv, nSemiProfile) end - -- lavorazioni sulle intersezioni con gli split + -- b) lavorazioni sulle intersezioni con gli split local nIntersGrp = EgtGetFirstNameInGroup( nPartId, WIN_MIXED_INTERSECTIONS) local vInters = EgtGetAllInGroup( nIntersGrp) - local dDepth = EgtGetInfo( nMainProfileId, WIN_MIXED_DEPTH, 'd') + local nOutlineId = EgtGetInfo( nPartId, WIN_REF_OUTLINE, 'i') for i = 1, #vInters do - local nCrv = EgtCopyGlob( vInters[i], nProcLayerId) - EgtSetName( nCrv, WIN_GEO_IN) - nCrv = EgtTrimCurveWithRegion( nCrv, nSurfGeoId, true, true) - EgtSetInfo( nCrv, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.PROFILING) + + local bSashFill = ( EgtGetName( vCrvs[i]) == WIN_SASH) + -- recupero lo split associato e creo la curva di riferimento per le fresature + local nSplitId = EgtGetInfo( vCrvs[i], WIN_MIXED_SPLIT_REF, 'i') + local nSplitProfileId = GetOutlineProfileId( nSplitId, false) + local dRefSplit = EgtGetInfo( nSplitProfileId, WIN_SASH_REF .. '2', 'd') + local nSplitRef = EgtCopyGlob( nSplitId, nProcLayerId) + EgtOffsetCurve( nSplitRef, - dRefSplit) + + -- Fresatura 1 + local dOffs1 = EgtGetInfo( nMainProfileId, WIN_SASH_REF .. '1', 'd') + local dDepth1 = EgtGetInfo( nMainProfileId, WIN_SASH_DEPTH .. '1', 'd') + CalcMixedFrameMillingProcessings( vInters[i], nOutlineId, dOffs1, dDepth1, nSplitRef, bSashFill, nProcLayerId, nSurfGeoId) + -- Fresatura 2 + local dOffs2 = EgtGetInfo( nMainProfileId, WIN_SASH_REF .. '2', 'd') + local dDepth2 = EgtGetInfo( nMainProfileId, WIN_SASH_DEPTH .. '2', 'd') + CalcMixedFrameMillingProcessings( vInters[i], nOutlineId, dOffs2, dDepth2, nSplitRef, bSashFill, nProcLayerId, nSurfGeoId) + + EgtErase( nSplitRef) end end ---------------------------------------------------------------------- -local function CalcMixedSplitLeftRightProcessing( nOutlineId, nProfileId, sSemiProfileName, nSurfGeoId, nProcLayerId, sName) - - local nCrv = EgtCopyGlob( nOutlineId, nProcLayerId) - EgtSetName( nCrv, sName) - -- posiziono correttamente - local dDelta = GetDeltaProfile( nProfileId, sSemiProfileName) - EgtOffsetCurve( nCrv, - dDelta) - -- taglio con geo - nCrv = EgtTrimCurveWithRegion( nCrv, nSurfGeoId, true, true) - -- setto info di lavorazione - local nSemiProfile = EgtGetFirstNameInGroup( nProfileId, sSemiProfileName) - GetProcessingInfoFromSemiProfile( nCrv, nSemiProfile) - -end - --------------------------------------------------------------------- -- funzione che calcola le lavorazioni di profiling nel caso di uno split coinvolto da cambio profilo -local function CalcMixedSplitProfilingProcessings( nSplitId, nProcLayerId, nGeoLayerId, nProfileLayerId, nSurfGeoId) +local function CalcMixedSplitProfilingProcessings( nSplitId, nProcLayerId, nGeoLayerId) - -- 1) lavorazione profilo out - local nGeoOutId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_OUT) - local nCrvOutId = EgtCopyGlob( nGeoOutId, nProcLayerId) - local nSemiProfileOutId = EgtGetInfo( nCrvOutId, WIN_SEMI_PROFILE, 'i') - GetProcessingInfoFromSemiProfile( nCrvOutId, nSemiProfileOutId) - - -- 2) lavorazione profilo in - local nGeoInId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN) - local nCrvInId = EgtCopyGlob( nGeoInId, nProcLayerId) - local nSemiProfileInId = EgtGetInfo( nCrvInId, WIN_SEMI_PROFILE, 'i') - GetProcessingInfoFromSemiProfile( nCrvInId, nSemiProfileInId) + -- a) lavorazione dei profili + local vGeoCrvs = EgtGetAllInGroup( nGeoLayerId) + for i = 1, #vGeoCrvs do + -- copio la curva + local nCrvId = EgtCopyGlob( vGeoCrvs[i], nProcLayerId) + -- recupero il semiprofilo associato ( per left e right è stato salvato il profilo di tipo sash) + local nSemiProfileId = EgtGetInfo( nCrvId, WIN_SEMI_PROFILE, 'i') + -- setto le info dal semiprofilo + GetProcessingInfoFromSemiProfile( nCrvId, nSemiProfileId) + end + + -- b) tagli a 45° + -- left + local nMixedLeft = EgtGetInfo( nSplitId, WIN_MIXED_REF_START, 'i') + local nIntersLeft = EgtGetInfo( nMixedLeft, WIN_MIXED_INTERS_REF, 'i') + local nMillingLeft = EgtCopyGlob( nIntersLeft, nProcLayerId) + EgtSetName( nMillingLeft, WIN_LEFT) + EgtSetInfo( nMillingLeft, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.PROFILING) + -- recupero profondità + local vOutlineLeft = EgtGetInfo( nSplitId, WIN_PREV_OUTLINES, 'vi') + local nProfileLeft = GetOutlineProfileId( vOutlineLeft[1], false) + local dDepthLeft = EgtGetInfo( nProfileLeft, WIN_SASH_DEPTH .. '2', 'd') + EgtModifyCurveThickness( nMillingLeft, - dDepthLeft) - -- 3) lavorazioni profili left - local nStartProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_START) - -- a) parte comune dell'outline del telaio - local nOutlineLId = EgtGetInfo( nSplitId, WIN_PREV_OUTLINES, 'i') - CalcMixedSplitLeftRightProcessing( nOutlineLId, nStartProfileId, WIN_MIXED_COMMON .. WIN_CTRIN, nSurfGeoId, nProcLayerId, WIN_LEFT) - -- b) sottotratti sash e fill - local nOutlineL1Id = EgtGetInfo( nSplitId, WIN_MIXED_REF_START, 'i') - CalcMixedSplitLeftRightProcessing( nOutlineL1Id, nStartProfileId, EgtGetName( nOutlineL1Id) .. WIN_CTRIN, nSurfGeoId, nProcLayerId, WIN_LEFT) - local nOutlineL2Id = EgtGetNext( nOutlineL1Id) - CalcMixedSplitLeftRightProcessing( nOutlineL2Id, nStartProfileId, EgtGetName( nOutlineL2Id) .. WIN_CTRIN, nSurfGeoId, nProcLayerId, WIN_LEFT) - -- c) curva di intersezione - local nOutlineL3Id = EgtGetInfo( nOutlineL1Id, WIN_MIXED_INTERS_REF, 'i') - local nLeftId = EgtCopyGlob( nOutlineL3Id, nProcLayerId) - EgtSetName( nLeftId, WIN_LEFT) - local _, dParEL = EgtCurveDomain( nOutlineL3Id) - EgtTrimCurveEndAtParam( nLeftId, dParEL - 1) - -- setto info di lavorazione - EgtSetInfo( nLeftId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.PROFILING) - - -- 4) lavorazioni profili right - local nEndProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_END) - -- a) parte comune dell'outline del telaio - local nOutlineRId = EgtGetInfo( nSplitId, WIN_NEXT_OUTLINES, 'i') - CalcMixedSplitLeftRightProcessing( nOutlineRId, nEndProfileId, WIN_MIXED_COMMON .. WIN_CTRIN, nSurfGeoId, nProcLayerId, WIN_RIGHT) - -- b) sottotratti sash e fill - local nOutlineR1Id = EgtGetInfo( nSplitId, WIN_MIXED_REF_END, 'i') - CalcMixedSplitLeftRightProcessing( nOutlineR1Id, nEndProfileId, EgtGetName( nOutlineR1Id) .. WIN_CTRIN, nSurfGeoId, nProcLayerId, WIN_RIGHT) - local nOutlineR2Id = EgtGetNext( nOutlineR1Id) - CalcMixedSplitLeftRightProcessing( nOutlineR2Id, nEndProfileId, EgtGetName( nOutlineR2Id) .. WIN_CTRIN, nSurfGeoId, nProcLayerId, WIN_RIGHT) - -- b) curva di intersezione - local nOutlineR3Id = EgtGetInfo( nOutlineR1Id, WIN_MIXED_INTERS_REF, 'i') - local nRightId = EgtCopyGlob( nOutlineR3Id, nProcLayerId) - EgtSetName( nRightId, WIN_RIGHT) - local _, dParER = EgtCurveDomain( nOutlineR3Id) - EgtTrimCurveEndAtParam( nRightId, dParER - 1) - -- setto info di lavorazione - EgtSetInfo( nRightId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.PROFILING) + -- right + local nMixedRight = EgtGetInfo( nSplitId, WIN_MIXED_REF_END, 'i') + local nIntersRight = EgtGetInfo( nMixedRight, WIN_MIXED_INTERS_REF, 'i') + local nMillingRight = EgtCopyGlob( nIntersRight, nProcLayerId) + EgtSetName( nMillingRight, WIN_RIGHT) + EgtSetInfo( nMillingRight, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.PROFILING) + local vOutlineRight = EgtGetInfo( nSplitId, WIN_NEXT_OUTLINES, 'vi') + local nProfileRight = GetOutlineProfileId( vOutlineRight[1], false) + local dDepthRight = EgtGetInfo( nProfileRight, WIN_SASH_DEPTH .. '2', 'd') + EgtModifyCurveThickness( nMillingRight, - dDepthRight) + EgtInvertCurve( nMillingRight) end @@ -1643,7 +1638,7 @@ local function CalcProfilingProcessings( nPartId, nOutlineId) if bChangeProfile then -- 1) caso cambio profilo : telaio o split if EgtGetName( nOutlineId) == WIN_SPLIT then - CalcMixedSplitProfilingProcessings( nOutlineId, nProcLayerId, nGeoLayerId, nProfileLayerId, nSurfGeo) + CalcMixedSplitProfilingProcessings( nOutlineId, nProcLayerId, nGeoLayerId) else CalcMixedFrameProfilingProcessings( nPartId, nProcLayerId, nGeoLayerId, nMainProfileId, nSurfGeo) end @@ -1774,87 +1769,33 @@ local function CreateTrimSurf( nGeoId, nProfileId, dGeoWidth, nLayerId) end --------------------------------------------------------------------- --- funzione che crea la superficie di trim per uno split coinvolto da cambio profilo -local function CreateMixedSplitTrimSurf( nOutlineId1, nProfileId, dExtraLen, nLayerId) +-- funzione che crea le superfici di trim per uno split coinvolto da cambio profilo ( controprofilo della parte sash del telaio e taglio a 45°) +local function CreateMixedSplitTrimSurf( nMixedOutlineId, nProfileId, dExtraLen, nLayerId) - -- recupero il frame del profilo - local nFrameId = EgtGetFirstNameInGroup( nProfileId, WIN_SECTIONFRAME) - local frProfile = EgtFR( nFrameId, GDB_ID.ROOT) - local vtDirX = frProfile:getVersX() - frProfile:invert() - - -- punto di riferimento per le estensioni degli outlines del telaio - local nIntersCrvId = EgtGetInfo( nOutlineId1, WIN_MIXED_INTERS_REF, 'i') - local nPartId = EgtGetParent( EgtGetParent( nOutlineId1)) + -- estrudo il controprofilo di tipo sash + local nPartId = EgtGetParent( EgtGetParent( nMixedOutlineId)) local nOutlineId = EgtGetInfo( nPartId, WIN_REF_OUTLINE, 'i') - local _, dParE = EgtCurveDomain( nIntersCrvId) - local _, ptOutline = EgtPointCurveDist( EgtUP( nIntersCrvId, dParE - 2), nOutlineId) - - -- primo tratto - local nGuideId1 = EgtCopy( nOutlineId1, nLayerId) - EgtExtendCurveStartByLen( nGuideId1, 2 * dExtraLen) - EgtModifyCurveEndPoint( nGuideId1, ptOutline) - -- recupero il controprofilo corrispondente - local sProfileName1 = WIN_OFST .. EgtGetName( nGuideId1) .. WIN_CTRIN - local nOrigProfileId1 = EgtGetFirstNameInGroup( nProfileId, sProfileName1) - -- aggiungo un tratto di chiusura superiore per le operazioni booleane - local nProfileId1 = EgtCopyGlob( nOrigProfileId1, nLayerId) - EgtAddCurveCompoLine( nProfileId1, EgtEP( nProfileId1) + dExtraLen * vtDirX) - -- posiziono il controprofilo grazie ai riferimenti - EgtTransform( nProfileId1, frProfile, GDB_RT.GLOB) - EgtTransform( nProfileId1, Frame3d( EgtSP( nGuideId1), - EgtSV( nGuideId1))) - -- creo la superficie di estrusione - local nStmId1 = EgtSurfTmSwept( nLayerId, nProfileId1, nGuideId1, false, WIN_SURF_APPROX) - - -- secondo tratto - local nOutlineId2 = EgtGetNext( nOutlineId1) - local nGuideId2 = EgtCopy( nOutlineId2, nLayerId) - EgtExtendCurveEndByLen( nGuideId2, 2 * dExtraLen) - EgtModifyCurveStartPoint( nGuideId2, ptOutline) - -- recupero il controprofilo corrispondente - local sProfileName2 = WIN_OFST .. EgtGetName( nGuideId2) .. WIN_CTRIN - local nOrigProfileId2 = EgtGetFirstNameInGroup( nProfileId, sProfileName2) - -- aggiungo un tratto di chiusura superiore per le operazioni booleane - local nProfileId2 = EgtCopyGlob( nOrigProfileId2, nLayerId) - EgtAddCurveCompoLine( nProfileId2, EgtEP( nProfileId2) + dExtraLen * vtDirX) - -- posiziono grazie ai riferimenti - EgtTransform( nProfileId2, frProfile, GDB_RT.GLOB) - EgtTransform( nProfileId2, Frame3d( EgtSP( nGuideId2), - EgtSV( nGuideId2))) - -- creo la superficie di estrusione - local nStmId2 = EgtSurfTmSwept( nLayerId, nProfileId2, nGuideId2, false, WIN_SURF_APPROX) - - -- creo un solido chiuso per la regione di intersezione - local nGuideId3 = EgtCopy( nIntersCrvId, nLayerId) - EgtExtendCurveEndByLen( nGuideId3, 2 * dExtraLen) - EgtExtendCurveStartByLen( nGuideId3, 2 * dExtraLen) - EgtCloseCurveCompo( nGuideId3) - EgtMove( nGuideId3, Z_AX()) - local dDepth = EgtGetInfo( nProfileId, WIN_MIXED_DEPTH, 'd') - local nStmCutId = EgtSurfTmByRegionExtrusion( nLayerId, nGuideId3, - ( dDepth + 1) * Z_AX()) + local nTrimStmId = CreateProfileSurf( nOutlineId, nProfileId, WIN_OFST .. WIN_SASH .. WIN_CTRIN, dExtraLen, nLayerId) - -- creo superficie complessiva - local nTrimStmId = EgtSurfTmByTriangles( nLayerId, { nStmId1, nStmId2}) - -- operazione booleana di add e non di subtract perchè nTrimStmId è invertita rispetto al solido del telaio, essendo stata costruita a partire dai controprofili - EgtSurfTmAdd( nTrimStmId, nStmCutId) - - -- chiudo eventuali buchi - local nLoop, nCnt = EgtExtractSurfTmLoops( nTrimStmId, nLayerId) - if nCnt == 2 then - local nStmHoleId = EgtSurfTmByFlatContour( nLayerId, nLoop + 1) - EgtInvertSurf( nStmHoleId) - nTrimStmId = EgtSurfTmByTriangles( nLayerId, { nTrimStmId, nStmHoleId}) - EgtErase( nLoop + 1) + -- creo la superficie per il taglio a 45° + local nIntersCrvId = EgtGetInfo( nMixedOutlineId, WIN_MIXED_INTERS_REF, 'i') + local nGuideId = EgtCopyGlob( nIntersCrvId, nLayerId) + EgtExtendCurveStartByLen( nGuideId, 10) + EgtExtendCurveEndByLen( nGuideId, 10) + EgtMove( nGuideId, Z_AX()) + if EgtGetName( nMixedOutlineId) ~= WIN_SASH then + EgtInvertCurve( nGuideId) end - - -- cancello curve di costruzione - EgtErase( { nProfileId1, nProfileId2, nGuideId1, nGuideId2, nGuideId3, nStmCutId, nLoop}) - - return nTrimStmId + local dDepth = EgtGetInfo( nProfileId, WIN_SASH_DEPTH .. '2', 'd') + local nCutStmId = EgtSurfTmByRegionExtrusion( nLayerId, nGuideId, - ( dDepth + 2) * Z_AX()) + EgtErase( nGuideId) + + return nTrimStmId, nCutStmId end --------------------------------------------------------------------- -- funzione che crea il solido di estrusione principale -local function CreateMainSurf( nOutlineId, dExtraLen, nProfileId, nLayerId) +local function CreateMainSurf( nOutlineId, dExtraLen, nProfileId, sSectionName, nLayerId) -- curva guida local nGuideId = EgtCopy( nOutlineId, nLayerId) @@ -1874,10 +1815,10 @@ local function CreateMainSurf( nOutlineId, dExtraLen, nProfileId, nLayerId) EgtChangeGroupFrame( nProfileId, Frame3d( EgtSP( nGuideId), - EgtSV( nGuideId))) -- recupero outline del profilo Main e lo estrudo - local nSectionId = EgtGetFirstNameInGroup( nProfileId, WIN_SECTION) + local nSectionId = EgtGetFirstNameInGroup( nProfileId, sSectionName) local nMainExtrusionId = EgtSurfTmSwept( nLayerId, nSectionId, nGuideId, false, WIN_SURF_APPROX) EgtSetName( nMainExtrusionId, WIN_SRF_MAIN) - + return nMainExtrusionId end @@ -1887,93 +1828,57 @@ local function CalcMixedFrameSolid( nOutlineId, nSolidLayerId, nProfileLayerId, -- a) SOLIDO PRINCIPALE local nMainProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) - -- recupero i vari sottotratti uniformi del pezzo + -- creo i solidi corrispondenti ai diversi sottotratti uniformi del pezzo local nMixedOutlinesGrp = EgtGetFirstNameInGroup( EgtGetParent( nSolidLayerId), WIN_MIXED_OUTLINES) local vMixedOutlines = EgtGetAllInGroup( nMixedOutlinesGrp) - -- recupero le curve di intersezione con gli split - local nMixedIntersectionsGrp = EgtGetFirstNameInGroup( EgtGetParent( nSolidLayerId), WIN_MIXED_INTERSECTIONS) - local vIntersections = EgtGetAllInGroup( nMixedIntersectionsGrp) - - -- creo i solidi corrispondenti ai diversi sottotratti local vMainExtrusions = {} for i = 1, #vMixedOutlines do - - -- creo curva guida con estensione opportuna agli estremi per facilitare il calcolo del solido : se all'estremo del pezzo estensione - -- arbitraria, altrimenti estendo fino ad incontrare il pezzo precedente/successivo nella regione dove si innesta lo split - local nGuideId = EgtCopyGlob( vMixedOutlines[i], nSolidLayerId) - if i == 1 then - EgtExtendCurveStartByLen( nGuideId, 2 * dGeoWidth) - else - local _, dParE = EgtCurveDomain( vIntersections[i-1]) - local _, ptOutline = EgtPointCurveDist( EgtUP( vIntersections[i-1], dParE - 2), nOutlineId) - EgtModifyCurveStartPoint( nGuideId, ptOutline) - end - if i == #vMixedOutlines then - EgtExtendCurveEndByLen( nGuideId, 2 * dGeoWidth) - else - local _, dParE = EgtCurveDomain( vIntersections[i]) - local _, ptOutline = EgtPointCurveDist( EgtUP( vIntersections[i], dParE - 2), nOutlineId) - EgtModifyCurveEndPoint( nGuideId, ptOutline) - end - - -- posiziono il profilo sulla guida - local nMainProfileFrameId = EgtGetFirstNameInGroup( nMainProfileId, WIN_SECTIONFRAME) - local frInvertMainProfile = EgtFR( nMainProfileFrameId) - frInvertMainProfile:invert() - EgtTransform( EgtGetAllInGroup( nMainProfileId), frInvertMainProfile) - EgtChangeGroupFrame( nMainProfileId, Frame3d( EgtSP( nGuideId), - EgtSV( nGuideId))) - - -- recupero la sezione e la estrudo - local nSectionId = EgtGetFirstNameInGroup( nMainProfileId, EgtGetName( vMixedOutlines[i]) .. WIN_SECTION) - local nMainExtrusionId = EgtSurfTmSwept( nSolidLayerId, nSectionId, nGuideId, false, WIN_SURF_APPROX) + local nMainExtrusionId = CreateMainSurf( vMixedOutlines[i], 2 * dGeoWidth, nMainProfileId, EgtGetName( vMixedOutlines[i]) .. WIN_SECTION, nSolidLayerId) table.insert( vMainExtrusions, nMainExtrusionId) - EgtErase( nGuideId) + end + + -- taglio i sottopezzi nei punti di intersezione per unirli + local nMixedIntersectionsGrp = EgtGetFirstNameInGroup( EgtGetParent( nSolidLayerId), WIN_MIXED_INTERSECTIONS) + local vIntersections = EgtGetAllInGroup( nMixedIntersectionsGrp) + for i = 1, #vIntersections do + -- creo la superficie di separazione tra i due sottopezzi + local bSashFill = ( EgtGetName( vMixedOutlines[i]) == WIN_SASH) + local vtDirS = EgtSV( vIntersections[i]) + vtDirS:rotate( Z_AX(), EgtIf( bSashFill, -135, 135)) + local vtDirE = EgtSV( vIntersections[i]) + vtDirE:rotate( Z_AX(), EgtIf( bSashFill, 45, -45)) + local nCrvTrim = EgtCurveCompo( nSolidLayerId, vIntersections[i], false) + EgtAddCurveCompoLine( nCrvTrim, EgtSP( nCrvTrim) + dGeoWidth * vtDirS, false) + EgtAddCurveCompoLine( nCrvTrim, EgtEP( nCrvTrim) + dGeoWidth * vtDirE) + EgtMove( nCrvTrim, Z_AX()) + local nStmTrim = EgtSurfTmByExtrusion( nSolidLayerId, nCrvTrim, - 2 * dGeoWidth * Z_AX()) + + -- taglio i due sottopezzi + EgtSurfTmSubtract( vMainExtrusions[i+1], nStmTrim) + EgtInvertSurf( nStmTrim) + EgtSurfTmSubtract( vMainExtrusions[i], nStmTrim) + + EgtErase( nCrvTrim) + EgtErase( nStmTrim) + end + + -- unisco i sottopezzi in una sola superficie + for i = 2, #vMainExtrusions do + EgtSurfTmAdd( vMainExtrusions[1], vMainExtrusions[i]) + EgtErase( vMainExtrusions[i]) end + -- creo una copia dell'estrusione principale ( usata per ferramenta) + local nOrigMainExtrusionId = EgtCopy( vMainExtrusions[1], nSolidLayerId) + EgtSetName( nOrigMainExtrusionId, WIN_SRF_ORIGMAIN) + EgtSetStatus( nOrigMainExtrusionId, GDB_ST.OFF) + -- come guida tengo solo una copia della curva di outline + local vMainGuideIds = EgtGetNameInGroup( nSolidLayerId, WIN_MAINGUIDE) + EgtErase( vMainGuideIds) local nMainGuideId = EgtCopyGlob( nOutlineId, nSolidLayerId) EgtSetName( nMainGuideId, WIN_MAINGUIDE) EgtSetStatus( nMainGuideId, GDB_ST.OFF) - - -- unifico i diversi tratti di superficie calcolati - local nMainExtrusionId = EgtSurfTmByTriangles( nSolidLayerId, vMainExtrusions) - EgtSetName( nMainExtrusionId, WIN_SRF_MAIN) - - -- taglio il solido con gli innesti degli split - for i = 1, #vIntersections do - -- creo una curva chiusa a partire dalla curva di intersezione - local nCompo = EgtCopyGlob( vIntersections[i], nSolidLayerId) - EgtExtendCurveEndByLen( nCompo, 2 * dGeoWidth) - EgtExtendCurveStartByLen( nCompo, 2 * dGeoWidth) - EgtCloseCurveCompo( nCompo) - -- creo il solido - EgtMove( nCompo, Z_AX()) - local dDepth = EgtGetInfo( nMainProfileId, WIN_MIXED_DEPTH, 'i') - local nSrfCut = EgtSurfTmByRegionExtrusion( nSolidLayerId, nCompo, - ( dDepth + 1) * Z_AX()) - -- sottraggo - EgtSurfTmSubtract( nMainExtrusionId, nSrfCut) - EgtErase( nCompo) - EgtErase( nSrfCut) - end - - -- chiudo i buchi ( caps ed eventuali parti on del solido di intersezione sul pezzo) - local nLoop, nCnt = EgtExtractSurfTmLoops( nMainExtrusionId, nSolidLayerId) - if nLoop then - local vSurfs = { nMainExtrusionId} - for nId = nLoop, nLoop + nCnt - 1 do - local nHoleStmId = EgtSurfTmByFlatContour( nSolidLayerId, nId) - EgtInvertSurf( nHoleStmId) - table.insert( vSurfs, nHoleStmId) - EgtErase( nId) - end - nMainExtrusionId = EgtSurfTmByTriangles( nSolidLayerId, vSurfs) - EgtSetName( nMainExtrusionId, WIN_SRF_MAIN) - end - - -- creo una copia dell'estrusione principale ( usata per ferramenta) - local nOrigMainExtrusionId = EgtCopy( nMainExtrusionId, nSolidLayerId) - EgtSetName( nOrigMainExtrusionId, WIN_SRF_ORIGMAIN) - EgtSetStatus( nOrigMainExtrusionId, GDB_ST.OFF) -- b) TRIM START local nPrevGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_LEFT) @@ -1981,7 +1886,7 @@ local function CalcMixedFrameSolid( nOutlineId, nSolidLayerId, nProfileLayerId, local nTrimSurfStart = CreateTrimSurf( nPrevGeoId, nStartProfileId, dGeoWidth, nSolidLayerId) EgtSetName( nTrimSurfStart, WIN_SRF_START) EgtSetStatus( nTrimSurfStart, GDB_ST.OFF) - EgtSurfTmIntersect( nMainExtrusionId, nTrimSurfStart) + EgtSurfTmIntersect( vMainExtrusions[1], nTrimSurfStart) -- c) TRIM END local nNextGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_RIGHT) @@ -1989,7 +1894,7 @@ local function CalcMixedFrameSolid( nOutlineId, nSolidLayerId, nProfileLayerId, local nTrimSurfEnd = CreateTrimSurf( nNextGeoId, nEndProfileId, dGeoWidth, nSolidLayerId) EgtSetName( nTrimSurfEnd, WIN_SRF_END) EgtSetStatus( nTrimSurfEnd, GDB_ST.OFF) - EgtSurfTmIntersect( nMainExtrusionId, nTrimSurfEnd) + EgtSurfTmIntersect( vMainExtrusions[1], nTrimSurfEnd) end @@ -1999,7 +1904,7 @@ local function CalcMixedSplitSolid( nOutlineId, nSolidLayerId, nProfileLayerId, -- a) creo il solido di estrusione principale local nMainProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) - local nMainExtrusionId = CreateMainSurf( nOutlineId, 2 * dGeoWidth, nMainProfileId, nSolidLayerId) + local nMainExtrusionId = CreateMainSurf( nOutlineId, 2 * dGeoWidth, nMainProfileId, WIN_SECTION, nSolidLayerId) -- creo una copia local nOrigMainExtrusionId = EgtCopy( nMainExtrusionId, nSolidLayerId) EgtSetName( nOrigMainExtrusionId, WIN_SRF_ORIGMAIN) @@ -2007,19 +1912,23 @@ local function CalcMixedSplitSolid( nOutlineId, nSolidLayerId, nProfileLayerId, -- b) trim start local nPrevProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_START) - local nPrevOutlineRef = EgtGetInfo( nOutlineId, WIN_MIXED_REF_START, 'i') - local nStmTrimStart = CreateMixedSplitTrimSurf( nPrevOutlineRef, nPrevProfileId, dGeoWidth, nSolidLayerId) + local nPrevMixedOutline = EgtGetInfo( nOutlineId, WIN_MIXED_REF_START, 'i') + local nStmTrimStart, nAuxStart = CreateMixedSplitTrimSurf( nPrevMixedOutline, nPrevProfileId, dGeoWidth, nSolidLayerId) EgtSetName( nStmTrimStart, WIN_SRF_START) EgtSetStatus( nStmTrimStart, GDB_ST.OFF) EgtSurfTmIntersect( nMainExtrusionId, nStmTrimStart) + EgtSurfTmIntersect( nMainExtrusionId, nAuxStart) + EgtErase( nAuxStart) -- c) trim end local nNextProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_END) - local nNextOutlineRef = EgtGetInfo( nOutlineId, WIN_MIXED_REF_END, 'i') - local nStmTrimEnd = CreateMixedSplitTrimSurf( nNextOutlineRef, nNextProfileId, dGeoWidth, nSolidLayerId) + local nNextMixedOutline = EgtGetInfo( nOutlineId, WIN_MIXED_REF_END, 'i') + local nStmTrimEnd, nAuxEnd = CreateMixedSplitTrimSurf( nNextMixedOutline, nNextProfileId, dGeoWidth, nSolidLayerId) EgtSetName( nStmTrimEnd, WIN_SRF_END) EgtSetStatus( nStmTrimEnd, GDB_ST.OFF) EgtSurfTmIntersect( nMainExtrusionId, nStmTrimEnd) + EgtSurfTmIntersect( nMainExtrusionId, nAuxEnd) + EgtErase( nAuxEnd) end --------------------------------------------------------------------- @@ -2049,7 +1958,7 @@ local function CalcSolid( nPartId, nOutlineId) -- a) creo il solido di estrusione principale local nMainProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) - local nMainExtrusionId = CreateMainSurf( nOutlineId, 2 * dGeoWidth, nMainProfileId, nSolidLayerId) + local nMainExtrusionId = CreateMainSurf( nOutlineId, 2 * dGeoWidth, nMainProfileId, WIN_SECTION, nSolidLayerId) -- creo una copia ( usata per calcolo ferramenta) local nOrigMainExtrusionId = EgtCopy( nMainExtrusionId, nSolidLayerId) EgtSetName( nOrigMainExtrusionId, WIN_SRF_ORIGMAIN) @@ -2551,14 +2460,14 @@ local function CalcSplitDowels( nSplitId, vOutlines, bStartOrEnd) -- è la stessa superficie utilizzata per il trim del solido nTestSurf = EgtCopyGlob( vTestSurf[i], nSplitLayerId) else + local sCtr local bChangeProfile = EgtGetInfo( nSplitId, WIN_PRF_CHANGE, 'b') or false - if not bChangeProfile then - local sCtr = WIN_OFST .. GetProfileCtrIn( nOutlineId, nSplitId, nProfileId) - nTestSurf = CreateProfileSurf( nOutlineId, nProfileId, sCtr, 100, nSplitLayerId) + if bChangeProfile then + sCtr = WIN_OFST .. WIN_SASH .. WIN_CTRIN else - local nMixedOutlineRef = EgtGetInfo( nSplitId, EgtIf( bStartOrEnd, WIN_MIXED_REF_START, WIN_MIXED_REF_END), 'i') - nTestSurf = CreateMixedSplitTrimSurf( nMixedOutlineRef, nProfileId, 100, nSplitLayerId) + sCtr = WIN_OFST .. GetProfileCtrIn( nOutlineId, nSplitId, nProfileId) end + nTestSurf = CreateProfileSurf( nOutlineId, nProfileId, sCtr, 100, nLayerId) end local nTestSurfInverted = EgtCopyGlob( nTestSurf, nSplitLayerId) EgtInvertSurf( nTestSurfInverted) From c52a6ce2ae3725c1da9176ea7e9329df160636b8 Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 1 Oct 2024 15:17:12 +0200 Subject: [PATCH 7/7] - solidi semplificati - piccole correzioni varie. --- Profiles/Profilo78 - Offset - Copy (52).nge | Bin 0 -> 339193 bytes Profiles/Profilo78 - Offset.nge | Bin 339193 -> 379769 bytes Profiles/WinConst.lua | 1 + Profiles/WinLib/WinCalculate.lua | 112 ++++++++++++-------- 4 files changed, 69 insertions(+), 44 deletions(-) create mode 100644 Profiles/Profilo78 - Offset - Copy (52).nge diff --git a/Profiles/Profilo78 - Offset - Copy (52).nge b/Profiles/Profilo78 - Offset - Copy (52).nge new file mode 100644 index 0000000000000000000000000000000000000000..2c8f86bfb18d3dd7f2171f336f41265c44753793 GIT binary patch literal 339193 zcmeFa37i(i@jpC^K~WJF1K#2yqQnFDdG=P9r@2KDkX1=E%DD*2&7wd&_P2NeDo6y3 z(TGN)Mx%r%-t3qNY66KG?<1`7Ogvb{AQ5HX?yj!tnV#uqo*8z5e_o#t>`d46e7mZ; zySnKPsefkonJGcddj4}y}#Lwhw>b!SFc`U^Y~T%@+ArGTk(5(;EWYf_Tc{q zSN5MiYEpF`f84}>5ZCs%F=KlI^cQns>cb2ejp<87ewT)DG`YL)mFKYaWDcRr;#A9CPHl$ z3#I#BG6INPq~2ue>dGtrL1YZ)az*4~8950;E~!u)U0OxPiTvH5OM;U z?I0)p41`me#HcmtIUqx3J2nJGcTYA_v?G)DN@N^%3X|7J1k~0RW#lkyq?AN^r9Mt- z2fBXDlbH+$=>Ax~5avr6P;Cf`?hbZ+Z)XXR_R3`>Hh{@%Bm!!y1+-V;Rt zC!M<2-1FWm^}kr{;OASqDU5*q~4^WA7n6@#F`m^e0w?hIZ?0u9!|u|XjH z2v_kGeL=3%$~xE}Di~lTfmYVR27&Y~;UyIK&#qr zgFw0=4Tu=}SLY4Xb~jfD%!8IFfnXho6_au0&zj^cVUn^)SqFk}v%JM0p_C5u$0ItB zh> zBn5*g&C`TRPQX4ka|6#hJf@VTvHlr7<0T7 zV%QL{iA#X2OqUG->G4dL)H7JFo!oXxPQY*xCx*7E-81M}f@HWKf zbQO+cxX{B&fmNXP&0vM-@yZA|%E}GGR@sEW#>u3kbRk#bTGewK1kw#@LJ*Op^G3Nf zxk6wbVBR#3nFIxbWoU_}Go?(!uHAG#$#X|kMYHM5 z{0s5Bmwfy6>%{Me%%n#`BXW@q0qKC0dy7Qci)iai4jVH{2Bj@)6=3F@)-cMb+QyEo zNdB}ehfbdZz7v-nlj>ZqomZH#qdewmFFWE$wFD&+Xh+j(~~p>s%<<$aTNv8n1NFI zbyPiYBc;O#Bqa?ggqjQPNrci7Cgduz5)=q+X$)t?FC}7QL#V=uoRMNF#ccE#w8H)L zsN#k!L4)9JOLO*T%o1yqR7@dJiG{Y8vm&JmRLemYI;I)C>b#5?QZQdNrNrlkw27oF zmxgqA^rLj1`RO{3F>%{fOKA)#L_xG*y;K8~+(iqoe^nN`O-4_NO{@NT6^rY`EP3_F zkN57;r6(k!>t$>oCX`E!Cq_3u&I@eeSy)vxmhR_j){}BE}m>RQhE{3&X zRa>8$=>sRX<3SqOmK0BGkUEq<4YUSoXqzI3w+A+}?y%opdP3)-PlmZ1JIjxxVGzl1 zc{p*v+6y){T^?_?AI$oXGWTx&*R0m;k!8jGKbfvMu@#vtY|2MuK9pIHU;eYt^`FC{ zIH2cP$)Oo=Y?awo`3Wa@gUG7OZ$YpctRNs#NPA$`5h2oiV+p~LJ;XCgN=)ZimJsEp z+ZqyE!-E`zTv2PKdviYy$?_1n>40~wi)D>lyR=EaC)*#h_ z*cKQDW4B};9MtX@vD&Kd9lsyqU2Qd@O~ppu$}nrv<^!zh#W21Vw7^K0{p_oTxF&!# zjL0Qf5xD(~i%i;!ZGlmHex94d0>dao&;lbJWHi@_`uXsMP#pt}!ChkpXNCNX zYm3?3BPw+Tj`K86%w~awH%+VHY1fG44i~x0K-eG6H9R%LVebf9W4%z|oq6G0367v$ z=sV@&>WRaqT$~b%TKKgx)t=w*QJtaH)2CL|jGA6kSyUpnlPFTZ$zv-^3&s0_FlzcJ zh*OABI7LKB7m7tJy{FXFOqnE*1g*GmUmp$L^u<(f7o|KgDUDPSCc*&+RZp%=6JtD% zBp9g%XewT+T(pAnS9>~xnxJ*?5bDQMGfo(=>AyVknr0)ndc~kktVYD9dSBk%qvIMdtxQEx$V0*Rd*f0 z%Bs3_o@W}phCTr4<}RfkyiQ9FtPl#?nc!yS)ccUQ2D{({A&wgV^FJLmFU6cQ-+r{; zExAMMyitZB&2IYB=O%8>PIM6zHzOZ)Tj#e{{z=pEx$Ua+QcXYQv-V>vAO7aVNdz7KDoPdDj7)hc z-=m?Ga16$G zbZVh9dB5XJ+p(b~b4uKSA2CCyYS|VZ@Hr>cPYu5q|;d;YE@4?hP$Jo zm6u_I=+2}RiJ+A=u|X)hV|d=EwUDdMc4ZxU0C$lPIc9szHdwZ2Y2|1rR!k4s9SSU( z^bqNgq@@H;10iBdiGbVZi-MG3O{n%8d4}{j#RR$YT`{A$v%u?B8~)7JKM?f6mAxj; z6g|xY1qgpZdhjU`aQJ!%xj6bhvxQLftx=5|poqUBLnLzg<;yNS>Xgx4*;01Or*9q` zh0vJU^t<+-T({TZ?9?{r@3wU0hnZn#-*(-m4Ih%xseF0WsE${h?dr55?vNAZ1ALpg z=Gd2>dE#M{lW#NUF4%ARq^9$8MkX0mrOju#Az+5JV!(N0{f1sAyxn0<#cBvUPW6UP zPd8nDx{Kk+E6P~%>01N)Zh37__W4Cm6|Z?h%krNq7j4=$=~YUBG=%QQV_uk5nY>F?Y)x*I#B>l8d zzUclxZ!O*LeJUZ+LoGXtMaqT|P8{qYkn-7vv&2^F$rL}hp!C%fS>&3P7CNrB2+z^Ep~ zw;6b1(lLI>m7rDYZ-e+YbHgoz-u`VTvuhp#sYp6+$`Z9U^SiOCFTQ%{hMPXB|K0TA zkKAzU2UO2i-u}z){;#n&vnTFW#zJH{JAUeTUDcUAE$px0RwD=fds}@BiYe(wtc#e>GJx?!rrNc;TXs?6u$g{;B=e zXjaZ>HG1D3SG052_5bMG8~2>(`em_)NXm3!tNzQ%uKvqz?#q3OAD{bV6a-fJ{n>=o z=l%1PSJu~Gv)`t=F`aeq_t__}FCTlyu=rA@QwL4B_sK)26}bC<*=F()t28T}4m@%P`>yL|9OOPRj>ic#+3`wn&gbAD#nGh3n{P|8m;m(^`;?6h@b{RnsN z`{zD!JLTo2b0+@9sU4R<%A%KFy=LSg#~$Q%c&^*^PySc4@{fyde{Ar32fBT3`23@e zk7|1EQWhu6%Y63nDgotqgBb;`^Zxv;FxMI9O8DZz;87>yAji-(;A(cqe;A7J&O;Z3r-e%{=7~h1 z^Sb0ax0ensd`ooFC2~ zG%S8Ld?At%j3k=hNCcE|4+d~X<;FDPRC1J2ja&49alzw_Axv(@<#?e<#}q@ZLPoEV zjL{On7IhR7u?=Bk3JI*F|?^SFJ14$!x2Y>CAjHURYOhF*5#H zUU;h{S}NS@Z{5)e-u%GHd-2G)t3Qng7SiE`c;=yS=G*g_RHN1SIyT$72OcgEG0xyQ zh5gZE7ItXY077vRSS6y?cm(MFgnc2j6>40}hM?$?Yd4>rmyTa0u;+9)FqJ{-_;?faa^*wiJ3t@z-6Mquc zF^fF)pn$)aWt2;9sNKG%(P8iWV$Z8KT{Y3=NoDzwKnx-^*28&0DVjVzp!Z+5Cfbsk z#)A)Dy|(T2{XGkaY^5d(oAMEv;KWrx9ej|neB?msAc_zE9Ge;Cso9o-+3LSN1(H!! zfcVA?urVLIP(G@4aIQUV;|a=Gntf4U9|rH43jho>ZxE5yxR?dO+WdH-jC(|eE?)>j z)+W;c^9CtjplM9d{C9ur$cJw3@TdCs+l>C_k~{SbjaobEdQ;1K&t>#>`EZ47z?ZT4 zK3TvCS~aB>2&=#Dq$uVGH~PYHIzN6O6{2+Hn58f~VNGKmr;B+RGG^tYO+C+H zJdxafJR6~RhbKpTRsYikOP|)9T-K_4|D``Tmc2gU?guWZ)buELG9$5@FdVM=&y045 z@RK7lk4>65%zJXgyoa}RbZ}rKiVg7`Wh|EC7atxUSc;7Fa2M8|1j!h?36m*~a~NRb zI<6m46Sn-FE^GKwZr7f+@dRZoJ$_5^QO94EVy{8NE$djMfwnv1tC*G$l*l?yAZ2w5CXx*UnMq)}u$RKh@-Ah2TwLTxi`G zfE|g^nxXiH*3SQV?U=4H2E#l8>sy^6bp`No z7F%m7Cj25!0kN+9)?7o%I#ta{*d33@TkP}sqdf7Lx0T*+*@)3!XyfHkuHwV7g3109 zCQiiNxhZ+XhM>rA$yOd$Qr>|_sj8ViVQSwAGipXn9#budV&r#6?cp8I84x0&II;Hd z&Sv7x;7`%b@4N;hY6_ZNHHKtCXtyUd4|CZ8^WSF z3?xl}44$A3f#^{OpKDE1DTTp|dyuy%1T3XA6GS~Mjm__3mQt@LNUZn(9p|Q>F@q8r z)J;6pa)O8}C8mVZt8gMI!7QvmX$)3~9JUAZjmRz;_a8u>wY2?WzXtQc&&s=YPH*@9Y1Wg7^>&Gwqd8)yD_D7~U4DuJq7X<-Fh zZub<|pR_%sr37n&ii(6FX&8W0*q>GsDe*%LN=o-s*N3^nLia^70=#LG^-O(;!3KeJ z=QMwk2AVHO(8@Ys-WU+ev62{cAC?gyXs`|;5ce;5YrMnhM-Lk{v5Py{H2|zZ%Jy`z zgt#VG2+U@x!WlD-Za=R&@lRXM%$XJ1nUOB}ZuRAx{>fR9kb&dsRXZ1;n+$luq(HC^ zjtxT5lbmCp2J7&#@@gU>q7?|z$2%z(3U_&zR_$*8^M=`hFO$#v$)X~);@7U=rtD<%DLDZ_5yGa8W`Kw#Rfzo=bNH%PBc2YYD?Ck-^_+X1gho!JzC4W;0dT zVrEnAP}s%I=6fM#lUJ^>kqcou^H^3}O5gn04s%*CJMkAl`~$q(^97L0hJE(;FL>i= zegVW*YO>oUPm=-WG(i<;sV{)o+#s9Vltog%`3*53*-e%mnHt>0=6B8?-#?(C;f~DF zKY3u|q;EEoN1_~8W>4FAf-;t6ZAwC#9s?&BL}W0(HUwL98N|~RL_Z%{EIr}5`?w)AKg2Ps|2a#p;JuFR{18VBLx|I$^QNu6SA2-$ zu~v7KdzVu@R6O5TIM7^qI&(5bPM1@e$v?yqf-wK2fscR4JH0<_`_Vz; zVjxoqDgFAQQ>QyIdhp}w-u>yH)@{i=v{(0bJs01RnSb?z-~7^J2*;lN%e9-oIg{~X znA;DHO4;lm-&3-lo2#>5{cenRIAXv_Z>(R(=`ax-Zv;fCImOAaiO(MrtYTv5XZC8 zHW@#}u_HfiI+5$eHp#dLf5xZa#pJcHzIzE3Vu^-ceFOG*4dFQb2Z#Rdf`ONu?uwUk z`BAw8wJpyT0h^e72B~1!NHflW3d&e?amSDDdGFy%*-O9qcjq@I4s#Ln^+&gzyW!hQ z0;5Uz+;$}yi~sw0+opTJQUiJ(Ya0G0%Cse8Tj{-N+N669STNiTe?LeiPW+<)wN()a z$VonH7`SS~jORbkwEOer`=49$Vg}OyPU4-+A}tw=M50SqtFB#s(pm$II+5;}ybzO=~?Wf8-cMxR>@Tl)5A3Pa~#wJXKr{cU-LHB0I?>_S>m z@r~vWUx}kFENoyHH7AG#S6WrzCua>IGW54?2t?0!v!Zz)A~FnL+7MjSY64_1Ts8!v z9}%BtFhn*4T9=Rj84QsPf#^}Q#ahv1#=#KLGJ_}tETuGAMSXpZ&F_+wQZQV^i4Si( z7d(LB+9eh|fcrzM5)6G4Jzg1sQ39yuHi%lBElmOq_1p$QbVC{=3%xA6w!V#=!PuV;#CC() zI@lj_FWDz~lE{$R%%lgHGYN<+0g6Hp5E)*~y+tDJWpC?DempxH;E~l+V1ZX{1e6hK z0B?0cSS^bT*9Yk~K%ygZsSN??@J8;&iL?i8qpj5?M)1ZQZfHjBL0if>k!9>aLl)jj zhtiR;kSoauZ6mew26Es{Q$~zn$hsXvDj}@MAr+!W*>PkEj0o6Yup;CEL_suWpp<^C ztcD>SrVz(S^3v*UOF1i{=7M_?p>#|#paH9ZC5QNSRe9>q99tZUaEDBoR!e}$6d5gx=ln*Cn?oB zMh+3zhw-E9dKue?@dK%l#;YrEoQv}8E?Sn2PYvXFhNj_JVH-%*@&d+_pFe)y!j<3% z=I3(w{Bhd*#Z>tn;}Y?{@AJp$eKbXW{x~g$T;TAmUHbFKBQXPxbUDLWewf`+qtX|# zEFk<5;y?+1?teUk{H4JDIciVwfkB8d9;&0e>{g*Tb@m{ zuUOpj-&oN-0v`spNrO=m6z@)Ha1(qxrG*jSQJbQtb9RIP+p{U!+^i!<}$`&UA0+)~tzNf!vVAL`eib0z{Ik9KW90Xic4bFRQdQ2Gtf z19+N%$o`xQARzLEu6{Mioj>P(#v#m{tF3L4IVWdkMb4curAC;6EO}>^C)BV>&&Dw7 z!Jl^~0wM?WlLZ=)cXr;HvSeX7{E6vZL3z^|x17}v8QAU*OxJ&jD-gJHds6>pIUs4bcl&uC1~T@vlVlmc=RIQSX0 zcY*6kC;KgG4+ixd8-k*Hj(y4w>lsN)!F2n_YFIfEB3gah@j3C^x*YO{iSPd`{Bz=$ zC>FQlbK*9LkqUY{J|`XmQCC`V$>Ia%Z1?BH3+7l3Vm31w^QHwqCvIb9PT&AOlQ}ai z>MzW(fN6MPc8(AzWg7;N7&a1!xfB#wDSK+`drw`^Fgx%$aojqoCd$4Q9(ySK71Kj5 zRIaE=*FpvEw3Og!AVh2_5xE&A5Yymlj8xK?tROv32}JIESIj8rmEX^w+4={2@n>|9 zpX`|*%qirgLC+kwI4v6I@`qV|nC_NL^^8k0VvAFozyJ4CzQu{0wE=4{*u)QZce8-_ zAE7G+9SYpy6yRhI`@GLTrq7HqQbIC9)y>Zp0cE7C`ttXWdLrYA53euI+`IW-vpUUT z?;rc=gsVMgp2|JDx6NUbJ3Yf*`^os6wMQ~SMdwQ`#?2j+{_?6Q1e9${=C9NLJzC`B zY2{b<^X8+HF=tMU4uxysgwuQNz2^bv4$`OPqE@X}EFo%*k_92e(X%4r14LG}*5Ym2 zyi-I8yCQOhd>Dd|)uj$YR5Y@B$vX%waLO$(XY20Rx<^^W)N zyMPd}JE)ih)+H5AwuVT)Z0l_!-R$=x2VqxIAXo+)M1yLn56gJCqC zH>$2H?jj*54;a8w*q=%g$0Y^E!Bwmj8q(k{Ba`k=*dL<20qbCcK>G5ruK)ckA%s?I zd~6Vm_kP7M5j6M=HVC4dBjz%}&_9&zX{hZ85jpgW*__W{(`E!9&EP zi*VFMzR2-jsA9`6jh!vPjAleL$M0fhi{vDYyKv1ihP!ahGU-b(BtSA2`F7#Ps9?q} zTq=5M7cL7)G?YY~KnHv|`WR952(=s7g;-5ItUlAoCI0Y8!&B zoj`%Yu2@!~a@i1&-k5-AXnAc2*doV3rW}Wc7ZFxO@rF6>Fux*nJ0t0d+zS}zZ&2=q z$qJ|EW|{qr1w$l)JdyA|9>Hdt#HoaXD|=0xDXh|gJV07YeSOY}r|%D%_(R;CpZf*>Fv{zj7;-W9czdnn- z+^6{QxlcwRV20(htyfL{@RV29*Y|qkkZd*Z+qzUd9&Dm&d&^cW=j+T z%J^yKxsPY&@3(bh=JoSW>fG&#+o^ngr$?|c3cHSp{aJY>1A1^p)ey=BP&tO6- zA6*PbUQx!1ttY#zSfi>>Sb(YH75sbzWKKmB^Yb^2`f+Hd$bbk^iv3xtf)8A}ze znDO^(8wmGVQxx{hoxpu=~UN zzql%D&8Ze$vy#l}%A5}?8ESRu9t+P~h&F}a(~&RwwI@<~nS=d2K&H`IN| z4Fc<^M9ZALh@8;Uu$d?0B{CE#S2efhJT21Ad0n2P zwjbpw6z{>q2UKJF?Wuv3n#LKUj3zbw4dTX*QdD=foR|51-;HNu8m^ z?MHUtYmmM?@8R^QZBZQJTl|WZtH_4%96!{#XzpybW)bf@+?G2sX)n9c^RNQ9dYk;A zpVh8=v0-C<{lyD6TrqT22BTiz#VOyMIn%{(_ z(ac8HAuXdHTo+hLk2xhP4M>^X@gKs8k8TJe2N>=Ti9}X=&A&4$S{NZb(;haqQNYdG=Q62ON5E<-p0p3vbWwsVc%W8<$L` zJ<=Q*kyOtgN)h6FjtB5W66f}*=RRt908J{CB;>?gjWH6ZrlL6XB!bAQU|0|kIdb)j zMkeh+xk$WzhP0`n#a$BZL4$;xH0K5nXpkJ#o-yKw^vK;AT13*G8dUljlg}a%P+Rux zF-i7!$fmA5>sqvswQE`$%N>?I@WO2f30LfS8<-G??cd!2R-wSQrNWdMbEYMBcYs;o z!+kgX>GKn>dea=q*q+@TU>9E46?S(Nx7_Xyunf$$rNWk%&A7hBOhSgK%*YSZiTZ@U_3{ols&yi+EoGBVoIr!e)ZlxJ)oCwJ*d|VE zufOZlx=#GG_IgY~trKAwj=Z8_RmECyVy+WG4r8wFlZ^p1cs2xFi;)Bw8ax{U(qpcp zga%CN&4z$ZRSaaxacIC0A#$aOS-&tpjd~Wx#X$()mC}*sV?h@4u@8SwnGZ1@4JO1t z5{)17S+Q{Nxw9|S71x&{1sXH>A)o$d{`vAcFxnQUKA$eH!t>{<2505+j=iNU_tJSKu9Oq zO-Mksy6>u%+OCEux+ucOjp9v&fyt5DCX=J{7wOP-9qR^|vJtRE!5|Jt4n^PwBb07K z<#f^>4C0{4i8O~=dwy`OJxPz*^OxGIkXj1i1nE-79@VZt_F(h2T~(F0@b| zKvU0KjwyT|mA5-*OkoyRl5MIFzRn~4GBL(YlYNq68E7b&&EEONo>y(UO0U!j&juAw}0)AS8!!nwGFI*w;rbdhc<2s5S7^BJ}rC~I2(8+|b4u9F9 zwLOM`284(l4a9`Dp*!(f9zH$MinRv=gg zglI4a3Qe|1QOy6OWqS(C^1>T5PBuRQDw?o-PNphGAN(vCwe|U%uG9^OUjPj0e!}>p z9$zdz_<3cA*Y4eCmF_2e_tkABneFN)d{zI`1xugSoQUb*BN}G2*9YAFz$KNMjy&0} zBxCF*47~F_*iWy0yesb~WDeZ6`{}%&Kuy@ZhqrW0wCx5Cm2V1;&dEtDP7fatv`Og6 z$JkAnbn?bI46xA^(M{O$ce<=e)`ZO+GULn9{2-p!tG5h!*Pgaz(1gWkO=UlUcbA*LHH8m^Vw2}-O=XgtE=yf<0a-!B0z8s8Ao~JdHNpd+0l=DBLvUkUK59_74+f&*a*^YY}K2+7ZUi^*?(7|f^{<42rTJ-ueam{Aiu za1wr_@uKSK6Gu(0EKUhtchp(Hf8q=Xo{?XXZWHHMa1LA1_`#%tp&y7yU3}|jAH9+Z zV&Lc2u>dWKfXHel-hzP0k)LYyB!|dg6>JD7OA=)8Yi$Tf_pp@gR@)=7;^Hk1;>|dP z8Gb71LHwzx-aH@q;^)`yXg&U|raHz0{Fm>_i}epCo6r1FkgljnMheomesSrv=ijYk z_dGN6+GEQ3SA#!`CJBJgYJuD1TY`Lm9!xsoegk}_pL$F9@ziBinmAvtv!G? zEvQN`&b$lC2%{m$iF2~+WBw+^p-J~eG6IMUuA~hC>FgALiUycBNZNzZkULR(Q3x%g zJ@660l|)vYQ~kocj_Nb$Ua8D`u0DWE6|-?zbOj`7(oLm#!dgmbH4wsyDug+sq?&Gn7E};WDPAF!*m{bc_~t_-+LW7^eSU%K?lfQ#j4AsEt9mi*}4Z<&fX4H8fKtGsYeyA212F4DlsDG?Za#*iU{ zsw&e5^LueSVsNk1`i)3c$_}Xf9t{6z)xgPZ`Qst|`w!z!j!PH!C=svn@E{&8+zX$j zD~~HGqbKRgLO*C4Kvmaq;ADBUr~nq(_Pv+S6%q2oZ2jKLmn8(6=Du^8RF!FS1Nzh2 zgGYwd!uT=UPsz#mUVcLDfs63Hmyha;w|_yu<+;OR4z~YU{^XD1DKDqq;XGmYrOAi2 z!6`Ac=U;@9I+T+Ft$;Gva+wNQcW(D37BnAn_|I?3Ig;Z%rz)!Hp38^cKO_P3Qnzbg zDmE(6GqZK>h@QJQPa}%pO4$(ZMA>skriKvuS%_fz=6)6N5Na>7o8SgswGmKz(9OC@ z$zpPX^q9Q_k14kypox!xOxp9C=Gct{s>En4V$P*V8KI9=j@ldG*FVx@b`c~pbg^s* z>*^RtVe}k;82VRe&uf|qqS<-~ZfLq;L}Ddn8&utMQpK`6_#o_$a$# zlSB9tZE2aMH?LguLNWQ_H^<}8S%1RZXH`MW!5rV1>bdT`{Tx=adCZWFt#8Y0y?^-d z%5U|FSg|)`@;nt>cTLL$5U&L}LAsn>+&y=rsm*a#ggfWLyk!hzGAOalv1M}B9JO(| zLUQ||_DZCT%ary!<{0Uqz1&AuNPDGO5&EL`az`fZ#Wu$+roD10V;O31fQ!mUx=guk z?naZeSCJKg+tRqmLVF3#u}6KccUXhppwO+^h&B})<9=@gSV^7o#TR@2gwJtp{_FVr z7B?P4`n&%3KRmBDH^-wdIQ7u?&rD>F$Nu|)PkVE7y!PF74}R!2`Kt=%6I~lK4X3`_ z>kpqaWuCnGk<-LJi+ex*cZt|{fl=nHsajYZXRR2%=)3yOu`sKD6wmq9YmVD+5{{}w zjiiXUIOrlw^bQzR;i)*zP9C%e+b=nxfpug0fapnVzaQB^!0~o-GD*G^{)em=*nULt zSlsaUu)svR;w=3A5GuC>QhVTv zm=27pyu;&!+5X)*UD|XQRY?a&Rni`l@AJ|H9S6}PM_z(1{li0^9W(AOoZ@g?j+W&| z(lCD{qQ~#RpkYdXy?E{TbNPIY*&DMJ89xWX5Sfp}lU3QLapE1LDvd8R15^`@%51Cr zLD4h?wFhS1hJbX_U}>Dd9cd5DdSc_NONK9rB;z3dX25JnYz>buStEej^Uq@2kj=)@ z0P_Y(doaS1xZ!Ue?RmQZ$cpL3ERVk+LA3nJtV`K#5JWdzHLt>qd);`!!0QU+E((Ga z#sE=wSbQnOnXB==hyhARjU%t^LgS^G=v|u$zPapj0?N4zNZ1%ubwQINeH++iS?6F~rwkuVG*d`depMCH6 zz1#r*;GlNLh>b3oQj+ec-vpa|X*uS>4W&uP6s=d(UWp9>=@Mawm|)Z%@T|+KPloL> z!R82&4097~(tRn01yFnCHUy;0mv@K>ZVBxfCK%MDJD4)e?W9Q$)0mIO)u&9b4Fc)# zT9p0N;2slv)1B!xm&7o^IP42xK@%K%*jIDqxzokEuE23N@FzAC+>Sq^Z_)ZUMVzD> zmReIWL9RVX^V`Vh8KJ<}^1`_ij{4q`tG-h%uAVq-%Ec)$^uw=}az>Reml;|;eQH(B zsOdG8MJ4<2XNuHs^4QAKLLreLjG8_Q;uK;OP7zVkg?vkf(|bxy&6G(3NzjT5_w~`> zO| z>B9ZP9?FDLVwKRzQ>IUtGi7qksEL6$1#HM;`EE(ryToa#DC}LuZ&5kVWToa1c$I(U zm^nNn231e4OjCw(7)da4D?n56Qssu)5U|joQ+&~pBxOL_nuMvBh;E_$QFS=oRTRqw zD_=f?2$t$ldy#r>fuTufJ`~C|`KqP59Kv7sSC_QCx}-?ERPKeyzUq=T>r1hb1EOH0 z3&kcSv#fg~as|o~R327c(iOXKbrJhwtOd3(ti&s2rnA?UbVb;^N>3%l|Ibwfr;p1u zmF3qm72%DXD?$-ggfzAZJfn;@0kf_&P!EdCdQejADau%XN_vzC`(oCFba{^wPb;G` zIbGqYHJqk+F&YBRq+z*KnyE6Q@(@xw#Ma45SbPBI(b9C-TaI*TnDr<2!ppN_vZN%e z8WE?V)d;mzYE}gz@EFoi7khNe6BM*mnTLk)DuNn>xCR~L7wZN%`)gJOjAyhBG24V!zOM@3R|QY8-ztu zR^j#UtHSqHVHc?ieR1}5$5#b$@J0jovv_R?tS1uVg2EM72XE-!o*)K}-Vn~BAcB)W zL>g-X(3KSi(W_>O>mRsSsnI zv}hoztGHI_&A|pb1 z6mMF4ezuL05@%`|WmL<`lq@DEOwkujb^R%42_bTYjAKI>8y{I{&pVlg5VN9~YZ>*a z$uBA8R3(kc3exkVSoG+Vqy#f!gD6m~P7G+RKxhOIqCtNQ(8Gu478U3)50T$)U-<(C zf+4}y!DI#LksqqkjA<#sGN6=^5T=wA*4W}MW-S9L!IU5?=5ec-$0psMus=k_1Z;^7 z0_mP(@ccNzkX9fV2drn25U4O*JB(o?i9`wnYl5tp2LYp%G3iFiz91@49m!#XK)UB3 zMjuQ_fE1{X*g!iU34sc;D=^6yuVe{Kr~j6J{ZC5MSFp0GE}iF@p5wN;ObX)0^Hl*F ztceYxQ9(Ns+z?%blPGV%I)p&<`sE=#2M*%UXTJStzgu#L)_DWgVd&f(&y~fzX@PHE zrNKIIM4o z;a9V(BBs*B_Zn>*(RYQ;L>lv{**gI6u2-dJBSe`-}9_Hg0T7<(<_$s&98bh_iVZC zOV$XWO#zE+LqNJ&L=7-+km?&)Sgf&;2&g@@Rv7kT^ZO(#ioqfyCyR`H+#YKM7TJb? zbkjZ>B6)+PJ+QEeZGAIp4=gfrVzyh@f|_)%Q06_BJvDH|eS7gU5fIsIn`PwiKiXD- zg-zgS0I*Gc@%CeZu}|5CVC9J*e8~3mZr8o|xM#>VTsBSBQi54{p^ja6+x5?`J7~JA zBZb|OR7@QSlEEWFRP5T8I2z=A4&ERVFf4K&Cm9=8Y)&yZ!G!~>=l?ec6O8M^)iEF$ zJQhSSAbzpeg=1kQ6D*hRdrYug{LT%fNr&{Z{6*v<8v@cLMx+7NDUlJ0ZGu~3TY_xB z$OOw2JSJGm$PJ}Q*V0(-P3I?7L~M zR#5gkj|rak;qVy^f2(5^$J}w`oP#xVIDkG5L>&V{$AYN%wXt{Bg(gI%UhWA~ru&RRDWq?WHzX&mL3-=&ZtXsApSf%)JLS_i zkBvfT%xwBy`%kXh>u`2zoAY;DI`YHJu(NNwZqtSjX-={7o@c|;q4Avb62;(RUlZtYdYpHojlAOw)mbEPqjZ zr8b1y*8lczo%Wo|R&QRnxVClfL(QbUvNxZbSv9}YTy{v;H@cqjP84sbJ%?4j`eole z{`GNv(fxnkTDsr+R6;hlefOs7va^(Sv&e>zP{#7lR_(q1%){ogXEz-3TB#<(Vo_L$Z7q|PM zm6is_J1<)M^_p&1Yr2*v{7yFmU`Jxt_GTQH?t*jX;Pkl`!^7zyi($^g1q3QVgBNFm z;MNl2CxM2Zv<-sOZ@6X9+rRB}feT4Q|J8X@mZ-Iv-;Gs$@zp~&-1JfX@1_rb6 zpnA6Q_FsPYe~rCaG!qa*vr_*0V-t!#e`+r4Kj-u(HZ(;ksxh;A^{aRFUvUEa>W#zJ zH{JAUeTUDcUAE$pw=)5*fAANh{o)cY6D(Xs7rVAe*|JWrn)hm^=SjoK6!ol*gJ;BmolCD>Dl|tJMpqQw*QxHCLgg%vvSLV`p@pYlzV>N zS;uu>YkKZdroTSv@;C3fqK^IN{LHXtwnRaol%HlUtJ~VxY3s)N5$@dg&wb){%F9dV zO#F*eJ1&8gMZ-St`Rv^b>R5;8x?TU|e>E%nK6UNrifijwpBp~^sNuBgc^l(b`M06h)T3@|IYMB9Xy$Zi$5`DHu6!oXbG9x<|O(3sF*F6^2?? zf9R}KcbGFRunA0Ug(#`w7F&pt0?W{_YcE9kh?k@WQJQ$A@itzf z4tXX+!;S(Jqd_4}+6#5;onP#E)uyYA)>kCr`{}|9Wc;>vipDbz=>6BN{B&RDdo5c4 zO=lV>PF}sX?ezUU%ZO~boefkxBh#6<=;BA1@B^2=6qBsyhbEBM&(H;7wtDMJ)*m1l zq2MMkLV$<)sK1du;QlptC;LWvR*M>9f&CJNgs_A_6KF%QH5(y-L_%a3i4Q@@+SCzD z@P_gQnlzkdjnQm3|A)z;3AFhjNH=|!plq7L)#n`zvO%EB7Xw=851_%*MTpp5BQi^d z3kWgS8vrYQ*VtqQU1QT_Mh?QRBqbOI8wB<^VnAyJf@MI6hNz(yQWWzu+_LL?KIVxv zhy;x$Esv9o*<{%*%ja~eW2uk#ZTHj%e6psga@J=rT^ZemozrIe&_Awg%B)zu_R3Y; zHr6luZ0VafAGw%Df|iU~`DjzmByAYZJbhLF(*;YP)|~9M{D7bATR4}!KH%;LE~(UX zA#%1K$r!s0lOF{5#UAWGGuj;@jz4^C(!^o>oO+UR-osluI*HmaiJS?xVMq`4J+lZ& zGRAJh&4nS(B^{d;0E**(ts}{q^cCLms(V_ZI4YTsq^qjdR&` z`@Hk%!fkriAd7hLh}U%Co^>s=A#6J2hK(z~o69zq_Z#r#>fDh@d)78AoVUgdl#qKf zGw<5_rGqtl)d%nky?Xv zRtVk}#)TGz#M_3&Xiiaq9zOXkwGu#1)SMPeDX`7+G^a=hDfJMxpM{VRNeKt4a_CS9 z-WG<^LlBXq6$m3d9HOFI!I7i>5tY4-nUhXk)M03z!>;(c&#O1)_v{Ifx;fq2`9H56 z(>2B@7V_k~>I|tXaGb6DS%Y{U(ww&AWXqA3xLa@0WLLZ#{AsS?nNBqr*Gu8?c#FL# zk2l(aY;g4hPTGh6A6zL;h#Udu2naU&PnbB7&J&R5jR{KM>WMX@Dvv8E@4%x})l8o- zweN%(HKQhvsjf_=l% zC3QER^5Q&y#;KSxD-8D4D7F@jb2%}~50l-JsaBtBYok8j zhA*kLnJ$JSugD2xcCCdIPXD~mKc>$#HwtEfCmA8LugMhwWu&WG?bIm5eTiBd?f`(4aI}IN|hOd+&L`xr4M1nlmztm)H;r=QBV` zfDFE-4WXw(j=33C<_nCMgdoU~nCbJwx4&jli73@x-?2t9=W*D=-_}{)0=}b6vev>1 z(qoL5=mh}EEGTFb;!X=aTm_P<6$o|#Av_LS_}f~6{^v+n)MUP+e0hbE#$*NQF~&=@ z0>LuaAgB?I(I8O?gsN_XK>E~b*RL>pNaqdI^^vN9j)b5*U;s{Ge_Am&H9-yi%5<+NoihvDbxoTz;L4(g=gCM%;`q;UqY)?aN zM~H$b2+Zbuw&c|#Ki<1Xhd^&+)3izV9I#+m&I;756wSS3wsYT1rKq8~va%)9FmTm| z8P9*7Y4_*L_dmDhMQTxjmEp{;2jdClW$}%_c1~Y3Z61>=0uR@$$Q6N|=CNh>&!779 zdo|qv3Iw&3U>yqPvCF32d&*l~#<+pFK7v-bnoFw3FGKmF#T*x^CMXFFhU9hYr>&T2n5^Y05{X9+N(nb3^!yO>!bIZ2;5f5yvSoV_4Wz9#;(>47QR<_F57FU61m z$yjvhxmPuv@eQ_jQ6(2;qT{+UX0eM~xrh_!uf2eNM6R6VGozZ*Ky+M-L;Yx|ipa@w zgA=01YYb#QLd~)v*xHDY{38;URj61t1f(}6;2Bz78v?e*F_0<8q0vQz6;Zrl*>f04 zFK>*oqeQL+4F95|WU|8PxmjgDW5E!KAnj6DUM9SwJSzTJF~ai${$HH?Ax?8YW5|#} zBL??6t>1`Lr8o~$elCW8J7VBuF@r_l*)8o+(gwnVc*H_+ufE4C_eqN32U0zlHdOsi z^6I$wcqSrpVmfbF>`Xd;)B3|I0lf+v0@7nTUXo`pRW<~4nvx)c>9HXY-7ra3Rd{k7 zOb;ULB!^CFuWVQF=OicPE#b~dWH4<7HW$jwFtiKJxWB_pLWVIN@QZG=_(i+(xZoG{ zshK`-vKTNQGHymqrT8N$;hJort`qNBnJyReC6_ILw%V|JTHEqvav_1irY!DhpA z;W;;#D@n`ccezXiTU(ihXUcKE%N6Ogne_{kFzQ(xmkS|$S4v0vMN2GpiIdeQx5yF+ z1F|~I6}=KJft#|p$fP~L!7+_wfIqE0|0AtENsl=I4~~v!*kD)$7{HzNY@ZCXZqEF;)LF(BI_iGD4OnG}pKv6uHwQm$SC}^kzpkML=FP#(a^%pN_rm#1R2e7cdB|Wk z<%>3ikXdgTKieO&Z7?(z0iHURn?6x_Fzg-jO$}XtfZPtl%FbuoI#5p)% zE0mPYI&luB0in&gcO0}e>DdZ*=ri3~))hF;(!B82l9L@VB0?*<{2%W|ZVIQlJW|L{ zxAE{$ry3I3Lu!;C?_O`=O3YgUSJS5T_h{`rfWz0{} z{`vnG%B_v+@1ZgyOD;3iZ3GdAlX?H;CazrmkCtJp$Z~=X)|E@+KSF+{SeRf~L7w6> zal#l!tTOM&qZq5q3y(c+$1XJg1s6|9nPj0kTgdo}{5RN@7yLtXB;;`IqLy5M8)idz zeG$t6%O3@i!3(n?5Z#c)kL3>`GB{y21d=5NvOgUa(nV8r=5NmPXPk-@zR+BhH0m&e z)BS={rORCPs^vn-GKfH7fBYn4J&@VNNiWw2xehrr=)Oos0J8)#+lGL2r>{Rn1I!mh zWXNnALIYNb1jyh(+YpF8C}*B2$H9Llgs6guIUHEaXDpx_#(Wye5+F`s>i1!#C3aeb zEXYY9L-AB5tz3?l|iCoEd=0bMYX|GhSeB;yz4zTHRC zKqMwCp>iQt5)EIPMBqPA}B9Z-WPOX7}$WD~(9&|)D+#CbpnneuWG3Xwkz%3$!@vtEf z-7qQvI8C627iD9dy&A77(-W_k&d8q-=GMKV5$Gt*E8kn~lG( zJhnkhi+^|SNgYFWEV#imEfmytdFca}zgBkJqCgwic}>N?XRTipXfrK%L?#)*Fg>>@ zM;}6K+c^6wL(t+TkpoaDA-Dkwb!X5p)y62SKAtduBEaIgTk>);O!80}VVKDCg#H(D z<@RwAUtT#qH@{K8MOl)TG@d27A)q|@46rb)k>y>?ECIuW#mn@fu{fGuw~=NbNHP}t zs#c61gi-9slZ)GfAWjTJmV2+t*snkpAg;Ng5@i@ZqlZWav9B9YtBru>1AHbM0yQuR zko_)`*%L=(w|9J=!7$knuo;elEOHziUobQTVN~6KGO0o_|0ALUIgU@^2T~!8Cp@O( zc@6Xq>8VJbvm?~kL_-$dj@-HZIcYmuq&p{(cZuGdL8DfON zBMSRt#<7*yh=E%~oERN^Y$#%6DmA=D|I32h{Qa+lLoBk08x`JgiU~P!|BDd(85ay; z4omm5vAMR4gMpAcj1mmnSzNPP9M zHVn$pg{;-zC%m(J$!;!13B5sWJM4swkBt!LHWt5daDVT)jj_*}$)1i}$$z`Wpm4Hz z`lcMg*_+czLYk<`n{?k#&Yv1>L2yy+hfO1fSAM%OQ}adp<2JUwja+@TsMZZ-JdB9B zNESqX*=&Zc=Q7MKh)E9v^U)AlzE~83fXMKcQA>SL{s3t&`v{KzB_1-DbW?fp$BeVn z17!q@gEDR^auHIlx90Xj%IcxxbL$n6VX1ux0wM!K0$TWIlbG<<4j^T=VBT+;hDRK?|<8*Wy=onP|P_dk!yHl3cxX zmoGkKcb4lXWC>x#C4(yCy2cDYx@0Cj3$Vo{GZ7Hk9B;@4*)XVmUEfP&Dh#?Wk`X{{ z7%rKCK*+|pjsfNklJO{&R6@vojLJC0C-E2+aq|7lzc+*AJ=UjYocRx=Aqbcbj9dRI zFWhu+i{kC$*}m}+Vo^o*joX)?Dr5{AW&N=Eg8& z*)kLJ(J)vB!uFVNW6;QgY&ICV@a!KnG7)gx!K7zFrX2SV8buCSoAnEmAUY7@G}s8? zyJ|e)i`-^0D4cBe@uW-Q@8iks+T7b>Pp_GO&`U;1@}(*Q+S@X=Yg3ty?QLPngYDYf zf-E0AyQb?uwFN;}bNnX_Bd2_$7m5X#GYFK6u`LMt&Bk_ZvLI@^HZu~m28ol{7R0h$ zo3yRAYrEE@jR(X@b_-&>CGs7=DPU~ZCY``nCvxv!k;6!RNJvzdK+XiV2yo~j zV2Oh5+T0q3B5+$4O7{Snx1>G4#ffxgwf6joM*EwjZ(rdbr_fqLx|DIP;o$q(@Q1ke zR39%Z1UIX3p@sTXA5SL9A!-L6UA6Ans7Xfac5SK$u}7BtGOLibt91pAb8B9>qsGbE zHlX3c0;i{|V2z7T1s<4TBRT~e>xBaUZsAItQzk6?;L03!pQYuI`}_p6q1Dr;_M1Gm zvRLky5QI_FM^)8~nqE_x-iM?(3teHw!&6Ii7gCDCLPsX{3tw z4a5myr2?Jr#tW$MQ zj#Qapg$XHbzJZ(< zYh$U=efCM##8Pd0J(xNk!J%fbaFil}$B;%h!EGHWBg*x45h6} z6pPAg?Lx*i&VNO&yjcHWtByt$!^R6ScbmTOeOdj!tWKyAo{X#(rMZ;VTHPx!N}md1 z*=)YDDmL#v!^hNUq!1f<(!$%b4kA4Vcrv=oLMO2a}4 zqvnqp8K+*6g-HyF(`g{WQg;?lQ4uK_71?#iGa1G|NN*V9r{nXGD~$rA;i1Z;NCXl{ zr9@$W8gWJkQAWsYM{%;;l;u=NF+lex>WVT~NQ1ll@Lkd2K@BnEKMxfX!@Ma_e zYHN$?^JCaZC5iT6%o{mbJ{mY8;FBR7pi_k44Qda@yd4{Yq7NMfDFkr>6w)4yK(PVv zW+Vb?s|B>b|#fZ2gR?^-3x?Rrr?=dX@h>eH*`ARL#JuhU39=GsT|24_h|xBZ0+lVXK`45y(Y|F-plBh1YcM8`4Wc`6od_DNgJXkGboYFv zm~8B-XUMhM4vWwMhzfuV(6b~#(8@a4AQb(D+;vTbRejf~_5|QA5&{b=8E%?z@yU^- zu%^K}AS-5Jb^8K~Cf%2=KcJVO`MaYk>R8@~QJ)#+=l#m>H{jnD+wW752hpF~!EN%OXS5*Z9nGdFz_S=pWDZTTcJ zm>q0wA}tqIl;$-%k`u5x$cbrPu+cK+bkqrUq^8FayG16W{TW9iRu3NHt3e0@d8b%pa z+t?AbbeYzk)aHjr1?W~pe1OQXo-70bk>v|9>>g=PwT-Ghk3?ue?WqoXchJ&mv-ezK zp`)sTSCUcn*KO^;`KBo&J~v8A%$03mBnxG6ZyRLAM>iWb56(XYUrSz?WniqR95SZI4WD>Bal)pC%9j%fz3Ixi!}1I$-VDe<`> zZ6YblrF6RoT{Is(QN8q!2Sh?NX8a}AkPd}TQexHUB6rck>tB_Hj%fz3l$UAMU$0_u zeHd7K-K8gh>w4MTt6#;?#FKgUp@}^>1A{9q-=-A96Jp3h$SWNsC9cEHs$28!x{guv z7$g=`Vg`&YY~_tN)dDWtkL0fZ)@_{2peLwp<>J}q#uPo~bez z#0+qv=*vgLa~Ub(59W(<*(?aw$!9w{X%CDhBD^q~+20XQuzq2`7GrOp_LR#8V765O zwp9ekLdcb?&+D>T7b2+sZj2=kLVp0QdU6V4iM%> zTg>M6i0cX*XLX+40=MIg&=N%d2gz`Sp>;k%a}Cm%VZV$z1pC42EnMxzBj&sxtjOGE zQ(7n_@@=!BEn|F9yjlA=S**Lh8 zCe53c(d-}p_cdEPW~XTOPyhRxbw}=S&59)~6S&96l`Fm5ygYd)LSx0|FKD|?n=q?- z>795rJ+ zPjtvd)zc@Anp#<$64?C(FT<+GRhGz&d{sP7-|DF~<5QLCV!<8}(v?Mp;srtA@za$h z@_iLdaaM)V&|6+=7?12Y%V)dtN`KH$5W%>Kel9wW7x1)%qD2=%C|RW2l=GGs25BCl zt`OpXRrqw5C{Z_@6~Tr28iy6(3sXEJ{?!wigFkE>J9Dx=7EsNQt^qZwH1;$gPb+ zAfXtfKw*D^afVAUTOh-clUnBbA=L~;fbNgw3n8+~a2tZ6yM2rleOSH#X%9wGnd+cL zBA~W#v<|~Q@MLEImP!odB(OO zP+Rudn0QSRNU02oV`GIuMw#Xrs9}F~UaI*R?Ds}NU|u>ZNn@-I(~4<_K}s+s4zgml zgNLXjO**C-a-|ZhY>5p5=?ADJLZD0%L8~bl8^o~+G6^(T2ge41bd$9#VdNUOz1Sd5 zR9t6)G9M9i3ZB>?klrQdB&e|BwwIICt5FbGSjlkHu)L4?B!v~Xy&x+_p>)+67000a z()9h-0sxoyjk0fqK4DNMWzY(cQIpQvQL!#3@vqnT6 z(!c*8{-jXd4-@yIlf;J|0!ve{-HNNN=4nDXQ`9R)PK+YqU>jx9`Kz`c*Rw=c&X5fO z>G4`QiL87Z8v?da36Pa*V?#i?P4o~tYD0M{HUwELZJG z3|NRlz`EAFmP>L1hKo2cN+Y#<2HmDPPABt>J7=)aa@r+Jk!6{Tb2~^Vl%D`TmO)WVi1MG{x@QpF6lC*B?NL3n1vk#DF*2Ngnc1& zR8&{ThM?$?bE_I#)FY3ZhjXHl2&gUU>0~sf=Prr%z&Il(fmvAF+^Q#4^A=@PLm)PU z?ULW&j8$c!S8Q2X8^J8m%B8Qb>DX+7ZDW=wgiUE0z#!zA%uv=wf-&6KH!?`rquZ}(+Ke)LS| zH$Tx<7&cQL&mNjNbw$~CQ5}VK}|s`jC2r^#ZsTL!dW4>6^;uXVuj_$^{$S#!Z)URt~+l(hxxNz zTg{f(OgW90Puo0JJI;t@GbOEOw@oo?u0a|z?3Yo88tX;dFe?jJdjMB8($Vew^WrQ0*af@020GS0=1{R z2E`sk8H?UN{gz)}Kb)UhbJ{DFE8ozq&B*t@x%korx2&{@h^aRLi(8Yp)$ZmfZQpn*i z@~qkfg=`|A&uY@MB%rNjp^QZkX4N$@Fv}h0e?oL1H>1xgSiPiGxV03Pa&P`$fAn+v zw$1LiPt=JGOk#UEeaH$4^vSh+9z*ZfwSVwU7-RThn-JaNLHsBqc@a~KKM%^}V9$of*9>vI`K|3XnF3&lSQes9;e2z2t-Pm2{1IK9B z(9n6m;)yixNgB%j`7E*g)Sq0v47CIOiL#xNLAC$m8H728Es-~OvgVk!a+pCz7anrY z^SAk}oan_|Y002Gp0b>qs1*C+2g*IeB24aYO0q`2P(N3Ot$&bvhd~qy``?J;3vuo_ z^SB(IIO*^DAeqGx^hGiPhzvtpHUy+Q3EW?pFt8$|8E}*U**{?r;7uV%cAT_ED953j zkzl$7uxvRVZ$GHa@v;K>6|~@tBU9T!yC>KVDv{NM!2xX1&e{#C74Nyzx)XKwD$Z)y zc!+4?z{3}HR*pz_=A^)sqCA{}JJd9%I9P3!@y;){8Ae+%!4z#*D)O<%wgGWVX2;Jk3WMzgsypx#`WKB{ zc7tIxQK6VXL}V}+HUy-*{oO2B{zr%m;}SN6+W01)avTf*Aq*B17BEZG^KOifF5H>RbWzlk$GcgD2TylHFi6=!@t*6NOO??B;W z6-(MWiB4I5VIBXq4Ys^UA1}u5cTdvRXGP%EBQ7$PknB}AP()j1AuKPpPS>(xac+Ab zRi!-!4(U?Hwf)@yQ#Jw`k@Bnv+yul$ChfrxBu9|5D$hn65u8=okxNgn$YMl9w`Q>P z{5?ko9V8Tr$^-Y`acqtf6OkRKfXPb^e@J<0h>U|dQ3zxiRZ5m_R2&P8GD7R$%qLaI zLao*d;ci$Qj6^jdJ@>swlrO3^w;>#>w3GlDOhPjsQz5mXW*Lw-)B;{lR6Juihb!iw za_4ObNbiz!3RFr}6+cP68HIqQ6jx6*Pbr1z;XDlgx*JqEX0BhfYuTv5KIHHVw5y=rjwjekpkO55OG@r)L?UzKxItMU;t{eqUdfv7ZZ)T>bz9e z1p6&f5F`zQBq;1pF-bjBJ97R%_Pzwpj-vSgEoX#~ESNwzvk-xBg?(?&Aj|875C}(3 zau^IrARCg9ix3DR!jnTGAOsW<5;gnz?3?MDo^Mz6QC-#7V1@_70|!$ei;V6>VgYOnW=D<>0_hLz>3^k^vmhZ?<7%iALZ^8T#^JCAG!67x+sfFjs@G&$!pl-(6lvAz->r`!! zx415-gbnP7KoZORQJWVKiNfwXDRqG6#B{aD$?(8|#74$dgA<7bP{s`~p#HHw!}cfv z9A$B`;mr{q1Vc|;KMyGCmr5KOM&=dxU0C8~Jk8`%S8jnaou<)}KIAOZ5vI?qg>p$m zz}zDHht^%$l96|%bkh-9!{uvzTUk1PJY^oZ+jw_CsY9|ZmTIF)F{-Xr`c8%P+1$P4 z&Bzuwn;VwsC<>mvtxn^HBeIbq5A1HzCt@Q(9?z|YBf`gX6G0#G-GT>ktL2u%W}m)z z`uvkyTMlY!?jv7QYx5ylJfOSKsMIbU(A|{wfbK^9zQUE~b>}7bN|VDm*%EhjNyuM$ zK=NDR&Es^&<#n}o)$Q1W0%9}P9zpUh3bnm8OAj_Zy zN@Ik6t!;jwuk?eN#OV|vazlL(6kyIEOiMx_p@a*`#xt_)0&@$TbAnZA+Npt?vOh#J zngT}|lMuL!6n2x!BBL3dGn~|LPL2^ei3r_I*a=|`F-Eoz!O%y~37ogf1St26ZE&>E zkrNRxx03qV34m9I1A2rqf-Qj`FRbCR80#fMC!FXFB7-fF^C1}e>dMua$~|Kn=v2j# zLSGXhlC$r#AGHk{d($Mq)1V1I#7h3%o`3mP>wqIg)3`nNxP&XdHHQOaP`Q*!KY^5> zM!XOPI>$T3GMp1M=!IMqV&7R`e`w!J@*+3>xqFVdu5xHwHbyZN#J3)L^Rr)hCJ6$| zCMS;G;|Cx2zU$ZRldfEO!H}A@WJ(@+`>I=WdztUr8!M$z4f|IJfl~GmfQez2LdtC+P)(YCwB)?|CT@42SlMUd)gK);H$c$aesRWS z2lU!f?0fwl&#rjL(($?PYNa%eMz!cYqvdD+{_H%0j(-)Usupai29>3L54+rW5SL12 zX|#!)i}$e7chSw?-SUy7zSg3Xlz5j=du*m5sQq0v# z36=&zq?Qt~J7nj%*n+_YCE2?yNxM z3-T7n4Rf_Zf8YKGyoWIK50W}J1qpwuKs0jU$#YNL_vn)bh;NFc-+1Q0B!rIQ+du66 z`q#GEOB~bVl+C|6?Umx#$=84F?H67lrPK1{UDNwqI61(S60gXKu>n3TUVPy1e)034 zaZWxgPPuf)wt4GMsTi4LG>x`eREB^BwwVClJKA3ua>#SruNwRSgmbyp7y3T9{=6{( zh7+$SW5XNIju^J?=}(C_&%D2W)z7Ug|GH?|+aE93S)9Mw+Ly*%W9bzmH~J86IOQjQ zKmCZk!~^d>epPA9%I!YNy{2;;7d`)tllB(74fxZ5^grw?9(jA`(QA8KS$1FisjvQd(ID}eYt}FO`2Hjg zZJv^hrZ+!Ooc-_vGfuuV3Bk&E{fGP3yz|W$i#2agU2*kse5tM>k?rTa1AiIvjmk+iM7JB&o5cyhV&iifN7GO|(z8fyWga)=L$@PyMb ze$17iP4Dl6_^^28b;myU{l45akAXBKTQ*IZdYh$ti*awg^V2K8^=kVM7frnT%Kv+r z+S!U5zVp$SJBA8>;_eg6N^|bBP4gbUzbJ;EJ?7^xtWV0Qj^YCkJazN%I}Z`>{Hg!1 z*MIAc_U-?1+PQb${hY~Y`FXy9KilbvyBaHIg-qf6;F+g>>B`k-_7P9t^5gq=TxD4~ zezTKy7<6H;;PK(Fe)x?~%?(^x{2`LEP`laiYns0LtIdNa53gT&!F@>(*yMK-vmZF| zuSfsk*Xaop)b$ z;ng+4%L7H9$KSJbzkKk-N?ADX!s)?PKiEC^*D1xZzgU+9fl|IvJoo$$I{JRFwtZ@F z!Anzqegl=|m(HI1t6XVj1}W>FeCpz9yB)You>GTZUw+^FmX$xBdBeRUU)(u3{K_|9 z?Q@T%S1x6Jwz8}iug$+dx1*GD%END+H6$dZDa#;<1$vGuqR`N?-`96}Mr<1l{q?f_ zw-H<#pPfoT72aS$f$4mi$8_FGqJilg^OcxAkfjbIdmKP23z)SMW^b z=QgaD4kmneIO!U>t~-2mjSM}b*UKL$Wai5WwsZpv8rgJ=J_JKgbUbzX`bVi5jqG~G zi3nJEdkDZ{E-NOG(m~gpfD@hTTK`-lgHODH-E++enB?e%^V~*y${GT8Fqqh02s5;s z0-Aav^Qo8(In{>s%DG})1V#EanZe-+W)oGGSK&C;g(o_~(f~D@^}5iNjDXVKcAuA-uEh{^QP@ zStC|0llJfRl_OK`B`CcRFZ$MQxY_+5rN^IGv$nl`$rUeLIQlL!Q!d{#*ZgjAe8AuI zhEYaPl2ZNZQ^mf^Wf|z9dvR?IF-p>>emR1b(S2eotfpsK;nt+T5U_KU6Nk-1)2aQ%~*_E3G*JP`J<2hHN8OBjcBQdL?Dr_mKZ^ z#I|Q`uCnOmZg=@%qouv9g~c?qSiMfV?G2!Ph9I z9m)tj8*&m^Cvp@ZM(AbG5!v)?J_JKgT>N2EqTB;>egiKb(RHu6J64ZqWaz27W$}m^ zF+UuNHnjev^NUA}R@fL8k3df)rvT&Ev2~|(=WP~zfUHT}Pin_S%{u?|GU+?Kku{AFMww-PDm*B!&Ho%isOmSzC&yF6+5yr_eGYU(G4QrhY_fICC@b z9XqSx(Y8!tLp{f?#@K7VHto{^{v=37(+JWlG{DAk+>^@DtcDBxX|pFNV`F*k9M$Fw zCmKX#Gdku$@OD8_K%yWrIDRn*WxGv+iQZ7TK=+uz1Q_`2K0p2T_7Anc)Z?VTUVW3D zr!gx?gJ_x_ij*-tI)>|HBle8X{_(&nGC`Z})C1u)+WgQe|A1@g9uXq71&T?K;sQb^ z9J!p&oc5XD$U@AOq%?}b2jTM>VjvC4W}wjw24YRp>@H=LaKWvQsOf1OAQ#AlC>_0e zYMG~dtdg-+e--nsj%rD!W|qI_FFjr@zOcTy>)oqMCtl?5#$ZR`+G5rI7kqj0mN{|M zn~mpu`J=V%tA9Ox1h2P}A$0&tI`w zK~#p&QPg89Gjjs4a7EXC)Qz=0zvn8ss5`J}CEQ^-Hjdir@e3ZfI4}CV_xDkEe|t6| z?BDyxfBDTvL&am?{p}l9d~DY$CE!{kpvi}D#Dpogp84G2;(%W^9r@1(Do3W=Yp(w4 zF?SsKm&3)OSN?PT`t~FQtRc&bXWYE)?{@9`TKl_q?*5sxc6gb_p?~m`$o!#_O+LR;#A-Ya)8yg2mE9pCwG5{EWDtIuk+kVB3HA%B|$ z(NV2Ig9!V zBE%VY?Xb`EKPPA4p~o!Seson%xQAxi9`%Dg{`K?$15yl%#RwiQkn?MDxhu=`sJ-O- zp6{;URz2?;aLY9?!Ky(lXNuTS++3E;_sVbuW5M>s;!nx9NVORY(^xUJRvpJDNL&ec zPGL8C8Y>1n1~Xn`IO$;eCm0JUa=M$Y8$x98Q+)_X=UcyAEH{M6U|z-`sNsiPDKGSE zDUhjL8mhtw5vM}qhJHGV%52N!))kL>`r4oT?_CK-+2xnYOVWW&h~Xm0at!76oP3zkL(KUE%==iBz=<`b4z7cQ=K6EGo6 z2L{o;RYrSkC*O#idbpz`QZa5)Au$RdHrK;MY+jpGh#aENvX4_YuT3f>T&MIsHtjA{ zA+oMILtVMtvacT+yPvdA)=iwa5NyLP4>dz$CC?^K(b-L$`MRo5gIZAVJ!Oy-C@89PzIV) z5;x>BQLH8f@KeyAo5t1#AwAKPas-VDU`+=L?V2(c8ccJRJJ=rJH-f3ioM$T1XMV@z zi$fwC^gn1SQVS4qqa3lE0Lchi7@f*Q1gt=`W{Ae%9r)6OzzLTN$Tpy@uEr`A3pwHL zZD*`u(7`?gq<65vfl7EbD%dxS;2Cx(gG}XOTs(ttXA*B%E;-?Xv#u;n7v=()5T&Ch zg03&4K7H*3m`F9++34bwk(>|13ff*|#dB7PlX*1jvRQeVfoX#1y^ zZ+F+#R0%(N=lX_XfhK}tMR15%`3iNXo>zQn{Fb8cq~(`|CxS{(y>rAjw>VI&t(o_u zY!g9O?Q*P4QjSN=D^@fSH0I#h-?~<=;Jxsf%l~+*oCs>|^|KSh6G2~U+h^}=6G4;J z{L3o`i$@tJdRj)(bx%kNJ-H#lVutQADG~j?R3cg?K4l@B zdMrJZD8D5c%PSH7ni_C#yH@_;8fA=N8<3`CkrBS8@sLqEAw{W|nM=Bs@y#TafgH&z zwt~Us5zOM}6v!&~jFb1FF6*(d`1y_`=Ir8U_Mr}{D&4X8`KB`ZEcrv@Xr*ywE$Qc; zw*2U4_dF#C<$2j#s&&RL99tm*)~;#+@EB%^p+U~bu|cdG@S*Xi$BJ*=zI5T&m(L6^ zcJT1O*8cmIQE-O9UY3r}eOHpP{?Vsf*NwV)l+ZCp&kXd{`-3vkr@!z+<3)VMd}v%? zIO$597?<=oc(Z0^Q2tHiB=Vtgs-)&a;|VySR4})V2WvQKo5>K6p45zDkc~s?K|o_D zq*X!~@wdpcYYcG&M9yMnfidJo$Yy34y#z9C+;-Npj$Wct&|3wSL1m9jS4&1WO~p|T zsT-^|yh1vWSOBZ^rg8L5w*?q zhA)~vuhnj^QyHRwsT$_@oAU2#K6BPZLK5ZQ*g#+GPs!e@JIsn|vGwQs)a`T24fnxw zK3rf%UEP=CLo(}Bt_>)h-0S?y8^3vxcy7#fH(ox`a&qpjC*3#v?u*2_H?Mf_`&FZY zc$g@aWQ5_k+l`FDNRCi)-$fbMk$w1&z5^Gl?@c=KGJR)KBOoU^#)-gEV00&07QoyC z3)F{z^ioT}-uDJ6_rRj8H@rm=N-l)WJ)n0K-I`)zrx{Q}8NmWYPI89^PReU86cA=~ zClU)Fve_BnK|thEQ^4N$1}XPI%|B_7qX;DzqI+^LY_TFMxyHarx($VAbSDxE$m|2? zynf(=AUb=!Oi<+?K!YQ@47rQEQ*tSofjI&6E~tJ0RDuisQaXA(bGg)Dak}4be%8CU z3ccm)qh_AIxJCVFQhs+yirw`U{`xoSeWmH~u%oCd|JkTVPM&!)HdL!X4bLTWH5ZaV z{Pw#4YaM(1o47~|)m({v?VG*tqUjJer^0(zJv?iQROLPHI{MD$<1Hr}PL=O=(Ac4J zFtqsIwoA*Y^2%kb*Ao9vs`4vMr*CS2RppiE-v6*F?_BQv=d1ENGpq9UZI*ub*uh`; z{-LJg!KE}IFyWH9CS6!OQiNKSf8V3Zm5r(_XV{|z>RhQ~W1`na)$w(G$9(#JsgBQj zT(o{zvPw|Cr2b0!mwq~mYmWKLke|pexSzgcvpcKqm2*?=^L9{kRVGU5>{a8g2z|kw zy-z^)hSc$*k#F2^zf{M!-_-Yo(c>*AclGM^?k&=?7LV^e{@Kkx3CkLHX?*47J4Y#X z{OIR)I3R3UPwg>yZD?O{FQ?;k?-g^e*@u91jS#hqy}*=v zsV(d7$UUZxA)6Wki8S^!yZ3z z$D9DSTnB z6#DCEM|YH8AyP;2s3}V?`puGY_nPN!XOrt_R~h&t4_C^VhXqi>7A$FHON<0;_E+2|XY2@p6l<$w7K6|dkMT|a?Cy-)amrhvq>;;o>p|G=j zVM6Po#j{VIK35MF+I%R~?iBY>CzMy?Sw}5cH2drY^B2dwsbFIs>vtRC-X%`+b#d<+ ze(RcLA)9QDfj8x+KTBxJ@7UJ)Ed?r238M+Dv?4SUFR#CY=#~J)jb^8!=bKe!qHNSr z8!QP^Z%{Ug{yP+#L%+aK@KVAXxMJh8^T60loOq=(g%ggkX7IUcE_ZsG%Wg7~+gu9% z=8~t}rFxG|N(zh>7MqkLK~0UemqM)?Z{~G9TvYgSb6j&N4Bm*F%PvwfZ-uRmtMMi? z3*}o&VQ}2LCZ8JWG1ny+R7NDo7*LVjVu;X8yicwn93IG=3jdYDf$%^#(9zh!0dEsK zWkdLJ#SNhj8$tp51ev!`$*E7kqHBz_gF1>sMHH&a=DqrcK@Cd3@Rm?$9@G#jE`w0e zvot2Iq#0gVM_`#`n#-h_Z(@yykP5Zz4U=wteLu;gr|a?N98**Js0ILql9M zB2HtQk>R$`h&5kg=~_+%8AB85LwRc=<(on@j5nC&2gPM{j9+g%07~1EFjgb=3Bz!< zVN75uGhRw~16SK8xF!+OP3)9SVa2AVu&F78sy$Wj5DhDBcQ=J^pn0@mn!-;uHHA%0 zAyn-*WK($Q0s;E`lWz)Y5ygF;rcfoB+FJfgcVDd?QJomu5TLkz1DRKWa(~oynPm(( zghq6D*$yq21A}LhdC8Pq#-M{AdN?6ETQE@$ACX}hgAd^~Ofds;y-wbTK=eXTj!owo z@(jxod3g$`k`7iz7;rFUM zQ6FQPF^~}U`N3Y#&6p$U)lcW|Xtv+-3t`0Gl8l3=eg6BuJM&_R0DpnGdM+qqwfJXl zhMIS6|2r(9DLOA?`ap3lV?{WSRt30pCsHK=6hRKe%ItlB=_S1mEQ0FjxIjImKceRZ(UNWu8MKTK;T|;YGa!SO@gWeM$x@DQK z-A4>Nz?@BIwJ|#~x5NOVLCm+pRr~z8>M+@Q`DzMm?XZ!e@cQY0au zjO&V@z2n&-s#X8uz`jeu(|1gBCCW&gK;57^aBL9GjxYr|sTK!c`;Wd-hZgIPS^Gj% zhmIBIty1{y*n7-v=&@#*a?deNUh~jnAq^3cp~vze5Z%_8a-jMdB0~@4L-1J)<=_z+ z7RLDyh+YoLeMTidSktY#cB4f?SmLPBXgtoHpGmV8C6b0BP&!)e-&;m|fZ881U!S(^ zst%3Z6P?P~bV5W*lCP;{o#g~!UMhuNj=#m?`!6;|S;LIa2cTkZK+~pX!VqR%ARs!U zmqDh=%#6__1T67tQKiv!SZr0=;xJ5%?f)tv-FGEU$QVtl(i?yGi=C7)y2F=mSBezt zUdgC*VNx#nI3POaHW{P5dqQLMk8GVcA$V>`MrMqT4LmOxvd!&XU=d(@{35_H!n{y2 z*OV7b2Q0?>%cu^eEokCeSsrSL+ggq8l6-3qxrVQ$C-F%cS8x$3&p1e7*`eC(<=d`P zTJcic+<-b?CFrzG1C~Svn`W!oztuL)IoD1qXVWBQw%u9*>gK3Q)e2UhYH{lu=WCnh z53@fmXVWBdLNyB1lTX3<6k<7iY~;-HV2Y2BGuSj>dH4{>^2mS;mWL04=;g$BpQ-j0 zUI>(-=LbMsoPxtqCYhAOP-fwfe%Z1j3>aK?Bjd!SJCRs`qy($N2Vs}$R}5`45IhnK z!B~hcnlurFyEGKrl6h(~u*3l)VUiLQiEr-$(HnyZgpWYbpc#A+z8xAqSV^}T2u&R! zqU-8PE(&JUx?x%0N&KJ_z3qAs5UE*$f2jfDqAToh9cz z@)x=x1I-C$zP(#W=ex*U{@f5|pgF8A7DkZ71=>3%&n+f0YKt znrTugoeeimIH1>)8 z4_UGD>f)bQfBfjacKv!T|IE@a4zgz~l^8%Yh@2E2{pg}cpPzk!ICQTa{v2MvzV*oi zw)xyq7l_~Add+bM{4Htt$|gWE*4=obq)KCP?2(h@Ng_!I9mRzwUH7ZU<@rM^+viPD z17O=OzWN1u))EcffAhG-U+s74#K5Li{*E}QAN%cB*RMbF0y%8Ih0K0tNJT(8iaQ>; z{>Rr|+gr?DeA*B-0QR{PfAOdA0N9Tv2ehk-c3+PRVYxTXS5GA;-`MO*xu)N8qQ6!9 z>IGuuRcfujrN@CeG(?7v3&$WJGQ3r}aY?yHW@|}*gNAl*IBeKJH1~3QsHgMq$2jxV zf}$+B2OXI-pi6qGxSd|oGJX)HV~XCZ%spe~B1Fyu4G^`oGTaMk9;oayX6vjIetpOV zuU{Z4gRsXvLHv&5E}tHELBDJFq>&VM+*1kSrTw*fRh@hAh-{%%3PN4ku?VWTMz(bJ zOoX~RwMI4DnFw`tN{?4|Cc>~U3mG?;>!vdi9+erSGK*(a4@tuD(~a;)ZL#~jp65o+MEJ1r7iWEK0-lM6rtq27ILwGPE$Yk zIq~e&k3)_PNEuB}rXM3K{7i%z%)Ts6K1}}mAc!8zUo27OA8-u=FgfHd61(J5u=?c$ z(7PZ50jLBQ{H1jC+}UFu-LLe%(*N@8vBitzkvM9Na`&ByFz5QqA9;L#qvoQs_$8Tm z=#M1mhBFb~-1}=!tdy#p&*E=5Ro+c!BK%LP^2m^_Fx9FQs$TK8sBmGt?0-^~cP{t- z^HsUXtja%;GZB92QRT|YV&h2Kn)jcH(0su6_Bs22b2oxB5nj6PkB5J8yK^IFBFx== zw>OR(b#7-%+Eg1GPa!)p}P{rgfRD-eF#X`??&z77)T&d?xnV@ zyCe6QI_75|Xd$Kf%jsU}@Bx{>c^?GQ@r_EaAfz&aVEmAJnFbg%ByyZ z($W%r_@i21qW{)>QJ6ctnjlU)-*6ueVBi%ZRCXr9;~uUyor%y#W@Bh`zueWPwx(}7 z6Jee@17d@11)qe?pNu<2-FY`4@_0YO9^k_+C2^7Hx)O8O=lvQu4B`g2=>eh)qmuh zqFpSUwO|iGz^+CgmH|iS;P!HRCc-QnN2hfd*aEyw!Sn@(x=qBqma1os?&^FOMwj^zR| zfw3YSCael@=}x3d0w{u9hafBS(@Za=ITPVdtfM)XC8CcDDq%>+!FC0!A|wLrQXA_c zj5cckav6|8%lHt8&SWVk0P+l4#)lwfQNt7RPw3ywKW@SOkrkYQ4IO6T-__g?`@$q% zD9P^H)l5pCaYFPAN`HfQCrRtRL$YEOf>mzRoiKzBY-o%g0^+xjedl22q;^Y6>3j?khm z-)U5+^)%|oq|GIEXUL4VdLOiQ%j=7;te-lu<-@fkA^TiGvVd5M1-*3Py(lL{XWL>D zp%J+b5%``RjUd~3EWHdo)eq7jsrMyKd$Mt#TW~!Mm1oK9OA;pWQW+-T5z5%0W&ADX zp4DYY&%CRv5fPp_Pp)hV?F)NOaUd-rzK<-4XUaX$AQB<1{Zr%@_2 z$VFy2cE+HDF-RW*(XHA~Dn~lS29&T5p)+njY<2P>5IvDoia>R5uqI^~Gyy1FnTOr4 zNg(BR;P8S>%Ze~yaA~G-9hdGzVgaip^#dP7zb_&rUKvhIkf32u&kKQ*l(~wbt!f9o zkRu4rM#&|R%I&tZX5^w+H%SvBdX{Zy(9(SnzMXHed;rmAAT)J^h^|*IxhR-{-EdS& z9&|&S$w1Bu(mQe1j1R)MUB?yO3E2z;?SK%`Ge0yS%&UfcJa$C1h@3OOIs4N>sJ6q%J zT#9Q)T6#pRctXh~qpFZpIp42LSp6r>-0*P=GML*+{>%05(@&qJ4oo<5?)1}7KYrHi zlTV%Bdiv=tb$Vr&nhw&hdw)X7#m1@Nxny%2`L1S_v8m?hVMVWAk3Us@F-}Dt);f3b z^pJSM>G^_WIoW9V!qd)(K!O1O!!Gjtb z^m!5L+X%yEpT2nd{F7T-Wl4jKDL7YKpH;!B zk+*QcnW%a?FycM#rJf?Yu*DtO%?%68t8hVj%>s7v@u!MOn?+Q-A&gGp^Q-2J_Mu(69f14G9g56&~bbSVyMv1vmk@X=R+X+ z34uOmsY3{bIvP%gNRETz=ZBJ?q5pZu$Ej zf4V(gZil_WQoYz>_aDv~ao^;?&y9M5*;*}LhYxwQ<02O4y_81*n;|w0A(dM!E0R9` zxau?dw~Yy$q{;-ya>|4ESSnNqfl}rKpnC=>g0VrF)ZIt2C_&1)5q~)I)8~AU7Z3J7 z_v0^q#!B;#FHe~E=1Q164#lZbbX z0j@JaH~1hNdMQhWG?s-Zjq5~SgC*dDAo@`OFD-AFiV<3`4?-MoxXuC%t=9*Ebde#i z>uR-NUWoC)btY)A;B!6*LoY>k270ra6hocqdn<+LM#WGEHhc+LVNT|n38vT?-76!^ zpJ|;_SFd9s1b2ZV5GZ92NRpl--4N2KKf(y#SUlz7Z6_c3JiM441Rnpcjd>!{zl*il z!hEoMvaz9Zv`wfG0mZ2n0El4*pVIu?Oujy#?pgI2lJ_P=Z0YGQ{(H%nK7D+|_GW2D zf+S=8E3X$my!D?(6{hebjEP<3CU#msf;a(xu+8{Fi9;TkyVZhuG_-WaEX5KL;e7;I z33YCR|45uL&xPo$ruk469g&-KBp(7c&>#acbQ(Scq}OCXhCaiGfMX6RkV*UIq0c}F z-gF}wibal|4@Mw55K0pQe3I>I@swUt!?JODNe$}4@vx)LSgeMp=zKsK*2_$fA2sUO zaV>duFAtkKc51$**4&R(_q$5EiZXTNkmHV!1T{Xa2VdpbtAtR)qC3eb)IjnwAV(iJ zte>bGNTEC2M2%e69bTeF*2}Kq{7lCU6X|>+jcnY{sGI2^2kCr7jqG}#5d@!qr|U`l zkE@8#jq@SbWXKKI_v8rZ#c_H(w?IXnK@s^7ke=w=*`&B4BBw0L#UuqG0L(K4lSUCq zA)SFHbXBb>?s#BX+@XBI2jS2omBD6Mr3}j+drukSx}FgT9HCQ|g@g+_fs+4wGa(qdl@k z8DPe6s*yx%IKBP--^}^)MFnx?Q~eeXy?IO^AC~#+D89BsulrXWo)g0t9NBu^`)k|( z@b#rH-_&#yc@{sr?8z_ge{hD*u`uDfIR`!dab8?BK7>7Qe|U$dZfO(`y>-r3Pm0QUrrh%yPVrgTQPkhvxORE*!Qh`r^88QQ6d5WHYmfnZ`O3npxsNmg|J4Peqp^D~x?Nyc2Qlx7sN(#aDpC1Nva zGf7#et*Wm?S#ju@jO=>NX9^=*XK3Aeqjs5eD0C(x8^)R>DW3kTPX)4gpQJ! zQCvy{X3}P9424>)!0wICZXsQ>`W0J!Fmdk{Gq8{^3n7jBw9u4+Xed_dy>w>=LJPhi z%8Gs<=^$kWF9^0b*2O^RntAB)oq%reK_FchZwgn%mJPUt6+2SAY*?knYL=;TgQX!^ z(Pc24SK{#=I;I)DS}DyK(0HLEC1wlm#J0+0yIEPV_Bp2m_kRbAp!VtvYlva)A1guEp zq>XVROHhMzI;I$RMH$`k0giyk!NedAB$kHAU=#Wf#89E%&Vmdko)3ZOY;rG_Ss+r0 z8y!AWXnKl?$}V37+O*Lu0&VV&MWDJ?n^FG_xCRu8pZ(f)tL6xIsfyP>YK{=rF6hsQ z^^!rFCDfF#QsRn8J;Qm!-Q~ScDQO^&UXrtgvwqy?v5EWGWw{b5=8xnN@R0Srl9>9e z4Q%6um-qd{VY?q(C(ig)ueW;NVOyN9&cv|ikfYzX}|f6^ZTkVBx8zZ@j`&%#4F}D(|b0zH3D&% zL02=q#}Irvyd2}mGnk@21f=tRrxIkaM12UpzOoE5l{n}nM5tl85kcVX3nLI62qo5Q zW3-B|7EkG=-KygCk|dkmUP>L20@+rQNx=L$Pc=;LbxuLFtvTt4?eQOj$-tr6X+rLhXzV*!(Kz>^Nga_|>LMf12o)~&|Sb?1X@z5*er`3b<>D#BoNqGfgUodyp zc{AqC1Mt9hAomWwx~Kd&xQM*!BVf71P}=aJ@Md7k9X!^dW{@eV>4lO(?;%dKY?7|8H>OZHGWTGNv$iaR)QM@K zRrZBP*(F5qnXC7EWk6C1*aNg!{*l&6eSnq=WI|T0o?ny8eJH7M?q-#wD;v-AZL2n; z7ra{|Z7LE({_!wSqrV;PDg*D7$;WY}XiBq>Y#Fv-N$cFP3zig=Uo5XJdBv?sou%l{%hal`Q>ZBNAanf60mhLe{dt21B;fZe^xk0elK#d;L$yS4zlTw%4bkwF z^af?e>c3L6fa~#rzIuN!lW5s3S#!=S(XU)MkHeX*GV{m(m6@5VdH^Hk2tEX)*PIl@V8oLU8AdaG2zY)$7GyBueF#WTlN+&;U=xrw zlaxvIqTzxwulP?!AX_!Bqt+O!WMOMyUiDlkSpg9!?8eVxtGYwiwTu&KkLx5j-A&gG zxrOaRKziGZzS5OU>JpGw>v!bz;+Si)#pVXj!KAnh;} zapDeLk4};WIfLqpd+u3FOT<-IH?cz(e(w=Z4z_2rh1x!}8!j5Kt8 z?rF=9es<531K%4!M;Rl>7m$oPUdb#+C=UitWnBfgsuo_Y6|tk^1(K< zf_R)5DnZl66b_+XT|B;EnoTkW%q0=DyTCF80nlbCV2JMG#Doai-I@}DaG-0lWQe#!Yp}hRwj5La1Ti)Xw%xw$~g{!(9>oIF$ES&q9%qXBbYrQ zi4YYwv6AUlV-sgYtWmfi-mubUrO_j!czi*K&VZspf_As3gdiN~NKK0(5{01M?I|G$ zJr0P+7lh~p;kzMdcY8_*!hsG+<3l7mLA%>iI7Dfj(64Yh;l$h!G#COt2&7M&6U2bT zlL#7GuMYy3K4pT2*6V{n`kl5?#m5qhaeo4JD%Rgx5QGJ?uD88bHkEVH%=@kXBlbp9|=wDvLVM3Nhj z)7hVzlLDS!z-?(fzku7`EX_!eWUO<}FG%4>u=5MZ#!l-;5GUXdwi&xMg>S{qFQDP; zw7wO2G~hoXCvD7gA^MCUlC3@h)+p#Ud|_M)??oU`$}V(0BWWlCrUU-r{vJC_k}EwK;ht~2 zz3Rjto)Rc<|DX3{1oBzT$q2%a!Jf#R)?FB#jL8obl@rk%I#!N-Cb zS~!TvbTR@*z>^X7`09fnUOm;O7zT;EC;Q)PIK{oC3Jun5E-#+hv0A8;5q22x%v*PCprbJj6~8mw!-RQX+q#W zFB3u;!7#&<5jZE3u4UXKLk$7l9)qCEOP-978JSK-;0TDU<>qq*Wio>_lQGQDPECa1 z1>-f$f-WBwEPGQg{j#hK^Dg*}7RLpNt@EVhMLtmN0gNCnJ2<+WT5cJk}sYPXN{-LAxg-gdh-FOB3-kFyo?ETQ=YpqK}pc!ONx#`?CUA8j=-V z)9$c35coH{>?8E3bV#vMnlT{bs-%_@0lT6Gx+f!qSkW~QPfTb_nr%atLj9SU@x+r6 z5+OQ@-PWJk8B$%Ae`eB1-!PVLg^Ju!S=y5ks<-;?7ki(}pd&BZlM&oUw&so>J?3BX zWCYxa_%`xW*v){H zLxAa7b;>XxMpVO`s_ zyfoGHek30i0rL{ZrutXK>z`C7BkV3=eM*UrQAnwmZ#`qzC+D*1@rX<$kAO#3 zUt?5rGJ<)I)G}Ap9&|Fo@Nb{B^}5?ECwMYK_GJ;y$p|TyMX-|*XlTkTiwMd{jl>arI$THg{2Cz$q1C&=41qcDJ5Nrlky5A0>fQYj6fA02wBF$-IEbQE4;KfGkmBS zBbgCknu%AeQFJnbM*1#8km@3qUIw0W&s8{FNk$O5G56e)5kj13H&mXCpk*A?8bp}# z5oGSc7$=>K5DOu-YAoFcE9olx02-D*NQkz14X^inla)*a!h13TwF7f9f{47DiePK= z`8B!RNAle`ceBdS6HZ3(&e5{YAY^2gXSSoLGVm^$d>mK**(W22nL(29@SGO(Qqeo_ zmCmdX2WsQp|CO0ps(g1IWFD`PCQDOh=1(im%>T5L5lTrDv8Xt@ws!vPzcxdI)(V?x z*JY^MTdsU>-^mEu$!Aid%kP#=9dh#G*=M$Lt^y#1oEN(4=b22M)GqtfI3LNuJS;6v+87sH0L4& zrwa9Eep{zHyKvlsV zEMdY0XHfm;BG6t0V`!=RU~E8%Cfy)16t)kcWKzt64E~o70qME=^gNq2shArKp@hwq(aYormAF~8R4D?M zc(nlVj&}D{y<9Hst{~zB{IA;SRH)Pl=33GbCs@ z1%Au^VhtJmVdF2(`q~4F#D^~p6n$nKNSyp^`N|_3zqm-;_KPzvJD}H=L@$dfA1WC) zm)8OL+95~&VDb({%cQ0u#80-K z{N+7&{dC~GUM@h;^<^Py777@0>X!i;G>H#F(zTmDb6^H&P$fQy(t=JvgD&wwNV?9} zKxE(=l!FhV-@;Bn!*H+<0_kFCdalj#b{~Y84_v2!rY2^Vw-dzS3EWXrf+TbJM|2>h z?5VXPF{_qxC=F+2KD2`aj|ec)#49#2v%FnG>!!pZWOaz8m%}G$FavxLL_a12*TxP& z?l=TW!|7$%Ca$6NQigB{QwG7v3|vF&#bV?TVxG|aae5i1mAwiz1X`~T0_ioQGjMG- zrx@-yM2Cl73D;(okPiasYcgnxC4JI<%$r$qP?gPSEy#@Zo>0 z{r4-Q0!%aMN-{##kbcCko^D+?>gFT_lyO~=nb>40ru8F;6X*wUz#?~Cf-J~MwJ;t{ zd%QWt6k~U|iJ<7Z!%Ni2py;~TNz};Xe#W|)(l(BzV{MJQV$(B<$b%q}^~)(;M9nif zpRow&gJnSmMdU+3dI~R&)UxY(as+`MRpqWHS40HCoibiVToK`Oq5~m~B9cXJ2Abeq zl!mi{?obB*Fke9ESU-@QxGd0h8rlazbnbxxL$SY=;b+3EpUHAUlBEECwb;mxp|H0`7*mbvCc&P2z8z1}0 z0x^Bn@~8ga8+LrX=ig6w<(+F5i0^K_N37q+ z_*vG1f?*~((IBOP0fOmuuwOPNUx<#+y;rOu%{~OA>+8Mg<{Na~gL4riZ?Oo{bu6?R6YWu3`CN2XKq(8x7-qVb#jxVgxmoJ+;e@RD35FR$Cqi&3nRJ*)CMm&? zldR~rG@KdJ(n5}L*_;3Wdwvrl!5g=2&C&8xLbz#rUGaO$z3dj^fO}VWmu=mT>wJ^ zU6n*fikA(h!76#C%H5aFOUpF@v$Q^-Q}YNZ4>5~WOp;8HT_Fr`dVlG_QpL3nkT z3+?YkPRBH(SCSG>g0Fn;u-p2xy1Xv42h9T2kZ85JdMzY zN98{yvt+a z220e3fb_&(+a^VI4-Csm*uRVmY@E0|YDWT|vi=@lNz?D+JI$~VdpFoC(Su#_m{?71u}2<-QGB^eUbR(f+rpudxG705MhoHs1Q>t5bgQNa}iG5 zW_Nua!m!ncsq+y?#{GW%%4z*BofxnLy+Pt6wF1$W{k6SCS1AzUq`U%&ND_74)^uF4 z;;H&G9>Azej^6t9_2*3pFr0WrwO|y^BJj6+T2-b?K`I=54bdw`h7(3(5D-}-rBG#* zd!TSCR)*2sikEdHMv|OpxAUQ~0U~P|rRw8!eD1xfK%#)+hBwVOB}gdE8$B12(&5l+pH3|2(Whk*2Bf)H2bZ;@xP3J94YkSvT|4jYk; z8-n@C5G1k&3D~ObGRRbyz$y@xB2b-y6n*F8WVZ^46FVcL#h7MBkP|13tkAaWu5}>9 zsK7>wyF(%Iig8#tWrHzRga#8v8qNyRQ`&a`4QgS{9HEm)gg|L%Je*twlviI<7A3F( zdI4GC%6{1_V3E_Eblre0OHd35k>du7`&#IfP)L#1J|HTd=LTJG1grQi5`1viya0vsFP2Ez{*_>871|U z=X?Y6JT`TQNUWH-_l2!l4><5_2ddmPSDmEJ@Iqc6+&Z*1a>9ZB{_SI}*-tnq6!e!o zhs-n?R2?|E5ee7~H>2C_o)Zoda6-T&Wu41PD2l#aAUGv4OwgcB&{~bWXV%2La%d2F zza$9EK=Kzmua09`q;&K!oRZ&X-X?EtTy6AFNRc~56{5%T5+bU61JA@o z7#oBl#oVGe*w8Tw*Y9HzaPU2OMNaCl5%H~!*yuXBwNYx2j9VMAZM7rUnP&%}l9F0Y zG9Ybkmp`m!tU%5ZubA7=<53^MIH5j;(aXUjvfJVD?VE_4vM<$j)$Q*%LbWjrIK2{{ zp}X@TAf1~WWspfPnXQf3bQ2-4$Uj-VG((Ew(@SdU#K@K*GiInSL8#Rb)MCNqUT7>} z^(6c^aG?kXE4jB?NyjFHb@9rXATiT;Jg${a5cEpY4c6v5JvVvSLNRsi$7lU$7c7=s zZt372hdi@xfq3fjzwUO%efw98OfuHrxcF~Vuae6fft7&?2q6pYpp5 z%RFwI<~967e2XwOGW4C&gVgoBpbS4x#2?~ z%b-4R%fTO_76G;eSvg4vSmMcf{C|6u7r&$*jxX;Ukux~2p@5DUX z8d(?Rt21RV^&@JDpqDb#f3q&C-Lo!AByoVxi4)Lc8FYeK)=>1UiwZEM#4F~u87RPV zXWGf956i(Lvhk^mm(F!EB4_DeT%U>~`1+kncn0gmhk*1%x5Xw!CGPrEi3rq=1Yl9v zLaVzp{l5FA30Yiq*3=1A@p?&;lh;M*@5Ef%ntEMS|KjRla$Qt$Sz(>CE~?+^ZI{S( zQ9&%JkkH#a$VFdPYgX^5=Omu@YOwK#TFP&ykfc2Adb%U(E2C6%j$tsI((8hN`C6n8bvko%1H78)|5hsTQnlt=q!!;v} zj?ZJR)MCMOBZOiQ6FEe}nt)e)#KKuxENI>m%ECC2^vvsDK$ChAaFxmt39_TC@`~jG zrW>tN;RuM#)|iBVBDaVPnv{?k0?ESY5x5WmkwG*15F}l{lXCrw(Tw_4Q7Hsf8c4E> z7Qh%y>asF2&|&uAZ11>vBGzL(b z9s=aUFiLB#U2Ne`u8Qx9BsqFokX$@#TW(%=)*sIoU+ih&y1u5Itj^YJ zxEqGMAmgy5Q?H?S5&Vhu4sCPc#1>9BB^7tc-fMv8z-43MlubbAc7rabbECb6Lr;0e zhen3)H6n5Z;nYk=d}!o^UW4a6x03OB7vx?u)b=@%zSX5y-pf!8fnLVff1wC;as+7Vn=Ajwr*Wx^;X~gV(&lC5l|h*1~yXM zT}P3fu0Wj=#x|!bB;a6d-_?5S_{f6{G`4vcZW<`v4t$9*?$t4>eV(YPzdygdx|-oBE;NaH*eh3 zMMB5n2#8#JS`dQ~PeNp4Kp13>fUP8QQ%M0qI%jIYzkiKR?5aO!*E#`(9F)-!A5lW`oa(WqTDseORS}6jSc(nlV zj&}EW1^NPz5B(7?gh(IaycyXv(2|)X4bnR~)z|JTjhk zc_WQ=(BU6{yyxR7FC1$*!LL><>GSGsFK$_R-6I(XJBNRCSmbzFQO3w(sdguRX-q<1 zg<{JZ1xA4TEjq5*Pz7*$2&uAL6hS5{lm4-MDXf=Nhf*r7*Ln#CRL8c?R9ZjbhNKd0ev0at#P;iXK9|F?TWH0gzTE>Tfxse7rwj|wxTfqv>yi#F@g3Cs$ zlbQ@ADqNl-9SVEy#&$xOZBW$JX2OAUg7hqEABx(Cfb->9kd5ttGx03<5IKd~rzT}4 z{|qum2+Z^(r#l(z21vz0hl15J5dlk_I+UWPLkZmU{2}6`Nym|sz8O1|c29>Q{Asf% zSodhv6z@=Q)l~Kl#aT6#zC*!PQ@le-C8Oz399FpgK^4I1EXR_ASYe<;`Kf$?cPP2_ zxr#aztfLY2z5t|;(91A~B@J2zr|2RG202Y8ATnqfMCJ%63#XT1nRG$<4h4}TvXq04 zd*&A0y)sI;;LIDk;FK3kKDe?5`m3jy5qYPcMcC@L!dsIbnN$%J9wOvs2TCCSA7&L! zFL%;`=fH$deGT?!)9F=Y288A6%xiV;{i2)a8@K;H_6xM1(;~!m81l{q?3hJI?g!4Aj} zqe(mvC`~44Pz^o^N!NMXBgrwhC17h5=mt?K1l1f!l4_WR)_0lO4JZd>WgwGgni-kp zbe3{BXr%=0fDp|LI{c2lM=9}&5m-1&yD>ZJg^`A{g7g%A7fES8lY~nG5+P6;?5{D5 z(wb|QvNWgPBP-m#TQ*B*a873_hl5s1&<+Su&D_iIJNlla67Hjja~`kuLgnOJAwF{Y-Afgo;z&A}i~P<-d_TF@1*D)#5Id(U)&FY{*Q@3i{}uemZ|g z^E+%di*pzXQ-;^M9!pJ9tPkN<%P_aX{mqL*(Oq-%$ zN-bL`6fxIkbI2L&4$*bIGCwNkG;+Z~NRe?axD`~>(_|cSLLaQ=wE)k2=C#Jl@-4wFeIeE|` z$Vx5Cry65cbGn(9n8)5R$H!WQM$vSWZJkDt7ZZub@(hZY=gX z=-ZK%edYuqhI2V#KF-PMP9!&ArG(aw5U*6~TVbz1g(^y9ni(fB|%_Wq6NdG!xYl=?f8y!#dIXGI+r`KDt-a0TG-Q5{+sjK$1R*Y zTkn7z);f3b^pG0We=Z-qFb_zb95<^Q2+M21BowZiE1!rE5pKMk&O|?9o#h|&SnXIhf zd(8$~z}2#0=x|BX@Q@QIY~o}{;2=&y4jJ8v!~%#6h3!K?dTyATA_H@Rhzy18LukXo z&VURyjSqq7$5zZUl{h#UgpgFlv4pFI85NCuXAG91julQ0l?f0hO&5Ic3%MVhVRA_v zmmmvrvaYyh#9c3_g|IkCiiu@k5c`cAb7PjBc8U1Q-FrTK>N}Q`RcBmwK(D@+h?|f5 zL(7Uk9h1Nz@)2rZVE@!yB6=J$`43mE8KD=Bn}A&o69G5Lm>w z9=7bh(+A!iKN?_#qdO~Qol{?P>k=SP%60hFx^^7VMC`Qn)v^MLhZ->g`mV@IwJ^ss zwc}T)@Qt*M*k(A>RMi1O>MOBW@6w$}EI?(+R273Dwae%X%?T1TcvC(Iq?eil=k;;{ zf(CEO2Z0@23TRvGpiKzkkOc0q*mJ^VoajJK*<0&&hR3~|Zn?x*LHj4spl}(BhAgYf z&N;ctZ|C%oFG~wtnb3L9z8}iCq#8r13gC#sE`upEP8(bW4MChV1`Z_E8b)^_v4G4M zjqI8^C5C{={J1j)<^&O$nK>-?RxcIs7Na{*EP%+MJbVa5XG(>Eg@dZC=-dF^K?vbE zaraol)%ZD8^EEu%HKo;%#7WbarhH}n@&CqLs=V7U%d^{Y{}1w=w%eeImgc#iUw_Af zkCzJG2YzohrDRsikkqRi*7D2^SN>N!I zo-lwF1}2xMS5>5#^yb!W6a-dN@V}6&;P3$P^;OaC1J!mvfw zcPWbm6cbi2Zbf5tz$^R!h>Mdjx4#fO^Y~TimY<4iup1{6gI88p&G>$ zAM+4NAr1>LrNk@NRj`?S2-Lx3Kz2I-AJxd zgA(o|q60aNP2mEWki}CL(^%O8!$W!|QfU9ki22%F`jmV^wHdV12KMK)?&ubGP9tv= z-kj!Sqj2UlC*9)9Y2AJ@Y;K)-uB`jiuJ2^9sch2Z&GfjJ|sVqh9Xcp`f!9ZJPJjU z&HSlSBUXcKE9oR5O;lCQ`@!cwE}E2Nc#y%Rp1^l^?;0AVkh^Be%qfnsQf5NaJ8G zy{0rEB61~^N*^@yYFqe;vRLXjbXa9->+Xet>2{+ z6{nT`$#OT2So;zC9y3qQ-n~0*>^bKQy@i_ioMU!>X}nacA1-b9{7Y{p6`M^}Wj8?Q ze|pCgi`MkML~Q=XjpHW%d9%Pqio5G5KKaCH4J%$>Uqrpy!1U@37j1D_s&5CxCByXU zQLQ8bDJqFR_??h zQ)K1f5t%70hR_-H%?6D;$h^a-glBiqh$G;*1E-fkrV@7tjS`2fdHcd7hz^7_9X3KZ zSBs|<%Hpbcg(At^$I}|b_3_Z!5)ZCgy36laO>$CI0c&jyAOH79_x*Tn`(t}QzG8*^ zViQJ9ZEa!AE1>DvHu4LL2mIA)5HvMsy}oAJf`8kEVwj@uN~M@ugP`3!ao{zBq^I6~ z)w?}Mg+2A`Uux34Qu|Cc2lUy{@=HzT3r+3##U_-wlV55gPLj(VI9XnFH)`7+yzzEO|GwKIYGL2i$39UY9+w7%{?8?;@c0_ zGQ{X*r0eU$%)pP!HKfVhGd^Bf2&q=nLaXdEKAuiYLX<}AKko5Ik|r7Xmzt1Os|Qn$ zEFpw*wRq>(pxsrkUK0e6n3$xzyls;(J9!`t}^g> z4_EzUJf+!3whUXaq;>At1xxa3lZ3ps=;?yv7c3mzx@h6J#nTrpHk%;~>4^C=TIy@7 zWn@K|zGyncsUOs!Oi)8pkqU)D4Jz8u1&bFin5WR-)g2rfrVye^Onm>-Hf}hj9VL0} z^x1PQG{W?WJb^^}x^xT1UZAwMmoMmjBH?UM5)x4Z=eLt2lQYM*&JSgkL{fx&vzrGH zDMX`qj1!q(5SP&@zQc@;s!I;|GqDPK=2)_r%hj5NfZmFxW62+^VATRCaOLXfO!nN3 zZE;|T__>NJVj)FEtlLx(O|#+^F|Ri;ndZ20Rm7#H;`lTkR;2E!h|g495$mub7L@)r zjT{sWWv3C zqmyd1B#hNaJ+8P!NQvZMU7#=CA71}3%w8y+DHw$X?R%<6es)v+3w7PHc>Y)GUn$8) z!Fq!oF@{<7N>TsR9@*oi<*B9_)FSNgM_#s;B(MmFFKV5C@~o*N=5HfOskX?f7ml31 z5Z=-DAciKl6b27!Y|vJfvxoMe`Ucf9KdJA@Ops}*96;$I-3pKYKUK&V<=+gUFZhE8 z-g7!WkGo1mptu-N&<}kGNG}~P;y_|)hzv6;J_J1HB@1#r@N9B}BOr2`+=vy#R(CaQ zHIWq@yaENMsx!G)sy6MVo?=G8x&%CXhqH^v{ct+q$NrLE4~2&ax$z=4IuS`A7LOa& z6WDVCh~A)#P}t3F_m zp|l7PQy^1`!>BYhswCd9#7Tpt(w3q6MI0Mz?hOewC(LPcK&$WekTbQkp+eyipm1AjB-ksq9#z@cSW$p`~K?iXT8Nf0O` z9a~t$T?7_f-j&8w%!(2cSjjsF0fv;@5B9luW$%s!29k9RPP%TuN?C9qf=Z>#F)2`b zlT0v{J$I9LLL_C~n%>3rEh`p?iF;r9rDdxvD@UmZS1%C%@8EyEz0WC@?!d$a2)e#3 zM9o6@K;RNg|HHSQ>E+s>BB&Psh;%-I<_4m-rwgU31np6|S*tG9qye z%E1SL#|UMDhB+=D1k%@>n4W91VbuqLM>eH^rY2?%`$C9mN!(FWVp0$tGCt)9yjCRU zH07K*3oF9Pe5g^gr?8|U#n@jgc5^tGgw~akLtstg^jJ(oBxo=Ld=NyREXtud&j{Ms z0j4R<<`5_ir#oP7fS{rEQigB{QwD95g!_J(5J5xh#bV?Tco-h1mqDhkrqHZo`5=(K zW}+yE<~$>=q4oM8@ZiBL(B`l&9|Y2CGH`7U@A5*JLmpE=lVYd?6Fz4k+LBCfQUEOP zi4NJGMKPGeyU=~&tROvwrER5z){8DsA_Pj)!$`>-6s%flq{MfeE2blDELlS*mGSV@ z;Dk9kK>2rSoPq35@bAttzE8-Hb1b$H-Qgi7pz=*7BAs&=A<26}anRaFXqJ5`%}>n< z9sa!c9VdVOw1Jirw7uJQ+w$V`dseQhjo=9 zAaY^@C0yGIpwsXnOfo5EL54oVhk*2)t&<_{VsA+=nZuv4=_W#8k>>>9vWA6;b+KOh zoNR&NAwx)J{fw>TjhZ1E*)r;k#p-lH+F~ceyUOtKqedM&b>xuaj+mNn88`j(S$g7M zP9w?3YIokK;lq!WPioEmSiB#p-W%7VXKr_r@u;chHwHfu6k~U|iJ<7Z!%Ni2rVsS^ znLZCs=D+t38#O2{9|GFODSbrEvr$AIFH<6G-ctH;8rdi!4+8pNS&%^y`4Etv!i%Gh z-gP}Wf-u%Rr+bSJT9z4T(yxDpRvOq)2?GFDiPp+pHjr)P=!ilpEbFI!JFGMH&Lp&vZBk&K+z!Ca^UFjd1fuoJw zKb$N(t~fiaN|rv%04f7a8du6gtdT@(I30i4+f6t8bAkBY{;m|O*gf_y4St)u6uuN5nsCUx?`W)|KM~3?7G`6Jk)mVjgS3gfjHy# zv1jiS8ei}E_Y+=u=b8oLp(B6sjiY8Iafp1#>z>9}t@9zAcIfq04bnI{Xa8GU_Wo?; z$dr5K4W|$*aBEjD?=aw*x8x*3@yw3Z;`!I!q}WsYQnBBa^5f#nFwU2>uk&pHXNGN8wFzibS)5M9SB_k+mIJ_Mxeecd;v zn{UvydT?0;Y4W8-R^<{l%+P8~v`2ZtV7^2QvjCqYUWt{wu4OT-IP^^BCm3c3oe06D zWYVEXDXSl3c%6P*vZAGWj?I)v3ptjKNyc1lS%M--VPxxSQ@5TJ2cR=)Ga1EgQir%|2(@LYIlhudQF*WZMGq8~NK_Fd2r0@?Y z1KA8?B1Cs)AZQcmVChPKogH1)QVy9Hp?fn9A5aF?`yi06wa1GY=9>zj9VB#xup-VYl^Xb)ZciG)po=zM(Elq^B7Dw^9~5-k*M9 z$DYOmPK4+vw)O3|Vr5_d+~N4qWBzqO;{*}S+B6hfN7UTm2_D~2jn8i(|3|irn7@m> z`iA63%+~|>!-uO;_=5^^GaDbF50A<#Z&PKEHhy9Hv7eb>Nj--lq4Xb{%SdU}fODyV znmwE#J+TB0L+XMuf*SWB_$Hk~K#^NS2Aj}_fbaF4 zBo6R7aRPcQgHFKDyqH5@7$+Hq7>(XD<<2#yPamQ{aaSxy(0e`vq-W`0jALthE{@>q zcj9jZViQT}`hwx4kt8QtrbEXIMAl)c`Zyh*d#|!w%&5E% z0_gx@lk`HG2P*pjI$t}Yb?N&l)GD4L3`kM6YR-BQNi39qZq@4fHS(O7GHO-Xc(fVO zJ?mwf8Ec8GMU8Upa+CPHsCM>_ms}~=6!*3oj2X%RRc7SK7PGTg&XKAWwEtyWd#6hA zRTiN5dTa0c%C`23Rv}-Me|-OznQx2GA$II9YA>_e#)n|&k-89z2}DGOUMuH8Kv}XN zLoeh*Kzf?oh!w}SCN+37jTM}FWqr=GwRdOr6f*+GUIO#U`T^5~dPsk5b77#C(2X%Vq(KobIIS25eb^VnB#Q=NP5T zL6U^Ztd>ktf+iVlq~WX}Jw;h6?FShMs>BBooC4Bhf(BjUgFreTo1u)0xgoAWnfM?A zW5=X`w#5!38raDvLSV7exHdcNlMXk4jEoVAlZX}kc5Q3c(+%3=_X14}c#_^QW_Tgr zz3^e)O|LW(v(k`r{4SJ;xgaUa9y4lCsWW zC1T+Dj988r3KKMF6SP)ip!Kxq$w?-bg|^iMv;*3Ii4a(0QBhIYVyn9}ipqV{geMkO`Xwq7nzt}Fpg)Q1+1I$*=%J7zcZw=RkL4vqRQV=(k^355gi3ocZ0HEd_4}9r zpCn$9lR9ifd|x9rx=!wET-cg*Un91yc9bRa)BsdcQmaV@Bvu~U*XTK^WvoEX60exs z(Bn}b!8oBlh0)8wBeL7!l^6mdr|e60U3L3Aj!2}rNaFR1Nh-7QZr8~CGD;no1M0W&=36PA94nhhU zT~L(WP}5AvdR`S5$I_I_keq`aVanG-2rmxE}CWCX2*tsq5RHH#9kcX8`(DMek4 zGAAiE&y?YDvZsMpz9>qyd|ddX?s3a9UzDJ6(Ef}48UrkSA zm|-0NkA1X<6QpP9KfnR^A#|qC1B=;*fb>KMEtHp-8^&Npn{v9F-((pudI*T$Qi+3Y zAu9DhvBc4)?C28bQEN7^MWp4I@npO%@f|fM&1l7TrR%7X2fG&h$!lwQ~d6}uD6|8AcJj*|!f9c1{ znf(h`!@qsj*6SW^jVy}t)fr0Mb3-i=^iqcUZx%(hdlp3rPr?y0aRPcQgHAAO8j7Ap zQ9&e0AA#vTk9O*eMm0W_Poo-omj1={sW^hK-|^*yqGN7=_2NT7dZOE6lcExLeX2wR zYDWUFC~TqCU7CL1eba<2uCj|-J$k81#!g%mb>|f$r+nek*3^rl`WIIZlZ&E?%L?n9 zMN$1$Z@VPb=SHy*3zKgD%U(+!X^kw3+Go`x`_3356-(z9MWs+6dew(r6xGfbMP>g0 zR?j_O{b+sB(`+L}-BG-L!V~?!Ef+=Mhp)_su*l5r5rs>F@)mMCg%h;smTw@ByqC1Vq*^az(_^LSa%1Z@_JG?&)|bCkMfB z(r-$I&lf*w8Ar~F&?C%og3LXbPpb7nARXS!GMOV&9 z>JMNkwK~(IR+YJ@T+Y~Yvii#heEqvRD{I93=_fCqeP*j!sw5pxy)&n-F6@Se-Baa) zs-;)d$$<;n#nTSD4uMO#A!i-1#e%7aoD7&IR0hyrTPN1Pfa!(^n=@oe0&lQ`#Ve6Y^$AboOrWYDC9%n(QxMlZ)W@(iY% z4?)s3NXqpuMlnx-t-s~lH#MW;wT9XIk&B_peG zO4$|Jqk`nh*-)>cJL`|R69MJuS#wRfgfJ5699A9;qwFXQaY%_@me1J_h!*4=1qyqx%tUau24C#1w*D zD*>GX_7u|L97;VWX zup$IojV_Ke^dQqm5ThXl3D5|zYV-;W!-x;|v?xd*PJxspc9>29$0bahU`2>?nP*aF21sTS3QT}Vh%`?S41pZ9Dp(;20eqAXlUhJZfCMNPL?H?k zr9}c;vV2@2sZt-M2vQAHG=tRIe$^IR1--2hZ2MV@2v}{e8q8gL?em&EM$@l<^yZJ5 zIcwJJz1D9%_S$RjeDc=7Pnsh8&N5iLO!4tE%4mMRrXK_g6hD7o2})|YGK0sxK0Zzf z@rs;5Jou*|&sU=2GsLHQY~ zUAbb})FlEYw-6CQ#gDGxg$bZFRK>-Y;?FT}iLc1<6yYh}%XnirmB+H9rd~WYF*jq1 zPQP@hVk1xz8*4lmOg3a>o`x!ftccf@ra`EUr5wnZ@a6oZbaR_WMfiZ1 zP2m?xBdh=_Pbwwbw|HUiAjQl7SsL~g=m+(?-g)`w{PfpzdHJaRL*!$vHNGjV%?4W+ zY9XJ?Wl> zyDBeyigHLYZ+f&2lSSt$-878(K4yFY zf31lNx(0=jzC?_p136;+A8qj+uIAf$);&Y`p7r_U$b9$u==KeS(FAszNH!53T{Xc8 z9lvCCF|QaE#P^5=fAgAtiohX|uC?ExE4=#N@u2^ec?7X#Q##683g^e5nmg|u;I$^s zj!6I9Ye`?!2Ol+zLP8ockAYBF@fw07P3T2QY4`g6&S^0*jc_~*`DS@dW43H^WSry^J3rp#F2H3q3x{mlr>ymqSAE3o}=S;6M+{0G_=U3(e!lFhmgnuWG)bC6`OqdG|KQm$7xRi)WZt}8 z=1o%=$`mAxFsR6++qd+ioN4M}$Vs~sp%*7Tc{T0Z*OD@4jnd!|Y_qZf{+ zV9xG1=;!C2z0_J{S_@Ozsw?@v7ERf&!m(^dRYj~wnM8Q7{c@0{ec+8ja79DxV53?V;vHg>NpU=Y+iOqOSWQ*UW8+6#8 zqmCbDKX>CZ)_;DaXe0s?hJrJ=cD=ixpYrsVfuyJxNDgk)je*Nd4e1@}pBeI7kl3_D z;dCeO_<;Qg6=#(QOj)cHLq!KJzZ;=`FiVH&modMfUamB6Ad0VfgES1(kJLt^cKvMa z4%ph2C&{C!LTXG3vQ{D$Obf2FYbB!NWK<=sbly07V`lWQ**-rS>`+Fs7H1{XuYWz5s7 z=bNy1UITY-#@ahH-<@UC;--Z3ZqlVG>Ppk8rfhw(oGsCzJ(X$hXH=J~o!8tHDegbun}1kE$pAfA6Hh~Mm6z^ceqfzL#{ z=&0D!Sn|kyo#_U_8*o}uTU6sp!A2fFY#>C`_LE8q97A8>k;5T5 zKO&dkbg7!E=!Be*6?YC};rvGS6-EgAEn|pP5Xza7LJn_{yV%G=g%(ZI;oTvZtC7Kl zO-g#}m`2u~!(6cRXY6%&?-1L_T&?)|MkZ-P;8&xR{c!(bwk3h^@$+nrSRmbp(O!*E z8B!w23pZqQBusL_&bzsOC>_c+X+D^~n`Jf4*D~Ph-Dol*oqAA&(35Iv^d4RO*wy^) zIKATwxlA2YKI#aD=PXHjEkk0(S_DRK!1*q2V`13*FuRP35O`@n>+h$*8}89-dGNJj ztQk`>@nP|}Bja9mFR*4dn8@`ZGzV9id&tZ0coxkqT_2-YY1nL1{gAUv%Y%YEbONLb zCuqN)jT6Zi)^B4mxZzPYhALx53Pl{+3m;LM?|~x^vLOT!v`^Cd2^SGKWkAJtob>Z; zj7k@=3vj<~fskbTp&UawUQdUe0tuR4>_5!u1(jcYD9o#sQP3_QLgFVnZlq!pN5Q+h z&_wq%i-0nA<*oHEu)`CmV0vDK@DY|-)N4YbVkyxZPCSB}t2g1;8<;0MU&JMF?HjCE zM(}svz`2MPd>OGq^#{;O>3NwA@RApmZRO#WWhjb|wn1?@fA8s=5@O=~#yGGo2lvi2 z*|kSmjNEbZQJjC*JFJvu-TflYDy40NmUkHK5@^~Za@t-!Pjrr8dmCE@sc)fz-IR$6 zI_^(BKpM}DBh#A#1+f+|0~?|~{to(l<1HTLO%frUq@$e{pm+vYLVf|(K;F2>1Dz+) zO^_6XgK>7f@`jW(y+8W0v!12>X(4S;+1=6_KlnBC^XSS;MW0T&yHV`!fTSpo<7nrv zQ@+Xz4)uep<1CBB6$&&PvIhZwZSPNyC!4j1X2lrT#TQE~!HQ=GXJbTRW2;zbB2 zKZQ1GxhQf=93663%ncY?xNArk`e4^7RQb*_% z_V_|=2#DtyJ;S%p{!YctFvhcAAL>9fbY#!Vn7WV(J>N_Q8p7Qrz?}?TLjJ* zDj1Q|72M`~*;MhBL5s{%N{|qmg#>-E;)PYk3N;C#t{4ZMorh1=%5aF4;pVppD)Nx8 zJWs*ZZ-_Pursv`8gYuQxO1l&|)>YuE7uMD~7FZ92ZdNkkn#D?3OgDix)$scUWvHC0 z;zX`<7EBA5$~kcoY7M~0U&G05g+=;=+9Sr~zPLU}J?MLwzv{MHnNV2F3)bg*(MtrfaH>;<#K5dYsC*}J9-#3K^;5{V8O zAp#5Xl$+RevK*Q)*Z7EU<{Yvyk9r7= z9mI|)e|TjSyOiav{lBlAo(XgJDgn`}Z)NRDmL?)`g9_`8EB}r*Zji~LX7$yPsFv8! z)^kI}>}pc^^zUnPrbegen9SQ?HaI6Kf0p`uacU8*Y0>Dl`l$aO`q6)t+U0#w z9ug>_pU7=C<7Y|-8|`%I$JA0z?55++D$8ZstxGwKgGoD+J@I5o)O;3&8tT;7?A}oq z`3pPhgBaucOAE{mnDSl{r%RRq{@qT8?RV4!OXOSQ^o}pfWami~s&>NqK+2mWUBJh0 zV~#W!c)mWBAo^MSr#h9kQAFutfgB{nkfJvMm zhy9b4G`RRS_9DzuvOn%kcB8qO7(l$^!ae5C%2ktqgOJ#LX zu@;U5uy8AyrqU^)*jv+sf8Q#jrv`VPRWFC8>(r>SZxw{ARSS{U&!(w+qExy5O@)@P ztJLbdw%6*lhwU_JTCrA_`MFE;rve&t)CgdKGJ>RKM5v-_@~3%f494A}hWOBlxk~jN zP~~eY09FZv>Kn>k_P85U@6leczzjBgYe@T{1mNL<=!d<5&EU< zpq9bT8dQof6ekc^3JVP3l|0o)ctiOR%?6yvPvxj%c>KJF>wodX^Lc7e8j378RBX76 zXFnQR&LVuu+IJ~uZ5WaSS0?I07H}2C<-5x@`VG%_KH9np^r>n|tjKuk#zj$wT9VL{ zme{W3kk7tkE7O;zg)Y?rwh+Cma|e3gu3A-Y6Ps!Uf;&{XP2>-$17x|@d_AxxJKHF~ zuxIWDqoe!|xbV+f_KbO@Y7Q7<8_!f8Tq|MZv2C8A2BB9*M2(y$k+I<$ah#3*8u2W1 zPUlPk?^uDgXQ)BZ>FXXikNr>`N?RIncW%LroXlGd z@`*4mg*wrHyYC@%0}FE52Eb?q!X2G<9Q8!-!vL>oC3G$;%PS{r+>?YS9KTHl0%oBm zOu(WmqDT{xI^Tr9uU2ztcCpd@a5Zw%Pxkp$Iu4WN^8ClujL8%=kE+o8d|#vH4$93& z)Wqxs-86SrT#bl*POK=w-aT;EJcDLv{wW&~D^6f-UKl5P;)`i9n{`Zr$$MZu@`PG4 zWNZRgyL~Z&$_`*p;#%xHBRpy&k^B-$;!dg5nL%RTvcx8*DZ7GNQUrxT&`GZz7{jlZ z#EKJ`9Nk1Zq-(w&dt$c7{M;7!%SUQig1G;grpxTrbPO&&fqs0xESu5Ch}Vcs1g0b= zFC6VM0@#6`X$!$LzBh=fEq+J$SVYI z+7?R|<4w=W7{|W*>$1ERA&wo^NYg^qYc)Q?jZ$7!A@-@7S@ES;Typ=0rHGa&7Vk?uV?{cpfk{{3QL=ID zY}4ZOTkBnL6vJ13?PIr}nQLbAbv1O{hmdDP<_mZe1@Zw?ya z)xlZ_+CM-`SdHeF25W=dRND6-&TpkSNeka$mO1RXNhTZm{|s})dN+p*LOQ?RwI+m& zlF((Z(@?K>h%e;nYNtCGuqag!n}gAifbT#aAK`}3?@Zh&RC2SlEPHt;%Mcx7MIMdC zmx(5Hzy`JZ1%HYsXHqzh21^f{hF!6SCix-4?I|*W&7{@OX^Zz=Mw#X*i(tO`p(q^hU_p%4?ci@ zZ%wi!oHrl;*1{8&c*QgSP~Z~rIDc)ezOxITNk8@q{*8wH{qRJM>eIw8uCfL;=&Q}cX;^aKvo)z%UFcSx>VhVs^rg@Y{;6+hnixrhdjrzM=nKFUr{TOU|BJ9J zfqruokAfBuYo#CElBxpAA8=|o3ualQE~&=yVByqxqWBlAlzlq8IJFfQ#7bxB0W*Ax z<51I~rKxBhIDMTm&bkKV{vXr0$+F0w#%eJ~0*Nn>31mqJrZmheC5k@JqWJmao9Hr6 zKaO`i;i)|2IWrdTaK`Skw+^ED^%L|FI*OLfFMfWlj^bq%Dx0;w9j_XP z<*&79k*1xRAD((xGfr2(_X90Tq;Kp*O{_KVik+HqxQa*g#^EZ&vzh3zi`n~rxY~KQ zJY2rQK|^j8JeF<(NV&M7f^pMz~S z(YmB|C0+&a1Ca`MU?Wa=3&f@(1VuX#D;m(WnA`^!yr9iC3gdU%9EI`eHY^2BwQ1jk z_BJeox8QeH8H^7hDE&nBwLTQrj564L4uf$f)cjnD^t}?6UDUIS4ydqvGl)42Y#fgjX6@T{pr8wfX#)h<;R>GYssHLFQ#nC03}0yet8BWu|; zAEF1Ncl!xlnN&rqNYFXIWrbT@wRM7Ym#c9fg@i zL0HmPr^6-K@CK;vz}VlD?v|Im9!+;gp*iBl`(F_^wyH5zU)JB9;a{L{>&fpwvP4K; zgXf>zPljc1Xt zrd@P?+&cu_s!luy)>6J=)|E2s$;q%HADKXQglQMp2#PO@8?VnS8fIaU95<-WQbrIs z?0#^9MtEeH1!gxq2s7U44kXl<-Pi~=yS@|=p<#uni1_8}GDnEB9*Y3i1>AlpkGQFl z6fPJAD&mBriU{sUWh3lP$4gxJ#T9ml{=>3IvJkyD;C6;67K#+2G{@Wy%olAJwOp9p jfpOXtaED|-(gKV3*nIfJSoVK;S}_ARghrAfeo}yIHDEZt{r^N3|$T(6COJSBkgh7!9Gq(AU+{v zLGlvPN9*x3XLL<@YQm?|CFv~4sqS{@j#h@PFXH4#~-o2K{tRu(8gEgrCUW5S-FK^;n( zj#F0=jrjA}zK7^t5wtEK6P){uUcr}7D3EFyZ@uUrlMOxX!hN{5f`b2JKfa<1n)>A= zdf-Zx!c$c~2PVzf#BjNAJ;?UY2~#NQsA@;7bwT)e6zQ0<3-2Lda^fv?+;3t9PVBCP zt`mX<+MIYR>+i(B2Fa<^%Dg7hfZ*5-u5+rHNb0h;Q)Mv|CWeSn zg=Cn!A{wA`n3HiI@qqlB>yP<}%%8L~l|14jwiHZP`s�W|Dt^?H(bCQc+#lC^$xl z6}&HyneAO9kJ>fkfx}|`rt$k4Q37Q^%%_UmtQm7?(|9S!NpFqlfu(BEmGZOKh&Jf- e@ffq!e2m}Zk+pBcJhdWszd0zbmXZxgr~3>02pk^( diff --git a/Profiles/WinConst.lua b/Profiles/WinConst.lua index 13ebb4f..92d8b25 100644 --- a/Profiles/WinConst.lua +++ b/Profiles/WinConst.lua @@ -182,6 +182,7 @@ WIN_CTRINOFST = 'OfstCtrIn' WIN_OFST = 'Ofst' WIN_SECTIONFRAME = 'SectionFrame' WIN_MIXED_COMMON = 'Common' +WIN_SIMPLIFIED = 'Simplified' WIN_MINIZINKEN = 'MiniZinken' diff --git a/Profiles/WinLib/WinCalculate.lua b/Profiles/WinLib/WinCalculate.lua index 30c9d33..981c50d 100644 --- a/Profiles/WinLib/WinCalculate.lua +++ b/Profiles/WinLib/WinCalculate.lua @@ -22,12 +22,17 @@ require( 'WinConst') local s_dDowelTol = 1 -local bCalcSolid = false +local s_bCalcSolid = false function WinCalculate.GetCalcSolid() - return bCalcSolid + return s_bCalcSolid end function WinCalculate.SetCalcSolid( bValue) - bCalcSolid = bValue + s_bCalcSolid = bValue +end + +local s_bSimplSolid = false +function WinCalculate.SetSimplifiedSolid( bValue) + s_bSimplSolid = bValue end --------------------------------------------------------------------- @@ -337,7 +342,7 @@ local function GetSplitType( nSplitLayerId) local nChildrenType = GetChildrenType( nSplitId) if nChildrenType == WIN_CHILDREN_TYPES.MIXED then nSplitType = WIN_SPLITTYPES.MIXED - elseif nChildrenType == WIN_CHILDREN_TYPES.SASH then + elseif nChildrenType == WIN_CHILDREN_TYPES.SASH or nChildrenType == WIN_CHILDREN_TYPES.NULL then nSplitType = WIN_SPLITTYPES.MULLION end end @@ -799,7 +804,9 @@ local function CalculateOutlineFromAreaOutline( nAreaId) local b3FrameProfile = GetProfileLocalBox( nParentProfileId) -- calcolo offset perpendicolare e sulla z dell'anta local dOverlap = EgtGetInfo( nParentProfileId, WIN_FILLOVERLAP, 'd') - local dFillPerpOffset = abs( b3FrameProfile:getMin():getX()) - dOverlap + local bMixedSplit = ( EgtGetInfo( nParentOutlineId, WIN_PRF_CHANGE, 'b') or false) and EgtGetName( nParentOutlineId) == WIN_SPLIT + local dDimRef = EgtIf( bMixedSplit, b3FrameProfile:getMax():getX(), b3FrameProfile:getMin():getX()) + local dFillPerpOffset = abs( dDimRef) - dOverlap local dFillZOffset = EgtGetInfo( nParentProfileId, WIN_FILLDELTA, 'd') -- faccio offset e muovo in z @@ -1743,7 +1750,7 @@ local function CreateTrimSurf( nGeoId, nProfileId, dGeoWidth, nLayerId) local nOrigTrimProfileId = EgtGetInfo( nGeoId, WIN_SEMI_PROFILE, 'i') -- 1) minizinken - if not nOrigTrimProfileId then + if not nOrigTrimProfileId then local nGuideId = EgtCopy( nGeoId, nLayerId) EgtExtendCurveStartByLen( nGuideId, 4 * dGeoWidth) @@ -1759,7 +1766,7 @@ local function CreateTrimSurf( nGeoId, nProfileId, dGeoWidth, nLayerId) else -- recupero il controprofilo da estrudere local sTrimProfileName = EgtGetName( nOrigTrimProfileId) - sTrimProfileName = WIN_OFST .. sTrimProfileName + sTrimProfileName = EgtIf( s_bSimplSolid, WIN_SIMPLIFIED, '') .. WIN_OFST .. sTrimProfileName -- recupero la curva di outline associata alla curva di geo local nRefOutline = EgtGetInfo( nGeoId, WIN_REF_OUTLINE, 'i') -- calcolo la superficie di estrusione @@ -1775,7 +1782,8 @@ local function CreateMixedSplitTrimSurf( nMixedOutlineId, nProfileId, dExtraLen, -- estrudo il controprofilo di tipo sash local nPartId = EgtGetParent( EgtGetParent( nMixedOutlineId)) local nOutlineId = EgtGetInfo( nPartId, WIN_REF_OUTLINE, 'i') - local nTrimStmId = CreateProfileSurf( nOutlineId, nProfileId, WIN_OFST .. WIN_SASH .. WIN_CTRIN, dExtraLen, nLayerId) + local sTrimProfile = EgtIf( s_bSimplSolid, WIN_SIMPLIFIED, '') .. WIN_OFST .. WIN_SASH .. WIN_CTRIN + local nTrimStmId = CreateProfileSurf( nOutlineId, nProfileId, sTrimProfile, dExtraLen, nLayerId) -- creo la superficie per il taglio a 45° local nIntersCrvId = EgtGetInfo( nMixedOutlineId, WIN_MIXED_INTERS_REF, 'i') @@ -1833,7 +1841,8 @@ local function CalcMixedFrameSolid( nOutlineId, nSolidLayerId, nProfileLayerId, local vMixedOutlines = EgtGetAllInGroup( nMixedOutlinesGrp) local vMainExtrusions = {} for i = 1, #vMixedOutlines do - local nMainExtrusionId = CreateMainSurf( vMixedOutlines[i], 2 * dGeoWidth, nMainProfileId, EgtGetName( vMixedOutlines[i]) .. WIN_SECTION, nSolidLayerId) + local sSection = EgtIf( s_bSimplSolid, WIN_SIMPLIFIED, '') .. EgtGetName( vMixedOutlines[i]) .. WIN_SECTION + local nMainExtrusionId = CreateMainSurf( vMixedOutlines[i], 2 * dGeoWidth, nMainProfileId, sSection, nSolidLayerId) table.insert( vMainExtrusions, nMainExtrusionId) end @@ -1904,7 +1913,8 @@ local function CalcMixedSplitSolid( nOutlineId, nSolidLayerId, nProfileLayerId, -- a) creo il solido di estrusione principale local nMainProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) - local nMainExtrusionId = CreateMainSurf( nOutlineId, 2 * dGeoWidth, nMainProfileId, WIN_SECTION, nSolidLayerId) + local sSection = EgtIf( s_bSimplSolid, WIN_SIMPLIFIED, '') .. WIN_SECTION + local nMainExtrusionId = CreateMainSurf( nOutlineId, 2 * dGeoWidth, nMainProfileId, sSection, nSolidLayerId) -- creo una copia local nOrigMainExtrusionId = EgtCopy( nMainExtrusionId, nSolidLayerId) EgtSetName( nOrigMainExtrusionId, WIN_SRF_ORIGMAIN) @@ -1958,7 +1968,8 @@ local function CalcSolid( nPartId, nOutlineId) -- a) creo il solido di estrusione principale local nMainProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) - local nMainExtrusionId = CreateMainSurf( nOutlineId, 2 * dGeoWidth, nMainProfileId, WIN_SECTION, nSolidLayerId) + local sSection = EgtIf( s_bSimplSolid, WIN_SIMPLIFIED, '') .. WIN_SECTION + local nMainExtrusionId = CreateMainSurf( nOutlineId, 2 * dGeoWidth, nMainProfileId, sSection, nSolidLayerId) -- creo una copia ( usata per calcolo ferramenta) local nOrigMainExtrusionId = EgtCopy( nMainExtrusionId, nSolidLayerId) EgtSetName( nOrigMainExtrusionId, WIN_SRF_ORIGMAIN) @@ -1987,7 +1998,6 @@ local function CalcSolid( nPartId, nOutlineId) -- eseguo intersezione per ottenere un solido unico EgtSurfTmIntersect( nMainExtrusionId, nTrimSurf) end - end --------------------------------------------------------------------- @@ -2095,7 +2105,16 @@ local function CreateDowel( nOrigDowelId, nLayerId, frOrig, frDest, vtDir, nTest -- eventuale aggiornamento del solido if nMainExtrusionId then -- creo solido di estrusione del dowel - local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nLayerId, nDowelId, vtDir * dLen) + local nDowelExtrusionId + if s_bSimplSolid then + -- creo foro grossolano per velocizzare operazioni di subtract + local nDowelApprox = EgtCopyGlob( nDowelId, nLayerId) + EgtApproxCurve( nDowelApprox, GDB_CA.LINES, 0.2) + nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nLayerId, nDowelApprox, vtDir * dLen) + EgtErase( nDowelApprox) + else + nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nLayerId, nDowelId, vtDir * dLen) + end -- sottraggo il dowel al solido EgtSurfTmSubtract( nMainExtrusionId, nDowelExtrusionId) EgtErase( nDowelExtrusionId) @@ -2184,7 +2203,7 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail -- recupero i solidi local nPrevSolidId, nSolidId, nPrevSolidLay, nSolidLay - if bCalcSolid then + if s_bCalcSolid then nSolidLay = EgtGetFirstNameInGroup( nPart, WIN_SOLID) nSolidId = EgtGetFirstNameInGroup( nSolidLay, WIN_SRF_MAIN) nPrevSolidLay = EgtGetFirstNameInGroup( nPrevPart, WIN_SOLID) @@ -2220,13 +2239,13 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail -- superficie test per il posizionamento dei dowels : è la superficie in del pezzo full local nTestSurf - if bCalcSolid then + if not s_bCalcSolid or s_bSimplSolid then + local sCtrIn = WIN_OFST .. GetProfileCtrIn( nOutlineId, nPrevOutlineId, nProfileId) -- controprofilo in del pezzo corrente + nTestSurf = CreateProfileSurf( nOutlineId, nProfileId, sCtrIn, 100, nLayerId) + else -- è la superficie che viene utilizzata per trimmare l'end del pezzo prev local nOrigSurf = EgtGetFirstNameInGroup( nPrevSolidLay, WIN_SRF_END) nTestSurf = EgtCopyGlob( nOrigSurf, nLayerId) - else - local sCtrIn = WIN_OFST .. GetProfileCtrIn( nOutlineId, nPrevOutlineId, nProfileId) -- controprofilo in del pezzo corrente - nTestSurf = CreateProfileSurf( nOutlineId, nProfileId, sCtrIn, 100, nLayerId) end local nTestSurfInverted = EgtCopyGlob( nTestSurf, nLayerId) EgtInvertSurf( nTestSurfInverted) @@ -2235,11 +2254,11 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail local nTestSurf2 if bSashOrFrame then -- se anta la superficie da cui non fuoriuscire è quella esterna del pezzo short, ovvero la superficie usata per trimmare lo start del pezzo corrente - if bCalcSolid then + if not s_bCalcSolid or s_bSimplSolid then + nTestSurf2 = CreateProfileSurf( nPrevOutlineId, nPrevProfileId, WIN_OFST .. WIN_OUT, 100, nLayerId) + else local nOrigSurf = EgtGetFirstNameInGroup( nSolidLay, WIN_SRF_START) nTestSurf2 = EgtCopyGlob( nOrigSurf, nLayerId) - else - nTestSurf2 = CreateProfileSurf( nPrevOutlineId, nPrevProfileId, WIN_OFST .. WIN_OUT, 100, nLayerId) end EgtInvertSurf( nTestSurf2) else @@ -2301,12 +2320,12 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail -- superficie test per il posizionamento dei dowels -- è il controprofilo in del pezzo full quindi è la stessa superficie che viene utilizzata per trimmare lo start del pezzo corrente local nTestSurf - if bCalcSolid then - local nOrigSurf = EgtGetFirstNameInGroup( nSolidLay, WIN_SRF_START) - nTestSurf = EgtCopyGlob( nOrigSurf, nLayerId) - else + if not s_bCalcSolid or s_bSimplSolid then local sCtrIn = WIN_OFST .. GetProfileCtrIn( nPrevOutlineId, nOutlineId, nPrevProfileId) -- controprofilo del pezzo full nTestSurf = CreateProfileSurf( nPrevOutlineId, nPrevProfileId, sCtrIn, 100, nLayerId) + else + local nOrigSurf = EgtGetFirstNameInGroup( nSolidLay, WIN_SRF_START) + nTestSurf = EgtCopyGlob( nOrigSurf, nLayerId) end local nTestSurfInverted = EgtCopyGlob( nTestSurf, nLayerId) EgtInvertSurf( nTestSurfInverted) @@ -2314,11 +2333,11 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail -- superficie test per la traslazione dei dowels local nTestSurf2 if bSashOrFrame then - if bCalcSolid then + if not s_bCalcSolid or s_bSimplSolid then + nTestSurf2 = CreateProfileSurf( nOutlineId, nProfileId, WIN_OFST .. WIN_OUT, 100, nLayerId) + else local nOrigSurf = EgtGetFirstNameInGroup( nPrevSolidLay, WIN_SRF_END) nTestSurf2 = EgtCopyGlob( nOrigSurf, nLayerId) - else - nTestSurf2 = CreateProfileSurf( nOutlineId, nProfileId, WIN_OFST .. WIN_OUT, 100, nLayerId) end EgtInvertSurf( nTestSurf2) else @@ -2377,7 +2396,7 @@ local function CalcSplitDowels( nSplitId, vOutlines, bStartOrEnd) -- recupero eventuale solido e superifici usate per il suo trim local nSplitSolidId, vTestSurf - if bCalcSolid then + if s_bCalcSolid then local nSplitSolidLayerId = EgtGetFirstNameInGroup( nSplitPart, WIN_SOLID) nSplitSolidId = EgtGetFirstNameInGroup( nSplitSolidLayerId, WIN_SRF_MAIN) vTestSurf = EgtGetNameInGroup( nSplitSolidLayerId, EgtIf( bStartOrEnd, WIN_SRF_START, WIN_SRF_END)) @@ -2434,7 +2453,7 @@ local function CalcSplitDowels( nSplitId, vOutlines, bStartOrEnd) -- recupero eventuale solido local nSolidId - if bCalcSolid then + if s_bCalcSolid then local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) nSolidId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_MAIN) end @@ -2456,10 +2475,7 @@ local function CalcSplitDowels( nSplitId, vOutlines, bStartOrEnd) -- creo la superficie di test per il posizionamento dei dowels local nProfileId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_PRF_MAIN) local nTestSurf - if bCalcSolid then - -- è la stessa superficie utilizzata per il trim del solido - nTestSurf = EgtCopyGlob( vTestSurf[i], nSplitLayerId) - else + if not s_bCalcSolid or s_bSimplSolid then local sCtr local bChangeProfile = EgtGetInfo( nSplitId, WIN_PRF_CHANGE, 'b') or false if bChangeProfile then @@ -2468,6 +2484,9 @@ local function CalcSplitDowels( nSplitId, vOutlines, bStartOrEnd) sCtr = WIN_OFST .. GetProfileCtrIn( nOutlineId, nSplitId, nProfileId) end nTestSurf = CreateProfileSurf( nOutlineId, nProfileId, sCtr, 100, nLayerId) + else + -- è la stessa superficie utilizzata per il trim del solido + nTestSurf = EgtCopyGlob( vTestSurf[i], nSplitLayerId) end local nTestSurfInverted = EgtCopyGlob( nTestSurf, nSplitLayerId) EgtInvertSurf( nTestSurfInverted) @@ -2575,9 +2594,10 @@ end -- funzione che restitutisce lo Strip piu' vicino -- ( analoga a GetProfileCtrIn) local function GetStripNearestToOutline( nPrevProfileId, nPrevOutlineId, nOutlineId) - local nStripId = EgtGetFirstNameInGroup( nPrevProfileId, WIN_STRIP) + local sStripName = WIN_STRIP + -- gestione particolare del caso di profilo di split - if not nStripId then + if not EgtGetFirstNameInGroup( nPrevProfileId, sStripName) then -- recupero la curva di base outline da cui deriva il precedente local nPrevSouId = EgtGetInfo( nPrevOutlineId, WIN_COPY, 'i') local sPrevSouName @@ -2589,12 +2609,16 @@ local function GetStripNearestToOutline( nPrevProfileId, nPrevOutlineId, nOutlin -- verifico da quale lato si trova la curva per decidere quale controprofilo considerare local _, _, nSide = EgtPointCurveDistSide( EgtMP( nOutlineId), nPrevSouId, Z_AX()) if nSide == 1 then - nStripId = EgtGetFirstNameInGroup( nPrevProfileId, WIN_STRIP .. '1') -- dx + sStripName = WIN_STRIP .. '1' -- dx else - nStripId = EgtGetFirstNameInGroup( nPrevProfileId, WIN_STRIP .. '2') -- sx + sStripName = WIN_STRIP .. '2' -- sx end end - + + if s_bSimplSolid then + sStripName = WIN_SIMPLIFIED .. sStripName + end + local nStripId = EgtGetFirstNameInGroup( nPrevProfileId, sStripName) return nStripId end @@ -2777,7 +2801,7 @@ local function CreatePartFromOutline( nAreaLayerId, nOutlineId, nOutlineCrvNbr, -- calcolo le lavorazioni associate ai profili CalcProfilingProcessings( nPartId, nOutlineId) -- disegno solido - if bCalcSolid then + if s_bCalcSolid then CalcSolid( nPartId, nOutlineId) end @@ -2798,7 +2822,7 @@ local function CreatePartFromOutline( nAreaLayerId, nOutlineId, nOutlineCrvNbr, -- disegno ingombro local nGeoLayerId = CalcFillGeo( nPartId, nOutlineLayerId) -- disegno solido - if bCalcSolid then + if s_bCalcSolid then CalcFillSolid( nPartId, nOutlineLayerId, nGeoLayerId) end end @@ -2853,7 +2877,7 @@ local function CalculateAreaParts( nAreaId) end end elseif nAreaType ~= WIN_AREATYPES.FILL then - if bCalcSolid then + if s_bCalcSolid then --- verifico se area successiva e' un fill local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREAASTERISK) local nChildAreaType = EgtGetInfo( nChildAreaId or GDB_ID.NULL, WIN_AREATYPE, "i") @@ -3343,7 +3367,7 @@ function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest) EgtAddCurveCompoArcTg( nSolidPocketOutlineId, ptCenter + dLength / 2 * X_AX(), false) -- per solido local nSolidPocketId - if bCalcSolid then + if s_bCalcSolid then -- costruisco asola come volume chiuso per eseguire operazioni booleane con il solido e la creo più grande per non avere geometrie a filo local dExtra = 1 EgtAddCurveCompoLineTg( nSolidPocketOutlineId, dExtra) @@ -3401,7 +3425,7 @@ function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest) EgtSetColor( nHoleId, EgtStdColor( 'GRAY')) EgtSetInfo( nHoleId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) -- per solido - if bCalcSolid then + if s_bCalcSolid then local nSolidHoleId = EgtSurfTmByRegionExtrusion( nProcLayerId, nHoleId, - ( dDepth + 1) * Z_AX()) EgtMove( nSolidHoleId, Z_AX()) EgtTransform( nSolidHoleId, frHdwFrame)