3dPrinting :
- gestione uscite differenziate per regioni con diverse passate.
This commit is contained in:
@@ -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
@@ -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
@@ -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])
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user