diff --git a/Profiles/Profilo78 - Offset - Copy (38).nge b/Profiles/Profilo78 - Offset - Copy (38).nge new file mode 100644 index 0000000..e560455 Binary files /dev/null and b/Profiles/Profilo78 - Offset - Copy (38).nge differ diff --git a/Profiles/Profilo78 - Offset.nge b/Profiles/Profilo78 - Offset.nge index e560455..637fca2 100644 Binary files a/Profiles/Profilo78 - Offset.nge and b/Profiles/Profilo78 - Offset.nge differ diff --git a/Profiles/Profilo78 - Offset.nge.no b/Profiles/Profilo78 - Offset.nge.no new file mode 100644 index 0000000..78ef43f Binary files /dev/null and b/Profiles/Profilo78 - Offset.nge.no differ diff --git a/Profiles/WinConst.lua b/Profiles/WinConst.lua index cb36bc9..24f9261 100644 --- a/Profiles/WinConst.lua +++ b/Profiles/WinConst.lua @@ -176,6 +176,7 @@ WIN_PRF_TYPE = 'Type' WIN_PRF_MAIN = 'Main' WIN_PRF_START = 'Start' WIN_PRF_END = 'End' +WIN_PRF_SPLIT = 'Split' WIN_PROFILETYPE = 'ProfileType' WIN_SEPARATIONTYPE = 'SeparationType' @@ -195,6 +196,9 @@ WIN_FILLDELTA = 'FillDelta' WIN_MAINGUIDE = 'MainGuide' WIN_STARTGUIDE = 'StartGuide' WIN_ENDGUIDE = 'EndGuide' +WIN_SRF_MAIN = 'MainSurface' +WIN_SRF_START = 'StartSurface' +WIN_SRF_END = 'EndSurface' WIN_BOTTOMRAIL = 'BottomRail' diff --git a/Profiles/WinLib/WinCalculate.lua b/Profiles/WinLib/WinCalculate.lua index 0a8fb4f..92e805c 100644 --- a/Profiles/WinLib/WinCalculate.lua +++ b/Profiles/WinLib/WinCalculate.lua @@ -1526,6 +1526,7 @@ function WinCalculate.MakeSolidByExtrusion(nGeoId, nOutlineId, nMainProfileId, n -- 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) -- posiziono il profilo Start local nRefStartProfileId = EgtGetFirstNameInGroup( nStartProfileId, WIN_REF) local b3RefStartProfile = EgtGetBBoxGlob(nRefStartProfileId, GDB_BB.STANDARD) @@ -1596,13 +1597,14 @@ function WinCalculate.MakeSolidByExtrusion(nGeoId, nOutlineId, nMainProfileId, n nOutStartProfileId = EgtGetFirstNameInGroup( nStartProfileId, sStartProfileType) end local nStartExtrusionId = EgtSurfTmSwept( nSolidLayerId, nOutStartProfileId, nStartGuideId, false, WIN_SURF_APPROX) + EgtSetName( nStartExtrusionId, WIN_SRF_START) -- taglio estrusi per ottenere solido local nExtrCopyId = EgtCopy( nMainExtrusionId, nSolidLayerId) EgtSurfTmCut( nMainExtrusionId, nStartExtrusionId, true, false) EgtSurfTmCut( nStartExtrusionId, nExtrCopyId, true, false) -- creo fori per spine su Start local nDowelLayerId = EgtGroup( nPartId) - EgtSetName( nDowelLayerId, 'Dowel') + EgtSetName( nDowelLayerId, WIN_DOWEL) local nPrevOutlineId, nEndOutlineId = GetPrevNextOutline( nProfileType, nOutlineId, nOutlineLayerId) local sOutlineName = EgtGetName( nOutlineId) local sPrevOutlineName = EgtGetName( nPrevOutlineId) @@ -1673,26 +1675,29 @@ function WinCalculate.MakeSolidByExtrusion(nGeoId, nOutlineId, nMainProfileId, n if not dEnd then dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARAEND, 'd') end - local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) - EgtSetColor( nDowelId, Color3d( 128, 128, 128)) - local nLeftGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_LEFT) - local ptDowelCenter = EgtCP( nDowelId) - local vtParaStartPoint = EgtSV( nOutlineId) - -- posiziono i fori e gli assegno estrusione e spessore - EgtMove( nDowelId, ( EgtSP( nLeftGeoId) - ptDowelCenter) * vtParaStartPoint * vtParaStartPoint + vtParaStartPoint * dStart) - -- EgtMove( nDowelId, Point3d( ptDowelCenter:getX(), EgtSP( nLeftGeoId):getY(), ptDowelCenter:getZ()) - ptDowelCenter + vtParaStartPoint * dStart) - EgtModifyCurveExtrusion( nDowelId, vtParaStartPoint) - EgtModifyCurveThickness( nDowelId, dEnd - dStart) - -- creo solido di estrusione - local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtParaStartPoint * ( dEnd - dStart + 1)) - EgtMove( nDowelExtrusionId, - vtParaStartPoint) - EgtInvertSurf( nDowelExtrusionId) - -- taglio estrusi per ottenere solido - local nDowelExtrCopyId = EgtCopy( nDowelExtrusionId, nSolidLayerId) - EgtSurfTmCut( nDowelExtrusionId, nStartExtrusionId, true, false) - EgtSurfTmCut( nStartExtrusionId, nDowelExtrCopyId, true, false) - EgtErase( nDowelExtrCopyId) - nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') + -- verifico che start ed end abbiano dei valori + if dStart and dEnd then + local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) + EgtSetColor( nDowelId, Color3d( 128, 128, 128)) + local nLeftGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_LEFT) + local ptDowelCenter = EgtCP( nDowelId) + local vtParaStartPoint = EgtSV( nOutlineId) + -- posiziono i fori e gli assegno estrusione e spessore + EgtMove( nDowelId, ( EgtSP( nLeftGeoId) - ptDowelCenter) * vtParaStartPoint * vtParaStartPoint + vtParaStartPoint * dStart) + -- EgtMove( nDowelId, Point3d( ptDowelCenter:getX(), EgtSP( nLeftGeoId):getY(), ptDowelCenter:getZ()) - ptDowelCenter + vtParaStartPoint * dStart) + EgtModifyCurveExtrusion( nDowelId, vtParaStartPoint) + EgtModifyCurveThickness( nDowelId, dEnd - dStart) + -- creo solido di estrusione + local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtParaStartPoint * ( dEnd - dStart + 1)) + EgtMove( nDowelExtrusionId, - vtParaStartPoint) + EgtInvertSurf( nDowelExtrusionId) + -- taglio estrusi per ottenere solido + local nDowelExtrCopyId = EgtCopy( nDowelExtrusionId, nSolidLayerId) + EgtSurfTmCut( nDowelExtrusionId, nStartExtrusionId, true, false) + EgtSurfTmCut( nStartExtrusionId, nDowelExtrCopyId, true, false) + EgtErase( nDowelExtrCopyId) + end + nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') end end -- posiziono il profilo End @@ -1759,6 +1764,7 @@ function WinCalculate.MakeSolidByExtrusion(nGeoId, nOutlineId, nMainProfileId, n nOutEndProfileId = EgtGetFirstNameInGroup( nEndProfileId, sEndProfileType) end local nEndExtrusionId = EgtSurfTmSwept( nSolidLayerId, nOutEndProfileId, nEndGuideId, false, WIN_SURF_APPROX) + EgtSetName( nEndExtrusionId, WIN_SRF_END) -- taglio estrusi per ottenere solido EgtSurfTmCut( nMainExtrusionId, nEndExtrusionId, true, false) EgtSurfTmCut( nEndExtrusionId, nExtrCopyId, true, false) @@ -1828,24 +1834,27 @@ function WinCalculate.MakeSolidByExtrusion(nGeoId, nOutlineId, nMainProfileId, n if not dEnd then dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARAEND, 'd') end - local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) - EgtSetColor( nDowelId, Color3d( 128, 128, 128)) - local nRightGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_RIGHT) - local ptDowelCenter = EgtCP( nDowelId) - local vtParaEndPoint = EgtEV( nOutlineId) - -- posiziono i fori e gli assegno estrusione e spessore - EgtMove( nDowelId, ( EgtSP( nRightGeoId) - ptDowelCenter) * vtParaEndPoint * vtParaEndPoint - vtParaEndPoint * dStart) - EgtModifyCurveExtrusion( nDowelId, - vtParaEndPoint) - EgtModifyCurveThickness( nDowelId, dEnd - dStart) - -- creo solido di estrusione - local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, - vtParaEndPoint * ( dEnd - dStart + 1)) - EgtMove( nDowelExtrusionId, vtParaEndPoint) - EgtInvertSurf( nDowelExtrusionId) - -- taglio estrusi per ottenere solido - local nDowelExtrCopyId = EgtCopy( nDowelExtrusionId, nSolidLayerId) - EgtSurfTmCut( nDowelExtrusionId, nEndExtrusionId, true, false) - EgtSurfTmCut( nEndExtrusionId, nDowelExtrCopyId, true, false) - EgtErase( nDowelExtrCopyId) + -- verifico che start ed end abbiano dei valori + if dStart and dEnd then + local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) + EgtSetColor( nDowelId, Color3d( 128, 128, 128)) + local nRightGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_RIGHT) + local ptDowelCenter = EgtCP( nDowelId) + local vtParaEndPoint = EgtEV( nOutlineId) + -- posiziono i fori e gli assegno estrusione e spessore + EgtMove( nDowelId, ( EgtSP( nRightGeoId) - ptDowelCenter) * vtParaEndPoint * vtParaEndPoint - vtParaEndPoint * dStart) + EgtModifyCurveExtrusion( nDowelId, - vtParaEndPoint) + EgtModifyCurveThickness( nDowelId, dEnd - dStart) + -- creo solido di estrusione + local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, - vtParaEndPoint * ( dEnd - dStart + 1)) + EgtMove( nDowelExtrusionId, vtParaEndPoint) + EgtInvertSurf( nDowelExtrusionId) + -- taglio estrusi per ottenere solido + local nDowelExtrCopyId = EgtCopy( nDowelExtrusionId, nSolidLayerId) + EgtSurfTmCut( nDowelExtrusionId, nEndExtrusionId, true, false) + EgtSurfTmCut( nEndExtrusionId, nDowelExtrCopyId, true, false) + EgtErase( nDowelExtrCopyId) + end nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') end end @@ -1854,7 +1863,167 @@ function WinCalculate.MakeSolidByExtrusion(nGeoId, nOutlineId, nMainProfileId, n end -- funzione che posiziona i fori delle spine degli split, li estrude e crea il solido -function WinCalculate.AddSplitDowelToExtrusion(nGeoId, nOutlineId, nMainProfileId, nStartProfileId, nEndProfileId, nProfileType, nSolidLayerId, nAreaType) +function WinCalculate.AddSplitDowelToExtrusion(nOutlineId, nProfileFrameLayerId, nFrameProfileLayerId, nProfileType, nPartId, nSolidLayerId) + -- recupero l'area di cui fa parte il pezzo + local sOutlineName2 = EgtGetName( nOutlineId) + local nOutlineLayerId = EgtGetParent( nOutlineId) + local nAreaLayerId = EgtGetParent( nOutlineLayerId) + -- se profilo Bottom con BottomRail, esco + if nProfileType == WIN_PRF.BOTTOM then + local nBaseOutlineLayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_AREAOUTLINE) + local nBottomRailId = EgtGetInfo( nBaseOutlineLayerId, WIN_BOTTOMRAIL, 'i') + if nBottomRailId and nBottomRailId == 1 then + return + end + end + -- verifico la presenza di eventuali Split + local nSplitLayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_SPLIT) + if not nSplitLayerId then + return + end + local nSplitId = EgtGetFirstInGroup( nSplitLayerId) + + -- se presenti, verifico se intersecano l'outline che sto analizzando + local ptInters = EgtIP( nOutlineId, nSplitId, EgtSP( nSplitId)) + if not ptInters then + return + end + -- se interseca, recupero il profilo dello split + local sSplitProfileType = EgtGetInfo( nSplitId, WIN_PROFILETYPE) + local nOrigSplitProfileId = EgtGetFirstNameInGroup( nProfileFrameLayerId, sSplitProfileType) + -- creo copia del profilo + 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 + local nGeoLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO) + local nGeoInId = EgtGetFirstNameInGroup(nGeoLayerId, WIN_GEO_IN) + local ptIntersIn = EgtIP( nGeoInId, nSplitId, EgtSP( nSplitId)) + -- recupero frame del profilo + local nSplitProfileFrameId = EgtGetFirstNameInGroup( nSplitProfileId, WIN_SECTIONFRAME) + local frInvertSplitProfile = EgtFR( nSplitProfileFrameId) + frInvertSplitProfile:invert() + -- lo applico a tutte le geometrie del profilo + EgtTransform( EgtGetAllInGroup( nSplitProfileId), frInvertSplitProfile) + -- assegno come riferimento del profilo il punto di intersezione + EgtChangeGroupFrame( nSplitProfileId, Frame3d( ptIntersIn, - EgtSV( nSplitId))) + + -- e lo porto nel sistema di riferimento corretto + + -- recupero profondita' start e end dei dowel + + -- ne disegno la superficie + + -- recupero solido del pezzo + local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) + local nMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_MAIN) + -- creo fori per spine su Split + local nDowelLayerId = EgtGetFirstNameInGroup( nPartId, WIN_DOWEL) + local nPrevOutlineId, nEndOutlineId = GetPrevNextOutline( nProfileType, nOutlineId, nOutlineLayerId) + local sOutlineName = EgtGetName( nOutlineId) + local sPrevOutlineName = EgtGetName( nPrevOutlineId) + SplitJointType = WIN_PART_JNT.FULL + if SplitJointType == WIN_PART_JNT.ANGLED then + + elseif SplitJointType == WIN_PART_JNT.FULL then + -- 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 + end + -- 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) + -- ciclo sui fori trovati + local nOrigDowelId = EgtGetFirstNameInGroup( nSplitProfileId, WIN_DOWEL .. '*') + while nOrigDowelId do + local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd') + if not dStart then + dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPSTART, 'd') + end + local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd') + if not dEnd then + dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPEND, 'd') + end + local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) + EgtSetColor( nDowelId, Color3d( 128, 128, 128)) + local nInGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN) + local ptDowelCenter = EgtCP( nDowelId) + local vtPerpStartPoint = EgtSV( nOutlineId) + vtPerpStartPoint:rotate( Z_AX(), 90) + -- posiziono i fori e gli assegno estrusione e spessore + EgtMove( nDowelId, ( EgtSP( nInGeoId) - ptDowelCenter) * vtPerpStartPoint * vtPerpStartPoint - vtPerpStartPoint * dStart) + -- EgtMove( nDowelId, Point3d( ptDowelCenter:getX(), EgtSP( nInGeoId):getY(), ptDowelCenter:getZ()) - ptDowelCenter - vtPerpStartPoint * dStart) + EgtModifyCurveExtrusion( nDowelId, - vtPerpStartPoint) + EgtModifyCurveThickness( nDowelId, dEnd - dStart) + -- creo solido di estrusione + local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, - vtPerpStartPoint * ( dEnd - dStart + 1)) + EgtMove( nDowelExtrusionId, vtPerpStartPoint) + EgtInvertSurf( nDowelExtrusionId) + -- taglio estrusi per ottenere solido + EgtSurfTmCut( nMainExtrusionId, nDowelExtrusionId, true, false) + -- EgtSurfTmCut( nDowelExtrusionId, nExtrCopyId, true, false) + nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') + end + elseif SplitJointType == WIN_PART_JNT.SHORT then + -- recupero profondita' d'inizio e fine + local sStart = WIN_DWL_TOPPARASTART + local sEnd = WIN_DWL_TOPPARAEND + if sOutlineName == WIN_BOTTOM then + sStart = WIN_DWL_BOTTOMPARASTART + sEnd = WIN_DWL_BOTTOMPARAEND + elseif sOutlineName == WIN_SPLIT then + local sStartType = EgtGetInfo( nSplitProfileId, WIN_PRF_TYPE) + if ( sStartType and sStartType == WIN_RAIL_BOTTOM) or sPrevOutlineName == WIN_SPLIT then + sStart = WIN_DWL_RAILBOTTOMPARASTART + sEnd = WIN_DWL_RAILBOTTOMPARAEND + end + elseif sPrevOutlineName == WIN_BOTTOM then + sStart = WIN_DWL_BOTTOMPARASTART + sEnd = WIN_DWL_BOTTOMPARAEND + end + --local sStart = EgtIf( sOutlineName == WIN_BOTTOM or sPrevOutlineName == WIN_BOTTOM or sOutlineName == WIN_BOTTOMRAIL, WIN_DWL_BOTTOMPARASTART, WIN_DWL_TOPPARASTART) + --local sEnd = EgtIf( sOutlineName == WIN_BOTTOM or sPrevOutlineName == WIN_BOTTOM or sOutlineName == WIN_BOTTOMRAIL, WIN_DWL_BOTTOMPARAEND, WIN_DWL_TOPPARAEND) + -- 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_TOPPARASTART, 'd') + end + local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd') + if not dEnd then + dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARAEND, 'd') + end + local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) + EgtSetColor( nDowelId, Color3d( 128, 128, 128)) + local nLeftGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_LEFT) + local ptDowelCenter = EgtCP( nDowelId) + local vtParaStartPoint = EgtSV( nOutlineId) + -- posiziono i fori e gli assegno estrusione e spessore + EgtMove( nDowelId, ( EgtSP( nLeftGeoId) - ptDowelCenter) * vtParaStartPoint * vtParaStartPoint + vtParaStartPoint * dStart) + -- EgtMove( nDowelId, Point3d( ptDowelCenter:getX(), EgtSP( nLeftGeoId):getY(), ptDowelCenter:getZ()) - ptDowelCenter + vtParaStartPoint * dStart) + EgtModifyCurveExtrusion( nDowelId, vtParaStartPoint) + EgtModifyCurveThickness( nDowelId, dEnd - dStart) + -- creo solido di estrusione + local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtParaStartPoint * ( dEnd - dStart + 1)) + EgtMove( nDowelExtrusionId, - vtParaStartPoint) + EgtInvertSurf( nDowelExtrusionId) + -- taglio estrusi per ottenere solido + local nDowelExtrCopyId = EgtCopy( nDowelExtrusionId, nSolidLayerId) + EgtSurfTmCut( nDowelExtrusionId, nMainExtrusionId, true, false) + EgtSurfTmCut( nMainExtrusionId, nDowelExtrCopyId, true, false) + EgtErase( nDowelExtrCopyId) + nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') + end + end + end @@ -2271,7 +2440,7 @@ function WinCalculate.CalcFrameSolid(nPartId, nOutlineId, nGeoId, nOutlineLayerI -- nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i') -- until not nAreaId or ( nAreaType ~= WIN_AREATYPES.SPLIT and nAreaType ~= WIN_AREATYPES.NULL) -- --- WinCalculate.AddSplitDowelToExtrusion(nGeoId, nOutlineId, nProfileType, nSolidLayerId, nAreaType) + WinCalculate.AddSplitDowelToExtrusion( nOutlineId, nProfileFrameLayerId, nFrameProfileLayerId, nProfileType, nPartId, nSolidLayerId) end -- funzione che crea il solido del Fill