Files
3dprinting/LuaLibs/CalcToolPath.lua
T
SaraP 9aecef3add 3dPrinting :
- correzione nel collegamento dei setti che non arrivano sul bordo.
2022-07-01 17:06:55 +02:00

644 lines
26 KiB
Lua

-- CalcToolPath.lua by Egaltech s.r.l. 2022/04/19
-- Calcolo percorsi di lavoro per Stampa 3d
-- Tabella per definizione modulo
local CalcToolPath = {}
-- Intestazioni
require( 'EgtBase')
EgtOutLog( ' CalcToolPath started', 1)
-- Dati
local AMD = require( 'AddManData')
---------------------------------------------------------------------
local s_nPartId
---------------------------------------------------------------------
local function GetLayerParamsForToolPathCalc()
local LayerParams = {}
LayerParams.dStrand = EgtGetInfo( s_nPartId, KEY_STRAND, 'd')
LayerParams.dLayHeight = EgtGetInfo( s_nPartId, KEY_SLICE_STEP, 'd')
LayerParams.dOffs = EgtGetInfo( s_nPartId, KEY_OFFSET_SLICE, 'd')
LayerParams.bInvert = ( EgtGetInfo( s_nPartId, KEY_PRINT_DIRECTION, 'i') == PRINT_DIRECTION.CW)
LayerParams.nOrder = EgtGetInfo( s_nPartId, KEY_PRINT_ORDER, 'i')
LayerParams.nLinkType = EgtGetInfo( s_nPartId, KEY_LINK_TYPE, 'i')
LayerParams.dLinkParam = EgtGetInfo( s_nPartId, KEY_LINK_PARAM, 'd')
LayerParams.nLeadInType = EgtGetInfo( s_nPartId, KEY_LEAD_IN_TYPE, 'i')
LayerParams.dLeadInTangDist = EgtGetInfo( s_nPartId, KEY_LEAD_IN_TANG_DIST, 'd')
LayerParams.dLeadInOrthoDist = EgtGetInfo( s_nPartId, KEY_LEAD_IN_ORTHO_DIST, 'd')
LayerParams.nLeadOutType = EgtGetInfo( s_nPartId, KEY_LEAD_OUT_TYPE, 'i')
LayerParams.dLeadOutTangDist = EgtGetInfo( s_nPartId, KEY_LEAD_OUT_TANG_DIST, 'd')
LayerParams.dLeadOutOrthoDist = EgtGetInfo( s_nPartId, KEY_LEAD_OUT_ORTHO_DIST, 'd')
LayerParams.dOffsetLP = EgtGetInfo( s_nPartId, KEY_OFFSET_LEAD_POINT, 'd')
LayerParams.dSPOffs = EgtGetInfo( s_nPartId, KEY_SP_OFFSET_ON_SLICE, 'd')
LayerParams.dCoastingLen = EgtGetInfo( s_nPartId, KEY_COASTING_LEN, 'd')
LayerParams.dWipeLen = EgtGetInfo( s_nPartId, KEY_WIPE_LEN, 'd')
LayerParams.vtSlicing = EgtGetInfo( s_nPartId, KEY_SLICING_DIR, 'v')
LayerParams.dTDiam = EgtGetInfo( s_nPartId, KEY_TOOL_DIAM, 'd')
-- Parametri setti
LayerParams.nSettiShellsNbr = EgtGetInfo( s_nPartId, KEY_SETTI_SHELLS_NBR, 'i')
LayerParams.bSettiLink = EgtGetInfo( s_nPartId, KEY_SETTI_LINK, 'b')
LayerParams.bSettiInvert = EgtGetInfo( s_nPartId, KEY_SETTI_INVERT_DIR, 'b')
LayerParams.bSettiLIInvert = EgtGetInfo( s_nPartId, KEY_SETTI_LEAD_IN_INVERT, 'b')
LayerParams.dSettiLILen = EgtGetInfo( s_nPartId, KEY_SETTI_LEAD_IN_LEN, 'd')
LayerParams.bSettiLOInvert = EgtGetInfo( s_nPartId, KEY_SETTI_LEAD_OUT_INVERT, 'b')
LayerParams.dSettiLOLen = EgtGetInfo( s_nPartId, KEY_SETTI_LEAD_OUT_LEN, 'd')
LayerParams.dSettiLOWipeTang = EgtGetInfo( s_nPartId, KEY_SETTI_LEAD_OUT_WIPE1, 'd')
LayerParams.dSettiLOWipe = EgtGetInfo( s_nPartId, KEY_SETTI_LEAD_OUT_WIPE2, 'd')
LayerParams.dSettiLOWipeAng = EgtGetInfo( s_nPartId, KEY_SETTI_LEAD_OUT_WIPE_DIR, 'd')
return LayerParams
end
--------------------------------------------------------------------
local function ComputeZCorrection( LayerParams)
local _, dAng, _ = SphericalFromVector( LayerParams.vtSlicing)
-- correzione per l'offset
local dCorr1 = LayerParams.dOffs * sin( dAng)
-- eventuale correzione per il diametro ugello
local dCorr2 = max( LayerParams.dTDiam * 0.5 * sin( dAng) - LayerParams.dLayHeight * cos( dAng) - LayerParams.dStrand * 0.5 * sin( dAng) + 10 * GEO.EPS_SMALL, 0.0)
return dCorr1 + dCorr2
end
--------------------------------------------------------------------
local function AddLeadIn( nCrvId, LayerParams, nGrpId)
local ptE = EgtSP( nCrvId)
local vtTang = EgtSV( nCrvId)
local vtOrtho = Vector3d( vtTang)
local dAng = 90
if ( LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.INF_INT_EXT) or
( not LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.EXT_INT_INF) then
dAng = - 90
end
vtOrtho:rotate( LayerParams.vtSlicing, dAng)
local ptS = ptE - LayerParams.dLeadInTangDist * vtTang + LayerParams.dLeadInOrthoDist * vtOrtho
local nLeadInCrv = GDB_ID.NULL
if LayerParams.nLeadInType == LEAD_TYPE.LINEAR then
nLeadInCrv = EgtCurveCompoFromPoints( nGrpId, {ptS, ptE})
elseif LayerParams.nLeadInType == LEAD_TYPE.ARC then
nLeadInCrv = EgtArc2PV( nGrpId, ptE, ptS, -vtTang)
EgtInvertCurve( nLeadInCrv)
end
EgtRelocate( nLeadInCrv, nGrpId, GDB_IN.FIRST_SON)
EgtModifyCurveExtrusion( nLeadInCrv, LayerParams.vtSlicing, GDB_RT.GLOB)
EgtSetInfo( nLeadInCrv, KEY_TYPE, TYPE.LINK)
EgtSetName( nLeadInCrv, LEAD_IN_CRV)
end
--------------------------------------------------------------------
local function AddLeadOut( nCrvId, LayerParams, nGrpId)
local ptS = EgtEP( nCrvId)
local vtTang = EgtEV( nCrvId)
local vtOrtho = Vector3d( vtTang)
local dAng = - 90
if ( LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.INF_INT_EXT) or
( not LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.EXT_INT_INF) then
dAng = 90
end
vtOrtho:rotate( LayerParams.vtSlicing, dAng)
local ptE = ptS + LayerParams.dLeadOutTangDist * vtTang + LayerParams.dLeadOutOrthoDist * vtOrtho
local nLeadOutCrv = GDB_ID.NULL
if LayerParams.nLeadOutType == LEAD_TYPE.LINEAR then
nLeadOutCrv = EgtCurveCompoFromPoints( nGrpId, {ptS, ptE})
elseif LayerParams.nLeadOutType == LEAD_TYPE.ARC then
nLeadOutCrv = EgtArc2PV( nGrpId, ptS, ptE, vtTang)
end
EgtRelocate( nLeadOutCrv, nGrpId, GDB_IN.LAST_SON)
EgtModifyCurveExtrusion( nLeadOutCrv, LayerParams.vtSlicing, GDB_RT.GLOB)
EgtSetInfo( nLeadOutCrv, KEY_TYPE, TYPE.LINK)
EgtSetName( nLeadOutCrv, LEAD_OUT_CRV)
end
--------------------------------------------------------------------
local function AddRetraction( nCrvId, dCoastingLen, dWipeLen)
local nCoastingId
if dCoastingLen > GEO.EPS_SMALL then
nCoastingId = EgtCopyGlob( nCrvId, nCrvId, GDB_IN.AFTER)
local dPar = EgtCurveParamAtLength( nCoastingId, EgtCurveLength( nCoastingId) - dCoastingLen)
if not dPar then
EgtErase( nCoastingId)
return
end
EgtTrimCurveStartAtParam( nCoastingId, dPar)
-- aggiorno la curva originale
if dPar > GEO.EPS_SMALL then
EgtTrimCurveEndAtParam( nCrvId, dPar)
else
EgtErase( nCrvId)
end
EgtSetName( nCoastingId, COASTING_CRV)
EgtSetInfo( nCoastingId, KEY_TYPE, TYPE.COASTING)
EgtSetColor( nCoastingId, EgtStdColor('ORANGE'))
end
if dWipeLen > GEO.EPS_SMALL then
local nWipeId = EgtCopyGlob( nCrvId, EgtIf( nCoastingId, nCoastingId, nCrvId), GDB_IN.AFTER)
EgtTrimCurveEndAtLen( nWipeId, dWipeLen)
EgtSetName( nWipeId, WIPE_CRV)
EgtSetInfo( nWipeId, KEY_TYPE, TYPE.WIPE)
EgtSetColor( nWipeId, EgtStdColor('TEAL'))
end
return nCoastingId
end
--------------------------------------------------------------------
local function AddRetractionOnLastCrv( nTpathGrpId, LayerParams)
local nCrvId = EgtGetLastNameInGroup( nTpathGrpId, SHELL_CRV .. "*")
if LayerParams.nLeadOutType == LEAD_TYPE.NONE then
AddRetraction( nCrvId, LayerParams.dCoastingLen, LayerParams.dWipeLen)
else
local nLeadOutId = EgtGetLastInGroup( nTpathGrpId)
local dLen = EgtCurveLength( nLeadOutId)
if dLen > LayerParams.dCoastingLen - 500 * GEO.EPS_SMALL then
-- coinvolge solo la curva di lead out
local dNewCoastingLen = EgtIf( abs( LayerParams.dCoastingLen - dLen) < 500 * GEO.EPS_SMALL, dLen, LayerParams.dCoastingLen) -- verifico se interamente coinvolta
AddRetraction( nLeadOutId, dNewCoastingLen, 0.0)
else
-- coinvolge parte dell'ultima shell crv
local dNewCoastingLen = LayerParams.dCoastingLen - dLen
local nCoastingId = AddRetraction( nCrvId, dNewCoastingLen, 0.0)
EgtAddCurveCompoCurve( nCoastingId, nLeadOutId)
end
end
end
--------------------------------------------------------------------
local function CalcSettiLink( ptS, ptE, nCurr, nLoopGrp, bForceLink)
local nCrvId = EgtGetFirstInGroup( nLoopGrp)
-- recupero la curva di offset su cui calcolare link
while nCrvId do
local dParS = EgtCurveParamAtPoint( nCrvId, ptS)
local dParE = EgtCurveParamAtPoint( nCrvId, ptE)
if dParS and dParE then
local bInvert = false
local bClosed = EgtCurveIsClosed( nCrvId)
if bClosed then
-- se la curva è chiusa verifico i due percorsi possibili dParS->dParE e dParE->dParS
local nCopyId1 = EgtCopyGlob( nCrvId, nCurr, GDB_IN.AFTER)
local nCopyId2 = EgtCopyGlob( nCrvId, nCurr, GDB_IN.AFTER)
EgtTrimCurveStartEndAtParam( nCopyId1, dParS, dParE)
EgtTrimCurveStartEndAtParam( nCopyId2, dParE, dParS)
EgtInvertCurve( nCopyId2)
local dLen1 = EgtCurveLength( nCopyId1)
local dLen2 = EgtCurveLength( nCopyId2)
if dLen1 > dLen2 then
bInvert = true
dParS, dParE = dParE, dParS
end
EgtErase( nCopyId1)
EgtErase( nCopyId2)
end
local nCopyId = EgtCopyGlob( nCrvId, nLoopGrp)
local nLinkId = EgtCopyGlob( nCrvId, nCurr, GDB_IN.AFTER)
if dParS > dParE and not bInvert then
bInvert = true
dParS, dParE = dParE, dParS
end
EgtTrimCurveStartEndAtParam( nLinkId, dParS, dParE)
EgtSetInfo( nLinkId, KEY_TYPE, TYPE.SETTO)
if bInvert then EgtInvertCurve( nLinkId) end
if bClosed then
EgtTrimCurveStartEndAtParam( nCrvId, dParE, dParS)
EgtErase( nCopyId)
else
EgtTrimCurveEndAtParam( nCrvId, dParS)
EgtTrimCurveStartAtParam( nCopyId, dParE)
end
return nLinkId
end
nCrvId = EgtGetNext( nCrvId)
end
-- se non ho trovato un collegamento sul bordo, creo una linea tra ptS e ptE
if bForceLink then
local nLinkId = EgtCurveCompoFromPoints( EgtGetParent( nCurr), {ptS, ptE})
EgtSetInfo( nLinkId, KEY_TYPE, TYPE.SETTO)
EgtRelocateGlob( nLinkId, nCurr, GDB_IN.AFTER)
end
end
--------------------------------------------------------------------
local function AddSettiLeadIn( nCrv, nLoopsGrp, LayerParams)
if LayerParams.dSettiLILen < GEO.EPS_SMALL then return end
-- recupero la curva di offset su cui calcolare leadin
local ptS = EgtSP( nCrv)
local nCrvOffs = EgtGetFirstInGroup( 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 SettiLIInvert
local nNewId = EgtSplitCurveAtParam( nCrvId, dParS) or EgtCopyGlob( nCrvId, nCrv, GDB_IN.BEFORE)
if LayerParams.bSettiLIInvert then
EgtInvertCurve( nCrvId)
EgtErase( nNewId)
else
EgtErase( nCrvId)
nCrvId = nNewId
end
end
EgtTrimCurveEndAtLen( nCrvId, LayerParams.dSettiLILen)
EgtInvertCurve( nCrvId)
EgtSetInfo( nCrvId, KEY_TYPE, TYPE.SETTO)
EgtSetName( nCrvId, LEAD_IN_CRV)
return
end
nCrvOffs = EgtGetNext( nCrvOffs)
end
end
--------------------------------------------------------------------
local function AddSettiLeadOut( nCrv, nTPathGrp, nLoopsGrp, LayerParams)
if abs( LayerParams.dSettiLOLen) < GEO.EPS_SMALL and
abs( LayerParams.dSettiLOWipeTang) < GEO.EPS_SMALL and
abs( LayerParams.dSettiLOWipe) < GEO.EPS_SMALL then return end
local ptE = EgtEP( nCrv)
-- recupero la curva di offset su cui calcolare lead out
local nCrvOffs = EgtGetFirstInGroup( nLoopsGrp)
while nCrvOffs do
local dParE = EgtCurveParamAtPoint( nCrvOffs, ptE)
if dParE then
local nCrvLO
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 SettiLOInvert
bInvert = LayerParams.bSettiLOInvert
local nNewId = EgtSplitCurveAtParam( nCrvRef, dParE) or EgtCopyGlob( nCrvRef, nCrv, GDB_IN.AFTER)
if bInvert then
EgtInvertCurve( nCrvRef)
EgtErase( nNewId)
else
EgtErase( nCrvRef)
nCrvRef = nNewId
end
end
local vtE = EgtSV( nCrvRef)
-- primo tratto ( segue offset con flusso aperto)
if LayerParams.dSettiLOLen > GEO.EPS_SMALL then
nCrvLO = EgtCopyGlob( nCrvRef, nCrv, GDB_IN.AFTER)
EgtTrimCurveEndAtLen( nCrvLO, LayerParams.dSettiLOLen)
EgtSetInfo( nCrvLO, KEY_TYPE, TYPE.SETTO)
EgtSetName( nCrvLO, LEAD_OUT_CRV)
-- aggiorno ptE e vtE
ptE = EgtEP( nCrvLO)
vtE = EgtEV( nCrvLO)
end
-- secondo tratto ( segue offset con flusso chiuso)
if LayerParams.dSettiLOWipeTang > GEO.EPS_SMALL then
nWipe = EgtCopyGlob( nCrvRef, nCrvLO or nCrv, GDB_IN.AFTER)
EgtTrimCurveStartAtLen( nWipe, LayerParams.dSettiLOLen)
EgtTrimCurveEndAtLen( nWipe, LayerParams.dSettiLOWipeTang)
-- aggiorno ptE e vtE
ptE = EgtEP( nWipe)
vtE = EgtEV( nWipe)
end
EgtErase( nCrvRef)
-- terzo tratto ( diretto verso esterno con ugello chiuso)
if LayerParams.dSettiLOWipe > GEO.EPS_SMALL then
local dAng = EgtIf( bInvert, 90, - 90) + LayerParams.dSettiLOWipeAng
vtE:rotate( LayerParams.vtSlicing, dAng)
local ptFinal = ptE + vtE * LayerParams.dSettiLOWipe
if nWipe then
-- unisco al secondo tratto così da averne uno solo per il wiping
EgtAddCurveCompoLine( nWipe, ptFinal)
else
nWipe = EgtCurveCompoFromPoints( nTPathGrp, { ptE, ptFinal})
EgtRelocateGlob( nWipe, nCrvLO or nCrv, GDB_IN.AFTER)
end
end
if nWipe then
EgtSetName( nWipe, WIPE_CRV)
EgtSetInfo( nWipe, KEY_TYPE, TYPE.WIPE)
EgtSetColor( nWipe, EgtStdColor('TEAL'))
end
return
end
nCrvOffs = EgtGetNext( nCrvOffs)
end
end
---------------------------------------------------------------------
local function CalcSettiToolPath( nCrvGrp, nTpathGrpId, LayerParams, dCorrZ)
local nSettiGrp = EgtGetFirstNameInGroup( nCrvGrp, SETTI_GRP)
-- aggiungo i setti nel toolpath
local vEntIds = EgtGetNameInGroup( nSettiGrp, SETTI_CRV .. '*')
for i = 1, #vEntIds do
-- copio entità nel gruppo toolpath
local nNewEntId = EgtCopyGlob( vEntIds[i], nTpathGrpId, GDB_IN.LAST_SON)
-- correggo posizione in Z ( per essere sicuri di appoggiare sul piano)
EgtMove( nNewEntId, dCorrZ * Z_AX(), GDB_RT.GLOB)
-- mi sposto dell'altezza layer
EgtMove( nNewEntId, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB)
EgtModifyCurveExtrusion( nNewEntId, LayerParams.vtSlicing, GDB_RT.GLOB)
EgtSetColor( nNewEntId, EgtStdColor('GRAY'))
end
-- estraggo i contorni della superficie di offset
local nLoopGrp = EgtGroup( nSettiGrp)
local nSrfId = EgtGetFirstNameInGroup( nSettiGrp, LAYER_SRF)
local nChunksNbr = EgtSurfFrChunkCount( nSrfId)
for i = 0, nChunksNbr do
local nRes, nCnt = EgtExtractSurfFrChunkLoops( nSrfId, i, nLoopGrp)
if nRes then
for j = nRes, nRes + nCnt - 1 do
EgtMove( j, dCorrZ * Z_AX(), GDB_RT.GLOB)
-- mi sposto dell'altezza layer
EgtMove( j, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB)
end
end
end
-- recupero i gruppi di setti
local tabSetti = {}
local nFirst = EgtGetFirstNameInGroup( nTpathGrpId, SETTI_CRV .. '*')
while nFirst do
local sName = EgtGetName( nFirst)
local vIds = EgtGetNameInGroup( nTpathGrpId, sName)
table.insert( tabSetti, vIds)
nFirst = EgtGetNextName( vIds[#vIds], SETTI_CRV .. '*')
end
-- orientamento delle curve
local bInvert = LayerParams.bSettiInvert
for i = 1, #tabSetti do
-- oriento tutte le passate relative ad uno stesso setto
for j = 1, #tabSetti[i] do
if ( bInvert and j % 2 == 1) or ( not bInvert and j % 2 == 0) then
EgtInvertCurve( tabSetti[i][j])
end
end
-- aggiorno bInvert per il gruppo di setti successivo
if LayerParams.bSettiLink and LayerParams.nSettiShellsNbr % 2 == 1 then
bInvert = not bInvert
end
end
-- Link
-- collego le passate di uno stesso setto
for i = 1, #tabSetti do
for j = 1, #tabSetti[i] - 1 do
local ptS = EgtEP( tabSetti[i][j])
local ptE = EgtSP( tabSetti[i][j + 1])
CalcSettiLink( ptS, ptE, tabSetti[i][j], nLoopGrp, true)
-- creo link fittizio per eliminare tratto corrispondente sulla curva di offset
local nFakeLink = CalcSettiLink( EgtSP( tabSetti[i][j]), EgtEP( tabSetti[i][j + 1]), tabSetti[i][j], nLoopGrp, false)
EgtErase( nFakeLink)
end
end
-- se necessario collego i diversi setti
if LayerParams.bSettiLink then
for i = 1, #tabSetti - 1 do
local nCnt = #tabSetti[i]
local ptS = EgtEP( tabSetti[i][nCnt])
local ptE = EgtSP( tabSetti[i + 1][1])
CalcSettiLink( ptS, ptE, tabSetti[i][nCnt], nLoopGrp, false)
end
end
-- leadin/leadout
local nCrvSetto = EgtGetFirstNameInGroup( nTpathGrpId, SETTI_CRV .. '*')
while nCrvSetto do
-- verifico se necessario lead in
local nPrev = EgtGetPrev( nCrvSetto)
if not nPrev or EgtGetName( nPrev) then
AddSettiLeadIn( nCrvSetto, nLoopGrp, LayerParams)
end
-- verifico se necessario lead out
local nNext = EgtGetNext( nCrvSetto)
if not nNext or EgtGetName( nNext) then
AddSettiLeadOut( nCrvSetto, nTpathGrpId, nLoopGrp, LayerParams)
end
nCrvSetto = EgtGetNextName( nCrvSetto, SETTI_CRV .. '*')
end
end
---------------------------------------------------------------------
function CalcToolPath.Exec( nPartId)
s_nPartId = nPartId
-- Verifico il pezzo
if not s_nPartId then
EgtOutBox( 'Error missing part', 'ToolPathCalc')
return
end
-- Recupero i layer da processare
local vLayIds = EgtGetNameInGroup( s_nPartId, SLICE_LAYER.."*")
if not vLayIds then
EgtOutBox( 'Error missing slices', 'ToolPathCalc')
return
end
-- recupero i parametri per calcolo dei toolpath
local LayerParams = GetLayerParamsForToolPathCalc()
local dCorrZ = ComputeZCorrection( LayerParams)
-- Ciclo sui layer
for nIdx = 1, #vLayIds do
-- scorro tutti i gruppi di contorni
local nCrvGrpId = EgtGetFirstNameInGroup( vLayIds[ nIdx], CONTOUR_GRP.."*")
while nCrvGrpId do
-- recupero il gruppo dei percorsi
local nPathGrpId = EgtGetFirstNameInGroup( nCrvGrpId, PATH_GRP)
if not nPathGrpId then
EgtOutBox( 'Error missing paths', 'ToolPathCalc')
return
else
EgtSetStatus( nPathGrpId, GDB_ST.OFF)
end
-- recupero il gruppo dei percorsi utensile
local nTpathGrpId = EgtGetFirstNameInGroup( nCrvGrpId, TOOLPATH_GRP)
if not nTpathGrpId then
nTpathGrpId = EgtGroup( nCrvGrpId)
EgtSetName( nTpathGrpId, TOOLPATH_GRP)
else
EgtEmptyGroup( nTpathGrpId)
end
-- creo il percorso di lavoro :
-- copio le curve, le ordino, le oriento e le muovo in Z
local nEntId = EgtGetFirstInGroup( nPathGrpId)
while nEntId do
local nNewEntId = EgtCopyGlob( nEntId, nTpathGrpId, EgtIf( LayerParams.nOrder == PRINT_ORDER.INF_INT_EXT, GDB_IN.FIRST_SON, GDB_IN.LAST_SON))
-- correggo posizione in Z ( per essere sicuri di appoggiare sul piano)
EgtMove( nNewEntId, dCorrZ * Z_AX(), GDB_RT.GLOB)
-- mi sposto dell'altezza layer
EgtMove( nNewEntId, LayerParams.dLayHeight * LayerParams.vtSlicing, GDB_RT.GLOB)
if LayerParams.bInvert then
EgtInvertCurve( nNewEntId)
end
EgtModifyCurveExtrusion( nNewEntId, LayerParams.vtSlicing, GDB_RT.GLOB)
EgtSetColor( nNewEntId, EgtStdColor('GRAY'))
nEntId = EgtGetNext( nEntId)
end
-- aggiungo gli opportuni raccordi
local nPrevId = EgtGetFirstInGroup( nTpathGrpId)
local nCurrId = EgtGetNext( nPrevId or GDB_ID.NULL)
k = 0
local nPrevShellNbr
if nPrevId then nPrevShellNbr = tonumber( EgtGetName( nPrevId):sub(6)) end
while nCurrId do
local nCurrShellNbr = tonumber( EgtGetName( nCurrId):sub(6))
if nCurrShellNbr ~= nPrevShellNbr then k = k + 1 end
-- se nessun raccordo modifico solo lo start point della curva
if LayerParams.nLinkType == LINK_TYPE.NONE then
local dLen = k * LayerParams.dSPOffs
if LayerParams.dSPOffs < 0 then
dLen = EgtCurveLength( nCurrId) + dLen
end
local dPar = EgtCurveParamAtLength( nCurrId, dLen)
if dPar then EgtChangeClosedCurveStart( nCurrId, dPar) end
else
-- altrimenti verifico se ha senso creare raccordo
if abs( dist( EgtEP( nPrevId), EgtSP( nCurrId))) < LayerParams.dStrand + 10 then
local nLinkId
if k > 1 then
-- modifico lo start point
local dLen = EgtCurveLength( nPrevId) - abs( LayerParams.dSPOffs)
EgtTrimCurveEndAtLen( nPrevId, dLen)
EgtChangeClosedCurveStartPoint( nCurrId, EgtEP( nPrevId))
end
-- aggiungo il raccordo
EgtTrimCurveEndAtLen( nPrevId, EgtCurveLength( nPrevId) - LayerParams.dLinkParam / 2)
EgtTrimCurveStartAtLen( nCurrId, LayerParams.dLinkParam / 2)
if LayerParams.nLinkType == LINK_TYPE.LINEAR then
nLinkId = EgtCurveCompoFromPoints( nTpathGrpId, {EgtEP( nPrevId), EgtSP( nCurrId)})
elseif LayerParams.nLinkType == LINK_TYPE.BIARC then
local frLoc = Frame3d( ORIG(), LayerParams.vtSlicing)
local nGrpTmp = EgtGroup( nTpathGrpId, frLoc)
local _, _, dAngIni = SphericalFromVector( EgtEV( nPrevId, nGrpTmp))
local _, _, dAngFin = SphericalFromVector( EgtSV( nCurrId, nGrpTmp))
nLinkId = EgtBiArc( nGrpTmp, EgtEP( nPrevId, nGrpTmp), EgtSP( nCurrId, nGrpTmp), dAngIni, dAngFin, 0.5)
EgtRelocateGlob( nLinkId, nTpathGrpId, GDB_IN.LAST_SON)
EgtErase( nGrpTmp)
end
if nLinkId then
EgtRelocate( nLinkId, nCurrId, GDB_IN.BEFORE)
EgtModifyCurveExtrusion( nLinkId, LayerParams.vtSlicing, GDB_RT.GLOB)
EgtSetInfo( nLinkId, KEY_TYPE, TYPE.LINK)
end
end
end
nPrevShellNbr = nCurrShellNbr
nPrevId = nCurrId
nCurrId = EgtGetNext( nCurrId)
end
-- aggiungo leadin/leadout
local nFirstCurve = EgtGetFirstInGroup( nTpathGrpId)
if nFirstCurve and LayerParams.nLeadInType ~= LEAD_TYPE.NONE then
EgtTrimCurveStartAtLen( nFirstCurve, LayerParams.dOffsetLP)
AddLeadIn( nFirstCurve, LayerParams, nTpathGrpId)
end
local nLastCurve = EgtGetLastInGroup( nTpathGrpId)
if nLastCurve and LayerParams.nLeadOutType ~= LEAD_TYPE.NONE then
EgtTrimCurveEndAtLen( nLastCurve, EgtCurveLength( nLastCurve) - LayerParams.dOffsetLP)
AddLeadOut( nLastCurve, LayerParams, nTpathGrpId)
end
-- aggiungo coasting/wipe
local nId = EgtGetFirstNameInGroup( nTpathGrpId, SHELL_CRV .. "*")
local nFirstId = nId
local nLastId = EgtGetLastNameInGroup( nTpathGrpId, SHELL_CRV .. "*")
while nId do
if nId == nLastId then
AddRetractionOnLastCrv( nTpathGrpId, LayerParams)
else
local nNextId = EgtGetNext( nId)
if EgtGetInfo( nNextId, KEY_TYPE, 'i') ~= TYPE.LINK then
-- aggiungo retrazione
if nId == nFirstId then
local dWipeLen = EgtIf( LayerParams.nLeadInType == LEAD_TYPE.NONE, LayerParams.dWipeLen, 0)
AddRetraction( nId, LayerParams.dCoastingLen, dWipeLen)
else
AddRetraction( nId, LayerParams.dCoastingLen, LayerParams.dWipeLen)
end
end
end
nId = EgtGetNextName( nId, SHELL_CRV .. "*")
end
-- sistemo i setti
local nSettiGrp = EgtGetFirstNameInGroup( nCrvGrpId, SETTI_GRP)
if nSettiGrp then
CalcSettiToolPath( nCrvGrpId, nTpathGrpId, LayerParams, dCorrZ)
end
--passo al gruppo di contorni successivo
nCrvGrpId = EgtGetNextName( nCrvGrpId, CONTOUR_GRP.."*")
end
end
end
---------------------------------------------------------------------
return CalcToolPath