From 92ef41dd6f9fea2091024148ecd8b40723b301de Mon Sep 17 00:00:00 2001 From: SaraP Date: Wed, 22 May 2024 08:47:18 +0200 Subject: [PATCH] EgwWindowLua : - prima sistemazione dei dowels per gestire meglio il caso di archi - migliorie varie. --- Profiles/WinConst.lua | 1 + Profiles/WinLib/WinCalculate.lua | 890 +++++++++++++++---------------- 2 files changed, 417 insertions(+), 474 deletions(-) diff --git a/Profiles/WinConst.lua b/Profiles/WinConst.lua index e04c8ec..b6964da 100644 --- a/Profiles/WinConst.lua +++ b/Profiles/WinConst.lua @@ -126,6 +126,7 @@ WIN_ENDJOINT = 'EndJoint' WIN_SASHTYPE = 'SashType' WIN_REF_OUTLINE = 'OutlineRef' WIN_REF_PART = 'PartRef' +WIN_REF_BOTTOMRAIL_PART = 'BottomRailPartRef' WIN_SASH_TOP = 'Sash_Top' WIN_SASH_BOTTOM = 'Sash_Bottom' diff --git a/Profiles/WinLib/WinCalculate.lua b/Profiles/WinLib/WinCalculate.lua index fd4bfe9..04c7d3d 100644 --- a/Profiles/WinLib/WinCalculate.lua +++ b/Profiles/WinLib/WinCalculate.lua @@ -180,7 +180,7 @@ local function GetSplitType( nSplitLayerId) end end if not nSplitType then - -- EgtSetInfo( nSplitLayerId, WIN_SPLITTYPE, WIN_SPLITTYPES.NULL) + EgtSetInfo( nSplitLayerId, WIN_SPLITTYPE, WIN_SPLITTYPES.NULL) nSplitType = WIN_SPLITTYPES.NULL end @@ -345,16 +345,15 @@ local function CalculateOutlineFromAreaOutline( nAreaId) local nAreaOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_AREAOUTLINE) local nOutlineLayerId = EgtCopyGlob( nAreaOutlineLayerId, nAreaId) EgtSetName( nOutlineLayerId, WIN_OUTLINE) + EgtSetStatus( nOutlineLayerId, GDB_ST.OFF) -- FRAME if nAreaType == WIN_AREATYPES.FRAME then - EgtSetStatus( nOutlineLayerId, GDB_ST.OFF) -- sistemo le info local nAreaOutlineId = EgtGetFirstInGroup( nAreaOutlineLayerId) local nOutlineId = EgtGetFirstInGroup( nOutlineLayerId) while nAreaOutlineId do EgtSetInfo( nAreaOutlineId, WIN_COPY, nOutlineId) - EgtRemoveInfo( nOutlineId, WIN_SOU) nAreaOutlineId = EgtGetNext( nAreaOutlineId) nOutlineId = EgtGetNext( nOutlineId) end @@ -368,7 +367,6 @@ local function CalculateOutlineFromAreaOutline( nAreaId) local nBaseSplitId = EgtGetFirstInGroup( nBaseSplitLayerId) local nSplitId = EgtGetFirstInGroup( nSplitLayerId) EgtSetInfo( nBaseSplitId, WIN_COPY, nSplitId) - EgtRemoveInfo( nSplitId, WIN_SOU) end @@ -376,7 +374,6 @@ local function CalculateOutlineFromAreaOutline( nAreaId) elseif nAreaType == WIN_AREATYPES.SPLIT or nAreaType == WIN_AREATYPES.NULL then -- svuoto il gruppo EgtEmptyGroup( nOutlineLayerId) - EgtSetStatus( nOutlineLayerId, GDB_ST.OFF) -- recupero outline di livello precedente e lo copio pezzo per pezzo local nBaseOutlineId = EgtGetFirstInGroup( nAreaOutlineLayerId) while nBaseOutlineId do @@ -442,7 +439,6 @@ local function CalculateOutlineFromAreaOutline( nAreaId) elseif nAreaType == WIN_AREATYPES.SASH then -- svuoto il gruppo EgtEmptyGroup( nOutlineLayerId) - EgtSetStatus( nOutlineLayerId, GDB_ST.OFF) -- recupero se anta battente ricevente local nSashType = EgtGetInfo( nAreaId, WIN_SASHTYPE, 'i') or WIN_SASHTYPES.NULL @@ -547,7 +543,6 @@ local function CalculateOutlineFromAreaOutline( nAreaId) elseif nAreaType == WIN_AREATYPES.FILL then -- svuoto il gruppo EgtEmptyGroup( nOutlineLayerId) - EgtSetStatus( nOutlineLayerId, GDB_ST.OFF) -- ciclo su BaseArea riempimento local nBaseOutlineId = EgtGetFirstInGroup( nAreaOutlineLayerId) while nBaseOutlineId do @@ -588,18 +583,13 @@ local function CalculateOutlineFromAreaOutline( nAreaId) -- accorcio gli offset TrimAndOrientOrderedCurveLayer( nOutlineLayerId) end + -- disegno area di selezione per programma local nSelectionLayerId = EgtGroup( nAreaId) EgtSetName( nSelectionLayerId, WIN_SELECTION) EgtSetStatus( nSelectionLayerId, GDB_ST.OFF) - local OutlineList = {} - local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_OUTLINE) - local nOutlineId = EgtGetFirstInGroup(nOutlineLayerId) - while nOutlineId do - table.insert( OutlineList, nOutlineId) - nOutlineId = EgtGetNext(nOutlineId) - end - local nCompoId = EgtCurveCompo( nSelectionLayerId, OutlineList, false) + local vOutlineList = EgtGetAllInGroup( nOutlineLayerId) + local nCompoId = EgtCurveCompo( nSelectionLayerId, vOutlineList, false) local nSelectionArea = EgtSurfFlatRegion( nSelectionLayerId, nCompoId) EgtSetColor( nSelectionArea, 'YELLOW') EgtSetAlpha( nSelectionArea, 10) @@ -637,14 +627,8 @@ local function CalcFillSolid( nPartId, nOutlineLayerId, nGeoLayerId) local nSolidLayerId = EgtGroup( nPartId) EgtSetName( nSolidLayerId, WIN_SOLID) -- creo compo di outline - local OutlineList ={} - local nFirstSideId = EgtGetFirstInGroup( nOutlineLayerId) - local nOutlineId = nFirstSideId - while nOutlineId do - table.insert( OutlineList, nOutlineId) - nOutlineId = EgtGetNext( nOutlineId) - end - local nCompoOutlineId = EgtCurveCompoByChain( nSolidLayerId, OutlineList, EgtSP( nFirstSideId), false) + 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) @@ -852,8 +836,19 @@ local function CreateFrameGeo( nOutlineId, nPrevOutlineId, nNextOutlineId, nStar end EgtSetName( nNextCurveId, WIN_GEO_RIGHT) + -- riordino le curve per eseguire correttamente il trim + EgtRelocateGlob( nNextCurveId, nCurrCurveId, GDB_IN.AFTER) + EgtRelocateGlob( nCurrOffsetId, nNextCurveId, GDB_IN.AFTER) + EgtRelocateGlob( nPrevCurveId, nCurrOffsetId, GDB_IN.AFTER) + + -- trim delle curve + TrimAndOrientOrderedCurveLayer( nGeoLayerId) + + -- salvo spessore serramento nella curva out local dGeoWidth = b3CurrProfileFrame:getDimX() - return nCurrCurveId, nCurrOffsetId, nPrevCurveId, nNextCurveId, dGeoWidth + EgtSetInfo( nCurrCurveId, WIN_GEOWIDTH, dGeoWidth) + + return nCurrCurveId end --------------------------------------------------------------------- @@ -909,61 +904,9 @@ local function CalcFrameGeo( nPartId, nOutlineId, nOutlineLayerId, bBottomRail) end -- creo lati dell'outline - local nCurrCurveId, nCurrOffsetId, nPrevCurveId, nNextCurveId, dGeoWidth = CreateFrameGeo( nOutlineId, nPrevOutlineId, nNextOutlineId, nStartPartJointType, nEndPartJointType, nProfileType, nGeoLayerId, bBottomRail) - - -- trim delle curve - -- se le curve fossero ordinate correttamente ( out-right-in-left) potresti usare la funzione TrimAndOrientOrderedCurveLayer( nGeoLayerId) - -- calcolo punti di intersezione - local ptIntersCurrPrev = EgtIP( nCurrCurveId, nPrevCurveId, EgtSP( nCurrCurveId)) - if not ptIntersCurrPrev then - -- allungo per intersecare - EgtExtendCurveStartByLen( nCurrCurveId, 200) - EgtExtendCurveEndByLen( nPrevCurveId, 200) - ptIntersCurrPrev = EgtIP( nCurrCurveId, nPrevCurveId, EgtSP( nCurrCurveId)) - end - local ptIntersCurrNext = EgtIP( nCurrCurveId, nNextCurveId, EgtEP( nCurrCurveId)) - if not ptIntersCurrNext then - -- allungo per intersecare - EgtExtendCurveEndByLen( nCurrCurveId, 200) - EgtExtendCurveStartByLen( nNextCurveId, 200) - ptIntersCurrNext = EgtIP( nCurrCurveId, nNextCurveId, EgtEP( nCurrCurveId)) - end - local ptIntersCurrOffsetPrev = EgtIP( nCurrOffsetId, nPrevCurveId, EgtEP( nCurrOffsetId)) - if not ptIntersCurrOffsetPrev then - -- allungo per intersecare - EgtExtendCurveEndByLen( nCurrOffsetId, 1000) - EgtExtendCurveStartByLen( nPrevCurveId, 200) - ptIntersCurrOffsetPrev = EgtIP( nCurrOffsetId, nPrevCurveId, EgtEP( nCurrOffsetId)) - end - local ptIntersCurrOffsetNext = EgtIP( nCurrOffsetId, nNextCurveId, EgtSP( nCurrOffsetId)) - if not ptIntersCurrOffsetNext then - -- allungo per intersecare - EgtExtendCurveStartByLen( nCurrOffsetId, 1000) - EgtExtendCurveStartByLen( nNextCurveId, 200) - ptIntersCurrOffsetNext = EgtIP( nCurrOffsetId, nNextCurveId, EgtSP( nCurrOffsetId)) - end - -- calcolo accorciamenti dei lati copiati alle intersezioni - local dIntersCurrPrevParam = EgtCurveParamAtPoint( nCurrCurveId, ptIntersCurrPrev) - EgtTrimCurveStartAtParam( nCurrCurveId, dIntersCurrPrevParam) - local dIntersCurrNextParam = EgtCurveParamAtPoint( nCurrCurveId, ptIntersCurrNext) - EgtTrimCurveEndAtParam( nCurrCurveId, dIntersCurrNextParam) - local dIntersCurrOffsetNextParam = EgtCurveParamAtPoint( nCurrOffsetId, ptIntersCurrOffsetNext) - EgtTrimCurveStartAtParam( nCurrOffsetId, dIntersCurrOffsetNextParam) - local dIntersCurrOffsetPrevParam = EgtCurveParamAtPoint( nCurrOffsetId, ptIntersCurrOffsetPrev) - EgtTrimCurveEndAtParam( nCurrOffsetId, dIntersCurrOffsetPrevParam) - local dIntersPrevOffsetParam = EgtCurveParamAtPoint( nPrevCurveId, ptIntersCurrOffsetPrev) - EgtTrimCurveStartAtParam( nPrevCurveId, dIntersPrevOffsetParam) - local dIntersPrevCurrParam = EgtCurveParamAtPoint( nPrevCurveId, ptIntersCurrPrev) - EgtTrimCurveEndAtParam( nPrevCurveId, dIntersPrevCurrParam) - local dIntersNextCurrParam = EgtCurveParamAtPoint( nNextCurveId, ptIntersCurrNext) - EgtTrimCurveStartAtParam( nNextCurveId, dIntersNextCurrParam) - local dIntersNextOffsetParam = EgtCurveParamAtPoint( nNextCurveId, ptIntersCurrOffsetNext) - EgtTrimCurveEndAtParam( nNextCurveId, dIntersNextOffsetParam) + local nGeoOutId = CreateFrameGeo( nOutlineId, nPrevOutlineId, nNextOutlineId, nStartPartJointType, nEndPartJointType, nProfileType, nGeoLayerId, bBottomRail) - -- salvo spessore serramento in geo - EgtSetInfo( nCurrCurveId, WIN_GEOWIDTH, dGeoWidth) - - return nCurrCurveId + return nGeoOutId end --------------------------------------------------------------------- @@ -1009,9 +952,262 @@ local function CalcStartEndProfileType( nProfileType, nOutlineId, nStartProfileI return sStartProfileType, sEndProfileType, StartJointType, EndJointType end +--------------------------------------------------------------------- +local function AddDowelStart( nOutlineId, nPrevOutlineId, StartJointType, nMainProfileId, nStartProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, + nMainExtrusionId, nStartExtrusionId, nExtrCopyId) + + local sOutlineName = EgtGetName( nOutlineId) + local sPrevOutlineName = EgtGetName( nPrevOutlineId) + + local nStartGuideId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_STARTGUIDE) + + if StartJointType == WIN_PART_JNT.ANGLED then + + elseif StartJointType == 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( nStartProfileId, WIN_SECTIONFRAME) + local frOrig = EgtFR( nFrameProfile, GDB_ID.ROOT) + frOrig:invert() + -- calcolo il riferimento su cui posizionare i dowel + local ptInt = EgtIP( nGeoInId, nStartGuideId, ORIG(), GDB_ID.ROOT) + local dParRef = EgtCurveParamAtPoint( nStartGuideId, ptInt) + local vtRef = EgtUV( nStartGuideId, dParRef, -1, GDB_ID.ROOT) + local frDest = Frame3d( ptInt, - vtRef) + + -- ciclo sui fori trovati + local nOrigDowelId = EgtGetFirstNameInGroup( nStartProfileId, WIN_DOWEL .. '*') + while nOrigDowelId do + local dStart = EgtGetInfo( nOrigDowelId, sStart, 'd') + if not dStart then + dStart = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPERPSTART, 'd') or 0 + 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 il dowel grazie ai riferimenti e assegno estrusione e spessore + EgtTransform( nDowelId, frOrig, GDB_RT.GLOB) + EgtTransform( nDowelId, frDest, GDB_RT.GLOB) + EgtMove( nDowelId, dStart * vtRef) + EgtModifyCurveExtrusion( nDowelId, vtRef) + EgtModifyCurveThickness( nDowelId, dEnd - dStart) + -- creo solido di estrusione + local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtRef * ( dEnd - dStart + 1)) + EgtMove( nDowelExtrusionId, - vtRef) + EgtInvertSurf( nDowelExtrusionId) + -- taglio estrusi per ottenere solido + EgtSurfTmCut( nMainExtrusionId, nDowelExtrusionId, true, false) + EgtSurfTmCut( nDowelExtrusionId, nExtrCopyId, true, false) + + nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') + end + + elseif StartJointType == WIN_PART_JNT.SHORT then + -- recupero info di profondita' d'inizio e fine in base al profilo dello start + local sStart = WIN_DWL_TOPPARASTART + local sEnd = WIN_DWL_TOPPARAEND + if sPrevOutlineName == WIN_BOTTOM then + sStart = WIN_DWL_BOTTOMPARASTART + sEnd = WIN_DWL_BOTTOMPARAEND + end + if sOutlineName == WIN_SPLIT then + local sStartProfileType = EgtGetInfo( nStartProfileId, WIN_PRF_TYPE) + if sStartProfileType == WIN_RAIL_BOTTOM then + sStart = WIN_DWL_RAILBOTTOMPARASTART + sEnd = WIN_DWL_RAILBOTTOMPARAEND + elseif sStartProfileType == WIN_SASH_HORIZONTAL then + sStart = WIN_DWL_HORIZONTALSPLITPARASTART + sEnd = WIN_DWL_HORIZONTALSPLITPARAEND + elseif sStartProfileType == WIN_SASH_VERTICAL then + sStart = WIN_DWL_VERTICALSPLITPARASTART + sEnd = WIN_DWL_VERTICALSPLITPARAEND + elseif sStartProfileType == WIN_FRAME_SPLIT or sStartProfileType == 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 ptInt = EgtIP( nOutlineId, nStartGuideId, ORIG(), GDB_ID.ROOT) + local dParRef = EgtCurveParamAtPoint( nOutlineId, ptInt) + local vtRef = EgtUV( nOutlineId, dParRef, -1, GDB_ID.ROOT) + 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 il dowel 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) + -- creo solido di estrusione + local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtRef * ( dEnd - dStart + 1)) + EgtMove( nDowelExtrusionId, - vtRef) + 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 .. '*') + end + end +end + +--------------------------------------------------------------------- +local function AddDowelEnd( nOutlineId, nEndOutlineId, EndJointType, nMainProfileId, nEndProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, + nMainExtrusionId, nEndExtrusionId, nExtrCopyId) + + local sOutlineName = EgtGetName( nOutlineId) + local sEndOutlineName = EgtGetName( nEndOutlineId) + + local nEndGuideId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_ENDGUIDE) + + if EndJointType == WIN_PART_JNT.ANGLED then + + elseif EndJointType == 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 = EgtIP( nGeoInId, nEndGuideId, ORIG(), GDB_ID.ROOT) + local dParRef = EgtCurveParamAtPoint( nEndGuideId, ptInt) + local vtRef = EgtUV( nEndGuideId, dParRef, -1, GDB_ID.ROOT) + 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 + 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) + -- creo solido di estrusione + local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, - vtRef * ( dEnd - dStart + 1)) + EgtMove( nDowelExtrusionId, vtRef) + EgtInvertSurf( nDowelExtrusionId) + -- taglio estrusi per ottenere solido + EgtSurfTmCut( nMainExtrusionId, nDowelExtrusionId, true, false) + EgtSurfTmCut( nDowelExtrusionId, nExtrCopyId, true, false) + + nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') + end + + elseif EndJointType == 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 ptInt = EgtIP( nOutlineId, nEndGuideId, ORIG(), GDB_ID.ROOT) + local dParRef = EgtCurveParamAtPoint( nOutlineId, ptInt) + local vtRef = EgtUV( nOutlineId, dParRef, -1, GDB_ID.ROOT) + 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) + -- creo solido di estrusione + local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, - vtRef * ( dEnd - dStart + 1)) + EgtMove( nDowelExtrusionId, vtRef) + EgtInvertSurf( nDowelExtrusionId) + -- taglio estrusi per ottenere solido + local nDowelExtrCopyId = EgtCopy( nDowelExtrusionId, nSolidLayerId) + EgtSurfTmCut( nDowelExtrusionId, nEndExtrusionId, true, false) + EgtSurfTmCut( nEndExtrusionId, nDowelExtrCopyId, true, false) + EgtErase( nDowelExtrCopyId) + + nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') + end + end +end + --------------------------------------------------------------------- -- funzione che posiziona i profili, li estrude e crea il solido -local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartProfileId, nEndProfileId, nProfileType, nSolidLayerId, nAreaType) +local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartProfileId, nEndProfileId, nProfileType, nSolidLayerId, nDowelLayerId) -- recupero outline local nPartId = EgtGetParent( nSolidLayerId) local nGeoLayerId = EgtGetParent( nGeoId) @@ -1019,6 +1215,7 @@ local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartP -- recupero geo local nPrevGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_LEFT) local nNextGeoId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_RIGHT) + local nGeoInId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN) -- recupero BBox e larghezza del geo local dGeoWidth = EgtGetInfo( nGeoId, WIN_GEOWIDTH, 'd') @@ -1051,6 +1248,7 @@ local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartP EgtSetName( nOrigMainExtrusionId, WIN_SRF_ORIGMAIN) EgtSetStatus( nOrigMainExtrusionId, GDB_ST.OFF) + -- b) START PROFILE -- posiziono il profilo Start local nRefStartProfileId = EgtGetFirstNameInGroup( nStartProfileId, WIN_REF) @@ -1126,108 +1324,9 @@ local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartP EgtSurfTmCut( nStartExtrusionId, nExtrCopyId, true, false) -- creo fori per spine su Start - local nDowelLayerId = EgtGroup( nPartId) - EgtSetName( nDowelLayerId, WIN_DOWEL) - - local sOutlineName = EgtGetName( nOutlineId) - local sPrevOutlineName = EgtGetName( nPrevOutlineId) - if StartJointType == WIN_PART_JNT.ANGLED then - - elseif StartJointType == 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) - -- ciclo sui fori trovati - local nOrigDowelId = EgtGetFirstNameInGroup( nStartProfileId, 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 StartJointType == WIN_PART_JNT.SHORT then - -- recupero info di profondita' d'inizio e fine in base al profilo dello start - local sStart = WIN_DWL_TOPPARASTART - local sEnd = WIN_DWL_TOPPARAEND - if sPrevOutlineName == WIN_BOTTOM then - sStart = WIN_DWL_BOTTOMPARASTART - sEnd = WIN_DWL_BOTTOMPARAEND - end - if sOutlineName == WIN_SPLIT then - local sStartProfileType = EgtGetInfo( nStartProfileId, WIN_PRF_TYPE) - if sStartProfileType == WIN_RAIL_BOTTOM then - sStart = WIN_DWL_RAILBOTTOMPARASTART - sEnd = WIN_DWL_RAILBOTTOMPARAEND - elseif sStartProfileType == WIN_SASH_HORIZONTAL then - sStart = WIN_DWL_HORIZONTALSPLITPARASTART - sEnd = WIN_DWL_HORIZONTALSPLITPARAEND - elseif sStartProfileType == WIN_SASH_VERTICAL then - sStart = WIN_DWL_VERTICALSPLITPARASTART - sEnd = WIN_DWL_VERTICALSPLITPARAEND - elseif sStartProfileType == WIN_FRAME_SPLIT or sStartProfileType == WIN_SASH_SPLIT then - sStart = WIN_DWL_SPLITPARASTART - sEnd = WIN_DWL_SPLITPARAEND - end - end - -- 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') - end - local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd') - if not dEnd then - dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARAEND, 'd') - end - -- 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) - 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 - + AddDowelStart( nOutlineId, nPrevOutlineId, StartJointType, nMainProfileId, nStartProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, nMainExtrusionId, nStartExtrusionId, nExtrCopyId) + + -- c) END PROFILE -- posiziono il profilo End local nRefEndProfileId = EgtGetFirstNameInGroup( nEndProfileId, WIN_REF) @@ -1297,102 +1396,10 @@ local function MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartP -- taglio estrusi per ottenere solido EgtSurfTmCut( nMainExtrusionId, nEndExtrusionId, true, false) EgtSurfTmCut( nEndExtrusionId, nExtrCopyId, true, false) + -- creo fori per spine su End - local sEndOutlineName = EgtGetName( nEndOutlineId) - if EndJointType == WIN_PART_JNT.ANGLED then - - elseif EndJointType == 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) - -- 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') - 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 vtPerpEndPoint = EgtEV( nOutlineId) - vtPerpEndPoint:rotate( Z_AX(), 90) - -- posiziono i fori e gli assegno estrusione e spessore - EgtMove( nDowelId, ( EgtSP( nInGeoId) - ptDowelCenter) * vtPerpEndPoint * vtPerpEndPoint - vtPerpEndPoint * dStart) - EgtModifyCurveExtrusion( nDowelId, - vtPerpEndPoint) - EgtModifyCurveThickness( nDowelId, dEnd - dStart) - -- creo solido di estrusione - local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, - vtPerpEndPoint * ( dEnd - dStart + 1)) - EgtMove( nDowelExtrusionId, vtPerpEndPoint) - EgtInvertSurf( nDowelExtrusionId) - -- taglio estrusi per ottenere solido - EgtSurfTmCut( nMainExtrusionId, nDowelExtrusionId, true, false) - EgtSurfTmCut( nDowelExtrusionId, nExtrCopyId, true, false) - nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') - end - elseif EndJointType == 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 -- sOutlineName == WIN_BOTTOM or 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 -- sProfileType == WIN_FRAME_SPLIT - sStart = WIN_DWL_SPLITPARASTART - sEnd = WIN_DWL_SPLITPARAEND - end - end - -- 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') - end - local dEnd = EgtGetInfo( nOrigDowelId, sEnd, 'd') - if not dEnd then - dEnd = EgtGetInfo( nOrigDowelId, WIN_DWL_TOPPARAEND, 'd') - end - -- 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 + AddDowelEnd( nOutlineId, nEndOutlineId, EndJointType, nMainProfileId, nEndProfileId, nDowelLayerId, nGeoInId, nSolidLayerId, nMainExtrusionId, nEndExtrusionId, nExtrCopyId) + -- elimino copia dell'estrusione principale EgtErase( { nExtrCopyId}) end @@ -1401,11 +1408,13 @@ end -- funzione che crea il solido del pezzo del telaio local function CalcFrameSolid( nPartId, nOutlineId, nGeoId, nOutlineLayerId, bBottomRail) - -- creo layer per solido e per profili di estrusione + -- creo layer per solido, per profili di estrusione e per i fori per spine local nSolidLayerId = EgtGroup( nPartId) EgtSetName( nSolidLayerId, WIN_SOLID) local nFrameProfileLayerId = EgtGroup( nPartId) EgtSetName( nFrameProfileLayerId, WIN_PROFILE) + local nDowelLayerId = EgtGroup( nPartId) + EgtSetName( nDowelLayerId, WIN_DOWEL) -- ricavo tipo di profilo local nProfileType = GetOutlineProfileType( nOutlineId, bBottomRail) @@ -1434,7 +1443,7 @@ local function CalcFrameSolid( nPartId, nOutlineId, nGeoId, nOutlineLayerId, bBo EgtSetName( nEndProfileId, WIN_PRF_END) -- creo solido dai profili - MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartProfileId, nEndProfileId, nProfileType, nSolidLayerId) + MakeSolidByExtrusion( nGeoId, nOutlineId, nMainProfileId, nStartProfileId, nEndProfileId, nProfileType, nSolidLayerId, nDowelLayerId) end --------------------------------------------------------------------- @@ -1446,7 +1455,7 @@ local function CreatePartFromOutline( nAreaLayerId, nOutlineId, bBottomRail) local nPartId = EgtGroup( GDB_ID.ROOT) -- se BottomRail, creo riferimento if bBottomRail then - EgtSetInfo( nOutlineId, WIN_BOTTOMRAIL, nPartId) + EgtSetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, nPartId) end -- recupero outline local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_OUTLINE) @@ -1574,31 +1583,23 @@ end local function CreateStripFromOutline( nAreaId, nOutlineId) -- recupero il pezzo associato ( prendendo quello di bottomrail se esiste) - local nPartId = EgtGetInfo( nOutlineId, WIN_BOTTOMRAIL, 'i') or EgtGetInfo( nOutlineId, WIN_REF_PART, 'i') + local nPartId = EgtGetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, 'i') or EgtGetInfo( nOutlineId, WIN_REF_PART, 'i') -- recupero layer per solido e per profili di estrusione local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) local nMainProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) - -- recupero il pezzo precedente ( prendendo eventualmente quello di bottomrail) + -- 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 nPrevOutlineId = EgtGetPrev( nOutlineId) - if not nPrevOutlineId then - nPrevOutlineId = EgtGetLastInGroup( nOutlineLayerId) - end - local nPrevPartId = EgtGetInfo( nPrevOutlineId, WIN_BOTTOMRAIL, 'i') or EgtGetInfo( nPrevOutlineId, WIN_REF_PART) - local nPrevProfileLayerId = EgtGetFirstNameInGroup( nPrevPartId, WIN_PROFILE) + local nPrevOutlineId, nNextOutlineId = GetPrevNextOutline( WIN_PRF.NULL, nOutlineId, nOutlineLayerId) + -- recupero i pezzi precedente e successivo, prendendo eventualmente quelli di bottomrail + local nPrevPartId = EgtGetInfo( nPrevOutlineId, WIN_REF_BOTTOMRAIL_PART, 'i') or EgtGetInfo( nPrevOutlineId, WIN_REF_PART) + local nNextPartId = EgtGetInfo( nNextOutlineId, WIN_REF_BOTTOMRAIL_PART, 'i') or EgtGetInfo( nNextOutlineId, WIN_REF_PART) - -- recupero il pezzo successivo ( prendendo eventualmente quello di bottomrail) - local nNextOutlineId = EgtGetNext( nOutlineId) - if not nNextOutlineId then - nNextOutlineId = EgtGetFirstInGroup( nOutlineLayerId) - end - local nNextPartId = EgtGetInfo( nNextOutlineId, WIN_BOTTOMRAIL, 'i') or EgtGetInfo( nNextOutlineId, WIN_REF_PART) - local nNextProfileLayerId = EgtGetFirstNameInGroup( nNextPartId, WIN_PROFILE) - -- recupero profilo e controprofili local nMainProfileId = EgtGetFirstNameInGroup( nMainProfileLayerId, WIN_PRF_MAIN) + local nPrevProfileLayerId = EgtGetFirstNameInGroup( nPrevPartId, WIN_PROFILE) local nStartProfileId = EgtGetFirstNameInGroup( nPrevProfileLayerId, WIN_PRF_MAIN) + local nNextProfileLayerId = EgtGetFirstNameInGroup( nNextPartId, WIN_PROFILE) local nEndProfileId = EgtGetFirstNameInGroup( nNextProfileLayerId, WIN_PRF_MAIN) -- a) estrudo il fermavetro @@ -1667,123 +1668,61 @@ end ---------------------------------------------------------------------------------- ------------------------------- SPLIT DOWELS ------------------------------------- ----------------------------------------------------------------------------------- -function WinCalculate.AddSplitDowelToParts( nAreaId) - -- se non ho calcolato i solidi, esco - if not bCalcSolid then - return - end - -- recupero tipo di area - local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i') - if nAreaType == WIN_AREATYPES.FRAME or nAreaType == WIN_AREATYPES.SASH then - -- recupero pezzi outline - local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_OUTLINE) - local nOutlineId = EgtGetFirstInGroup( nOutlineLayerId) - while nOutlineId do - WinCalculate.AddSplitDowelToExtrusion( nOutlineId, nAreaType, false) - -- se di tipo bottom - local sName = EgtGetName( nOutlineId) - if sName == WIN_BOTTOM then - -- se ha BottomRail - local nBottomRail = EgtGetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, 'i') - if nBottomRail and nBottomRail == 1 then - WinCalculate.AddSplitDowelToExtrusion( nOutlineId, nAreaType, true) - end - end - nOutlineId = EgtGetNext( nOutlineId) - end - end - -- verifico se c'e' uno split - local nSplitLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_SPLIT) - if nSplitLayerId then - local nSplitType = EgtGetInfo( nSplitLayerId, WIN_SPLITTYPE, 'i') - local bCalcSplit = false - -- se split di tipo montante - if nSplitType == WIN_SPLITTYPES.MULLION then - bCalcSplit = true - elseif nSplitType == WIN_SPLITTYPES.FRENCH then - bCalcSplit = false - else - -- o split dell'anta - local nParentArea = nAreaId - local nParentType = nAreaType - while nParentArea and nParentType ~= WIN_AREATYPES.FRAME and nParentType ~= WIN_AREATYPES.SASH do - nParentArea = EgtGetParent( nParentArea) - nParentType = EgtGetInfo( nParentArea, WIN_AREATYPE, 'i') - end - if nParentArea and nParentType == WIN_AREATYPES.SASH then - bCalcSplit = true - else - bCalcSplit = true - end - end - if bCalcSplit then - local nSplitId = EgtGetFirstInGroup( nSplitLayerId) - if nSplitId then - -- creo pezzo split - WinCalculate.AddSplitDowelToExtrusion( nSplitId, nAreaType, false) - end - end - end - -- verifico se ci sono aree - local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREA .. '*') - while nChildAreaId do - -- lancio costruzione pezzi di quell'area - WinCalculate.AddSplitDowelToParts( nChildAreaId) - nChildAreaId = EgtGetNextName( nChildAreaId, WIN_AREA .. '*') - end -end - ---------------------------------------------------------------------------------- -- funzione che calcola intersezione, geometrie e superfici dei dowel degli split -local function CalSplitDowel( nSplitLayerId, nOutlineId, nProfileFrameLayerId, nFrameProfileLayerId, nProfileType, nPartId, nSolidLayerId) +local function CalSplitDowel( nSplitLayerId, nOutlineId, nProfileType, nPartId) + + -- verifico se interseca l'outline che sto analizzando 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 + local ptInt = EgtIP( nOutlineId, nSplitId, EgtSP( nSplitId)) + if not ptInt then return end + -- se interseca, recupero il profilo dello split - local sSplitProfileType = EgtGetInfo( nSplitId, WIN_PROFILETYPE) - if not sSplitProfileType then - return - end + local nOrigSplitProfileId = GetOutlineProfileId( nSplitId, false) - local nOrigSplitProfileId = EgtGetFirstNameInGroup( nProfileFrameLayerId, sSplitProfileType) -- 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) + EgtSetInfo( nSplitProfileId, WIN_PRF_TYPE, sSplitProfileType) EgtSetName( nSplitProfileId, WIN_PRF_SPLIT) - -- recupero intersezione con lato In - local bIsGeoOut = false + + -- recupero intersezione con lato In o Out del geo local nGeoLayerId = EgtGetFirstNameInGroup( nPartId, WIN_GEO) - local nGeoInId = EgtGetFirstNameInGroup(nGeoLayerId, WIN_GEO_IN) - local ptIntersIn = EgtIP( nGeoInId, nSplitId, EgtSP( nSplitId)) - if not ptIntersIn and nProfileType == WIN_PRF.SPLIT then - bIsGeoOut = true - nGeoInId = EgtGetFirstNameInGroup(nGeoLayerId, WIN_GEO_OUT) - ptIntersIn = EgtIP( nGeoInId, nSplitId, EgtSP( nSplitId)) + local nGeoCrvId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_IN) + local ptInters = EgtIP( nGeoCrvId, nSplitId, EgtSP( nSplitId)) + if not ptInters and nProfileType == WIN_PRF.SPLIT then + nGeoCrvId = EgtGetFirstNameInGroup( nGeoLayerId, WIN_GEO_OUT) + ptInters = EgtIP( nGeoCrvId, nSplitId, EgtSP( nSplitId)) end - -- recupero frame del profilo + + -- recupero frame del profilo e lo applico a tutte le sue geometrie 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 - local vtDir = - EgtSV( nSplitId) - if bIsGeoOut then - vtDir = - vtDir + -- 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 - EgtChangeGroupFrame( nSplitProfileId, Frame3d( ptIntersIn, vtDir)) + -- recupero solido del pezzo local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) local nMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_MAIN) local nOrigMainExtrusionId = EgtGetFirstNameInGroup( nSolidLayerId, WIN_SRF_ORIGMAIN) + -- creo fori per spine su Split local nDowelLayerId = EgtGetFirstNameInGroup( nPartId, WIN_DOWEL) + -- recupero profondita' d'inizio e fine local sStart = WIN_DWL_TOPPERPSTART local sEnd = WIN_DWL_TOPPERPEND @@ -1798,6 +1737,7 @@ local function CalSplitDowel( nSplitLayerId, nOutlineId, nProfileFrameLayerId, n if sProfileType == WIN_SASH_HORIZONTAL then sStart = WIN_DWL_HORIZONTALSPLITPERPSTART sEnd = WIN_DWL_HORIZONTALSPLITPERPEND + -- sta sempre leggendo l'informazione corretta? ( cfr dowel per start ed end nella crezione del solido) elseif sProfileType == WIN_SASH_VERTICAL then sStart = WIN_DWL_VERTICALSPLITPERPSTART sEnd = WIN_DWL_VERTICALSPLITPERPEND @@ -1806,6 +1746,7 @@ local function CalSplitDowel( nSplitLayerId, nOutlineId, nProfileFrameLayerId, n sEnd = WIN_DWL_SPLITPERPEND end end + -- ciclo sui fori trovati local nOrigDowelId = EgtGetFirstNameInGroup( nSplitProfileId, WIN_DOWEL .. '*') while nOrigDowelId do @@ -1819,111 +1760,130 @@ local function CalSplitDowel( nSplitLayerId, nOutlineId, nProfileFrameLayerId, n end local nDowelId = EgtCopyGlob( nOrigDowelId, nDowelLayerId) EgtSetColor( nDowelId, Color3d( 128, 128, 128)) - local ptDowelCenter = EgtCP( nDowelId) - local vtPerpStartPoint = EgtSV( nOutlineId) - if bIsGeoOut then - vtPerpStartPoint:rotate( Z_AX(), -90) - else - vtPerpStartPoint:rotate( Z_AX(), 90) - end - -- posiziono i fori e gli assegno estrusione e spessore - EgtMove( nDowelId, ( EgtSP( nGeoInId) - ptDowelCenter) * vtPerpStartPoint * vtPerpStartPoint - vtPerpStartPoint * dStart) - -- EgtMove( nDowelId, Point3d( ptDowelCenter:getX(), EgtSP( nInGeoId):getY(), ptDowelCenter:getZ()) - ptDowelCenter - vtPerpStartPoint * dStart) - EgtModifyCurveExtrusion( nDowelId, - vtPerpStartPoint) + + -- posiziono il dowel e gli assegno estrusione e spessore + EgtMove( nDowelId, vtDowelDir * dStart) + EgtModifyCurveExtrusion( nDowelId, vtDowelDir) EgtModifyCurveThickness( nDowelId, dEnd - dStart) -- creo solido di estrusione - local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, - vtPerpStartPoint * ( dEnd - dStart + 1)) - EgtMove( nDowelExtrusionId, vtPerpStartPoint) + local nDowelExtrusionId = EgtSurfTmByRegionExtrusion( nSolidLayerId, nDowelId, vtDowelDir * ( dEnd - dStart + 1)) + EgtMove( nDowelExtrusionId, - vtDowelDir) EgtInvertSurf( nDowelExtrusionId) -- taglio estrusi per ottenere solido - --local nExtrCopyId = EgtCopy( nMainExtrusionId, nSolidLayerId) EgtSurfTmCut( nMainExtrusionId, nDowelExtrusionId, true, false) EgtSurfTmCut( nDowelExtrusionId, nOrigMainExtrusionId, true, false) - --EgtErase( nExtrCopyId) + nOrigDowelId = EgtGetNextName( nOrigDowelId, WIN_DOWEL .. '*') end end ---------------------------------------------------------------------------------- -- funzione ricorsiva che cerca gli split che possono dare origine a dei dowel -local function VerifyDowelArea( nAreaLayerId, nOutlineId, nPartId, nProfileType, nOrigAreaType) - --EgtSaveFile('c://Temp//DowelSplit.nge') - -- recupero profilo - local nProfileLayerId = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_PROFILE) - local nProfileFrameLayerId - if nOrigAreaType == WIN_AREATYPES.FRAME then - nProfileFrameLayerId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_FRAME) - elseif nOrigAreaType == WIN_AREATYPES.SASH then - nProfileFrameLayerId = EgtGetFirstNameInGroup( nProfileLayerId, WIN_SASH) - end - -- creo layer per solido e per profili di estrusione - local nSolidLayerId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) - local nFrameProfileLayerId = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) --- verifico la presenza di eventuali Split +local function VerifyDowelArea( nAreaLayerId, nOutlineId, nProfileType, nPartId) + + -- verifico la presenza di eventuali Split local nSplitLayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_SPLIT) if nSplitLayerId then - CalSplitDowel( nSplitLayerId, nOutlineId, nProfileFrameLayerId, nFrameProfileLayerId, nProfileType, nPartId, nSolidLayerId) + local nSplitType = EgtGetInfo( nSplitLayerId, WIN_SPLITTYPE, 'i') or WIN_SPLITTYPES.NULL + if nSplitType ~= WIN_SPLITTYPES.FRENCH then + CalSplitDowel( nSplitLayerId, nOutlineId, nProfileType, nPartId) + end end + -- verifico la presenza di split in sotto aree local nArea1LayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_AREA1) if nArea1LayerId then local nAreaType = EgtGetInfo( nArea1LayerId, WIN_AREATYPE, 'i') if nAreaType == WIN_AREATYPES.SPLIT then - VerifyDowelArea( nArea1LayerId, nOutlineId, nPartId, nProfileType, nOrigAreaType) + VerifyDowelArea( nArea1LayerId, nOutlineId, nProfileType, nPartId) end end local nArea2LayerId = EgtGetFirstNameInGroup( nAreaLayerId, WIN_AREA2) if nArea2LayerId then local nAreaType = EgtGetInfo( nArea2LayerId, WIN_AREATYPE, 'i') if nAreaType == WIN_AREATYPES.SPLIT then - VerifyDowelArea( nArea2LayerId, nOutlineId, nPartId, nProfileType, nOrigAreaType) + VerifyDowelArea( nArea2LayerId, nOutlineId, nProfileType, nPartId) end end end ---------------------------------------------------------------------------------- -- funzione che posiziona i fori delle spine degli split, li estrude e crea il solido -function WinCalculate.AddSplitDowelToExtrusion(nOutlineId, nAreaType, bIsBottomRail) - -- ricavo tipo dal +local function AddSplitDowelToExtrusion( nOutlineId, bIsBottomRail) + + -- ricavo pezzo associato local sPartRef = WIN_REF_PART if bIsBottomRail then - sPartRef = WIN_BOTTOMRAIL + sPartRef = WIN_REF_BOTTOMRAIL_PART end local nPartId = EgtGetInfo( nOutlineId, sPartRef, 'i') - local sName = EgtGetName( nPartId) - local nProfileType = WIN_PRF.NULL - if bIsBottomRail then - nProfileType = WIN_PRF.BOTTOMRAIL - elseif sName == WIN_TOP then - nProfileType = WIN_PRF.TOP - elseif sName == WIN_BOTTOM then - nProfileType = WIN_PRF.BOTTOM - elseif sName == WIN_LEFT then - nProfileType = WIN_PRF.LEFT - elseif sName == WIN_RIGHT then - nProfileType = WIN_PRF.RIGHT - elseif sName == WIN_VERTICAL then - nProfileType = WIN_PRF.VERTICAL - elseif sName == WIN_HORIZONTAL then - nProfileType = WIN_PRF.HORIZONTAL - elseif sName == WIN_SPLIT then - nProfileType = WIN_PRF.SPLIT - end - -- recupero l'area di cui fa parte il pezzo + + -- ricavo tipo di profilo + local nProfileType = GetOutlineProfileType( nOutlineId, bIsBottomRail) + + -- se profilo Bottom con BottomRail, esco ( gli split dowels saranno fatti sul BottomRail) local nOutlineLayerId = EgtGetParent( nOutlineId) - 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 + local bBottomRail = EgtGetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, 'b') or false + if bBottomRail then return end end + + -- recupero l'area di cui fa parte il pezzo + local nAreaLayerId = EgtGetParent( nOutlineLayerId) + -- verifico la presenza di eventuali Split - VerifyDowelArea( nAreaLayerId, nOutlineId, nPartId, nProfileType, nAreaType) + VerifyDowelArea( nAreaLayerId, nOutlineId, nProfileType, nPartId) end +---------------------------------------------------------------------------------- +function WinCalculate.AddSplitDowelToParts( nAreaId) + -- se non ho calcolato i solidi, esco + if not bCalcSolid then + return + end + -- recupero tipo di area + local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i') + if nAreaType == WIN_AREATYPES.FRAME or nAreaType == WIN_AREATYPES.SASH then + -- recupero pezzi outline + local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_OUTLINE) + local nOutlineId = EgtGetFirstInGroup( nOutlineLayerId) + while nOutlineId do + AddSplitDowelToExtrusion( nOutlineId, false) + -- se di tipo bottom + local sName = EgtGetName( nOutlineId) + if sName == WIN_BOTTOM then + -- se ha BottomRail + local bBottomRail = EgtGetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, 'b') or false + if bBottomRail then + AddSplitDowelToExtrusion( nOutlineId, true) + end + end + nOutlineId = EgtGetNext( nOutlineId) + end + end + -- verifico se c'e' uno split + local nSplitLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_SPLIT) + if nSplitLayerId then + local nSplitType = EgtGetInfo( nSplitLayerId, WIN_SPLITTYPE, 'i') or WIN_SPLITTYPES.NULL + -- se split ha pezzo associato + if nSplitType ~= WIN_SPLITTYPES.FRENCH then + local nSplitId = EgtGetFirstInGroup( nSplitLayerId) + if nSplitId then + AddSplitDowelToExtrusion( nSplitId, false) + end + end + end + + -- verifico se ci sono aree + local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREA .. '*') + while nChildAreaId do + -- lancio costruzione pezzi di quell'area + WinCalculate.AddSplitDowelToParts( nChildAreaId) + nChildAreaId = EgtGetNextName( nChildAreaId, WIN_AREA .. '*') + end +end --------------------------------------------------------------------- ------------------------- FUNZIONI ---------------------------------- @@ -1932,7 +1892,7 @@ end function WinCalculate.CreatePartFromArea( nAreaId) -- assengo il tipo di profilo alle curve del base outline - CalcProfileType(nAreaId) + CalcProfileType( nAreaId) -- calcolo outline a partire dal base outline CalculateOutlineFromAreaOutline( nAreaId) @@ -1974,36 +1934,18 @@ function WinCalculate.CreatePartFromArea( nAreaId) end end elseif nAreaType ~= WIN_AREATYPES.FILL then - if WinCalculate.GetCalcSolid() then - -- verifico se c'e' un'area Sash prima di questa - local nParentAreaId = nAreaId - local nParentAreaType = EgtGetInfo( nParentAreaId, WIN_AREATYPE, "i") - while nParentAreaId and nParentAreaType and nParentAreaType ~= WIN_AREATYPES.SASH do - nParentAreaId = EgtGetParent( nParentAreaId) - nParentAreaType = EgtGetInfo( nParentAreaId, WIN_AREATYPE, "i") - end - if nParentAreaId and nParentAreaType == WIN_AREATYPES.SASH then - -- calcolo strip dell'outline - -- è uguale al codice sotto per area child di tipo fill??? + if bCalcSolid then + --- verifico se area successiva e' un fill + local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREAASTERISK) + local nChildAreaType = EgtGetInfo( nChildAreaId, WIN_AREATYPE, "i") + if nChildAreaType == WIN_AREATYPES.FILL then + -- se lo e', vuol dire che e' un vetro fisso, quindi calcolo strip dell'outline local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_OUTLINE) local nOutlineId = EgtGetFirstInGroup( nOutlineLayerId) while nOutlineId do CreateStripFromOutline( nAreaId, nOutlineId) nOutlineId = EgtGetNext( nOutlineId) end - else - --- verifico se area successiva e' un fill - local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREAASTERISK) - local nChildAreaType = EgtGetInfo( nChildAreaId, WIN_AREATYPE, "i") - if nChildAreaType == WIN_AREATYPES.FILL then - -- se lo e', vuol dire che e' un vetro fisso, quindi calcolo strip dell'outline - local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_OUTLINE) - local nOutlineId = EgtGetFirstInGroup( nOutlineLayerId) - while nOutlineId do - CreateStripFromOutline( nAreaId, nOutlineId) - nOutlineId = EgtGetNext( nOutlineId) - end - end end end end