From e75cc0733c8c41c710a79e42095066f62bc0530d Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 16 May 2025 10:56:23 +0200 Subject: [PATCH] DataWindow : - aggiunta funzione per ricalcolo solidi. --- Designing/WinConst.lua | 1 + Designing/WinLib/WinCalculate.lua | 254 +++++++++++++++++++++++------- Designing/WinProject.lua | 6 + 3 files changed, 200 insertions(+), 61 deletions(-) diff --git a/Designing/WinConst.lua b/Designing/WinConst.lua index e4d725a..a2fa393 100644 --- a/Designing/WinConst.lua +++ b/Designing/WinConst.lua @@ -414,6 +414,7 @@ WIN_THRESHOLD_LEN = 'ThresholdLen' -- FERRAMENTA WIN_HDW_FAVOURITE = 'HdwFavourite' +WIN_HDW_NULL = '000000' WIN_HDW_HANDLE = 'HdwHandle' WIN_HDW_FRAME = 'HdwFrame' WIN_HDW_HANDLE_HEIGHT = 'HMan' diff --git a/Designing/WinLib/WinCalculate.lua b/Designing/WinLib/WinCalculate.lua index 046cdd7..0048edb 100644 --- a/Designing/WinLib/WinCalculate.lua +++ b/Designing/WinLib/WinCalculate.lua @@ -21,6 +21,7 @@ require( 'EgtBase') require( 'WinConst') local s_dDowelTol = 1 +local s_dSimplSolidApprox = 0.2 -- approssimazione lineare nel caso di solidi semplificati local s_nSashNbr = 0 -- contatore delle ante per assegnare nomi local s_bCalcSolid = false @@ -2142,6 +2143,7 @@ local function CalcGeoRaw( nPartId) end + ---------------------------------------------------------------------------------- ---------------------------------- SOLIDO ---------------------------------------- ---------------------------------------------------------------------------------- @@ -2204,7 +2206,7 @@ local function CreateProfileSurfById( nOutlineId, nProfileId, nSectionId, dExtra return nStmId end ----------------------------------------------------------------------------------- +--------------------------------------------------------------------- -- come CreateProfileSurfById ma riceve il nome della sezione da estrudere local function CreateProfileSurf( nOutlineId, nProfileId, sSectionName, dExtraLen, nLayerId) -- recupero l'id della sezione da estrudere @@ -2394,6 +2396,7 @@ local function CalcMixedFrameSolid( nOutlineId, nSolidLayerId, nProfileLayerId, EgtSetStatus( nTrimSurfEnd, GDB_ST.OFF) EgtSurfTmIntersect( vMainExtrusions[1], nTrimSurfEnd) + return vMainExtrusions[1] end --------------------------------------------------------------------- @@ -2424,6 +2427,8 @@ local function CalcMixedSplitSolid( nOutlineId, nSolidLayerId, nProfileLayerId, EgtSetName( nStmTrimEnd, WIN_SRF_END) EgtSetStatus( nStmTrimEnd, GDB_ST.OFF) EgtSurfTmIntersect( nMainExtrusionId, nStmTrimEnd) + + return nMainExtrusionId end --------------------------------------------------------------------- @@ -2483,6 +2488,8 @@ local function CalcSolid( nPartId, nOutlineId) -- eseguo intersezione per ottenere un solido unico EgtSurfTmIntersect( nMainExtrusionId, nTrimSurf) end + + return nMainExtrusionId end --------------------------------------------------------------------- @@ -2500,33 +2507,38 @@ local function CalcFillSolid( nPartId, nOutlineLayerId, nGeoLayerId) EgtErase( nCompoOutlineId) end +---------------------------------------------------------------------------------- +-- funzione che aggiorna il solido principale con quello associato ad una lavorazione partendo dalla sua curva +local function UpdateSolidWithProcessingSurf( nProcId, nSolidId, nLayerId) + + if not EgtCurveIsClosed( nProcId) then + return + end + + local vtExtr = EgtCurveExtrusion( nProcId) + local dThick = EgtCurveThickness( nProcId) + local nRefCrv = nProcId + -- se solidi semplificati approssimo in modo grossolano per velocizzare operazioni di subtract ( soprattuto su archi) + if s_bSimplSolid then + nRefCrv = EgtCopyGlob( nProcId, nLayerId) + EgtApproxCurve( nRefCrv, GDB_CA.LINES, s_dSimplSolidApprox) + end + local nProcSolidId = EgtSurfTmByRegionExtrusion( nLayerId, nRefCrv, dThick * vtExtr) + + -- sottraggo al solido + EgtSurfTmSubtract( nSolidId, nProcSolidId) + + EgtErase( nProcSolidId) + if s_bSimplSolid then + EgtErase( nRefCrv) + end +end + ---------------------------------------------------------------------------------- ---------------------------------- DOWELS ---------------------------------------- ---------------------------------------------------------------------------------- --- funzione che sottrae il dowel al solido -local function UpdateSolidWithDowel( nDowelId, nSolidId, vtDir, dLen, nLayerId) - - -- creo il solido del dowel a partire dalla circonferenza che lo definisce - local nDowelSolidId - if s_bSimplSolid then - -- se solidi semplificati creo foro grossolano per velocizzare operazioni di subtract - local nDowelApprox = EgtCopyGlob( nDowelId, nLayerId) - EgtApproxCurve( nDowelApprox, GDB_CA.LINES, 0.2) - nDowelSolidId = EgtSurfTmByRegionExtrusion( nLayerId, nDowelApprox, vtDir * dLen) - EgtErase( nDowelApprox) - else - nDowelSolidId = EgtSurfTmByRegionExtrusion( nLayerId, nDowelId, vtDir * dLen) - end - - -- sottraggo il dowel al solido - EgtSurfTmSubtract( nSolidId, nDowelSolidId) - EgtErase( nDowelSolidId) - -end - ---------------------------------------------------------------------- -- funzione che recupera la lunghezza del dowel local function CalcDowelLen( nDowelId, sKey, bFullOrShort) @@ -2627,7 +2639,7 @@ local function CreateDowel( nOrigDowelId, nLayerId, frOrig, frDest, vtDir, nTest -- eventuale aggiornamento del solido if nMainExtrusionId then - UpdateSolidWithDowel( nDowelId, nMainExtrusionId, vtDir, dLen, nLayerId) + UpdateSolidWithProcessingSurf( nDowelId, nMainExtrusionId, nLayerId) end return nDowelId @@ -3922,7 +3934,7 @@ local function CalcLogDowel( nOrigPartId, nCrvOut, bLeftOrRight, nProcLayerId, n -- eventuale aggiornamento del solido if nSolidId then - UpdateSolidWithDowel( nDowelId, nSolidId, vtDir, dLen, nProcLayerId) + UpdateSolidWithProcessingSurf( nDowelId, nSolidId, nProcLayerId) end end @@ -4239,22 +4251,6 @@ function WinCalculate.CreateArcLogs( nPartId, nLogsNbr, vSections, bAlign, dOver end ----------------------------------------------------------------------------------- ------------------------------- FUNZIONI ---------------------------------------- ----------------------------------------------------------------------------------- --- funzione che crea tutti i pezzi della finestra partendo dal telaio -function WinCalculate.CreatePartFromArea( nFrameId) - -- assegno il tipo di profilo alle curve del base outline - CalculateAreaProfileType( nFrameId) - -- calcolo outline a partire dal base outline - CalculateAreaOutline( nFrameId) - -- creo pezzi - s_nSashNbr = 0 -- resetto il numero di ante del progetto - CalculateAreaParts( nFrameId) - -- calcolo le spine - CalculateAreaDowels( nFrameId) -end - ---------------------------------------------------------------------------------- ---------------------------------- FERRAMENTA ---------------------------------- @@ -4707,7 +4703,7 @@ function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest) if bOnlyRequest then nFavourite = WDG.HDWFAVOURITE end - if not nFavourite or nFavourite == '000000' then + if not nFavourite or nFavourite == WIN_HDW_NULL then EgtOutLog('Warning! No hardware favourite set!') return end @@ -4963,18 +4959,12 @@ function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest) EgtSetInfo( nPocketOutlineId, WIN_PRC_SIDE, WIN_PRC_SIDETYPE.IN) EgtModifyCurveExtrusion( nPocketOutlineId, Z_AX()) EgtModifyCurveThickness( nPocketOutlineId, - dHeight) - -- aggiornamento del solido - if s_bCalcSolid then - -- costruisco asola come volume chiuso per eseguire operazioni booleane con il solido - local nOutlineId = EgtCopyGlob( nPocketOutlineId, nSolidLayerId) - EgtMove( nOutlineId, Z_AX()) - local nSolidId = EgtSurfTmByRegionExtrusion( nProcLayerId, nOutlineId, - ( dHeight + 1) * Z_AX()) - EgtTransform( nSolidId, frHdw) - EgtSurfTmSubtract( nMainExtrusionId, nSolidId) - EgtErase( {nSolidId, nOutlineId}) - end -- porto la lavorazione in globale EgtTransform( nPocketOutlineId, frHdw) + -- aggiornamento del solido + if s_bCalcSolid then + UpdateSolidWithProcessingSurf( nPocketOutlineId, nMainExtrusionId, nSolidLayerId) + end elseif vMacro[1] == 'TASCA' then elseif vMacro[1] == 'VITE' then @@ -4990,7 +4980,7 @@ function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest) local nHoleId = EgtCircle( nProcLayerId, ptCenter, dRadius) EgtMove( nHoleId, Z_AX()) EgtModifyCurveExtrusion( nHoleId, Z_AX()) - EgtModifyCurveThickness( nHoleId, - dDepth) + EgtModifyCurveThickness( nHoleId, - ( dDepth + 1)) EgtTransform( nHoleId, frHdw) EgtSetInfo( nHoleId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) @@ -5008,16 +4998,12 @@ function WinCalculate.AddHardwareForSash( nFrameId, bOnlyRequest) EgtModifyCurveThickness( nHoleId, - dDepth) EgtSetColor( nHoleId, EgtStdColor( 'GRAY')) EgtSetInfo( nHoleId, WIN_PRC_FEATURE_TYPE, WIN_PRC_TYPE.HOLE) - -- aggiornamento del solido - if s_bCalcSolid then - local nSolidHoleId = EgtSurfTmByRegionExtrusion( nProcLayerId, nHoleId, - ( dDepth + 1) * Z_AX()) - EgtMove( nSolidHoleId, Z_AX()) - EgtTransform( nSolidHoleId, frHdw) - EgtSurfTmSubtract( nMainExtrusionId, nSolidHoleId) - EgtErase( nSolidHoleId) - end -- porto la lavorazione in globale EgtTransform( nHoleId, frHdw) + -- aggiornamento del solido + if s_bCalcSolid then + UpdateSolidWithProcessingSurf( nHoleId, nMainExtrusionId, nSolidLayerId) + end end end @@ -5058,6 +5044,64 @@ function WinCalculate.AddHardware( nAreaId) end end +--------------------------------------------------------------------- +-- funzione che disegna l'hardware +local function DrawHardware( nAreaId, nAuxLayerId) + -- verifico il tipo + local nAreaType = EgtGetInfo( nAreaId, WIN_AREATYPE, 'i') + -- se anta disegno la ferramenta + if nAreaType == WIN_AREATYPES.SASH then + -- se è stato definito un preferito disegno la ferramenta + local sFavourite = EgtGetInfo( nAreaId, WIN_HDW_FAVOURITE) or WIN_HDW_NULL + if sFavourite ~= WIN_HDW_NULL then + DrawSashHardware( nAreaId, nAreaId, nAuxLayerId) + end + return + + else + -- verifico se contiene un french split + local nSplitLayerId = EgtGetFirstNameInGroup( nAreaId, WIN_SPLIT) + local nSplitType = WIN_SPLITTYPES.NULL + if nSplitLayerId then + nSplitType = EgtGetInfo( nSplitLayerId, WIN_SPLITTYPE, 'i') + end + if nSplitType == WIN_SPLITTYPES.FRENCH then + -- se ha definito un preferito devo disegnare la ferramenta + local sFavourite = EgtGetInfo( nAreaId, WIN_HDW_FAVOURITE) or WIN_HDW_NULL + if sFavourite ~= WIN_HDW_NULL then + -- recupero tutte le sottoaree di tipo anta + local vSashes = {} + local vStack = EgtGetNameInGroup( nAreaId, WIN_AREA .. '*') + local i = 1 + while vStack[i] do + local nType = EgtGetInfo( vStack[i], WIN_AREATYPE, 'i') + if nType == WIN_AREATYPES.SASH then + table.insert( vSashes, vStack[i]) + else + local vChildren = EgtGetNameInGroup( vStack[i], WIN_AREA .. '*') + vStack = EgtJoinTables( vStack, vChildren) + end + end + -- disegno la ferramenta su tutte le ante + for i = 1, #vSashes do + DrawSashHardware( vSashes[i], nAreaId, nAuxLayerId) + end + end + return + + else + -- verifico se ci sono sotto-aree + local nChildAreaId = EgtGetFirstNameInGroup( nAreaId, WIN_AREA .. '*') + while nChildAreaId do + -- lancio verifica di quell'area + DrawHardware( nChildAreaId, nAuxLayerId) + nChildAreaId = EgtGetNextName( nChildAreaId, WIN_AREA .. '*') + end + end + end +end + + ---------------------------------------------------------------------------------- ----------------------------------- ACCESSORI ---------------------------------- @@ -5490,5 +5534,93 @@ function WinCalculate.AddAccessories( nAreaId, bDraw) end end + + +---------------------------------------------------------------------------------- +------------------------------ FUNZIONI ---------------------------------------- +---------------------------------------------------------------------------------- +-- funzione che crea tutti i pezzi della finestra partendo dal telaio +function WinCalculate.CreatePartFromArea( nFrameId) + -- assegno il tipo di profilo alle curve del base outline + CalculateAreaProfileType( nFrameId) + -- calcolo outline a partire dal base outline + CalculateAreaOutline( nFrameId) + -- creo pezzi + s_nSashNbr = 0 -- resetto il numero di ante del progetto + CalculateAreaParts( nFrameId) + -- calcolo le spine + CalculateAreaDowels( nFrameId) +end + +--------------------------------------------------------------------- +-- funzione che ricalcola i solidi ( per cambio modalità visualizzazione) +function WinCalculate.RecalcSolids( nFrameId) + + -- scorro tutti i pezzi + local nPartId = EgtGetFirstPart() + while nPartId do + -- se solidi non vanno calcolati elimino semplicemente il gruppo dei solidi da ogni pezzo + if not s_bCalcSolid then + local nSolidLayId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) or GDB_ID.NULL + EgtErase( nSolidLayId) + + -- ricalcolo dei solidi + else + -- se fill, lo uso per ricalcolare strip + if EgtExistsInfo( nPartId, WIN_FILLTYPE) then + local nAreaId = EgtGetInfo( nPartId, WIN_AREA, 'i') + local nParentAreaId = EgtGetParent( nAreaId) + local nParentOutlineLayId = EgtGetFirstNameInGroup( nParentAreaId, WIN_OUTLINE) + local vParentOutlines = EgtGetAllInGroup( nParentOutlineLayId) + for i = 1, #vParentOutlines do + CreateStripFromOutline( nParentAreaId, vParentOutlines[i]) + end + + -- verifico se solido da calcolare + local nSolidLayId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) + if not nSolidLayId then + local nOutlineLayId = EgtGetFirstNameInGroup( nAreaId, WIN_OUTLINE) + local nGeoLayId = EgtGetFirstNameInGroup( nPartId, WIN_GEO) + CalcFillSolid( nPartId, nOutlineLayId, nGeoLayId) + end + + -- se pezzo, ricalcolo il suo solido + else + -- elimino gruppo dei solidi + local nSolidLayId = EgtGetFirstNameInGroup( nPartId, WIN_SOLID) or GDB_ID.NULL + EgtErase( nSolidLayId) + -- ricalcolo il solido principale + local nOutlineId = EgtGetInfo( nPartId, WIN_REF_OUTLINE, 'i') + local nSolidId = CalcSolid( nPartId, nOutlineId) + -- aggiungo lavorazioni + local nProcLayId = EgtGetFirstNameInGroup( nPartId, WIN_PRC) + local vProc = EgtGetAllInGroup( nProcLayId) + for i = 1, #vProc do + local nType = EgtGetInfo( vProc[i], WIN_PRC_FEATURE_TYPE) + local nProfilingType = EgtGetInfo( vProc[i], WIN_PRC_PROFILE_INFO) + if nType == WIN_PRC_TYPE.HOLE or ( nType == WIN_PRC_TYPE.PROFILING and nProfilingType == WIN_PRC_PROFILE_TYPE.GENERIC) then + UpdateSolidWithProcessingSurf( vProc[i], nSolidId, nProcLayId) + end + end + end + end + + nPartId = EgtGetNextPart( nPartId) + end + + -- accessori e ferramenta + local nAuxGrp = EgtGetFirstNameInGroup( GDB_ID.ROOT, WIN_AUX) + if not s_bCalcSolid then + EgtErase( nAuxGrp or GDB_ID.NULL) + elseif not nAuxGrp then + nAuxGrp = GetAuxLayer() + -- ferramenta + DrawHardware( nFrameId, nAuxGrp) + -- accessori + WinCalculate.AddAccessories( nFrameId, true) + end + +end + --------------------------------------------------------------------- return WinCalculate diff --git a/Designing/WinProject.lua b/Designing/WinProject.lua index 0424c1d..45a16bd 100644 --- a/Designing/WinProject.lua +++ b/Designing/WinProject.lua @@ -202,6 +202,12 @@ local function WinCalculate_CreatePartFromArea() end _G.WinCalculate_CreatePartFromArea = WinCalculate_CreatePartFromArea +---------------------------------------------------------------------------------- +local function WinCalculate_RecalcSolids() + WinCalculate.RecalcSolids( WDG.FRAMEID) +end +_G.WinCalculate_RecalcSolids = WinCalculate_RecalcSolids + ---------------------------------------------------------------------------------- local function WinCalculate_AddHardware() WinCalculate.AddHardware( WDG.FRAMEID)