3dPrinting 2.5c2 :

- aggiunto taglio dei ribs unbounded con solido se richiesto.
This commit is contained in:
SaraP
2023-03-06 14:54:19 +01:00
parent 25fb2b6b37
commit 862216b84f
3 changed files with 118 additions and 81 deletions
+82 -75
View File
@@ -42,7 +42,7 @@ local function GetLayerParamsForToolPathCalc()
LayerParams.dWipeDir = EgtGetInfo( s_nPartId, KEY_WIPE_DIR, 'd') or 0.0
LayerParams.vtSlicing = EgtGetInfo( s_nPartId, KEY_SLICING_DIR, 'v')
LayerParams.dTDiam = EgtGetInfo( s_nPartId, KEY_TOOL_DIAM, 'd')
return LayerParams
end
@@ -866,7 +866,7 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing, nGrpTmp)
local bLIInvert = EgtGetInfo( nCrv, KEY_RIBS_LEAD_IN_INVERT, 'b')
if dLILen < GEO.EPS_SMALL then return end
-- recupero la curva di offset su cui calcolare leadin
local ptS = EgtSP( nCrv)
local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp)
@@ -889,7 +889,7 @@ local function AddRibsLeadIn( nCrv, nLoopsGrp, dStrand, vtSlicing, nGrpTmp)
end
--------------------------------------------------------------------
local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, nGrpTmp)
local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, nGrpTmp, bForceNoBorder)
local dRibsLOLen = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_LEN, 'd')
local dRibsLOCoasting = EgtGetInfo( nCrv, KEY_RIBS_LEAD_OUT_COASTING, 'd')
@@ -905,82 +905,84 @@ local function AddRibsLeadOut( nCrv, nTPathGrp, nLoopsGrp, vtSlicing, dStrand, n
local vtE = EgtEV( nCrv, GDB_ID.ROOT)
-- recupero la curva di offset su cui calcolare lead out
local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp)
while nCrvOffs do
local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE, GEO.EPS_SMALL, GDB_RT.GLOB)
if dParE then
local nCrvLO
local nCoasting
local nWipe
-- trovo curva opportuna per lead out
local nCrvRef, bInvert = FindCorrectRibsLead( dParE, nCrv, nCrvOffs, bRibsLOInvert, dRibsLOLen + dRibsLOCoasting, dStrand, false, nGrpTmp)
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)
EgtModifyCurveExtrusion( nCrvLO, vtSlicing, GDB_RT.GLOB)
EgtSetInfo( nCrvLO, KEY_TYPE, TYPE.RIB)
EgtSetName( nCrvLO, LEAD_OUT_CRV)
-- aggiorno ptE e vtE
ptE = EgtEP( nCrvLO, GDB_ID.ROOT)
vtE = EgtEV( nCrvLO, GDB_ID.ROOT)
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)
EgtModifyCurveExtrusion( nCoasting, vtSlicing, GDB_RT.GLOB)
EgtSetName( nCoasting, COASTING_CRV)
EgtSetInfo( nCoasting, KEY_TYPE, TYPE.COASTING)
EgtSetColor( nCoasting, EgtStdColor('ORANGE'))
-- aggiorno ptE e vtE
ptE = EgtEP( nCoasting, GDB_ID.ROOT)
vtE = EgtEV( nCoasting, GDB_ID.ROOT)
end
EgtErase( nCrvRef)
if not bForceNoBorder then
local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp)
while nCrvOffs do
local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE, GEO.EPS_SMALL, GDB_RT.GLOB)
if dParE then
-- terzo tratto ( diretto verso esterno con ugello chiuso)
if dRibsLOWipe > GEO.EPS_SMALL then
local dAng = dRibsLOWipeAng + s_nDefaultWipeAng
local nType = EgtGetInfo( nCrv, KEY_RIBS_TYPE, 'i')
if nType == RIB_TYPE.EXTERNAL then dAng = - dAng end
vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng))
local ptFinal = ptE + vtE * dRibsLOWipe
-- verifico soddisfi altezza minima per dimensioni utensile
local k = 1
while ptFinal:getZ() < s_dHMin + GEO.EPS_SMALL and k < 36 do
vtE:rotate( vtSlicing, EgtIf( bInvert, - 10, 10))
ptFinal = ptE + vtE * dRibsLOWipe
k = k + 1
local nCrvLO
local nCoasting
local nWipe
-- trovo curva opportuna per lead out
local nCrvRef, bInvert = FindCorrectRibsLead( dParE, nCrv, nCrvOffs, bRibsLOInvert, dRibsLOLen + dRibsLOCoasting, dStrand, false, nGrpTmp)
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)
EgtModifyCurveExtrusion( nCrvLO, vtSlicing, GDB_RT.GLOB)
EgtSetInfo( nCrvLO, KEY_TYPE, TYPE.RIB)
EgtSetName( nCrvLO, LEAD_OUT_CRV)
-- aggiorno ptE e vtE
ptE = EgtEP( nCrvLO, GDB_ID.ROOT)
vtE = EgtEV( nCrvLO, GDB_ID.ROOT)
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)
EgtModifyCurveExtrusion( nCoasting, vtSlicing, GDB_RT.GLOB)
EgtSetName( nCoasting, COASTING_CRV)
EgtSetInfo( nCoasting, KEY_TYPE, TYPE.COASTING)
EgtSetColor( nCoasting, EgtStdColor('ORANGE'))
-- aggiorno ptE e vtE
ptE = EgtEP( nCoasting, GDB_ID.ROOT)
vtE = EgtEV( nCoasting, GDB_ID.ROOT)
end
EgtErase( nCrvRef)
nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal}, GDB_RT.GLOB)
EgtModifyCurveExtrusion( nWipe, vtSlicing, GDB_RT.GLOB)
EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER)
EgtSetName( nWipe, WIPE_CRV)
EgtSetInfo( nWipe, KEY_TYPE, TYPE.WIPE)
EgtSetColor( nWipe, EgtStdColor('AQUA'))
-- terzo tratto ( diretto verso esterno con ugello chiuso)
if dRibsLOWipe > GEO.EPS_SMALL then
local dAng = dRibsLOWipeAng + s_nDefaultWipeAng
local nType = EgtGetInfo( nCrv, KEY_RIBS_TYPE, 'i')
if nType == RIB_TYPE.EXTERNAL then dAng = - dAng end
vtE:rotate( vtSlicing, EgtIf( bInvert, - dAng, dAng))
local ptFinal = ptE + vtE * dRibsLOWipe
-- verifico soddisfi altezza minima per dimensioni utensile
local k = 1
while ptFinal:getZ() < s_dHMin + GEO.EPS_SMALL and k < 36 do
vtE:rotate( vtSlicing, EgtIf( bInvert, - 10, 10))
ptFinal = ptE + vtE * dRibsLOWipe
k = k + 1
end
nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal}, GDB_RT.GLOB)
EgtModifyCurveExtrusion( nWipe, vtSlicing, GDB_RT.GLOB)
EgtRelocateGlob( nWipe, nCoasting or nCrvLO or nCrv, GDB_IN.AFTER)
EgtSetName( nWipe, WIPE_CRV)
EgtSetInfo( nWipe, KEY_TYPE, TYPE.WIPE)
EgtSetColor( nWipe, EgtStdColor('AQUA'))
end
else
-- aggiungo coasting e wipe come sulle shell normali
AddRetraction( nCrv, vtSlicing, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng)
end
else
-- aggiungo coasting e wipe come sulle shell normali
AddRetraction( nCrv, vtSlicing, dRibsLOCoasting, dRibsLOWipe, dRibsLOWipeAng)
return
end
return
nCrvOffs = EgtGetNext( nCrvOffs)
end
nCrvOffs = EgtGetNext( nCrvOffs)
end
-- se non ho trovato curva sul bordo su cui fare il lead out aggiungo coasting e wipe come sulle shell normali
@@ -1070,17 +1072,22 @@ local function CalcRibsToolPath( vEntIds, nRibsGrp, nTpathGrpId, LayerParams)
end
-- leadin/leadout
local bForceNoBorder = false
local nType = EgtGetInfo( vEntIds[1], KEY_RIBS_TYPE, 'i')
if nType == RIB_TYPE.UNBOUNDED then
bForceNoBorder = true
end
local nCrvRib = nNewFirstEnt
while nCrvRib do
-- verifico se necessario lead in
local nPrev = EgtGetPrev( nCrvRib)
if not nPrev or EgtGetName( nPrev) ~= LINK_CRV then
if ( not nPrev or EgtGetName( nPrev) ~= LINK_CRV) and not bForceNoBorder then
AddRibsLeadIn( nCrvRib, nLoopGrp, LayerParams.dStrand, LayerParams.vtSlicing, nGrpTmp)
end
-- verifico se necessario lead out
local nNext = EgtGetNext( nCrvRib)
if not nNext or EgtGetName( nNext) ~= LINK_CRV then
AddRibsLeadOut( nCrvRib, nTpathGrpId, nLoopGrp, LayerParams.vtSlicing, LayerParams.dStrand, nGrpTmp)
AddRibsLeadOut( nCrvRib, nTpathGrpId, nLoopGrp, LayerParams.vtSlicing, LayerParams.dStrand, nGrpTmp, bForceNoBorder)
end
nCrvRib = EgtGetNextName( nCrvRib, RIBS_CRV .. '*')
end