3dPrinting 3.1g1 :

- gestione di più solidi da stampare contemporaneamente nel gruppo "PrintSolid".
This commit is contained in:
SaraP
2026-07-01 12:48:23 +02:00
parent 7a1942fd49
commit 25fbec5a70
7 changed files with 653 additions and 588 deletions
+11 -12
View File
@@ -27,7 +27,9 @@ local function GetLayerParamsForSolidCalc( nPartId)
LayerParams.vtSlicing = EgtGetInfo( nPartId, KEY_SLICE_DIR, 'v') or EgtGetInfo( nPartId, 'SlicingDir', 'v')
LayerParams.dStrand = EgtGetInfo( nPartId, KEY_STRAND, 'd')
LayerParams.vtCorr = EgtGetInfo( nPartId, KEY_MOVED_PART2, 'v') or V_NULL()
LayerParams.nFloorNbr = EgtGetInfo( s_nPartId, KEY_FLOOR_NBR, 'i') or 0
local nFloorNbr = EgtGetInfo( s_nPartId, KEY_FLOOR_NBR, 'i') or 0
local nFirstSolidLay = EgtGetInfo( s_nPartId, KEY_FIRST_SOLID_LAY, 'i') or 1
LayerParams.nFirstSpiralLay = nFloorNbr + nFirstSolidLay
return LayerParams
end
@@ -643,7 +645,7 @@ local function CreateFullSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerPa
local ptProj = ptVertex + dDistCrv * LayerParams.vtSlicing
local dDistPlanePrev = ( ptProj - ptSlicingPrev) * vtSlicingPrev / dCosAng
local dDeltaPos
if nSliceNbr == 2 + LayerParams.nFloorNbr and dCurrLen < 0.5 * dLen then
if nSliceNbr == LayerParams.nFirstSpiralLay + 1 and dCurrLen < 0.5 * dLen then
dDeltaPos = 0.5 * dDistPlanePrev
else
dDeltaPos = dDistPlanePrev * ( dLen - dCurrLen) / dLen
@@ -651,7 +653,7 @@ local function CreateFullSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerPa
-- 2) per calcolare la vera altezza del solido calcolo la distanza dal toolpath precedente guardando il punto di riferimento sul percorso corrente
local dNewH
if nSliceNbr == 2 + LayerParams.nFloorNbr then
if nSliceNbr == LayerParams.nFirstSpiralLay + 1 then
-- il primo layer è ad altezza costante quindi è semplice distanza dal piano precedente lungo vtSlicing
dNewH = ( ptProj - ptSlicingPrev) * vtSlicingPrev / dCosAng - dDeltaPos
else
@@ -812,7 +814,6 @@ function RunCalcSolids.Exec()
s_dMultiPlanarH = min( dMaxFactor, 5) * LayerParams.dLayHeight
end
local bFirst = true
for nIdx = 1, #vLayIds do
-- flag di interruzione perchè trovati solidi già ok
local bSolidsOk = false
@@ -843,13 +844,13 @@ function RunCalcSolids.Exec()
if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 or nSlicingType == SLICING_TYPE.MULTIPLANAR_HOR then
LayerParams.vtSlicing = EgtGetInfo( vLayIds[nIdx], KEY_SLICE_DIR, 'v')
if LayerParams.bSpiralVase and nIdx > LayerParams.nFloorNbr then
if LayerParams.bSpiralVase and nIdx >= LayerParams.nFirstSpiralLay then
local dTransitionLen = EgtGetInfo( nPartId, KEY_SPIRAL_VASE_LEN, 'd') or 0
-- a) spiral vase completo ( con transizione in altezza su tutto il layer)
if dTransitionLen < GEO.EPS_SMALL then
if nIdx == LayerParams.nFloorNbr + 1 then
if nIdx == LayerParams.nFirstSpiralLay then
-- il primo layer va gestito come uno spiral vase con transizione parziale ( curva a quota costante e ultimo tratto che si alza)
CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx], bFirst)
CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx], nIdx == 1)
elseif nIdx == #vLayIds then
-- gestione speciale per lead out e coasting
CreateFullSpiralVaseMultiPlanarSolidsLastLayer( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx])
@@ -863,13 +864,13 @@ function RunCalcSolids.Exec()
-- ultimo layer è un multiplanare standard perchè non ha tratto finale che si alza
CreateMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx], false)
else
CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx], bFirst)
CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx], nIdx == 1)
end
end
-- c) multiplanare standard
else
CreateMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx], bFirst)
CreateMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx], nIdx == 1)
end
-- slicing standard spiral vase
@@ -916,14 +917,12 @@ function RunCalcSolids.Exec()
CreateSolidFromCurve( vIds[i], nSolidGrpId, LayerParams, nSliceNbr)
end
end
bFirst = false
end
else
bSolidsOk = true
break
end
--passo al gruppo di contorni successivo
-- passo al gruppo di contorni successivo
nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*") or GDB_ID.NULL
end
if bSolidsOk then