From 862216b84fbe2ab9d5bf8c700d2520780a0e1655 Mon Sep 17 00:00:00 2001 From: SaraP Date: Mon, 6 Mar 2023 14:54:19 +0100 Subject: [PATCH] 3dPrinting 2.5c2 : - aggiunto taglio dei ribs unbounded con solido se richiesto. --- LuaLibs/CalcSlices.lua | 40 ++++++++-- LuaLibs/CalcToolPath.lua | 157 ++++++++++++++++++++------------------- Version.lua | 2 +- 3 files changed, 118 insertions(+), 81 deletions(-) diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index 83e58ba..530b06d 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -170,7 +170,7 @@ local function GetAuxSolidsParams( nId) end -------------------------------------------------------------------- -local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName) +local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName, nStmId) -- recupero gli oggeti di cui fare slicing local vIds = EgtGetAllInGroup( nLay) @@ -207,7 +207,27 @@ local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName) table.insert( tabParams, vParams) table.insert( vToBeDone, bToBeDone) end - + + -- taglio i setti unbounded e limitati con il solido + local vEraseIds = {} + if nType == TYPE.RIB then + local bLimitUnbddRibs = EgtGetInfo( s_nPartId, KEY_LIMIT_UNBDD_RIBS, 'b') or false + if bLimitUnbddRibs then + for i = 1, #vIds do + if vToBeDone[i] then + if tabParams[i][KEY_RIBS_TYPE] == RIB_TYPE.UNBOUNDED then + -- creo copia e la taglio con solido + local nCopy = EgtCopyGlob( vIds[i], EgtGetParent( vIds[i])) + EgtSurfTmCut( nCopy, nStmId, true, true) + -- lo slicing viene fatto sulla copia + vIds[i] = nCopy + table.insert( vEraseIds, nCopy) + end + end + end + end + end + local nLayId = EgtGetFirstNameInGroup( s_nPartId, SLICE_LAYER .. '*') while nLayId do -- recupero quota per slicing @@ -271,6 +291,11 @@ local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName) end nLayId = EgtGetNextName( nLayId, SLICE_LAYER .. '*') end + + -- rimuovo eventuali copie create per lo slicing + for i = 1, #vEraseIds do + EgtErase( vEraseIds[i]) + end return true end @@ -591,14 +616,14 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin -- costolature local nRibsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_RIBS) if nRibsLay then - SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV) + SlicingExtraObjects( vtSlicing, nRibsLay, TYPE.RIB, RIBS_GRP, RIBS_CRV, nStmId) end if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 1) / ( #vZSlices + 3) * 100, 0) == 1 then return false end -- solidi per regioni con diverso numero di passate local nShellNbrLay = EgtGetFirstNameInGroup( s_nPartId, LAY_SHELL_NBR) if nShellNbrLay then - SlicingExtraObjects( vtSlicing, nShellNbrLay, TYPE.EXTRA_SHELL, SHELL_NBR_GRP, SHELL_NBR_CRV) + SlicingExtraObjects( vtSlicing, nShellNbrLay, TYPE.EXTRA_SHELL, SHELL_NBR_GRP, SHELL_NBR_CRV, nStmId) end if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 2) / ( #vZSlices + 3) * 100, 0) == 1 then return false end @@ -606,7 +631,7 @@ local function SlicingWithSolid( nStmId, vZSlices, dDeltaZStart, dZmin, frSlicin local nAuxSolidsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_AUX_SOLIDS) if nAuxSolidsLay then AdjustAuxSolids( nAuxSolidsLay) - SlicingExtraObjects( vtSlicing, nAuxSolidsLay, TYPE.AUX_SOLID, AUX_SOLIDS_GRP, AUX_SOLIDS_CRV) + SlicingExtraObjects( vtSlicing, nAuxSolidsLay, TYPE.AUX_SOLID, AUX_SOLIDS_GRP, AUX_SOLIDS_CRV, nStmId) end if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( #vZSlices + 3) / ( #vZSlices + 3) * 100, 0) == 1 then return false end end @@ -648,6 +673,11 @@ function CalcSlices.Exec( nPartId, nStmId, HMax) end end + if bLimitUnbddRibs and not nStmId then + EgtOutBox( "No solid to limit unbounded ribs!", 'Error', 'ERROR') + return + end + -- recupero il box local b3Box = BBox3d() for i = 1, #vRefIds do diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 5297b7a..9c71d97 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -42,7 +42,7 @@ local function GetLayerParamsForToolPathCalc() LayerParams.dWipeDir = EgtGetInfo( s_nPartId, KEY_WIPE_DIR, 'd') or 0.0 LayerParams.vtSlicing = EgtGetInfo( s_nPartId, KEY_SLICING_DIR, 'v') LayerParams.dTDiam = EgtGetInfo( s_nPartId, KEY_TOOL_DIAM, 'd') - + return LayerParams end @@ -866,7 +866,7 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing, nGrpTmp) local bLIInvert = EgtGetInfo( nCrv, KEY_RIBS_LEAD_IN_INVERT, 'b') if dLILen < GEO.EPS_SMALL then return end - + -- recupero la curva di offset su cui calcolare leadin local ptS = EgtSP( nCrv) local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp) @@ -889,7 +889,7 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing, nGrpTmp) end -------------------------------------------------------------------- -local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, nGrpTmp) +local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, nGrpTmp, bForceNoBorder) local dRibsLOLen = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_LEN, 'd') local dRibsLOCoasting = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_COASTING, 'd') @@ -905,82 +905,84 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n local vtE = EgtEV( nCrv, GDB_ID.ROOT) -- recupero la curva di offset su cui calcolare lead out - local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp) - while nCrvOffs do - local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE, GEO.EPS_SMALL, GDB_RT.GLOB) - if dParE then - - local nCrvLO - local nCoasting - local nWipe - - -- trovo curva opportuna per lead out - local nCrvRef, bInvert = FindCorrectRibsLead( dParE, nCrv, nCrvOffs, bRibsLOInvert, dRibsLOLen + dRibsLOCoasting, dStrand, false, nGrpTmp) - - if nCrvRef then - -- verifico se la curva ha lunghezza sufficiente - local dLen = EgtCurveLength( nCrvRef) - local bSkip = ( dLen - dRibsLOLen - dRibsLOCoasting < - GEO.EPS_SMALL) - - -- primo tratto ( segue offset con flusso aperto) - if dRibsLOLen > GEO.EPS_SMALL and not bSkip then - nCrvLO = EgtCopyGlob( nCrvRef, nCrv, GDB_IN.AFTER) - EgtTrimCurveEndAtLen( nCrvLO, dRibsLOLen) - EgtModifyCurveExtrusion( nCrvLO, vtSlicing, GDB_RT.GLOB) - EgtSetInfo( nCrvLO, KEY_TYPE, TYPE.RIB) - EgtSetName( nCrvLO, LEAD_OUT_CRV) - -- aggiorno ptE e vtE - ptE = EgtEP( nCrvLO, GDB_ID.ROOT) - vtE = EgtEV( nCrvLO, GDB_ID.ROOT) - end - - -- secondo tratto ( segue offset con flusso chiuso) - if dRibsLOCoasting > GEO.EPS_SMALL then - nCoasting = EgtCopyGlob( nCrvRef, nCrvLO or nCrv, GDB_IN.AFTER) - EgtTrimCurveStartAtLen( nCoasting, dRibsLOLen) - EgtTrimCurveEndAtLen( nCoasting, dRibsLOCoasting) - EgtModifyCurveExtrusion( nCoasting, vtSlicing, GDB_RT.GLOB) - - EgtSetName( nCoasting, COASTING_CRV) - EgtSetInfo( nCoasting, KEY_TYPE, TYPE.COASTING) - EgtSetColor( nCoasting, EgtStdColor('ORANGE')) - - -- aggiorno ptE e vtE - ptE = EgtEP( nCoasting, GDB_ID.ROOT) - vtE = EgtEV( nCoasting, GDB_ID.ROOT) - end - EgtErase( nCrvRef) + if not bForceNoBorder then + local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp) + while nCrvOffs do + local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE, GEO.EPS_SMALL, GDB_RT.GLOB) + if dParE then - -- terzo tratto ( diretto verso esterno con ugello chiuso) - if dRibsLOWipe > GEO.EPS_SMALL then - local dAng = dRibsLOWipeAng + s_nDefaultWipeAng - local nType = EgtGetInfo( nCrv, KEY_RIBS_TYPE, 'i') - if nType == RIB_TYPE.EXTERNAL then dAng = - dAng end - vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng)) - local ptFinal = ptE + vtE * dRibsLOWipe - -- verifico soddisfi altezza minima per dimensioni utensile - local k = 1 - while ptFinal:getZ() < s_dHMin + GEO.EPS_SMALL and k < 36 do - vtE:rotate( vtSlicing, EgtIf( bInvert, - 10, 10)) - ptFinal = ptE + vtE * dRibsLOWipe - k = k + 1 + local nCrvLO + local nCoasting + local nWipe + + -- trovo curva opportuna per lead out + local nCrvRef, bInvert = FindCorrectRibsLead( dParE, nCrv, nCrvOffs, bRibsLOInvert, dRibsLOLen + dRibsLOCoasting, dStrand, false, nGrpTmp) + + if nCrvRef then + -- verifico se la curva ha lunghezza sufficiente + local dLen = EgtCurveLength( nCrvRef) + local bSkip = ( dLen - dRibsLOLen - dRibsLOCoasting < - GEO.EPS_SMALL) + + -- primo tratto ( segue offset con flusso aperto) + if dRibsLOLen > GEO.EPS_SMALL and not bSkip then + nCrvLO = EgtCopyGlob( nCrvRef, nCrv, GDB_IN.AFTER) + EgtTrimCurveEndAtLen( nCrvLO, dRibsLOLen) + EgtModifyCurveExtrusion( nCrvLO, vtSlicing, GDB_RT.GLOB) + EgtSetInfo( nCrvLO, KEY_TYPE, TYPE.RIB) + EgtSetName( nCrvLO, LEAD_OUT_CRV) + -- aggiorno ptE e vtE + ptE = EgtEP( nCrvLO, GDB_ID.ROOT) + vtE = EgtEV( nCrvLO, GDB_ID.ROOT) + end + + -- secondo tratto ( segue offset con flusso chiuso) + if dRibsLOCoasting > GEO.EPS_SMALL then + nCoasting = EgtCopyGlob( nCrvRef, nCrvLO or nCrv, GDB_IN.AFTER) + EgtTrimCurveStartAtLen( nCoasting, dRibsLOLen) + EgtTrimCurveEndAtLen( nCoasting, dRibsLOCoasting) + EgtModifyCurveExtrusion( nCoasting, vtSlicing, GDB_RT.GLOB) + + EgtSetName( nCoasting, COASTING_CRV) + EgtSetInfo( nCoasting, KEY_TYPE, TYPE.COASTING) + EgtSetColor( nCoasting, EgtStdColor('ORANGE')) + + -- aggiorno ptE e vtE + ptE = EgtEP( nCoasting, GDB_ID.ROOT) + vtE = EgtEV( nCoasting, GDB_ID.ROOT) end + EgtErase( nCrvRef) - nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal}, GDB_RT.GLOB) - EgtModifyCurveExtrusion( nWipe, vtSlicing, GDB_RT.GLOB) - EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER) - EgtSetName( nWipe, WIPE_CRV) - EgtSetInfo( nWipe, KEY_TYPE, TYPE.WIPE) - EgtSetColor( nWipe, EgtStdColor('AQUA')) + -- terzo tratto ( diretto verso esterno con ugello chiuso) + if dRibsLOWipe > GEO.EPS_SMALL then + local dAng = dRibsLOWipeAng + s_nDefaultWipeAng + local nType = EgtGetInfo( nCrv, KEY_RIBS_TYPE, 'i') + if nType == RIB_TYPE.EXTERNAL then dAng = - dAng end + vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng)) + local ptFinal = ptE + vtE * dRibsLOWipe + -- verifico soddisfi altezza minima per dimensioni utensile + local k = 1 + while ptFinal:getZ() < s_dHMin + GEO.EPS_SMALL and k < 36 do + vtE:rotate( vtSlicing, EgtIf( bInvert, - 10, 10)) + ptFinal = ptE + vtE * dRibsLOWipe + k = k + 1 + end + + nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal}, GDB_RT.GLOB) + EgtModifyCurveExtrusion( nWipe, vtSlicing, GDB_RT.GLOB) + EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER) + EgtSetName( nWipe, WIPE_CRV) + EgtSetInfo( nWipe, KEY_TYPE, TYPE.WIPE) + EgtSetColor( nWipe, EgtStdColor('AQUA')) + end + else + -- aggiungo coasting e wipe come sulle shell normali + AddRetraction( nCrv, vtSlicing, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng) end - else - -- aggiungo coasting e wipe come sulle shell normali - AddRetraction( nCrv, vtSlicing, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng) + return end - return + + nCrvOffs = EgtGetNext( nCrvOffs) end - - nCrvOffs = EgtGetNext( nCrvOffs) end -- se non ho trovato curva sul bordo su cui fare il lead out aggiungo coasting e wipe come sulle shell normali @@ -1070,17 +1072,22 @@ local function CalcRibsToolPath( vEntIds, nRibsGrp, nTpathGrpId, LayerParams) end -- leadin/leadout + local bForceNoBorder = false + local nType = EgtGetInfo( vEntIds[1], KEY_RIBS_TYPE, 'i') + if nType == RIB_TYPE.UNBOUNDED then + bForceNoBorder = true + end local nCrvRib = nNewFirstEnt while nCrvRib do -- verifico se necessario lead in local nPrev = EgtGetPrev( nCrvRib) - if not nPrev or EgtGetName( nPrev) ~= LINK_CRV then + if ( not nPrev or EgtGetName( nPrev) ~= LINK_CRV) and not bForceNoBorder 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) ~= LINK_CRV then - AddRibsLeadOut( nCrvRib, nTpathGrpId, nLoopGrp, LayerParams.vtSlicing, LayerParams.dStrand, nGrpTmp) + AddRibsLeadOut( nCrvRib, nTpathGrpId, nLoopGrp, LayerParams.vtSlicing, LayerParams.dStrand, nGrpTmp, bForceNoBorder) end nCrvRib = EgtGetNextName( nCrvRib, RIBS_CRV .. '*') end diff --git a/Version.lua b/Version.lua index 5861dbb..d615f4e 100644 --- a/Version.lua +++ b/Version.lua @@ -1,4 +1,4 @@ -- Version.lua by Egaltech s.r.l. 2023/02/28 -- Gestione della versione di 3dPrinting -VERSION = '2.5c1' \ No newline at end of file +VERSION = '2.5c2' \ No newline at end of file