From 85bbeb8523e4454fba48470aa36540cf38a3f1ae Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 6 Oct 2023 12:33:41 +0200 Subject: [PATCH] =?UTF-8?q?3dPrinting=20:=20-=20corretta=20la=20gestione?= =?UTF-8?q?=20dei=20setti=20esterni=20in=20caso=20di=20solidi=20con=20pi?= =?UTF-8?q?=C3=B9=20gruppi=20di=20curve=20-=20migliorie=20varie.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LuaLibs/CalcPaths.lua | 61 ++++++++++++++++++++++++++-------------- LuaLibs/CalcToolPath.lua | 20 ++++++++++--- 2 files changed, 56 insertions(+), 25 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 3758544..a435180 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -343,7 +343,7 @@ local function CalcInfillPaths( nLayId, nInfillGrp, LayerParams) EgtSetName( nId, INFILL_CRV) EgtSetInfo( nId, KEY_TYPE, TYPE.INFILL) EgtSetInfo( nId, KEY_ASSOCIATED_SURF, nTrimSrf) - EgtModifyCurveExtrusion( nId, LayerParams.vtSlicing) + EgtModifyCurveExtrusion( nId, LayerParams.vtSlicing, GDB_RT.GLOB) end end end @@ -918,12 +918,12 @@ local function FindAssociatedHoledRib( vRibs, nCrv) for i = 1, #vRibs do -- verifico se ha un estremo sulla curva local ptS = EgtSP( vRibs[i], GDB_ID.ROOT) - local dParS = EgtCurveParamAtPoint( nCrv, ptS, GEO.EPS_SMALL, GDB_RT.GLOB) + local dParS = EgtCurveParamAtPoint( nCrv, ptS, 100 * GEO.EPS_SMALL, GDB_RT.GLOB) if dParS then return i, true else local ptE = EgtEP( vRibs[i], GDB_ID.ROOT) - local dParE = EgtCurveParamAtPoint( nCrv, ptE, GEO.EPS_SMALL, GDB_RT.GLOB) + local dParE = EgtCurveParamAtPoint( nCrv, ptE, 100 * GEO.EPS_SMALL, GDB_RT.GLOB) if dParE then return i, false end @@ -937,7 +937,7 @@ local function FindHoleCurve( pt, vLoopIds) -- trovo indice della curva di vLoopIds a cui appartiene pt ( in globale) if not vLoopIds then return end for i = 1, #vLoopIds do - local dPar = EgtCurveParamAtPoint( vLoopIds[i], pt, GEO.EPS_SMALL, GDB_RT.GLOB) + local dPar = EgtCurveParamAtPoint( vLoopIds[i], pt, 100 * GEO.EPS_SMALL, GDB_RT.GLOB) if dPar then return i end @@ -1345,9 +1345,7 @@ local function ComputeTrimSurfWithOverlapsForRibs( vIds, nGrp, nSrfInt, nSrfExt, elseif nType == RIB_TYPE.EXTERNAL then if not nSrfExt then - -- errore nella creazione della superficie, il setto va cancellato - EgtOutLog( 'Error : creation of trim region for external rib failed (layer '.. EgtNumToString( s_nCurrIdx) ..') - CalcPaths') - table.insert( s_vErr, 'layer ' .. EgtNumToString( s_nCurrIdx) .. ' : creation of trim region for external rib failed') + -- il setto va cancellato elseif nSrfExt == GDB_ID.NULL then -- se la superficie non esiste il setto va conservato tSurfOffs[vIds[i]] = GDB_ID.NULL @@ -2280,34 +2278,56 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, vPtStart) -- verifico se posso ignorare eventuali buchi nei setti VerifyRibsHoles( vOrigRibs) + local nTotSrfInt = GDB_ID.NULL + local nTotSrfExt = GDB_ID.NULL -- scorro i gruppi di curve - local nCrvGrp = EgtGetFirstNameInGroup( nSliceGrp, CONTOUR_GRP .. '*') - while nCrvGrp do + local vCrvGrps = EgtGetNameInGroup( nSliceGrp, CONTOUR_GRP .. '*') + for i = 1, #vCrvGrps do -- creo o svuoto il gruppo - local nRibsPathGrp = EgtGetFirstNameInGroup( nCrvGrp, RIBS_GRP) + local nRibsPathGrp = EgtGetFirstNameInGroup( vCrvGrps[i], RIBS_GRP) if not nRibsPathGrp then - nRibsPathGrp = EgtGroup( nCrvGrp) + nRibsPathGrp = EgtGroup( vCrvGrps[i]) EgtSetName( nRibsPathGrp, RIBS_GRP) EgtSetStatus( nRibsPathGrp, GDB_ST.OFF) else EgtEmptyGroup( nRibsPathGrp) end - -- recupero le superfici occupate dalle shell - local nSrfInt = EgtGetFirstNameInGroup( nCrvGrp, TOT_SHELL_TRIM_SURF) or GDB_ID.NULL + -- calcolo le superfici occupate dalle shell nel gruppo di curve corrente e aggiorno le superfici totali + -- a) superficie più interna + local nSrfInt = EgtGetFirstNameInGroup( vCrvGrps[i], TOT_SHELL_TRIM_SURF) or GDB_ID.NULL + if nTotSrfInt == GDB_ID.NULL and nSrfInt ~= GDB_ID.NULL then + nTotSrfInt = EgtCopyGlob( nSrfInt, nRibsGrp) + elseif nTotSrfInt ~= GDB_ID.NULL then + if not EgtSurfFrAdd( nTotSrfInt, nSrfInt) then + EgtOutLog( 'Error : EgtSurfFrAdd for external ribs failed. Errors may occur with user-linked ribs (layer '.. EgtNumToString( s_nCurrIdx) ..') - CalcPaths') + end + end + -- b) superficie più esterna local nSrfExt = GDB_ID.NULL - local nSrfLay = EgtGetFirstNameInGroup( nCrvGrp, LAYER_SRF) + local nSrfLay = EgtGetFirstNameInGroup( vCrvGrps[i], LAYER_SRF) if nSrfLay then - nSrfExt = ComputeSurfOffset( nSrfLay, nCrvGrp, LayerParams.dOffs) + nSrfExt = ComputeSurfOffset( nSrfLay, vCrvGrps[i], LayerParams.dOffs) if not nSrfExt then EgtOutLog( 'Error : creation of trim region for external ribs failed. Errors may occur also with internal user-linked ribs (layer '.. EgtNumToString( s_nCurrIdx) ..') - CalcPaths') table.insert( s_vErr, 'layer ' .. EgtNumToString( s_nCurrIdx) .. ' : error in computing trim region for external ribs') + nTotSrfExt = nil + else + if nTotSrfExt == GDB_ID.NULL then + nTotSrfExt = EgtCopyGlob( nSrfExt, nRibsGrp) + elseif nTotSrfExt then + if not EgtSurfFrAdd( nTotSrfExt, nSrfExt) then + nTotSrfExt = nil + EgtOutLog( 'Error : creation of trim region for external ribs failed (layer '.. EgtNumToString( s_nCurrIdx) ..') - CalcPaths') + table.insert( s_vErr, 'layer ' .. EgtNumToString( s_nCurrIdx) .. ' : error in computing trim region for external ribs') + end + end end end -- trim grossolano dei setti - local nTrimGrp = TrimRibs( vOrigRibs, nRibsGrp, nSrfExt, nSrfInt, LayerParams.vtSlicing) + local nTrimGrp = TrimRibs( vOrigRibs, nRibsGrp, nSrfExt, EgtIf( i == #vCrvGrps, nTotSrfInt, GDB_ID.NULL), LayerParams.vtSlicing) -- calcolo offset orientati local nOffsGrp = ComputeRibsOrientedOffset( nTrimGrp) @@ -2316,7 +2336,7 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, vPtStart) local nLoopGrp = EgtGroup( nRibsPathGrp) -- creo le superfici con cui fare i trim corretti e ne estraggo contorni - local tSurfOffs = ComputeTrimSurfWithOverlapsForRibs( vOrigRibs, nRibsPathGrp, nSrfInt, nSrfExt, nLoopGrp) + local tSurfOffs = ComputeTrimSurfWithOverlapsForRibs( vOrigRibs, nRibsPathGrp, nSrfInt, EgtIf( i == #vCrvGrps, nTotSrfExt, nil), nLoopGrp) -- copio gli offset delle costolature nel PathGrp local vOffsRib = EgtGetAllInGroup( nOffsGrp) @@ -2384,7 +2404,8 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, vPtStart) end -- gestisco eventuali intersezioni fra costolature - local bInters, bSpecialCase = HandleRibsIntersections( nRibsGrp, nOffsGrp, nRibsPathGrp, LayerParams.vtSlicing, nSrfInt, nSrfExt, bAllTwoStrands, vTypeSequence, nLoopGrp, tSurfOffs) + local bInters, bSpecialCase = HandleRibsIntersections( nRibsGrp, nOffsGrp, nRibsPathGrp, LayerParams.vtSlicing, nSrfInt, EgtIf( i == #vCrvGrps, nTotSrfExt, nil), + bAllTwoStrands, vTypeSequence, nLoopGrp, tSurfOffs) EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_INTERS, bInters) EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_SPECIAL_CASE, bSpecialCase) @@ -2408,8 +2429,6 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, vPtStart) if not EgtGetFirstNameInGroup( nRibsPathGrp, RIBS_CRV .. '*') then EgtErase( nRibsPathGrp) end - - nCrvGrp = EgtGetNextName( nCrvGrp, CONTOUR_GRP .. '*') end end @@ -3075,7 +3094,7 @@ local function ComputeAuxSolidsGenericInfill( nSrf, dStrand, vtSlicing, sName, n EgtSetName( nId, sName) EgtSetInfo( nId, KEY_TYPE, TYPE.INFILL) EgtSetInfo( nId, KEY_ASSOCIATED_SURF, nSrf) - EgtModifyCurveExtrusion( nId, vtSlicing) + EgtModifyCurveExtrusion( nId, vtSlicing, GDB_RT.GLOB) end end end diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index c48675b..8067801 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -358,7 +358,8 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi local nType = EgtGetInfo( nCrvId, KEY_TYPE, 'i') local bClosed = EgtGetInfo( nCrvId, KEY_CLOSED_CRV, 'b') or false local bInverted = EgtGetInfo( nCrvId, KEY_INVERTED_CRV, 'b') or false - + local dStrand = EgtGetInfo( nCrvId, KEY_CRV_STRAND, 'd') + -- curva ausiliaria per generare correttamente wipe local nCopyId = EgtCopyGlob( nCrvId, nCrvId, GDB_IN.AFTER) if not EgtCurveIsClosed( nCopyId) then @@ -458,7 +459,6 @@ local function AddRetraction( nCrvId, vtSlicing, dCoastingLen, dWipeLen, dWipeDi end if nWipeId then - local dStrand = EgtGetInfo( nCrvId, KEY_CRV_STRAND, 'd') EgtSetName( nWipeId, WIPE_CRV) EgtSetInfo( nWipeId, KEY_TYPE, TYPE.WIPE) EgtSetInfo( nWipeId, KEY_CRV_STRAND, dStrand) @@ -1332,7 +1332,19 @@ local function VerifyRibsLead( nId, nRibId, bInVsOut, nGrpTmp) -- individuo eventuale lead in o link relativo al setto corrente ( solo se collega due passate dello stesso setto) local nCurrLI local nCurrLink - if not bInVsOut then + if bInVsOut then + -- se è lead in devo solo verificare se seguito da un link + local nNext = EgtGetNext( nRibId) + if nNext and EgtGetName( nNext) == LINK_CRV then + local nNextRib = EgtGetNext( nNext) + local nOrigRib = EgtGetInfo( nRibId, KEY_ORIGINAL_RIB, 'i') or -1 + local nOrigRibPrev = EgtGetInfo( nNextRib, KEY_ORIGINAL_RIB, 'i') or -1 + if nOrigRib == nOrigRibPrev then + nCurrLink = nNext + end + end + else + -- se è lead out devo verificare se preceduto da lead in o da link local nPrev = EgtGetPrev( nRibId) if nPrev and EgtGetName( nPrev) == LEAD_IN_CRV then nCurrLI = nPrev @@ -1556,7 +1568,7 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp, vtSlicing, nGrpTmp, bForceNoSolid end for i = 1, #vCrvOffs do - local dParS = EgtCurveParamAtPoint( vCrvOffs[i], ptS) + local dParS = EgtCurveParamAtPoint( vCrvOffs[i], ptS, 100 * GEO.EPS_SMALL) if dParS then local nLeadIn = FindCorrectRibLead( dParS, nCrv, vCrvOffs[i], bLIInvert, dLILen, true, nGrpTmp, bSpecialCase) -- se lead in possibile