diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index a5e8b35..7730d4a 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -193,6 +193,7 @@ RIB_TYPE = { INTERNAL = 1, EXTERNAL = 2, UNBOUNDED = 3, + SUPPORT = 4, } RIB_PRINT_ORDER = { diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 253cedb..7e20538 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -438,12 +438,12 @@ end local function ComputeTrimSurfWithOverlapsForRibs( vIds, nSrfBase, nSrfExt, dOffs, dStrand, nGrp, vtSlicing) -- per ogni tipologia e overlap creo le superfici con cui fare i trim - local tSurfOffs = {{}, {}, {}} + local tSurfOffs = {{}, {}, {}, {}} for i = 1, #vIds do local nOverlap = EgtGetInfo( vIds[i], KEY_RIBS_OVERLAP, 'i') local nType = EgtGetInfo( vIds[i], KEY_RIBS_TYPE, 'i') if not tSurfOffs[nType][nOverlap] then - if nType == RIB_TYPE.INTERNAL then + if nType == RIB_TYPE.INTERNAL or nType == RIB_TYPE.SUPPORT then if nSrfBase then local dNewOffs = nOverlap / 100 * dStrand local bOk, bExists, nSrfOffs = ComputeSurfOffset( nSrfBase, nGrp, dNewOffs, vtSlicing) @@ -471,8 +471,9 @@ end -------------------------------------------------------------------- local function VerifyRibsIntersection( nRib1, nRib2, nType1, nType2, nSrf1, nSrf2, dWidth, nGrp, nOffsGrp) - -- setti interni ed esterni non si possono intersecare per definizione - if ( nType1 == RIB_TYPE.INTERNAL and nType2 == RIB_TYPE.EXTERNAL) or ( nType1 == RIB_TYPE.EXTERNAL and nType2 == RIB_TYPE.INTERNAL) then + -- setti interni/supporto ed esterni non si possono intersecare per definizione + if ( ( nType1 == RIB_TYPE.INTERNAL or nType1 == RIB_TYPE.SUPPORT) and nType2 == RIB_TYPE.EXTERNAL) or + ( nType1 == RIB_TYPE.EXTERNAL and ( nType2 == RIB_TYPE.INTERNAL or nType2 == RIB_TYPE.SUPPORT)) then return false end -- se hanno lo stesso nome derivano dalla stessa costolatura quindi non ha senso controllare intersezione @@ -513,15 +514,15 @@ local function VerifyRibsIntersection( nRib1, nRib2, nType1, nType2, nSrf1, nSrf -- se intersezione verifico se valida if ptInt then local nPtId = EgtPoint( nGrp, ptInt, GDB_RT.GLOB) - if nType1 == RIB_TYPE.INTERNAL or nType2 == RIB_TYPE.INTERNAL then - -- l'intersezione deve essere interna - if nSrf1 and not EgtSurfFrTestExternal( nSrf1, nPtId) then bInters = true end + if nType1 == RIB_TYPE.UNBOUNDED and nType2 == RIB_TYPE.UNBOUNDED then + -- nel caso unbounded l'intersezione può essere ovunque + bInters = true elseif nType1 == RIB_TYPE.EXTERNAL or nType2 == RIB_TYPE.EXTERNAL then -- l'intersezione deve essere esterna if nSrf2 and EgtSurfFrTestExternal( nSrf2, nPtId) then bInters = true end else - -- nel caso unbounded l'intersezione può essere ovunque - bInters = true + -- se uno dei due è interno o supporto l'intersezione deve essere interna + if nSrf1 and not EgtSurfFrTestExternal( nSrf1, nPtId) then bInters = true end end else bInters = bFound @@ -627,7 +628,7 @@ local function UpdateSplitOrder( nCrv, tInters, nOffsGrp) end -------------------------------------------------------------------- -local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands) +local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands, vRibsPrintOrder) local vRibsIds = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') -- copio gli offset delle costolature nel RibsPathGrp @@ -691,10 +692,11 @@ local function HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPa nCrv1, nCrv2 = nCrv2, nCrv1 nSplitOrder1, nSplitOrder2 = nSplitOrder2, nSplitOrder1 else - -- prediligo setto già splittato più volte - if nSplitOrder1 > nSplitOrder2 then - nCrv1, nCrv2 = nCrv2, nCrv1 - nSplitOrder1, nSplitOrder2 = nSplitOrder2, nSplitOrder1 + -- se stessa tipologia taglio il setto già splittato più volte, altrimenti taglio il setto che viene realizzato successivamente + if ( nType1 == nType2 and nSplitOrder1 > nSplitOrder2) or + ( nType1 ~= nType2 and vRibsPrintOrder[nType1] > vRibsPrintOrder[nType2]) then + nCrv1, nCrv2 = nCrv2, nCrv1 + nSplitOrder1, nSplitOrder2 = nSplitOrder2, nSplitOrder1 end end @@ -766,7 +768,7 @@ local function ReorderRibs( nGrp, bInvertOrder, bDoLinkFirst, dStrand, nMaxNbr, if not vIds or #vIds == 0 then return end -- raggruppo per tipologia - local tRibs = {{}, {}, {}} + local tRibs = {{}, {}, {}, {}} for i = 1, #vIds do local nType = EgtGetInfo( vIds[i], KEY_RIBS_TYPE, 'i') table.insert( tRibs[nType], vIds[i]) @@ -774,7 +776,7 @@ local function ReorderRibs( nGrp, bInvertOrder, bDoLinkFirst, dStrand, nMaxNbr, -- riordino ogni tipologia con shortest path local vSplitRibs = {} - for i = 1, 3 do + for i = 1, #vTypeSequence do local nCurrType = vTypeSequence[i] local tSplitOrder = {} local nMax = -1 @@ -865,6 +867,9 @@ local function ReassignInfo( nCrv, nCnt, vOrig) local ptE = EgtEP( nId) EgtSetInfo( nId, KEY_TYPE, TYPE.RIB) + if EgtCurveIsClosed( nId) then + EgtSetInfo( nId, KEY_CLOSED_CRV, 1) + end local bStart = false local bEnd = false @@ -906,7 +911,37 @@ end -- Funzione che riordina le costolature nel caso di intersezioni e 2 passate local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vTypeSequence) - local vOffs = EgtGetNameInGroup( nOffsGrp, RIBS_CRV .. '*') + local vOffs = {} + local vClosed = {} + local nId = EgtGetFirstNameInGroup( nOffsGrp, RIBS_CRV .. '*') + while nId do + if EgtCurveIsClosed( nId) then + table.insert( vClosed, nId) + else + table.insert( vOffs, nId) + end + nId = EgtGetNextName( nId, RIBS_CRV .. '*') + end + + local k = 0 -- indice da utilizzare per i nomi + + -- gestione delle curve chiuse + if #vClosed > 0 then + k = k + 1 + local sPrevName = EgtGetName( vClosed[1]) + EgtSetName( vClosed[1], RIBS_CRV .. tostring( k)) + for i = 2, #vClosed do + local sCurrName = EgtGetName( vClosed[i]) + -- se setto diverso aggiorno il nome + if sCurrName ~= sPrevName then + k = k + 1 + end + EgtSetName( vClosed[i], RIBS_CRV .. tostring( k)) + sPrevName = sCurrName + end + end + + -- gestione delle curve aperte -- copio le curve originali ( per recuperarne le info) local vCopy = {} for i = 1, #vOffs do @@ -922,8 +957,7 @@ local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vTypeSequence) end -- recupero le info dalle curve originali ReassignInfo( nCrv, nCnt, vCopy) - - local k = 0 -- indice da utilizzare per i nomi + while #vIds > 0 do k = k + 1 -- prendo la prima tra le curve a disposizione @@ -1019,13 +1053,13 @@ local function ReorderRibsInters2Shells( nOffsGrp, dStrand, vTypeSequence) -- classifico in base alla tipologia local vCrvs = EgtGetNameInGroup( nOffsGrp, RIBS_CRV .. '*') - local tRibs = {{}, {}, {}} + local tRibs = {{}, {}, {}, {}} for nId = 1, #vCrvs do local nType = EgtGetInfo( vCrvs[nId], KEY_RIBS_TYPE, 'i') table.insert( tRibs[nType], vCrvs[nId]) end -- riordino per tipologia - for i = 1, 3 do + for i = 1, #vTypeSequence do nCurrType = vTypeSequence[i] for j = 1, #tRibs[nCurrType] do EgtRelocateGlob( tRibs[nCurrType][j], nOffsGrp, GDB_IN.LAST_SON) @@ -1065,6 +1099,13 @@ end -------------------------------------------------------------------- local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) + -- stabilisco ordine di realizzazione delle varie tipologie + local vTypeSequence = { 3, 1, 4, 2} + local vRibsPrintOrder = {} + for i = 1, #vTypeSequence do + vRibsPrintOrder[vTypeSequence[i]] = i + end + local vRibs = EgtGetNameInGroup( nRibsGrp, RIBS_CRV .. '*') -- verifico se tutte le costolature vengono fatte con 2 passate local bAllTwoStrands = true @@ -1118,7 +1159,7 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) local tSurfOffs = ComputeTrimSurfWithOverlapsForRibs( vRibs, nSrfBase, nSrfExt, LayerParams.dOffs, LayerParams.dStrand, nRibsPathGrp, LayerParams.vtSlicing) -- gestisco eventuali intersezioni fra costolature - local bInters = HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands) + local bInters = HandleRibsIntersections( nRibsGrp, LayerParams, nOffsGrp, nRibsPathGrp, bAllTwoStrands, vRibsPrintOrder) EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_INTERS, bInters) EgtSetInfo( nRibsPathGrp or GDB_ID.NULL, KEY_RIBS_TWO_STRANDS, bAllTwoStrands) @@ -1141,7 +1182,7 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) nCrv = vOrderedRibs[i] nCnt = 1 else - nCrv, nCnt = EgtTrimCurveWithRegion( vOrderedRibs[i], tSurfOffs[nType][nOverlap], EgtIf( nType == RIB_TYPE.INTERNAL, true, false), false) + nCrv, nCnt = EgtTrimCurveWithRegion( vOrderedRibs[i], tSurfOffs[nType][nOverlap], EgtIf( nType == RIB_TYPE.INTERNAL or nType == RIB_TYPE.SUPPORT, true, false), false) end tOldNewIds[ vOrderedRibs[i]] = {} @@ -1195,21 +1236,7 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, nIdx, vPtStart) -- aggiorno le info di split con i nuovi id UpdateRibSplitInfo( nRibsPathGrp, tOldNewIds, tRemoved) - - -- stabilisco ordine di realizzazione delle varie tipologie - local vTypeSequence = {RIB_TYPE.INTERNAL, RIB_TYPE.EXTERNAL, RIB_TYPE.UNBOUNDED} - if LayerParams.nRibsPrintOrder == RIB_PRINT_ORDER.INT_UNBDD_EXT then - vTypeSequence = {RIB_TYPE.INTERNAL, RIB_TYPE.UNBOUNDED, RIB_TYPE.EXTERNAL} - elseif LayerParams.nRibsPrintOrder == RIB_PRINT_ORDER.EXT_INT_UNBDD then - vTypeSequence = {RIB_TYPE.EXTERNAL, RIB_TYPE.INTERNAL, RIB_TYPE.UNBOUNDED} - elseif LayerParams.nRibsPrintOrder == RIB_PRINT_ORDER.EXT_UNBDD_INT then - vTypeSequence = {RIB_TYPE.EXTERNAL, RIB_TYPE.UNBOUNDED, RIB_TYPE.INTERNAL} - elseif LayerParams.nRibsPrintOrder == RIB_PRINT_ORDER.UNBDD_INT_EXT then - vTypeSequence = {RIB_TYPE.UNBOUNDED, RIB_TYPE.INTERNAL, RIB_TYPE.EXTERNAL} - elseif LayerParams.nRibsPrintOrder == RIB_PRINT_ORDER.UNBDD_EXT_INT then - vTypeSequence = {RIB_TYPE.UNBOUNDED, RIB_TYPE.EXTERNAL, RIB_TYPE.INTERNAL} - end - + -- riordino le costolature if bAllTwoStrands and bInters then -- gestione caso speciale di intersezione e 2 passate diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index 9351aa9..87d34d8 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -529,7 +529,7 @@ local function VerifyRibsLink( nLinkId, nCurr, nNext, dStrand, nGrpTmp) local nRes = EgtCurveWithRegionClassify( nLinkId, nSurfId) local nType1 = EgtGetInfo( nCurr, KEY_RIBS_TYPE, 'i') local nType2 = EgtGetInfo( nNext, KEY_RIBS_TYPE, 'i') - if nType1 == RIB_TYPE.INTERNAL and nType2 == RIB_TYPE.INTERNAL then + if ( nType1 == RIB_TYPE.INTERNAL or nType1 == RIB_TYPE.SUPPORT) and ( nType2 == RIB_TYPE.INTERNAL or nType2 == RIB_TYPE.SUPPORT) then if nRes == GDB_CRC.OUT or nRes == GDB_CRC.INTERS then return false end @@ -781,7 +781,7 @@ local function FindCorrectRibsLead( dPar, nCrv, nCrvOffs, bLeadInvert, dLeadLen, return nil else -- se non è valido ma ho altra curva possibile, tento con quella - EgtErase( nLeadId) + EgtErase( nLeadId) nLeadId = EgtCopyGlob( nOtherCrv, nCrv, EgtIf( bInVsOut, GDB_IN.BEFORE, GDB_IN.AFTER)) if not bInvert then EgtInvertCurve( nLeadId) end EgtTrimCurveEndAtLen( nLeadId, dLeadLen) @@ -798,7 +798,7 @@ local function FindCorrectRibsLead( dPar, nCrv, nCrvOffs, bLeadInvert, dLeadLen, return nil end -- aggiorno parametro bInvert - bInvert = not bInvert + bInvert = not bInvert end return nLeadId, bInvert @@ -1066,7 +1066,9 @@ local function CalcRibsToolPath( nRibsGrp, nTpathGrpId, LayerParams, dCorrZ) for i = 1, #tabRibs - 1 do local bLink1 = EgtGetInfo( tabRibs[i][1], KEY_RIBS_LINK, 'b') local bLink2 = EgtGetInfo( tabRibs[i + 1][1], KEY_RIBS_LINK, 'b') - if bLink1 and bLink2 then + local nType1 = EgtGetInfo( tabRibs[i][1], KEY_RIBS_TYPE, 'i') + local nType2 = EgtGetInfo( tabRibs[i + 1][1], KEY_RIBS_TYPE, 'i') + if bLink1 and bLink2 and nType1 == nType2 then local nCnt = #tabRibs[i] CalcRibsLink( tabRibs[i][nCnt], tabRibs[i + 1][1], nLoopGrp, LayerParams.dStrand, false, LayerParams.vtSlicing, nGrpTmp) end diff --git a/LuaLibs/RunSlicing.lua b/LuaLibs/RunSlicing.lua index 702a6b2..3fe275d 100644 --- a/LuaLibs/RunSlicing.lua +++ b/LuaLibs/RunSlicing.lua @@ -144,6 +144,8 @@ local function LoadParams( sFile, nPartId) EgtSetInfo( nPartId, KEY_RIBS_TYPE, RIB_TYPE.EXTERNAL) elseif sRibType == 'Unbounded' then EgtSetInfo( nPartId, KEY_RIBS_TYPE, RIB_TYPE.UNBOUNDED) + elseif sRibType == 'Support' then + EgtSetInfo( nPartId, KEY_RIBS_TYPE, RIB_TYPE.SUPPORT) else -- 'Internal' EgtSetInfo( nPartId, KEY_RIBS_TYPE, RIB_TYPE.INTERNAL) end