3dPrinting :

- migliorie nei setti ( ingressi, uscite e gestione intersezioni).
This commit is contained in:
SaraP
2022-09-12 15:37:38 +02:00
parent 03ed942b2f
commit 858ebf2db6
4 changed files with 293 additions and 225 deletions
+215 -122
View File
@@ -298,31 +298,17 @@ local function VerifyRibsLink( nLinkId, nCurr, nNext, dStrand)
return false
end
-- regione occupata dal link
local nTotLink = EgtCopyGlob( nLinkId, nGrp)
local nCopy = EgtCopyGlob( nLinkId, nGrp)
EgtInvertCurve( nCopy)
EgtAddCurveCompoCurve( nTotLink, nCopy)
local nOffs = EgtOffsetCurveAdv( nTotLink, dStrand * 0.5)
if not nOffs or nOffs == GDB_ID.NULL then
nOffs = nTotLink
end
-- verifico se il link interseca una delle altre costolature
local vRibsIds = EgtGetNameInGroup( nGrp, RIBS_CRV .. '*')
for i = 1, #vRibsIds do
if vRibsIds[i] ~= nCurr and vRibsIds[i] ~= nNext then
local ptInt = EgtIP( nOffs, vRibsIds[i], ORIG())
local ptInt2 = EgtIP( nLinkId, vRibsIds[i], ORIG())
if ptInt or ptInt2 then
EgtErase( nOffs)
EgtErase( nTotLink)
local ptInt = EgtIP( nLinkId, vRibsIds[i], ORIG())
if ptInt then
return false
end
end
end
EgtErase( nOffs)
EgtErase( nTotLink)
return true
end
@@ -407,7 +393,174 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink)
end
--------------------------------------------------------------------
local function AddRibsLeadIn( nCrv, nLoopsGrp)
local function VerifyRibsLead( nId, nRibId, dStrand, bInVsOut)
local nGrp = EgtGetParent( nRibId)
local nLeadId = EgtCopyGlob( nId, nGrp)
if bInVsOut then
EgtExtendCurveStartByLen( nLeadId, dStrand * 0.5)
else
EgtExtendCurveEndByLen( nLeadId, dStrand * 0.5)
end
-- verifico che intersechi solo l'estrmo corretto
local pt = EgtIf( bInVsOut, EgtEP( nRibId), EgtSP( nRibId))
local dPar = EgtCurveParamAtPoint( nLeadId, pt)
if dPar then
EgtErase( nLeadId)
return false
end
local pt1 = EgtIf( bInVsOut, EgtSP( nLeadId), EgtEP( nLeadId))
local pt2 = EgtIf( bInVsOut, EgtEP( nRibId), EgtSP( nRibId))
if dist( pt1, pt2) < dStrand + GEO.EPS_SMALL then
EgtErase( nLeadId)
return false
end
local _, dParE = EgtCurveDomain( nLeadId)
local vtDir = EgtMV( nRibId)
local dParCrv = 1
local dTol = 10 * GEO.EPS_SMALL
for dParCrv = 1, dParE do
local vtS = EgtUV( nLeadId, dParCrv - 1, 1)
local vtE = EgtUV( nLeadId, dParCrv, -1)
-- se tratto lineare allineato con la direzione del setto verifico sia sufficientemente lontano
if AreSameVectorApprox( vtS, vtE) and ( (vtS - vtDir):sqlen() < dTol * dTol or (vtS + vtDir):sqlen() < dTol * dTol) then
local dDist = EgtPointCurveDist( EgtUP( nLeadId, dParCrv - 0.5), nRibId)
if dDist < dStrand + GEO.EPS_SMALL then
EgtErase( nLeadId)
return false
end
end
end
-- verifico non intersechi altri setti
local vRibsIds = EgtGetNameInGroup( EgtGetParent( nRibId), RIBS_CRV .. '*')
for i = 1, #vRibsIds do
if vRibsIds[i] ~= nRibId then
local ptInt = EgtIP( nLeadId, vRibsIds[i], ORIG())
if ptInt then
EgtErase( nLeadId)
return false
end
end
end
-- se lead out verifico non si sovrapponga al lead in
if not bInVsOut then
-- recupero il lead in
local nPrev = EgtGetPrev( nRibId)
if nPrev and EgtGetName( nPrev) == LEAD_IN_CRV then
local nSrfTot = EgtSurfFrFatCurve( EgtGetParent( nLeadId), nPrev, 0.5 * dStrand, false)
if nSrfTot then
local nRes = EgtCurveWithRegionClassify( nLeadId, nSrfTot)
if nRes == GDB_CRC.IN or nRes == GDB_CRC.INTERS then
EgtErase( nSrfTot)
EgtErase( nLeadId)
return false
end
else
nSrfTot = EgtSurfFrFatCurve( EgtGetParent( nLeadId), nLeadId, 0.5 * dStrand, false)
if nSrfTot then
local nRes = EgtCurveWithRegionClassify( nPrev, nSrfTot)
if nRes == GDB_CRC.IN or nRes == GDB_CRC.INTERS then
EgtErase( nSrfTot)
EgtErase( nLeadId)
return false
end
end
end
EgtErase( nSrfTot)
end
end
EgtErase( nLeadId)
return true
end
-------------------------------------------------------------------
local function FindCorrectRibsLead( dPar, nCrv, nCrvOffs, bLeadInvert, dLeadLen, dStrand, bInVsOut)
local nLeadId
local bInvert = bLeadInvert -- valore di default è quello settato nel file dei parametri
local _, dParEnd = EgtCurveDomain( nCrvOffs)
local bClosed = EgtCurveIsClosed( nCrvOffs)
local bOnlyOneCurve = not bClosed and ( dPar < GEO.EPS_SMALL or abs( dPar - dParEnd) < GEO.EPS_SMALL)
local nMainCrv = nCrvOffs -- curva preferita da utilizzare per lead in
local nOtherCrv -- altra possibile curva da ultizzare nel caso nMainCrv non sia adatta
if bClosed then
EgtChangeClosedCurveStart( nCrvOffs, dPar)
nOtherCrv = nCrvOffs
elseif not bOnlyOneCurve then
nOtherCrv = EgtSplitCurveAtParam( nCrvOffs, dPar)
end
-- calcolo del parametro bInvert
if bOnlyOneCurve then
-- invert dipende dall'estremo da cui parte il setto
bInvert = abs( dPar - dParEnd) < GEO.EPS_SMALL
elseif not bClosed then
-- invert può essere legato anche alla lunghezza dei tratti possibili
local dLen1 = EgtCurveLength( nMainCrv)
local dLen2 = EgtCurveLength( nOtherCrv)
if dLen1 > dLeadLen - GEO.EPS_SMALL and dLen2 < dLeadLen - GEO.EPS_SMALL then
bInvert = true
elseif dLen1 < dLeadLen - GEO.EPS_SMALL and dLen2 > dLeadLen - GEO.EPS_SMALL then
bInvert = false
end
if not bInvert then
nMainCrv, nOtherCrv = nOtherCrv, nMainCrv
end
end
-- primo tentativo con la curva favorita
nLeadId = EgtCopyGlob( nMainCrv, nCrv, EgtIf( bInVsOut, GDB_IN.BEFORE, GDB_IN.AFTER))
if bInvert then EgtInvertCurve( nLeadId) end
EgtTrimCurveEndAtLen( nLeadId, dLeadLen)
if bInVsOut then EgtInvertCurve( nLeadId) end
if VerifyRibsLead( nLeadId, nCrv, dStrand, bInVsOut) then
-- se valido aggiorno le curve per prossimi lead in/out
if bInvert then
EgtTrimCurveEndAtLen( nMainCrv, EgtCurveLength( nCrvOffs) - dLeadLen)
else
EgtTrimCurveStartAtLen( nMainCrv, dLeadLen)
end
elseif not nOtherCrv then
-- se non è valido e non ho altre curve possibili cancello
EgtErase( nLeadId)
return nil
else
-- se non è valido ma ho altra curva possibile, tento con quella
EgtErase( nLeadId)
nLeadId = EgtCopyGlob( nOtherCrv, nCrv, EgtIf( bInVsOut, GDB_IN.BEFORE, GDB_IN.AFTER))
if not bInvert then EgtInvertCurve( nLeadId) end
EgtTrimCurveEndAtLen( nLeadId, dLeadLen)
if bInVsOut then EgtInvertCurve( nLeadId) end
if VerifyRibsLead( nLeadId, nCrv, dStrand, bInVsOut) then
if bInvert then
EgtTrimCurveStartAtLen( nOtherCrv, dLeadLen)
else
EgtTrimCurveEndAtLen( nOtherCrv, EgtCurveLength( nCrvOffs) - dLeadLen)
end
else
EgtErase( nLeadId)
bInvert = not bInvert
return nil
end
-- aggiorno parametro bInvert
bInvert = not bInvert
end
return nLeadId, bInvert
end
--------------------------------------------------------------------
local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand)
local dLILen = EgtGetInfo( nCrv, KEY_RIBS_LEAD_IN_LEN, 'd')
local bLIInvert = EgtGetInfo( nCrv, KEY_RIBS_LEAD_IN_INVERT, 'b')
@@ -420,44 +573,13 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp)
while nCrvOffs do
local dParS = EgtCurveParamAtPoint( nCrvOffs, ptS)
if dParS then
local nCrvId = EgtCopyGlob( nCrvOffs, nCrv, GDB_IN.BEFORE)
local bClosed = EgtCurveIsClosed( nCrvId)
if bClosed then
EgtChangeClosedCurveStart( nCrvId, dParS)
dParS = 0
end
-- scelgo il lato da cui fare ingresso
local _, dEndPar = EgtCurveDomain( nCrvId)
-- se ho solo un tratto possibile verifico se va invertito
if abs( dParS - dEndPar) < GEO.EPS_SMALL then
EgtInvertCurve( nCrvId)
elseif abs( dParS) > GEO.EPS_SMALL or bClosed then
-- se ho più tratti possibili scelgo in base al parametro RibsLIInvert o alle dimensioni
local nNewId = EgtSplitCurveAtParam( nCrvId, dParS) or EgtCopyGlob( nCrvId, nCrv, GDB_IN.BEFORE)
local dLen1 = EgtCurveLength( nCrvId)
local dLen2 = EgtCurveLength( nNewId)
local bKeepFirst = bLIInvert
if dLen1 > dLILen - GEO.EPS_SMALL and dLen2 < dLILen - GEO.EPS_SMALL then
bKeepFirst = true
elseif dLen1 < dLILen - GEO.EPS_SMALL and dLen2 > dLILen - GEO.EPS_SMALL then
bKeepFirst = false
end
if bKeepFirst then
EgtInvertCurve( nCrvId)
EgtErase( nNewId)
else
EgtErase( nCrvId)
nCrvId = nNewId
end
end
EgtTrimCurveEndAtLen( nCrvId, dLILen)
EgtInvertCurve( nCrvId)
EgtSetInfo( nCrvId, KEY_TYPE, TYPE.RIB)
EgtSetName( nCrvId, LEAD_IN_CRV)
local nLeadIn = FindCorrectRibsLead( dParS, nCrv, nCrvOffs, bLIInvert, dLILen, dStrand, true)
-- se lead in possibile
if nLeadIn then
EgtSetInfo( nLeadIn, KEY_TYPE, TYPE.RIB)
EgtSetName( nLeadIn, LEAD_IN_CRV)
end
return
end
@@ -466,7 +588,7 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp)
end
--------------------------------------------------------------------
local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing)
local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand)
local dRibsLOLen = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_LEN, 'd')
local dRibsLOCoasting = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_COASTING, 'd')
@@ -479,6 +601,8 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing)
abs( dRibsLOWipe) < GEO.EPS_SMALL then return end
local ptE = EgtEP( nCrv)
local vtE = EgtEV( nCrv)
-- recupero la curva di offset su cui calcolare lead out
local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp)
while nCrvOffs do
@@ -488,73 +612,42 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing)
local nCrvLO
local nCoasting
local nWipe
local bInvert = false
local nCrvRef = EgtCopyGlob( nCrvOffs, nCrv, GDB_IN.AFTER)
local bClosed = EgtCurveIsClosed( nCrvRef)
if bClosed then
EgtChangeClosedCurveStart( nCrvRef, dParE)
dParE = 0
end
-- scelgo il lato da cui fare uscita
local _, dEndPar = EgtCurveDomain( nCrvRef)
-- se ho solo un tratto possibile verifico se va invertito
if abs( dParE - dEndPar) < GEO.EPS_SMALL then
EgtInvertCurve( nCrvRef)
bInvert = true
elseif abs( dParE) > GEO.EPS_SMALL or bClosed then
-- se ho più tratti possibili scelgo in base al parametro RibsLOInvert o alle dimensioni
local nNewId = EgtSplitCurveAtParam( nCrvRef, dParE) or EgtCopyGlob( nCrvRef, nCrv, GDB_IN.AFTER)
local dLen1 = EgtCurveLength( nCrvRef)
local dLen2 = EgtCurveLength( nNewId)
bInvert = bRibsLOInvert
if dLen1 > dRibsLOLen + dRibsLOCoasting - GEO.EPS_SMALL and dLen2 < dRibsLOLen + dRibsLOCoasting - GEO.EPS_SMALL then
bInvert = true
elseif dLen1 < dRibsLOLen + dRibsLOCoasting - GEO.EPS_SMALL and dLen2 > dRibsLOLen + dRibsLOCoasting - GEO.EPS_SMALL then
bInvert = false
end
if bInvert then
EgtInvertCurve( nCrvRef)
EgtErase( nNewId)
else
EgtErase( nCrvRef)
nCrvRef = nNewId
end
end
-- verifico se la curva ha lunghezza sufficiente
local dLen = EgtCurveLength( nCrvRef)
local bSkip = ( dLen - dRibsLOLen - dRibsLOCoasting < - GEO.EPS_SMALL)
local vtE = EgtEV( nCrv)
-- trovo curva opportuna per lead out
local nCrvRef, bInvert = FindCorrectRibsLead( dParE, nCrv, nCrvOffs, bRibsLOInvert, dRibsLOLen + dRibsLOCoasting, dStrand, false)
-- 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)
EgtSetInfo( nCrvLO, KEY_TYPE, TYPE.RIB)
EgtSetName( nCrvLO, LEAD_OUT_CRV)
-- aggiorno ptE e vtE
ptE = EgtEP( nCrvLO)
vtE = EgtEV( nCrvLO)
end
-- secondo tratto ( segue offset con flusso chiuso)
if dRibsLOCoasting > GEO.EPS_SMALL and not bSkip then
nCoasting = EgtCopyGlob( nCrvRef, nCrvLO or nCrv, GDB_IN.AFTER)
EgtTrimCurveStartAtLen( nCoasting, dRibsLOLen)
EgtTrimCurveEndAtLen( nCoasting, dRibsLOCoasting)
EgtSetName( nCoasting, COASTING_CRV)
EgtSetInfo( nCoasting, KEY_TYPE, TYPE.COASTING)
EgtSetColor( nCoasting, EgtStdColor('ORANGE'))
-- aggiorno ptE e vtE
ptE = EgtEP( nCoasting)
vtE = EgtEV( nCoasting)
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)
EgtSetInfo( nCrvLO, KEY_TYPE, TYPE.RIB)
EgtSetName( nCrvLO, LEAD_OUT_CRV)
-- aggiorno ptE e vtE
ptE = EgtEP( nCrvLO)
vtE = EgtEV( nCrvLO)
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)
EgtSetName( nCoasting, COASTING_CRV)
EgtSetInfo( nCoasting, KEY_TYPE, TYPE.COASTING)
EgtSetColor( nCoasting, EgtStdColor('ORANGE'))
-- aggiorno ptE e vtE
ptE = EgtEP( nCoasting)
vtE = EgtEV( nCoasting)
end
EgtErase( nCrvRef)
end
EgtErase( nCrvRef)
-- terzo tratto ( diretto verso esterno con ugello chiuso)
if dRibsLOWipe > GEO.EPS_SMALL then
@@ -566,7 +659,7 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing)
EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER)
EgtSetName( nWipe, WIPE_CRV)
EgtSetInfo( nWipe, KEY_TYPE, TYPE.WIPE)
EgtSetColor( nWipe, EgtStdColor('TEAL'))
EgtSetColor( nWipe, EgtStdColor('TEAL'))
end
return
@@ -697,12 +790,12 @@ local function CalcRibsToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ)
-- verifico se necessario lead in
local nPrev = EgtGetPrev( nCrvRib)
if not nPrev or EgtGetName( nPrev) then
AddRibsLeadIn( nCrvRib, nLoopGrp)
AddRibsLeadIn( nCrvRib, nLoopGrp, LayerParams.dStrand)
end
-- verifico se necessario lead out
local nNext = EgtGetNext( nCrvRib)
if not nNext or EgtGetName( nNext) then
AddRibsLeadOut( nCrvRib, nTpathGrpId, nLoopGrp, LayerParams.vtSlicing)
AddRibsLeadOut( nCrvRib, nTpathGrpId, nLoopGrp, LayerParams.vtSlicing, LayerParams.dStrand)
end
nCrvRib = EgtGetNextName( nCrvRib, RIBS_CRV .. '*')
end