3dPrinting :

- in presenza di floor e spiral vase separata gestione dei primi layers con floor ( fatti con ripartenze) da quelli senza floor ( fatti in spiral vase)
- correzioni varie per floor e lead in.
This commit is contained in:
SaraP
2026-06-18 08:57:26 +02:00
parent f0f1758636
commit d2c1d9a25a
3 changed files with 154 additions and 116 deletions
+17 -20
View File
@@ -27,6 +27,7 @@ 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
return LayerParams
end
@@ -448,20 +449,20 @@ end
local function CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, nLayerId, bFirst)
-- 1) le prime curve sono solidi multiplanari standard
for i = 1, #vIds - 1 do
CreateMultiPlanarSolids( { vIds[i]}, nSolidGrpId, LayerParams, nLayerId, bFirst)
end
local nLastId = vIds[#vIds]
vIds[#vIds] = nil
CreateMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, nLayerId, bFirst)
-- 2) l'ultima curva è il tratto che si alza fino al layer successivo
local nGrpTmp = EgtGroup( nSolidGrpId)
local dStrand = EgtGetInfo( vIds[#vIds], KEY_CRV_STRAND, 'd') or LayerParams.dStrand
local dStrand = EgtGetInfo( nLastId, KEY_CRV_STRAND, 'd') or LayerParams.dStrand
-- a) calcolo il solido
-- appiattisco la curva ( proiezione obliqua sul piano corrente lungo vtSlicing del piano successivo)
local nNextLayerId = EgtGetNext( nLayerId)
local vtSlicingNext = EgtGetInfo( nNextLayerId, KEY_SLICE_DIR, 'v')
local ptSlicing = EgtGetInfo( nLayerId, KEY_SLICE_POS, 'p') + LayerParams.dLayHeight * LayerParams.vtSlicing + LayerParams.vtCorr
local nProjCrv = EgtCopyGlob( vIds[#vIds], nGrpTmp)
local nProjCrv = EgtCopyGlob( nLastId, nGrpTmp)
local _, dE = EgtCurveDomain( nProjCrv)
for dU = 0, dE do
local ptCurr = EgtUP( nProjCrv, dU, GDB_ID.ROOT)
@@ -470,8 +471,8 @@ local function CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, Laye
end
-- calcolo la sezione iniziale
local ptS = EgtSP( vIds[#vIds], GDB_ID.ROOT)
local ptE = EgtEP( vIds[#vIds], GDB_ID.ROOT)
local ptS = EgtSP( nLastId, GDB_ID.ROOT)
local ptE = EgtEP( nLastId, GDB_ID.ROOT)
local vtDir = EgtSV( nProjCrv, GDB_ID.ROOT)
vtDir:rotate( LayerParams.vtSlicing, 90)
local nSectId = CreateSection( ptS, vtDir, dStrand, s_dMultiPlanarH, LayerParams.vtSlicing, nGrpTmp)
@@ -481,7 +482,7 @@ local function CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, Laye
local nSectE = CreateSection( ptE, vtDir2, dStrand, s_dMultiPlanarH, LayerParams.vtSlicing, nGrpTmp)
-- creo le guide per il solido aperto ( tubo)
local dMaxDist = ( EgtEP( vIds[#vIds], GDB_ID.ROOT) - ptSlicing) * LayerParams.vtSlicing / ( vtSlicingNext * LayerParams.vtSlicing)
local dMaxDist = ( EgtEP( nLastId, GDB_ID.ROOT) - ptSlicing) * LayerParams.vtSlicing / ( vtSlicingNext * LayerParams.vtSlicing)
local vCrvs = {}
local _, dParE = EgtCurveDomain( nSectId)
for i = 0, dParE do
@@ -520,8 +521,8 @@ local function CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, Laye
end
end
-- creazione del mezzo disco iniziale e finale
vSurfs[#vCrvs] = CreateSpiralVaseCap( nSectId, - EgtSV( vIds[#vIds], GDB_ID.ROOT), nSolidGrpId)
vSurfs[#vCrvs + 1] = CreateSpiralVaseCap( nSectE, EgtEV( vIds[#vIds], GDB_ID.ROOT), nSolidGrpId)
vSurfs[#vCrvs] = CreateSpiralVaseCap( nSectId, - EgtSV( nLastId, GDB_ID.ROOT), nSolidGrpId)
vSurfs[#vCrvs + 1] = CreateSpiralVaseCap( nSectE, EgtEV( nLastId, GDB_ID.ROOT), nSolidGrpId)
EgtInvertSurf( vSurfs[#vSurfs])
local nSolidId = EgtSurfTmByTriangles( nSolidGrpId, vSurfs)
@@ -642,7 +643,7 @@ local function CreateFullSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerPa
local ptProj = ptVertex + dDistCrv * LayerParams.vtSlicing
local dDistPlanePrev = ( ptProj - ptSlicingPrev) * vtSlicingPrev / dCosAng
local dDeltaPos
if nSliceNbr == 2 and dCurrLen < 0.5 * dLen then
if nSliceNbr == 2 + LayerParams.nFloorNbr and dCurrLen < 0.5 * dLen then
dDeltaPos = 0.5 * dDistPlanePrev
else
dDeltaPos = dDistPlanePrev * ( dLen - dCurrLen) / dLen
@@ -650,18 +651,13 @@ 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 then
if nSliceNbr == 2 + LayerParams.nFloorNbr then
-- il primo layer è ad altezza costante quindi è semplice distanza dal piano precedente lungo vtSlicing
dNewH = ( ptProj - ptSlicingPrev) * vtSlicingPrev / dCosAng - dDeltaPos
else
local _, ptMinDistPrev = EgtPointCurveDist( ptMinDist, nPrevTPathRef, GDB_ID.ROOT)
local dDistPlanePrev2 = ( ptMinDist - ptSlicingPrev) * vtSlicingPrev / dCosAng
local dDeltaPos2
if nSliceNbr == 2 and dCurrLen < 0.5 * dLen then
dDeltaPos2 = 0.5 * dDistPlanePrev2
else
dDeltaPos2 = dDistPlanePrev2 * ( dLen - dCurrLen) / dLen
end
local dDeltaPos2 = dDistPlanePrev2 * ( dLen - dCurrLen) / dLen
dNewH = ( ptMinDist - ptMinDistPrev) * LayerParams.vtSlicing - dDeltaPos2
-- aggiungo un piccolo extra per tener conto che la distanza è stata calcolata sulle curve centrali del solido
local dExtra = ( LayerParams.vtSlicing ^ vtSlicingPrev):len() / dCosAng * dStrand * 0.5
@@ -847,11 +843,11 @@ 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 then
if LayerParams.bSpiralVase and nIdx > LayerParams.nFloorNbr 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 bFirst then
if nIdx == LayerParams.nFloorNbr + 1 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)
elseif nIdx == #vLayIds then
@@ -870,6 +866,7 @@ function RunCalcSolids.Exec()
CreatePartialSpiralVaseMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx], bFirst)
end
end
-- c) multiplanare standard
else
CreateMultiPlanarSolids( vIds, nSolidGrpId, LayerParams, vLayIds[nIdx], bFirst)