From e4f54c9f190fc5abece7fb13e50cf9b162ef3885 Mon Sep 17 00:00:00 2001 From: SaraP Date: Wed, 7 Aug 2024 11:07:37 +0200 Subject: [PATCH] - 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