From 7c859b000bf4921c8a82ded8e617ecc2b19ac877 Mon Sep 17 00:00:00 2001 From: SaraP Date: Thu, 27 Mar 2025 14:33:32 +0100 Subject: [PATCH] DataWindow : - gestione zoccoli. --- Designing/WinConst.lua | 6 +- Designing/WinLib/WinCalculate.lua | 262 ++++++++++++++++++++++-------- Designing/WinLib/WinCreate.lua | 4 +- Designing/WinProject.lua | 58 +++---- 4 files changed, 231 insertions(+), 99 deletions(-) diff --git a/Designing/WinConst.lua b/Designing/WinConst.lua index 90854c2..7a8ec00 100644 --- a/Designing/WinConst.lua +++ b/Designing/WinConst.lua @@ -54,6 +54,7 @@ WIN_PRF = { HORIZONTAL = 6, SPLIT = 7, BOTTOMRAIL = 8, + BOTTOMRAIL_FINAL = 9, } -- Tipi di split @@ -179,11 +180,13 @@ WIN_SASH_TOP = 'Sash_Top' WIN_SASH_BOTTOM = 'Sash_Bottom' WIN_SASH_VERTICAL = 'Sash_Vertical' WIN_SASH_HORIZONTAL = 'Sash_Horizontal' -WIN_RAIL_BOTTOM = 'Rail_Bottom' WIN_FRAME_TOP = 'Frame_Top' WIN_FRAME_BOTTOM = 'Frame_Bottom' WIN_FIXED_TOP = 'Fixed_Top' WIN_FIXED_BOTTOM = 'Fixed_Bottom' +WIN_RAIL_BOTTOM = 'Rail_Bottom' +WIN_RAIL = 'Rail' +WIN_FILL_RAIL = 'Fill_Rail' WIN_SASH_ACTIVE = 'Sash_Active' WIN_SASH_INACTIVE = 'Sash_Inactive' WIN_FRENCH_IN = 'French_In' @@ -270,6 +273,7 @@ WIN_SASH_BOTTOM_OVERLAP = 'SashBottomOverlap' WIN_DELTA = 'Delta' WIN_FILLOVERLAP = 'FillOverlap' WIN_FILLDELTA = 'FillDelta' +WIN_RAILDELTA = 'RailDelta' WIN_GAPDELTA = 'GapDelta' WIN_GAPDELTAZ = 'GapDeltaZ' WIN_GAPDELTAIN = 'GapDeltaIn' diff --git a/Designing/WinLib/WinCalculate.lua b/Designing/WinLib/WinCalculate.lua index 1fb1431..6664f6f 100644 --- a/Designing/WinLib/WinCalculate.lua +++ b/Designing/WinLib/WinCalculate.lua @@ -83,11 +83,28 @@ local function FindIntersectionPoint( nCrv1, nCrv2, ptRef) else EgtExtendCurveEndByLen( nLine, 10000) end - -- ricavo il punto di riferimento dalla circonferenza - local ptNewRef = EgtIf( nArc == nCrv2, EgtEP( nArc), EgtSP( nArc)) - -- trovo l'intersezione tra retta e circonferenza - ptInt = EgtIP( nCircle, nLine, ptNewRef) + -- trovo le intersezioni tra retta e circonferenza + local nId1, nPoints = EgtCurveCurveInters( nCircle, nLine, GDB_ID.ROOT) + if nPoints == 1 then + ptInt = EgtSP( nId1) + EgtErase( nId1) + else + -- conservo quello più vicino al punto di riferimento + local ptInt1 = EgtSP( nId1) + local ptInt2 = EgtSP( nId1 + 1) + local ptNewRef = EgtIf( nArc == nCrv2, EgtEP( nArc), EgtSP( nArc)) + local dDist1 = dist( ptNewRef, ptInt1) + local dDist2 = dist( ptNewRef, ptInt2) + if dDist1 < dDist2 + GEO.EPS_SMALL then + ptInt = ptInt1 + else + ptInt = ptInt2 + end + EgtErase( nId1) + EgtErase( nId1 + 1) + end EgtErase( nCircle) + -- allungo l'arco per arrivare al punto di intersezione if nArc == nCrv2 then EgtModifyCurveEndPoint( nArc, ptInt) @@ -96,14 +113,14 @@ local function FindIntersectionPoint( nCrv1, nCrv2, ptRef) end else - ptInt = EgtIP( nCrv1, nCrv2, ptRef) + ptInt = EgtIP( nCrv1, nCrv2, ORIG()) if not ptInt then -- tento estendendo le curve EgtExtendCurveStartByLen( nCrv1, 10000) EgtExtendCurveEndByLen( nCrv1, 10000) EgtExtendCurveStartByLen( nCrv2, 10000) EgtExtendCurveEndByLen( nCrv2, 10000) - ptInt = EgtIP( nCrv1, nCrv2, ptRef) + ptInt = EgtIP( nCrv1, nCrv2, ORIG()) end end @@ -164,7 +181,7 @@ end --------------------------------------------------------------------- -- funzione che data una curva di outline restituisce l'id del suo profilo -local function GetOutlineProfileId( nOutlineId, bUseBottomRail) +local function GetOutlineProfileId( nOutlineId, bForceBottomRail, nProfileType) -- ciclo fino a trovare il primo parent che abbia un AreaType definito ( frame o sash) local nParentId = EgtGetParent( nOutlineId) @@ -186,17 +203,18 @@ local function GetOutlineProfileId( nOutlineId, bUseBottomRail) -- recupero il nome del profilo local sProfileName = EgtGetInfo( nOutlineId, WIN_PROFILETYPE) - -- verifico se bottom rail - if bUseBottomRail then - local nOutlineLay = EgtGetFirstNameInGroup( nParentId, WIN_AREAOUTLINE) - local bBottomRail = EgtGetInfo( nOutlineLay, WIN_BOTTOMRAIL, 'b') or false - local sOutlineName = EgtGetName( nOutlineId) - if sOutlineName == WIN_BOTTOM and bBottomRail then - -- allora imposto profilo BottomRail - sProfileName = WIN_RAIL_BOTTOM + -- controlli per bottomrail + if EgtGetName( nOutlineId) == WIN_BOTTOM and bForceBottomRail then + local nBottomRailTot = EgtGetInfo( nOutlineId, WIN_BOTTOMRAIL, 'i') or 0 + if nBottomRailTot > 0 then + sProfileName = WIN_FILL_RAIL end + elseif nProfileType == WIN_PRF.BOTTOMRAIL then + sProfileName = WIN_RAIL + elseif nProfileType == WIN_PRF.BOTTOMRAIL_FINAL then + sProfileName = WIN_FILL_RAIL end - + -- recupero il profilo return EgtGetFirstNameInGroup( nLayerId, sProfileName) end @@ -205,7 +223,8 @@ end -- funzione che recupera il pezzo associato ad un outline local function FindAssociatedPart( nOutlineId) - local nPartId = EgtGetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, 'i') or EgtGetInfo( nOutlineId, WIN_REF_PART, 'i') + local nCrvId = nOutlineId + local nPartId = EgtGetInfo( nCrvId, WIN_REF_PART, 'i') if not nPartId then -- cerco la prima curva da cui deriva che ha un pezzo associato local nBaseOutline = EgtGetInfo( nOutlineId, WIN_COPY, 'i') @@ -216,12 +235,18 @@ local function FindAssociatedPart( nOutlineId) local sProfileType = EgtGetInfo( nBaseOutline, WIN_PROFILETYPE) if sProfileType then -- recupero l'outline associato - local nCrvId = EgtGetInfo( nBaseOutline, WIN_COPY, 'i') - nPartId = EgtGetInfo( nCrvId, WIN_REF_BOTTOMRAIL_PART, 'i') or EgtGetInfo( nCrvId, WIN_REF_PART, 'i') + nCrvId = EgtGetInfo( nBaseOutline, WIN_COPY, 'i') + nPartId = EgtGetInfo( nCrvId, WIN_REF_PART, 'i') end end end + -- verifico se ha bottomrail + local vBottomRailParts = EgtGetInfo( nCrvId, WIN_REF_BOTTOMRAIL_PART, 'vi') + if vBottomRailParts then + nPartId = vBottomRailParts[#vBottomRailParts] + end + return nPartId end @@ -509,8 +534,13 @@ local function CalcProfileType( nAreaId) -- c) se riempimento elseif nChildrenType == WIN_CHILDREN_TYPES.FILL then if sName == WIN_BOTTOM then - EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_FIXED_BOTTOM) - EgtSetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, true) + -- verifico presenza bottomrail + local nBottomRail = EgtGetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, 'i') or 0 + if nBottomRail == 0 then + EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_FIXED_BOTTOM) + else + EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_RAIL_BOTTOM) + end else EgtSetInfo( nOutlineId, WIN_PROFILETYPE, WIN_FIXED_TOP) end @@ -700,6 +730,10 @@ local function CalculateOutlineFromAreaOutline( nAreaId) local nOutlineId = EgtCopyGlob( nAreaOutlineId, nOutlineLayerId) EgtSetInfo( nAreaOutlineId, WIN_COPY, nOutlineId) EgtSetInfo( nOutlineId, WIN_COPY, nAreaOutlineId) + -- se bottom riporto informazione dei bottomrail + if EgtGetName( nOutlineId) == WIN_BOTTOM then + CopyInfo( nOutlineId, nOutlineLayerId, WIN_BOTTOMRAIL) + end nAreaOutlineId = EgtGetNext( nAreaOutlineId) end @@ -897,6 +931,7 @@ local function CalculateOutlineFromAreaOutline( nAreaId) end local nParentOutlineId = EgtGetInfo( nParentBaseOutlineId, WIN_COPY, 'i') local nParentProfileId = GetOutlineProfileId( nParentOutlineId, true) + sParentProfile = EgtGetName( nParentProfileId) -- calcolo il box del riferimento del profilo del frame local b3FrameProfile = GetProfileLocalBox( nParentProfileId) @@ -905,10 +940,18 @@ local function CalculateOutlineFromAreaOutline( nAreaId) local bMixedSplit = ( EgtGetInfo( nParentOutlineId, WIN_PRF_CHANGE, 'b') or false) and EgtGetName( nParentOutlineId) == WIN_SPLIT local dDimRef = EgtIf( bMixedSplit, b3FrameProfile:getMax():getX(), b3FrameProfile:getMin():getX()) local dFillPerpOffset = abs( dDimRef) - dOverlap - local dFillZOffset = EgtGetInfo( nParentProfileId, WIN_FILLDELTA, 'd') - - -- faccio offset e muovo in z + if sParentProfile == WIN_FILL_RAIL then + -- se bottom rail considero la distanza necessaria per il numero di bottomrail richiesti + local nBottomRails = EgtGetInfo( nParentOutlineId, WIN_BOTTOMRAIL, 'i') + local dRailDelta1 = EgtGetInfo( nParentProfileId, WIN_RAILDELTA .. '1', 'd') + local dRailDelta2 = EgtGetInfo( nParentProfileId, WIN_RAILDELTA .. '2', 'd') + dFillPerpOffset = dFillPerpOffset + dRailDelta1 + ( nBottomRails - 1) * dRailDelta2 + end + -- faccio offset EgtOffsetCurve( nOutlineId, - dFillPerpOffset) + + -- movimento in z + local dFillZOffset = EgtGetInfo( nParentProfileId, WIN_FILLDELTA, 'd') EgtMove( nOutlineId, Z_AX() * dFillZOffset) nBaseOutlineId = EgtGetNext( nBaseOutlineId) @@ -916,7 +959,7 @@ local function CalculateOutlineFromAreaOutline( nAreaId) -- accorcio gli offset TrimAndOrientOrderedCurves( EgtGetAllInGroup( nOutlineLayerId), true) end - + end --------------------------------------------------------------------- @@ -938,14 +981,26 @@ end ------------------------ FUNZIONI AUX PER CALCOLO PEZZI ------------------------ ---------------------------------------------------------------------------------- -- funzione che restituisce il WIN_PRF in base al nome della curva -local function GetOutlineProfileType( nOutlineId, bBottomRail) +local function GetOutlineProfileType( nOutlineId, bForceBottomRail, nBottomRail) -- ricavo tipo dal nome local sName = EgtGetName( nOutlineId) local nProfileType = WIN_PRF.NULL if sName == WIN_TOP then nProfileType = WIN_PRF.TOP elseif sName == WIN_BOTTOM then - nProfileType = EgtIf( bBottomRail, WIN_PRF.BOTTOMRAIL, WIN_PRF.BOTTOM) + local nBottomRailTot = EgtGetInfo( nOutlineId, WIN_BOTTOMRAIL, 'i') or 0 + if bForceBottomRail and nBottomRailTot > 0 then + nProfileType = WIN_PRF.BOTTOMRAIL_FINAL + elseif nBottomRail then + -- verifico se bottomrail intermedio o finale + if nBottomRail == nBottomRailTot then + nProfileType = WIN_PRF.BOTTOMRAIL_FINAL + else + nProfileType = WIN_PRF.BOTTOMRAIL + end + else + nProfileType = WIN_PRF.BOTTOM + end elseif sName == WIN_LEFT then nProfileType = WIN_PRF.LEFT elseif sName == WIN_RIGHT then @@ -1173,7 +1228,7 @@ local function CalcPartJointType( nProfileType, JointType) if JointType == WIN_JNT.ANGLED then return WIN_PART_JNT.ANGLED end - if nProfileType == WIN_PRF.BOTTOMRAIL or nProfileType == WIN_PRF.SPLIT then + if nProfileType == WIN_PRF.BOTTOMRAIL or nProfileType == WIN_PRF.BOTTOMRAIL_FINAL or nProfileType == WIN_PRF.SPLIT then return WIN_PART_JNT.SHORT elseif nProfileType == WIN_PRF.BOTTOM or nProfileType == WIN_PRF.TOP then if JointType == WIN_JNT.FULL_H then @@ -1190,9 +1245,18 @@ local function CalcPartJointType( nProfileType, JointType) end end +--------------------------------------------------------------------- +-- funzione che calcola e salva nel profilo il delta del bottomrail corrente rispetto alla sua curva di outline +local function SaveRailDelta( nProfileId, nBottomRail) + local dDelta1 = EgtGetInfo( nProfileId, WIN_RAILDELTA .. '1', 'd') + local dDelta2 = EgtGetInfo( nProfileId, WIN_RAILDELTA .. '2', 'd') + local dOffs = dDelta1 + ( nBottomRail - 1) * dDelta2 + EgtSetInfo( nProfileId, WIN_RAILDELTA, dOffs) +end + --------------------------------------------------------------------- -- funzione che crea il gruppo con i profili di un pezzo -local function CalcProfiles( nPartId, nOutlineId, vPrevOutlineId, vNextOutlineId, nProfileType) +local function CalcProfiles( nPartId, nOutlineId, vPrevOutlineId, vNextOutlineId, nProfileType, nBottomRail) -- creo gruppo per i profili local nProfileLayerId = EgtGroup( nPartId) @@ -1200,11 +1264,15 @@ local function CalcProfiles( nPartId, nOutlineId, vPrevOutlineId, vNextOutlineId EgtSetStatus( nProfileLayerId, GDB_ST.OFF) -- recupero profilo principale e ne creo copia - local nOrigMainProfileId = GetOutlineProfileId( nOutlineId, nProfileType == WIN_PRF.BOTTOMRAIL) + local nOrigMainProfileId = GetOutlineProfileId( nOutlineId, false, nProfileType) local nMainProfileId = EgtCopy( nOrigMainProfileId, nProfileLayerId) local sMainProfileType = EgtGetName( nMainProfileId) EgtSetInfo( nMainProfileId, WIN_PRF_TYPE, sMainProfileType) EgtSetName( nMainProfileId, WIN_PRF_MAIN) + -- se bottomrail salvo info per scostamento dall'outline + if sMainProfileType == WIN_FILL_RAIL or sMainProfileType == WIN_RAIL then + SaveRailDelta( nMainProfileId, nBottomRail) + end -- recupero profili start e ne creo copia -- se il tipo corrente è split il pezzo va tagliato con il bottomrail, altrimenti con il bottom @@ -1214,6 +1282,10 @@ local function CalcProfiles( nPartId, nOutlineId, vPrevOutlineId, vNextOutlineId local sStartProfileType = EgtGetName( nStartProfileId) EgtSetInfo( nStartProfileId, WIN_PRF_TYPE, sStartProfileType) EgtSetName( nStartProfileId, WIN_PRF_START) + if sStartProfileType == WIN_FILL_RAIL then + local nBottomRailTot = EgtGetInfo( vPrevOutlineId[i], WIN_BOTTOMRAIL, 'i') + SaveRailDelta( nStartProfileId, nBottomRailTot) + end end -- recupero profili end e ne creo copia @@ -1223,6 +1295,10 @@ local function CalcProfiles( nPartId, nOutlineId, vPrevOutlineId, vNextOutlineId local sEndProfileType = EgtGetName( nEndProfileId) EgtSetInfo( nEndProfileId, WIN_PRF_TYPE, sEndProfileType) EgtSetName( nEndProfileId, WIN_PRF_END) + if sEndProfileType == WIN_FILL_RAIL then + local nBottomRailTot = EgtGetInfo( vPrevOutlineId[i], WIN_BOTTOMRAIL, 'i') + SaveRailDelta( nEndProfileId, nBottomRailTot) + end end -- recupero le info di pinzaggio dal profilo di estrusione @@ -1249,6 +1325,12 @@ local function GetDeltaProfile( nProfileId, sCtrIn) else dCPDelta = abs( b3CP:getMax():getX()) end + -- se bottomrail considero anche scostamento dall'outline + local sProfileType = EgtGetInfo( nProfileId, WIN_PRF_TYPE) + if sProfileType == WIN_FILL_RAIL then + local dDelta = EgtGetInfo( nProfileId, WIN_RAILDELTA, 'd') + dCPDelta = dCPDelta + dDelta + end return dCPDelta end @@ -1260,7 +1342,13 @@ local function CreateFrameGeo( nOutlineId, vPrevOutlineId, vNextOutlineId, nStar -- calcolo spostamento della curva iniziale dovuto a posizione riferimento local b3CurrProfileFrame = GetProfileLocalBox( nCurrProfileId) local dCurrOffset = b3CurrProfileFrame:getMax():getX() - + local sProfileType = EgtGetInfo( nCurrProfileId, WIN_PRF_TYPE) + if sProfileType == WIN_FILL_RAIL or sProfileType == WIN_RAIL then + -- scostamento extra legato al bottomrail + local dDelta = EgtGetInfo( nCurrProfileId, WIN_RAILDELTA, 'd') + dCurrOffset = dCurrOffset - dDelta + end + -- creo copie degli outline e le offsetto opportunamente -- curva out local nCurrCurveId = EgtCopy( nOutlineId, nGeoLayerId) @@ -1357,7 +1445,7 @@ end --------------------------------------------------------------------- -- funzione che calcola l'ingombro dei pezzi del telaio -local function CalcFrameGeo( nPartId, nOutlineId, nOutlineCrvNbr, nOutlineLayerId, nProfileType) +local function CalcFrameGeo( nPartId, nOutlineId, nOutlineCrvNbr, nOutlineLayerId, nProfileType, nBottomRail) -- creo layer per ingombro local nGeoLayerId = EgtGroup( nPartId) @@ -1371,7 +1459,7 @@ local function CalcFrameGeo( nPartId, nOutlineId, nOutlineCrvNbr, nOutlineLayerI -- recupero il tipo di giunzioni local nStartJointType local nEndJointType - if nProfileType == WIN_PRF.SPLIT or nProfileType == WIN_PRF.BOTTOMRAIL then + if nProfileType == WIN_PRF.SPLIT or nProfileType == WIN_PRF.BOTTOMRAIL or nProfileType == WIN_PRF.BOTTOMRAIL_FINAL then -- non serve settare dei valori per StartJointType ed EndJointType perchè in CalcPartJointType la loro giunzione viene settata a short else -- recupero i joints dal vettore @@ -1407,12 +1495,12 @@ local function CalcFrameGeo( nPartId, nOutlineId, nOutlineCrvNbr, nOutlineLayerI -- salvo il valore di start joint su outline per calcolo dowels -- se bottomrail è sicuramente short quindi non salvo il valore che sovrascriverebbe quello del pezzo bottom ( che potrebbe essere short o full) - if nProfileType ~= WIN_PRF.BOTTOMRAIL then + if nProfileType ~= WIN_PRF.BOTTOMRAIL and nProfileType ~= WIN_PRF.BOTTOMRAIL_FINAL then EgtSetInfo( nOutlineId, WIN_STARTJOINT, nStartPartJointType) end -- creo il gruppo con i profili del pezzo - local nProfileLayerId = CalcProfiles( nPartId, nOutlineId, vPrevOutlineId, vNextOutlineId, nProfileType) + local nProfileLayerId = CalcProfiles( nPartId, nOutlineId, vPrevOutlineId, vNextOutlineId, nProfileType, nBottomRail) -- creo lati dell'outline CreateFrameGeo( nOutlineId, vPrevOutlineId, vNextOutlineId, nStartPartJointType, nEndPartJointType, nGeoLayerId, nProfileLayerId) @@ -2020,6 +2108,12 @@ local function CreateProfileSurf( nOutlineId, nProfileId, sProfileName, dExtraLe EgtAddCurveCompoLineTg( nGuideId, dExtraLen) EgtAddCurveCompoLineTg( nGuideId, dExtraLen, false) end + -- correzione nel caso di bottomrail + local sProfileType = EgtGetInfo( nProfileId, WIN_PRF_TYPE) + if sProfileType == WIN_RAIL or sProfileType == WIN_FILL_RAIL then + local dOffs = EgtGetInfo( nProfileId, WIN_RAILDELTA, 'd') + EgtOffsetCurve( nGuideId, - dOffs) + end -- verifico se necessaria inversione della guida nel caso sia curva "virtuale" ( ovvero in area null o split) che deriva da pezzo di split local nRefSplitId = EgtGetInfo( nOutlineId, WIN_REF_SPLIT, 'i') @@ -2142,6 +2236,13 @@ local function CreateMainSurf( nOutlineId, dExtraLen, nProfileId, sSectionName, EgtExtendCurveStartByLen( nGuideId, dExtraLen) EgtExtendCurveEndByLen( nGuideId, dExtraLen) + -- se bottomrail sposto opportunamente l'outline + local sProfileType = EgtGetInfo( nProfileId, WIN_PRF_TYPE) + if sProfileType == WIN_RAIL or sProfileType == WIN_FILL_RAIL then + local dOffs = EgtGetInfo( nProfileId, WIN_RAILDELTA, 'd') + EgtOffsetCurve( nGuideId, -dOffs) + end + -- posiziono il profilo sulla curva guida : -- recupero il frame del profilo local nProfileFrameId = EgtGetFirstNameInGroup( nProfileId, WIN_SECTIONFRAME) @@ -2151,7 +2252,7 @@ local function CreateMainSurf( nOutlineId, dExtraLen, nProfileId, sSectionName, EgtTransform( EgtGetAllInGroup( nProfileId), frInvert) -- assegno come riferimento del profilo il punto start dell'outline EgtChangeGroupFrame( nProfileId, Frame3d( EgtSP( nGuideId), - EgtSV( nGuideId))) - + -- recupero outline del profilo Main e lo estrudo local nSectionId = EgtGetFirstNameInGroup( nProfileId, sSectionName) local nMainExtrusionId = EgtSurfTmSwept( nLayerId, nSectionId, nGuideId, false, WIN_SURF_APPROX) @@ -2375,7 +2476,7 @@ local function CreateDowelFrameDest( nRefProfileType, nPrevGeo, nGeo, nRefOutlin local vtZ if nRefProfileType == WIN_PRF.TOP then vtZ = - X_AX() - elseif nRefProfileType == WIN_PRF.BOTTOM or nRefProfileType == WIN_PRF.BOTTOMRAIL then + elseif nRefProfileType == WIN_PRF.BOTTOM or nRefProfileType == WIN_PRF.BOTTOMRAIL or nRefProfileType == WIN_PRF.BOTTOMRAIL_FINAL then vtZ = X_AX() elseif nRefProfileType == WIN_PRF.LEFT then vtZ = - Y_AX() @@ -2499,16 +2600,18 @@ end --------------------------------------------------------------------- -- funzione che calcola i dowels tra due pezzi -local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail) +local function CalcDowels( nOrigOutlineId, nOrigPrevOutlineId, bSashOrFrame, nBottomRail) -- 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') + local nPart = EgtGetInfo( nOrigOutlineId, WIN_REF_PART, 'i') + local nPrevPart = EgtGetInfo( nOrigPrevOutlineId, WIN_REF_PART, 'i') + if nBottomRail then + if EgtGetName( nOrigOutlineId) == WIN_BOTTOM then + local vParts = EgtGetInfo( nOrigOutlineId, WIN_REF_BOTTOMRAIL_PART, 'vi') + nPart = vParts[nBottomRail] else - nPrevPart = EgtGetInfo( nPrevOutlineId, WIN_REF_BOTTOMRAIL_PART, 'i') + local vParts = EgtGetInfo( nOrigPrevOutlineId, WIN_REF_BOTTOMRAIL_PART, 'vi') + nPrevPart = vParts[nBottomRail] end end @@ -2521,14 +2624,31 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail local nProfileId = EgtGetFirstNameInGroup( nProfileLay, WIN_PRF_MAIN) local nPrevProfileLay = EgtGetFirstNameInGroup( nPrevPart, WIN_PROFILE) local nPrevProfileId = EgtGetFirstNameInGroup( nPrevProfileLay, WIN_PRF_MAIN) + + -- copio curve outlines + local nOutlineId = EgtCopyGlob( nOrigOutlineId, nLayerId) + local nPrevOutlineId = EgtCopyGlob( nOrigPrevOutlineId, nLayerId) + if nBottomRail then + -- eventuale offset per bottomrail + local dOffs + local nRefCrv + if EgtGetName( nOutlineId) == WIN_BOTTOM then + nRefCrv = nOutlineId + dOffs = EgtGetInfo( nProfileId, WIN_RAILDELTA, 'd') + else + nRefCrv = nPrevOutlineId + dOffs = EgtGetInfo( nPrevProfileId, WIN_RAILDELTA, 'd') + end + EgtOffsetCurve( nRefCrv, - dOffs) + end -- 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) + local nPrevProfileType = GetOutlineProfileType( nPrevOutlineId, false, nBottomRail) + local nProfileType = GetOutlineProfileType( nOutlineId, false, nBottomRail) -- 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 @@ -2547,7 +2667,7 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail -- recupero il tipo di giunzione local nJointType = EgtGetInfo( nOutlineId, WIN_STARTJOINT, 'i') - if bBottomRail then + if nBottomRail then if EgtGetName( nOutlineId) == WIN_BOTTOM then nJointType = WIN_PART_JNT.SHORT else @@ -2647,7 +2767,7 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail 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 + elseif nPrevProfileType == WIN_PRF.BOTTOMRAIL or nPrevProfileType == WIN_PRF.BOTTOMRAIL_FINAL then sLenKey = WIN_DWL_BOTTOMRAIL_PARA_LEN sPrevLenKey = WIN_DWL_BOTTOMRAIL_PERP_LEN end @@ -2709,6 +2829,9 @@ local function CalcDowels( nOutlineId, nPrevOutlineId, bSashOrFrame, bBottomRail EgtErase( nTestSurf2) end + EgtErase( nOutlineId) + EgtErase( nPrevOutlineId) + end --------------------------------------------------------------------- @@ -2799,7 +2922,7 @@ local function CalcSplitDowels( nSplitId, vOutlines, bStartOrEnd) if nProfileType == WIN_PRF.BOTTOM then sSplitLenKey = WIN_DWL_BOTTOM_PARA_LEN sLenKey = WIN_DWL_BOTTOM_PERP_LEN - elseif nProfileType == WIN_PRF.BOTTOMRAIL then + elseif nProfileType == WIN_PRF.BOTTOMRAIL_FINAL then sSplitLenKey = WIN_DWL_RAILBOTTOM_PARA_LEN sLenKey = WIN_DWL_RAILBOTTOM_PERP_LEN elseif nProfileType == WIN_PRF.SPLIT then @@ -2880,16 +3003,18 @@ local function CalculateAreaDowels( nAreaId) 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 + local nBottomRails = EgtGetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, 'i') or 0 -- 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) + CalcDowels( nOutline, nPrevOutline, nAreaType == WIN_AREATYPES.SASH) -- bottomrail - if bBottomRail and ( EgtGetName( nOutline) == WIN_BOTTOM or EgtGetName( nPrevOutline) == WIN_BOTTOM) then - CalcDowels( nOutline, nPrevOutline, false, true) + if nBottomRails > 0 and ( EgtGetName( nOutline) == WIN_BOTTOM or EgtGetName( nPrevOutline) == WIN_BOTTOM) then + for j = 1, nBottomRails do + CalcDowels( nOutline, nPrevOutline, false, j) + end end -- aggiorno per iterazione successiva nPrevOutline = nOutline @@ -2970,8 +3095,9 @@ local function CreateStripGuideLines( nOutlineId, nStripId, nProfileId, nSolidLa -- calcolo BBox local b3MainStrip = EgtGetBBoxRef( nStripId, GDB_BB.STANDARD, frProfile, GDB_RT.GLOB) -- calcolo offset per Strip - local dMainStripMinDelta = EgtIf( bMainInvertOffset, - b3MainStrip:getMax():getX(), b3MainStrip:getMin():getX()) - local dMainStripMaxDelta = EgtIf( bMainInvertOffset, - b3MainStrip:getMin():getX(), b3MainStrip:getMax():getX()) + local dDelta = EgtGetInfo( nProfileId, WIN_RAILDELTA, 'd') or 0 + local dMainStripMinDelta = EgtIf( bMainInvertOffset, - b3MainStrip:getMax():getX() + dDelta, b3MainStrip:getMin():getX() - dDelta) + local dMainStripMaxDelta = EgtIf( bMainInvertOffset, - b3MainStrip:getMin():getX() + dDelta, b3MainStrip:getMax():getX() - dDelta) local nStripMinOffsetId = EgtCopy( nOutlineId, nSolidLayerId) EgtOffsetCurve( nStripMinOffsetId, dMainStripMinDelta) @@ -3226,7 +3352,7 @@ end --------------------------------------------------------------------- -- funzione che calcola l'ingombro dei pezzi del telaio e i loro solidi -local function CreatePartFromOutline( nAreaLayerId, sName, nOutlineId, nOutlineCrvNbr, bBottomRail) +local function CreatePartFromOutline( nAreaLayerId, sName, nOutlineId, nOutlineCrvNbr, nBottomRail) -- creo pezzo local nPartId = EgtGroup( GDB_ID.ROOT) @@ -3241,19 +3367,22 @@ local function CreatePartFromOutline( nAreaLayerId, sName, nOutlineId, nOutlineC -- creo riferimenti tra pezzo e outline EgtSetInfo( nPartId, WIN_REF_OUTLINE, nOutlineId) - if bBottomRail then - EgtSetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, nPartId) + if nBottomRail then + -- aggiorno i riferimenti del bottomrail + local vBottomRailParts = EgtGetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, 'vi') or {} + table.insert( vBottomRailParts, nPartId) + EgtSetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, vBottomRailParts) else EgtSetInfo( nOutlineId, WIN_REF_PART, nPartId) end -- imposto nome del pezzo - local sOutlineName = EgtIf( bBottomRail, WIN_BOTTOMRAIL, EgtGetName( nOutlineId)) + local sOutlineName = EgtIf( nBottomRail, WIN_BOTTOMRAIL .. '_' .. tostring( nBottomRail), EgtGetName( nOutlineId)) local sPartName = sName .. '_' .. sOutlineName EgtSetName( nPartId, sPartName) -- imposto il colore - if sOutlineName == WIN_BOTTOM or sOutlineName == WIN_TOP or bBottomRail then + if sOutlineName == WIN_BOTTOM or sOutlineName == WIN_TOP or nBottomRail then EgtSetColor( nPartId, Color3d( 204, 102, 0)) elseif sOutlineName == WIN_RIGHT or sOutlineName == WIN_LEFT then EgtSetColor( nPartId, Color3d( 251, 128, 4)) @@ -3262,9 +3391,9 @@ local function CreatePartFromOutline( nAreaLayerId, sName, nOutlineId, nOutlineC end -- ricavo il tipo di profilo - local nProfileType = GetOutlineProfileType( nOutlineId, bBottomRail) + local nProfileType = GetOutlineProfileType( nOutlineId, false, nBottomRail) -- disegno ingombro - CalcFrameGeo( nPartId, nOutlineId, nOutlineCrvNbr, nOutlineLayerId, nProfileType) + CalcFrameGeo( nPartId, nOutlineId, nOutlineCrvNbr, nOutlineLayerId, nProfileType, nBottomRail) -- calcolo eventuali curve ausiliarie per cambio profilo local bChangeProfile = EgtGetInfo( nOutlineId, WIN_PRF_CHANGE, 'b') or false if bChangeProfile and nProfileType ~= WIN_PRF.SPLIT then @@ -3322,11 +3451,10 @@ local function CalculateAreaParts( nAreaId) -- creo pezzo CreatePartFromOutline( nAreaId, sName, vOutlines[i], i) -- se di tipo bottom verifico se ha bottomrail - local sName = EgtGetName( vOutlines[i]) - if sName == WIN_BOTTOM then - local bBottomRail = EgtGetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, 'b') or false - if bBottomRail then - CreatePartFromOutline( nAreaId, sName, vOutlines[i], i, true) + if EgtGetName( vOutlines[i]) == WIN_BOTTOM then + local nBottomRail = EgtGetInfo( nOutlineLayerId, WIN_BOTTOMRAIL, 'i') or 0 + for j = 1, nBottomRail do + CreatePartFromOutline( nAreaId, sName, vOutlines[i], i, j) end end end diff --git a/Designing/WinLib/WinCreate.lua b/Designing/WinLib/WinCreate.lua index 836b1e2..689b0e8 100644 --- a/Designing/WinLib/WinCreate.lua +++ b/Designing/WinLib/WinCreate.lua @@ -584,12 +584,12 @@ end ---------------------------------- BOTTOMRAIL ------------------------------------ ---------------------------------------------------------------------------------- -- funzione che aggiunge uno zoccolo -function WinCreate.AddBottomRail( nAreaId) +function WinCreate.AddBottomRail( nAreaId, nNbr) local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i') if nAreaType == WIN_AREATYPES.FRAME then -- recupero l'outline bottom local nBaseOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_AREAOUTLINE) - EgtSetInfo( nBaseOutlineLayerId, WIN_BOTTOMRAIL, 1) + EgtSetInfo( nBaseOutlineLayerId, WIN_BOTTOMRAIL, nNbr) end end diff --git a/Designing/WinProject.lua b/Designing/WinProject.lua index 13cbd4d..e3e70ba 100644 --- a/Designing/WinProject.lua +++ b/Designing/WinProject.lua @@ -57,7 +57,7 @@ end ---------------------------------------------------------------------------------- local function WinCreate_ImportProfile() - WinCreate.ImportProfile(WDG.PROFILE) + WinCreate.ImportProfile(WDG.PROFILE) end _G.WinCreate_ImportProfile = WinCreate_ImportProfile @@ -79,74 +79,74 @@ _G.WinCreate_AddSash = WinCreate_AddSash ---------------------------------------------------------------------------------- local function WinCreate_AddHardware() - WinCreate.AddHardware(WDG.AREAID, WDG.FAVOURITE, WDG.HANDLE) + WinCreate.AddHardware(WDG.AREAID, WDG.FAVOURITE, WDG.HANDLE) end _G.WinCreate_AddHardware = WinCreate_AddHardware ---------------------------------------------------------------------------------- local function WinCreate_AddFill() - WDG.AREAID = WinCreate.AddFill(WDG.AREAID, WDG.FILLTYPE) + WDG.AREAID = WinCreate.AddFill(WDG.AREAID, WDG.FILLTYPE) end _G.WinCreate_AddFill = WinCreate_AddFill ---------------------------------------------------------------------------------- local function WinCreate_AddBottomRail() - WinCreate.AddBottomRail(WDG.AREAID) + WinCreate.AddBottomRail(WDG.AREAID, WDG.NBR) end _G.WinCreate_AddBottomRail = WinCreate_AddBottomRail ---------------------------------------------------------------------------------- local function WinCreate_AddSplits() - local AreaIndex = 1 - while WDG['AREAID' .. AreaIndex] do - WDG['AREAID' .. AreaIndex] = nil - AreaIndex = AreaIndex + 1 - end - local PositionList = {} - local PositionIndex = 1 - while WDG['POSITION' .. PositionIndex] do - table.insert( PositionList, WDG['POSITION' .. PositionIndex]) - PositionIndex = PositionIndex + 1 - end - local AreaList = WinCreate.AddSplits(WDG.AREAID, WDG.SPLITORIENTATION, WDG.MEASURETYPE, PositionList, WDG.PROPORTION, WDG.SPLITTYPE) - for AreaIndex = 1, #AreaList do - WDG['AREAID' .. AreaIndex] = AreaList[ AreaIndex] - end - PositionIndex = 1 - while WDG['POSITION' .. PositionIndex] do - WDG['POSITION' .. PositionIndex] = nil - PositionIndex = PositionIndex + 1 - end + local AreaIndex = 1 + while WDG['AREAID' .. AreaIndex] do + WDG['AREAID' .. AreaIndex] = nil + AreaIndex = AreaIndex + 1 + end + local PositionList = {} + local PositionIndex = 1 + while WDG['POSITION' .. PositionIndex] do + table.insert( PositionList, WDG['POSITION' .. PositionIndex]) + PositionIndex = PositionIndex + 1 + end + local AreaList = WinCreate.AddSplits(WDG.AREAID, WDG.SPLITORIENTATION, WDG.MEASURETYPE, PositionList, WDG.PROPORTION, WDG.SPLITTYPE) + for AreaIndex = 1, #AreaList do + WDG['AREAID' .. AreaIndex] = AreaList[ AreaIndex] + end + PositionIndex = 1 + while WDG['POSITION' .. PositionIndex] do + WDG['POSITION' .. PositionIndex] = nil + PositionIndex = PositionIndex + 1 + end end _G.WinCreate_AddSplits = WinCreate_AddSplits ---------------------------------------------------------------------------------- local function WinCalculate_SetCalcSolid() - WinCalculate.SetCalcSolid(WDG.VALUE) + WinCalculate.SetCalcSolid(WDG.VALUE) end _G.WinCalculate_SetCalcSolid = WinCalculate_SetCalcSolid ---------------------------------------------------------------------------------- local function WinCalculate_SetSimplifiedSolid() - WinCalculate.SetSimplifiedSolid(WDG.VALUE) + WinCalculate.SetSimplifiedSolid(WDG.VALUE) end _G.WinCalculate_SetSimplifiedSolid = WinCalculate_SetSimplifiedSolid ---------------------------------------------------------------------------------- local function WinCalculate_CreatePartFromArea() - WinCalculate.CreatePartFromArea(WDG.FRAMEID) + WinCalculate.CreatePartFromArea(WDG.FRAMEID) end _G.WinCalculate_CreatePartFromArea = WinCalculate_CreatePartFromArea ---------------------------------------------------------------------------------- local function WinCalculate_AddHardware() - WinCalculate.AddHardware(WDG.FRAMEID) + WinCalculate.AddHardware(WDG.FRAMEID) end _G.WinCalculate_AddHardware = WinCalculate_AddHardware ---------------------------------------------------------------------------------- local function WinCreate_GetHardwareOptionPath() - WDG.HWDOPTPATH = WinCalculate.AddHardwareForSash(WDG.AREAID, true) + WDG.HWDOPTPATH = WinCalculate.AddHardwareForSash(WDG.AREAID, true) end _G.WinCreate_GetHardwareOptionPath = WinCreate_GetHardwareOptionPath