From eed869c99793979c1e2a94ca8b63ec4315b8a094 Mon Sep 17 00:00:00 2001 From: Dario Sassi Date: Wed, 11 Feb 2026 18:16:46 +0100 Subject: [PATCH] 3dPrinting 3.1b1 : - prime modifiche per slicing Multi Planare. --- LuaLibs/AddManData.lua | 2 ++ LuaLibs/CalcPaths.lua | 7 ++++- LuaLibs/CalcSlices.lua | 62 ++++++++++++++++++++++++++++++++++----- LuaLibs/CalcToolPath.lua | 23 +++++++++++++-- LuaLibs/RunCalcSolids.lua | 6 ++++ Version.lua | 4 +-- 6 files changed, 91 insertions(+), 13 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index d4f4067..1fa29fb 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -221,6 +221,7 @@ SLICING_TYPE = { DEG45_X = 2, DEG45_Y = 3, HORIZONTAL = 4, + MULTIPLANAR = 5, } TYPE = { @@ -303,6 +304,7 @@ LAY_RIBS = "Ribs" LAY_AUX_SOLIDS = "AuxSolids" LAY_SHELL_NBR = "ShellNumber" LAY_AUX = "Aux" +SPINE_CURVE = "Spine" LAY_FRAME = "Frame" VIEWPARAMS = 'ViewParams' IMPORTED_SOLID = 'ImportedSolid' diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index d5bcec0..14d2a85 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -4343,12 +4343,17 @@ function CalcPaths.Exec( nPartId) local LayerParams = GetLayerParamsForPathCalc() local nFirstSolidLay = EgtGetInfo( s_nPartId, KEY_FIRST_SOLID_LAY, 'i') or -1 local nLastSolidLay = EgtGetInfo( s_nPartId, KEY_LAST_SOLID_LAY, 'i') or -1 + local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') -- scorro tutti i suoi layer for nIdx = 1, #vLayIds do s_nCurrIdx = nIdx - + + if nSlicingType == SLICING_TYPE.MULTIPLANAR then + s_vtSlicing = EgtGetInfo( vLayIds[nIdx], KEY_SLICING_DIR, 'v') + end + local nRibsGrp = EgtGetFirstNameInGroup( vLayIds[nIdx], RIBS_GRP) local bIgnoreMergedRibs = true local nAuxSolidsGrp = EgtGetFirstNameInGroup( vLayIds[nIdx], AUX_SOLIDS_GRP) diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 4d7b6dd..2ed025f 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -775,13 +775,55 @@ local function SlicingNoSolid( nRibsLay, vZSlices, dDeltaZStart, dZmin, frSlicin end --------------------------------------------------------------------- -local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing) +local function MultiPlanarSlicing( nStmId) + + -- recupero la curva guida + local nAuxLayId = EgtGetFirstNameInGroup( s_nPartId, LAY_AUX) + local nSpineId = EgtGetFirstNameInGroup( nAuxLayId or GDB_ID.NULL, SPINE_CURVE) + if not nSpineId or ( EgtGetType( nSpineId) & GDB_FY.GEO_CURVE) == 0 then + return nil + end + -- step lungo la curva + local dSliceStep = EgtGetInfo( s_nPartId, KEY_SLICE_STEP, 'd') + -- massimo numero di layer da generare + local nMaxSlicesNbr = EgtGetInfo( s_nPartId, KEY_MAX_SLICES_NBR, 'i') or 0 + if nMaxSlicesNbr == 0 then + nMaxSlicesNbr = GEO.INFINITO -- da gestire come caso illimitato + end + -- ciclo sulla curva + local nFirstGrpId + local dCrvLen = EgtCurveLength( nSpineId) + for i = 0, nMaxSlicesNbr - 1 do + local dCurrLen = max( i * dSliceStep, 100 * GEO.EPS_SMALL) + if dCurrLen > dCrvLen then + break + end + local dU = EgtCurveParamAtLength( nSpineId, dCurrLen) + local ptOn = EgtUP( nSpineId, dU, GDB_ID.ROOT) + local vtN = EgtUV( nSpineId, dU, -1, GDB_ID.ROOT) + local nGrpId = EgtGroup( s_nPartId) + if not nFirstGrpId then + nFirstGrpId = nGrpId + end + local nEntId = EgtPlaneSurfTmInters( ptOn, vtN, nStmId, nGrpId, GDB_RT.GLOB, TOLER) + EgtSetInfo( nGrpId, KEY_SLICING_DIR, vtN) + end + return nFirstGrpId +end + +--------------------------------------------------------------------- +local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing, nSlicingType) local vtSlicing = frSlicing:getVersZ() -- calcolo delle intersezioni if EgtProcessEvents( 1, 0) == 1 then return false end - local nLayId = EgtParPlanesSurfTmInters( ORIG(), vtSlicing, vZSlices, nStmId, s_nPartId, GDB_RT.GLOB, TOLER) + local nLayId + if nSlicingType ~= SLICING_TYPE.MULTIPLANAR then + nLayId = EgtParPlanesSurfTmInters( ORIG(), vtSlicing, vZSlices, nStmId, s_nPartId, GDB_RT.GLOB, TOLER) + else + nLayId = MultiPlanarSlicing( nStmId) + end if EgtProcessEvents( 100, 0) == 1 then return false end local vPrevCen = {} @@ -799,7 +841,11 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin EgtSetInfo( nLayId, KEY_SLICE_Z, dPosZ - dZmin) EgtSetInfo( nLayId, KEY_SLICE_REAL_Z, dPosZ) EgtSetInfo( nLayId, KEY_SLICE_NBR, nLayCnt) - + + if nSlicingType == SLICING_TYPE.MULTIPLANAR then + vtSlicing = EgtGetInfo( nLayId, KEY_SLICING_DIR, 'v') + end + -- verifico se necessario ricalcolo local nId = EgtGetLastInGroup( nLayId) local bRecalc = not nId @@ -910,13 +956,10 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin EgtSetColor( vOpenId or {}, 'RED') -- creo flat region a partire dalle curve chiuse ottenute con lo slicing - local nGrp = EgtGroup( nLayId, frSlicing, GDB_RT.GLOB) for i = 1, #vClosedId do - EgtRelocateGlob( vClosedId[i], nGrp) + EgtModifyCurveExtrusion( vClosedId[i], vtSlicing, GDB_RT.GLOB) EgtApproxCurve( vClosedId[i], GDB_CA.ARCS, MID_TOLER) - EgtRelocateGlob( vClosedId[i], nLayId) end - EgtErase( nGrp) local nSurfFR, nSrfNbr = EgtSurfFlatRegion( nLayId, vClosedId) if nSurfFR then @@ -1105,6 +1148,9 @@ function CalcSlices.Exec( nPartId, nStmId) vtSlicing = VectorFromSpherical( 1, 45, dHorAng) elseif nSlicingType == SLICING_TYPE.HORIZONTAL then vtSlicing = X_AX() + elseif nSlicingType == SLICING_TYPE.MULTIPLANAR then + -- la direzione può cambiare da un piano all'altro + vtSlicing = Z_AX() end EgtSetInfo( s_nPartId, KEY_SLICING_DIR, vtSlicing) @@ -1167,7 +1213,7 @@ function CalcSlices.Exec( nPartId, nStmId) bOk = SlicingNoSolid( nRibsLay, vZSlices, dDeltaZStart, dZmin, frSlicing) else -- caso con solido - bOk = SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing) + bOk = SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicing, nSlicingType) end -- eventuale segnalazione errori diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index e4cfb3d..d92a606 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -89,6 +89,11 @@ end ------------------------------------------------------------------ local function AddZCorrection( b3Box, LayerParams) + local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') + if nSlicingType == SLICING_TYPE.MULTIPLANAR then + LayerParams.vtSlicing = Z_AX() + end + local dNxy = sqrt( LayerParams.vtSlicing:getX() * LayerParams.vtSlicing:getX() + LayerParams.vtSlicing:getY() * LayerParams.vtSlicing:getY()) local dNz = LayerParams.vtSlicing:getZ() -- altezza necessaria per lo strand @@ -2041,6 +2046,10 @@ local function SpiralVaseFull( vLayIds, LayerParams) -- ciclo sui layer for nIdx = 1, #vLayIds do + if nSlicingType == SLICING_TYPE.MULTIPLANAR then + LayerParams.vtSlicing = EgtGetInfo( vLayIds[nIdx], KEY_SLICING_DIR, 'v') + end + -- cerco i gruppi di contorni local vCrvGrpIds = EgtGetNameInGroup( vLayIds[ nIdx], CONTOUR_GRP.."*") if #vCrvGrpIds > 1 then @@ -2244,6 +2253,7 @@ local function SpiralVasePartial( vLayIds, LayerParams) -- la continuità tra i layers viene risolta sul tratto finale del layer percedente local bFirst = true + local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') -- individuo l'ultimo layer ( alcuni potrebbero essere vuoti) local nLastLay = 1 for nIdx = #vLayIds, 1, -1 do @@ -2258,7 +2268,11 @@ local function SpiralVasePartial( vLayIds, LayerParams) -- ciclo sui layer local nOldId for nIdx = 1, #vLayIds do - + + if nSlicingType == SLICING_TYPE.MULTIPLANAR then + LayerParams.vtSlicing = EgtGetInfo( vLayIds[nIdx], KEY_SLICING_DIR, 'v') + end + -- cerco i gruppi di contorni local vCrvGrpIds = EgtGetNameInGroup( vLayIds[ nIdx], CONTOUR_GRP.."*") if #vCrvGrpIds > 1 then @@ -2444,6 +2458,7 @@ function CalcToolPath.Exec( nPartId) -- recupero i parametri per calcolo dei toolpath local LayerParams = GetLayerParamsForToolPathCalc() + local nSlicingType = EgtGetInfo( s_nPartId, KEY_SLICING_TYPE, 'i') -- caso spiral vase if LayerParams.bSpiralVase then @@ -2456,7 +2471,11 @@ function CalcToolPath.Exec( nPartId) for nIdx = 1, #vLayIds do s_nCurrIdx = nIdx - + + if nSlicingType == SLICING_TYPE.MULTIPLANAR then + LayerParams.vtSlicing = EgtGetInfo( vLayIds[nIdx], KEY_SLICING_DIR, 'v') + end + -- scorro tutti i gruppi di contorni local nCrvGrpId = EgtGetFirstNameInGroup( vLayIds[ nIdx], CONTOUR_GRP.."*") while nCrvGrpId do diff --git a/LuaLibs/RunCalcSolids.lua b/LuaLibs/RunCalcSolids.lua index 15b87d6..9165ea5 100644 --- a/LuaLibs/RunCalcSolids.lua +++ b/LuaLibs/RunCalcSolids.lua @@ -410,11 +410,17 @@ function RunCalcSolids.Exec() end EgtSetInfo( nPartId, KEY_HAS_SOLIDS, 1) + local nSlicingType = EgtGetInfo( nPartId, KEY_SLICING_TYPE, 'i') -- recupero i parametri necessari al calcolo dei solidi local LayerParams = GetLayerParamsForSolidCalc( nPartId) for nIdx = 1, #vLayIds do + + if nSlicingType == SLICING_TYPE.MULTIPLANAR then + LayerParams.vtSlicing = EgtGetInfo( vLayIds[nIdx], KEY_SLICING_DIR, 'v') + end + -- flag di interruzione perchè trovati solidi già ok local bSolidsOk = false -- indice layer (per log) diff --git a/Version.lua b/Version.lua index ace580f..ef43c9a 100644 --- a/Version.lua +++ b/Version.lua @@ -1,4 +1,4 @@ --- Version.lua by Egaltech s.r.l. 2025/09/12 +-- Version.lua by Egaltech s.r.l. 2026/02/11 -- Gestione della versione di 3dPrinting -VERSION = '3.1a1' \ No newline at end of file +VERSION = '3.1b1' \ No newline at end of file