3dPrinting :

- gestione uscite differenziate per regioni con diverse passate.
This commit is contained in:
SaraP
2022-11-07 10:09:12 +01:00
parent 4d74134671
commit f834d006f6
4 changed files with 142 additions and 64 deletions
+4
View File
@@ -104,6 +104,9 @@ KEY_SHELL_NBR_DIFF = "ShellNbrDifference"
KEY_SHELL_NBR_COASTING = "ShellNbrCoasting"
KEY_SHELL_NBR_WIPE = "ShellNbrWipe"
KEY_SHELL_NBR_WIPE_DIR = "ShellNbrWipeDir"
KEY_EXTRA_SHELL_COASTING = "ExtraShellCoasting"
KEY_EXTRA_SHELL_WIPE = "ExtraShellWipe"
KEY_EXTRA_SHELL_WIPE_DIR = "ExtraShellWipeDir"
-- Solidi ausiliari
KEY_AUX_SOLIDS_INFILL = "AuxSolidsInfill"
@@ -133,6 +136,7 @@ KEY_ZIG_ZAG_DIR = "ZigZagDir"
KEY_INVERTED_CRV = "InvertedCrv"
KEY_CLOSED_CRV = "ClosedCrv"
KEY_ASSOCIATED_SURF = "AssociatedSurf"
KEY_ASSOCIATED_CRVS = "AssociatedCrvs"
KEY_HAS_SOLIDS = "Solids"
SLICING_TYPE = {
+110 -56
View File
@@ -32,7 +32,11 @@ local function GetLayerParamsForPathCalc()
LayerParams.bPrintInvert = ( EgtGetInfo( s_nPartId, KEY_PRINT_DIRECTION, 'i') == PRINT_DIRECTION.CW)
-- parametri costolature
LayerParams.bRibsInvertOrder = EgtGetInfo( s_nPartId, KEY_RIBS_INVERT_ORDER, 'b')
-- parametri regioni con diverse passate
LayerParams.dShellNbrCoasting = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_COASTING, 'd')
LayerParams.dShellNbrWipe = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE, 'd')
LayerParams.dShellNbrWipeDir = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE_DIR, 'd')
-- eventuale modifica dei parametri per gestire correttamente il caso spiral vase
if LayerParams.bSpiralVase then
LayerParams.nShellsNbr = 1
@@ -1165,6 +1169,8 @@ local function CreateShellNbrSurfaces( nGrp, nShellsNbr)
EgtErase( nSrfTmp)
end
EgtSetName( nSrfId, SHELL_NBR_SURF .. tostring( nDiff))
-- salvo come info gli id delle curve che la definiscono
EgtSetInfo( nSrfId, KEY_ASSOCIATED_CRVS, vCrvIds)
end
end
@@ -1190,10 +1196,68 @@ local function ComputeMaxShellNbrDiff( nSrf, nShellNbrSurfGrp)
return nMaxShellNbrDiff
end
----------------------------------------------------------------
local function FindExtraShellRetractionParams( ptP, vIds, LayerParams)
local dCoasting, dWipe, dWipeDir
-- cerco la curva sulla quale si ferma
for i = 1, #vIds do
local dPar = EgtCurveParamAtPoint( vIds[i], ptP, 10 * GEO.EPS_SMALL)
if dPar then
dCoasting = EgtGetInfo( vIds[i], KEY_SHELL_NBR_COASTING, 'd')
dWipe = EgtGetInfo( vIds[i], KEY_SHELL_NBR_WIPE, 'd')
dWipeDir = EgtGetInfo( vIds[i], KEY_SHELL_NBR_WIPE_DIR, 'd')
break
end
end
if not dCoasting then
-- se non ho trovato una curva considero i parametri generali
return LayerParams.dShellNbrCoasting, LayerParams.dShellNbrWipe, LayerParams.dShellNbrWipeDir
else
return dCoasting, dWipe, dWipeDir
end
end
-----------------------------------------------------------------
local function TrimOuterCurveForExtraShellCalc( nOuterCrv, nSrfDiff, nGrpId, vPtStart, LayerParams)
local nCopy = EgtCopyGlob( nOuterCrv, nGrpId)
ModifyStartPoint( nCopy, vPtStart)
-- recupero tutte le curve delle ShellNumber coinvolte
local vShellNbrCrvs = EgtGetInfo( nSrfDiff, KEY_ASSOCIATED_CRVS, 'vi')
-- trim della curva
local nCrv, nCnt = EgtTrimCurveWithRegion( nCopy, nSrfDiff, false, false)
if nCrv and nCnt ~= 0 then
-- verifico se prima e ultima curva possono essere unite
if nCnt > 1 and AreSamePointApprox( EgtEP( nCrv + nCnt - 1), EgtSP( nCrv)) then
local nNewId = EgtCurveCompo( nGrpId, { nCrv + nCnt - 1, nCrv})
EgtChangeId( nNewId, nCrv)
nCnt = nCnt - 1
end
-- assegno le info in base alla curva che li delimita
for nId = nCrv, nCrv + nCnt - 1 do
local ptS = EgtSP( nId)
local dCoastingS, dWipeS, dWipeDirS = FindExtraShellRetractionParams( ptS, vShellNbrCrvs, LayerParams)
local ptE = EgtEP( nId)
local dCoastingE, dWipeE, dWipeDirE = FindExtraShellRetractionParams( ptE, vShellNbrCrvs, LayerParams)
EgtSetInfo( nId, KEY_EXTRA_SHELL_COASTING, {dCoastingS, dCoastingE})
EgtSetInfo( nId, KEY_EXTRA_SHELL_WIPE, {dWipeS, dWipeE})
EgtSetInfo( nId, KEY_EXTRA_SHELL_WIPE_DIR, {dWipeDirS, dWipeDirE})
end
return nCrv, nCnt
else
return nOuterCrv, 0
end
end
--------------------------------------------------------------------
local function UpdateTotalShellSurf( nSrf, nCrv, dStrand, nGrpId)
local nSrfExtraShell = EgtSurfFrFatCurve( nGrpId, nCrv, dStrand - s_dOffsCorr, false)
local nSrfExtraShell = EgtSurfFrFatCurve( nGrpId, nCrv, dStrand - s_dOffsCorr, false)
if nSrfExtraShell then
local vtSrfN = EgtSurfFrNormVersor( nSrf, GDB_ID.ROOT)
local vtSrfExShN = EgtSurfFrNormVersor( nSrfExtraShell, GDB_ID.ROOT)
@@ -1328,68 +1392,58 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d
local nSrfDiff = EgtGetFirstNameInGroup( nShellNbrGrp, SHELL_NBR_SURF .. tostring( nInd))
local nOuterCrv = EgtGetFirstNameInGroup( nCrvGrpId, OUTER_CRV)
while nOuterCrv do
local nCopy = EgtCopyGlob( nOuterCrv, nGrpId)
ModifyStartPoint( nCopy, vPtStart)
-- trim della curva con la superficie
local nTrimCrv, nTrimCnt = TrimOuterCurveForExtraShellCalc( nOuterCrv, nSrfDiff, nGrpId, vPtStart, LayerParams)
-- trim della curva con la regione con diverso numero di passate
local nTrimCrv, nTrimCnt = EgtTrimCurveWithRegion( nCopy, nSrfDiff, false, false)
if nTrimCnt ~= 0 then
-- verifico se prima e ultima curva possono essere unite
if nTrimCnt > 1 and AreSamePointApprox( EgtEP( nTrimCrv + nTrimCnt - 1), EgtSP( nTrimCrv)) then
local nNewId = EgtCurveCompo( nGrpId, { nTrimCrv + nTrimCnt - 1, nTrimCrv})
EgtChangeId( nNewId, nTrimCrv)
nTrimCnt = nTrimCnt - 1
end
for nCrvT = nTrimCrv, nTrimCrv + nTrimCnt - 1 do
-- calcolo offset della curva ( è il percorso della shell)
EgtModifyCurveExtrusion( nCrvT, LayerParams.vtSlicing, GDB_RT.GLOB)
local nOffs, nOffsCnt = EgtOffsetCurveAdv( nCrvT, - dOffs)
EgtErase( nCrvT)
for nCrvOffs = nOffs, nOffs + nOffsCnt - 1 do
-- trim con la regione già occupata dal altre shell
local nCrv, nCnt = EgtTrimCurveWithRegion( nCrvOffs, nSrfTrim, true, true)
if nCrv and nCnt ~= 0 then
for nId = nCrv, nCrv + nCnt - 1 do
local dLen = EgtCurveLength( nId)
local bValid = true
if EgtCurveIsClosed( nId) then
bValid = VerifyPath( nId, LayerParams.dStrand, LayerParams.vtSlicing, nGrpId)
end
-- verifico se soddisfa vincolo sulla lunghezza
if dLen > MIN_LEN and bValid then
EgtModifyCurveExtrusion( nId, LayerParams.vtSlicing, GDB_RT.GLOB)
EgtSetName( nId, EXTRA_SHELL_CRV .. tostring( nMaxShellNbrDiff - nInd + 1))
if nInd == LayerParams.nShellsNbr then
EgtSetInfo( nId, KEY_TYPE, TYPE.EXTRA_OUTER_SHELL)
else
EgtSetInfo( nId, KEY_TYPE, TYPE.EXTRA_SHELL)
end
-- aggiorno la superficie occupata dalle shell con quella appena calcolata (tenendo conto dell'overlap)
UpdateTotalShellSurf( nSrfTrim, nId, ( 1 - LayerParams.nStrandOverlap / 100) * LayerParams.dStrand, nGrpId)
-- se la superficie si annulla non è possibile realizzare altro, quindi cancello tutte le curve rimaste
if EgtSurfFrChunkCount( nSrfTrim) == 0 then
for j = nId + 1, nCrv + nCnt - 1 do
EgtErase( j)
end
for j = nCrvT + 1, nTrimCrv + nTrimCnt - 1 do
EgtErase( j)
end
-- aggiorno superficie
EgtSurfFrOffset( nSrfTrim, - LayerParams.nStrandOverlap / 100 * LayerParams.dStrand)
-- riordino le curve appena create e se possibile creo percorsi chiusi
ReorderExtraShells( nGrpId, LayerParams.dStrand, vPtStart, LayerParams.bPrintInvert)
return
end
for nCrvT = nTrimCrv, nTrimCrv + nTrimCnt - 1 do
-- calcolo offset della curva ( è il percorso della shell)
EgtModifyCurveExtrusion( nCrvT, LayerParams.vtSlicing, GDB_RT.GLOB)
local nOffs, nOffsCnt = EgtOffsetCurveAdv( nCrvT, - dOffs)
EgtErase( nCrvT)
for nCrvOffs = nOffs, nOffs + nOffsCnt - 1 do
-- trim con la regione già occupata dal altre shell
local nCrv, nCnt = EgtTrimCurveWithRegion( nCrvOffs, nSrfTrim, true, true)
if nCrv and nCnt ~= 0 then
for nId = nCrv, nCrv + nCnt - 1 do
local dLen = EgtCurveLength( nId)
local bValid = true
if EgtCurveIsClosed( nId) then
bValid = VerifyPath( nId, LayerParams.dStrand, LayerParams.vtSlicing, nGrpId)
end
-- verifico se soddisfa vincolo sulla lunghezza
if dLen > MIN_LEN and bValid then
EgtModifyCurveExtrusion( nId, LayerParams.vtSlicing, GDB_RT.GLOB)
EgtSetName( nId, EXTRA_SHELL_CRV .. tostring( nMaxShellNbrDiff - nInd + 1))
if nInd == LayerParams.nShellsNbr then
EgtSetInfo( nId, KEY_TYPE, TYPE.EXTRA_OUTER_SHELL)
else
EgtErase( nId)
EgtSetInfo( nId, KEY_TYPE, TYPE.EXTRA_SHELL)
end
-- aggiorno la superficie occupata dalle shell con quella appena calcolata (tenendo conto dell'overlap)
UpdateTotalShellSurf( nSrfTrim, nId, ( 1 - LayerParams.nStrandOverlap / 100) * LayerParams.dStrand, nGrpId)
-- se la superficie si annulla non è possibile realizzare altro, quindi cancello tutte le curve rimaste
if EgtSurfFrChunkCount( nSrfTrim) == 0 then
for j = nId + 1, nCrv + nCnt - 1 do
EgtErase( j)
end
for j = nCrvT + 1, nTrimCrv + nTrimCnt - 1 do
EgtErase( j)
end
-- aggiorno superficie
EgtSurfFrOffset( nSrfTrim, - LayerParams.nStrandOverlap / 100 * LayerParams.dStrand)
-- riordino le curve appena create e se possibile creo percorsi chiusi
ReorderExtraShells( nGrpId, LayerParams.dStrand, vPtStart, LayerParams.bPrintInvert)
return
end
else
EgtErase( nId)
end
end
end
end
end
nOuterCrv = EgtGetNextName( nOuterCrv, OUTER_CRV)
end
end
+13 -1
View File
@@ -119,6 +119,18 @@ local function GetRibParams( nId)
return RibParam
end
-------------------------------------------------------------------
local function GetShellNumberParams( nId)
local ShellNumberParam = {}
ReadParam( nId, KEY_SHELL_NBR_DIFF, 'i', ShellNumberParam)
ReadParam( nId, KEY_SHELL_NBR_COASTING, 'd', ShellNumberParam)
ReadParam( nId, KEY_SHELL_NBR_WIPE, 'd', ShellNumberParam)
ReadParam( nId, KEY_SHELL_NBR_WIPE_DIR, 'd', ShellNumberParam)
return ShellNumberParam
end
--------------------------------------------------------------------
local function GetAuxSolidsParams( nId)
@@ -166,7 +178,7 @@ local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName)
vParams = GetRibParams( vIds[i])
if vParams[ KEY_RIBS_SHELLS_NBR] == 0 then bToBeDone = false end
elseif nType == TYPE.EXTRA_SHELL then
vParams[KEY_SHELL_NBR_DIFF] = EgtGetInfo( vIds[i], KEY_SHELL_NBR_DIFF, 'i') or EgtGetInfo( s_nPartId, KEY_SHELL_NBR_DIFF, 'i')
vParams = GetShellNumberParams( vIds[i])
if vParams[KEY_SHELL_NBR_DIFF] == 0 then bToBeDone = false end
elseif nType == TYPE.AUX_SOLID then
vParams = GetAuxSolidsParams( vIds[i])
+15 -7
View File
@@ -43,10 +43,6 @@ local function GetLayerParamsForToolPathCalc()
LayerParams.dTDiam = EgtGetInfo( s_nPartId, KEY_TOOL_DIAM, 'd')
-- Parametri costolature
LayerParams.bRibsLink = EgtGetInfo( s_nPartId, KEY_RIBS_LINK, 'b')
-- Parametri regioni con diverse passate
LayerParams.dShellNbrCoasting = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_COASTING, 'd')
LayerParams.dShellNbrWipe = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE, 'd')
LayerParams.dShellNbrWipeDir = EgtGetInfo( s_nPartId, KEY_SHELL_NBR_WIPE_DIR, 'd')
return LayerParams
end
@@ -1204,11 +1200,23 @@ function CalcToolPath.Exec( nPartId)
if EgtGetName( nLastId or GDB_ID.NULL) == LEAD_OUT_CRV then nLastId = EgtGetPrev( nLastId) end
while nId do
-- recupero i parametri
local dCoastingLen, dWipeLen, dWipeDir
local nType = EgtGetInfo( nId, KEY_TYPE, 'i')
local bClosed = EgtGetInfo( nId, KEY_CLOSED_CRV, 'b') or false
local dCoastingLen = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrCoasting, LayerParams.dCoastingLen)
local dWipeLen = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrWipe, LayerParams.dWipeLen)
local dWipeDir = EgtIf( ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed, LayerParams.dShellNbrWipeDir, LayerParams.dWipeDir)
if ( nType == TYPE.EXTRA_SHELL or nType == TYPE.EXTRA_OUTER_SHELL) and not bClosed then
local bInverted = EgtGetInfo( nId, KEY_INVERTED_CRV, 'b') or false
local vCoastLen = EgtGetInfo( nId, KEY_EXTRA_SHELL_COASTING, 'vd')
local vWipeLen = EgtGetInfo( nId, KEY_EXTRA_SHELL_WIPE, 'vd')
local vWipeDir = EgtGetInfo( nId, KEY_EXTRA_SHELL_WIPE_DIR, 'vd')
-- se curva è stata invertita devo prendere le info legate a quello che era il suo punto di inizio, altrimenti prendo le info legate al punto finale
dCoastingLen = EgtIf( bInverted, vCoastLen[1], vCoastLen[2])
dWipeLen = EgtIf( bInverted, vWipeLen[1], vWipeLen[2])
dWipeDir = EgtIf( bInverted, vWipeDir[1], vWipeDir[2])
else
dCoastingLen = LayerParams.dCoastingLen
dWipeLen = LayerParams.dWipeLen
dWipeDir = LayerParams.dWipeDir
end
if nId == nLastId then
AddRetractionOnLastCrv( nId, nTpathGrpId, LayerParams, dCoastingLen, dWipeLen, dWipeDir)