3dPrinting 3.1b1 :

- prime modifiche per slicing Multi Planare.
This commit is contained in:
Dario Sassi
2026-02-11 18:16:46 +01:00
parent bb1ba2b66f
commit eed869c997
6 changed files with 91 additions and 13 deletions
+2
View File
@@ -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'
+6 -1
View File
@@ -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)
+54 -8
View File
@@ -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
+21 -2
View File
@@ -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
+6
View File
@@ -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)
+2 -2
View File
@@ -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'
VERSION = '3.1b1'