3dPrinting :
- utilizzo delle regioni con numero diverso di passate per forare pareti - correzioni varie.
This commit is contained in:
+99
-45
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user