3dPrinting :

- ottimizzazioni nella fase di slicing
- migliorata la funzione che chiude buchi nei setti.
This commit is contained in:
SaraP
2026-05-12 15:09:52 +02:00
parent 31be25313a
commit 2d78f4d348
2 changed files with 306 additions and 284 deletions
+44 -45
View File
@@ -702,51 +702,50 @@ end
--------------------------------------------------------------------
local function VerifyRibsHoles( vIds)
-- raggruppo i setti per nome
local tabRibs = { { vIds[1]}}
local sPrevName = EgtGetName( vIds[1])
local i = 2
while i <= #vIds do
local bAdd = false
local sCurrName = EgtGetName( vIds[i])
-- se derivano dallo stesso setto verifico se possono essere uniti
if sCurrName == sPrevName then
local dStrand = EgtGetInfo( vIds[i], KEY_RIBS_STRAND, 'd')
local ptS1 = EgtSP( vIds[i-1])
local ptE1 = EgtEP( vIds[i-1])
local ptS2 = EgtSP( vIds[i])
local ptE2 = EgtEP( vIds[i])
local bAdd1 = dist( ptS1, ptE2) < dStrand + 10 * GEO.EPS_SMALL
local bAdd2 = dist( ptE1, ptS2) < dStrand + 10 * GEO.EPS_SMALL
bAdd = bAdd1 or bAdd2
if bAdd1 and bAdd2 then
-- da unire in setto chiuso
EgtAddCurveCompoLine( vIds[i-1], ptE2, false)
EgtAddCurveCompoLine( vIds[i-1], ptS2)
EgtAddCurveCompoCurve( vIds[i-1], vIds[i])
table.remove( vIds, i) -- rimuovo il setto dalla tabella
elseif bAdd2 then
-- unisco il secondo tratto al primo
EgtAddCurveCompoLine( vIds[i-1], ptS2)
EgtAddCurveCompoCurve( vIds[i-1], vIds[i])
table.remove( vIds, i) -- rimuovo il setto dalla tabella
elseif bAdd1 then
-- unisco il primo tratto al secondo
EgtAddCurveCompoLine( vIds[i], ptS1)
EgtAddCurveCompoCurve( vIds[i], vIds[i-1])
table.remove( vIds, i-1) -- rimuovo il setto dalla tabella
end
end
-- aggiorno per iterazione successiva
sPrevName = sCurrName
if not bAdd then
i = i + 1
for i = 2, #vIds do
if sPrevName == EgtGetName( vIds[i]) then
table.insert( tabRibs[#tabRibs], vIds[i])
else
sPrevName = EgtGetName( vIds[i])
table.insert( tabRibs, { vIds[i]})
end
end
-- verifico se posso concatenare le curve con lo stesso nome usando come tolleranza lo strand del setto ( se le passate si toccano non ha senso tenerle separate)
local nGrp = EgtGetParent( vIds[1])
for i = 1, #tabRibs do
if #tabRibs[i] > 1 then
local dStrand = EgtGetInfo( tabRibs[i][1], KEY_RIBS_STRAND, 'd')
-- gruppo temporaneo per il concatenamento
local nGrpTmp = EgtGroup( nGrp)
for j = 1, #tabRibs[i] do
EgtRelocateGlob( tabRibs[i][j], nGrpTmp)
end
EgtReorderCurvesInGroup( nGrpTmp, EgtSP( tabRibs[i][1], GDB_ID.ROOT), GDB_RT.GLOB, dStrand)
-- recupero le curve e le concateno se possibile
local vNewIds = EgtGetAllInGroup( nGrpTmp)
local nCurrId = vNewIds[1]
EgtRelocateGlob( nCurrId, nGrp)
for j = 2, #vNewIds do
if dist( EgtEP( nCurrId, GDB_ID.ROOT), EgtSP( vNewIds[j], GDB_ID.ROOT)) < dStrand + GEO.EPS_SMALL then
EgtAddCurveCompoLine( nCurrId, EgtSP( vNewIds[j], GDB_ID.ROOT), GDB_RT.GLOB)
EgtAddCurveCompoCurve( nCurrId, vNewIds[j])
else
nCurrId = vNewIds[j]
EgtRelocateGlob( nCurrId, nGrp)
end
end
EgtErase( nGrpTmp)
end
end
-- aggiorno gli id
return EgtGetAllInGroup( nGrp)
end
--------------------------------------------------------------------
@@ -2369,7 +2368,7 @@ local function CalcRibsPaths( nSliceGrp, nRibsGrp, LayerParams, vPtStart, bIgnor
end
-- verifico se posso ignorare eventuali buchi nei setti
VerifyRibsHoles( vOrigRibs)
vOrigRibs = VerifyRibsHoles( vOrigRibs)
local nTotSrfInt = GDB_ID.NULL
local nTotSrfExt = GDB_ID.NULL
@@ -2912,7 +2911,7 @@ end
local function PrepareRibsForMergeWithShells( vOrigRibs, nGrp, dStrand, dOverlap, bInvertRibsOrder)
-- verifico se sono presenti buchi che possono essere chiusi
VerifyRibsHoles( vOrigRibs)
vOrigRibs = VerifyRibsHoles( vOrigRibs)
-- trim grossolano dei setti
local nSrfCoarseTrim = EgtGetFirstNameInGroup( nGrp, COARSE_TRIM_SURF)
@@ -3371,7 +3370,7 @@ local function CalcRibsMergedShells( nSlicedRibsGrp, nPathGrp, LayerParams, vPtS
end
end
if #vOrigRibs == 0 then return true end
-- recupero le shell da unire ai setti
local nLast = EgtGetLastInGroup( nPathGrp) or GDB_ID.NULL
local nShellType = EgtGetInfo( nLast, KEY_TYPE, 'i')
+262 -239
View File
@@ -257,110 +257,7 @@ local function GetAuxSolidsParams( nId)
end
--------------------------------------------------------------------
local function SliceStm( vIds, nLayId, vtSlicing, ptSlicing, nType, sName, sNameGrp, tabParams)
if not vIds or #vIds == 0 then return end
local nLayCnt = EgtGetInfo( nLayId, KEY_SLICE_NBR, 'i')
-- recupero il gruppo dove salvare lo slicing degli oggetti
local nGrp = EgtGetFirstNameInGroup( nLayId, sNameGrp)
if not nGrp then
-- se gruppo non esiste lo creo
nGrp = EgtGroup( nLayId)
EgtSetName( nGrp, sNameGrp)
EgtSetStatus( nGrp, GDB_ST.OFF)
end
-- recupero quota per slicing
local dDeltaZ = EgtGetInfo( nLayId, KEY_SLICE_DELTAZ, 'd')
local ptOn = ptSlicing + dDeltaZ * vtSlicing
for i = 1, #vIds do
-- verifico che oggetto sia trimesh
local nTypeObj = EgtGetType( vIds[i])
if nTypeObj == GDB_TY.SRF_MESH then
-- slicing oggetto
local nNewId, nPntCnt, nCrvCnt, nSrfCnt = EgtPlaneSurfTmInters( ptOn, vtSlicing, vIds[i], nGrp, GDB_RT.GLOB, TOLER)
-- verifico se necessario ricalcolo
local dCorr = 0
local bOpen = false
if nType ~= TYPE.RIB and nType ~= TYPE.INFILL and nNewId then
for nId = nNewId + nPntCnt, nNewId + nPntCnt + nCrvCnt - 1 do
if not EgtCurveIsClosed( nId) then
bOpen = true
break
end
end
end
-- eventuale ricalcolo ( se superfici o curve aperte)
if nSrfCnt > 0 or bOpen then
EgtOutLog( 'Warning : recalc at layer '.. EgtNumToString( nLayCnt) .. ' (object)')
-- elimino vecchio risultato
for j = nNewId, nNewId + nPntCnt + nCrvCnt + nSrfCnt - 1 do
EgtErase( j)
end
dCorr = 0.01
nNewId, nPntCnt, nCrvCnt, nSrfCnt = EgtPlaneSurfTmInters( ptOn + dCorr * vtSlicing, vtSlicing, vIds[i], nGrp, GDB_RT.GLOB, TOLER)
end
if nNewId then
-- rimuovo punti
for nId = nNewId, nNewId + nPntCnt -1 do
EgtErase( nId)
end
-- concateno le curve
local vChain = {}
for nId = nNewId + nPntCnt, nNewId + nPntCnt + nCrvCnt - 1 do
table.insert( vChain, nId)
end
local nChainId, nCnt = EgtCurveCompoByChain( nGrp, vChain, ORIG(), true, GDB_RT.LOC, TOLER)
if not nChainId then
-- se fallisce riprendo le curve originali
nChainId = nNewId + nPntCnt
nCnt = nCrvCnt
end
-- rinomino le curve, correggo di DeltaZ e assegno parametri
for nId = nChainId, nChainId + nCnt - 1 do
EgtSetName( nId, sName .. EgtNumToString( i))
EgtMove( nId, - ( dDeltaZ + dCorr) * vtSlicing)
EgtSetInfo( nId, KEY_ORIGINAL_SURF, vIds[i])
if tabParams then
for sKey, sVal in pairs( tabParams[i]) do
EgtSetInfo( nId, sKey, sVal)
end
end
EgtModifyCurveExtrusion( nId, vtSlicing, GDB_RT.GLOB)
EgtApproxCurve( nId, GDB_CA.ARCS, MID_TOLER)
-- se ho ancora curve aperte, segnalo errore
if nType ~= TYPE.RIB and nType ~= TYPE.INFILL and not EgtCurveIsClosed( nId) then
EgtOutLog( 'Error : hole in object (layer '.. EgtNumToString( nLayCnt) ..') - CalcSlices')
table.insert( s_vErr, nLayCnt)
end
end
-- rimuovo superfici
for nId = nNewId + nPntCnt + nCrvCnt, nNewId + nPntCnt + nCrvCnt + nSrfCnt - 1 do
EgtErase( nId)
end
end
end
end
-- verifico che il gruppo non sia vuoto
if not EgtGetFirstInGroup( nGrp) then
EgtErase( nGrp)
nGrp = nil
end
return nGrp
end
--------------------------------------------------------------------
local function SlicingExtraObjects( nLay, nType, sName, sNameGrp, nStmId)
local function SlicingExtraObjects( nLay, vSlicingDir, vSlicingVal, nSlicingType, nType, sName, sNameGrp, nStmId)
if not nLay then return end
@@ -395,30 +292,128 @@ local function SlicingExtraObjects( nLay, nType, sName, sNameGrp, nStmId)
end
-- taglio i setti unbounded e limitati con il solido
local bLimitUnbddRibs = EgtGetInfo( s_nPartId, KEY_LIMIT_UNBDD_RIBS, 'b') or false
local vEraseIds = {}
if nType == TYPE.RIB and bLimitUnbddRibs then
for i = 1, #vSliceIds do
if tabParams[i][KEY_RIBS_TYPE] == RIB_TYPE.UNBOUNDED then
-- creo copia e la taglio con solido
local nCopy = EgtCopyGlob( vSliceIds[i], EgtGetParent( vSliceIds[i]))
EgtSurfTmCut( nCopy, nStmId, true, true)
-- lo slicing va fatto sulla copia
vSliceIds[i] = nCopy
table.insert( vEraseIds, nCopy)
if nStmId then
local bLimitUnbddRibs = EgtGetInfo( s_nPartId, KEY_LIMIT_UNBDD_RIBS, 'b') or false
if nType == TYPE.RIB and bLimitUnbddRibs then
for i = 1, #vSliceIds do
if tabParams[i][KEY_RIBS_TYPE] == RIB_TYPE.UNBOUNDED then
-- creo copia e la taglio con solido
local nCopy = EgtCopyGlob( vSliceIds[i], EgtGetParent( vSliceIds[i]))
EgtSurfTmCut( nCopy, nStmId, true, true)
-- lo slicing va fatto sulla copia
vSliceIds[i] = nCopy
table.insert( vEraseIds, nCopy)
end
end
end
end
-- per ogni layer calcolo lo slicing degli oggetti
local vLayIds = EgtGetNameInGroup( s_nPartId, SLICE_LAYER .. '*')
for i = 1, #vLayIds do
-- ricavo piano di slicing
local ptSlicing = EgtGetInfo( vLayIds[i], KEY_SLICE_POS, 'p')
local vtSlicing = EgtGetInfo( vLayIds[i], KEY_SLICE_DIR, 'v')
SliceStm( vSliceIds, vLayIds[i], vtSlicing, ptSlicing, nType, sName, sNameGrp, tabParams)
end
for i = 1, #vSliceIds do
-- effettuo lo slicing in layer separati ( analogamente a quanto avviene con il solido)
local nResId
if nSlicingType ~= SLICING_TYPE.MULTIPLANAR and nSlicingType ~= SLICING_TYPE.MULTIPLANAR_DEG45 and nSlicingType ~= SLICING_TYPE.MULTIPLANAR_HOR then
nResId = EgtParPlanesSurfTmInters( ORIG(), vSlicingDir[1], vSlicingVal, vSliceIds[i], s_nPartId, GDB_RT.GLOB, TOLER)
else
for j = 1, #vSlicingVal do
local vtN = vSlicingDir[j]
local ptOn = vSlicingVal[j]
if j == 1 then
ptOn = ptOn + DELTAZ * vtN
end
local nGrpId = EgtGroup( s_nPartId)
if not nResId then
nResId = nGrpId
end
EgtPlaneSurfTmInters( ptOn, vtN, vSliceIds[i], nGrpId, GDB_RT.GLOB, TOLER)
end
end
-- recupero i risultati e li sposto nei layers opportuni
local j = 1
while nResId do
local vtSlicing = vSlicingDir[j] or vSlicingDir[1]
-- recupero il gruppo nel layer dove salvare lo slicing degli oggetti o lo creo se non esiste
local nGrp = EgtGetFirstNameInGroup( vLayIds[j], sNameGrp)
if not nGrp then
nGrp = EgtGroup( vLayIds[j])
EgtSetName( nGrp, sNameGrp)
EgtSetStatus( nGrp, GDB_ST.OFF)
end
-- verifico se necessario ricalcolo
local nId = EgtGetLastInGroup( nResId)
local bRecalc = false
local vtRecalc
while nId and not bRecalc do
local nGeoType = EgtGetType( nId)
if nGeoType == GDB_TY.SRF_MESH then
bRecalc = true
vtRecalc = EgtSurfTmFacetNormVersor( nId, 0)
elseif nGeoType == GDB_TY.GEO_POINT then
bRecalc = true
elseif nType ~= TYPE.RIB and nType ~= TYPE.INFILL and not EgtCurveIsClosed( nId) then
bRecalc = true
end
nId = EgtGetPrev( nId)
end
-- eseguo eventuale ricalcolo
local dDeltaZ = EgtIf( j == 1, DELTAZ, 0)
if bRecalc then
EgtEmptyGroup( nResId)
dDeltaZ = dDeltaZ + EgtIf( vtRecalc and vtRecalc:getZ() > 0, - DELTAZ, DELTAZ)
-- eseguo il ricalcolo solo a quella quota
local ptSlicing = EgtGetInfo( vLayIds[j], KEY_SLICE_POS, 'p')
local ptOn = ptSlicing + dDeltaZ * vtSlicing
EgtPlaneSurfTmInters( ptOn, vtSlicing, vSliceIds[i], nResId, GDB_RT.GLOB, TOLER)
EgtOutLog( 'Warning : recalc at layer '.. EgtNumToString( j))
end
-- recupero tutte le curve
local vAllIds = EgtGetAllInGroup( nResId)
local vCrvIds = {}
for k = 1, #vAllIds do
local nGeoType = EgtGetType( nId)
if nGeoType ~= GDB_TY.SRF_MESH and nGeoType ~= GDB_TY.GEO_POINT then
table.insert( vCrvIds, vAllIds[k])
end
end
if #vCrvIds > 0 then
-- concateno le curve, le rinomino, correggo di DeltaZ e assegno i parametri
local nChainId, nCnt = EgtCurveCompoByChain( nGrp, vCrvIds, ORIG(), true, GDB_RT.LOC, TOLER)
for nId = nChainId, nChainId + nCnt - 1 do
EgtSetName( nId, sName .. EgtNumToString( i))
EgtMove( nId, - dDeltaZ * vtSlicing)
EgtSetInfo( nId, KEY_ORIGINAL_SURF, vSliceIds[i])
if tabParams then
for sKey, sVal in pairs( tabParams[i]) do
EgtSetInfo( nId, sKey, sVal)
end
end
EgtModifyCurveExtrusion( nId, vtSlicing, GDB_RT.GLOB)
EgtApproxCurve( nId, GDB_CA.ARCS, MID_TOLER)
-- se ho ancora curve aperte, segnalo errore
if nType ~= TYPE.RIB and nType ~= TYPE.INFILL and not EgtCurveIsClosed( nId) then
EgtOutLog( 'Error : hole in object (layer '.. EgtNumToString( j) ..') - CalcSlices')
table.insert( s_vErr, j)
end
end
end
local nOldId = nResId
nResId = EgtGetNext( nResId)
j = j + 1
EgtErase( nOldId)
end
end
-- rimuovo eventuali oggetti creati per lo slicing
EgtErase( vEraseIds)
@@ -446,17 +441,54 @@ local function SlicingInfill( nLay, sName, sNameGrp)
-- recupero i dati di slicing
local ptSlicing = EgtGetInfo( vLayIds[i], KEY_SLICE_POS, 'p')
local vtSlicing = EgtGetInfo( vLayIds[i], KEY_SLICE_DIR, 'v')
local nResultLay = SliceStm( tIds[nGrpIdx], vLayIds[i], vtSlicing, ptSlicing, TYPE.INFILL, sName, sNameGrp)
-- sistemo i nomi delle curve
local vInfillCrvs = EgtGetAllInGroup( nResultLay)
for j = 1, #vInfillCrvs do
EgtSetName( vInfillCrvs[j], sName .. EgtNumToString(j))
local nGrp = EgtGetFirstNameInGroup( vLayIds[i], sNameGrp)
if not nGrp then
-- se gruppo non esiste lo creo
nGrp = EgtGroup( vLayIds[i])
EgtSetName( nGrp, sNameGrp)
EgtSetStatus( nGrp, GDB_ST.OFF)
end
local vInfillIds = tIds[nGrpIdx]
for j = 1, #vInfillIds do
-- verifico che oggetto sia trimesh
local nTypeObj = EgtGetType( vInfillIds[j])
if nTypeObj == GDB_TY.SRF_MESH then
-- slicing
local nNewId, nPntCnt, nCrvCnt, nSrfCnt = EgtPlaneSurfTmInters( ptSlicing, vtSlicing, vInfillIds[j], nGrp, GDB_RT.GLOB, TOLER)
-- rimuovo punti
for nId = nNewId, nNewId + nPntCnt -1 do
EgtErase( nId)
end
-- concateno le curve
local vChain = {}
for nId = nNewId + nPntCnt, nNewId + nPntCnt + nCrvCnt - 1 do
table.insert( vChain, nId)
end
local nChainId, nCnt = EgtCurveCompoByChain( nGrp, vChain, ORIG(), true, GDB_RT.LOC, TOLER)
-- sistemo le curve
for nId = nChainId, nChainId + nCnt - 1 do
EgtSetName( nId, sName .. EgtNumToString(j))
EgtSetInfo( nId, KEY_ORIGINAL_SURF, vInfillIds[j])
EgtModifyCurveExtrusion( nId, vtSlicing, GDB_RT.GLOB)
EgtApproxCurve( nId, GDB_CA.ARCS, MID_TOLER)
end
-- rimuovo superfici
for nId = nNewId + nPntCnt + nCrvCnt, nNewId + nPntCnt + nCrvCnt + nSrfCnt - 1 do
EgtErase( nId)
end
end
end
end
return true
end
----------------------------------------------------------------------
----------------------------- INFILL ---------------------------------
----------------------------------------------------------------------
@@ -633,7 +665,7 @@ local function CalcGridFromPattern( nInfillGrp, nStmId, dOffsStm, frRef, vtOffs,
b3Loc2:expand( dOffsStm)
local ptMin2 = b3Loc2:getMin()
local ptMax2 = b3Loc2:getMax()
-- creo curva base ruotando la curva base della direzione principale
local nCrvBase2 = EgtCopyGlob( nCrvBase, nMainGrp)
EgtRotate( nCrvBase2, ptCen, Z_AX(), vSlicesAng[i] - vSlicesAng[1])
@@ -700,7 +732,7 @@ local function CalcInfill( nInfillGrp, nType, dDensity, dDir, dOffsX, dOffsY, dG
local ptLast = EgtGetInfo( nLastLay, KEY_SLICE_POS, 'p')
local dZ = ( ptLast - ORIG()) * vtSlicing
for i = 1, #vCrvs do
EgtSurfTmByExtrusion( EgtGetParent( vCrvs[i]), vCrvs[i], ( dZ + 100) * vtSlicing, GDB_RT.GLOB)
EgtSurfTmByExtrusion( EgtGetParent( vCrvs[i]), vCrvs[i], ( dZ + 100) * vtSlicing, 0.05, GDB_RT.GLOB)
end
EgtErase( vCrvs)
@@ -792,14 +824,9 @@ local function ExtractRibsLoops( nRibsGrp, nStmId)
-- recupero tutti i setti
local vIds = EgtGetAllInGroup( nRibsGrp)
for i = 1, #vIds do
-- se trimesh
-- se trimesh estraggo i contorni
if EgtGetType( vIds[i]) == GDB_TY.SRF_MESH then
-- trim con il solido
local nCopy = EgtCopyGlob( vIds[i], nLoopGrp)
local nType = ReadParam( vIds[i], KEY_RIBS_TYPE, 'i', RIB_TYPE.INTERNAL)
EgtSurfTmCut( nCopy, nStmId, nType ~= RIB_TYPE.EXTERNAL, false)
-- estraggo i contorni
local nCrv, nCnt = EgtExtractSurfTmLoops( nCopy, nLoopGrp)
local nCrv, nCnt = EgtExtractSurfTmLoops( vIds[i], nLoopGrp)
if nCrv then
-- assegno nome che permetta di ricondurli alla superficie da cui derivano
for nId = nCrv, nCrv + nCnt - 1 do
@@ -820,107 +847,6 @@ local function ValueInArray( vArr, nValue)
return false
end
---------------------------------------------------------------------
local function SlicingNoSolid( nRibsLay, nSlicingType, dMaxH, dSliceStep, vSlicingVal, vSlicingDir)
-- contatore per il calcolo delle intersezioni
if EgtProcessEvents( 100, 0) == 1 then return false end
-- recupero i setti di cui fare lo slicing e i parametri associati
local vRibIds = EgtGetAllInGroup( nRibsLay)
local tabParams = {}
local vIds = {}
for i = 1, #vRibIds do
if EgtGetType( vRibIds[i]) == GDB_TY.SRF_MESH then
local vParams = GetRibParams( vRibIds[i])
if vParams[KEY_RIBS_SHELLS_NBR] > 0 then
table.insert( tabParams, vParams)
table.insert( vIds, vRibIds[i])
end
end
end
-- creo i layer dello slicing
for i = 1, #vSlicingVal do
-- creo layer e gruppo dei contorni
local nLayId = EgtGroup( s_nPartId)
EgtSetName( nLayId, SLICE_LAYER .. EgtNumToString( i))
EgtSetInfo( nLayId, KEY_SLICE_NBR, i)
local nCrvLayId = EgtGroup( nLayId)
EgtSetName( nCrvLayId, CONTOUR_GRP .. EgtNumToString( 0))
-- recupero i dati del piano di slicing
local dDeltaZ = EgtIf( i == 1, DELTAZ, 0)
local ptSlicing
local vtSlicing
if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 or nSlicingType == SLICING_TYPE.MULTIPLANAR_HOR then
vtSlicing = vtSlicing[i]
ptSlicing = vSlicingVal[i]
else
vtSlicing = vSlicingDir[1]
ptSlicing = ORIG() + ( vSlicingVal[i] - dDeltaZ) * vtSlicing
end
EgtSetInfo( nLayId, KEY_SLICE_POS, ptSlicing)
EgtSetInfo( nLayId, KEY_SLICE_DIR, vtSlicing)
EgtSetInfo( nLayId, KEY_SLICE_DELTAZ, dDeltaZ)
-- slicing dei setti
local nResultLay = SliceStm( vIds, nLayId, vtSlicing, ptSlicing, TYPE.RIB, RIBS_CRV, RIBS_GRP, tabParams)
-- se slicing multplanare verifico altezza massima
if ( nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 or nSlicingType == SLICING_TYPE.MULTIPLANAR_HOR) and dMaxH < GEO.INFINITO then
local b3Box = EgtGetBBoxGlob( nResultLay, GDB_BB.STANDARD)
local ptMax = b3Box:getMax() + dSliceStep * vtSlicing
if ptMax:getZ() > dMaxH + GEO.EPS_SMALL then
EgtErase( nLayId)
break
end
end
if EgtProcessEvents( EgtIf( PRINT, 100, 0) + i / #vSlicingVal * 100, 0) == 1 then return false end
end
return true
end
---------------------------------------------------------------------
local function MultiPlanarSlicing( nStmId, dMaxH, vSlicingDir, vSlicingPnt)
local dSliceStep = EgtGetInfo( s_nPartId, KEY_SLICE_STEP, 'd')
-- ciclo sui piani di slicing calcolati
local nFirstGrpId
local nCnt = 0
for i = 1, #vSlicingPnt do
local vtN = vSlicingDir[i]
local ptOn = vSlicingPnt[i]
-- correzione per layer iniziale
if i == 1 then
ptOn = ptOn + DELTAZ * vtN
end
local nGrpId = EgtGroup( s_nPartId)
if not nFirstGrpId then
nFirstGrpId = nGrpId
end
local nEntId = EgtPlaneSurfTmInters( ptOn, vtN, nStmId, nGrpId, GDB_RT.GLOB, TOLER)
-- eventuale verifica con altezza massima
if dMaxH < GEO.INFINITO then
local b3Box = EgtGetBBoxGlob( nGrpId, GDB_BB.STANDARD)
local ptMax = b3Box:getMax() + dSliceStep * vtN
if ptMax:getZ() > dMaxH + GEO.EPS_SMALL then
EgtErase( nGrpId)
break
end
end
nCnt = i + 1
-- aggiornamento progress ( per riconoscimento corretto della fase dal programma deve partire da 1)
if EgtProcessEvents( max( 1, 100 * i / #vSlicingPnt), 0) == 1 then
return nFirstGrpId, -1
end
end
return nFirstGrpId, nCnt
end
---------------------------------------------------------------------
local function VerifyMultiPlanarStrand()
@@ -1022,6 +948,103 @@ local function VerifyMultiPlanarStrand()
return true
end
---------------------------------------------------------------------
local function SlicingNoSolid( nRibsLay, nSlicingType, dMaxH, dSliceStep, vSlicingVal, vSlicingDir)
-- contatore per il calcolo delle intersezioni
if EgtProcessEvents( 100, 0) == 1 then return false end
-- creo i layer dello slicing
for i = 1, #vSlicingVal do
-- creo layer e gruppo dei contorni
local nLayId = EgtGroup( s_nPartId)
EgtSetName( nLayId, SLICE_LAYER .. EgtNumToString( i))
EgtSetInfo( nLayId, KEY_SLICE_NBR, i)
local nCrvLayId = EgtGroup( nLayId)
EgtSetName( nCrvLayId, CONTOUR_GRP .. EgtNumToString( 0))
-- recupero i dati del piano di slicing
local dDeltaZ = EgtIf( i == 1, DELTAZ, 0)
local ptSlicing
local vtSlicing
if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 or nSlicingType == SLICING_TYPE.MULTIPLANAR_HOR then
vtSlicing = vSlicingDir[i]
ptSlicing = vSlicingVal[i]
else
vtSlicing = vSlicingDir[1]
ptSlicing = ORIG() + ( vSlicingVal[i] - dDeltaZ) * vtSlicing
end
EgtSetInfo( nLayId, KEY_SLICE_POS, ptSlicing)
EgtSetInfo( nLayId, KEY_SLICE_DIR, vtSlicing)
EgtSetInfo( nLayId, KEY_SLICE_DELTAZ, dDeltaZ)
if EgtProcessEvents( EgtIf( PRINT, 100, 0) + i / #vSlicingVal * 100, 0) == 1 then return false end
end
-- slicing dei setti
SlicingExtraObjects( nRibsLay, vSlicingDir, vSlicingVal, nSlicingType, TYPE.RIB, RIBS_CRV, RIBS_GRP)
-- se slicing multplanare verifico altezza massima e strand
if nSlicingType == SLICING_TYPE.MULTIPLANAR or nSlicingType == SLICING_TYPE.MULTIPLANAR_DEG45 or nSlicingType == SLICING_TYPE.MULTIPLANAR_HOR then
if dMaxH < GEO.INFINITO then
local vLayIds = EgtGetNameInGroup( s_nPartId, SLICE_LAYER .. '*')
for i = 1, #vLayIds do
local nCurrRibsLay = EgtGetFirstNameInGroup( vLayIds[i], RIBS_GRP)
local b3Box = EgtGetBBoxGlob( nCurrRibsLay, GDB_BB.STANDARD)
local ptMax = b3Box:getMax() + dSliceStep * vSlicingDir[i]
if ptMax:getZ() > dMaxH + GEO.EPS_SMALL then
-- elimino tutti i layer da questo punto
for j = i, #vLayIds do
EgtErase( vLayIds[j])
end
break
end
end
end
VerifyMultiPlanarStrand()
end
return true
end
---------------------------------------------------------------------
local function MultiPlanarSlicing( nStmId, dMaxH, vSlicingDir, vSlicingPnt)
local dSliceStep = EgtGetInfo( s_nPartId, KEY_SLICE_STEP, 'd')
-- ciclo sui piani di slicing calcolati
local nFirstGrpId
local nCnt = 0
for i = 1, #vSlicingPnt do
local vtN = vSlicingDir[i]
local ptOn = vSlicingPnt[i]
-- correzione per layer iniziale
if i == 1 then
ptOn = ptOn + DELTAZ * vtN
end
local nGrpId = EgtGroup( s_nPartId)
if not nFirstGrpId then
nFirstGrpId = nGrpId
end
local nEntId = EgtPlaneSurfTmInters( ptOn, vtN, nStmId, nGrpId, GDB_RT.GLOB, TOLER)
-- eventuale verifica con altezza massima
if dMaxH < GEO.INFINITO then
local b3Box = EgtGetBBoxGlob( nGrpId, GDB_BB.STANDARD)
local ptMax = b3Box:getMax() + dSliceStep * vtN
if ptMax:getZ() > dMaxH + GEO.EPS_SMALL then
EgtErase( nGrpId)
break
end
end
nCnt = i + 1
-- aggiornamento progress ( per riconoscimento corretto della fase dal programma deve partire da 1)
if EgtProcessEvents( max( 1, 100 * i / #vSlicingPnt), 0) == 1 then
return nFirstGrpId, -1
end
end
return nFirstGrpId, nCnt
end
---------------------------------------------------------------------
local function SlicingWithSolid( nStmId, nSlicingType, dMaxH, vSlicingVal, vSlicingDir)
@@ -1319,7 +1342,7 @@ local function SlicingWithSolid( nStmId, nSlicingType, dMaxH, vSlicingVal, vSlic
-- costolature
local nRibsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_RIBS)
ExtractRibsLoops( nRibsLay, nStmId)
SlicingExtraObjects( nRibsLay, TYPE.RIB, RIBS_CRV, RIBS_GRP, nStmId)
SlicingExtraObjects( nRibsLay, vSlicingDir, vSlicingVal, nSlicingType, TYPE.RIB, RIBS_CRV, RIBS_GRP, nStmId)
if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( nCnt + 3) / nCounterTot * 100, 0) == 1 then return false end
local bSpiralVase = EgtGetInfo( s_nPartId, KEY_SPIRAL_VASE, 'b') or false
@@ -1332,12 +1355,12 @@ local function SlicingWithSolid( nStmId, nSlicingType, dMaxH, vSlicingVal, vSlic
-- solidi per regioni con diverso numero di passate
local nShellNbrLay = EgtGetFirstNameInGroup( s_nPartId, LAY_SHELL_NBR)
SlicingExtraObjects( nShellNbrLay, TYPE.EXTRA_SHELL, SHELL_NBR_CRV, SHELL_NBR_GRP)
SlicingExtraObjects( nShellNbrLay, vSlicingDir, vSlicingVal, nSlicingType, TYPE.EXTRA_SHELL, SHELL_NBR_CRV, SHELL_NBR_GRP)
if EgtProcessEvents( EgtIf( PRINT, 100, 0) + ( nCnt + 9) / nCounterTot * 100, 0) == 1 then return false end
-- solidi ausiliari
local nAuxSolidsLay = EgtGetFirstNameInGroup( s_nPartId, LAY_AUX_SOLIDS)
SlicingExtraObjects( nAuxSolidsLay, TYPE.AUX_SOLID, AUX_SOLIDS_CRV, AUX_SOLIDS_GRP)
SlicingExtraObjects( nAuxSolidsLay, vSlicingDir, vSlicingVal, nSlicingType, TYPE.AUX_SOLID, AUX_SOLIDS_CRV, AUX_SOLIDS_GRP)
if nSlicingType ~= SLICING_TYPE.MULTIPLANAR and nSlicingType ~= SLICING_TYPE.MULTIPLANAR_DEG45 and nSlicingType ~= SLICING_TYPE.MULTIPLANAR_HOR then
PrepareAuxSolidsInfill( nAuxSolidsLay, vSlicingDir[1])
end