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:
+17
-20
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user