diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 1cba96b..7c1b826 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -179,6 +179,8 @@ KEY_COEFF_Y = "CoeffY" KEY_SPEED_MIN = "SpeedMin" KEY_SPEED_MAX = "SpeedMax" KEY_FEED_MAX = 'FeedMax' +KEY_LINEAR_APPROX = 'LinearApprox' +KEY_LINEAR_TOL = 'LinearTol' -- Altre chiavi KEY_MAX_H = "SlicingHeight" diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 3c09076..c3fe505 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -55,6 +55,11 @@ local function GetLayerParamsForToolPathCalc() LayerParams.dInfillCoasting = EgtGetInfo( s_nPartId, KEY_INFILL_COASTING, 'd') or 0 LayerParams.dInfillWipe = EgtGetInfo( s_nPartId, KEY_INFILL_WIPE, 'd') or 0 LayerParams.dInfillWipeDir = EgtGetInfo( s_nPartId, KEY_INFILL_WIPE_DIR, 'd') or 0 + + -- parametri dal file macchina per eventuale approssimazione lineare dei percorsi + local sMachIni = EgtGetCurrMachineDir() .. '\\' .. EgtGetCurrMachineName() .. '.ini' + LayerParams.bLinearApprox = ( EgtGetNumberFromIni( SEC_3DPRINTING, KEY_LINEAR_APPROX, 0, sMachIni) == 1) + LayerParams.dLinearApproxTol = EgtGetNumberFromIni( SEC_3DPRINTING, KEY_LINEAR_TOL, 0.1, sMachIni) return LayerParams end @@ -346,6 +351,8 @@ local function AddLeadIn( nCrvId, LayerParams, nGrpId) local dStrand = EgtGetInfo( nCrvId, KEY_CRV_STRAND, 'd') EgtSetInfo( nLeadInCrv, KEY_CRV_STRAND, dStrand) end + + return nLeadInCrv end -------------------------------------------------------------------- @@ -1990,6 +1997,9 @@ local function AddSpiralVaseLeadOut( nOldId, LayerParams) EgtTrimCurveEndAtLen( nOldId, EgtCurveLength( nOldId) - LayerParams.dOffsetLP) local nLeadOut = AddLeadOut( nOldId, LayerParams, EgtGetParent( nOldId)) if nLeadOut then + if LayerParams.bLinearApprox then + EgtApproxCurve( nLeadOut, GDB_CA.LINES, LayerParams.dLinearApproxTol) + end local dDelta = LayerParams.dLayHeight / EgtCurveLength( nOldId) * EgtCurveLength( nLeadOut) EgtSpiralizeCurveAlongExtrusion( nLeadOut, dDelta) end @@ -2090,10 +2100,18 @@ local function SpiralVase( vLayIds, LayerParams) local nNewPart = EgtSplitCurveAtParam( nNewEntId, dTrimPar) EgtSpiralizeCurveAlongExtrusion( nNewPart, 0.5 * LayerParams.dLayHeight) + if LayerParams.bLinearApprox then + EgtApproxCurve( nNewEntId, GDB_CA.LINES, LayerParams.dLinearApproxTol) + EgtApproxCurve( nNewPart, GDB_CA.LINES, LayerParams.dLinearApproxTol) + end + -- eventuale lead in if LayerParams.nLeadInType ~= LEAD_TYPE.NONE then EgtTrimCurveStartAtLen( nNewEntId, LayerParams.dOffsetLP) - AddLeadIn( nNewEntId, LayerParams, nTpathGrpId) + local nLeadInCrv = AddLeadIn( nNewEntId, LayerParams, nTpathGrpId) + if nLeadInCrv and LayerParams.bLinearApprox then + EgtApproxCurve( nLeadInCrv, GDB_CA.LINES, LayerParams.dLinearApproxTol) + end end else local ptOld = EgtEP( nOldId, GDB_ID.ROOT) @@ -2103,7 +2121,7 @@ local function SpiralVase( vLayIds, LayerParams) end local ptNew = EgtSP( nNewEntId, GDB_ID.ROOT) -- modifico la curva per avere una transizione più uniforme tra i due layers - if EgtCurveCompoRadius( nNewEntId, 0) == -1 and dist( ptOld, ptNew) / EgtCurveCompoLength( nNewEntId, 0) < s_dSpiralVaseTanTol then + if EgtCurveCompoRadius( nNewEntId, 0) == -1 and dist( ptOld, ptNew) / EgtCurveCompoLength( nNewEntId, 0) < s_dSpiralVaseTanTol then -- se i punti sono abbastanza vicini e la curva inizia con un tratto lineare sufficientemente lungo allora distribuisco la differenza tra i -- due layer solo sul primo tratto EgtModifyCurveStartPoint( nNewEntId, ptOld, GDB_RT.GLOB) @@ -2132,11 +2150,15 @@ local function SpiralVase( vLayIds, LayerParams) -- approssimo local ptS = EgtSP( nNewEntId, GDB_ID.ROOT) EgtApproxCurve( nNewEntId, GDB_CA.ARCS, s_dApproxTol) + if LayerParams.bLinearApprox then + EgtApproxCurve( nNewEntId, GDB_CA.LINES, LayerParams.dLinearApproxTol) + end if EgtCurveIsClosed( nNewEntId) then EgtChangeClosedCurveStartPoint( nNewEntId, ptS, GDB_RT.GLOB) end - -- modifica graduale del'altezza + + -- modifica graduale dell'altezza if nRealLayer == 2 then -- se seconda passata la prima metà deve essere a quota costante 0.5 * dLayHeight, la seconda metà deve salire gradualmente di 0.5 * dLayHeight EgtMove( nNewEntId, 0.5 * LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB) @@ -2321,6 +2343,15 @@ function CalcToolPath.Exec( nPartId) nLayCnt = nIdx end + -- eventuale approssimazione delle curve + if LayerParams.bLinearApprox then + local nCrvId = EgtGetFirstInGroup( nTpathGrpId) + while nCrvId do + EgtApproxCurve( nCrvId, GDB_CA.LINES, LayerParams.dLinearApproxTol) + nCrvId = EgtGetNext( nCrvId) + end + end + -- passo al gruppo di contorni successivo nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*") end diff --git a/Version.lua b/Version.lua index bff7799..a9268a2 100644 --- a/Version.lua +++ b/Version.lua @@ -1,4 +1,4 @@ -- Version.lua by Egaltech s.r.l. 2024/05/06 -- Gestione della versione di 3dPrinting -VERSION = '2.7d1' \ No newline at end of file +VERSION = '2.7f1' \ No newline at end of file