3dPrinting :
- migliorie nei setti ( ingressi, uscite e gestione intersezioni).
This commit is contained in:
+215
-122
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user