3dPrinting :

- utilizzo delle regioni con numero diverso di passate per forare pareti
- correzioni varie.
This commit is contained in:
SaraP
2022-09-15 17:17:14 +02:00
parent f7b1c4297c
commit 34f90a1271
7 changed files with 130 additions and 66 deletions
+99 -45
View File
@@ -183,7 +183,7 @@ local function VerifyPath( nCrvId, dStrand, vtSlicing, nGrp)
end
-- se non è fattibile con unica passata lo cancello
if not bSingleStrand then
EgtErase( nCrvId)
EgtErase( nCrvId)
return false
end
end
@@ -211,6 +211,26 @@ end
--------------------------------------------------------------------
--------------------- RIEMPIMENTI PIENI ----------------------------
--------------------------------------------------------------------
local function AdjustSurfForFloorCeil( nStrandDiff, nSrfTrim, nShellNbrSurfGrp)
if EgtSurfFrChunkCount( nSrfTrim) == 0 then return end
local nSurf = EgtCopyGlob( nSrfTrim, EgtGetParent( nSrfTrim))
if nShellNbrSurfGrp then
local nIdx = nStrandDiff
local nShellSurf = EgtGetFirstNameInGroup( nShellNbrSurfGrp, SHELL_NBR_SURF .. tostring( nIdx))
while nShellSurf do
EgtSurfFrSubtract( nSurf, nShellSurf)
nIdx = nIdx + 1
nShellSurf = EgtGetFirstNameInGroup( nShellNbrSurfGrp, SHELL_NBR_SURF .. tostring( nIdx))
end
end
return nSurf
end
--------------------------------------------------------------------
local function ReorderPath( vOldIds, vNewIds)
@@ -262,7 +282,7 @@ local function ReorderPath( vOldIds, vNewIds)
EgtSpInit()
-- se racchiude più curve uso shortest path per ordinarle
for j = 1, #vChildren do
local pt = EgtCP( vChildren[j])
local pt = EgtGP( vChildren[j])
EgtSpAddPoint( pt:getX(), pt:getY(), pt:getZ(), 0, 0, pt:getX(), pt:getY(), pt:getZ(), 0, 0)
end
local ptS = EgtSP( nParentIdx)
@@ -538,10 +558,6 @@ local function ReorderRibs( nGrp, bInvertOrder, dStrand, nMaxNbr)
table.insert( vSPRibs, vIds[i])
end
end
local ptS = ORIG()
EgtSpSetOpenBound( true, SHP_OB.NEAR_PNT, ptS:getX(), ptS:getY(), ptS:getZ(), 0, 0)
local vOrd, dLen = EgtSpCalculate( SHP_TY.OPEN)
EgtSpTerminate()
@@ -892,22 +908,24 @@ local function CreateShellNbrSurfaces( nGrp, nShellsNbr)
local nMaxShellNbrDiff = 0
local nCrvId = EgtGetFirstNameInGroup( nGrp, SHELL_NBR_CRV .. '*')
while nCrvId do
-- recupero info sul gap
local nShellNbrDiff = EgtGetInfo( nCrvId, KEY_SHELL_NBR_DIFF, 'i')
-- aggiorno eventuale massimo
if nMaxShellNbrDiff < nShellNbrDiff then nMaxShellNbrDiff = nShellNbrDiff end
-- salvo gli id delle curve
if not tDiffCrvs[nShellNbrDiff] then
tDiffCrvs[nShellNbrDiff] = { nCrvId}
else
table.insert( tDiffCrvs[nShellNbrDiff], nCrvId)
if EgtCurveIsClosed( nCrvId) then
-- recupero info sul gap
local nShellNbrDiff = EgtGetInfo( nCrvId, KEY_SHELL_NBR_DIFF, 'i')
-- aggiorno eventuale massimo
if nMaxShellNbrDiff < nShellNbrDiff then nMaxShellNbrDiff = nShellNbrDiff end
-- salvo gli id delle curve
if not tDiffCrvs[nShellNbrDiff] then
tDiffCrvs[nShellNbrDiff] = { nCrvId}
else
table.insert( tDiffCrvs[nShellNbrDiff], nCrvId)
end
end
nCrvId = EgtGetNextName( nCrvId, SHELL_NBR_CRV .. '*')
end
-- eventuale correzione del numero massimo in base al numero di pareti interne
nMaxShellNbrDiff = min( nMaxShellNbrDiff, nShellsNbr - 1)
-- eventuale correzione del numero massimo in base al numero di passate
nMaxShellNbrDiff = min( nMaxShellNbrDiff, nShellsNbr)
-- costruisco per ogni valore la superficie complessiva
local nSrfGrp = EgtGroup( nGrp)
@@ -925,6 +943,7 @@ local function CreateShellNbrSurfaces( nGrp, nShellsNbr)
local nSrfId, nCnt = EgtSurfFlatRegion( nSrfGrp, vCrvIds)
for nIdSrf = nSrfId + 1, nSrfId + nCnt - 1 do
EgtSurfFrAdd( nSrfId, nIdSrf)
EgtErase( nIdSrf)
end
EgtSetName( nSrfId, SHELL_NBR_SURF .. tostring( nDiff))
end
@@ -955,7 +974,7 @@ 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)
@@ -971,6 +990,31 @@ end
---------------------------------------------------------------------
local function ReorderExtraShells( nPathGrp, dStrand, vPtStart, bPrintInvert)
-- verifico se posso unire due tratti consecutivi della stessa shell
local nFirst = EgtGetFirstNameInGroup( nPathGrp, EXTRA_SHELL_CRV .. '*')
while nFirst do
-- recupero tratti appartenenti alla stessa shell
local vShells = EgtGetNameInGroup( nPathGrp, EgtGetName( nFirst))
local nCurr = vShells[1]
for i = 2, #vShells do
if dist( EgtEP( nCurr), EgtSP( vShells[i])) < dStrand + GEO.EPS_SMALL then
-- unisco le curve
EgtAddCurveCompoLine( nCurr, EgtSP( vShells[i]))
EgtAddCurveCompoCurve( nCurr, vShells[i])
else
nCurr = vShells[i]
end
end
-- check su prima e ultima curva
if nCurr ~= nFirst and dist( EgtEP( nCurr), EgtSP( nFirst)) < dStrand + GEO.EPS_SMALL then
-- unisco le curve
EgtAddCurveCompoLine( nCurr, EgtSP( nFirst))
EgtAddCurveCompoCurve( nCurr, nFirst)
end
nFirst = EgtGetNextName( nCurr, EXTRA_SHELL_CRV .. '*')
end
local vIds = EgtGetNameInGroup( nPathGrp, EXTRA_SHELL_CRV .. '*')
if not vIds then return end
@@ -1009,15 +1053,6 @@ local function ReorderExtraShells( nPathGrp, dStrand, vPtStart, bPrintInvert)
if not EgtCurveIsClosed( vIds[j]) then
local ptS = EgtSP( vIds[j])
local ptE = EgtEP( vIds[j])
if nCnt == 0 and dist( ptE, ptSCurr) < 1.5 * dStrand and EgtGetName( nCurrCrv) == EgtGetName( vIds[j]) then
nCnt = nCnt + 1
EgtRelocateGlob( vIds[j], nCurrCrv, GDB_IN.BEFORE)
EgtSetName( vIds[j], EXTRA_SHELL_CRV .. tostring( k))
table.remove( vIds, j)
bFound = true
break
end
local bLink = dist( ptS, ptECurr) < 1.5 * dStrand
@@ -1070,10 +1105,12 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d
for nInd = nMaxShellNbrDiff, 1, -1 do
dOffs = dOffs + LayerParams.dStrand
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 regione con diverso numero di passate
local nTrimCrv, nTrimCnt = EgtTrimCurveWithRegion( nCopy, nSrfDiff, false, false)
@@ -1081,7 +1118,7 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d
-- 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)
EgtChangeId( nNewId, nTrimCrv)
nTrimCnt = nTrimCnt - 1
end
@@ -1104,7 +1141,12 @@ local function CalcExtraShellsPath( nMaxShellNbrDiff, nShellNbrGrp, nCrvGrpId, d
if dLen > MIN_LEN and bValid then
EgtModifyCurveExtrusion( nId, LayerParams.vtSlicing)
EgtSetName( nId, EXTRA_SHELL_CRV .. tostring( nMaxShellNbrDiff - nInd + 1))
EgtSetInfo( nId, KEY_TYPE, TYPE.EXTRA_SHELL)
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
UpdateTotalShellSurf( nSrfTrim, nId, LayerParams.dStrand, nGrpId)
-- se la superficie si annulla non è possibile realizzare altro, quindi cancello tutte le curve rimaste
@@ -1337,7 +1379,8 @@ function CalcPaths.Exec( nPartId)
-- regioni con diverso numero di passate
local nShellNbrGrp = EgtGetFirstNameInGroup( vLayIds[nIdx], SHELL_NBR_GRP)
CreateShellNbrSurfaces( nShellNbrGrp, LayerParams.nShellsNbr)
local nMaxShell = max( LayerParams.nShellsNbr, LayerParams.nFloorNbr, LayerParams.nCeilNbr)
CreateShellNbrSurfaces( nShellNbrGrp, nMaxShell)
local nShellNbrSurfGrp = EgtGetFirstGroupInGroup( nShellNbrGrp or GDB_ID.NULL)
-- recupero gli start point per il layer
@@ -1365,26 +1408,33 @@ function CalcPaths.Exec( nPartId)
local nSrf = EgtGetFirstNameInGroup( nCrvGrpId, LAYER_SRF)
if nSrf then
local nMaxShellNbrDiff = ComputeMaxShellNbrDiff( nSrf, nShellNbrSurfGrp)
nMaxShellNbrDiff = min( nMaxShellNbrDiff, LayerParams.nShellsNbr)
-- parete esterna
local dOffs = 0.5 * LayerParams.dStrand - LayerParams.dOffs
local bOk, bExists, nSrfId = ComputeSurfOffset( nSrf, nCrvGrpId, - dOffs)
if not bOk then
EgtOutLog( 'Error on ExtOffset (layer '..tostring( nIdx)..') - CalcPaths')
elseif not bExists then
EgtOutLog( 'Warning : ExtOffset not possible (layer '..tostring( nIdx)..') - CalcPaths')
else
-- se offset riuscito, estraggo i contorni (pareti esterne)
GetPathsFromSurf( nSrfId, SHELL_CRV ..'0', TYPE.OUTER_SHELL, nGrpId, vPtStart)
local dOffs = - LayerParams.dOffs - 0.5 * LayerParams.dStrand
if nMaxShellNbrDiff < LayerParams.nShellsNbr then
dOffs = dOffs + LayerParams.dStrand
local bOk, bExists, nSrfId = ComputeSurfOffset( nSrf, nCrvGrpId, - dOffs)
if not bOk then
EgtOutLog( 'Error on ExtOffset (layer '..tostring( nIdx)..') - CalcPaths')
elseif not bExists then
EgtOutLog( 'Warning : ExtOffset not possible (layer '..tostring( nIdx)..') - CalcPaths')
else
-- se offset riuscito, estraggo i contorni (pareti esterne)
GetPathsFromSurf( nSrfId, SHELL_CRV ..'0', TYPE.OUTER_SHELL, nGrpId, vPtStart)
end
EgtErase( nSrfId)
end
EgtErase( nSrfId)
local vPtInnerStart = {}
local vOuterShell = EgtGetNameInGroup( nGrpId, SHELL_CRV .. '0') or {}
for i = 1, #vOuterShell do
table.insert( vPtInnerStart, EgtSP( vOuterShell[i]))
end
if #vPtInnerStart == 0 then vPtInnerStart = vPtStart end
-- pareti interne complete
local nMaxShellNbrDiff = ComputeMaxShellNbrDiff( nSrf, nShellNbrSurfGrp)
for nInd = 1, LayerParams.nShellsNbr - 1 - nMaxShellNbrDiff do
-- offset della superficie originale
dOffs = dOffs + LayerParams.dStrand
@@ -1416,17 +1466,21 @@ function CalcPaths.Exec( nPartId)
-- gestione eventuale floor/ceil
if nIdx <= LayerParams.nFloorNbr then
local nSurfInfill = AdjustSurfForFloorCeil( LayerParams.nFloorNbr - nIdx + 1, nSrfTrim, nShellNbrSurfGrp) or nSrfTrim
if LayerParams.nFloorType == INFILL_TYPE.OFFSET then
ComputeOffsetInfill( nSrfTrim, LayerParams.dStrand, LayerParams.vtSlicing, INFILL_CRV, TYPE.INFILL, vPtStart, nGrpId)
ComputeOffsetInfill( nSurfInfill, LayerParams.dStrand, LayerParams.vtSlicing, INFILL_CRV, TYPE.INFILL, vPtStart, nGrpId)
elseif LayerParams.nFloorType == INFILL_TYPE.ZIGZAG then
ComputeZigZagInfill( nSrfTrim, LayerParams.dStrand, LayerParams.vtSlicing, INFILL_CRV, TYPE.INFILL, vPtStart, nGrpId)
ComputeZigZagInfill( nSurfInfill, LayerParams.dStrand, LayerParams.vtSlicing, INFILL_CRV, TYPE.INFILL, vPtStart, nGrpId)
end
EgtErase( nSurfInfill)
elseif nIdx > #vLayIds - LayerParams.nCeilNbr then
local nSurfInfill = AdjustSurfForFloorCeil( LayerParams.nCeilNbr - ( #vLayIds - nIdx), nSrfTrim, nShellNbrSurfGrp) or nSrfTrim
if LayerParams.nCeilType == INFILL_TYPE.OFFSET then
ComputeOffsetInfill( nSrfTrim, LayerParams.dStrand, LayerParams.vtSlicing, INFILL_CRV, TYPE.INFILL, vPtStart, nGrpId)
ComputeOffsetInfill( nSurfInfill, LayerParams.dStrand, LayerParams.vtSlicing, INFILL_CRV, TYPE.INFILL, vPtStart, nGrpId)
elseif LayerParams.nCeilType == INFILL_TYPE.ZIGZAG then
ComputeZigZagInfill( nSrfTrim, LayerParams.dStrand, LayerParams.vtSlicing, INFILL_CRV, TYPE.INFILL, vPtStart, nGrpId)
ComputeZigZagInfill( nSurfInfill, LayerParams.dStrand, LayerParams.vtSlicing, INFILL_CRV, TYPE.INFILL, vPtStart, nGrpId)
end
EgtErase( nSurfInfill)
end
end