3dPrinting :

- slicing a 45°
- migliorie varie.
This commit is contained in:
SaraP
2022-06-10 15:47:48 +02:00
parent 66f9f78425
commit 680ac4c93a
6 changed files with 186 additions and 114 deletions
+48 -34
View File
@@ -18,6 +18,7 @@ local function GetLayerParamsForToolPathCalc()
local LayerParams = {}
LayerParams.dStrand = EgtGetInfo( nParamsGrp, KEY_STRAND, 'd')
LayerParams.dLayHeight = EgtGetInfo( nParamsGrp, KEY_SLICE_STEP, 'd')
LayerParams.dOffs = EgtGetInfo( nParamsGrp, KEY_OFFSET_SLICE, 'd')
LayerParams.bInvert = ( EgtGetInfo( nParamsGrp, KEY_PRINT_DIRECTION, 'i') == PRINT_DIRECTION.CW)
LayerParams.nOrder = EgtGetInfo( nParamsGrp, KEY_PRINT_ORDER, 'i')
LayerParams.nLinkType = EgtGetInfo( nParamsGrp, KEY_LINK_TYPE, 'i')
@@ -32,39 +33,47 @@ local function GetLayerParamsForToolPathCalc()
LayerParams.dSPOffs = EgtGetInfo( nParamsGrp, KEY_SP_OFFSET_ON_SLICE, 'd')
LayerParams.dCoastingLen = EgtGetInfo( nParamsGrp, KEY_COASTING_LEN, 'd')
LayerParams.dWipeLen = EgtGetInfo( nParamsGrp, KEY_WIPE_LEN, 'd')
LayerParams.vtSlicing = EgtGetInfo( nParamsGrp, KEY_SLICING_DIR, 'v')
LayerParams.dTDiam = EgtGetInfo( nParamsGrp, KEY_TOOL_DIAM, '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
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( Z_AX(), dAng)
local ptS = ptE - LayerParams.dLeadInTangDist * vtTang + LayerParams.dLeadInOrthoDist * vtOrtho
-- impongo che la coordinata z dei due punti sia la stessa
ptS = Point3d( ptS:getX(), ptS:getY(), ptE:getZ())
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 = EgtLine( nGrpId, ptS, ptE)
nLeadInCrv = EgtCurveCompoFromPoints( nGrpId, {ptS, ptE})
elseif LayerParams.nLeadInType == LEAD_TYPE.ARC then
local _, _, dAngIni = SphericalFromVector( vtTang)
nLeadInCrv = EgtArc2PD( nGrpId, ptE, ptS, 180 + dAngIni)
nLeadInCrv = EgtArc2PV( nGrpId, ptE, ptS, -vtTang)
EgtInvertCurve( nLeadInCrv)
end
EgtRelocate( nLeadInCrv, nGrpId, GDB_IN.FIRST_SON)
EgtModifyCurveExtrusion( nLeadInCrv, Z_AX(), GDB_RT.GLOB)
EgtModifyCurveExtrusion( nLeadInCrv, LayerParams.vtSlicing, GDB_RT.GLOB)
EgtSetInfo( nLeadInCrv, KEY_TYPE, TYPE.LINK)
EgtSetColor( nLeadInCrv, EgtStdColor('GRAY'))
end
--------------------------------------------------------------------
@@ -78,23 +87,19 @@ local function AddLeadOut( nCrvId, LayerParams, nGrpId)
( not LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.EXT_INT_INF) then
dAng = 90
end
vtOrtho:rotate( Z_AX(), dAng)
vtOrtho:rotate( LayerParams.vtSlicing, dAng)
local ptE = ptS + LayerParams.dLeadOutTangDist * vtTang + LayerParams.dLeadOutOrthoDist * vtOrtho
-- impongo che la coordinata z dei due punti sia la stessa
ptE = Point3d( ptE:getX(), ptE:getY(), ptS:getZ())
local nLeadOutCrv = GDB_ID.NULL
if LayerParams.nLeadOutType == LEAD_TYPE.LINEAR then
nLeadOutCrv = EgtLine( nGrpId, ptS, ptE)
nLeadOutCrv = EgtCurveCompoFromPoints( nGrpId, {ptS, ptE})
elseif LayerParams.nLeadOutType == LEAD_TYPE.ARC then
local _, _, dAngIni = SphericalFromVector( vtTang)
nLeadOutCrv = EgtArc2PD( nGrpId, ptS, ptE, dAngIni)
nLeadOutCrv = EgtArc2PV( nGrpId, ptS, ptE, vtTang)
end
EgtRelocate( nLeadOutCrv, nGrpId, GDB_IN.LAST_SON)
EgtModifyCurveExtrusion( nLeadOutCrv, Z_AX(), GDB_RT.GLOB)
EgtModifyCurveExtrusion( nLeadOutCrv, LayerParams.vtSlicing, GDB_RT.GLOB)
EgtSetInfo( nLeadOutCrv, KEY_TYPE, TYPE.LINK)
EgtSetColor( nLeadOutCrv, EgtStdColor('GRAY'))
end
--------------------------------------------------------------------
@@ -134,7 +139,7 @@ end
--------------------------------------------------------------------
local function AddRetractionOnLastCrv( nTpathGrpId, LayerParams)
local nCrvId = EgtGetLastNameInGroup( nTpathGrpId, SHELL_CRV .. "*")
local nCrvId = EgtGetLastNameInGroup( nTpathGrpId, SHELL_CRV .. "*")
if LayerParams.nLeadOutType == LEAD_TYPE.NONE then
AddRetraction( nCrvId, LayerParams.dCoastingLen, LayerParams.dWipeLen)
else
@@ -169,10 +174,12 @@ function CalcToolPath.Exec( nPartId)
return
end
-- recupero i parametri per calcolo dei toolpath
local LayerParams = GetLayerParamsForToolPathCalc()
-- Ciclo sui layer
for nIdx = 1, #vLayIds do
-- recupero i parametri relativi al layer
local LayerParams = GetLayerParamsForToolPathCalc()
-- scorro tutti i gruppi di contorni
local nCrvGrpId = EgtGetFirstNameInGroup( vLayIds[ nIdx], CONTOUR_GRP.."*")
while nCrvGrpId do
@@ -197,11 +204,15 @@ function CalcToolPath.Exec( nPartId)
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))
EgtMove( nNewEntId, Vector3d( 0, 0, LayerParams.dLayHeight), GDB_RT.GLOB)
-- correggo posizione in Z ( per essere sicuri di appoggiare sul piano)
local dCorr = ComputeZCorrection( LayerParams)
EgtMove( nNewEntId, dCorr * 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, Z_AX(), GDB_RT.GLOB)
EgtModifyCurveExtrusion( nNewEntId, LayerParams.vtSlicing, GDB_RT.GLOB)
EgtSetColor( nNewEntId, EgtStdColor('GRAY'))
nEntId = EgtGetNext( nEntId)
end
@@ -240,17 +251,20 @@ function CalcToolPath.Exec( nPartId)
EgtTrimCurveEndAtLen( nPrevId, EgtCurveLength( nPrevId) - LayerParams.dLinkParam / 2)
EgtTrimCurveStartAtLen( nCurrId, LayerParams.dLinkParam / 2)
if LayerParams.nLinkType == LINK_TYPE.LINEAR then
nLinkId = EgtLine( nTpathGrpId, EgtEP( nPrevId), EgtSP( nCurrId))
nLinkId = EgtCurveCompoFromPoints( nTpathGrpId, {EgtEP( nPrevId), EgtSP( nCurrId)})
elseif LayerParams.nLinkType == LINK_TYPE.BIARC then
local _, _, dAngIni = SphericalFromVector( EgtEV( nPrevId))
local _, _, dAngFin = SphericalFromVector( EgtSV( nCurrId))
nLinkId = EgtBiArc( nTpathGrpId, EgtEP( nPrevId), EgtSP( nCurrId), dAngIni, dAngFin, 0.5)
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)
EgtSetColor( nLinkId, EgtStdColor('GRAY'))
EgtModifyCurveExtrusion( nLinkId, Z_AX(), GDB_RT.GLOB)
EgtRelocate( nLinkId, nCurrId, GDB_IN.BEFORE)
EgtModifyCurveExtrusion( nLinkId, LayerParams.vtSlicing, GDB_RT.GLOB)
EgtSetInfo( nLinkId, KEY_TYPE, TYPE.LINK)
end
end
@@ -277,7 +291,7 @@ function CalcToolPath.Exec( nPartId)
local nId = EgtGetFirstNameInGroup( nTpathGrpId, SHELL_CRV .. "*")
local nFirstId = nId
local nLastId = EgtGetLastNameInGroup( nTpathGrpId, SHELL_CRV .. "*")
while nId do
while nId do
if nId == nLastId then
AddRetractionOnLastCrv( nTpathGrpId, LayerParams)
else
@@ -292,7 +306,7 @@ function CalcToolPath.Exec( nPartId)
end
end
end
nId = EgtGetNextName( nId, SHELL_CRV .. "*")
nId = EgtGetNextName( nId, SHELL_CRV .. "*")
end
--passo al gruppo di contorni successivo