From dd2e8f357aeefd7d5e07ff939e0cd4671582932c Mon Sep 17 00:00:00 2001 From: SaraP Date: Wed, 18 Feb 2026 11:14:42 +0100 Subject: [PATCH] 3dPrinting : - nel caso multiplanare aggiunto controllo su strand massimo e minimo ( dati letti dal file ini programma). --- LuaLibs/AddManData.lua | 3 ++ LuaLibs/CalcSlices.lua | 80 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 77 insertions(+), 6 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index ced5da4..1709475 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -85,6 +85,8 @@ KEY_WIPE_LEN = "WipeLen" KEY_WIPE_DIR = "WipeDir" KEY_WIPE_FEEDPU = "WipeFeedPu" KEY_TOOL_DIAM = "ToolDiam" +KEY_MAX_STRANDH_FACTOR = 'MaxStrandHFactor' +KEY_MIN_STRANDH_FACTOR = 'MinStrandHFactor' -- Solid Fill KEY_FLOOR_NBR = "FloorCount" @@ -214,6 +216,7 @@ KEY_CRV_OFFSET = "CurveOffset" KEY_ORIG_REF = "Orig" KEY_WIPE_ON_CRV = "WipeOnCrv" KEY_FEED_COEFF = 'FeedCoeff' +KEY_ENTITY_NAME = 'EntityName' SLICING_TYPE = { VERTICAL = 1, diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index d128673..b8e14a7 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -306,7 +306,7 @@ local function SliceStm( vIds, nLayId, vtSlicing, ptSlicing, nType, sName, sName end -- rinomino le curve, correggo di DeltaZ e assegno parametri for nId = nChainId, nChainId + nCnt - 1 do - EgtSetName( nId, sName .. tostring( i)) + EgtSetName( nId, sName .. EgtNumToString( i)) EgtMove( nId, - ( dDeltaZ + dCorr) * vtSlicing) EgtSetInfo( nId, KEY_ORIGINAL_SURF, vIds[i]) if tabParams then @@ -432,7 +432,7 @@ local function SlicingInfill( nLay, sName, sNameGrp) -- sistemo i nomi delle curve local vInfillCrvs = EgtGetAllInGroup( nResultLay) for j = 1, #vInfillCrvs do - EgtSetName( vInfillCrvs[j], sName .. tostring(j)) + EgtSetName( vInfillCrvs[j], sName .. EgtNumToString(j)) end end @@ -749,14 +749,14 @@ local function PrepareAuxSolidsInfill( nSolidsLay, vtSlicing) -- creo gruppo associato local nInfillGrp = EgtGroup( s_nPartId) - EgtSetName( nInfillGrp, AUX_SOLIDS_INFILL_GRP .. tostring( vIds[i])) + EgtSetName( nInfillGrp, AUX_SOLIDS_INFILL_GRP .. EgtNumToString( vIds[i])) EgtSetStatus( nInfillGrp, GDB_ST.OFF) -- calcolo infill CalcInfill( nInfillGrp, nType, dDensity, dDir, dOffsX, dOffsY, dGridOverlap, vIds[i], 0, dStrand, vtSlicing) -- aggiungo allo slicing - local sName = AUX_SOLIDS_INFILL_CRV .. tostring( vIds[i]) .. '_' + local sName = AUX_SOLIDS_INFILL_CRV .. EgtNumToString( vIds[i]) .. '_' SlicingInfill( nInfillGrp, sName, AUX_SOLIDS_GRP) end end @@ -785,7 +785,7 @@ local function ExtractRibsLoops( nRibsGrp, nStmId) if nCrv then -- assegno nome che permetta di ricondurli alla superficie da cui derivano for nId = nCrv, nCrv + nCnt - 1 do - EgtSetName( nId, SURF_LOOP .. tostring( vIds[i])) + EgtSetName( nId, SURF_LOOP .. EgtNumToString( vIds[i])) end end end @@ -826,7 +826,7 @@ local function SlicingNoSolid( nRibsLay, nSlicingType, dMaxH, dSliceStep, vSlici for i = 1, #vSlicingVal do -- creo layer e gruppo dei contorni local nLayId = EgtGroup( s_nPartId) - EgtSetName( nLayId, SLICE_LAYER .. tostring( i)) + EgtSetName( nLayId, SLICE_LAYER .. EgtNumToString( i)) EgtSetInfo( nLayId, KEY_SLICE_NBR, i) local nCrvLayId = EgtGroup( nLayId) EgtSetName( nCrvLayId, CONTOUR_GRP .. EgtNumToString( 0)) @@ -903,6 +903,67 @@ local function MultiPlanarSlicing( nStmId, dMaxH, vSlicingDir, vSlicingPnt) return nFirstGrpId, nCnt end +--------------------------------------------------------------------- +local function VerifyMultiPlanarStrand( vLayers) + + -- recupero i valori di strand massimo e minimo dal file ini + local sIniFile = EgtGetIniFile() + local dMaxStrandFactor = EgtGetNumberFromIni( '3dPrinting', KEY_MAX_STRANDH_FACTOR, 2, sIniFile) + local dMinStrandFactor = EgtGetNumberFromIni( '3dPrinting', KEY_MIN_STRANDH_FACTOR, 0.5, sIniFile) + local dSliceStep = EgtGetInfo( s_nPartId, KEY_SLICE_STEP, 'd') + local dMaxStrand = dMaxStrandFactor * dSliceStep + local dMinStrand = dMinStrandFactor * dSliceStep + + -- ciclo sui piani di slicing calcolati + local vtSlicePrev = EgtGetInfo( vLayers[1], KEY_SLICE_DIR, 'v') + local ptSlicePrev = EgtGetInfo( vLayers[1], KEY_SLICE_POS, 'p') + dSliceStep * vtSlicePrev + for i = 2, #vLayers do + + -- recupero il piano corrente + local vtSlice = EgtGetInfo( vLayers[i], KEY_SLICE_DIR, 'v') + local ptSlice = EgtGetInfo( vLayers[i], KEY_SLICE_POS, 'p') + dSliceStep * vtSlice + local dCosAng = vtSlicePrev * vtSlice + + -- recupero tutte le curve da verificare : + local vCrvs = {} + -- solido + local vCrvGrps = EgtGetNameInGroup( vLayers[i], CONTOUR_GRP .. '*') + for j = 1, #vCrvGrps do + local vSolidCrvs = EgtGetNameInGroup( vCrvGrps[j], OUTER_CRV) + EgtJoinTables( vCrvs, vSolidCrvs) + end + -- setti + local nRibsGrp = EgtGetFirstNameInGroup( vLayers[i], RIBS_GRP) or GDB_ID.NULL + local vRibsCrv = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') or {} + EgtJoinTables( vCrvs, vRibsCrv) + -- AuxSolids + local nAuxSolidsGrp = EgtGetFirstNameInGroup( vLayers[i], AUX_SOLIDS_GRP) or GDB_ID.NULL + local vAuxSolidsCrv = EgtGetNameInGroup( nAuxSolidsGrp, AUX_SOLIDS_CRV .. '*') or {} + EgtJoinTables( vCrvs, vAuxSolidsCrv) + + -- verifico la distanza dal piano precedente lungo vtSlice + for j = 1, #vCrvs do + local _, dE = EgtCurveDomain( vCrvs[j]) + for dU = 0, dE do + local ptCurr = EgtUP( vCrvs[j], dU, GDB_ID.ROOT) + dSliceStep * vtSlice + local dDist = ( ptCurr - ptSlicePrev) * vtSlicePrev / dCosAng + if dDist < dMinStrand - GEO.EPS_SMALL or dDist > dMaxStrand + GEO.EPS_SMALL then + EgtOutLog( 'Error on layer ' .. EgtNumToString( i) .. ' : strand height (' .. EgtNumToString( dDist) .. ') outside valid range (' .. EgtNumToString( dMinStrand) .. + ' - ' .. EgtNumToString( dMaxStrand) .. ')') + EgtOutBox( 'Strand height outside valid range', 'Error', 'ERROR') + return false + end + end + end + + -- aggiorno per layer successivo + vtSlicePrev = vtSlice + ptSlicePrev = ptSlice + end + + return true +end + --------------------------------------------------------------------- local function SlicingWithSolid( nStmId, nSlicingType, dMaxH, vSlicingVal, vSlicingDir) @@ -1256,6 +1317,13 @@ local function SlicingWithSolid( nStmId, nSlicingType, dMaxH, vSlicingVal, vSlic end end + -- se multiplanare verifico strand massimo e minimo + if nSlicingType == SLICING_TYPE.MULTIPLANAR then + if not VerifyMultiPlanarStrand( vLayers) then + return false + end + end + return true end