From e1c375aa5aef03cc49df653fb20e5dae4b305614 Mon Sep 17 00:00:00 2001 From: SaraP Date: Tue, 19 Aug 2025 14:32:17 +0200 Subject: [PATCH] 3dPrinting 2.7h1 : - aggiunto parametro RibsStrandOverlap per impostare una sovrapposizione tra le passate di uno stesso setto - aggiunto numero massimo di layer da realizzare. --- LuaLibs/AddManData.lua | 2 + LuaLibs/CalcPaths.lua | 31 +++++++--- LuaLibs/CalcSlices.lua | 13 ++++- LuaLibs/CalcToolPath.lua | 122 +++++++++++++++++++-------------------- Version.lua | 2 +- 5 files changed, 96 insertions(+), 74 deletions(-) diff --git a/LuaLibs/AddManData.lua b/LuaLibs/AddManData.lua index 7c1b826..c88cf18 100644 --- a/LuaLibs/AddManData.lua +++ b/LuaLibs/AddManData.lua @@ -111,6 +111,7 @@ KEY_RIBS_STRAND = "RibsStrandW" KEY_RIBS_TYPE = "RibsType" KEY_LIMIT_UNBDD_RIBS = "LimitUnboundedRibsWithSolid" KEY_RIBS_OVERLAP = "RibsOverlap" +KEY_RIBS_STRAND_OVERLAP = 'RibsStrandOverlap' KEY_RIBS_SHELLS_NBR = "RibsStrandCount" KEY_RIBS_LINK = "RibsLink" KEY_RIBS_INVERT_DIR = "RibsInvertDirection" @@ -184,6 +185,7 @@ KEY_LINEAR_TOL = 'LinearTol' -- Altre chiavi KEY_MAX_H = "SlicingHeight" +KEY_MAX_SLICES_NBR = "MaxSlicesNumber" KEY_SLICE_NBR = "SliceNbr" KEY_SLICE_Z = "SliceZ" KEY_SLICE_DELTAZ = "DeltaZ" diff --git a/LuaLibs/CalcPaths.lua b/LuaLibs/CalcPaths.lua index 38fdcf2..6a70a3d 100644 --- a/LuaLibs/CalcPaths.lua +++ b/LuaLibs/CalcPaths.lua @@ -1287,7 +1287,8 @@ local function ComputeRibsOrientedOffset( nRibsGrp) local bCCW = EgtGetInfo( vIds[i], KEY_RIBS_USER_LINK_CCW, 'b') or false local nLinkOrder = EgtGetInfo( vIds[i], KEY_RIBS_USER_LINK_ORDER, 'i') or 0 local dStrand = EgtGetInfo( vIds[i], KEY_RIBS_STRAND, 'd') - local dOffs = ( nShellsNbr - 1) * dStrand / 2 + local dStrandOverlap = EgtGetInfo( vIds[i], KEY_RIBS_STRAND_OVERLAP, 'd') or 0 + local dOffs = ( nShellsNbr - 1) * ( 1 - dStrandOverlap / 100) * dStrand / 2 -- ordine di realizzazione degli offset if not bUserLinked then @@ -1303,7 +1304,7 @@ local function ComputeRibsOrientedOffset( nRibsGrp) local vOffsRib = {} for k = 0, nShellsNbr - 1 do - local dOffsCurr = dOffs - k * dStrand + local dOffsCurr = dOffs - k * ( 1 - dStrandOverlap / 100) * dStrand local nNewId if abs( dOffsCurr) < GEO.EPS_SMALL then nNewId = EgtCopyGlob( vIds[i], nOffsGrp) @@ -1607,10 +1608,11 @@ local function AdjustRibsOffsetForIntersection( nCrv1, nCrv2, nOffsGrp, nLoopGrp local nShells = EgtGetInfo( nCrv1, KEY_RIBS_SHELLS_NBR, 'i') local dStrand1 = EgtGetInfo( nCrv1, KEY_RIBS_STRAND, 'd') + local dStrandOverlap1 = EgtGetInfo( nCrv1, KEY_RIBS_STRAND_OVERLAP, 'd') or 0 local dOverlap = EgtGetInfo( nCrv2, KEY_RIBS_OVERLAP, 'i') local dStrand2 = EgtGetInfo( nCrv2, KEY_RIBS_STRAND, 'd') - if dOverlap / 100 * dStrand2 > nShells * dStrand1 * 0.5 - GEO.EPS_SMALL then + if dOverlap / 100 * dStrand2 > ( nShells - 1) * ( 1 - dStrandOverlap1 / 100) * dStrand1 * 0.5 + dStrand1 * 0.5 - GEO.EPS_SMALL then -- non ha senso spezzare la curva, aggiorno solo split order dei suoi offset for i = 1, #vOffs2 do CopyInfo( nCrv2, vOffs2[i], KEY_SPLIT_ORDER, 'i') @@ -1619,7 +1621,7 @@ local function AdjustRibsOffsetForIntersection( nCrv1, nCrv2, nOffsGrp, nLoopGrp end -- calcolo la superficie della curva principale ( nCrv1) da usare per trim - local dOffs = nShells * dStrand1 * 0.5 + dStrand2 * ( 0.5 - dOverlap / 100) + local dOffs = ( nShells - 1) * ( 1 - dStrandOverlap1 / 100) * dStrand1 * 0.5 + dStrand1 * 0.5 + dStrand2 * ( 0.5 - dOverlap / 100) local nSrf = EgtSurfFrFatCurve( nOffsGrp, nCrv1, dOffs, false, false, s_dOffsTol) if not nSrf then EgtOutLog( 'Error : ribs intersection failed (layer '.. EgtNumToString( s_nCurrIdx) ..') - CalcPaths') @@ -1678,9 +1680,11 @@ local function AdjustRibsOffsetForIntersection2Shells( nCrv1, nCrv2, nOffsGrp) -- costruisco le superfici da usare per trim local dStrand1 = EgtGetInfo( nCrv1, KEY_RIBS_STRAND, 'd') - local nSrf1 = EgtSurfFrFatCurve( nOffsGrp, nCrv1, dStrand1 * 0.5, false, false, s_dOffsTol) + local dStrandOverlap1 = EgtGetInfo( nCrv1, KEY_RIBS_STRAND_OVERLAP, 'd') or 0 + local nSrf1 = EgtSurfFrFatCurve( nOffsGrp, nCrv1, ( 1 - dStrandOverlap1 / 100) * dStrand1 * 0.5, false, false, s_dOffsTol) local dStrand2 = EgtGetInfo( nCrv2, KEY_RIBS_STRAND, 'd') - local nSrf2 = EgtSurfFrFatCurve( nOffsGrp, nCrv2, dStrand2 * 0.5, false, false, s_dOffsTol) + local dStrandOverlap2 = EgtGetInfo( nCrv2, KEY_RIBS_STRAND_OVERLAP, 'd') or 0 + local nSrf2 = EgtSurfFrFatCurve( nOffsGrp, nCrv2, ( 1 - dStrandOverlap2 / 100) * dStrand2 * 0.5, false, false, s_dOffsTol) -- trim degli offset di nCrv1 local vOffs1 = EgtGetNameInGroup( nOffsGrp, EgtGetName( nCrv1)) or {} @@ -2143,6 +2147,7 @@ local function ReassignInfo( nCrv, nCnt, vOrig) CopyInfo( vOrig[i], nId, KEY_RIBS_LEAD_IN_LEN, 'd') CopyInfo( vOrig[i], nId, KEY_ASSOCIATED_SURF, 'i') CopyInfo( vOrig[i], nId, KEY_RIBS_OVERLAP, 'd') + CopyInfo( vOrig[i], nId, KEY_RIBS_STRAND_OVERLAP, 'd') CopyInfo( vOrig[i], nId, KEY_RIBS_TYPE, 'i') CopyInfo( vOrig[i], nId, KEY_RIBS_LINK, 'b') CopyInfo( vOrig[i], nId, KEY_RIBS_LINK_FILLET, 'd') @@ -2585,7 +2590,8 @@ local function AddFillet( nRib1, vLinks, nRib2, nGrpId) local nSplit2 = EgtGetInfo( nRib2, KEY_SPLIT_ID, 'i') or 0 if nOrig1 == nOrig2 and nSplit1 == nSplit2 then local dStrand = EgtGetInfo( nRib1, KEY_RIBS_STRAND, 'd') - dFillet1 = min( dFillet1, 0.5 * dStrand) + local dStrandOverlap = EgtGetInfo( nRib1, KEY_RIBS_STRAND_OVERLAP, 'd') + dFillet1 = min( dFillet1, 0.5 * ( 1 - dStrandOverlap / 100) * dStrand) dFillet2 = dFillet1 end @@ -2833,9 +2839,18 @@ local function HandleRibsIntersectionForRibsMergedShells( vOrigRibs, nRibsGrp, n nCrv1, nCrv2 = nCrv2, nCrv1 end + -- verifico che la curva secondaria abbia una sola passata + local nShells2 = EgtGetInfo( nCrv2, KEY_RIBS_SHELLS_NBR, 'i') + if nShells2 > 1 then + EgtOutLog( 'Error : shell-merged ribs intersect in a non valid way (layer '.. EgtNumToString( s_nCurrIdx) ..') - CalcPaths') + table.insert( s_vErr, ' - layer ' .. EgtNumToString( s_nCurrIdx) .. ' : error in ribs-merged shells intersection') + return false + end + -- calcolo la superficie della curva principale ( nCrv1) da usare per trim local nShells = EgtGetInfo( nCrv1, KEY_RIBS_SHELLS_NBR, 'i') - local dOffs = (( nShells + 1) * 0.5 - dOverlap / 100) * dStrand + local dStrandOverlap = EgtGetInfo( nCrv1, KEY_RIBS_STRAND_OVERLAP, 'd') + local dOffs = (( nShells - 1) * ( 1 - dStrandOverlap / 100) * 0.5 + 1 - dOverlap / 100) * dStrand local nSrf = EgtSurfFrFatCurve( nGrpTmp, nCrv1, dOffs, false, false, s_dOffsTol) if not nSrf then EgtOutLog( 'Error : EgtSurfFrFatCurve for shell-merged ribs intersection failed (layer '.. EgtNumToString( s_nCurrIdx) ..') - CalcPaths') diff --git a/LuaLibs/CalcSlices.lua b/LuaLibs/CalcSlices.lua index a83932c..4d7b6dd 100644 --- a/LuaLibs/CalcSlices.lua +++ b/LuaLibs/CalcSlices.lua @@ -27,11 +27,19 @@ local MIN_AREA = 25.0 --------------------------------------------------------------------- local function ComputeZSlices( dSliceStep, dZmin, dDeltaZ, dZmax) + -- verifico se è impostato un numero massimo di slices + local nMaxSlicesNbr = EgtGetInfo( s_nPartId, KEY_MAX_SLICES_NBR, 'i') or 0 + if nMaxSlicesNbr == 0 then + nMaxSlicesNbr = GEO.INFINITO -- da gestire come caso illimitato + end + + local nCnt = 1 local ptSlices = { dZmin + dDeltaZ} local dPosZ = dZmin + dSliceStep - while dPosZ < dZmax do + while dPosZ < dZmax and nCnt < nMaxSlicesNbr do table.insert( ptSlices, dPosZ) dPosZ = dPosZ + dSliceStep + nCnt = nCnt + 1 end return ptSlices end @@ -117,6 +125,7 @@ local function GetRibParams( nId) ReadParam( nId, KEY_RIBS_LEAD_OUT_WIPE, 'd', 0, RibParam) ReadParam( nId, KEY_RIBS_LEAD_OUT_WIPE_DIR, 'd', 0, RibParam) ReadParam( nId, KEY_RIBS_OVERLAP, 'd', 0, RibParam) + ReadParam( nId, KEY_RIBS_STRAND_OVERLAP, 'd', 0, RibParam) ReadParam( nId, KEY_RIBS_LINK, 'b', false, RibParam) ReadParam( nId, KEY_RIBS_TYPE, 'i', RIB_TYPE.INTERNAL, RibParam) ReadParam( nId, KEY_RIBS_INVERT_STRAND_ORDER, 'b', false, RibParam) @@ -1144,8 +1153,6 @@ function CalcSlices.Exec( nPartId, nStmId) local dZmax = b3Box:getMax():getZ() local dMaxH = ComputeMaxH( vRefIds, frSlicing, dSliceStep) dZmax = min( dZmax, dMaxH) - --dZmin = 708 - --dZmax = 712 -- Eseguo slicing local nLayCnt = 1 diff --git a/LuaLibs/CalcToolPath.lua b/LuaLibs/CalcToolPath.lua index c3fe505..59fbb6f 100644 --- a/LuaLibs/CalcToolPath.lua +++ b/LuaLibs/CalcToolPath.lua @@ -1217,7 +1217,8 @@ local function VerifyRibsLink( nLinkId, nCurr, nNext, nGrpTmp, dStrand) local dOffs if nOrigId == nOrigCurr or nOrigId == nOrigNext then -- 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 + local dStrandOverlap = EgtGetInfo( vRibsIds[i], KEY_RIBS_STRAND_OVERLAP, 'd') + dOffs = dCurrStrand * ( 0.5 - dStrandOverlap / 100) else -- 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 - 50 * GEO.EPS_SMALL @@ -1346,8 +1347,15 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, bForceLink, vtSlicing, nGrp local dStrand1 = EgtGetInfo( nCurr, KEY_CRV_STRAND, 'd') local dStrand2 = EgtGetInfo( nNext, KEY_CRV_STRAND, 'd') local dStrand = max( dStrand1, dStrand2) + local dFillet1 = EgtGetInfo( nCurr, KEY_RIBS_LINK_FILLET, 'd') local dFillet2 = EgtGetInfo( nNext, KEY_RIBS_LINK_FILLET, 'd') + if bForceLink then + local dStrandOverlap1 = EgtGetInfo( nCurr, KEY_RIBS_STRAND_OVERLAP, 'd') + local dStrandOverlap2 = EgtGetInfo( nNext, KEY_RIBS_STRAND_OVERLAP, 'd') + dFillet1 = min( dFillet1, ( 1 - dStrandOverlap1 / 100) * dStrand1 * 0.5) + dFillet2 = min( dFillet2, ( 1 - dStrandOverlap2 / 100) * dStrand2 * 0.5) + end local vCrvIds = EgtGetAllInGroup( nLoopGrp) -- recupero le curve di bordo su cui poggiano i setti e i corrispondenti parametri @@ -1380,10 +1388,6 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, bForceLink, vtSlicing, nGrp if nLinkId then -- fillet - if bForceLink then - dFillet1 = min( dFillet1, dStrand1 * 0.5) - dFillet2 = min( dFillet2, dStrand2 * 0.5) - end AddFillet( nCurr, nLinkId, dFillet1, vtSlicing) AddFillet( nLinkId, nNext, dFillet2, vtSlicing) -- assegno le info @@ -1409,8 +1413,6 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, bForceLink, vtSlicing, nGrp local bValid = VerifyRibsLink( nLinkId, nCurr, nNext, nGrpTmp, dStrand) if bValid then -- fillet - dFillet1 = min( dFillet1, dStrand1 * 0.5) - dFillet2 = min( dFillet2, dStrand2 * 0.5) AddFillet( nCurr, nLinkId, dFillet1, vtSlicing) AddFillet( nLinkId, nNext, dFillet2, vtSlicing) return nLinkId @@ -1466,56 +1468,49 @@ end local function VerifyRibsLead( nId, nRibId, bInVsOut, nGrpTmp) local dStrand = EgtGetInfo( nRibId, KEY_CRV_STRAND, 'd') - local dOverlap = EgtGetInfo( nRibId, KEY_RIBS_OVERLAP, 'd') + local dShellOverlap = EgtGetInfo( nRibId, KEY_RIBS_OVERLAP, 'd') + local dStrandOverlap = EgtGetInfo( nRibId, KEY_RIBS_STRAND_OVERLAP, 'd') + local dOverlap = max( dShellOverlap, dStrandOverlap) + local nOrigRib = EgtGetInfo( nRibId, KEY_ORIGINAL_RIB, 'i') local dLen = EgtCurveLength( nId) -- porto il lead nel gruppo locale local nLeadLoc = EgtCopyGlob( nId, nGrpTmp) - - -- individuo eventuale lead in o link relativo al setto corrente ( solo se collega due passate dello stesso setto) - local nCurrLI - local nCurrLink - 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 - elseif nPrev and EgtGetName( nPrev) == LINK_CRV then - local nPrevRib = EgtGetPrev( nPrev) - local nOrigRib = EgtGetInfo( nRibId, KEY_ORIGINAL_RIB, 'i') or -1 - local nOrigRibPrev = EgtGetInfo( nPrevRib, KEY_ORIGINAL_RIB, 'i') or -1 - if nOrigRib == nOrigRibPrev then - nCurrLink = nPrev - end - end - end -- 1) verifico se interseca altri setti, lead in, lead out o collegamenti -- recupero gli id degli elementi da controllare local vCheckIds = {} local nCurrId = EgtGetFirstInGroup( EgtGetParent( nRibId)) while nCurrId do - -- 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) + if nCurrId ~= nRibId and nCurrId ~= nId then + -- 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 + -- controllo che non sia un elemento relativo ad un'altra passata del setto corrente + if EgtGetName( nCurrId) == LEAD_IN_CRV then + -- il setto di riferimento è l'elemento successivo + local nCurrOrigRib = EgtGetInfo( EgtGetNext( nCurrId), KEY_ORIGINAL_RIB, 'i') or -1 + if nOrigRib ~= nCurrOrigRib then + table.insert( vCheckIds, nCurrId) + end + elseif EgtGetName( nCurrId) == LINK_CRV then + -- il link va controllato se non congiunge due passate del setto corrente + local nOrigRib1 = EgtGetInfo( EgtGetPrev( nCurrId), KEY_ORIGINAL_RIB, 'i') or -1 + local nOrigRib2 = EgtGetInfo( EgtGetNext( nCurrId), KEY_ORIGINAL_RIB, 'i') or -1 + if nOrigRib ~= nOrigRib1 or nOrigRib ~= nOrigRib2 then + table.insert( vCheckIds, nCurrId) + end + else + local nCurrOrigRib = EgtGetInfo( nCurrId, KEY_ORIGINAL_RIB, 'i') + if nOrigRib ~= nCurrOrigRib then + table.insert( vCheckIds, nCurrId) + end + end end end nCurrId = EgtGetNext( nCurrId) end + -- tra gli id da controllare devo aggiungere anche altri setti non ancora presenti nel toolpath ( tipologie di setti realizzate in seguito) local nCrvGrp = EgtGetParent( EgtGetParent( nRibId)) local nRibsPathGrp = EgtGetFirstNameInGroup( nCrvGrp, RIBS_GRP) @@ -1568,26 +1563,29 @@ local function VerifyRibsLead( nId, nRibId, bInVsOut, nGrpTmp) end -- 3) verifiche con eventuale lead in - if nCurrLI then - local nLeadInLoc = EgtCopyGlob( nCurrLI, nGrpTmp) - -- verifico se intersezione fra curve - local _, nPnt, nCrv = EgtCurveCurveInters( nLeadLoc, nLeadInLoc, nGrpTmp) - if nPnt ~= 0 or nCrv ~= 0 then - return false - end - local dLeadInLen = EgtCurveLength( nLeadInLoc) - 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 - return false - else - local dLen = EgtCurveLength( nRes) - if dLen < dStrand / 2 + GEO.EPS_SMALL then + if not bInVsOut then + local nCurrLI = EgtGetPrev( nRibId) + if nCurrLI and EgtGetName( nCurrLI) == LEAD_IN_CRV then + local nLeadInLoc = EgtCopyGlob( nCurrLI, nGrpTmp) + -- verifico se intersezione fra curve + local _, nPnt, nCrv = EgtCurveCurveInters( nLeadLoc, nLeadInLoc, nGrpTmp) + if nPnt ~= 0 or nCrv ~= 0 then + return false + end + local dLeadInLen = EgtCurveLength( nLeadInLoc) + 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 return false + else + local dLen = EgtCurveLength( nRes) + if dLen < dStrand / 2 + GEO.EPS_SMALL then + return false + end end end end diff --git a/Version.lua b/Version.lua index a9268a2..fd6ede3 100644 --- a/Version.lua +++ b/Version.lua @@ -1,4 +1,4 @@ -- Version.lua by Egaltech s.r.l. 2024/05/06 -- Gestione della versione di 3dPrinting -VERSION = '2.7f1' \ No newline at end of file +VERSION = '2.7h1' \ No newline at end of file