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
+7 -6
View File
@@ -26,7 +26,6 @@ LEAD_IN_CRV = "LeadIn"
LEAD_OUT_CRV = "LeadOut"
FRAME_PART = "FramePart"
START_GEOM = "Start"
SHELL_NBR_SURF = "ShellNbrSurf"
TOT_SHELL_TRIM_SURF = "TotalShellSurfForTrim"
MIN_LEN = 0.1
@@ -133,11 +132,12 @@ TYPE = {
INNER_SHELL = 2,
INFILL = 3,
EXTRA_SHELL = 4,
LINK = 5,
COASTING = 6,
WIPE = 7,
RIB = 8,
AUX_SOLID = 9,
EXTRA_OUTER_SHELL = 5,
LINK = 6,
COASTING = 7,
WIPE = 8,
RIB = 9,
AUX_SOLID = 10,
}
PRINT_ORDER = {
@@ -232,6 +232,7 @@ RIBS_CRV = "Rib"
SHELL_NBR_GRP = "ShellNbrRegions"
SHELL_NBR_CRV = "ShellNbrRegion"
SHELL_NBR_SURF = "ShellNbrSurf"
AUX_SOLIDS_GRP = "AuxSolids"
AUX_SOLIDS_CRV = "AuxSolid"
+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
+12 -2
View File
@@ -230,9 +230,19 @@ local function SlicingExtraObjects( vtSlicing, nLay, nType, sNameGrp, sName)
-- slicing oggetto
local nNewId, nPntCnt, nCrvCnt, nSrfCnt = EgtPlaneSurfTmInters( ORIG() + ( dZ + dDeltaZ) * vtSlicing, vtSlicing, vIds[i], nGrp, GDB_RT.GLOB, TOLER)
-- verifico se necessario ricalcolo ( potrebbe servire per solidi ausiliari)
-- verifico se necessario ricalcolo
local dCorr = 0
if nSrfCnt > 0 then
local bOpen = false
if nType ~= TYPE.RIB and nNewId then
for nId = nNewId + nPntCnt, nNewId + nPntCnt + nCrvCnt - 1 do
if not EgtCurveIsClosed( nId) then
bOpen = true
break
end
end
end
if nSrfCnt > 0 or bOpen then
-- elimino vecchio risultato
for j = nNewId, nNewId + nPntCnt + nCrvCnt + nSrfCnt - 1 do
EgtErase( j)
+1 -1
View File
@@ -122,7 +122,7 @@ local function CreateSolidFromCurve( nCrvId, nSolidGrp, LayerParams)
if nType == TYPE.WIPE then return true end
-- scelta del colore
local Color = EgtStdColor( 'GRAY')
if nType == TYPE.OUTER_SHELL then
if nType == TYPE.OUTER_SHELL or nType == TYPE.EXTRA_OUTER_SHELL then
Color = EgtStdColor( 'TEAL')
elseif nType == TYPE.INNER_SHELL or nType == TYPE.EXTRA_SHELL then
Color = EgtStdColor( 'ORANGE')
+9 -10
View File
@@ -94,14 +94,13 @@ local function AddLink( vCrv, nTpathGrpId, nLinkType, dLinkParam, dSPOffs, dStra
-- altrimenti verifico se ha senso creare raccordo
-- local dDist = dist( EgtEP( vCrv[i-1]), EgtSP( vCrv[i]))
local dDist = EgtPointCurveDist( EgtEP( vCrv[i-1]), vCrv[i])
if dDist < dStrand + 2 then
if dDist < dStrand + 10 * GEO.EPS_SMALL then
local nLinkId
if k > 1 then
-- modifico lo start point
local dLen = EgtCurveLength( vCrv[i-1]) - abs( dSPOffs)
EgtTrimCurveEndAtLen( vCrv[i-1], dLen)
EgtChangeClosedCurveStartPoint( vCrv[i], EgtEP( vCrv[i-1]))
end
-- modifico lo start point
local dLen = EgtCurveLength( vCrv[i-1]) - EgtIf( k > 1, abs( dSPOffs), 0)
EgtTrimCurveEndAtLen( vCrv[i-1], dLen)
EgtChangeClosedCurveStartPoint( vCrv[i], EgtEP( vCrv[i-1]))
-- aggiungo il raccordo
EgtTrimCurveEndAtLen( vCrv[i-1], EgtCurveLength( vCrv[i-1]) - dLinkParam / 2)
EgtTrimCurveStartAtLen( vCrv[i], dLinkParam / 2)
@@ -133,7 +132,7 @@ end
local function AddLeadIn( nCrvId, LayerParams, nGrpId)
local ptE = EgtSP( nCrvId)
local vtTang = EgtSV( nCrvId)
local vtTang = EgtSV( nCrvId)
local vtOrtho = Vector3d( vtTang)
local dAng = 90
if ( LayerParams.bInvert and LayerParams.nOrder == PRINT_ORDER.INF_INT_EXT) or
@@ -327,7 +326,7 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink)
if dParS and dParE then
local bInvert = false
local bClosed = EgtCurveIsClosed( nCrvId)
if bClosed then
if bClosed then
-- se la curva è chiusa verifico i due percorsi possibili dParS->dParE e dParE->dParS
local nCopyId1 = EgtCopyGlob( nCrvId, nCurr, GDB_IN.AFTER)
local nCopyId2 = EgtCopyGlob( nCrvId, nCurr, GDB_IN.AFTER)
@@ -348,7 +347,7 @@ local function CalcRibsLink( nCurr, nNext, nLoopGrp, dStrand, bForceLink)
local nCopyId = EgtCopyGlob( nCrvId, nLoopGrp)
local nLinkId = EgtCopyGlob( nCrvId, nCurr, GDB_IN.AFTER)
if dParS > dParE and not bInvert then
if dParS > dParE and not bClosed then
bInvert = true
dParS, dParE = dParE, dParS
end
+1 -1
View File
@@ -34,7 +34,7 @@ function RunSlicePalette.UpdateColors( nPaletteType)
if not nType or nType < TYPE.OUTER_SHELL or nType > TYPE.AUX_SOLID then nType = nOldType end
nOldType = nType
-- scelta del colore
if nType == TYPE.OUTER_SHELL then
if nType == TYPE.OUTER_SHELL or nType == TYPE.EXTRA_OUTER_SHELL then
Color = EgtStdColor( 'TEAL')
elseif nType == TYPE.INNER_SHELL or nType == TYPE.EXTRA_SHELL then
Color = EgtStdColor( 'ORANGE')
+1 -1
View File
@@ -15,7 +15,7 @@ local AMD = require( 'AddManData')
---------------------------------------------------------------------
local function CalcShow( nShellView, nType)
if nShellView == SHELL_VIEW_TYPE.OUTER then
return ( nType == TYPE.OUTER_SHELL)
return ( nType == TYPE.OUTER_SHELL or nType == TYPE.EXTRA_OUTER_SHELL)
elseif nShellView == SHELL_VIEW_TYPE.INNER then
return ( nType == TYPE.INNER_SHELL)
elseif nShellView == SHELL_VIEW_TYPE.INFILL then