diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 52ffd6c..0d4daa7 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -184,6 +184,7 @@ local function GetPathsFromSurf( nSrfId, sName, nType, nGrpId, vPtStart) for nInd = 0, nCrvCnt - 1 do EgtSetName( nCrvId + nInd, sName) EgtSetInfo( nCrvId + nInd, KEY_TYPE, nType) + EgtModifyCurveExtrusion( nCrvId + nInd, s_vtSlicing, GDB_ID.ROOT) -- se è loop interno lo inverto per averlo orientato in senso antiorario if nInd > 0 then @@ -2528,6 +2529,89 @@ end -------------------------------------------------------------------- --------------------- RIBS-MERGED SHELLS --------------------------- +-------------------------------------------------------------------- +local function CalcFillet( nCrv1, nCrv2, dFillet, nGrpId, nGrpTmp) + + if dFillet < GEO.EPS_SMALL then return end + + -- creo il fillet + local dParRef1 = EgtCurveParamAtLength( nCrv1, EgtCurveLength( nCrv1) - 100 * GEO.EPS_SMALL) + local dParRef2 = EgtCurveParamAtLength( nCrv2, 100 * GEO.EPS_SMALL) + local nFillet = EgtCurveFillet( nGrpTmp, nCrv1, EgtUP( nCrv1, dParRef1, nGrpTmp), nCrv2, EgtUP( nCrv2, dParRef2, nGrpTmp), dFillet, true, GDB_RT.LOC) + if not nFillet then + -- ritento con valore di fillet leggermente inferiore + nFillet = EgtCurveFillet( nGrpTmp, nCrv1, EgtUP( nCrv1, dParRef1, nGrpTmp), nCrv2, EgtUP( nCrv2, dParRef2, nGrpTmp), dFillet - 50 * GEO.EPS_SMALL, true, GDB_RT.LOC) + end + + -- spezzo a metà il fillet per assegnarlo alle due curve + if nFillet then + local nNewFillet = EgtSplitCurve( nFillet, 2) + + -- aggiungo a nCrv1 + if EgtExistsObj( nCrv1) then + EgtAddCurveCompoArcTg( nCrv1, EgtEP( nNewFillet, GDB_ID.ROOT), true, GDB_RT.GLOB) + EgtErase( nNewFillet) + else + -- nCrv1 viene sostituita completamente dal fillet + local nNewCrv = EgtCurveCompo( nGrpId, {nNewFillet}) + EgtChangeId( nNewCrv, nCrv1) + end + + -- aggiungo a nCrv2 + if EgtExistsObj( nCrv2) then + EgtAddCurveCompoArcTg( nCrv2, EgtSP( nNewFillet + 1, GDB_ID.ROOT), false, GDB_RT.GLOB) + EgtErase( nNewFillet + 1) + else + -- nCrv2 viene sostituita completamente dal fillet + local nNewCrv = EgtCurveCompo( nGrpId, {nNewFillet + 1}) + EgtChangeId( nNewCrv, nCrv2) + end + else + EgtOutLog( 'Warning : ribs-merged shells fillet not possible (layer '..tostring( s_nCurrIdx)..') - CalcPath') + end + + EgtRelocateGlob( nFillet or GDB_ID.NULL, nGrpId) +end + +-------------------------------------------------------------------- +local function AddFillet( nRib1, vLinks, nRib2, nGrpId) + + local dFillet1 = EgtGetInfo( nRib1, KEY_RIBS_LINK_FILLET, 'd') + local dFillet2 = EgtGetInfo( nRib2, KEY_RIBS_LINK_FILLET, 'd') + -- verifico se necessaria correzione per passate dello stesso setto + local nOrig1 = EgtGetInfo( nRib1, KEY_ORIGINAL_RIB, 'i') + local nOrig2 = EgtGetInfo( nRib2, KEY_ORIGINAL_RIB, 'i') + local nSplit1 = EgtGetInfo( nRib1, KEY_SPLIT_ID, 'i') or 0 + local nSplit2 = EgtGetInfo( nRib2, KEY_SPLIT_ID, 'i') or 0 + if nOrig1 == nOrig2 and nSplit1 == nSplit2 then + local dStrand = EgtGetInfo( nRib1, KEY_RIBS_STRAND, 'd') + dFillet1 = min( dFillet1, 0.5 * dStrand) + dFillet2 = dFillet1 + end + + -- creo un gruppo con riferimento locale allo slicing per i conti del fillet + local nGrpTmp = EgtGroup( nGrpId, Frame3d( ORIG(), s_vtSlicing), GDB_RT.GLOB) + + -- calcolo il primo fillet + local ptRib1 = EgtEP( nRib1, GDB_ID.ROOT) + for i = 1, #vLinks do + if AreSamePointApprox( ptRib1, EgtSP( vLinks[i], GDB_ID.ROOT)) then + CalcFillet( nRib1, vLinks[i], dFillet1, nGrpId, nGrpTmp) + break + end + end + -- calcolo il secondo fillet + local ptRib2 = EgtSP( nRib2, GDB_ID.ROOT) + for i = 1, #vLinks do + if AreSamePointApprox( EgtEP( vLinks[i], GDB_ID.ROOT), ptRib2) then + CalcFillet( vLinks[i], nRib2, dFillet2, nGrpId, nGrpTmp) + break + end + end + + EgtErase( nGrpTmp) +end + -------------------------------------------------------------------- local function ComputeShortestLinkOnCurve( nCrv, dParS, dParE, nGrp) @@ -2778,6 +2862,8 @@ local function HandleRibsIntersectionForRibsMergedShells( vOrigRibs, nRibsGrp, n if nLinkId then local nRes = EgtCurveWithRegionClassify( nLinkId, nShellSrf) if nRes == GDB_CRC.IN then + -- fillet + AddFillet( nCrv, {nLinkId}, nCrv + 1, nRibsGrp) EgtAddCurveCompoCurve( nCrv + 1, nLinkId, true, false) EgtAddCurveCompoCurve( nCrv + 1, nCrv, true, false) else @@ -2883,6 +2969,7 @@ local function CreateRibsMergedShellLastLink( vShells, vRibs, nGrp, bInvert) if bInvert then -- conservo tratto dParS->dParE EgtTrimCurveStartEndAtParam( nLink, dParS, dParE) + EgtInvertCurve( nLink) else -- conservo tratto dParE->dParS EgtTrimCurveStartEndAtParam( nLink, dParE, dParS) @@ -2925,6 +3012,8 @@ local function CreateRibsMergedShellLastLink( vShells, vRibs, nGrp, bInvert) end end if nPartLink then + -- fillet + AddFillet( vRibs[i], {nPartLink}, nOtherPart, nGrp) EgtAddCurveCompoCurve( vRibs[i], nPartLink) EgtAddCurveCompoCurve( vRibs[i], nOtherPart) end @@ -3017,6 +3106,7 @@ local function AdjustRibsMergedExtraShellLink( nLinkId, vExtraShells, nGrp) local frLoc = Frame3d( ORIG(), s_vtSlicing) local nGrpLoc = EgtGroup( nGrp, frLoc) + local vLinks = {} -- devo conservare solo le intersezioni fra link ed extra shell for i = 1, #vExtraShells do @@ -3024,6 +3114,8 @@ local function AdjustRibsMergedExtraShellLink( nLinkId, vExtraShells, nGrp) if nRes then for nId = nRes + nPntCnt, nRes + nPntCnt + nCrvCnt - 1 do EgtRelocateGlob( nId, nGrp) + EgtModifyCurveExtrusion( nId, s_vtSlicing, GDB_ID.ROOT) + table.insert( vLinks, nId) end end end @@ -3031,6 +3123,7 @@ local function AdjustRibsMergedExtraShellLink( nLinkId, vExtraShells, nGrp) -- cancello il link originale EgtErase( nLinkId) EgtErase( nGrpLoc) + return vLinks end -------------------------------------------------------------------- @@ -3072,7 +3165,7 @@ local function CreateRibsMergedShellCurve( nGrp, nRibsGrp, vShells, vOrigShells, -- creo il link local nLinkId = CreateRibsMergedShellLink( nCurr, nNext, nGrp, EgtIf( bLinkOnShell, vLoopsShell, vLoopsTrim), nRibsGrp) if not nLinkId then - return false + return false end -- se link fatto sulla shell verifico non si sovrapponga al last link @@ -3094,16 +3187,24 @@ local function CreateRibsMergedShellCurve( nGrp, nRibsGrp, vShells, vOrigShells, end -- verifico se necessari aggiustamenti per extra shell + local vLinks if bExtraShell and bLinkOnShell then - AdjustRibsMergedExtraShellLink( nLinkId, vOrigShells, nGrp) + vLinks = AdjustRibsMergedExtraShellLink( nLinkId, vOrigShells, nGrp) end + -- fillet + AddFillet( nCurr, vLinks or {nLinkId}, nNext, nGrp) + end -- eventuali aggiustamenti del last link per extra shell + local vLastLinks if bExtraShell then - AdjustRibsMergedExtraShellLink( nLastLink, vOrigShells, nGrp) + vLastLinks = AdjustRibsMergedExtraShellLink( nLastLink, vOrigShells, nGrp) end + + -- fillet sul last link + AddFillet( vRibs[#vRibs], vLastLinks or {nLastLink}, vRibs[1], nGrp) -- elimino le curve inutili e le superfici EgtErase( nRibsGrp) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 7712718..7d4fa14 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -390,7 +390,7 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi -- curva ausiliaria per generare correttamente wipe local nCopyId = EgtCopyGlob( nCrvId, nCrvId, GDB_IN.AFTER) - if not EgtCurveIsClosed( nCopyId) then + if not EgtCurveIsClosed( nCopyId) and EgtCurveIsFlat( nCopyId) then local ptNewStart = EgtEP( nCopyId, GDB_ID.ROOT) -- mi posiziono in un frame locale per fare i conti local nGrp = EgtGroup( EgtGetParent( nCrvId), Frame3d( ORIG(), vtSlicing), GDB_RT.GLOB) @@ -400,10 +400,12 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi if nInters > 0 then -- caso con sovrapposizione nCopyId, nCrvCnt = EgtSplitCurveAtSelfInters( nCopyId) - for nIdx = 1, nCrvCnt - 2 do - EgtAddCurveCompoCurve( nCopyId, nCopyId + nIdx) + if nCrvCnt > 1 then + for nIdx = 1, nCrvCnt - 2 do + EgtAddCurveCompoCurve( nCopyId, nCopyId + nIdx) + end + EgtErase( nCopyId + nCrvCnt - 1) end - EgtErase( nCopyId + nCrvCnt - 1) end EgtCloseCurveCompo( nCopyId) EgtChangeClosedCurveStartPoint( nCopyId, ptNewStart, GDB_RT.GLOB) @@ -1064,6 +1066,10 @@ end -------------------------------------------------------------------- local function AddFillet( nCrv1, nCrv2, dFillet, vtSlicing) + if dFillet < GEO.EPS_SMALL then + return + end + local nRefPosId = EgtGetPrev( nCrv1) local nRefGrpId = EgtGetParent( nCrv1) local vsInfo1 = EgtGetAllInfo( nCrv1) @@ -1091,7 +1097,7 @@ local function AddFillet( nCrv1, nCrv2, dFillet, vtSlicing) EgtAddCurveCompoArcTg( nCrv1, EgtEP( nNewFillet, GDB_ID.ROOT), true, GDB_RT.GLOB) EgtErase( nNewFillet) else - -- nCrv1 viene sostutuita completamente dal fillet + -- nCrv1 viene sostituita completamente dal fillet local nNewCrv = EgtCurveCompo( nRefGrpId, {nNewFillet}) -- riposiziono dopo il precedente di nCrv1 ( se esiste) oppure in testa al gruppo if nRefPosId ~= GDB_ID.NULL then @@ -1113,7 +1119,7 @@ local function AddFillet( nCrv1, nCrv2, dFillet, vtSlicing) EgtAddCurveCompoArcTg( nCrv2, EgtSP( nNewFillet + 1, GDB_ID.ROOT), false, GDB_RT.GLOB) EgtErase( nNewFillet + 1) else - -- nCrv2 viene sostutuita completamente dal fillet + -- nCrv2 viene sostituita completamente dal fillet local nNewCrv = EgtCurveCompo( nRefGrpId, {nNewFillet + 1}) EgtRelocateGlob( nNewCrv, nCrv1, GDB_IN.AFTER) EgtChangeId( nNewCrv, nCrv2) @@ -1977,7 +1983,7 @@ end -------------------------------------------------------------------- local function AddSpiralVaseLeadOut( nOldId, LayerParams) - if LayerParams.nLeadOutType ~= LEAD_TYPE.NONE then + if LayerParams.nLeadOutType ~= LEAD_TYPE.NONE then EgtTrimCurveEndAtLen( nOldId, EgtCurveLength( nOldId) - LayerParams.dOffsetLP) local nLeadOut = AddLeadOut( nOldId, LayerParams, EgtGetParent( nOldId)) if nLeadOut then diff --git a/Version.lua b/Version.lua index 747317e..464c300 100644 --- a/Version.lua +++ b/Version.lua @@ -1,4 +1,4 @@ -- Version.lua by Egaltech s.r.l. 2024/02/13 -- Gestione della versione di 3dPrinting -VERSION = '2.6c1' \ No newline at end of file +VERSION = '2.6d1' \ No newline at end of file