From d83b571883baf162f1912005f5cc4a2fe6e561eb Mon Sep 17 00:00:00 2001 From: SaraP Date: Fri, 1 Sep 2023 17:03:25 +0200 Subject: [PATCH] 3dPrinting : - correzioni nel collegamento tra ribs che terminano esattamente sul pezzo - migliorie varie nei ribs. --- LuaLibs/CalcPaths.lua | 177 ++++++++++++++++++++++++++------------- LuaLibs/CalcToolPath.lua | 159 ++++++++++++++++++++--------------- 2 files changed, 210 insertions(+), 126 deletions(-) diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index c471350..ccbb4dc 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -1721,6 +1721,122 @@ local function HandleRibsIntersections( nRibsGrp, nOffsGrp, nRibsPathGrp, vtSlic return bInters, bSpecialCase end +--------------------------------------------------------------------- +local function VerifySplitAssociation( nRib1, nRib2, dStrand) + + local dDist1 = EgtPointCurveDist( EgtMP( nRib1), nRib2) + local dDist2 = EgtPointCurveDist( EgtMP( nRib2), nRib1) + -- verifico siano sufficientemente vicini + if dDist1 < dStrand + 10 * GEO.EPS_SMALL or dDist2 < dStrand + 10 * GEO.EPS_SMALL then + + -- verifico nel caso di setti splittati dopo il trim che siano compatibili + local bUserLink = EgtGetInfo( nRib2, KEY_RIBS_USER_LINK, 'b') or false + local bSplitAfterTrim1 = EgtGetInfo( nRib1, KEY_SPLIT_AFTER_TRIM, 'b') or false + local bSplitAfterTrim2 = EgtGetInfo( nRib2, KEY_SPLIT_AFTER_TRIM, 'b') or false + if bSplitAfterTrim1 ~= bSplitAfterTrim2 then + if not bSplitAfterTrim2 and bSplitAfterTrim1 then + local nOrd = EgtGetInfo( nRib2, KEY_SPLIT_AFTER_TRIM_ORDER, 'i') + if nOrd == 0 then + return true + end + end + if bSplitAfterTrim1 then + local nOrd = EgtGetInfo( nRib1, KEY_SPLIT_AFTER_TRIM_ORDER, 'i') + local nTot = EgtGetInfo( nRib1, KEY_SPLIT_AFTER_TRIM_TOT, 'i') + if nOrd == nTot - 1 then + return true + end + end + else + return true + end + end + + return false +end + +--------------------------------------------------------------------- +local function FindAssociatedSplitRibs( vRibs, dStrand) + + local vAssociatedRibs = {} + + -- vettore di flag per indicare se corrispondente elemento di vRibs è già stato associato ad un gruppo + local vUsed = {} + for i = 1, #vRibs do + vUsed[i] = false + end + + local nCurrId = vRibs[1] + vUsed[1] = true + while nCurrId do + -- definisco un nuovo gruppo di setti associati + local vCurrGrp = { nCurrId} + local bFound = true + while bFound do + -- appena aggiungo un nuovo elemento al gruppo riparto a controllare tutti i setti non ancora associati per vedere quale posso aggiungere + bFound = false + for i = 2, #vRibs do + if bFound then break end + if not vUsed[i] then + for j = 1, #vCurrGrp do + if VerifySplitAssociation( vCurrGrp[j], vRibs[i], dStrand) then + bFound = true + table.insert( vCurrGrp, vRibs[i]) + vUsed[i] = true + break + end + end + end + end + end + -- quando non ho più setti da aggiungere al gruppo corrente + -- riordino il gruppo appena individuato + if #vCurrGrp == 2 then + -- lascio l'ordinamento 1,2 + EgtRelocateGlob( vCurrGrp[2], vCurrGrp[1], GDB_IN.AFTER) + + elseif #vCurrGrp > 2 then + -- calcolo ordinamento ottimale con shorest path + EgtSpInit() + for i = 1, #vCurrGrp do + local ptS = EgtSP( vCurrGrp[i], GDB_ID.ROOT) + local ptE = EgtEP( vCurrGrp[i], GDB_ID.ROOT) + EgtSpAddPoint( ptS:getX(), ptS:getY(), ptS:getZ(), 0, 0, ptE:getX(), ptE:getY(), ptE:getZ(), 0, 0) + end + local vOrd = EgtSpCalculate( SHP_TY.OPEN) + EgtSpTerminate() + local vNewOrd = {} + for i = 1, #vOrd do + table.insert( vNewOrd, vCurrGrp[vOrd[i]]) + end + -- riposiziono il primo elemento ( solo se è cambiato) + if vOrd[1] ~= 1 then + EgtRelocateGlob( vNewOrd[1], vCurrGrp[1], GDB_IN.AFTER) + end + -- riposiziono gli altri elementi + for i = 2, #vNewOrd do + EgtRelocateGlob( vNewOrd[i], vNewOrd[i-1], GDB_IN.AFTER) + end + vCurrGrp = vNewOrd + end + + -- inserisco nella tabella il gruppo trovato + table.insert( vAssociatedRibs, vCurrGrp) + + -- cerco il prossimo setto per un nuovo gruppo + nCurrId = nil + for i = 1, #vRibs do + if not vUsed[i] then + nCurrId = vRibs[i] + vUsed[i] = true + break + end + end + end + + return vAssociatedRibs +end + --------------------------------------------------------------------- local function ReorderSplitRibs( vIds, bParamInvertOrder) @@ -1758,58 +1874,8 @@ local function ReorderSplitRibs( vIds, bParamInvertOrder) else -- associo le curve dello split - local tAssociatedRibs = {} - while #tabVal > 0 do - local nCurrId = tabVal[1] - table.remove( tabVal, 1) - table.insert( tAssociatedRibs, { nCurrId}) - local bCurrSplitAfterTrim = EgtGetInfo( nCurrId, KEY_SPLIT_AFTER_TRIM, 'b') or false - while nCurrId do - local ptCurr = EgtMP( nCurrId) - local bFound = false - for j = 1, #tabVal do - local dDist1 = EgtPointCurveDist( ptCurr, tabVal[j]) - local dDist2 = EgtPointCurveDist( EgtMP( tabVal[j]), nCurrId) - if dDist1 < dStrand + 10 * GEO.EPS_SMALL or dDist2 < dStrand + 10 * GEO.EPS_SMALL then - - -- verifico nel caso di setti splittati dopo il trim che siano compatibili - local bUserLink = EgtGetInfo( tabVal[j], KEY_RIBS_USER_LINK, 'b') or false - local bSplitAfterTrim = EgtGetInfo( tabVal[j], KEY_SPLIT_AFTER_TRIM, 'b') or false - if bSplitAfterTrim ~= bCurrSplitAfterTrim then - if not bCurrSplitAfterTrim and bSplitAfterTrim then - local nOrd = EgtGetInfo( tabVal[j], KEY_SPLIT_AFTER_TRIM_ORDER, 'i') - if nOrd == 0 then - bFound = true - end - end - if bCurrSplitAfterTrim then - local nOrd = EgtGetInfo( nCurrId, KEY_SPLIT_AFTER_TRIM_ORDER, 'i') - local nTot = EgtGetInfo( nCurrId, KEY_SPLIT_AFTER_TRIM_TOT, 'i') - if nOrd == nTot - 1 then - bFound = true - end - end - else - bFound = true - end - - if bFound then - EgtRelocateGlob( tabVal[j], nCurrId, GDB_IN.AFTER) - nCurrId = tabVal[j] - bCurrSplitAfterTrim = bSplitAfterTrim - table.remove( tabVal, j) - table.insert( tAssociatedRibs[#tAssociatedRibs], nCurrId) - break - end - end - end - - if not bFound then - nCurrId = nil - end - end - end - + local tAssociatedRibs = FindAssociatedSplitRibs( tabVal, dStrand) + -- assegno splitid per gestire correttamente il link nel CalcToolPath for i = 1, #tAssociatedRibs do for j = 1, #tAssociatedRibs[i] do @@ -1839,9 +1905,7 @@ local function ReorderSplitRibs( vIds, bParamInvertOrder) else -- ordinamento - if ( nTotParts % 2 == 0 and bInvertOrder and nLinkOrder % 2 ~= 0 ) or - ( nTotParts % 2 == 0 and not bInvertOrder and nLinkOrder % 2 == 0) or - ( nTotParts % 2 ~= 0 and nLinkOrder % 2 == 0) then + if ( bInvertOrder and nLinkOrder % 2 ~= 0 ) or ( not bInvertOrder and nLinkOrder % 2 == 0) then local vLastGrp = tAssociatedRibs[#tAssociatedRibs] local nPrevId = vLastGrp[#vLastGrp] for i = #tAssociatedRibs - 1, 1, -1 do @@ -1855,8 +1919,7 @@ local function ReorderSplitRibs( vIds, bParamInvertOrder) -- direzione if ( nTotParts % 2 == 0 and nLinkOrder > 0 and nLinkOrder < nTotParts - 1) or - ( nTotParts % 2 ~= 0 and not bInvertOrder and nLinkOrder > 0) or - ( nTotParts % 2 ~= 0 and bInvertOrder and nLinkOrder < nTotParts - 1) then + ( nTotParts % 2 ~= 0 and nLinkOrder > 0) then local vLastGrp = tAssociatedRibs[#tAssociatedRibs] for j = 1, #vLastGrp do EgtInvertCurve( vLastGrp[j]) diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 48a26f4..5401507 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -1024,45 +1024,56 @@ end -------------------------------------------------------------------- --------------------------- RIBS ----------------------------------- -------------------------------------------------------------------- -local function VerifyRibsLink( nLinkId, nCurr, nNext, nGrpTmp, dStrand, bCheckLinked) +local function VerifyRibsLink( nLinkId, nCurr, nNext, nGrpTmp, dStrand) local dOverlap1 = EgtGetInfo( nCurr, KEY_RIBS_OVERLAP, 'd') local dOverlap2 = EgtGetInfo( nNext, KEY_RIBS_OVERLAP, 'd') local dOverlap = max( dOverlap1, dOverlap2) local dLen = EgtCurveLength( nLinkId) - -- verifico che non entri nella tavola + -- 1) verifico che non entri nella tavola local b3Box = EgtGetBBoxGlob( nLinkId, GDB_BB.STANDARD) if b3Box:getMin():getZ() < - GEO.EPS_SMALL then return false end - -- eventuale verifica con setti coinvolti dal link - -- verifico non passi per estremo errato + -- 2) verifica con setti coinvolti dal link if nCurr ~= nNext then + -- verifico non passi per estremo errato local dParTest1 = EgtCurveParamAtPoint( nLinkId, EgtSP( nCurr, GDB_ID.ROOT), 100 * GEO.EPS_SMALL, GDB_RT.GLOB) local dParTest2 = EgtCurveParamAtPoint( nLinkId, EgtEP( nNext, GDB_ID.ROOT), 100 * GEO.EPS_SMALL, GDB_RT.GLOB) if dParTest1 or dParTest2 then return false end - end - - if bCheckLinked and dLen > 3 * dStrand then - -- regione occupata dai setti - local nSrfRibs = EgtSurfFrFatCurve( nGrpTmp, nCurr, dStrand, false) or GDB_ID.NULL - local nSrfRibs2 = EgtSurfFrFatCurve( nGrpTmp, nNext, dStrand, false) or GDB_ID.NULL - EgtSurfFrAdd( nSrfRibs, nSrfRibs2) - -- verifico che i tratti fuori abbiano lunghezza maggiore di quelli dentro + + -- verifico non intersechi i setti in altri punti oltre agli estremi + local nCurrLoc = EgtCopyGlob( nCurr, nGrpTmp) + local nNextLoc = EgtCopyGlob( nNext, nGrpTmp) local nLinkLoc = EgtCopyGlob( nLinkId, nGrpTmp) - local nRes, nCnt = EgtTrimCurveWithRegion( nLinkLoc, nSrfRibs, false, false) - if nCnt == 0 then return false end - local dResLen = EgtCurveLength( nRes) - if dResLen < ( dLen - dResLen) - GEO.EPS_SMALL then + EgtTrimCurveEndAtLen( nLinkLoc, EgtCurveLength( nLinkLoc) - 100 * GEO.EPS_SMALL) + EgtTrimCurveStartAtLen( nLinkLoc, 100 * GEO.EPS_SMALL) + if EgtIP( nLinkLoc, nCurrLoc, ORIG()) or EgtIP( nLinkLoc, nNextLoc, ORIG()) then return false end + + -- se collegamento non ottimale verifico che abbia una parte esterna alla regione occupata dai setti abbsatanza lunga ( > 20% della lunghezza totale) + if dist( EgtEP( nCurr, GDB_ID.ROOT), EgtSP( nNext, GDB_ID.ROOT)) > dist( EgtEP( nCurr, GDB_ID.ROOT), EgtEP( nNext, GDB_ID.ROOT)) + GEO.EPS_SMALL then + local nSrfRibs = EgtSurfFrFatCurve( nGrpTmp, nCurr, dStrand, false) or GDB_ID.NULL + local nSrfRibs2 = EgtSurfFrFatCurve( nGrpTmp, nNext, dStrand, false) or GDB_ID.NULL + EgtSurfFrAdd( nSrfRibs, nSrfRibs2) + -- EgtSetStatus( nSrfRibs, GDB_ST.OFF) + -- EgtSetStatus( nSrfRibs2, GDB_ST.OFF) + local nLinkLoc = EgtCopyGlob( nLinkId, nGrpTmp) + local nRes, nCnt = EgtTrimCurveWithRegion( nLinkLoc, nSrfRibs, false, false) + if nCnt == 0 then return false end + local dResLen = EgtCurveLength( nRes) + if dResLen < 0.2 * dLen - GEO.EPS_SMALL then + return false + end + end end - -- verifico se interseca altri setti ( considerando anche le tipologie del PathGrp non ancora realizzate) + -- 3) verifiche con altri setti ( considerando anche le tipologie del PathGrp non ancora realizzate) local nLinkLoc = EgtCopyGlob( nLinkId, nGrpTmp) local nOrigCurr = EgtGetInfo( nCurr, KEY_ORIGINAL_RIB, 'i') local nOrigNext = EgtGetInfo( nNext, KEY_ORIGINAL_RIB, 'i') @@ -1079,39 +1090,39 @@ local function VerifyRibsLink( nLinkId, nCurr, nNext, nGrpTmp, dStrand, bCheckLi for i = 1, #vRibsIds do if vRibsIds[i] ~= nCurr and vRibsIds[i] ~= nNext then + -- verifico se sovrapposizione tra le passate local dCurrStrand = EgtGetInfo( vRibsIds[i], KEY_RIBS_STRAND, 'd') local nOrigId = EgtGetInfo( vRibsIds[i], KEY_ORIGINAL_RIB, 'i') + local dOffs if nOrigId == nOrigCurr or nOrigId == nOrigNext then - -- se passate relative ad un setto coinvolto verifico se sovrapposizione con la curva - local ptS = EgtSP( vRibsIds[i], GDB_ID.ROOT) - local dParS = EgtCurveParamAtPoint( nLinkLoc, ptS, dCurrStrand * 0.5, GDB_RT.GLOB) - if dParS then return false end - local ptE = EgtEP( vRibsIds[i], GDB_ID.ROOT) - local dParE = EgtCurveParamAtPoint( nLinkLoc, ptE, dCurrStrand * 0.5, GDB_RT.GLOB) - if dParE then return false end + -- se passata relativa ad un setto coinvolto nel link verifico soltanto che il percorso del link non entri nella regione occupata dal setto + dOffs = dCurrStrand * 0.5 else - -- verifico se sovrapposizione con la passata - local dOffs = dCurrStrand * 0.5 + ( 0.5 - dOverlap / 100) * dStrand - 10 * GEO.EPS_SMALL - if dOffs > GEO.EPS_SMALL then - local nSrfCurr = EgtSurfFrFatCurve( nGrpTmp, vRibsIds[i], dOffs, false) - if nSrfCurr then - local nRes = EgtCurveWithRegionClassify( nLinkLoc, nSrfCurr) - if nRes ~= GDB_CRC.OUT then - return false - end + -- altrimenti verifico che le regioni del link e del setto non si sovrappongono ( a meno dell'overlap fissato) + dOffs = dCurrStrand * 0.5 + ( 0.5 - dOverlap / 100) * dStrand - 10 * GEO.EPS_SMALL + end + + if dOffs > GEO.EPS_SMALL then + local nSrfCurr = EgtSurfFrFatCurve( nGrpTmp, vRibsIds[i], dOffs, false) + if nSrfCurr then + -- EgtSetStatus( nSrfCurr, GDB_ST.OFF) + local nRes = EgtCurveWithRegionClassify( nLinkLoc, nSrfCurr) + if nRes ~= GDB_CRC.OUT then + return false end end end end end - -- verifico se si trova almeno in una regione ammissibile ( per caso ForcedLink) + -- 4) verifico se si trova in almeno una regione ammissibile ( per caso ForcedLink) local nType = EgtGetInfo( nCurr, KEY_RIBS_TYPE, 'i') local nOut = 0 for i = 1, 2 do local nSurfId = EgtGetInfo( EgtIf( i == 1, nCurr, nNext), KEY_ASSOCIATED_SURF, 'i') if nSurfId and nSurfId ~= -1 then local nSrfLoc = EgtCopyGlob( nSurfId, nGrpTmp) + -- EgtSetStatus( nSrfLoc, GDB_ST.OFF) local nRes = EgtCurveWithRegionClassify( nLinkId, nSrfLoc) if ( ( nType == RIB_TYPE.INTERNAL or nType == RIB_TYPE.SUPPORT) and ( nRes == GDB_CRC.OUT or nRes == GDB_CRC.INTERS)) or ( nType == RIB_TYPE.EXTERNAL and ( nRes == GDB_CRC.IN or nRes == GDB_CRC.INTERS)) then @@ -1133,31 +1144,37 @@ local function VerifyRibsLink( nLinkId, nCurr, nNext, nGrpTmp, dStrand, bCheckLi end -------------------------------------------------------------------- -local function ComputeRibsLinkOnSameCrv( nCrvId, dParS, dParE, nCurr, nNext, nGrpTmp, dStrand, bCheckLinked) +local function ComputeRibsLinkOnSameCrv( nCrvId, dParS, dParE, nCurr, nNext, nGrpTmp, dStrand) local nParentId = EgtGetParent( nCrvId) + + local nShortest = EgtCopyGlob( nCrvId, nParentId, GDB_IN.AFTER) + local nLongest = EgtCopyGlob( nCrvId, nParentId, GDB_IN.AFTER) + EgtTrimCurveStartEndAtParam( nShortest, dParS, dParE) + EgtTrimCurveStartEndAtParam( nLongest, dParE, dParS) + EgtInvertCurve( nLongest) + if EgtCurveLength( nShortest) > EgtCurveLength( nLongest) + GEO.EPS_SMALL then + nShortest, nLongest = nLongest, nShortest + end - -- verifico il percorso dParS->dParE - local nCopyId = EgtCopyGlob( nCrvId, nParentId, GDB_IN.AFTER) - EgtTrimCurveStartEndAtParam( nCopyId, dParS, dParE) - if VerifyRibsLink( nCopyId, nCurr, nNext, nGrpTmp, dStrand, bCheckLinked) then - return nCopyId + -- verifico il percorso più corto + if VerifyRibsLink( nShortest, nCurr, nNext, nGrpTmp, dStrand) then + EgtErase( nLongest) + return nShortest else - -- se non valido tento con il percorso dParE->dParS - EgtErase( nCopyId) - nCopyId = EgtCopyGlob( nCrvId, nParentId, GDB_IN.AFTER) - EgtTrimCurveStartEndAtParam( nCopyId, dParE, dParS) - EgtInvertCurve( nCopyId) - if VerifyRibsLink( nCopyId, nCurr, nNext, nGrpTmp, dStrand, bCheckLinked) then - return nCopyId + -- se non valido tento con il percorso più lungo + EgtErase( nShortest) + if VerifyRibsLink( nLongest, nCurr, nNext, nGrpTmp, dStrand) then + return nLongest else + EgtErase( nLongest) return end end end -------------------------------------------------------------------- -local function ComputeRibsLinkOnDiffCrvs( nCrvS, nCrvE, dParS, dParE, nCurr, nNext, nGrpTmp, dStrand, bCheckLinked) +local function ComputeRibsLinkOnDiffCrvs( nCrvS, nCrvE, dParS, dParE, nCurr, nNext, nGrpTmp, dStrand) local nParentId = EgtGetParent( nCrvS) @@ -1175,7 +1192,7 @@ local function ComputeRibsLinkOnDiffCrvs( nCrvS, nCrvE, dParS, dParE, nCurr, nNe EgtSpiralizeCurveAlongGuide( nCrv2, nCrv1) EgtErase( nCrv1) -- verifico se valida - if VerifyRibsLink( nCrv2, nCurr, nNext, nGrpTmp, dStrand, bCheckLinked) then + if VerifyRibsLink( nCrv2, nCurr, nNext, nGrpTmp, dStrand) then return nCrv2 else @@ -1189,7 +1206,7 @@ local function ComputeRibsLinkOnDiffCrvs( nCrvS, nCrvE, dParS, dParE, nCurr, nNe EgtInvertCurve( nCrv2) EgtSpiralizeCurveAlongGuide( nCrv2, nCrv1) -- transizione uniforme da nCrv1 EgtErase( nCrv1) - if VerifyRibsLink( nCrv2, nCurr, nNext, nGrpTmp, dStrand, bCheckLinked) then + if VerifyRibsLink( nCrv2, nCurr, nNext, nGrpTmp, dStrand) then return nCrv2 else EgtErase( nCrv2) @@ -1199,7 +1216,7 @@ local function ComputeRibsLinkOnDiffCrvs( nCrvS, nCrvE, dParS, dParE, nCurr, nNe end -------------------------------------------------------------------- -local function CalcRibsLink( nCurr, nNext, nLoopGrp, bForceLink, bCheckLinked, vtSlicing, nGrpTmp) +local function CalcRibsLink( nCurr, nNext, nLoopGrp, bForceLink, vtSlicing, nGrpTmp) local ptS = EgtEP( nCurr) local ptE = EgtSP( nNext) @@ -1232,10 +1249,10 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, bForceLink, bCheckLinked, v local nLinkId if vIdsS[i] == vIdsE[j] then -- link su una sola curva - nLinkId = ComputeRibsLinkOnSameCrv( vCrvIds[vIdsS[i]], vParS[i], vParE[j], nCurr, nNext, nGrpTmp, dStrand, bCheckLinked) + nLinkId = ComputeRibsLinkOnSameCrv( vCrvIds[vIdsS[i]], vParS[i], vParE[j], nCurr, nNext, nGrpTmp, dStrand) else -- link tra due curve distinte - nLinkId = ComputeRibsLinkOnDiffCrvs( vCrvIds[vIdsS[i]], vCrvIds[vIdsE[j]], vParS[i], vParE[j], nCurr, nNext, nGrpTmp, dStrand, bCheckLinked) + nLinkId = ComputeRibsLinkOnDiffCrvs( vCrvIds[vIdsS[i]], vCrvIds[vIdsE[j]], vParS[i], vParE[j], nCurr, nNext, nGrpTmp, dStrand) end if nLinkId then @@ -1257,7 +1274,7 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, bForceLink, bCheckLinked, v EgtModifyCurveExtrusion( nLinkId, vtSlicing, GDB_RT.GLOB) EgtRelocateGlob( nLinkId, nCurr, GDB_IN.AFTER) EgtSetInfo( nLinkId, KEY_CRV_STRAND, dStrand) - local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, nGrpTmp, dStrand, bCheckLinked) + local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, nGrpTmp, dStrand) if bValid then return nLinkId else @@ -1290,7 +1307,7 @@ local function CalcLoopRibLink( nCurr, nNext, nLoopGrp, vtSlicing, nGrpTmp) EgtSetName( nLinkId, LINK_CRV) EgtModifyCurveExtrusion( nLinkId, vtSlicing, GDB_RT.GLOB) EgtSetInfo( nLinkId, KEY_CRV_STRAND, dStrand) - if VerifyRibsLink( nLinkId, nCurr, nNext, nGrpTmp, dStrand, false) then + if VerifyRibsLink( nLinkId, nCurr, nNext, nGrpTmp, dStrand) then return nLinkId else EgtErase( nLinkId) @@ -1328,17 +1345,18 @@ local function VerifyRibsLead( nId, nRibId, bInVsOut, nGrpTmp) end end - -- verifico se interseca altri setti, lead in, lead out o collegamenti + -- 1) verifico se interseca altri setti, lead in, lead out o collegamenti -- recupero gli id degli elementi da controllare local vCheckIds = {} - local nCurrId = EgtGetFirstNameInGroup( EgtGetParent( nRibId), RIBS_CRV .. '*') - -- verifico se il primo setto ha lead in da controllare - local nPrevId = EgtGetPrev( nCurrId) - if nPrevId and EgtGetName( nPrevId) == LEAD_IN_CRV then nCurrId = nPrevId end + local nCurrId = EgtGetFirstInGroup( EgtGetParent( nRibId)) while nCurrId do - -- salto i i wipe ( non sono materiale depositato) e i tratti relativi al setto corrente - if not EgtStartsWith( EgtGetName( nCurrId), WIPE_CRV) and nCurrId ~= nCurrLI and nCurrId ~= nRibId and nCurrId ~= nId and nCurrId ~= nCurrLink then - table.insert( vCheckIds, nCurrId) + -- considero solo i setti e gli elementi a loro associati ( tranne i wipe perchè non corrispondono a materiale depositato) + local nType = EgtGetInfo( nCurrId, KEY_TYPE, 'i') + if nType == TYPE.RIB or ( nType == TYPE.COASTING and EgtGetInfo( EgtGetPrev( nCurrId), KEY_TYPE, 'i') == TYPE.RIB) then + -- verifico non sia un tratto relativo al setto corrente + if nCurrId ~= nCurrLI and nCurrId ~= nRibId and nCurrId ~= nId and nCurrId ~= nCurrLink then + table.insert( vCheckIds, nCurrId) + end end nCurrId = EgtGetNext( nCurrId) end @@ -1359,6 +1377,7 @@ local function VerifyRibsLead( nId, nRibId, bInVsOut, nGrpTmp) if dCurrOffs > GEO.EPS_SMALL then local nSrfCurr = EgtSurfFrFatCurve( nGrpTmp, vCheckIds[i], dCurrOffs, false) if nSrfCurr then + -- EgtSetStatus( nSrfCurr, GDB_ST.OFF) local nRes = EgtCurveWithRegionClassify( nLeadLoc, nSrfCurr) if nRes ~= GDB_CRC.OUT then return false @@ -1367,7 +1386,7 @@ local function VerifyRibsLead( nId, nRibId, bInVsOut, nGrpTmp) end end - -- verifiche con il setto corrente + -- 2) verifiche con il setto corrente -- verifico non passi da altro estremo local dParTest = EgtCurveParamAtPoint( nLeadLoc, EgtIf( bInVsOut, EgtEP( nRibId, GDB_ID.ROOT), EgtSP( nRibId, GDB_ID.ROOT)), 100 * GEO.EPS_SMALL, GDB_RT.GLOB) if dParTest then @@ -1392,7 +1411,7 @@ local function VerifyRibsLead( nId, nRibId, bInVsOut, nGrpTmp) end end - -- verifiche con eventuale lead in + -- 3) verifiche con eventuale lead in if nCurrLI then local nLeadInLoc = EgtCopyGlob( nCurrLI, nGrpTmp) -- verifico se intersezione fra curve @@ -1404,6 +1423,7 @@ local function VerifyRibsLead( nId, nRibId, bInVsOut, nGrpTmp) if dLeadInLen > dStrand + GEO.EPS_SMALL then local nSrfLeadIn = EgtSurfFrFatCurve( nGrpTmp, nId, dStrand * ( 1 - dOverlap / 100), false) if nSrfLeadIn then + -- EgtSetStatus( nSrfLeadIn, GDB_ST.OFF) -- verifico di avere un solo tratto esterno di lunghezza sufficiente local nRes, nCnt = EgtTrimCurveWithRegion( nLeadInLoc, nSrfLeadIn, false, false) if nCnt ~= 1 then @@ -1701,16 +1721,17 @@ local function CalcRibsToolPath( vEntIds, nRibsGrp, nTpathGrpId, LayerParams) local bLoopRib = EgtGetInfo( tabRibs[i][1], KEY_LOOP_RIB, 'b') or false for j = 1, #tabRibs[i] - 1 do local bUserLink = ( EgtGetInfo( tabRibs[i][j], KEY_RIBS_USER_LINK, 'b') or false) and ( EgtGetInfo( tabRibs[i][j+1], KEY_RIBS_USER_LINK, 'b') or false) + local bSplitAfterTrim = EgtGetInfo( tabRibs[i][1], KEY_SPLIT_AFTER_TRIM, 'b') or false local nOrig1 = EgtGetInfo( tabRibs[i][j], KEY_ORIGINAL_RIB, 'i') or 0 local nOrig2 = EgtGetInfo( tabRibs[i][j + 1], KEY_ORIGINAL_RIB, 'i') or 0 local nSplitId1 = EgtGetInfo( tabRibs[i][j], KEY_SPLIT_ID, 'i') or 0 local nSplitId2 = EgtGetInfo( tabRibs[i][j + 1], KEY_SPLIT_ID, 'i') or 0 local bForceLink = ( nOrig1 == nOrig2 and nSplitId1 == nSplitId2) - local bCheckLinkedRibs = not bForceLink and not bUserLink - if ( nOrig1 ~= nOrig2 and bUserLink) or ( nSplitId1 == nSplitId2 and nOrig1 == nOrig2) then + -- creo collegamento se userlink, passate dello stesso setto o passate divise dopo trim + if ( nOrig1 ~= nOrig2 and bUserLink) or ( nSplitId1 == nSplitId2 and nOrig1 == nOrig2) or ( nOrig1 == nOrig2 and bSplitAfterTrim) then if not bLoopRib then - CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, bForceLink, bCheckLinkedRibs, LayerParams.vtSlicing, nGrpTmp) + CalcRibsLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, bForceLink, LayerParams.vtSlicing, nGrpTmp) else local nLinkId = CalcLoopRibLink( tabRibs[i][j], tabRibs[i][j + 1], nLoopGrp, LayerParams.vtSlicing, nGrpTmp) -- se collegamento congiungo i setti in unico percorso @@ -1761,7 +1782,7 @@ local function CalcRibsToolPath( vEntIds, nRibsGrp, nTpathGrpId, LayerParams) local bLoop2 = EgtGetInfo( tabRibs[i + 1][1], KEY_LOOP_RIB, 'b') or false if bLink1 and bLink2 and not bLoop1 and not bLoop2 then local nCnt = #tabRibs[i] - CalcRibsLink( tabRibs[i][nCnt], tabRibs[i + 1][1], nLoopGrp, false, true, LayerParams.vtSlicing, nGrpTmp) + CalcRibsLink( tabRibs[i][nCnt], tabRibs[i + 1][1], nLoopGrp, false, LayerParams.vtSlicing, nGrpTmp) end end