From f834d006f66c6dddb56ea5be935395a8cd3f1a1f Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 7 Nov 2022 10:09:12 +0100 Subject: [PATCH] 3dPrinting : - gestione uscite differenziate per regioni con diverse passate. --- LuaLibs/AddManData.lua | 4 + LuaLibs/CalcPaths.lua | 166 ++++++++++++++++++++++++++------------- LuaLibs/CalcSlices.lua | 14 +++- LuaLibs/CalcToolPath.lua | 22 ++++-- 4 files changed, 142 insertions(+), 64 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index f6ad970..aeee3b3 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -104,6 +104,9 @@ KEY_SHELL_NBR_DIFF = "ShellNbrDifference" KEY_SHELL_NBR_COASTING = "ShellNbrCoasting" KEY_SHELL_NBR_WIPE = "ShellNbrWipe" KEY_SHELL_NBR_WIPE_DIR = "ShellNbrWipeDir" +KEY_EXTRA_SHELL_COASTING = "ExtraShellCoasting" +KEY_EXTRA_SHELL_WIPE = "ExtraShellWipe" +KEY_EXTRA_SHELL_WIPE_DIR = "ExtraShellWipeDir" -- Solidi ausiliari KEY_AUX_SOLIDS_INFILL = "AuxSolidsInfill" @@ -133,6 +136,7 @@ KEY_ZIG_ZAG_DIR = "ZigZagDir" KEY_INVERTED_CRV = "InvertedCrv" KEY_CLOSED_CRV = "ClosedCrv" KEY_ASSOCIATED_SURF = "AssociatedSurf" +KEY_ASSOCIATED_CRVS = "AssociatedCrvs" KEY_HAS_SOLIDS = "Solids" SLICING_TYPE = { diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index f07e5ca..19ddcf8 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -32,7 +32,11 @@ local function GetLayerParamsForPathCalc() LayerParams.bPrintInvert = ( EgtGetInfo( s_nPartId, KEY_PRINT_DIRECTION, 'i') == PRINT_DIRECTION.CW) -- parametri costolature LayerParams.bRibsInvertOrder = EgtGetInfo( s_nPartId, KEY_RIBS_INVERT_ORDER, 'b') - + -- parametri regioni con diverse passate + LayerParams.dShellNbrCoasting = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_COASTING, 'd') + LayerParams.dShellNbrWipe = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE, 'd') + LayerParams.dShellNbrWipeDir = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE_DIR, 'd') + -- eventuale modifica dei parametri per gestire correttamente il caso spiral vase if LayerParams.bSpiralVase then LayerParams.nShellsNbr = 1 @@ -1165,6 +1169,8 @@ local function CreateShellNbrSurfaces( nGrp, nShellsNbr) EgtErase( nSrfTmp) end EgtSetName( nSrfId, SHELL_NBR_SURF .. tostring( nDiff)) + -- salvo come info gli id delle curve che la definiscono + EgtSetInfo( nSrfId, KEY_ASSOCIATED_CRVS, vCrvIds) end end @@ -1190,10 +1196,68 @@ local function ComputeMaxShellNbrDiff( nSrf, nShellNbrSurfGrp) return nMaxShellNbrDiff end +---------------------------------------------------------------- +local function FindExtraShellRetractionParams( ptP, vIds, LayerParams) + + local dCoasting, dWipe, dWipeDir + -- cerco la curva sulla quale si ferma + for i = 1, #vIds do + local dPar = EgtCurveParamAtPoint( vIds[i], ptP, 10 * GEO.EPS_SMALL) + if dPar then + dCoasting = EgtGetInfo( vIds[i], KEY_SHELL_NBR_COASTING, 'd') + dWipe = EgtGetInfo( vIds[i], KEY_SHELL_NBR_WIPE, 'd') + dWipeDir = EgtGetInfo( vIds[i], KEY_SHELL_NBR_WIPE_DIR, 'd') + break + end + end + + if not dCoasting then + -- se non ho trovato una curva considero i parametri generali + return LayerParams.dShellNbrCoasting, LayerParams.dShellNbrWipe, LayerParams.dShellNbrWipeDir + else + return dCoasting, dWipe, dWipeDir + end +end + +----------------------------------------------------------------- +local function TrimOuterCurveForExtraShellCalc( nOuterCrv, nSrfDiff, nGrpId, vPtStart, LayerParams) + + local nCopy = EgtCopyGlob( nOuterCrv, nGrpId) + ModifyStartPoint( nCopy, vPtStart) + -- recupero tutte le curve delle ShellNumber coinvolte + local vShellNbrCrvs = EgtGetInfo( nSrfDiff, KEY_ASSOCIATED_CRVS, 'vi') + + -- trim della curva + local nCrv, nCnt = EgtTrimCurveWithRegion( nCopy, nSrfDiff, false, false) + if nCrv and nCnt ~= 0 then + + -- 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) + nCnt = nCnt - 1 + end + + -- assegno le info in base alla curva che li delimita + for nId = nCrv, nCrv + nCnt - 1 do + local ptS = EgtSP( nId) + local dCoastingS, dWipeS, dWipeDirS = FindExtraShellRetractionParams( ptS, vShellNbrCrvs, LayerParams) + local ptE = EgtEP( nId) + local dCoastingE, dWipeE, dWipeDirE = FindExtraShellRetractionParams( ptE, vShellNbrCrvs, LayerParams) + EgtSetInfo( nId, KEY_EXTRA_SHELL_COASTING, {dCoastingS, dCoastingE}) + EgtSetInfo( nId, KEY_EXTRA_SHELL_WIPE, {dWipeS, dWipeE}) + EgtSetInfo( nId, KEY_EXTRA_SHELL_WIPE_DIR, {dWipeDirS, dWipeDirE}) + end + return nCrv, nCnt + else + return nOuterCrv, 0 + end +end + -------------------------------------------------------------------- local function UpdateTotalShellSurf( nSrf, nCrv, dStrand, nGrpId) - local nSrfExtraShell = EgtSurfFrFatCurve( nGrpId, nCrv, dStrand - s_dOffsCorr, false) + local nSrfExtraShell = EgtSurfFrFatCurve( nGrpId, nCrv, dStrand - s_dOffsCorr, false) if nSrfExtraShell then local vtSrfN = EgtSurfFrNormVersor( nSrf, GDB_ID.ROOT) local vtSrfExShN = EgtSurfFrNormVersor( nSrfExtraShell, GDB_ID.ROOT) @@ -1328,68 +1392,58 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d local nSrfDiff = EgtGetFirstNameInGroup( nShellNbrGrp, SHELL_NBR_SURF .. tostring( nInd)) local nOuterCrv = EgtGetFirstNameInGroup( nCrvGrpId, OUTER_CRV) while nOuterCrv do - local nCopy = EgtCopyGlob( nOuterCrv, nGrpId) - ModifyStartPoint( nCopy, vPtStart) + -- trim della curva con la superficie + local nTrimCrv, nTrimCnt = TrimOuterCurveForExtraShellCalc( nOuterCrv, nSrfDiff, nGrpId, vPtStart, LayerParams) - -- trim della curva con la regione con diverso numero di passate - local nTrimCrv, nTrimCnt = EgtTrimCurveWithRegion( nCopy, nSrfDiff, false, false) - if nTrimCnt ~= 0 then - -- verifico se prima e ultima curva possono essere unite - if nTrimCnt > 1 and AreSamePointApprox( EgtEP( nTrimCrv + nTrimCnt - 1), EgtSP( nTrimCrv)) then - local nNewId = EgtCurveCompo( nGrpId, { nTrimCrv + nTrimCnt - 1, nTrimCrv}) - EgtChangeId( nNewId, nTrimCrv) - nTrimCnt = nTrimCnt - 1 - end - - for nCrvT = nTrimCrv, nTrimCrv + nTrimCnt - 1 do - -- calcolo offset della curva ( è il percorso della shell) - EgtModifyCurveExtrusion( nCrvT, LayerParams.vtSlicing, GDB_RT.GLOB) - local nOffs, nOffsCnt = EgtOffsetCurveAdv( nCrvT, - dOffs) - EgtErase( nCrvT) - for nCrvOffs = nOffs, nOffs + nOffsCnt - 1 do - -- trim con la regione già occupata dal altre shell - local nCrv, nCnt = EgtTrimCurveWithRegion( nCrvOffs, nSrfTrim, true, true) - if nCrv and nCnt ~= 0 then - for nId = nCrv, nCrv + nCnt - 1 do - local dLen = EgtCurveLength( nId) - local bValid = true - if EgtCurveIsClosed( nId) then - bValid = VerifyPath( nId, LayerParams.dStrand, LayerParams.vtSlicing, nGrpId) - end - -- verifico se soddisfa vincolo sulla lunghezza - if dLen > MIN_LEN and bValid then - EgtModifyCurveExtrusion( nId, LayerParams.vtSlicing, GDB_RT.GLOB) - EgtSetName( nId, EXTRA_SHELL_CRV .. tostring( nMaxShellNbrDiff - nInd + 1)) - if nInd == LayerParams.nShellsNbr then - EgtSetInfo( nId, KEY_TYPE, TYPE.EXTRA_OUTER_SHELL) - else - EgtSetInfo( nId, KEY_TYPE, TYPE.EXTRA_SHELL) - end - - -- aggiorno la superficie occupata dalle shell con quella appena calcolata (tenendo conto dell'overlap) - UpdateTotalShellSurf( nSrfTrim, nId, ( 1 - LayerParams.nStrandOverlap / 100) * LayerParams.dStrand, nGrpId) - -- se la superficie si annulla non è possibile realizzare altro, quindi cancello tutte le curve rimaste - if EgtSurfFrChunkCount( nSrfTrim) == 0 then - for j = nId + 1, nCrv + nCnt - 1 do - EgtErase( j) - end - for j = nCrvT + 1, nTrimCrv + nTrimCnt - 1 do - EgtErase( j) - end - -- aggiorno superficie - EgtSurfFrOffset( nSrfTrim, - LayerParams.nStrandOverlap / 100 * LayerParams.dStrand) - -- riordino le curve appena create e se possibile creo percorsi chiusi - ReorderExtraShells( nGrpId, LayerParams.dStrand, vPtStart, LayerParams.bPrintInvert) - return - end + for nCrvT = nTrimCrv, nTrimCrv + nTrimCnt - 1 do + -- calcolo offset della curva ( è il percorso della shell) + EgtModifyCurveExtrusion( nCrvT, LayerParams.vtSlicing, GDB_RT.GLOB) + local nOffs, nOffsCnt = EgtOffsetCurveAdv( nCrvT, - dOffs) + EgtErase( nCrvT) + for nCrvOffs = nOffs, nOffs + nOffsCnt - 1 do + -- trim con la regione già occupata dal altre shell + local nCrv, nCnt = EgtTrimCurveWithRegion( nCrvOffs, nSrfTrim, true, true) + if nCrv and nCnt ~= 0 then + for nId = nCrv, nCrv + nCnt - 1 do + local dLen = EgtCurveLength( nId) + local bValid = true + if EgtCurveIsClosed( nId) then + bValid = VerifyPath( nId, LayerParams.dStrand, LayerParams.vtSlicing, nGrpId) + end + -- verifico se soddisfa vincolo sulla lunghezza + if dLen > MIN_LEN and bValid then + EgtModifyCurveExtrusion( nId, LayerParams.vtSlicing, GDB_RT.GLOB) + EgtSetName( nId, EXTRA_SHELL_CRV .. tostring( nMaxShellNbrDiff - nInd + 1)) + if nInd == LayerParams.nShellsNbr then + EgtSetInfo( nId, KEY_TYPE, TYPE.EXTRA_OUTER_SHELL) else - EgtErase( nId) + EgtSetInfo( nId, KEY_TYPE, TYPE.EXTRA_SHELL) end + + -- aggiorno la superficie occupata dalle shell con quella appena calcolata (tenendo conto dell'overlap) + UpdateTotalShellSurf( nSrfTrim, nId, ( 1 - LayerParams.nStrandOverlap / 100) * LayerParams.dStrand, nGrpId) + -- se la superficie si annulla non è possibile realizzare altro, quindi cancello tutte le curve rimaste + if EgtSurfFrChunkCount( nSrfTrim) == 0 then + for j = nId + 1, nCrv + nCnt - 1 do + EgtErase( j) + end + for j = nCrvT + 1, nTrimCrv + nTrimCnt - 1 do + EgtErase( j) + end + -- aggiorno superficie + EgtSurfFrOffset( nSrfTrim, - LayerParams.nStrandOverlap / 100 * LayerParams.dStrand) + -- riordino le curve appena create e se possibile creo percorsi chiusi + ReorderExtraShells( nGrpId, LayerParams.dStrand, vPtStart, LayerParams.bPrintInvert) + return + end + else + EgtErase( nId) end end end end end + nOuterCrv = EgtGetNextName( nOuterCrv, OUTER_CRV) end end diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 3c0cbd4..f98da32 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -119,6 +119,18 @@ local function GetRibParams( nId) return RibParam end +------------------------------------------------------------------- +local function GetShellNumberParams( nId) + + local ShellNumberParam = {} + ReadParam( nId, KEY_SHELL_NBR_DIFF, 'i', ShellNumberParam) + ReadParam( nId, KEY_SHELL_NBR_COASTING, 'd', ShellNumberParam) + ReadParam( nId, KEY_SHELL_NBR_WIPE, 'd', ShellNumberParam) + ReadParam( nId, KEY_SHELL_NBR_WIPE_DIR, 'd', ShellNumberParam) + + return ShellNumberParam +end + -------------------------------------------------------------------- local function GetAuxSolidsParams( nId) @@ -166,7 +178,7 @@ local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName) vParams = GetRibParams( vIds[i]) if vParams[ KEY_RIBS_SHELLS_NBR] == 0 then bToBeDone = false end elseif nType == TYPE.EXTRA_SHELL then - vParams[KEY_SHELL_NBR_DIFF] = EgtGetInfo( vIds[i], KEY_SHELL_NBR_DIFF, 'i') or EgtGetInfo( s_nPartId, KEY_SHELL_NBR_DIFF, 'i') + vParams = GetShellNumberParams( vIds[i]) if vParams[KEY_SHELL_NBR_DIFF] == 0 then bToBeDone = false end elseif nType == TYPE.AUX_SOLID then vParams = GetAuxSolidsParams( vIds[i]) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 76eb9a2..d70d05e 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -43,10 +43,6 @@ local function GetLayerParamsForToolPathCalc() LayerParams.dTDiam = EgtGetInfo( s_nPartId, KEY_TOOL_DIAM, 'd') -- Parametri costolature LayerParams.bRibsLink = EgtGetInfo( s_nPartId, KEY_RIBS_LINK, 'b') - -- Parametri regioni con diverse passate - LayerParams.dShellNbrCoasting = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_COASTING, 'd') - LayerParams.dShellNbrWipe = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE, 'd') - LayerParams.dShellNbrWipeDir = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE_DIR, 'd') return LayerParams end @@ -1204,11 +1200,23 @@ function CalcToolPath.Exec( nPartId) if EgtGetName( nLastId or GDB_ID.NULL) == LEAD_OUT_CRV then nLastId = EgtGetPrev( nLastId) end while nId do -- recupero i parametri + local dCoastingLen, dWipeLen, dWipeDir local nType = EgtGetInfo( nId, KEY_TYPE, 'i') local bClosed = EgtGetInfo( nId, KEY_CLOSED_CRV, 'b') or false - local dCoastingLen = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrCoasting, LayerParams.dCoastingLen) - local dWipeLen = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrWipe, LayerParams.dWipeLen) - local dWipeDir = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrWipeDir, LayerParams.dWipeDir) + if ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed then + local bInverted = EgtGetInfo( nId, KEY_INVERTED_CRV, 'b') or false + local vCoastLen = EgtGetInfo( nId, KEY_EXTRA_SHELL_COASTING, 'vd') + local vWipeLen = EgtGetInfo( nId, KEY_EXTRA_SHELL_WIPE, 'vd') + local vWipeDir = EgtGetInfo( nId, KEY_EXTRA_SHELL_WIPE_DIR, 'vd') + -- se curva è stata invertita devo prendere le info legate a quello che era il suo punto di inizio, altrimenti prendo le info legate al punto finale + dCoastingLen = EgtIf( bInverted, vCoastLen[1], vCoastLen[2]) + dWipeLen = EgtIf( bInverted, vWipeLen[1], vWipeLen[2]) + dWipeDir = EgtIf( bInverted, vWipeDir[1], vWipeDir[2]) + else + dCoastingLen = LayerParams.dCoastingLen + dWipeLen = LayerParams.dWipeLen + dWipeDir = LayerParams.dWipeDir + end if nId == nLastId then AddRetractionOnLastCrv( nId, nTpathGrpId, LayerParams, dCoastingLen, dWipeLen, dWipeDir)