From d576203a97009c0791f3f912d301106e4d936544 Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 3 Jan 2023 16:36:47 +0100 Subject: [PATCH] 3dPrinting : - gestione setti chiusi - correzioni varie nelle regioni con diverse passate. --- LuaLibs/CalcPaths.lua | 60 ++++++++++++++++++++++++++++------------ LuaLibs/CalcToolPath.lua | 40 ++++++++++++++++----------- 2 files changed, 67 insertions(+), 33 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 77cb179..253cedb 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -58,7 +58,7 @@ end ---------------------------------------------------------------------- local function ComputeSurfOffset( nSrf, nGrpId, dOffs, vtSlicing) -- gruppo temporaneo locale - local nGrpTmp = EgtGroup( nGrpId, Frame3d( ORIG(), vtSlicing, GDB_RT.GLOB)) + local nGrpTmp = EgtGroup( nGrpId, Frame3d( ORIG(), vtSlicing), GDB_RT.GLOB) local nCopySrf = EgtCopyGlob( nSrf, nGrpTmp) or GDB_ID.NULL local bOk = EgtSurfFrOffset( nCopySrf, dOffs) local bExists = EgtSurfFrChunkCount( nCopySrf) > 0 @@ -545,13 +545,24 @@ local function AdjustRibsOffsetForIntersection( nCrv1, nCrv2, LayerParams, nOffs local vOffs2 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv2)) or {} for i = 1, #vOffs2 do local nId, nCnt = EgtTrimCurveWithRegion( vOffs2[i], nSrf, false, true) + + -- se setto chiuso verifico se primo e ultimo tratto possono essere uniti + if EgtCurveIsClosed( nCrv2) then + if nCnt > 1 and AreSamePointApprox( EgtEP( nId + nCnt - 1), EgtSP( nId)) then + EgtRelocateGlob( nId + nCnt - 1, nId, GDB_IN.AFTER) + EgtAddCurveCompoCurve( nId + nCnt - 1, nId) + EgtChangeId( nId + nCnt - 1, nId) + nCnt = nCnt - 1 + end + end + EgtChangeId( nId, vOffs2[i]) -- aggiorno ordine di split copiandolo da nCrv2 CopyInfo( nCrv2, vOffs2[i], KEY_SPLIT_ORDER, 'i') - if nCnt > 1 then - EgtSetInfo( nId + 1, KEY_SPLIT_RIB, vOffs2[i]) -- curva da cui deriva - CopyInfo( nCrv2, nId + 1, KEY_SPLIT_ORDER, 'i') -- ordine di split - EgtRelocateGlob( nId + 1, nOffsGrp, GDB_IN.LAST_SON) + for j = nId + nCnt - 1, nId + 1, -1 do + EgtSetInfo( j, KEY_SPLIT_RIB, vOffs2[i]) -- curva da cui deriva + CopyInfo( nCrv2, j, KEY_SPLIT_ORDER, 'i') -- ordine di split + EgtRelocateGlob( j, nOffsGrp, GDB_IN.LAST_SON) end end EgtErase( nSrf) @@ -1052,7 +1063,7 @@ local function UpdateRibSplitInfo( nGrp, tIds, tRemoved) end -------------------------------------------------------------------- -local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx) +local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) local vRibs = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') -- verifico se tutte le costolature vengono fatte con 2 passate @@ -1079,6 +1090,10 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx) EgtSetName( nNewId, EgtGetName( vRibs[i])) EgtSetInfo( nNewId, KEY_TYPE, TYPE.RIB) EgtRelocateGlob( nNewId, nOffsGrp) + + if EgtCurveIsClosed( vRibs[i]) then + EgtSetInfo( nNewId, "OriginalClosed", 1) + end end end @@ -1145,19 +1160,28 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx) else table.insert( tOldNewIds[ vOrderedRibs[i]], nCrv + nInd) - -- controllo la direzione (consideriamo inclinazione solo lungo X) - local vtDir = EgtMV( nCrv + nInd) - local dXl = sqrt( sqr( vtDir:getX()) + sqr( vtDir:getZ())) - local dYl = abs( vtDir:getY()) - local dVal = EgtIf( dXl > dYl - GEO.EPS_SMALL, vtDir:getX(), vtDir:getY()) - local bInvert = dVal < - GEO.EPS_SMALL - -- inversione della curva + local bInvert = false + if not EgtGetInfo( nCrv + nInd, "OriginalClosed", 'b') then + -- controllo la direzione (consideriamo inclinazione solo lungo X) + local vtDir = EgtMV( nCrv + nInd) + local dXl = sqrt( sqr( vtDir:getX()) + sqr( vtDir:getZ())) + local dYl = abs( vtDir:getY()) + local dVal = EgtIf( dXl > dYl - GEO.EPS_SMALL, vtDir:getX(), vtDir:getY()) + bInvert = dVal < - GEO.EPS_SMALL + end local bInvertInfo = EgtGetInfo( nCrv + nInd, KEY_RIBS_INVERT_DIR, 'b') or false - if bInvert ~= bInvertInfo then + -- inversione della curva + if bInvertInfo ~= bInvert then EgtInvertCurve( nCrv + nInd) EgtSetInfo( nCrv + nInd, KEY_INVERTED_CRV, 1) end + if EgtCurveIsClosed( nCrv + nInd) then + EgtSetInfo( nCrv + nInd, KEY_CLOSED_CRV, 1) + ModifyStartPoint( nCrv + nInd, vPtStart) + EgtSetInfo( nCrv + nInd, KEY_RIBS_LINK, 0) + end + -- salvo info della superficie di trim associata EgtSetInfo( nCrv + nInd, KEY_ASSOCIATED_SURF, tSurfOffs[nType][nOverlap]) @@ -1315,8 +1339,9 @@ local function TrimOuterCurveForExtraShellCalc( nOuterCrv, nSrfDiff, nGrpId, vPt -- verifico se prima e ultima curva possono essere unite if nCnt > 1 and AreSamePointApprox( EgtEP( nCrv + nCnt - 1), EgtSP( nCrv)) then - local nNewId = EgtCurveCompo( nGrpId, { nCrv + nCnt - 1, nCrv}) - EgtChangeId( nNewId, nCrv) + EgtRelocateGlob( nCrv + nCnt - 1, nCrv, GDB_IN.AFTER) + EgtAddCurveCompoCurve( nCrv + nCnt - 1, nCrv) + EgtChangeId( nCrv + nCnt - 1, nCrv) nCnt = nCnt - 1 end @@ -1494,6 +1519,7 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d end -- verifico se soddisfa vincolo sulla lunghezza if dLen > MIN_LEN and bValid then + EgtSetStatus( nId, GDB_ST.ON) EgtModifyCurveExtrusion( nId, LayerParams.vtSlicing, GDB_RT.GLOB) EgtSetName( nId, EXTRA_SHELL_CRV .. tostring( nMaxShellNbrDiff - nInd + 1)) if nInd == LayerParams.nShellsNbr then @@ -1858,7 +1884,7 @@ function CalcPaths.Exec( nPartId) -- sistemo eventuali costolature if nRibsGrp then - CalcRibsPaths( vLayIds[nIdx], nRibsGrp, LayerParams, nIdx) + CalcRibsPaths( vLayIds[nIdx], nRibsGrp, LayerParams, nIdx, vPtStart) end end diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 4fcdf68..473188a 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -374,7 +374,7 @@ local function CalcExtraShellToolPath( vEntIds, nTpathGrpId, LayerParams, dCorrZ if not vEntIds then return end -- aggiungo le curve nel toolpath - local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, LayerParams.nOrder, false, LayerParams.vtSlicing, LayerParams.dLayHeight, dCorrZ) + local vIds = AddCurvesToToolPath( vEntIds, nTpathGrpId, PRINT_ORDER.EXT_INT, false, LayerParams.vtSlicing, LayerParams.dLayHeight, dCorrZ) -- aggiungo gli opportuni raccordi local sPrevName = EgtGetName( vIds[1]) @@ -576,6 +576,7 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlic EgtTrimCurveStartEndAtParam( nLinkId, dParS, dParE) EgtSetInfo( nLinkId, KEY_TYPE, TYPE.RIB) + EgtSetName( nLinkId, LINK_CRV) if bInvert then EgtInvertCurve( nLinkId) end -- verifico se รจ valido local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) @@ -605,6 +606,7 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink, vtSlic local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) if bValid then EgtSetInfo( nLinkId, KEY_TYPE, TYPE.RIB) + EgtSetName( nLinkId, LINK_CRV) EgtModifyCurveExtrusion( nLinkId, vtSlicing, GDB_RT.GLOB) EgtRelocateGlob( nLinkId, nCurr, GDB_IN.AFTER) else @@ -998,9 +1000,11 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) end -- oriento tutte le passate relative ad una stessa costolatura - for j = 1, #tabRibs[i] do - if ( bInvert and j % 2 == 1) or ( not bInvert and j % 2 == 0) then - EgtInvertCurve( tabRibs[i][j]) + if not EgtCurveIsClosed( tabRibs[i][1]) then + for j = 1, #tabRibs[i] do + if ( bInvert and j % 2 == 1) or ( not bInvert and j % 2 == 0) then + EgtInvertCurve( tabRibs[i][j]) + end end end end @@ -1008,7 +1012,7 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) -- Link -- se modifiche nell'ordine ricalcolo i gruppi di costolature - if bSwap then + if bSwap then tabRibs = {} nFirst = EgtGetFirstNameInGroup( nTpathGrpId, RIBS_CRV .. '*') while nFirst do @@ -1021,18 +1025,22 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) -- collego le passate di una stessa costolatura for i = 1, #tabRibs do - for j = 1, #tabRibs[i] - 1 do - CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, true, LayerParams.vtSlicing, nGrpTmp) - if not bSpecialCase then - -- creo link fittizio per eliminare tratto corrispondente sulla curva di offset - local nFakeLink = CalcRibsLink( tabRibs[i][j + 1], tabRibs[i][j], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) + if EgtCurveIsClosed( tabRibs[i][1]) then + -- AddLink( tabRibs[i], nTpathGrpId, LayerParams.nLinkType, LayerParams.dLinkParam, LayerParams.dSPOffs, LayerParams.dStrand, LayerParams.vtSlicing) + else + for j = 1, #tabRibs[i] - 1 do + CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.dStrand, true, LayerParams.vtSlicing, nGrpTmp) + if not bSpecialCase then + -- creo link fittizio per eliminare tratto corrispondente sulla curva di offset + local nFakeLink = CalcRibsLink( tabRibs[i][j + 1], tabRibs[i][j], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) + EgtErase( nFakeLink) + end + end + if bSpecialCase then + local nFakeLink = CalcRibsLink( tabRibs[i][#tabRibs[i]], tabRibs[i][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) EgtErase( nFakeLink) end end - if bSpecialCase then - local nFakeLink = CalcRibsLink( tabRibs[i][#tabRibs[i]], tabRibs[i][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) - EgtErase( nFakeLink) - end end -- se necessario collego le diverse costolature @@ -1050,12 +1058,12 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) while nCrvRib do -- verifico se necessario lead in local nPrev = EgtGetPrev( nCrvRib) - if not nPrev or EgtGetName( nPrev) then + if not nPrev or EgtGetName( nPrev) ~= LINK_CRV then AddRibsLeadIn( nCrvRib, nLoopGrp, LayerParams.dStrand, LayerParams.vtSlicing, nGrpTmp) end -- verifico se necessario lead out local nNext = EgtGetNext( nCrvRib) - if not nNext or EgtGetName( nNext) then + if not nNext or EgtGetName( nNext) ~= LINK_CRV then AddRibsLeadOut( nCrvRib, nTpathGrpId, nLoopGrp, LayerParams.vtSlicing, LayerParams.dStrand, nGrpTmp) end nCrvRib = EgtGetNextName( nCrvRib, RIBS_CRV .. '*')