From 71eb7b36e9cfdde63c48c5ab528d0a7f766e6a74 Mon Sep 17 00:00:00 2001 From: SaraP Date: Wed, 23 Jul 2025 10:12:48 +0200 Subject: [PATCH] DataWindow : - correzioni preview 2d. --- Designing/WinConst.lua | 8 ++ Designing/WinLib/WinCalculate.lua | 151 +++++++++++++++++------------- 2 files changed, 92 insertions(+), 67 deletions(-) diff --git a/Designing/WinConst.lua b/Designing/WinConst.lua index 6ee5b5b..4f16e13 100644 --- a/Designing/WinConst.lua +++ b/Designing/WinConst.lua @@ -133,6 +133,14 @@ WIN_OPENING_TYPES = { LIFTSLIDE_RIGHT = 12, } +-- tipi di pezzo +WIN_PART_TYPE = 'PartType' +WIN_PART_TYPES = { + NULL = 0, + FILL = 1, + BOTTOMRAIL = 2, +} + WIN_AREAOUTLINE = 'BaseOutline' WIN_OUTLINE = 'Outline' WIN_BASESPLIT = 'BaseSplit' diff --git a/Designing/WinLib/WinCalculate.lua b/Designing/WinLib/WinCalculate.lua index 4e4dd11..585446f 100644 --- a/Designing/WinLib/WinCalculate.lua +++ b/Designing/WinLib/WinCalculate.lua @@ -1505,9 +1505,6 @@ local function CalcFrameGeo( nPartId, nOutlineId, nOutlineCrvNbr, nOutlineLayerI -- creo layer per ingombro local nGeoLayerId = EgtGroup( nPartId) EgtSetName( nGeoLayerId, WIN_GEO) - if s_bCalcPreview then - EgtSetStatus( nGeoLayerId, GDB_ST.OFF) - end -- recupero outline precedenti e successivi ( solo nel caso di split possono essere più di uno) local vPrevOutlineId, vNextOutlineId = GetPrevNextOutline( nProfileType, nOutlineId, nOutlineLayerId) @@ -2554,79 +2551,69 @@ end ---------------------------------------------------------------------------------- --------------------------------- PREVIEW ---------------------------------------- ---------------------------------------------------------------------------------- -local function CalcBottomRailPreview( nPreviewGrp, nOutlineId, nProfileGrp) - - local nBottomRail = EgtGetInfo( nOutlineId, WIN_BOTTOMRAIL, 'i') or 0 - if nBottomRail == 0 then - return - end - - local nGrp = EgtGroup( nPreviewGrp) - +local function CalcBottomRailPreview( nPreviewGrp, nOutlineId, nBottomRail, nProfileGrp, nGeoGrp, color) + -- costruisco box complessivo degli zoccoli - local nProfileId = EgtGetFirstNameInGroup( nProfileGrp, WIN_PRF_MAIN) - local b3Profile = GetProfileLocalBox( nProfileId) - local nOutId = EgtCopyGlob( nOutlineId, nGrp) - EgtOffsetCurve( nOutId, b3Profile:getMin():getX()) + local vCrvs = {} + + -- la curva out corrisponde al geo in del pezzo bottom + local nPartGeoIn = EgtGetFirstNameInGroup( nGeoGrp, WIN_GEO_IN) + vCrvs[1] = EgtCopyGlob( nPartGeoIn, nPreviewGrp) local vNextOutlines = EgtGetInfo( nOutlineId, WIN_NEXT_OUTLINES, 'vi') local vEndProfiles = EgtGetNameInGroup( nProfileGrp, WIN_PRF_END) - local nRightId = EgtCopyGlob( vNextOutlines[1], nGrp) local b3ProfileEnd = GetProfileLocalBox( vEndProfiles[1]) - EgtOffsetCurve( nRightId, b3ProfileEnd:getMin():getX()) + vCrvs[2] = EgtCopyGlob( vNextOutlines[1], nPreviewGrp) + EgtOffsetCurve( vCrvs[2], b3ProfileEnd:getMin():getX()) - local nInId = EgtCopyGlob( nOutlineId, nGrp) - local dDelta1 = EgtGetInfo( nProfileId, WIN_RAILDELTA .. '1', 'd') - local dDelta2 = EgtGetInfo( nProfileId, WIN_RAILDELTA .. '2', 'd') - local dOffs = dDelta1 + ( nBottomRail - 1) * dDelta2 - local nProfileLayer = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_PROFILE) - local nAreaLayer = EgtGetParent( EgtGetParent( nOutlineId)) - local nAreaType = EgtGetInfo( nAreaLayer, WIN_AREATYPE, 'i') - local nFrameProfileLayer = EgtGetFirstNameInGroup( nProfileLayer, EgtIf( nAreaType == WIN_AREATYPES.FRAME, WIN_FRAME, WIN_SASH)) - local nBottomRailProfile = EgtGetFirstNameInGroup( nFrameProfileLayer, WIN_FILL_RAIL) - local b3ProfileRail = GetProfileLocalBox( nBottomRailProfile) - EgtOffsetCurve( nInId, - dOffs + b3ProfileRail:getMin():getX()) + -- la curva in corrisponde al geo in dell'ultimo bottomrail + local vBottomRails = EgtGetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, 'vi') + local nBottomRailPart = vBottomRails[#vBottomRails] + local nGeoLayer = EgtGetFirstNameInGroup( nBottomRailPart, WIN_GEO) + local nGeoIn = EgtGetFirstNameInGroup( nGeoLayer, WIN_GEO_IN) + vCrvs[3] = EgtCopyGlob( nGeoIn, nPreviewGrp) local vPrevOutlines = EgtGetInfo( nOutlineId, WIN_PREV_OUTLINES, 'vi') local vStartProfiles = EgtGetNameInGroup( nProfileGrp, WIN_PRF_START) - local nLeftId = EgtCopyGlob( vPrevOutlines[1], nGrp) local b3ProfileStart = GetProfileLocalBox( vStartProfiles[1]) - EgtOffsetCurve( nLeftId, b3ProfileStart:getMin():getX()) - - TrimAndOrientOrderedCurves( EgtGetAllInGroup( nGrp), true) - - -- creo il bordo e la regione - local nAreaId = CreateGeoArea( nGrp, nPreviewGrp, true) - local nCrvId = EgtGetPrev( nAreaId or GDB_ID.NULL) or GDB_ID.NULL + vCrvs[4] = EgtCopyGlob( vPrevOutlines[1], nPreviewGrp) + EgtOffsetCurve( vCrvs[4], b3ProfileStart:getMin():getX()) + + -- creo il bordo + TrimAndOrientOrderedCurves( vCrvs, true) + local nCrvId = EgtCurveCompo( nPreviewGrp, vCrvs, false) EgtSetColor( nCrvId, EgtStdColor( 'BLACK')) - + EgtModifyCurveThickness( nCrvId, 0) + -- creo la regione + local nAreaId = EgtSurfFlatRegion( nPreviewGrp, {nCrvId}) + EgtSetColor( nAreaId, color) + EgtRelocateGlob( nCrvId, nAreaId, GDB_IN.AFTER) + -- creo linee di divisione tra gli zoccoli if nBottomRail > 1 then - local dLen = EgtCurveLength( nOutId) + local dLen = EgtCurveLength( vCrvs[1]) local dStep = 1 / nBottomRail for i = 1, nBottomRail - 1 do - local pt = EgtUP( nLeftId, i * dStep) + local pt = EgtUP( vCrvs[4], i * dStep) local nCrvId = EgtLinePVL( nPreviewGrp, pt, X_AX(), dLen) EgtSetColor( nCrvId, EgtStdColor( 'BLACK')) end end - EgtErase( nGrp) + EgtErase( vCrvs) end ---------------------------------------------------------------------------------- -local function CalcPreview( nPartId, nOutlineId) - - -- creo gruppo per la preview - local nPreviewGrp = EgtGroup( nPartId) - EgtSetName( nPreviewGrp, WIN_PREVIEW) - local nGrpTmp = EgtGroup( nPreviewGrp) +local function CalcPartPreview( nPartId, nPreviewGrp) + local nOutlineId = EgtGetInfo( nPartId, WIN_REF_OUTLINE, 'i') local nGeoGrp = EgtGetFirstNameInGroup( nPartId, WIN_GEO) local nProfileGrp = EgtGetFirstNameInGroup( nPartId, WIN_PROFILE) - - -- curva out - -- è il geo out tranne nel caso di sash active/inactive per le quali considero l'outline per evitare sovrapposizioni + + -- gruppo temporaneo per i conti + local nGrpTmp = EgtGroup( nPreviewGrp) + + -- curva out è il geo out tranne nel caso di sash active/inactive per le quali considero l'outline per evitare sovrapposizioni local nBaseOutlineId = EgtGetInfo( nOutlineId, WIN_COPY, 'i') local bOnSplit = EgtGetInfo( nBaseOutlineId, WIN_CRV_ON_FRENCH_SPLIT, 'b') if bOnSplit then @@ -2688,26 +2675,58 @@ local function CalcPreview( nPartId, nOutlineId) -- creo il bordo e la regione local nAreaId = CreateGeoArea( nGrpTmp, nPreviewGrp, true) + local color = EgtGetColor( nPartId) + EgtSetColor( nAreaId, color) local nCrvId = EgtGetPrev( nAreaId or GDB_ID.NULL) or GDB_ID.NULL + EgtRelocateGlob( nCrvId, nAreaId, GDB_IN.AFTER) EgtSetColor( nCrvId, EgtStdColor( 'BLACK')) + EgtModifyCurveThickness( nCrvId, 0) EgtErase( nGrpTmp) -- se bottom aggiungo anche eventuale preview del bottomrail if EgtGetName( nOutlineId) == WIN_BOTTOM then - CalcBottomRailPreview( nPreviewGrp, nOutlineId, nProfileGrp) + local nBottomRail = EgtGetInfo( nOutlineId, WIN_BOTTOMRAIL, 'i') or 0 + if nBottomRail > 0 then + CalcBottomRailPreview( nPreviewGrp, nOutlineId, nBottomRail, nProfileGrp, nGeoGrp, color) + end end end ---------------------------------------------------------------------------------- -local function CalcFillPreview( nPartId, nOutlineLayerId) - -- creo layer per preview - local nGrp = EgtGroup( nPartId) - EgtSetName( nGrp, WIN_PREVIEW) - -- creo compo di outline +local function CalcFillPreview( nPartId, nPreviewGrp) + -- creo bordo a partire dall'outline + local nAreaId = EgtGetInfo( nPartId, WIN_AREA, 'i') + local nOutlineLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_OUTLINE) local vOutlineList = EgtGetAllInGroup( nOutlineLayerId) - local nCompoOutlineId = EgtCurveCompoByChain( nGrp, vOutlineList, EgtSP( vOutlineList[1]), false) + local nCompoOutlineId = EgtCurveCompoByChain( nPreviewGrp, vOutlineList, EgtSP( vOutlineList[1]), false) -- creo area - local nSurfId = EgtSurfFlatRegion( nGrp, {nCompoOutlineId}) + local nSurfId = EgtSurfFlatRegion( nPreviewGrp, {nCompoOutlineId}) + EgtSetColor( nSurfId, EgtGetColor( nPartId)) + EgtErase( nCompoOutlineId) +end + +---------------------------------------------------------------------------------- +local function CalcPreview( nFrameId) + + -- creo gruppo per la preview + local nPreviewGrp = EgtGroup( GDB_ID.ROOT) + EgtSetName( nPreviewGrp, WIN_PREVIEW) + EgtSetLevel( nPreviewGrp, GDB_LV.SYSTEM) + EgtSetStatus( nPreviewGrp, GDB_ST.OFF) + + -- scorro tutti i pezzi e ne realizzo la preview + local nPartId = EgtGetFirstPart() + while nPartId do + local nPartType = EgtGetInfo( nPartId, WIN_PART_TYPE, 'i') or WIN_PART_TYPES.NULL + if nPartType == WIN_PART_TYPES.FILL then + CalcFillPreview( nPartId, nPreviewGrp) + elseif nPartType == WIN_PART_TYPES.BOTTOMRAIL then + -- pezzo di bottomrail viene ignorato perchè già creato con il corrispondente pezzo bottom + else + CalcPartPreview( nPartId, nPreviewGrp) + end + nPartId = EgtGetNextPart( nPartId) + end end @@ -3664,6 +3683,7 @@ local function CreatePartFromOutline( nAreaLayerId, sName, nOutlineId, nOutlineC local vBottomRailParts = EgtGetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, 'vi') or {} table.insert( vBottomRailParts, nPartId) EgtSetInfo( nOutlineId, WIN_REF_BOTTOMRAIL_PART, vBottomRailParts) + EgtSetInfo( nPartId, WIN_PART_TYPE, WIN_PART_TYPES.BOTTOMRAIL) else EgtSetInfo( nOutlineId, WIN_REF_PART, nPartId) end @@ -3695,10 +3715,6 @@ local function CreatePartFromOutline( nAreaLayerId, sName, nOutlineId, nOutlineC CalcProfilingProcessings( nPartId, nOutlineId) -- calcolo il georaw per automatismo lavorazioni CalcGeoRaw( nPartId) - -- disegno preview 2D del pezzo - if s_bCalcPreview and not nBottomRail then - CalcPreview( nPartId, nOutlineId) - end -- disegno solido if s_bCalcSolid then CalcSolid( nPartId, nOutlineId) @@ -3708,7 +3724,7 @@ local function CreatePartFromOutline( nAreaLayerId, sName, nOutlineId, nOutlineC elseif nAreaType == WIN_AREATYPES.FILL then -- imposto nome del pezzo EgtSetName( nPartId, sName .. '_' .. WIN_FILL) - + EgtSetInfo( nPartId, WIN_PART_TYPE, WIN_PART_TYPES.FILL) -- ricavo tipo local nFillType = EgtGetInfo( nAreaLayerId, WIN_FILLTYPE, 'i') @@ -3724,10 +3740,6 @@ local function CreatePartFromOutline( nAreaLayerId, sName, nOutlineId, nOutlineC -- disegno ingombro local nGeoLayerId = CalcFillGeo( nPartId, nOutlineLayerId) - -- disegno preview 2D - if s_bCalcPreview then - CalcFillPreview( nPartId, nOutlineLayerId) - end -- disegno solido if s_bCalcSolid then CalcFillSolid( nPartId, nOutlineLayerId, nGeoLayerId) @@ -5734,6 +5746,11 @@ function WinCalculate.CreatePartFromArea( nFrameId) CalculateAreaParts( nFrameId) -- calcolo le spine CalculateAreaDowels( nFrameId) + + -- calcolo preview 2d se richiesta + if s_bCalcPreview then + CalcPreview( nFrameId) + end end ---------------------------------------------------------------------