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